X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Fcodegen.c;h=f010d98f489255c1cb97983b094fa09c9d6d2877;hb=b76e356b0af200d2568e6fc55e82e233f1808eb9;hp=c7ac1461546e3e786a0117b4cc12d3f3c9e041f9;hpb=2122f85a95e68fb46436bb1da06a65ea1aadda07;p=cacao.git diff --git a/src/vm/jit/powerpc/codegen.c b/src/vm/jit/powerpc/codegen.c index c7ac14615..f010d98f4 100644 --- a/src/vm/jit/powerpc/codegen.c +++ b/src/vm/jit/powerpc/codegen.c @@ -1,9 +1,7 @@ /* src/vm/jit/powerpc/codegen.c - machine code generator for 32-bit PowerPC - Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel, - C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, - E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, - J. Wenninger, Institut f. Computersprachen - TU Wien + Copyright (C) 1996-2005, 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -58,7 +56,7 @@ #include "vm/jit/dseg.h" #include "vm/jit/emit-common.h" #include "vm/jit/jit.h" -#include "vm/jit/md.h" +#include "vm/jit/linenumbertable.h" #include "vm/jit/methodheader.h" #include "vm/jit/parse.h" #include "vm/jit/patcher-common.h" @@ -87,11 +85,9 @@ bool codegen_emit(jitdata *jd) codegendata *cd; registerdata *rd; s4 len, s1, s2, s3, d, disp; - ptrint a; varinfo *var; basicblock *bptr; instruction *iptr; - exception_entry *ex; u2 currentline; methodinfo *lm; /* local methodinfo for ICMD_INVOKE* */ unresolved_method *um; @@ -100,7 +96,8 @@ bool codegen_emit(jitdata *jd) fieldinfo *fi; unresolved_field *uf; s4 fieldtype; - s4 varindex; + s4 varindex; + int i; /* get required compiler data */ @@ -137,7 +134,7 @@ bool codegen_emit(jitdata *jd) not be shared with place to save the return register on PPC, since both values reside in R3. */ - if (checksync && (m->flags & ACC_SYNCHRONIZED)) + if (checksync && code_is_synchronized(code)) cd->stackframesize += 2; #endif @@ -145,44 +142,26 @@ bool codegen_emit(jitdata *jd) /* align stack to 16-bytes */ - if (!jd->isleafmethod || JITDATA_HAS_FLAG_VERBOSECALL(jd)) + if (!code_is_leafmethod(code) || JITDATA_HAS_FLAG_VERBOSECALL(jd)) ALIGN_2(cd->stackframesize); - else if (jd->isleafmethod && (cd->stackframesize == LA_SIZE_IN_POINTERS)) + else if (code_is_leafmethod(code) && (cd->stackframesize == LA_SIZE_IN_POINTERS)) cd->stackframesize = 0; (void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */ (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */ -#if defined(ENABLE_THREADS) - /* IsSync contains the offset relative to the stack pointer for the - argument of monitor_exit used in the exception handler. Since the - offset could be zero and give a wrong meaning of the flag it is - offset by one. - */ - - if (checksync && (m->flags & ACC_SYNCHRONIZED)) - (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 8);/* IsSync */ - else -#endif - (void) dseg_add_unique_s4(cd, 0); /* IsSync */ - - (void) dseg_add_unique_s4(cd, jd->isleafmethod); /* IsLeaf */ - (void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */ - (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */ - - dseg_addlinenumbertablesize(cd); + code->synchronizedoffset = rd->memuse * 8; - (void) dseg_add_unique_s4(cd, jd->exceptiontablelength); /* ExTableSize */ + /* REMOVEME: We still need it for exception handling in assembler. */ - /* create exception table */ + if (code_is_leafmethod(code)) + (void) dseg_add_unique_s4(cd, 1); + else + (void) dseg_add_unique_s4(cd, 0); - for (ex = jd->exceptiontable; ex != NULL; ex = ex->down) { - dseg_add_target(cd, ex->start); - dseg_add_target(cd, ex->end); - dseg_add_target(cd, ex->handler); - (void) dseg_add_unique_address(cd, ex->catchtype.any); - } + (void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */ + (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */ #if defined(ENABLE_PROFILING) /* generate method profiling code */ @@ -201,7 +180,7 @@ bool codegen_emit(jitdata *jd) /* create stack frame (if necessary) */ - if (!jd->isleafmethod) { + if (!code_is_leafmethod(code)) { M_MFLR(REG_ZERO); M_AST(REG_ZERO, REG_SP, LA_LR_OFFSET); } @@ -300,7 +279,7 @@ bool codegen_emit(jitdata *jd) #if defined(ENABLE_THREADS) /* call monitorenter function */ - if (checksync && (m->flags & ACC_SYNCHRONIZED)) { + if (checksync && code_is_synchronized(code)) { /* stack offset for monitor argument */ s1 = rd->memuse; @@ -326,7 +305,7 @@ bool codegen_emit(jitdata *jd) /* get or test the lock object */ if (m->flags & ACC_STATIC) { - disp = dseg_add_address(cd, &m->class->object.header); + disp = dseg_add_address(cd, &m->clazz->object.header); M_ALD(REG_A0, REG_PV, disp); } else { @@ -442,7 +421,7 @@ bool codegen_emit(jitdata *jd) for (iptr = bptr->iinstr; len > 0; len--, iptr++) { if (iptr->line != currentline) { - dseg_addlinenumber(cd, iptr->line); + linenumbertable_list_entry_add(cd, iptr->line); currentline = iptr->line; } @@ -462,14 +441,14 @@ bool codegen_emit(jitdata *jd) case ICMD_INLINE_BODY: REPLACEMENT_POINT_INLINE_BODY(cd, iptr); - dseg_addlinenumber_inline_start(cd, iptr); - dseg_addlinenumber(cd, iptr->line); + linenumbertable_list_entry_add_inline_start(cd, iptr); + linenumbertable_list_entry_add(cd, iptr->line); break; case ICMD_INLINE_END: - dseg_addlinenumber_inline_end(cd, iptr); - dseg_addlinenumber(cd, iptr->line); + linenumbertable_list_entry_add_inline_end(cd, iptr); + linenumbertable_list_entry_add(cd, iptr->line); break; case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */ @@ -497,16 +476,16 @@ bool codegen_emit(jitdata *jd) case ICMD_FCONST: /* ... ==> ..., constant */ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - a = dseg_add_float(cd, iptr->sx.val.f); - M_FLD(d, REG_PV, a); + disp = dseg_add_float(cd, iptr->sx.val.f); + M_FLD(d, REG_PV, disp); emit_store_dst(jd, iptr, d); break; case ICMD_DCONST: /* ... ==> ..., constant */ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - a = dseg_add_double(cd, iptr->sx.val.d); - M_DLD(d, REG_PV, a); + disp = dseg_add_double(cd, iptr->sx.val.d); + M_DLD(d, REG_PV, disp); emit_store_dst(jd, iptr, d); break; @@ -791,7 +770,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_A2_A3_PACKED); /* XXX TODO: only do this if arithmetic check is really done! */ - M_OR_TST(GET_HIGH_REG(s2), GET_LOW_REG(s2), REG_ITMP3); + M_IOR_TST(GET_HIGH_REG(s2), GET_LOW_REG(s2), REG_ITMP3); /* XXX could be optimized */ emit_arithmetic_check(cd, iptr, REG_ITMP3); @@ -847,7 +826,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - M_AND_IMM(s2, 0x1f, REG_ITMP3); + M_IAND_IMM(s2, 0x1f, REG_ITMP3); M_SLL(s1, REG_ITMP3, d); emit_store_dst(jd, iptr, d); break; @@ -866,7 +845,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - M_AND_IMM(s2, 0x1f, REG_ITMP3); + M_IAND_IMM(s2, 0x1f, REG_ITMP3); M_SRA(s1, REG_ITMP3, d); emit_store_dst(jd, iptr, d); break; @@ -885,7 +864,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - M_AND_IMM(s2, 0x1f, REG_ITMP2); + M_IAND_IMM(s2, 0x1f, REG_ITMP2); M_SRL(s1, REG_ITMP2, d); emit_store_dst(jd, iptr, d); break; @@ -908,7 +887,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - M_AND(s1, s2, d); + M_IAND(s1, s2, d); emit_store_dst(jd, iptr, d); break; @@ -918,7 +897,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); if ((iptr->sx.val.i >= 0) && (iptr->sx.val.i <= 65535)) - M_AND_IMM(s1, iptr->sx.val.i, d); + M_IAND_IMM(s1, iptr->sx.val.i, d); /* else if (iptr->sx.val.i == 0xffffff) { M_RLWINM(s1, 0, 8, 31, d); @@ -926,7 +905,7 @@ bool codegen_emit(jitdata *jd) */ else { ICONST(REG_ITMP3, iptr->sx.val.i); - M_AND(s1, REG_ITMP3, d); + M_IAND(s1, REG_ITMP3, d); } emit_store_dst(jd, iptr, d); break; @@ -936,10 +915,10 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s2_low(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); - M_AND(s1, s2, GET_LOW_REG(d)); + M_IAND(s1, s2, GET_LOW_REG(d)); s1 = emit_load_s1_high(jd, iptr, REG_ITMP1); s2 = emit_load_s2_high(jd, iptr, REG_ITMP3);/* don't use REG_ITMP2*/ - M_AND(s1, s2, GET_HIGH_REG(d)); + M_IAND(s1, s2, GET_HIGH_REG(d)); emit_store_dst(jd, iptr, d); break; @@ -950,18 +929,18 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); if ((s3 >= 0) && (s3 <= 65535)) - M_AND_IMM(s1, s3, GET_LOW_REG(d)); + M_IAND_IMM(s1, s3, GET_LOW_REG(d)); else { ICONST(REG_ITMP3, s3); - M_AND(s1, REG_ITMP3, GET_LOW_REG(d)); + M_IAND(s1, REG_ITMP3, GET_LOW_REG(d)); } s1 = emit_load_s1_high(jd, iptr, REG_ITMP1); s3 = iptr->sx.val.l >> 32; if ((s3 >= 0) && (s3 <= 65535)) - M_AND_IMM(s1, s3, GET_HIGH_REG(d)); + M_IAND_IMM(s1, s3, GET_HIGH_REG(d)); else { ICONST(REG_ITMP3, s3); /* don't use REG_ITMP2 */ - M_AND(s1, REG_ITMP3, GET_HIGH_REG(d)); + M_IAND(s1, REG_ITMP3, GET_HIGH_REG(d)); } emit_store_dst(jd, iptr, d); break; @@ -976,7 +955,7 @@ bool codegen_emit(jitdata *jd) M_BGE(1 + 2*(iptr->sx.val.i >= 32768)); if (iptr->sx.val.i >= 32768) { M_ADDIS(REG_ZERO, iptr->sx.val.i >> 16, REG_ITMP2); - M_OR_IMM(REG_ITMP2, iptr->sx.val.i, REG_ITMP2); + M_IOR_IMM(REG_ITMP2, iptr->sx.val.i, REG_ITMP2); M_IADD(s1, REG_ITMP2, REG_ITMP2); } else { @@ -997,7 +976,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - M_OR(s1, s2, d); + M_IOR(s1, s2, d); emit_store_dst(jd, iptr, d); break; @@ -1007,10 +986,10 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); if ((iptr->sx.val.i >= 0) && (iptr->sx.val.i <= 65535)) - M_OR_IMM(s1, iptr->sx.val.i, d); + M_IOR_IMM(s1, iptr->sx.val.i, d); else { ICONST(REG_ITMP3, iptr->sx.val.i); - M_OR(s1, REG_ITMP3, d); + M_IOR(s1, REG_ITMP3, d); } emit_store_dst(jd, iptr, d); break; @@ -1020,10 +999,10 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s2_low(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); - M_OR(s1, s2, GET_LOW_REG(d)); + M_IOR(s1, s2, GET_LOW_REG(d)); s1 = emit_load_s1_high(jd, iptr, REG_ITMP1); s2 = emit_load_s2_high(jd, iptr, REG_ITMP3);/* don't use REG_ITMP2*/ - M_OR(s1, s2, GET_HIGH_REG(d)); + M_IOR(s1, s2, GET_HIGH_REG(d)); emit_store_dst(jd, iptr, d); break; @@ -1034,18 +1013,18 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); if ((s3 >= 0) && (s3 <= 65535)) - M_OR_IMM(s1, s3, GET_LOW_REG(d)); + M_IOR_IMM(s1, s3, GET_LOW_REG(d)); else { ICONST(REG_ITMP3, s3); - M_OR(s1, REG_ITMP3, GET_LOW_REG(d)); + M_IOR(s1, REG_ITMP3, GET_LOW_REG(d)); } s1 = emit_load_s1_high(jd, iptr, REG_ITMP1); s3 = iptr->sx.val.l >> 32; if ((s3 >= 0) && (s3 <= 65535)) - M_OR_IMM(s1, s3, GET_HIGH_REG(d)); + M_IOR_IMM(s1, s3, GET_HIGH_REG(d)); else { ICONST(REG_ITMP3, s3); /* don't use REG_ITMP2 */ - M_OR(s1, REG_ITMP3, GET_HIGH_REG(d)); + M_IOR(s1, REG_ITMP3, GET_HIGH_REG(d)); } emit_store_dst(jd, iptr, d); break; @@ -1245,7 +1224,6 @@ bool codegen_emit(jitdata *jd) case ICMD_FCMPL: /* ..., val1, val2 ==> ..., val1 fcmpg val2 */ case ICMD_DCMPL: /* == => 0, < => 1, > => -1 */ - s1 = emit_load_s1(jd, iptr, REG_FTMP1); s2 = emit_load_s2(jd, iptr, REG_FTMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP1); @@ -1275,107 +1253,6 @@ bool codegen_emit(jitdata *jd) emit_store_dst(jd, iptr, d); break; - case ICMD_IF_FCMPEQ: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPEQ: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - M_BNAN(1); - emit_beq(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPNE: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPNE: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - emit_bnan(cd, iptr->dst.block); - emit_bne(cd, iptr->dst.block); - break; - - - case ICMD_IF_FCMPL_LT: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPL_LT: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - emit_bnan(cd, iptr->dst.block); - emit_blt(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPL_GT: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPL_GT: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - M_BNAN(1); - emit_bgt(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPL_LE: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPL_LE: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - emit_bnan(cd, iptr->dst.block); - emit_ble(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPL_GE: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPL_GE: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - M_BNAN(1); - emit_bge(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPG_LT: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPG_LT: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - M_BNAN(1); - emit_blt(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPG_GT: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPG_GT: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - emit_bnan(cd, iptr->dst.block); - emit_bgt(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPG_LE: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPG_LE: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - M_BNAN(1); - emit_ble(cd, iptr->dst.block); - break; - - case ICMD_IF_FCMPG_GE: /* ..., value, value ==> ... */ - case ICMD_IF_DCMPG_GE: - - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - s2 = emit_load_s2(jd, iptr, REG_FTMP2); - M_FCMPU(s1, s2); - emit_bnan(cd, iptr->dst.block); - emit_bge(cd, iptr->dst.block); - break; - /* memory operations **************************************************/ @@ -1621,9 +1498,9 @@ bool codegen_emit(jitdata *jd) fieldtype = fi->type; disp = dseg_add_address(cd, fi->value); - if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) + if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz)) patcher_add_patch_ref(jd, PATCHER_initialize_class, - fi->class, disp); + fi->clazz, disp); } M_ALD(REG_ITMP1, REG_PV, disp); @@ -1667,9 +1544,9 @@ bool codegen_emit(jitdata *jd) fieldtype = fi->type; disp = dseg_add_address(cd, fi->value); - if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) + if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz)) patcher_add_patch_ref(jd, PATCHER_initialize_class, - fi->class, disp); + fi->clazz, disp); } M_ALD(REG_ITMP1, REG_PV, disp); @@ -1816,13 +1693,13 @@ bool codegen_emit(jitdata *jd) M_ALD(REG_ITMP2, REG_PV, disp); M_MTCTR(REG_ITMP2); - if (jd->isleafmethod) + if (code_is_leafmethod(code)) M_MFLR(REG_ITMP3); /* save LR */ M_BL(0); /* get current PC */ M_MFLR(REG_ITMP2_XPC); - if (jd->isleafmethod) + if (code_is_leafmethod(code)) M_MTLR(REG_ITMP3); /* restore LR */ M_RTS; /* jump to CTR */ @@ -1873,19 +1750,19 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s1_high(jd, iptr, REG_ITMP2); if (iptr->sx.val.l == 0) { - M_OR_TST(s1, s2, REG_ITMP3); + M_IOR_TST(s1, s2, REG_ITMP3); } else if ((iptr->sx.val.l >= 0) && (iptr->sx.val.l <= 0xffff)) { M_XOR_IMM(s2, 0, REG_ITMP2); M_XOR_IMM(s1, iptr->sx.val.l & 0xffff, REG_ITMP1); - M_OR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); + M_IOR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); } else { ICONST(REG_ITMP3, iptr->sx.val.l & 0xffffffff); M_XOR(s1, REG_ITMP3, REG_ITMP1); ICONST(REG_ITMP3, iptr->sx.val.l >> 32); M_XOR(s2, REG_ITMP3, REG_ITMP2); - M_OR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); + M_IOR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); } emit_beq(cd, iptr->dst.block); break; @@ -1924,7 +1801,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s1_high(jd, iptr, REG_ITMP2); /* if (iptr->sx.val.l == 0) { */ -/* M_OR(s1, s2, REG_ITMP3); */ +/* M_IOR(s1, s2, REG_ITMP3); */ /* M_CMPI(REG_ITMP3, 0); */ /* } else */ @@ -1951,19 +1828,19 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s1_high(jd, iptr, REG_ITMP2); if (iptr->sx.val.l == 0) { - M_OR_TST(s1, s2, REG_ITMP3); + M_IOR_TST(s1, s2, REG_ITMP3); } else if ((iptr->sx.val.l >= 0) && (iptr->sx.val.l <= 0xffff)) { M_XOR_IMM(s2, 0, REG_ITMP2); M_XOR_IMM(s1, iptr->sx.val.l & 0xffff, REG_ITMP1); - M_OR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); + M_IOR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); } else { ICONST(REG_ITMP3, iptr->sx.val.l & 0xffffffff); M_XOR(s1, REG_ITMP3, REG_ITMP1); ICONST(REG_ITMP3, iptr->sx.val.l >> 32); M_XOR(s2, REG_ITMP3, REG_ITMP2); - M_OR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); + M_IOR_TST(REG_ITMP1, REG_ITMP2, REG_ITMP3); } emit_bne(cd, iptr->dst.block); break; @@ -1973,7 +1850,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1_low(jd, iptr, REG_ITMP1); s2 = emit_load_s1_high(jd, iptr, REG_ITMP2); /* if (iptr->sx.val.l == 0) { */ -/* M_OR(s1, s2, REG_ITMP3); */ +/* M_IOR(s1, s2, REG_ITMP3); */ /* M_CMPI(REG_ITMP3, 0); */ /* } else */ @@ -2179,7 +2056,7 @@ nowperformreturn: emit_verbosecall_exit(jd); #if defined(ENABLE_THREADS) - if (checksync && (m->flags & ACC_SYNCHRONIZED)) { + if (checksync && code_is_synchronized(code)) { disp = dseg_add_functionptr(cd, LOCK_monitor_exit); M_ALD(REG_ITMP3, REG_PV, disp); M_MTCTR(REG_ITMP3); @@ -2223,7 +2100,7 @@ nowperformreturn: /* restore return address */ - if (!jd->isleafmethod) { + if (!code_is_leafmethod(code)) { /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD may have a displacement overflow. */ @@ -2358,50 +2235,58 @@ nowperformreturn: } gen_method: - s3 = md->paramcount; + i = md->paramcount; - MCODECHECK((s3 << 1) + 64); + MCODECHECK((i << 1) + 64); - /* copy arguments to registers or stack location */ + /* Copy arguments to registers or stack location. */ - for (s3 = s3 - 1; s3 >= 0; s3--) { - var = VAR(iptr->sx.s23.s2.args[s3]); - d = md->params[s3].regoff; + for (i = i - 1; i >= 0; i--) { + var = VAR(iptr->sx.s23.s2.args[i]); + d = md->params[i].regoff; + + /* Already pre-allocated? */ - /* Already Preallocated? */ if (var->flags & PREALLOC) continue; - if (IS_INT_LNG_TYPE(var->type)) { - if (!md->params[s3].inmemory) { - if (IS_2_WORD_TYPE(var->type)) { - s1 = emit_load(jd, iptr, var, d); - M_LNGMOVE(s1, d); - } - else { - s1 = emit_load(jd, iptr, var, d); - M_INTMOVE(s1, d); - } - } - else { - if (IS_2_WORD_TYPE(var->type)) { - s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED); - M_LST(s1, REG_SP, d); - } - else { - s1 = emit_load(jd, iptr, var, REG_ITMP1); - M_IST(s1, REG_SP, d); - } + if (!md->params[i].inmemory) { + s1 = emit_load(jd, iptr, var, d); + + switch (var->type) { + case TYPE_INT: + case TYPE_ADR: + M_INTMOVE(s1, d); + break; + + case TYPE_LNG: + M_LNGMOVE(s1, d); + break; + + case TYPE_FLT: + case TYPE_DBL: + M_FLTMOVE(s1, d); + break; } } else { - if (!md->params[s3].inmemory) { - s1 = emit_load(jd, iptr, var, d); - M_FLTMOVE(s1, d); - } - else { + switch (var->type) { + case TYPE_INT: + case TYPE_ADR: + s1 = emit_load(jd, iptr, var, REG_ITMP1); + M_IST(s1, REG_SP, d); + break; + + case TYPE_LNG: + s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED); + M_LST(s1, REG_SP, d); + break; + + case TYPE_FLT: + case TYPE_DBL: s1 = emit_load(jd, iptr, var, REG_FTMP1); M_DST(s1, REG_SP, d); + break; } } } @@ -2424,8 +2309,6 @@ gen_method: disp = (s4) (cd->mcodeptr - cd->mcodebase); M_MFLR(REG_ITMP1); M_LDA(REG_PV, REG_ITMP1, -disp); - - emit_exception_check(cd, iptr); break; case ICMD_INVOKESPECIAL: @@ -2488,9 +2371,9 @@ gen_method: } else { s1 = OFFSET(vftbl_t, interfacetable[0]) - - sizeof(methodptr*) * lm->class->index; + sizeof(methodptr*) * lm->clazz->index; - s2 = sizeof(methodptr) * (lm - lm->class->methods); + s2 = sizeof(methodptr) * (lm - lm->clazz->methods); } /* implicit null-pointer check */ @@ -2509,26 +2392,31 @@ gen_method: break; } - /* store return value */ + /* Store return value. */ - d = md->returntype.type; + switch (md->returntype.type) { + case TYPE_INT: + case TYPE_ADR: + s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT); + M_INTMOVE(REG_RESULT, s1); + emit_store_dst(jd, iptr, s1); + break; - if (d != TYPE_VOID) { - if (IS_INT_LNG_TYPE(d)) { - if (IS_2_WORD_TYPE(d)) { - s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT_PACKED); - M_LNGMOVE(REG_RESULT_PACKED, s1); - } - else { - s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT); - M_INTMOVE(REG_RESULT, s1); - } - } - else { - s1 = codegen_reg_of_dst(jd, iptr, REG_FRESULT); - M_FLTMOVE(REG_FRESULT, s1); - } + case TYPE_LNG: + s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT_PACKED); + M_LNGMOVE(REG_RESULT_PACKED, s1); emit_store_dst(jd, iptr, s1); + break; + + case TYPE_FLT: + case TYPE_DBL: + s1 = codegen_reg_of_dst(jd, iptr, REG_FRESULT); + M_FLTMOVE(REG_FRESULT, s1); + emit_store_dst(jd, iptr, s1); + break; + + case TYPE_VOID: + break; } break; @@ -2569,7 +2457,7 @@ gen_method: disp); M_ILD(REG_ITMP2, REG_PV, disp); - M_AND_IMM(REG_ITMP2, ACC_INTERFACE, REG_ITMP2); + M_IAND_IMM(REG_ITMP2, ACC_INTERFACE, REG_ITMP2); emit_label_beq(cd, BRANCH_LABEL_2); } @@ -2730,7 +2618,7 @@ gen_method: iptr->sx.s23.s3.c.ref, disp); M_ILD(REG_ITMP3, REG_PV, disp); - M_AND_IMM(REG_ITMP3, ACC_INTERFACE, REG_ITMP3); + M_IAND_IMM(REG_ITMP3, ACC_INTERFACE, REG_ITMP3); emit_label_beq(cd, BRANCH_LABEL_2); } @@ -2887,8 +2775,6 @@ gen_method: } /* if (bptr -> flags >= BBREACHED) */ } /* for basic block */ - dseg_createlinenumbertable(cd); - /* generate traps */ emit_patcher_traps(jd); @@ -2899,238 +2785,28 @@ gen_method: } -/* codegen_emit_stub_compiler ************************************************** - - Emits a stub routine which calls the compiler. - -*******************************************************************************/ - -void codegen_emit_stub_compiler(jitdata *jd) -{ - methodinfo *m; - codegendata *cd; - - /* get required compiler data */ - - m = jd->m; - cd = jd->cd; - - /* code for the stub */ - - M_ALD_INTERN(REG_ITMP1, REG_PV, -2 * SIZEOF_VOID_P); - M_ALD_INTERN(REG_PV, REG_PV, -3 * SIZEOF_VOID_P); - M_MTCTR(REG_PV); - M_RTS; -} - - -/* codegen_emit_stub_builtin *************************************************** - - Creates a stub routine which calls a builtin function. - -*******************************************************************************/ - -void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte) -{ - codeinfo *code; - codegendata *cd; - methoddesc *md; - int i; - int s1; - int disp; - - /* get required compiler data */ - - code = jd->code; - cd = jd->cd; - - md = bte->md; - - /* calculate stackframe size */ - - cd->stackframesize = - sizeof(stackframeinfo) / SIZEOF_VOID_P + - 2 + /* 4 stackframeinfo arguments (darwin)*/ - md->paramcount; - - /* Keep stack 16-byte aligned. */ - - ALIGN_2(cd->stackframesize); - - /* create method header */ - - (void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */ - (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */ - (void) dseg_add_unique_s4(cd, 0); /* IsSync */ - (void) dseg_add_unique_s4(cd, 0); /* IsLeaf */ - (void) dseg_add_unique_s4(cd, 0); /* IntSave */ - (void) dseg_add_unique_s4(cd, 0); /* FltSave */ - (void) dseg_addlinenumbertablesize(cd); - (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */ - - /* generate code */ - - M_MFLR(REG_ZERO); - M_AST_INTERN(REG_ZERO, REG_SP, LA_LR_OFFSET); - M_STWU(REG_SP, REG_SP, -(cd->stackframesize * 8)); - -#if defined(ENABLE_GC_CACAO) - /* Save callee saved integer registers in stackframeinfo (GC may - need to recover them during a collection). */ - - disp = cd->stackframesize * 8 - sizeof(stackframeinfo) + - OFFSET(stackframeinfo, intregs); - - for (i = 0; i < INT_SAV_CNT; i++) - M_AST(abi_registers_integer_saved[i], REG_SP, disp + i * 4); -#endif - - /* Save integer and float argument registers. */ - - for (i = 0; i < md->paramcount; i++) { - if (!md->params[i].inmemory) { - s1 = md->params[i].regoff; - - switch (md->paramtypes[i].type) { - case TYPE_INT: - case TYPE_ADR: - M_IST(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - case TYPE_LNG: - M_LST(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - case TYPE_FLT: - case TYPE_DBL: - M_DST(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - } - } - } - - /* create dynamic stack info */ - - M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A0); - M_MOV(REG_PV, REG_A1); - M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A2); - M_ALD(REG_A3, REG_SP, cd->stackframesize * 8 + LA_LR_OFFSET); - disp = dseg_add_functionptr(cd, codegen_stub_builtin_enter); - M_ALD(REG_ITMP1, REG_PV, disp); - M_MTCTR(REG_ITMP1); - M_JSR; - - /* Restore integer and float argument registers. */ - - for (i = 0; i < md->paramcount; i++) { - if (!md->params[i].inmemory) { - s1 = md->params[i].regoff; - - switch (md->paramtypes[i].type) { - case TYPE_INT: - case TYPE_ADR: - M_ILD(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - case TYPE_LNG: - M_LLD(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - case TYPE_FLT: - case TYPE_DBL: - M_DLD(s1, REG_SP, LA_SIZE + 4*4 + i * 8); - break; - } - } - } - - /* call the builtin function */ - - disp = dseg_add_functionptr(cd, bte->fp); - M_ALD(REG_ITMP3, REG_PV, disp); - M_MTCTR(REG_ITMP3); - M_JSR; - - /* save return value */ - - switch (md->returntype.type) { - case TYPE_INT: - case TYPE_ADR: - M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_LNG: - M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_FLT: - case TYPE_DBL: - M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_VOID: - break; - } - - /* remove native stackframe info */ - - M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A0); - disp = dseg_add_functionptr(cd, codegen_stub_builtin_exit); - M_ALD(REG_ITMP1, REG_PV, disp); - M_MTCTR(REG_ITMP1); - M_JSR; - - /* restore return value */ - - switch (md->returntype.type) { - case TYPE_INT: - case TYPE_ADR: - M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_LNG: - M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_FLT: - case TYPE_DBL: - M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); - break; - case TYPE_VOID: - break; - } - -#if defined(ENABLE_GC_CACAO) - /* Restore callee saved integer registers from stackframeinfo (GC - might have modified them during a collection). */ - - disp = cd->stackframesize * 8 - sizeof(stackframeinfo) + - OFFSET(stackframeinfo, intregs); - - for (i = 0; i < INT_SAV_CNT; i++) - M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 4); -#endif - - /* remove stackframe */ - - M_ALD(REG_ITMP2_XPC, REG_SP, cd->stackframesize * 8 + LA_LR_OFFSET); - M_MTLR(REG_ITMP2_XPC); - M_LDA(REG_SP, REG_SP, cd->stackframesize * 8); - - M_RET; -} - - /* codegen_emit_stub_native **************************************************** Emits a stub routine which calls a native method. *******************************************************************************/ -void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) +void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int skipparams) { methodinfo *m; codeinfo *code; codegendata *cd; methoddesc *md; - s4 nativeparams; s4 i, j; /* count variables */ s4 t; - s4 s1, s2, disp; - s4 funcdisp; + s4 s1, s2; + int disp; - /* get required compiler data */ + /* Sanity check. */ + + assert(f != NULL); + + /* Get required compiler data. */ m = jd->m; code = jd->code; @@ -3139,14 +2815,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) /* set some variables */ md = m->parseddesc; - nativeparams = (m->flags & ACC_STATIC) ? 2 : 1; /* calculate stackframe size */ cd->stackframesize = - sizeof(stackframeinfo) / SIZEOF_VOID_P + + sizeof(stackframeinfo_t) / SIZEOF_VOID_P + sizeof(localref_table) / SIZEOF_VOID_P + - 4 + /* 4 stackframeinfo arguments (darwin)*/ + 4 + /* 4 stackframeinfo arguments (darwin) */ nmd->paramcount + nmd->memuse; @@ -3162,8 +2837,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) (void) dseg_add_unique_s4(cd, 0); /* IsLeaf */ (void) dseg_add_unique_s4(cd, 0); /* IntSave */ (void) dseg_add_unique_s4(cd, 0); /* FltSave */ - (void) dseg_addlinenumbertablesize(cd); - (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */ /* generate code */ @@ -3171,25 +2844,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) M_AST_INTERN(REG_ZERO, REG_SP, LA_LR_OFFSET); M_STWU(REG_SP, REG_SP, -(cd->stackframesize * 8)); - /* get function address (this must happen before the stackframeinfo) */ - - funcdisp = dseg_add_functionptr(cd, f); - -#if !defined(WITH_STATIC_CLASSPATH) - if (f == NULL) - patcher_add_patch_ref(jd, PATCHER_resolve_native_function, m, funcdisp); -#endif - - /* emit trace code */ - - emit_verbosecall_enter(jd); - #if defined(ENABLE_GC_CACAO) /* Save callee saved integer registers in stackframeinfo (GC may need to recover them during a collection). */ - disp = cd->stackframesize * 8 - sizeof(stackframeinfo) + - OFFSET(stackframeinfo, intregs); + disp = cd->stackframesize * 8 - sizeof(stackframeinfo_t) + + OFFSET(stackframeinfo_t, intregs); for (i = 0; i < INT_SAV_CNT; i++) M_AST(abi_registers_integer_saved[i], REG_SP, disp + i * 4); @@ -3226,6 +2886,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) M_MTCTR(REG_ITMP1); M_JSR; + /* remember class argument */ + + if (m->flags & ACC_STATIC) + M_MOV(REG_RESULT, REG_ITMP3); + /* restore integer and float argument registers */ for (i = 0; i < md->paramcount; i++) { @@ -3250,93 +2915,99 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) /* copy or spill arguments to new locations */ - for (i = md->paramcount - 1, j = i + nativeparams; i >= 0; i--, j--) { + for (i = md->paramcount - 1, j = i + skipparams; i >= 0; i--, j--) { t = md->paramtypes[i].type; - if (IS_INT_LNG_TYPE(t)) { - if (!md->params[i].inmemory) { - s1 = md->params[i].regoff; - s2 = nmd->params[j].regoff; + if (!md->params[i].inmemory) { + s1 = md->params[i].regoff; + s2 = nmd->params[j].regoff; - if (!nmd->params[j].inmemory) { - if (IS_2_WORD_TYPE(t)) - M_LNGMOVE(s1, s2); - else - M_INTMOVE(s1, s2); - } - else { - if (IS_2_WORD_TYPE(t)) - M_LST(s1, REG_SP, s2); - else - M_IST(s1, REG_SP, s2); - } - } - else { - s1 = md->params[i].regoff + cd->stackframesize * 8; - s2 = nmd->params[j].regoff; + switch (t) { + case TYPE_INT: + case TYPE_ADR: + if (!nmd->params[j].inmemory) + M_INTMOVE(s1, s2); + else + M_IST(s1, REG_SP, s2); + break; - M_ILD(REG_ITMP1, REG_SP, s1); - if (IS_2_WORD_TYPE(t)) - M_ILD(REG_ITMP2, REG_SP, s1 + 4); + case TYPE_LNG: + if (!nmd->params[j].inmemory) + M_LNGMOVE(s1, s2); + else + M_LST(s1, REG_SP, s2); + break; - M_IST(REG_ITMP1, REG_SP, s2); - if (IS_2_WORD_TYPE(t)) - M_IST(REG_ITMP2, REG_SP, s2 + 4); + case TYPE_FLT: + case TYPE_DBL: + /* We only copy spilled float arguments, as the float + argument registers keep unchanged. */ + break; } } else { - /* We only copy spilled float arguments, as the float - argument registers keep unchanged. */ + s1 = md->params[i].regoff + cd->stackframesize * 8; + s2 = nmd->params[j].regoff; - if (md->params[i].inmemory) { - s1 = md->params[i].regoff + cd->stackframesize * 8; - s2 = nmd->params[j].regoff; + switch (t) { + case TYPE_INT: + case TYPE_ADR: + M_ILD(REG_ITMP1, REG_SP, s1); + M_IST(REG_ITMP1, REG_SP, s2); + break; + + case TYPE_LNG: + M_LLD(REG_ITMP12_PACKED, REG_SP, s1); + M_LST(REG_ITMP12_PACKED, REG_SP, s2); + break; + case TYPE_FLT: M_DLD(REG_FTMP1, REG_SP, s1); + M_FST(REG_FTMP1, REG_SP, s2); + break; - if (IS_2_WORD_TYPE(t)) - M_DST(REG_FTMP1, REG_SP, s2); - else - M_FST(REG_FTMP1, REG_SP, s2); + case TYPE_DBL: + M_DLD(REG_FTMP1, REG_SP, s1); + M_DST(REG_FTMP1, REG_SP, s2); + break; } } } - /* put class into second argument register */ + /* Handle native Java methods. */ - if (m->flags & ACC_STATIC) { - disp = dseg_add_address(cd, m->class); - M_ALD(REG_A1, REG_PV, disp); - } + if (m->flags & ACC_NATIVE) { + /* put class into second argument register */ - /* put env into first argument register */ + if (m->flags & ACC_STATIC) + M_MOV(REG_ITMP3, REG_A1); - disp = dseg_add_address(cd, _Jv_env); - M_ALD(REG_A0, REG_PV, disp); + /* put env into first argument register */ - /* generate the actual native call */ + disp = dseg_add_address(cd, _Jv_env); + M_ALD(REG_A0, REG_PV, disp); + } + + /* Call the native function. */ - M_ALD(REG_ITMP3, REG_PV, funcdisp); + disp = dseg_add_functionptr(cd, f); + M_ALD(REG_ITMP3, REG_PV, disp); M_MTCTR(REG_ITMP3); M_JSR; - /* print call trace */ - - emit_verbosecall_exit(jd); - /* save return value */ switch (md->returntype.type) { case TYPE_INT: case TYPE_ADR: - M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 8); + M_IST(REG_RESULT, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_LNG: - M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8); + M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_FLT: case TYPE_DBL: - M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); + M_DST(REG_FRESULT, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_VOID: break; @@ -3344,7 +3015,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) /* remove native stackframe info */ - M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A0); + M_MOV(REG_SP, REG_A0); + M_MOV(REG_PV, REG_A1); disp = dseg_add_functionptr(cd, codegen_finish_native_call); M_ALD(REG_ITMP1, REG_PV, disp); M_MTCTR(REG_ITMP1); @@ -3356,14 +3028,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) switch (md->returntype.type) { case TYPE_INT: case TYPE_ADR: - M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 8); + M_ILD(REG_RESULT, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_LNG: - M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8); + M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_FLT: case TYPE_DBL: - M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); + M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 2 * 4); break; case TYPE_VOID: break; @@ -3373,8 +3045,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) /* Restore callee saved integer registers from stackframeinfo (GC might have modified them during a collection). */ - disp = cd->stackframesize * 8 - sizeof(stackframeinfo) + - OFFSET(stackframeinfo, intregs); + disp = cd->stackframesize * 8 - sizeof(stackframeinfo_t) + + OFFSET(stackframeinfo_t, intregs); for (i = 0; i < INT_SAV_CNT; i++) M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 4); @@ -3399,10 +3071,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) M_ALD(REG_ITMP3, REG_PV, disp); M_MTCTR(REG_ITMP3); M_RTS; - - /* generate patcher traps */ - - emit_patcher_traps(jd); }