* src/vm/jit/powerpc64/linux/md-abi.h: New REG_TOC name needed to
[cacao.git] / src / vm / jit / powerpc64 / codegen.c
index 5346b163656eb761a5db9dd8a261654d60982331..5b5b3903bc9223dfa834b522b084bac6e1765060 100644 (file)
@@ -31,7 +31,7 @@
             Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 5248 2006-08-17 17:51:40Z tbfg $
+   $Id: codegen.c 5282 2006-08-28 19:31:37Z tbfg $
 
 */
 
@@ -227,6 +227,7 @@ bool codegen(jitdata *jd)
                                s2 = rd->argintregs[s1];
                        if (!md->params[p].inmemory) {           /* register arguments    */
                                if (!(var->flags & INMEMORY)) {      /* reg arg -> register   */
+                                       M_NOP;
                                        if (IS_2_WORD_TYPE(t))          /* FIXME, only M_INTMOVE here */
                                                M_LNGMOVE(s2, var->regoff);
                                        else
@@ -446,7 +447,7 @@ bool codegen(jitdata *jd)
                src = bptr->instack;
                len = bptr->icount;
                currentline = 0;
-
+                       
                for (iptr = bptr->iinstr; len > 0; src = iptr->dst, len--, iptr++) {
                        if (iptr->line != currentline) {
                                dseg_addlinenumber(cd, iptr->line);
@@ -455,6 +456,7 @@ bool codegen(jitdata *jd)
 
                        MCODECHECK(64);   /* an instruction usually needs < 64 words      */
 
+                       M_NOP; M_NOP; /* XXX */
                        switch (iptr->opc) {
                        case ICMD_NOP:    /* ...  ==> ...                                 */
                        case ICMD_INLINE_START:
@@ -527,7 +529,6 @@ bool codegen(jitdata *jd)
                /* load/store operations **********************************************/
 
                case ICMD_ILOAD:      /* ...  ==> ..., content of local variable      */
-               case ICMD_ALOAD:      /* op1 = local variable                         */
 
                        var = &(rd->locals[iptr->op1][iptr->opc - ICMD_ILOAD]);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
@@ -541,6 +542,7 @@ bool codegen(jitdata *jd)
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
+               case ICMD_ALOAD:      /* op1 = local variable                         */
                case ICMD_LLOAD:      /* ...  ==> ..., content of local variable      */
                                      /* op1 = local variable                         */
 
@@ -1947,7 +1949,7 @@ bool codegen(jitdata *jd)
                                M_IST_INTERN(s2, REG_ITMP1, 0);
                                break;
                        case TYPE_LNG:
-                               s2 = emit_load_s2(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP3));
+                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
                                M_LST_INTERN(s2, REG_ITMP1, 0);
                                break;
                        case TYPE_ADR:
@@ -2017,11 +2019,7 @@ bool codegen(jitdata *jd)
                        gen_nullptr_check(s1);
 
                        if (!IS_FLT_DBL_TYPE(iptr->op1)) {
-                               if (IS_2_WORD_TYPE(iptr->op1)) {
-                                       s2 = emit_load_s2(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP3));
-                               } else {
-                                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
-                               }
+                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
                        } else {
                                s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
                        }
@@ -2044,8 +2042,7 @@ bool codegen(jitdata *jd)
                                M_IST(s2, s1, disp);
                                break;
                        case TYPE_LNG:
-                               M_IST(GET_LOW_REG(s2), s1, disp + 4);      /* keep this order */
-                               M_IST(GET_HIGH_REG(s2), s1, disp);         /* keep this order */
+                               M_LST(s2, s1, disp);
                                break;
                        case TYPE_ADR:
                                M_AST(s2, s1, disp);
@@ -2065,7 +2062,7 @@ bool codegen(jitdata *jd)
                case ICMD_ATHROW:       /* ..., objectref ==> ... (, objectref)       */
 
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
-                       M_INTMOVE(s1, REG_ITMP1_XPTR);
+                       M_LNGMOVE(s1, REG_ITMP1_XPTR);
 
 #ifdef ENABLE_VERIFIER
                        if (iptr->val.a) {
@@ -2495,16 +2492,17 @@ bool codegen(jitdata *jd)
                        codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
+               case ICMD_LRETURN:      /* ..., retvalue ==> ...                      */
                case ICMD_IRETURN:      /* ..., retvalue ==> ...                      */
 
                        s1 = emit_load_s1(jd, iptr, src, REG_RESULT);
-                       M_INTMOVE(s1, REG_RESULT);
+                       M_LNGMOVE(s1, REG_RESULT);
                        goto nowperformreturn;
 
                case ICMD_ARETURN:      /* ..., retvalue ==> ...                      */
 
                        s1 = emit_load_s1(jd, iptr, src, REG_RESULT);
-                       M_INTMOVE(s1, REG_RESULT);
+                       M_LNGMOVE(s1, REG_RESULT);
 
 #ifdef ENABLE_VERIFIER
                        if (iptr->val.a) {
@@ -2515,12 +2513,7 @@ bool codegen(jitdata *jd)
                                        M_NOP;
                        }
 #endif /* ENABLE_VERIFIER */
-                       goto nowperformreturn;
 
-               case ICMD_LRETURN:      /* ..., retvalue ==> ...                      */
-
-                       /*s1 = emit_load_s1(jd, iptr, src, PACK_REGS(REG_RESULT2, REG_RESULT)); FIXME*/
-                       /*M_LNGMOVE(s1, PACK_REGS(REG_RESULT2, REG_RESULT)); FIXME*/
                        goto nowperformreturn;
 
                case ICMD_FRETURN:      /* ..., retvalue ==> ...                      */
@@ -2542,11 +2535,10 @@ nowperformreturn:
 
                        if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) {
                                M_MFLR(REG_ZERO);
-                               M_LDA(REG_SP, REG_SP, -10 * 8);
-                               M_DST(REG_FRESULT, REG_SP, 48+0);
-                               M_IST(REG_RESULT, REG_SP, 48+8);
-                               M_AST(REG_ZERO, REG_SP, 48+12);
-                               /*M_IST(REG_RESULT2, REG_SP, 48+16); FIXME*/
+                               M_LDA(REG_SP, REG_SP, -(LA_SIZE+PA_SIZE+10*8));
+                               M_DST(REG_FRESULT, REG_SP, LA_SIZE+PA_SIZE+0*8);
+                               M_LST(REG_RESULT, REG_SP, LA_SIZE+PA_SIZE+1*8);
+                               M_AST(REG_ZERO, REG_SP, LA_SIZE+PA_SIZE+2*8);
 
                                /* keep this order */
                                switch (iptr->opc) {
@@ -2563,10 +2555,8 @@ nowperformreturn:
 
                                case ICMD_LRETURN:
 #if defined(__DARWIN__)
-                                       /*M_MOV(REG_RESULT2, rd->argintregs[2]); FIXME */
                                        M_MOV(REG_RESULT, rd->argintregs[1]);
 #else
-                                       /*M_MOV(REG_RESULT2, rd->argintregs[3]); FIXME*/
                                        M_MOV(REG_RESULT, rd->argintregs[2]);
 #endif
                                        break;
@@ -2582,11 +2572,10 @@ nowperformreturn:
                                M_MTCTR(REG_ITMP2);
                                M_JSR;
 
-                               M_DLD(REG_FRESULT, REG_SP, 48+0);
-                               M_ILD(REG_RESULT, REG_SP, 48+8);
-                               M_ALD(REG_ZERO, REG_SP, 48+12);
-                               /*M_ILD(REG_RESULT2, REG_SP, 48+16); FIXME*/
-                               M_LDA(REG_SP, REG_SP, 10 * 8);
+                               M_DLD(REG_FRESULT, REG_SP, LA_SIZE+PA_SIZE+0*8);
+                               M_LLD(REG_RESULT, REG_SP, LA_SIZE+PA_SIZE+1*8);
+                               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);
                        }
                        
@@ -2643,23 +2632,23 @@ nowperformreturn:
                                /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
                                   may have a displacement overflow. */
 
-                               M_ALD(REG_ITMP1, REG_SP, p * 4 + LA_LR_OFFSET);
+                               M_ALD(REG_ITMP1, REG_SP, p * 8 + LA_LR_OFFSET);
                                M_MTLR(REG_ITMP1);
                        }
 
                        /* restore saved registers                                        */
 
                        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
-                               p--; M_ILD(rd->savintregs[i], REG_SP, p * 4);
+                               p--; M_ILD(rd->savintregs[i], REG_SP, p * 8);
                        }
                        for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
-                               p -= 2; M_DLD(rd->savfltregs[i], REG_SP, p * 4);
+                               p--; M_DLD(rd->savfltregs[i], REG_SP, p * 8);
                        }
 
                        /* deallocate stack                                               */
 
                        if (stackframesize)
