X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fx86_64%2Fcodegen.c;h=de2ceaed1f96ddeeeee41eb17cfb0b33a074e51f;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=382aca99a58c627977e5fb6c632c55ff9195480f;hpb=6742bfb5845cc9c7932291620b4e8c90b67b1878;p=cacao.git diff --git a/src/vm/jit/x86_64/codegen.c b/src/vm/jit/x86_64/codegen.c index 382aca99a..de2ceaed1 100644 --- a/src/vm/jit/x86_64/codegen.c +++ b/src/vm/jit/x86_64/codegen.c @@ -22,8 +22,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: codegen.c 7754 2007-04-17 23:18:15Z twisti $ - */ @@ -41,12 +39,12 @@ #include "vm/jit/x86_64/emit.h" #include "mm/memory.h" + #include "native/jni.h" +#include "native/localref.h" #include "native/native.h" -#if defined(ENABLE_THREADS) -# include "threads/native/lock.h" -#endif +#include "threads/lock-common.h" #include "vm/builtin.h" #include "vm/exceptions.h" @@ -235,14 +233,14 @@ bool codegen_emit(jitdata *jd) if (!IS_INMEMORY(var->flags)) M_INTMOVE(s1, var->vv.regoff); else - M_LST(s1, REG_SP, var->vv.regoff * 8); + M_LST(s1, REG_SP, var->vv.regoff); } else { /* stack arguments */ if (!IS_INMEMORY(var->flags)) /* + 8 for return address */ - M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8 + 8); + M_LLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1 + 8); else - var->vv.regoff = cd->stackframesize + s1 + 1; + var->vv.regoff = cd->stackframesize * 8 + s1 + 8; } } else { /* floating args */ @@ -250,13 +248,13 @@ bool codegen_emit(jitdata *jd) if (!IS_INMEMORY(var->flags)) M_FLTMOVE(s1, var->vv.regoff); else - M_DST(s1, REG_SP, var->vv.regoff * 8); + M_DST(s1, REG_SP, var->vv.regoff); } else { /* stack arguments */ if (!IS_INMEMORY(var->flags)) - M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8 + 8); + M_DLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1 + 8); else - var->vv.regoff = cd->stackframesize + s1 + 1; + var->vv.regoff = cd->stackframesize * 8 + s1 + 8; } } } @@ -1501,7 +1499,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ - M_ILD(d, s1, OFFSET(java_arrayheader, size)); + M_ILD(d, s1, OFFSET(java_array_t, size)); emit_store_dst(jd, iptr, d); break; @@ -1512,7 +1510,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movsbq_memindex_reg(cd, OFFSET(java_bytearray, data[0]), s1, s2, 0, d); + emit_movsbq_memindex_reg(cd, OFFSET(java_bytearray_t, data[0]), s1, s2, 0, d); emit_store_dst(jd, iptr, d); break; @@ -1523,7 +1521,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movzwq_memindex_reg(cd, OFFSET(java_chararray, data[0]), s1, s2, 1, d); + emit_movzwq_memindex_reg(cd, OFFSET(java_chararray_t, data[0]), s1, s2, 1, d); emit_store_dst(jd, iptr, d); break; @@ -1534,7 +1532,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movswq_memindex_reg(cd, OFFSET(java_shortarray, data[0]), s1, s2, 1, d); + emit_movswq_memindex_reg(cd, OFFSET(java_shortarray_t, data[0]), s1, s2, 1, d); emit_store_dst(jd, iptr, d); break; @@ -1545,7 +1543,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movl_memindex_reg(cd, OFFSET(java_intarray, data[0]), s1, s2, 2, d); + emit_movl_memindex_reg(cd, OFFSET(java_intarray_t, data[0]), s1, s2, 2, d); emit_store_dst(jd, iptr, d); break; @@ -1556,7 +1554,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_mov_memindex_reg(cd, OFFSET(java_longarray, data[0]), s1, s2, 3, d); + emit_mov_memindex_reg(cd, OFFSET(java_longarray_t, data[0]), s1, s2, 3, d); emit_store_dst(jd, iptr, d); break; @@ -1567,7 +1565,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_FTMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movss_memindex_reg(cd, OFFSET(java_floatarray, data[0]), s1, s2, 2, d); + emit_movss_memindex_reg(cd, OFFSET(java_floatarray_t, data[0]), s1, s2, 2, d); emit_store_dst(jd, iptr, d); break; @@ -1578,7 +1576,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_FTMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movsd_memindex_reg(cd, OFFSET(java_doublearray, data[0]), s1, s2, 3, d); + emit_movsd_memindex_reg(cd, OFFSET(java_doublearray_t, data[0]), s1, s2, 3, d); emit_store_dst(jd, iptr, d); break; @@ -1589,7 +1587,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_ITMP3); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_mov_memindex_reg(cd, OFFSET(java_objectarray, data[0]), s1, s2, 3, d); + emit_mov_memindex_reg(cd, OFFSET(java_objectarray_t, data[0]), s1, s2, 3, d); emit_store_dst(jd, iptr, d); break; @@ -1601,7 +1599,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_movb_reg_memindex(cd, s3, OFFSET(java_bytearray, data[0]), s1, s2, 0); + emit_movb_reg_memindex(cd, s3, OFFSET(java_bytearray_t, data[0]), s1, s2, 0); break; case ICMD_CASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1611,7 +1609,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_movw_reg_memindex(cd, s3, OFFSET(java_chararray, data[0]), s1, s2, 1); + emit_movw_reg_memindex(cd, s3, OFFSET(java_chararray_t, data[0]), s1, s2, 1); break; case ICMD_SASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1621,7 +1619,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_movw_reg_memindex(cd, s3, OFFSET(java_shortarray, data[0]), s1, s2, 1); + emit_movw_reg_memindex(cd, s3, OFFSET(java_shortarray_t, data[0]), s1, s2, 1); break; case ICMD_IASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1631,7 +1629,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_movl_reg_memindex(cd, s3, OFFSET(java_intarray, data[0]), s1, s2, 2); + emit_movl_reg_memindex(cd, s3, OFFSET(java_intarray_t, data[0]), s1, s2, 2); break; case ICMD_LASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1641,7 +1639,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_mov_reg_memindex(cd, s3, OFFSET(java_longarray, data[0]), s1, s2, 3); + emit_mov_reg_memindex(cd, s3, OFFSET(java_longarray_t, data[0]), s1, s2, 3); break; case ICMD_FASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1651,7 +1649,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_FTMP3); - emit_movss_reg_memindex(cd, s3, OFFSET(java_floatarray, data[0]), s1, s2, 2); + emit_movss_reg_memindex(cd, s3, OFFSET(java_floatarray_t, data[0]), s1, s2, 2); break; case ICMD_DASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1661,7 +1659,7 @@ bool codegen_emit(jitdata *jd) /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_FTMP3); - emit_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray, data[0]), s1, s2, 3); + emit_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray_t, data[0]), s1, s2, 3); break; case ICMD_AASTORE: /* ..., arrayref, index, value ==> ... */ @@ -1681,7 +1679,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); - emit_mov_reg_memindex(cd, s3, OFFSET(java_objectarray, data[0]), s1, s2, 3); + emit_mov_reg_memindex(cd, s3, OFFSET(java_objectarray_t, data[0]), s1, s2, 3); break; @@ -1691,7 +1689,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_ITMP2); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movb_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_bytearray, data[0]), s1, s2, 0); + emit_movb_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_bytearray_t, data[0]), s1, s2, 0); break; case ICMD_CASTORECONST: /* ..., arrayref, index ==> ... */ @@ -1700,7 +1698,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_ITMP2); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_chararray, data[0]), s1, s2, 1); + emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_chararray_t, data[0]), s1, s2, 1); break; case ICMD_SASTORECONST: /* ..., arrayref, index ==> ... */ @@ -1709,7 +1707,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_ITMP2); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_shortarray, data[0]), s1, s2, 1); + emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_shortarray_t, data[0]), s1, s2, 1); break; case ICMD_IASTORECONST: /* ..., arrayref, index ==> ... */ @@ -1718,7 +1716,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_ITMP2); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_movl_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_intarray, data[0]), s1, s2, 2); + emit_movl_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_intarray_t, data[0]), s1, s2, 2); break; case ICMD_LASTORECONST: /* ..., arrayref, index ==> ... */ @@ -1729,11 +1727,11 @@ bool codegen_emit(jitdata *jd) emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); if (IS_IMM32(iptr->sx.s23.s3.constval)) { - emit_mov_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3); + emit_mov_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray_t, data[0]), s1, s2, 3); } else { - emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3); - emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval >> 32), OFFSET(java_longarray, data[0]) + 4, s1, s2, 3); + emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray_t, data[0]), s1, s2, 3); + emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval >> 32), OFFSET(java_longarray_t, data[0]) + 4, s1, s2, 3); } break; @@ -1743,7 +1741,7 @@ bool codegen_emit(jitdata *jd) s2 = emit_load_s2(jd, iptr, REG_ITMP2); /* implicit null-pointer check */ emit_arrayindexoutofbounds_check(cd, iptr, s1, s2); - emit_mov_imm_memindex(cd, 0, OFFSET(java_objectarray, data[0]), s1, s2, 3); + emit_mov_imm_memindex(cd, 0, OFFSET(java_objectarray_t, data[0]), s1, s2, 3); break; @@ -1769,7 +1767,7 @@ bool codegen_emit(jitdata *jd) else { fi = iptr->sx.s23.s3.fmiref->p.field; fieldtype = fi->type; - disp = dseg_add_address(cd, &(fi->value)); + disp = dseg_add_address(cd, fi->value); disp = disp + -((cd->mcodeptr + 7) - cd->mcodebase); if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) { @@ -1833,7 +1831,7 @@ bool codegen_emit(jitdata *jd) else { fi = iptr->sx.s23.s3.fmiref->p.field; fieldtype = fi->type; - disp = dseg_add_address(cd, &(fi->value)); + disp = dseg_add_address(cd, fi->value); disp = disp + -((cd->mcodeptr + 7) - cd->mcodebase); if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) { @@ -1898,7 +1896,7 @@ bool codegen_emit(jitdata *jd) else { fi = iptr->sx.s23.s3.fmiref->p.field; fieldtype = fi->type; - disp = dseg_add_address(cd, &(fi->value)); + disp = dseg_add_address(cd, fi->value); disp = disp + -((cd->mcodeptr + 7) - cd->mcodebase); if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) { @@ -2393,7 +2391,7 @@ gen_method: } else { s1 = emit_load(jd, iptr, var, REG_ITMP1); - M_LST(s1, REG_SP, d * 8); + M_LST(s1, REG_SP, d); } } else { @@ -2405,9 +2403,9 @@ gen_method: s1 = emit_load(jd, iptr, var, REG_FTMP1); if (IS_2_WORD_TYPE(var->type)) - M_DST(s1, REG_SP, d * 8); + M_DST(s1, REG_SP, d); else - M_FST(s1, REG_SP, d * 8); + M_FST(s1, REG_SP, d); } } } @@ -2467,7 +2465,7 @@ gen_method: } /* implicit null-pointer check */ - M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_object_t, vftbl)); M_ALD32(REG_ITMP3, REG_METHODPTR, s1); M_CALL(REG_ITMP3); break; @@ -2487,7 +2485,7 @@ gen_method: } /* implicit null-pointer check */ - M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_object_t, vftbl)); M_ALD32(REG_METHODPTR, REG_METHODPTR, s1); M_ALD32(REG_ITMP3, REG_METHODPTR, s2); M_CALL(REG_ITMP3); @@ -2545,9 +2543,9 @@ gen_method: supervftbl = super->vftbl; } -#if defined(ENABLE_THREADS) - codegen_threadcritrestart(cd, cd->mcodeptr - cd->mcodebase); -#endif + if ((super == NULL) || !(super->flags & ACC_INTERFACE)) + CODEGEN_CRITICAL_SECTION_NEW; + s1 = emit_load_s1(jd, iptr, REG_ITMP1); /* if class is not resolved, check which code to call */ @@ -2572,7 +2570,7 @@ gen_method: emit_label_beq(cd, BRANCH_LABEL_3); } - M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_ITMP2, s1, OFFSET(java_object_t, vftbl)); if (super == NULL) { codegen_add_patch_ref(cd, PATCHER_checkcast_interface, @@ -2608,7 +2606,7 @@ gen_method: emit_label_beq(cd, BRANCH_LABEL_5); } - M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_ITMP2, s1, OFFSET(java_object_t, vftbl)); if (super == NULL) { codegen_add_patch_ref(cd, PATCHER_checkcast_class, @@ -2617,9 +2615,9 @@ gen_method: } M_MOV_IMM(supervftbl, REG_ITMP3); -#if defined(ENABLE_THREADS) - codegen_threadcritstart(cd, cd->mcodeptr - cd->mcodebase); -#endif + + CODEGEN_CRITICAL_SECTION_START; + M_ILD32(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval)); /* if (s1 != REG_ITMP1) { */ @@ -2641,9 +2639,9 @@ gen_method: M_MOV_IMM(supervftbl, REG_ITMP3); M_ILD(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, diffval)); /* } */ -#if defined(ENABLE_THREADS) - codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase); -#endif + + CODEGEN_CRITICAL_SECTION_END; + M_ICMP(REG_ITMP3, REG_ITMP2); emit_classcast_check(cd, iptr, BRANCH_UGT, REG_ITMP3, s1); @@ -2696,16 +2694,15 @@ gen_method: super = NULL; superindex = 0; supervftbl = NULL; - - } else { + } + else { super = iptr->sx.s23.s3.c.cls; superindex = super->index; supervftbl = super->vftbl; } -#if defined(ENABLE_THREADS) - codegen_threadcritrestart(cd, cd->mcodeptr - cd->mcodebase); -#endif + if ((super == NULL) || !(super->flags & ACC_INTERFACE)) + CODEGEN_CRITICAL_SECTION_NEW; s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); @@ -2739,7 +2736,7 @@ gen_method: emit_label_beq(cd, BRANCH_LABEL_3); } - M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl)); if (super == NULL) { codegen_add_patch_ref(cd, PATCHER_instanceof_interface, @@ -2776,7 +2773,7 @@ gen_method: emit_label_beq(cd, BRANCH_LABEL_5); } - M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl)); + M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl)); if (super == NULL) { codegen_add_patch_ref(cd, PATCHER_instanceof_class, @@ -2785,17 +2782,13 @@ gen_method: M_MOV_IMM(supervftbl, REG_ITMP2); -#if defined(ENABLE_THREADS) - codegen_threadcritstart(cd, cd->mcodeptr - cd->mcodebase); -#endif + CODEGEN_CRITICAL_SECTION_START; M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl_t, baseval)); M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, diffval)); M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval)); -#if defined(ENABLE_THREADS) - codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase); -#endif + CODEGEN_CRITICAL_SECTION_END; M_ISUB(REG_ITMP2, REG_ITMP1); M_CLR(d); /* may be REG_ITMP2 */ @@ -2893,7 +2886,6 @@ gen_method: /* generate stubs */ emit_patcher_stubs(jd); - REPLACEMENT_EMIT_STUBS(jd); /* everything's ok */ @@ -3070,12 +3062,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) if (!nmd->params[j].inmemory) M_INTMOVE(s1, s2); else - M_LST(s1, REG_SP, s2 * 8); + M_LST(s1, REG_SP, s2); } else { - s1 = md->params[i].regoff + cd->stackframesize + 1;/* +1 (RA) */ - M_LLD(REG_ITMP1, REG_SP, s1 * 8); - M_LST(REG_ITMP1, REG_SP, s2 * 8); + s1 = md->params[i].regoff + cd->stackframesize * 8 + 8;/* +1 (RA) */ + M_LLD(REG_ITMP1, REG_SP, s1); + M_LST(REG_ITMP1, REG_SP, s2); } } else { @@ -3083,15 +3075,15 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f) argument registers keep unchanged. */ if (md->params[i].inmemory) { - s1 = md->params[i].regoff + cd->stackframesize + 1;/* +1 (RA) */ + s1 = md->params[i].regoff + cd->stackframesize * 8 + 8;/* +1 (RA) */ if (IS_2_WORD_TYPE(t)) { - M_DLD(REG_FTMP1, REG_SP, s1 * 8); - M_DST(REG_FTMP1, REG_SP, s2 * 8); + M_DLD(REG_FTMP1, REG_SP, s1); + M_DST(REG_FTMP1, REG_SP, s2); } else { - M_FLD(REG_FTMP1, REG_SP, s1 * 8); - M_FST(REG_FTMP1, REG_SP, s2 * 8); + M_FLD(REG_FTMP1, REG_SP, s1); + M_FST(REG_FTMP1, REG_SP, s2); } } }