From: edwin Date: Tue, 5 Sep 2006 17:21:21 +0000 (+0000) Subject: Merged changes from trunk. X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=cacao.git;a=commitdiff_plain;h=50b0f668a4ebda8326fddac5da1844fdcc7e388b Merged changes from trunk. --HG-- branch : new_instruction_format --- diff --git a/.hgtags b/.hgtags index ca10c2368..cbc17eaed 100644 --- a/.hgtags +++ b/.hgtags @@ -10,3 +10,4 @@ a7d9b1655845c526636a510594214c32d3a120ea cacao-0_93-release 58017211ca9c5f5909fba32155dde52323abb771 cacao-0.94 f0bbc765d01fd58f0c42e25de02f059c2f9a9598 cacao-0.95 31f9c3186dded73dab4ed3f519c1cc28940c98dd cacao-0.96 +ae597ed07b16e08575c39f88b93004049f663b2b new_instruction_format_branch_point diff --git a/src/vm/jit/alpha/codegen.c b/src/vm/jit/alpha/codegen.c index d63cb5f3f..71a9f5095 100644 --- a/src/vm/jit/alpha/codegen.c +++ b/src/vm/jit/alpha/codegen.c @@ -32,7 +32,7 @@ Christian Ullrich Edwin Steiner - $Id: codegen.c 5290 2006-09-04 17:12:48Z christian $ + $Id: codegen.c 5323 2006-09-05 16:45:24Z edwin $ */ @@ -2065,24 +2065,24 @@ bool codegen(jitdata *jd) M_ALD(REG_ITMP1, REG_PV, disp); switch (iptr->op1) { case TYPE_INT: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_LST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_LST(s1, REG_ITMP1, 0); break; case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_AST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_AST(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_FST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_FST(s1, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_DST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_DST(s1, REG_ITMP1, 0); break; } break; diff --git a/src/vm/jit/i386/codegen.c b/src/vm/jit/i386/codegen.c index 18b3d691c..9247c358c 100644 --- a/src/vm/jit/i386/codegen.c +++ b/src/vm/jit/i386/codegen.c @@ -31,7 +31,7 @@ Christian Ullrich Edwin Steiner - $Id: codegen.c 5275 2006-08-24 18:42:48Z twisti $ + $Id: codegen.c 5323 2006-09-05 16:45:24Z edwin $ */ @@ -388,80 +388,10 @@ bool codegen(jitdata *jd) } #endif - /* copy argument registers to stack and call trace function with pointer - to arguments on stack. - */ - #if !defined(NDEBUG) - if (opt_verbosecall) { - stack_off = 0; - s1 = INT_TMP_CNT * 4 + TRACE_ARGS_NUM * 8 + 4 + 4 + cd->stackframesize * 4; - - M_ISUB_IMM(INT_TMP_CNT * 4 + TRACE_ARGS_NUM * 8 + 4, REG_SP); - - /* save temporary registers for leaf methods */ - - for (p = 0; p < INT_TMP_CNT; p++) - M_IST(rd->tmpintregs[p], REG_SP, TRACE_ARGS_NUM * 8 + 4 + p * 4); - - for (p = 0, l = 0; p < md->paramcount && p < TRACE_ARGS_NUM; p++) { - t = md->paramtypes[p].type; - - if (IS_INT_LNG_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) { - emit_mov_membase_reg(cd, REG_SP, s1 + stack_off, REG_ITMP1); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8); - emit_mov_membase_reg(cd, REG_SP, s1 + stack_off + 4, REG_ITMP1); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8 + 4); - - } else if (t == TYPE_ADR) { -/* } else { */ - emit_mov_membase_reg(cd, REG_SP, s1 + stack_off, REG_ITMP1); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8); - emit_alu_reg_reg(cd, ALU_XOR, REG_ITMP1, REG_ITMP1); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8 + 4); - - } else { - emit_mov_membase_reg(cd, REG_SP, s1 + stack_off, EAX); - emit_cltd(cd); - emit_mov_reg_membase(cd, EAX, REG_SP, p * 8); - emit_mov_reg_membase(cd, EDX, REG_SP, p * 8 + 4); - } - - } else { - if (!IS_2_WORD_TYPE(t)) { - emit_flds_membase(cd, REG_SP, s1 + stack_off); - emit_fstps_membase(cd, REG_SP, p * 8); - emit_alu_reg_reg(cd, ALU_XOR, REG_ITMP1, REG_ITMP1); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8 + 4); - - } else { - emit_fldl_membase(cd, REG_SP, s1 + stack_off); - emit_fstpl_membase(cd, REG_SP, p * 8); - } - } - stack_off += (IS_2_WORD_TYPE(t)) ? 8 : 4; - } - - /* fill up the remaining arguments */ - emit_alu_reg_reg(cd, ALU_XOR, REG_ITMP1, REG_ITMP1); - for (p = md->paramcount; p < TRACE_ARGS_NUM; p++) { - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8); - emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, p * 8 + 4); - } - - emit_mov_imm_membase(cd, (ptrint) m, REG_SP, TRACE_ARGS_NUM * 8); - emit_mov_imm_reg(cd, (ptrint) builtin_trace_args, REG_ITMP1); - emit_call_reg(cd, REG_ITMP1); - - /* restore temporary registers for leaf methods */ - - for (p = 0; p < INT_TMP_CNT; p++) - M_ILD(rd->tmpintregs[p], REG_SP, TRACE_ARGS_NUM * 8 + 4 + p * 4); - - M_IADD_IMM(INT_TMP_CNT * 4 + TRACE_ARGS_NUM * 8 + 4, REG_SP); - } -#endif /* !defined(NDEBUG) */ + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_enter(jd); +#endif } @@ -2683,19 +2613,19 @@ bool codegen(jitdata *jd) switch (iptr->op1) { case TYPE_INT: case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP23_PACKED); - M_LST(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP23_PACKED); + M_LST(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP1); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP1); emit_fstps_membase(cd, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP1); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP1); emit_fstpl_membase(cd, REG_ITMP1, 0); break; } @@ -3315,28 +3245,9 @@ nowperformreturn: p = cd->stackframesize; #if !defined(NDEBUG) - /* call trace function */ - - if (opt_verbosecall) { - M_ISUB_IMM(4 + 8 + 8 + 4, REG_SP); - - emit_mov_imm_membase(cd, (s4) m, REG_SP, 0); - - emit_mov_reg_membase(cd, REG_RESULT, REG_SP, 4); - emit_mov_reg_membase(cd, REG_RESULT2, REG_SP, 4 + 4); - - emit_fstl_membase(cd, REG_SP, 4 + 8); - emit_fsts_membase(cd, REG_SP, 4 + 8 + 8); - - emit_mov_imm_reg(cd, (s4) builtin_displaymethodstop, REG_ITMP1); - emit_call_reg(cd, REG_ITMP1); - - emit_mov_membase_reg(cd, REG_SP, 4, REG_RESULT); - emit_mov_membase_reg(cd, REG_SP, 4 + 4, REG_RESULT2); - - emit_alu_imm_reg(cd, ALU_ADD, 4 + 8 + 8 + 4, REG_SP); - } -#endif /* !defined(NDEBUG) */ + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_exit(jd); +#endif #if defined(ENABLE_THREADS) if (checksync && (m->flags & ACC_SYNCHRONIZED)) { @@ -4533,69 +4444,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) M_ASUB_IMM(cd->stackframesize * 4, REG_SP); #if !defined(NDEBUG) - if (opt_verbosecall) { - s4 p, t; - - disp = cd->stackframesize * 4; - - M_ASUB_IMM(TRACE_ARGS_NUM * 8 + 4, REG_SP); - - for (p = 0; p < md->paramcount && p < TRACE_ARGS_NUM; p++) { - t = md->paramtypes[p].type; - if (IS_INT_LNG_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) { - M_ILD(REG_ITMP1, REG_SP, - 4 + TRACE_ARGS_NUM * 8 + 4 + disp); - M_ILD(REG_ITMP2, REG_SP, - 4 + TRACE_ARGS_NUM * 8 + 4 + disp + 4); - M_IST(REG_ITMP1, REG_SP, p * 8); - M_IST(REG_ITMP2, REG_SP, p * 8 + 4); - - } else if (t == TYPE_ADR) { - M_ALD(REG_ITMP1, REG_SP, - 4 + TRACE_ARGS_NUM * 8 + 4 + disp); - M_CLR(REG_ITMP2); - M_AST(REG_ITMP1, REG_SP, p * 8); - M_AST(REG_ITMP2, REG_SP, p * 8 + 4); - - } else { - M_ILD(EAX, REG_SP, 4 + TRACE_ARGS_NUM * 8 + 4 + disp); - emit_cltd(cd); - M_IST(EAX, REG_SP, p * 8); - M_IST(EDX, REG_SP, p * 8 + 4); - } - - } else { - if (!IS_2_WORD_TYPE(t)) { - emit_flds_membase(cd, REG_SP, - 4 + TRACE_ARGS_NUM * 8 + 4 + disp); - emit_fstps_membase(cd, REG_SP, p * 8); - emit_alu_reg_reg(cd, ALU_XOR, REG_ITMP2, REG_ITMP2); - M_IST(REG_ITMP2, REG_SP, p * 8 + 4); - - } else { - emit_fldl_membase(cd, REG_SP, - 4 + TRACE_ARGS_NUM * 8 + 4 + disp); - emit_fstpl_membase(cd, REG_SP, p * 8); - } - } - disp += (IS_2_WORD_TYPE(t)) ? 8 : 4; - } - - M_CLR(REG_ITMP1); - for (p = md->paramcount; p < TRACE_ARGS_NUM; p++) { - M_IST(REG_ITMP1, REG_SP, p * 8); - M_IST(REG_ITMP1, REG_SP, p * 8 + 4); - } - - M_AST_IMM(m, REG_SP, TRACE_ARGS_NUM * 8); - - M_MOV_IMM(builtin_trace_args, REG_ITMP1); - M_CALL(REG_ITMP1); - - M_AADD_IMM(TRACE_ARGS_NUM * 8 + 4, REG_SP); - } -#endif /* !defined(NDEBUG) */ + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_enter(jd); +#endif /* get function address (this must happen before the stackframeinfo) */ @@ -4693,37 +4544,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) } #if !defined(NDEBUG) - if (opt_verbosecall) { - /* restore return value */ - - if (IS_INT_LNG_TYPE(md->returntype.type)) { - if (IS_2_WORD_TYPE(md->returntype.type)) - M_ILD(REG_RESULT2, REG_SP, 2 * 4); - M_ILD(REG_RESULT, REG_SP, 1 * 4); - - } else { - if (IS_2_WORD_TYPE(md->returntype.type)) - emit_fldl_membase(cd, REG_SP, 1 * 4); - else - emit_flds_membase(cd, REG_SP, 1 * 4); - } - - M_ASUB_IMM(4 + 8 + 8 + 4, REG_SP); - - M_AST_IMM((ptrint) m, REG_SP, 0); - - M_IST(REG_RESULT, REG_SP, 4); - M_IST(REG_RESULT2, REG_SP, 4 + 4); - - emit_fstl_membase(cd, REG_SP, 4 + 8); - emit_fsts_membase(cd, REG_SP, 4 + 8 + 8); - - M_MOV_IMM(builtin_displaymethodstop, REG_ITMP1); - M_CALL(REG_ITMP1); - - M_AADD_IMM(4 + 8 + 8 + 4, REG_SP); - } -#endif /* !defined(NDEBUG) */ + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_exit(jd); +#endif /* remove native stackframe info */ diff --git a/src/vm/jit/i386/codegen.h b/src/vm/jit/i386/codegen.h index 986f21dab..5ee05b704 100644 --- a/src/vm/jit/i386/codegen.h +++ b/src/vm/jit/i386/codegen.h @@ -29,7 +29,7 @@ Changes: - $Id: codegen.h 5234 2006-08-14 17:50:12Z christian $ + $Id: codegen.h 5320 2006-09-05 16:10:21Z twisti $ */ @@ -332,6 +332,9 @@ #define M_FST(a,b,disp) emit_fstps_membase(cd, (b), (disp)) #define M_DST(a,b,disp) emit_fstpl_membase(cd, (b), (disp)) +#define M_FSTNP(a,b,disp) emit_fsts_membase(cd, (b), (disp)) +#define M_DSTNP(a,b,disp) emit_fstl_membase(cd, (b), (disp)) + /* function gen_resolvebranch ************************************************** diff --git a/src/vm/jit/i386/emit.c b/src/vm/jit/i386/emit.c index 92ad9fe2e..3051bb41c 100644 --- a/src/vm/jit/i386/emit.c +++ b/src/vm/jit/i386/emit.c @@ -28,7 +28,7 @@ Changes: - $Id: emit.c 5277 2006-08-25 07:29:05Z twisti $ + $Id: emit.c 5320 2006-09-05 16:10:21Z twisti $ */ @@ -47,11 +47,13 @@ # include "threads/native/lock.h" #endif +#include "vm/builtin.h" #include "vm/statistics.h" #include "vm/jit/asmpart.h" #include "vm/jit/dseg.h" #include "vm/jit/emit.h" #include "vm/jit/jit.h" +#include "vm/jit/replace.h" /* emit_load_s1 **************************************************************** @@ -657,6 +659,145 @@ void emit_replacement_stubs(jitdata *jd) } +/* emit_verbosecall_enter ****************************************************** + + Generates the code for the call trace. + +*******************************************************************************/ + +#if !defined(NDEBUG) +void emit_verbosecall_enter(jitdata *jd) +{ + methodinfo *m; + codegendata *cd; + registerdata *rd; + methoddesc *md; + s4 disp; + s4 i, t; + + /* get required compiler data */ + + m = jd->m; + cd = jd->cd; + rd = jd->rd; + + md = m->parseddesc; + + /* mark trace code */ + + M_NOP; + + /* methodinfo* + arguments + return address */ + + disp = TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4 + + cd->stackframesize * 4 + 4; + + M_ASUB_IMM(TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4, REG_SP); + + /* save temporary registers for leaf methods */ + + for (i = 0; i < INT_TMP_CNT; i++) + M_IST(rd->tmpintregs[i], REG_SP, TRACE_ARGS_NUM * 8 + 4 + i * 4); + + for (i = 0; i < md->paramcount && i < TRACE_ARGS_NUM; i++) { + t = md->paramtypes[i].type; + + if (IS_INT_LNG_TYPE(t)) { + if (IS_2_WORD_TYPE(t)) { + M_LLD(REG_ITMP12_PACKED, REG_SP, disp); + M_LST(REG_ITMP12_PACKED, REG_SP, i * 8); + } + else if (IS_ADR_TYPE(t)) { + M_ALD(REG_ITMP1, REG_SP, disp); + M_AST(REG_ITMP1, REG_SP, i * 8); + M_IST_IMM(0, REG_SP, i * 8 + 4); + } + else { + M_ILD(EAX, REG_SP, disp); + emit_cltd(cd); + M_LST(EAX_EDX_PACKED, REG_SP, i * 8); + } + } + else { + if (IS_2_WORD_TYPE(t)) { + M_DLD(REG_NULL, REG_SP, disp); + M_DST(REG_NULL, REG_SP, i * 8); + } + else { + M_FLD(REG_NULL, REG_SP, disp); + M_FST(REG_NULL, REG_SP, i * 8); + M_IST_IMM(0, REG_SP, i * 8 + 4); + } + } + + disp += (IS_2_WORD_TYPE(t)) ? 8 : 4; + } + + M_AST_IMM(m, REG_SP, TRACE_ARGS_NUM * 8); + + M_MOV_IMM(builtin_trace_args, REG_ITMP1); + M_CALL(REG_ITMP1); + + /* restore temporary registers for leaf methods */ + + for (i = 0; i < INT_TMP_CNT; i++) + M_ILD(rd->tmpintregs[i], REG_SP, TRACE_ARGS_NUM * 8 + 4 + i * 4); + + M_AADD_IMM(TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4, REG_SP); + + /* mark trace code */ + + M_NOP; +} +#endif /* !defined(NDEBUG) */ + + +/* emit_verbosecall_exit ******************************************************* + + Generates the code for the call trace. + +*******************************************************************************/ + +#if !defined(NDEBUG) +void emit_verbosecall_exit(jitdata *jd) +{ + methodinfo *m; + codegendata *cd; + registerdata *rd; + + /* get required compiler data */ + + m = jd->m; + cd = jd->cd; + rd = jd->rd; + + /* mark trace code */ + + M_NOP; + + M_ASUB_IMM(4 + 8 + 8 + 4 + 8, REG_SP); /* +8: keep stack 16-byte aligned */ + + M_AST_IMM(m, REG_SP, 0 * 4); + + M_LST(REG_RESULT_PACKED, REG_SP, 1 * 4); + + M_DSTNP(REG_NULL, REG_SP, 1 * 4 + 1 * 8); + M_FSTNP(REG_NULL, REG_SP, 1 * 4 + 2 * 8); + + M_MOV_IMM(builtin_displaymethodstop, REG_ITMP1); + M_CALL(REG_ITMP1); + + M_LLD(REG_RESULT_PACKED, REG_SP, 1 * 4); + + M_AADD_IMM(4 + 8 + 8 + 4 + 8, REG_SP); + + /* mark trace code */ + + M_NOP; +} +#endif /* !defined(NDEBUG) */ + + /* code generation functions **************************************************/ static void emit_membase(codegendata *cd, s4 basereg, s4 disp, s4 dreg) diff --git a/src/vm/jit/mips/codegen.c b/src/vm/jit/mips/codegen.c index ec776a09b..c0663cbeb 100644 --- a/src/vm/jit/mips/codegen.c +++ b/src/vm/jit/mips/codegen.c @@ -35,7 +35,7 @@ This module generates MIPS machine code for a sequence of intermediate code commands (ICMDs). - $Id: codegen.c 5291 2006-09-04 17:45:32Z twisti $ + $Id: codegen.c 5324 2006-09-05 17:11:32Z twisti $ */ @@ -300,92 +300,10 @@ bool codegen(jitdata *jd) } #endif - /* copy argument registers to stack and call trace function */ - - if (opt_verbosecall) { - M_LDA(REG_SP, REG_SP, -(2 + INT_ARG_CNT + FLT_ARG_CNT + INT_TMP_CNT + FLT_TMP_CNT) * 8); - M_AST(REG_RA, REG_SP, 1 * 8); - - /* save integer argument registers */ - - for (p = 0; p < md->paramcount && p < INT_ARG_CNT; p++) - M_LST(rd->argintregs[p], REG_SP, (2 + p) * 8); - - /* save and copy float arguments into integer registers */ - - for (p = 0; p < md->paramcount && p < FLT_ARG_CNT; p++) { - t = md->paramtypes[p].type; - - if (IS_FLT_DBL_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) { - M_DST(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - M_LLD(rd->argintregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - - } else { - M_FST(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - M_ILD(rd->argintregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - } - - } else { - M_DST(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - } - } - - /* save temporary registers for leaf methods */ - - if (jd->isleafmethod) { - for (p = 0; p < INT_TMP_CNT; p++) - M_LST(rd->tmpintregs[p], REG_SP, (2 + INT_ARG_CNT + FLT_ARG_CNT + p) * 8); - - for (p = 0; p < FLT_TMP_CNT; p++) - M_DST(rd->tmpfltregs[p], REG_SP, (2 + INT_ARG_CNT + FLT_ARG_CNT + INT_TMP_CNT + p) * 8); - } - - p = dseg_addaddress(cd, m); - M_ALD(REG_ITMP1, REG_PV, p); - M_AST(REG_ITMP1, REG_SP, 0 * 8); - disp = dseg_addaddress(cd, (void *) builtin_trace_args); - M_ALD(REG_ITMP3, REG_PV, disp); - M_JSR(REG_RA, REG_ITMP3); - M_NOP; - - M_ALD(REG_RA, REG_SP, 1 * 8); - - /* restore integer argument registers */ - - for (p = 0; p < md->paramcount && p < INT_ARG_CNT; p++) - M_LLD(rd->argintregs[p], REG_SP, (2 + p) * 8); - - /* restore float argument registers */ - - for (p = 0; p < md->paramcount && p < FLT_ARG_CNT; p++) { - t = md->paramtypes[p].type; - - if (IS_FLT_DBL_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) { - M_DLD(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - - } else { - M_FLD(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - } - - } else { - M_DLD(rd->argfltregs[p], REG_SP, (2 + INT_ARG_CNT + p) * 8); - } - } - - /* restore temporary registers for leaf methods */ - - if (jd->isleafmethod) { - for (p = 0; p < INT_TMP_CNT; p++) - M_LLD(rd->tmpintregs[p], REG_SP, (2 + INT_ARG_CNT + FLT_ARG_CNT + p) * 8); - - for (p = 0; p < FLT_TMP_CNT; p++) - M_DLD(rd->tmpfltregs[p], REG_SP, (2 + INT_ARG_CNT + FLT_ARG_CNT + INT_TMP_CNT + p) * 8); - } - - M_LDA(REG_SP, REG_SP, (2 + INT_ARG_CNT + FLT_ARG_CNT + INT_TMP_CNT + FLT_TMP_CNT) * 8); - } +#if !defined(NDEBUG) + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_enter(jd); +#endif } @@ -2042,24 +1960,24 @@ bool codegen(jitdata *jd) M_ALD(REG_ITMP1, REG_PV, disp); switch (iptr->op1) { case TYPE_INT: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_LST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_LST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_AST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_AST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_FST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_FST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_DST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_DST_INTERN(s1, REG_ITMP1, 0); break; } break; @@ -2663,31 +2581,11 @@ nowperformreturn: s4 i, p; p = cd->stackframesize; - - /* call trace function */ - - if (opt_verbosecall) { - M_LDA(REG_SP, REG_SP, -3 * 8); - M_LST(REG_RA, REG_SP, 0 * 8); - M_LST(REG_RESULT, REG_SP, 1 * 8); - M_DST(REG_FRESULT, REG_SP, 2 * 8); - - disp = dseg_addaddress(cd, m); - M_ALD(rd->argintregs[0], REG_PV, disp); - M_MOV(REG_RESULT, rd->argintregs[1]); - M_DMOV(REG_FRESULT, rd->argfltregs[2]); - M_FMOV(REG_FRESULT, rd->argfltregs[3]); - - disp = dseg_addaddress(cd, (void *) builtin_displaymethodstop); - M_ALD(REG_ITMP3, REG_PV, disp); - M_JSR(REG_RA, REG_ITMP3); - M_NOP; - M_DLD(REG_FRESULT, REG_SP, 2 * 8); - M_LLD(REG_RESULT, REG_SP, 1 * 8); - M_LLD(REG_RA, REG_SP, 0 * 8); - M_LDA(REG_SP, REG_SP, 3 * 8); - } +#if !defined(NDEBUG) + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_exit(jd); +#endif #if defined(ENABLE_THREADS) if (checksync && (m->flags & ACC_SYNCHRONIZED)) { @@ -3664,59 +3562,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) M_AST(REG_RA, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P); /* store RA*/ #if !defined(NDEBUG) - /* call trace function */ - - if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) { - M_LDA(REG_SP, REG_SP, -(1 + INT_ARG_CNT + FLT_ARG_CNT) * 8); - - /* save integer argument registers */ - - for (i = 0; i < md->paramcount && i < INT_ARG_CNT; i++) - if (IS_INT_LNG_TYPE(md->paramtypes[i].type)) - M_LST(rd->argintregs[i], REG_SP, (1 + i) * 8); - - /* save and copy float arguments into integer registers */ - - for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) { - t = md->paramtypes[i].type; - - if (IS_FLT_DBL_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) { - M_DST(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - M_LLD(rd->argintregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - } else { - M_FST(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - M_ILD(rd->argintregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - } - } - } - - disp = dseg_addaddress(cd, m); - M_ALD(REG_ITMP1, REG_PV, disp); - M_AST(REG_ITMP1, REG_SP, 0 * 8); - disp = dseg_addaddress(cd, builtin_trace_args); - M_ALD(REG_ITMP3, REG_PV, disp); - M_JSR(REG_RA, REG_ITMP3); - M_NOP; - - for (i = 0; i < md->paramcount && i < INT_ARG_CNT; i++) - if (IS_INT_LNG_TYPE(md->paramtypes[i].type)) - M_LLD(rd->argintregs[i], REG_SP, (1 + i) * 8); - - for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) { - t = md->paramtypes[i].type; - - if (IS_FLT_DBL_TYPE(t)) { - if (IS_2_WORD_TYPE(t)) - M_DLD(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - else - M_FLD(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8); - } - } - - M_LDA(REG_SP, REG_SP, (1 + INT_ARG_CNT + FLT_ARG_CNT) * 8); - } -#endif /* !defined(NDEBUG) */ + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_enter(jd); +#endif /* get function address (this must happen before the stackframeinfo) */ @@ -3860,29 +3708,8 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) } #if !defined(NDEBUG) - /* call finished trace function */ - - if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) { - if (md->returntype.type != TYPE_VOID) { - if (IS_INT_LNG_TYPE(md->returntype.type)) - M_LLD(REG_RESULT, REG_SP, 0 * 8); - else - M_DLD(REG_FRESULT, REG_SP, 0 * 8); - } - - disp = dseg_addaddress(cd, m); - M_ALD(rd->argintregs[0], REG_PV, disp); - - M_MOV(REG_RESULT, rd->argintregs[1]); - M_DMFC1(REG_ITMP1, REG_FRESULT); - M_DMTC1(REG_ITMP1, rd->argfltregs[2]); - M_DMTC1(REG_ITMP1, rd->argfltregs[3]); - - disp = dseg_addaddress(cd, builtin_displaymethodstop); - M_ALD(REG_ITMP3, REG_PV, disp); - M_JSR(REG_RA, REG_ITMP3); - M_NOP; - } + if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) + emit_verbosecall_exit(jd); #endif /* remove native stackframe info */ @@ -3920,91 +3747,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) M_JMP(REG_ITMP3); /* jump to asm exception handler */ M_ASUB_IMM(REG_RA, 4, REG_ITMP2_XPC); /* get exception address (DELAY) */ - /* generate static stub call code */ - - { - patchref *pref; - u8 mcode; - u1 *savedmcodeptr; - u1 *tmpmcodeptr; - - for (pref = cd->patchrefs; pref != NULL; pref = pref->next) { - /* Get machine code which is patched back in later. The - call is 2 instruction words long. */ - - tmpmcodeptr = (u1 *) (cd->mcodebase + pref->branchpos); - - /* We need to split this, because an unaligned 8 byte read - causes a SIGSEGV. */ - - mcode = ((u8) ((u4 *) tmpmcodeptr)[1] << 32) + - ((u4 *) tmpmcodeptr)[0]; + /* generate patcher stubs */ - /* Patch in the call to call the following code (done at - compile time). */ - - savedmcodeptr = cd->mcodeptr; /* save current mcodeptr */ - cd->mcodeptr = tmpmcodeptr; /* set mcodeptr to patch position */ - - disp = ((u4 *) savedmcodeptr) - (((u4 *) tmpmcodeptr) + 1); - M_BRS(disp); - M_NOP; /* branch delay slot */ - - cd->mcodeptr = savedmcodeptr; /* restore the current mcodeptr */ - - /* create stack frame */ - - M_LSUB_IMM(REG_SP, 6 * 8, REG_SP); - - /* move return address onto stack */ - - M_AST(REG_RA, REG_SP, 5 * 8); - - /* move pointer to java_objectheader onto stack */ - -#if defined(ENABLE_THREADS) - /* order reversed because of data segment layout */ - - (void) dseg_addaddress(cd, NULL); /* flcword */ - (void) dseg_addaddress(cd, lock_get_initial_lock_word()); /* monitorPtr */ - disp = dseg_addaddress(cd, NULL); /* vftbl */ - - M_LDA(REG_ITMP3, REG_PV, disp); - M_AST(REG_ITMP3, REG_SP, 4 * 8); -#else - M_AST(REG_ZERO, REG_SP, 4 * 8); -#endif - - /* move machine code onto stack */ - - disp = dseg_adds8(cd, mcode); - M_LLD(REG_ITMP3, REG_PV, disp); - M_LST(REG_ITMP3, REG_SP, 3 * 8); - - /* move class/method/field reference onto stack */ - - disp = dseg_addaddress(cd, pref->ref); - M_ALD(REG_ITMP3, REG_PV, disp); - M_AST(REG_ITMP3, REG_SP, 2 * 8); - - /* move data segment displacement onto stack */ - - disp = dseg_adds4(cd, pref->disp); - M_ILD(REG_ITMP3, REG_PV, disp); - M_IST(REG_ITMP3, REG_SP, 1 * 8); - - /* move patcher function pointer onto stack */ - - disp = dseg_addaddress(cd, pref->patcher); - M_ALD(REG_ITMP3, REG_PV, disp); - M_AST(REG_ITMP3, REG_SP, 0 * 8); - - disp = dseg_addaddress(cd, asm_patcher_wrapper); - M_ALD(REG_ITMP3, REG_PV, disp); - M_JMP(REG_ITMP3); - M_NOP; - } - } + emit_patcher_stubs(jd); codegen_finish(jd); diff --git a/src/vm/jit/mips/emit.c b/src/vm/jit/mips/emit.c index 2447608c7..d8d0dbbad 100644 --- a/src/vm/jit/mips/emit.c +++ b/src/vm/jit/mips/emit.c @@ -47,6 +47,7 @@ #include "vm/exceptions.h" #include "vm/stringlocal.h" /* XXX for gen_resolvebranch */ +#include "vm/jit/abi-asm.h" #include "vm/jit/asmpart.h" #include "vm/jit/dseg.h" #include "vm/jit/emit.h" @@ -361,6 +362,7 @@ void emit_exception_stubs(jitdata *jd) else { disp = (((u4 *) cd->mcodebase) + targetdisp) - (((u4 *) cd->mcodeptr) + 1); + M_BR(disp); M_NOP; } @@ -378,7 +380,7 @@ void emit_patcher_stubs(jitdata *jd) { codegendata *cd; patchref *pref; - u4 mcode; + u4 mcode[2]; u1 *savedmcodeptr; u1 *tmpmcodeptr; s4 targetdisp; @@ -402,11 +404,12 @@ void emit_patcher_stubs(jitdata *jd) tmpmcodeptr = (u1 *) (cd->mcodebase + pref->branchpos); - /* We need to split this, because an unaligned 8 byte read - causes a SIGSEGV. */ + /* We use 2 loads here as an unaligned 8-byte read on 64-bit + MIPS causes a SIGSEGV and using the same code for both + architectures is much better. */ - mcode = ((u8) ((u4 *) tmpmcodeptr)[1] << 32) + - ((u4 *) tmpmcodeptr)[0]; + mcode[0] = ((u4 *) tmpmcodeptr)[0]; + mcode[1] = ((u4 *) tmpmcodeptr)[1]; /* Patch in the call to call the following code (done at compile time). */ @@ -454,9 +457,13 @@ void emit_patcher_stubs(jitdata *jd) /* move machine code onto stack */ - disp = dseg_adds8(cd, mcode); - M_LLD(REG_ITMP3, REG_PV, disp); - M_LST(REG_ITMP3, REG_SP, 3 * 8); + disp = dseg_adds4(cd, mcode[0]); + M_ILD(REG_ITMP3, REG_PV, disp); + M_IST(REG_ITMP3, REG_SP, 3 * 8); + + disp = dseg_adds4(cd, mcode[1]); + M_ILD(REG_ITMP3, REG_PV, disp); + M_IST(REG_ITMP3, REG_SP, 3 * 8 + 4); /* move class/method/field reference onto stack */ @@ -487,6 +494,7 @@ void emit_patcher_stubs(jitdata *jd) else { disp = (((u4 *) cd->mcodebase) + targetdisp) - (((u4 *) cd->mcodeptr) + 1); + M_BR(disp); M_NOP; } @@ -564,6 +572,163 @@ void emit_replacement_stubs(jitdata *jd) } +/* emit_verbosecall_enter ****************************************************** + + Generates the code for the call trace. + +*******************************************************************************/ + +#if !defined(NDEBUG) +void emit_verbosecall_enter(jitdata *jd) +{ + methodinfo *m; + codegendata *cd; + registerdata *rd; + methoddesc *md; + s4 disp; + s4 i, t; + + /* get required compiler data */ + + m = jd->m; + cd = jd->cd; + rd = jd->rd; + + md = m->parseddesc; + + /* mark trace code */ + + M_NOP; + + M_LDA(REG_SP, REG_SP, -(2 + ARG_CNT + TMP_CNT) * 8); + M_AST(REG_RA, REG_SP, 1 * 8); + + /* save argument registers */ + + for (i = 0; i < INT_ARG_CNT; i++) + M_LST(rd->argintregs[i], REG_SP, (2 + i) * 8); + + for (i = 0; i < FLT_ARG_CNT; i++) + M_DST(rd->argfltregs[i], REG_SP, (2 + INT_ARG_CNT + i) * 8); + + /* save temporary registers for leaf methods */ + + if (jd->isleafmethod) { + for (i = 0; i < INT_TMP_CNT; i++) + M_LST(rd->tmpintregs[i], REG_SP, (2 + ARG_CNT + i) * 8); + + for (i = 0; i < FLT_TMP_CNT; i++) + M_DST(rd->tmpfltregs[i], REG_SP, (2 + ARG_CNT + INT_TMP_CNT + i) * 8); + } + + /* load float arguments into integer registers */ + + for (i = 0; i < md->paramcount && i < INT_ARG_CNT; i++) { + t = md->paramtypes[i].type; + + if (IS_FLT_DBL_TYPE(t)) { + if (IS_2_WORD_TYPE(t)) { + M_DST(rd->argfltregs[i], REG_SP, 0 * 8); + M_LLD(rd->argintregs[i], REG_SP, 0 * 8); + } + else { + M_FST(rd->argfltregs[i], REG_SP, 0 * 8); + M_ILD(rd->argintregs[i], REG_SP, 0 * 8); + } + } + } + + disp = dseg_addaddress(cd, m); + M_ALD(REG_ITMP1, REG_PV, disp); + M_AST(REG_ITMP1, REG_SP, 0 * 8); + disp = dseg_addaddress(cd, builtin_trace_args); + M_ALD(REG_ITMP3, REG_PV, disp); + M_JSR(REG_RA, REG_ITMP3); + M_NOP; + + /* restore argument registers */ + + for (i = 0; i < INT_ARG_CNT; i++) + M_LLD(rd->argintregs[i], REG_SP, (2 + i) * 8); + + for (i = 0; i < FLT_ARG_CNT; i++) + M_DLD(rd->argfltregs[i], REG_SP, (2 + INT_ARG_CNT + i) * 8); + + /* restore temporary registers for leaf methods */ + + if (jd->isleafmethod) { + for (i = 0; i < INT_TMP_CNT; i++) + M_LLD(rd->tmpintregs[i], REG_SP, (2 + ARG_CNT + i) * 8); + + for (i = 0; i < FLT_TMP_CNT; i++) + M_DLD(rd->tmpfltregs[i], REG_SP, (2 + ARG_CNT + INT_TMP_CNT + i) * 8); + } + + M_ALD(REG_RA, REG_SP, 1 * 8); + M_LDA(REG_SP, REG_SP, (2 + ARG_CNT + TMP_CNT) * 8); + + /* mark trace code */ + + M_NOP; +} +#endif /* !defined(NDEBUG) */ + + +/* emit_verbosecall_exit ******************************************************* + + Generates the code for the call trace. + +*******************************************************************************/ + +#if !defined(NDEBUG) +void emit_verbosecall_exit(jitdata *jd) +{ + methodinfo *m; + codegendata *cd; + registerdata *rd; + s4 disp; + + /* get required compiler data */ + + m = jd->m; + cd = jd->cd; + rd = jd->rd; + + /* mark trace code */ + + M_NOP; + + M_LDA(REG_SP, REG_SP, -4 * 8); /* keep stack 16-byte aligned */ + M_LST(REG_RA, REG_SP, 0 * 8); + + M_LST(REG_RESULT, REG_SP, 1 * 8); + M_DST(REG_FRESULT, REG_SP, 2 * 8); + + disp = dseg_addaddress(cd, m); + M_ALD(rd->argintregs[0], REG_PV, disp); + + M_MOV(REG_RESULT, rd->argintregs[1]); + M_DMOV(REG_FRESULT, rd->argfltregs[2]); + M_FMOV(REG_FRESULT, rd->argfltregs[3]); + + disp = dseg_addaddress(cd, builtin_displaymethodstop); + M_ALD(REG_ITMP3, REG_PV, disp); + M_JSR(REG_RA, REG_ITMP3); + M_NOP; + + M_DLD(REG_FRESULT, REG_SP, 2 * 8); + M_LLD(REG_RESULT, REG_SP, 1 * 8); + + M_LLD(REG_RA, REG_SP, 0 * 8); + M_LDA(REG_SP, REG_SP, 4 * 8); + + /* mark trace code */ + + M_NOP; +} +#endif /* !defined(NDEBUG) */ + + /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where diff --git a/src/vm/jit/mips/patcher.c b/src/vm/jit/mips/patcher.c index 313620b95..4d3634504 100644 --- a/src/vm/jit/mips/patcher.c +++ b/src/vm/jit/mips/patcher.c @@ -28,7 +28,7 @@ Changes: - $Id: patcher.c 5164 2006-07-19 15:54:01Z twisti $ + $Id: patcher.c 5319 2006-09-05 12:54:10Z twisti $ */ @@ -138,11 +138,7 @@ java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra) bool patcher_get_putstatic(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_field *uf; s4 disp; u1 *pv; @@ -151,12 +147,8 @@ bool patcher_get_putstatic(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif uf = (unresolved_field *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -174,13 +166,8 @@ bool patcher_get_putstatic(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -210,21 +197,13 @@ bool patcher_get_putstatic(u1 *sp) bool patcher_get_putfield(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_field *uf; fieldinfo *fi; ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif uf = (unresolved_field *) *((ptrint *) (sp + 2 * 8)); /* get the fieldinfo */ @@ -234,13 +213,8 @@ bool patcher_get_putfield(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* if we show disassembly, we have to skip the nop's */ @@ -294,11 +268,7 @@ bool patcher_get_putfield(u1 *sp) bool patcher_aconst(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; s4 disp; u1 *pv; @@ -307,12 +277,8 @@ bool patcher_aconst(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -324,13 +290,8 @@ bool patcher_aconst(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -364,11 +325,7 @@ bool patcher_aconst(u1 *sp) bool patcher_builtin_multianewarray(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; s4 disp; u1 *pv; @@ -377,12 +334,8 @@ bool patcher_builtin_multianewarray(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -394,13 +347,8 @@ bool patcher_builtin_multianewarray(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -433,11 +381,7 @@ bool patcher_builtin_multianewarray(u1 *sp) bool patcher_builtin_arraycheckcast(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; s4 disp; u1 *pv; @@ -446,12 +390,8 @@ bool patcher_builtin_arraycheckcast(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -463,13 +403,8 @@ bool patcher_builtin_arraycheckcast(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -501,11 +436,7 @@ bool patcher_builtin_arraycheckcast(u1 *sp) bool patcher_invokestatic_special(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_method *um; s4 disp; u1 *pv; @@ -514,12 +445,8 @@ bool patcher_invokestatic_special(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -531,13 +458,8 @@ bool patcher_invokestatic_special(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -570,23 +492,15 @@ bool patcher_invokestatic_special(u1 *sp) bool patcher_invokevirtual(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_method *um; methodinfo *m; /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); /* get the fieldinfo */ @@ -596,13 +510,8 @@ bool patcher_invokevirtual(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* if we show disassembly, we have to skip the nop's */ @@ -641,23 +550,15 @@ bool patcher_invokevirtual(u1 *sp) bool patcher_invokeinterface(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_method *um; methodinfo *m; /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); /* get the fieldinfo */ @@ -667,13 +568,8 @@ bool patcher_invokeinterface(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* if we show disassembly, we have to skip the nop's */ @@ -716,11 +612,7 @@ bool patcher_invokeinterface(u1 *sp) bool patcher_checkcast_instanceof_flags(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; s4 disp; u1 *pv; @@ -729,12 +621,8 @@ bool patcher_checkcast_instanceof_flags(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -746,13 +634,8 @@ bool patcher_checkcast_instanceof_flags(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -787,23 +670,15 @@ bool patcher_checkcast_instanceof_flags(u1 *sp) bool patcher_checkcast_instanceof_interface(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; classinfo *c; /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); /* get the fieldinfo */ @@ -813,13 +688,8 @@ bool patcher_checkcast_instanceof_interface(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* if we show disassembly, we have to skip the nop's */ @@ -857,11 +727,7 @@ bool patcher_checkcast_instanceof_interface(u1 *sp) bool patcher_checkcast_instanceof_class(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif constant_classref *cr; s4 disp; u1 *pv; @@ -870,12 +736,8 @@ bool patcher_checkcast_instanceof_class(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); @@ -887,13 +749,8 @@ bool patcher_checkcast_instanceof_class(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -920,22 +777,14 @@ bool patcher_checkcast_instanceof_class(u1 *sp) bool patcher_clinit(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif classinfo *c; /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif c = (classinfo *) *((ptrint *) (sp + 2 * 8)); /* check if the class is initialized */ @@ -946,13 +795,8 @@ bool patcher_clinit(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -974,23 +818,15 @@ bool patcher_clinit(u1 *sp) bool patcher_athrow_areturn(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif unresolved_class *uc; classinfo *c; /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif uc = (unresolved_class *) *((ptrint *) (sp + 2 * 8)); /* resolve the class */ @@ -1000,13 +836,8 @@ bool patcher_athrow_areturn(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ @@ -1027,11 +858,7 @@ bool patcher_athrow_areturn(u1 *sp) bool patcher_resolve_native(u1 *sp) { u1 *ra; -#if SIZEOF_VOID_P == 8 - u8 mcode; -#else u4 mcode[2]; -#endif methodinfo *m; s4 disp; u1 *pv; @@ -1040,21 +867,12 @@ bool patcher_resolve_native(u1 *sp) /* get stuff from the stack */ ra = (u1 *) *((ptrint *) (sp + 5 * 8)); -#if SIZEOF_VOID_P == 8 - mcode = *((u8 *) (sp + 3 * 8)); -#else mcode[0] = *((u4 *) (sp + 3 * 8)); mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); -#endif m = (methodinfo *) *((ptrint *) (sp + 2 * 8)); disp = *((s4 *) (sp + 1 * 8)); pv = (u1 *) *((ptrint *) (sp + 0 * 8)); - /* calculate and set the new return address */ - - ra = ra - 2 * 4; - *((ptrint *) (sp + 5 * 8)) = (ptrint) ra; - /* resolve native function */ if (!(f = native_resolve_function(m))) @@ -1062,13 +880,8 @@ bool patcher_resolve_native(u1 *sp) /* patch back original code */ -#if SIZEOF_VOID_P == 8 - *((u4 *) (ra + 0 * 4)) = mcode; - *((u4 *) (ra + 1 * 4)) = mcode >> 32; -#else *((u4 *) (ra + 0 * 4)) = mcode[0]; *((u4 *) (ra + 1 * 4)) = mcode[1]; -#endif /* synchronize instruction cache */ diff --git a/src/vm/jit/powerpc/codegen.c b/src/vm/jit/powerpc/codegen.c index a91b5baea..38118d9b8 100644 --- a/src/vm/jit/powerpc/codegen.c +++ b/src/vm/jit/powerpc/codegen.c @@ -31,7 +31,7 @@ Christian Ullrich Edwin Steiner - $Id: codegen.c 5281 2006-08-28 15:18:54Z twisti $ + $Id: codegen.c 5323 2006-09-05 16:45:24Z edwin $ */ @@ -2022,24 +2022,24 @@ bool codegen(jitdata *jd) M_ALD(REG_ITMP1, REG_PV, disp); switch (iptr->op1) { case TYPE_INT: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP23_PACKED); - M_LST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP23_PACKED); + M_LST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_AST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_AST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_FST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_FST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_DST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_DST_INTERN(s1, REG_ITMP1, 0); break; } break; diff --git a/src/vm/jit/powerpc64/codegen.c b/src/vm/jit/powerpc64/codegen.c index f4efe65ac..18e334614 100644 --- a/src/vm/jit/powerpc64/codegen.c +++ b/src/vm/jit/powerpc64/codegen.c @@ -31,7 +31,7 @@ Christian Ullrich Edwin Steiner - $Id: codegen.c 5286 2006-09-04 12:38:21Z tbfg $ + $Id: codegen.c 5323 2006-09-05 16:45:24Z edwin $ */ @@ -128,15 +128,11 @@ bool codegen(jitdata *jd) #if defined(ENABLE_THREADS) /* space to save argument of monitor_enter and Return Values to survive */ /* monitor_exit. The stack position for the argument can not be shared */ - /* with place to save the return register on PPC, since both values */ + /* with place to save the return register on PPC64, since both values */ /* reside in R3 */ if (checksync && (m->flags & ACC_SYNCHRONIZED)) { /* reserve 2 slots for long/double return values for monitorexit */ - - if (IS_2_WORD_TYPE(m->parseddesc->returntype.type)) - stackframesize += 3; - else - stackframesize += 2; + stackframesize += 2; } #endif @@ -162,7 +158,7 @@ bool codegen(jitdata *jd) */ if (checksync && (m->flags & ACC_SYNCHRONIZED)) - (void) dseg_adds4(cd, (rd->memuse + 1) * 4); /* IsSync */ + (void) dseg_adds4(cd, (rd->memuse + 1) * 8); /* IsSync */ else #endif (void) dseg_adds4(cd, 0); /* IsSync */ @@ -307,6 +303,7 @@ bool codegen(jitdata *jd) if (checksync && (m->flags & ACC_SYNCHRONIZED)) { p = dseg_addaddress(cd, LOCK_monitor_enter); M_ALD(REG_ITMP3, REG_PV, p); + M_ALD(REG_ITMP3, REG_ITMP3, 0); /* TOC */ M_MTCTR(REG_ITMP3); /* get or test the lock object */ @@ -321,7 +318,7 @@ bool codegen(jitdata *jd) codegen_add_nullpointerexception_ref(cd); } - M_AST(rd->argintregs[0], REG_SP, rd->memuse * 4); + M_AST(rd->argintregs[0], REG_SP, rd->memuse * 8); M_JSR; } #endif @@ -1844,6 +1841,7 @@ bool codegen(jitdata *jd) disp = dseg_addaddress(cd, BUILTIN_canstore); M_ALD(REG_ITMP3, REG_PV, disp); + M_ALD(REG_ITMP3, REG_ITMP3, 0); /* TOC */ M_MTCTR(REG_ITMP3); M_INTMOVE(s1, rd->argintregs[0]); @@ -1944,24 +1942,24 @@ bool codegen(jitdata *jd) M_ALD(REG_ITMP1, REG_PV, disp); switch (iptr->op1) { case TYPE_INT: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_LST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_LST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_AST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_AST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_FST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_FST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_DST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_DST_INTERN(s1, REG_ITMP1, 0); break; } break; @@ -2540,44 +2538,43 @@ nowperformreturn: if (checksync && (m->flags & ACC_SYNCHRONIZED)) { disp = dseg_addaddress(cd, LOCK_monitor_exit); M_ALD(REG_ITMP3, REG_PV, disp); + M_ALD(REG_ITMP3, REG_ITMP3, 0); /* TOC */ M_MTCTR(REG_ITMP3); /* we need to save the proper return value */ switch (iptr->opc) { case ICMD_LRETURN: - /*M_IST(REG_RESULT2, REG_SP, rd->memuse * 4 + 8); FIXME*/ - /* fall through */ case ICMD_IRETURN: case ICMD_ARETURN: - M_IST(REG_RESULT , REG_SP, rd->memuse * 4 + 4); + /* fall through */ + M_LST(REG_RESULT , REG_SP, rd->memuse * 4 + 8); break; case ICMD_FRETURN: - M_FST(REG_FRESULT, REG_SP, rd->memuse * 4 + 4); + M_FST(REG_FRESULT, REG_SP, rd->memuse * 4 + 8); break; case ICMD_DRETURN: - M_DST(REG_FRESULT, REG_SP, rd->memuse * 4 + 4); + M_DST(REG_FRESULT, REG_SP, rd->memuse * 4 + 8); break; } - M_ALD(rd->argintregs[0], REG_SP, rd->memuse * 4); + M_ALD(rd->argintregs[0], REG_SP, rd->memuse * 8); M_JSR; /* and now restore the proper return value */ switch (iptr->opc) { case ICMD_LRETURN: - /*M_ILD(REG_RESULT2, REG_SP, rd->memuse * 4 + 8); FIXME*/ - /* fall through */ case ICMD_IRETURN: case ICMD_ARETURN: - M_ILD(REG_RESULT , REG_SP, rd->memuse * 4 + 4); + /* fall through */ + M_LLD(REG_RESULT , REG_SP, rd->memuse * 4 + 8); break; case ICMD_FRETURN: - M_FLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 4); + M_FLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 8); break; case ICMD_DRETURN: - M_DLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 4); + M_DLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 8); break; } } @@ -3684,7 +3681,7 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) stackframesize = sizeof(stackframeinfo) / SIZEOF_VOID_P + sizeof(localref_table) / SIZEOF_VOID_P + - 4 + /* 4 stackframeinfo arguments (darwin)*/ + 4 + /* 4 stackframeinfo arguments (darwin)*/ nmd->paramcount + nmd->memuse; @@ -3693,7 +3690,7 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) /* create method header */ (void) dseg_addaddress(cd, code); /* CodeinfoPointer */ - (void) dseg_adds4(cd, stackframesize * 4); /* FrameSize */ + (void) dseg_adds4(cd, stackframesize * 8); /* FrameSize */ (void) dseg_adds4(cd, 0); /* IsSync */ (void) dseg_adds4(cd, 0); /* IsLeaf */ (void) dseg_adds4(cd, 0); /* IntSave */ @@ -3762,6 +3759,10 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) M_MTCTR(REG_ITMP1); M_JSR; + M_NOP; + M_NOP; + M_NOP; + /* restore integer and float argument registers */ j = 0; @@ -3852,6 +3853,10 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) M_MTCTR(REG_ITMP3); M_JSR; + M_NOP; + M_NOP; + M_NOP; + /* save return value */ if (md->returntype.type != TYPE_VOID) { @@ -3874,6 +3879,10 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) /* remove native stackframe info */ + M_NOP; + M_NOP; + M_NOP; + M_AADD_IMM(REG_SP, stackframesize * 8, rd->argintregs[0]); disp = dseg_addaddress(cd, codegen_finish_native_call); M_ALD(REG_ITMP1, REG_PV, disp); diff --git a/src/vm/jit/powerpc64/emit.c b/src/vm/jit/powerpc64/emit.c index fd8ca4a1a..19e7b337e 100644 --- a/src/vm/jit/powerpc64/emit.c +++ b/src/vm/jit/powerpc64/emit.c @@ -635,6 +635,9 @@ void emit_verbosecall_enter (jitdata *jd) M_ALD(REG_ZERO, REG_SP, stack_size + LA_LR_OFFSET); M_MTLR(REG_ZERO); M_LDA(REG_SP, REG_SP, stack_size); + + /* mark trace code */ + M_NOP; } /* emit_verbosecall_exit ****************************************************** @@ -647,6 +650,9 @@ void emit_verbosecall_exit(jitdata *jd) codegendata *cd = jd->cd; s4 disp; + /* mark trace code */ + M_NOP; + M_MFLR(REG_ZERO); M_LDA(REG_SP, REG_SP, -(LA_SIZE+PA_SIZE+10*8)); M_DST(REG_FRESULT, REG_SP, LA_SIZE+PA_SIZE+0*8); @@ -676,6 +682,9 @@ void emit_verbosecall_exit(jitdata *jd) M_ALD(REG_ZERO, REG_SP, LA_SIZE+PA_SIZE+2*8); M_LDA(REG_SP, REG_SP, LA_SIZE+PA_SIZE+10*8); M_MTLR(REG_ZERO); + + /* mark trace code */ + M_NOP; } diff --git a/src/vm/jit/powerpc64/linux/md-abi.c b/src/vm/jit/powerpc64/linux/md-abi.c index b62b4879d..61e3adf26 100644 --- a/src/vm/jit/powerpc64/linux/md-abi.c +++ b/src/vm/jit/powerpc64/linux/md-abi.c @@ -28,7 +28,7 @@ Changes: - $Id: md-abi.c 5232 2006-08-11 13:11:44Z tbfg $ + $Id: md-abi.c 5316 2006-09-05 12:24:48Z tbfg $ */ @@ -117,7 +117,7 @@ void md_param_alloc(methoddesc *md) iarg = 0; farg = 0; - stacksize = LA_SIZE_IN_POINTERS; + stacksize = LA_SIZE_IN_POINTERS + PA_SIZE_IN_POINTERS; /* get params field of methoddesc */ @@ -125,6 +125,7 @@ void md_param_alloc(methoddesc *md) for (i = 0; i < md->paramcount; i++, pd++) { switch (md->paramtypes[i].type) { + case TYPE_LNG: case TYPE_INT: case TYPE_ADR: if (iarg < INT_ARG_CNT) { @@ -137,21 +138,6 @@ void md_param_alloc(methoddesc *md) stacksize++; } break; - case TYPE_LNG: - if (iarg < INT_ARG_CNT - 1) { - _ALIGN(iarg); - pd->inmemory = false; - /* rd->arg[int|flt]regs index !! */ - pd->regoff = PACK_REGS(iarg + 1, iarg); - iarg += 2; - } else { - _ALIGN(stacksize); - pd->inmemory = true; - pd->regoff = stacksize; - iarg = INT_ARG_CNT; - stacksize += 2; - } - break; case TYPE_FLT: if (farg < FLT_ARG_CNT) { pd->inmemory = false; @@ -181,12 +167,11 @@ void md_param_alloc(methoddesc *md) /* Since R3/R4, F1 (==A0/A1, A0) are used for passing return values, this */ /* argument register usage has to be regarded, too */ if (IS_INT_LNG_TYPE(md->returntype.type)) { - if (iarg < (IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1)) - iarg = IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1; - } else { - if (IS_FLT_DBL_TYPE(md->returntype.type)) - if (farg < 1) - farg = 1; + if (iarg < 1) + iarg = 1; + } else if (IS_FLT_DBL_TYPE(md->returntype.type)) { + if (farg < 1) + farg = 1; } /* fill register and stack usage */ @@ -248,19 +233,10 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) stackslot->flags = 0; if (IS_INT_LNG_TYPE(md->returntype.type)) { - if (!IS_2_WORD_TYPE(md->returntype.type)) { - if (rd->argintreguse < 1) - rd->argintreguse = 1; - - stackslot->regoff = REG_RESULT; - - } else { - if (rd->argintreguse < 2) - rd->argintreguse = 2; - - /* stackslot->regoff = PACK_REGS(REG_RESULT2, REG_RESULT); // FIXME */ - } + if (rd->argintreguse < 1) + rd->argintreguse = 1; + stackslot->regoff = REG_RESULT; } else { /* float/double */ if (rd->argfltreguse < 1) rd->argfltreguse = 1; diff --git a/src/vm/jit/sparc64/codegen.c b/src/vm/jit/sparc64/codegen.c index 8ad3cf658..7e0135948 100644 --- a/src/vm/jit/sparc64/codegen.c +++ b/src/vm/jit/sparc64/codegen.c @@ -1582,24 +1582,24 @@ bool codegen(jitdata *jd) M_ALD(REG_ITMP1, REG_PV, disp); switch (iptr->op1) { case TYPE_INT: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_IST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_IST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_LNG: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_STX_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_STX_INTERN(s1, REG_ITMP1, 0); break; case TYPE_ADR: - s2 = emit_load_s2(jd, iptr, src, REG_ITMP2); - M_AST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_ITMP2); + M_AST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_FLT: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_FST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_FST_INTERN(s1, REG_ITMP1, 0); break; case TYPE_DBL: - s2 = emit_load_s2(jd, iptr, src, REG_FTMP2); - M_DST_INTERN(s2, REG_ITMP1, 0); + s1 = emit_load_s1(jd, iptr, src, REG_FTMP2); + M_DST_INTERN(s1, REG_ITMP1, 0); break; } break;