-                               M_LDA(REG_SP, REG_SP, stackframesize * 4);
+                               M_LDA(REG_SP, REG_SP, stackframesize * 8);
 
                        M_RET;
                        ALIGNCODENOP;
@@ -2791,9 +2780,7 @@ gen_method:
                                if (IS_INT_LNG_TYPE(src->type)) {
                                        if (!md->params[s3].inmemory) {
                                                if (IS_2_WORD_TYPE(src->type)) {
-                                                       s1 = PACK_REGS(
-                                                  rd->argintregs[GET_LOW_REG(md->params[s3].regoff)],
-                                                  rd->argintregs[GET_HIGH_REG(md->params[s3].regoff)]);
+                                                       s1 = rd->argintregs[md->params[s3].regoff];     /* removed PACKREGS */
                                                        d = emit_load_s1(jd, iptr, src, s1);
                                                        M_LNGMOVE(d, s1);
                                                } else {
@@ -2804,8 +2791,8 @@ gen_method:
 
                                        } else {
                                                if (IS_2_WORD_TYPE(src->type)) {
-                                                       d = emit_load_s1(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP1));
-                                                       M_LST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       d = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                                                       M_LST(d, REG_SP, md->params[s3].regoff * 4);    /* XXX */
                                                } else {
                                                        d = emit_load_s1(jd, iptr, src, REG_ITMP1);
                                                        M_IST(d, REG_SP, md->params[s3].regoff * 4);
@@ -2833,9 +2820,13 @@ gen_method:
                                disp = dseg_addaddress(cd, bte->fp);
                                d = md->returntype.type;
 
-                               M_ALD(REG_PV, REG_PV, disp);  /* pointer to built-in-function */
-                               M_MTCTR(REG_PV);
+                               M_ALD(REG_PV, REG_PV, disp);    /* pointer to built-in-function descriptor */
+                               M_ALD(REG_ITMP1, REG_PV, 0);    /* function entry point address */
+                               M_ALD(REG_ITMP2, REG_PV, 8);    /* TOC of callee */
+                               M_MOV(REG_TOC, REG_ITMP2);              /* load TOC for callee */
+                               M_MTCTR(REG_ITMP1);
                                M_JSR;
+                               /* TODO: restore TOC */
                                disp = (s4) (cd->mcodeptr - cd->mcodebase);
                                M_MFLR(REG_ITMP1);
                                M_LDA(REG_PV, REG_ITMP1, -disp);
@@ -3462,7 +3453,7 @@ gen_method:
 
                                if (jd->isleafmethod) {
                                        M_MFLR(REG_ZERO);
-                                       M_AST(REG_ZERO, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+                                       M_AST(REG_ZERO, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
                                }
 
                                M_MOV(REG_PV, rd->argintregs[0]);
@@ -3472,26 +3463,26 @@ gen_method:
                                        M_MOV(REG_ZERO, rd->argintregs[2]);
                                else
                                        M_ALD(rd->argintregs[2],
-                                                 REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+                                                 REG_SP, stackframesize * 8 + LA_LR_OFFSET);
 
                                M_MOV(REG_ITMP2_XPC, rd->argintregs[3]);
                                M_MOV(REG_ITMP1, rd->argintregs[4]);
 
-                               M_STDU(REG_SP, REG_SP, -(LA_SIZE + 6 * 4));     /* FIXME, changed from M_STWU, but what about *4 in here? and +6? */
-                               M_AST(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 4);
+                               M_STDU(REG_SP, REG_SP, -(LA_SIZE + 6 * 8));
+                               M_AST(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 8);
 
                                M_MTCTR(REG_ITMP3);
                                M_JSR;
                                M_MOV(REG_RESULT, REG_ITMP1_XPTR);
 
-                               M_ALD(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 4);
-                               M_IADD_IMM(REG_SP, LA_SIZE + 6 * 4, REG_SP);
+                               M_ALD(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 8);
+                               M_LADD_IMM(REG_SP, LA_SIZE + 6 * 8, REG_SP);
 
                                if (jd->isleafmethod) {
                                        /* XXX FIXME: REG_ZERO can cause problems here! */
-                                       assert(stackframesize * 4 <= 32767);
+                                       assert(stackframesize * 8 <= 32767);
 
-                                       M_ALD(REG_ZERO, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+                                       M_ALD(REG_ZERO, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
                                        M_MTLR(REG_ZERO);
                                }
 
@@ -3530,12 +3521,12 @@ gen_method:
 
                        /* create stack frame - keep stack 16-byte aligned */
 
-                       M_AADD_IMM(REG_SP, -8 * 4, REG_SP);
+                       M_AADD_IMM(REG_SP, -8 * 8, REG_SP);
 
                        /* calculate return address and move it onto the stack */
 
                        M_LDA(REG_ITMP3, REG_PV, pref->branchpos);
-                       M_AST_INTERN(REG_ITMP3, REG_SP, 5 * 4);
+                       M_AST_INTERN(REG_ITMP3, REG_SP, 5 * 8);
 
                        /* move pointer to java_objectheader onto stack */
 
@@ -3547,7 +3538,7 @@ gen_method:
                        disp = dseg_addaddress(cd, NULL);                         /* vftbl      */
 
                        M_LDA(REG_ITMP3, REG_PV, disp);
-                       M_AST_INTERN(REG_ITMP3, REG_SP, 4 * 4);
+                       M_AST_INTERN(REG_ITMP3, REG_SP, 4 * 8);
 #else
                        /* do nothing */
 #endif
@@ -3556,25 +3547,25 @@ gen_method:
 
                        disp = dseg_adds4(cd, mcode);
                        M_ILD(REG_ITMP3, REG_PV, disp);
-                       M_IST_INTERN(REG_ITMP3, REG_SP, 3 * 4);
+                       M_IST_INTERN(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_INTERN(REG_ITMP3, REG_SP, 2 * 4);
+                       M_AST_INTERN(REG_ITMP3, REG_SP, 2 * 8);
 
                        /* move data segment displacement onto stack */
 
                        disp = dseg_addaddress(cd, pref->disp);
-                       M_ILD(REG_ITMP3, REG_PV, disp);
-                       M_IST_INTERN(REG_ITMP3, REG_SP, 1 * 4);
+                       M_LLD(REG_ITMP3, REG_PV, disp);
+                       M_IST_INTERN(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_INTERN(REG_ITMP3, REG_SP, 0 * 4);
+                       M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 8);
 
                        disp = dseg_addaddress(cd, asm_patcher_wrapper);
                        M_ALD(REG_ITMP3, REG_PV, disp);
@@ -3940,15 +3931,13 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        if (md->returntype.type != TYPE_VOID) {
                if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               /*M_IST(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4); // FIXME*/
-                       M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+                       M_LST(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
                }
                else {
                        if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+                               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
                        else
-                               M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+                               M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);    /* FIXME, needed ?*/
                }
        }
 
@@ -3959,19 +3948,17 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
                if (md->returntype.type != TYPE_VOID) {
                        if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                               if (IS_2_WORD_TYPE(md->returntype.type))
-                                       /*M_ILD(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4); FIXME*/
-                               M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+                               M_LLD(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
                        }
                        else {
                                if (IS_2_WORD_TYPE(md->returntype.type))
-                                       M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+                                       M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
                                else
-                                       M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+                                       M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);    /* FIXME, needed ? */
                        }
                }
 
-               M_LDA(REG_SP, REG_SP, -(LA_SIZE + (1 + 2 + 2 + 1) * 4));
+               M_LDA(REG_SP, REG_SP, -(LA_SIZE + PA_SIZE + (1 + 1 + 1 + 1) * 8));
 
                /* keep this order */
                switch (md->returntype.type) {
@@ -3988,10 +3975,8 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
                case TYPE_LNG:
 #if defined(__DARWIN__)
-                       /*M_MOV(REG_RESULT2, rd->argintregs[2]);FIXME*/
                        M_MOV(REG_RESULT, rd->argintregs[1]);
 #else
-                       /*M_MOV(REG_RESULT2, rd->argintregs[3]);FIXME*/
                        M_MOV(REG_RESULT, rd->argintregs[2]);
 #endif
                        break;
@@ -4007,7 +3992,7 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                M_MTCTR(REG_ITMP2);
                M_JSR;
 
-               M_LDA(REG_SP, REG_SP, LA_SIZE + (1 + 2 + 2 + 1) * 4);
+               M_LDA(REG_SP, REG_SP, LA_SIZE + PA_SIZE + (1 + 1+ 1 + 1) * 8);
        }
 
        /* remove native stackframe info */
@@ -4035,9 +4020,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                }
        }
 
-       M_ALD(REG_ITMP2_XPC, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+       M_ALD(REG_ITMP2_XPC, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
        M_MTLR(REG_ITMP2_XPC);
-       M_LDA(REG_SP, REG_SP, stackframesize * 4); /* remove stackframe           */
+       M_LDA(REG_SP, REG_SP, stackframesize * 8); /* remove stackframe           */
 
        /* check for exception */
 
@@ -4048,7 +4033,7 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        /* handle exception */
 
-       M_IADD_IMM(REG_ITMP2_XPC, -4, REG_ITMP2_XPC);  /* exception address       */
+       M_LADD_IMM(REG_ITMP2_XPC, -4, REG_ITMP2_XPC);  /* exception address       */
 
        disp = dseg_addaddress(cd, asm_handle_nat_exception);
        M_ALD(REG_ITMP3, REG_PV, disp);
@@ -4084,12 +4069,12 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
                        /* create stack frame - keep stack 16-byte aligned */
 
-                       M_AADD_IMM(REG_SP, -8 * 4, REG_SP);
+                       M_AADD_IMM(REG_SP, -8 * 8, REG_SP);
 
                        /* move return address onto stack */
 
                        M_MFLR(REG_ZERO);
-                       M_AST(REG_ZERO, REG_SP, 5 * 4);
+                       M_AST(REG_ZERO, REG_SP, 5 * 8);
 
                        /* move pointer to java_objectheader onto stack */
 
@@ -4101,7 +4086,7 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                        disp = dseg_addaddress(cd, NULL);                         /* vftbl      */
 
                        M_LDA(REG_ITMP3, REG_PV, disp);
-                       M_AST(REG_ITMP3, REG_SP, 4 * 4);
+                       M_AST(REG_ITMP3, REG_SP, 4 * 8);
 #else
                        /* do nothing */
 #endif
@@ -4110,25 +4095,25 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
                        disp = dseg_adds4(cd, mcode);
                        M_ILD(REG_ITMP3, REG_PV, disp);
-                       M_IST(REG_ITMP3, REG_SP, 3 * 4);
+                       M_IST(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 * 4);
+                       M_AST(REG_ITMP3, REG_SP, 2 * 8);
 
                        /* move data segment displacement onto stack */
 
-                       disp = dseg_addaddress(cd, pref->disp);
-                       M_ILD(REG_ITMP3, REG_PV, disp);
-                       M_IST(REG_ITMP3, REG_SP, 1 * 4);
+                       disp = dseg_adds4(cd, pref->disp);
+                       M_LLD(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 * 4);
+                       M_AST(REG_ITMP3, REG_SP, 0 * 8);
 
                        disp = dseg_addaddress(cd, asm_patcher_wrapper);
                        M_ALD(REG_ITMP3, REG_PV, disp);