4 Byte Stackslots for i386 (native Calling Convention)
authorchristian <none@none>
Fri, 22 Apr 2005 17:33:35 +0000 (17:33 +0000)
committerchristian <none@none>
Fri, 22 Apr 2005 17:33:35 +0000 (17:33 +0000)
16 Byte Stack alignment for PowerPC in createnativestub
no copy of spilled arguments to spilled locals on x86_64
new define HAS_4BYTE_STACKSLOT in arch.h
SUPPORT_COMBINE_INTEGER_REGISTERS instead of USE_TWOREGS

src/vm/jit/i386/arch.h
src/vm/jit/i386/codegen.h
src/vm/jit/i386/emitfuncs.c
src/vm/jit/powerpc/arch.h
src/vm/jit/powerpc/codegen.c
src/vm/jit/reg.h
src/vm/jit/reg.inc
src/vm/jit/stack.c
src/vm/jit/x86_64/codegen.c

index 4975643fbbd13a8d0274cc41c668fd724a67692d..d742bb1ac1a04e39ca5896c625a49ef4bcfbf0d3 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: arch.h 2340 2005-04-22 13:33:21Z twisti $
+   $Id: arch.h 2356 2005-04-22 17:33:35Z christian $
 
 */
 
 
 #define CONDITIONAL_LOADCONST            1
         
-/*  #define CONSECUTIVE_INTARGS */      
-/*  #define CONSECUTIVE_FLOATARGS */
+#define HAS_4BYTE_STACKSLOT
+/* define SUPPORT_COMBINE_INTEGER_REGISTERS */
+
+/*  #define CONSECUTIVE_INTEGER_ARGS */         
+/*  #define CONSECUTIVE_FLOAT_ARGS */
 
 #endif /* _ARCH_H */
 
index ed56ba3e182b1d62763b3d6cd72c5ed09917ca46..1df5e2ee888ba634aa3fd2052febc4b74df1e309 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes:
 
-   $Id: codegen.h 2339 2005-04-22 13:31:01Z twisti $
+   $Id: codegen.h 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -64,6 +64,30 @@ copy:             Points to first stackslot after the parameters
 rd->ifmemuse:     max. number of stackslots used for spilling parameters
                   so far
 ************************************************************************/
+#if defined(HAS_4BYTE_STACKSLOT)
+#define SET_ARG_STACKSLOTS {                                                           \
+               s4 stacksize = 0;                                                                       \
+               copy = curstack;                                                                        \
+               while (--i >= 0) {                                                                      \
+                       stacksize+=IS_2_WORD_TYPE(copy->type)?2:1;              \
+                       copy = copy->prev;                                                              \
+               }                                                                                                       \
+               i=call_argcount;                                                                        \
+               copy=curstack;                                                                          \
+               if (stacksize > rd->ifmemuse)                                           \
+                       rd->ifmemuse = stacksize;                                               \
+               while (--i >= 0) {                                                                      \
+                       stacksize -= IS_2_WORD_TYPE(copy->type)?2:1;    \
+                       if (!(copy->flags & SAVEDVAR)) {                                \
+                               copy->varkind = ARGVAR;                                         \
+                               copy->varnum = i;                                                       \
+                               copy->flags |= INMEMORY;                                        \
+                               copy->regoff = stacksize;                                       \
+                       }                                                                                               \
+                       copy = copy->prev;                                                              \
+               }                                                                                                       \
+       }
+#else
 #define SET_ARG_STACKSLOTS {                                   \
                copy = curstack;                                                \
                if (i > rd->ifmemuse)                                   \
@@ -78,7 +102,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
                        copy = copy->prev;                                      \
                }                                                                               \
        }
-
+#endif /*  defined(HAS_4BYTE_STACKSLOTS) */
 
 /* additional functions and macros to generate code ***************************/
 
@@ -122,7 +146,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
 #define gen_div_check(v) \
     if (checknull) { \
         if ((v)->flags & INMEMORY) { \
-            i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8); \
+            i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4); \
         } else { \
             i386_test_reg_reg(cd, src->regoff, src->regoff); \
         } \
@@ -163,10 +187,10 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
 
 #define M_LNGMEMMOVE(reg,dreg) \
     do { \
-        i386_mov_membase_reg(cd, REG_SP, (reg) * 8, REG_ITMP1); \
-        i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 8); \
-        i386_mov_membase_reg(cd, REG_SP, (reg) * 8 + 4, REG_ITMP1); \
-        i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 8 + 4); \
+        i386_mov_membase_reg(cd, REG_SP, (reg) * 4, REG_ITMP1); \
+        i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 4); \
+        i386_mov_membase_reg(cd, REG_SP, (reg) * 4 + 4, REG_ITMP1); \
+        i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 4 + 4); \
     } while (0)
 
 
@@ -188,7 +212,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
 #define var_to_reg_int(regnr,v,tempnr) \
     if ((v)->flags & INMEMORY) { \
         COUNT_SPILLS; \
-        i386_mov_membase_reg(cd, REG_SP, (v)->regoff * 8, tempnr); \
+        i386_mov_membase_reg(cd, REG_SP, (v)->regoff * 4, tempnr); \
         regnr = tempnr; \
     } else { \
         regnr = (v)->regoff; \
@@ -200,7 +224,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     if ((v)->type == TYPE_FLT) { \
         if ((v)->flags & INMEMORY) { \
             COUNT_SPILLS; \
-            i386_flds_membase(cd, REG_SP, (v)->regoff * 8); \
+            i386_flds_membase(cd, REG_SP, (v)->regoff * 4); \
             fpu_st_offset++; \
             regnr = tempnr; \
         } else { \
@@ -211,7 +235,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     } else { \
         if ((v)->flags & INMEMORY) { \
             COUNT_SPILLS; \
-            i386_fldl_membase(cd, REG_SP, (v)->regoff * 8); \
+            i386_fldl_membase(cd, REG_SP, (v)->regoff * 4); \
             fpu_st_offset++; \
             regnr = tempnr; \
         } else { \
@@ -225,7 +249,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     if ((v)->type == TYPE_FLT) { \
        if ((v)->flags & INMEMORY) { \
             COUNT_SPILLS; \
-            i386_flds_membase(cd, REG_SP, (v)->regoff * 8); \
+            i386_flds_membase(cd, REG_SP, (v)->regoff * 4); \
             fpu_st_offset++; \
             regnr = tempnr; \
         } else { \
@@ -234,7 +258,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     } else { \
         if ((v)->flags & INMEMORY) { \
             COUNT_SPILLS; \
-            i386_fldl_membase(cd, REG_SP, (v)->regoff * 8); \
+            i386_fldl_membase(cd, REG_SP, (v)->regoff * 4); \
             fpu_st_offset++; \
             regnr = tempnr; \
         } else { \
@@ -257,7 +281,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
 #define store_reg_to_var_int(sptr, tempregnum) \
     if ((sptr)->flags & INMEMORY) { \
         COUNT_SPILLS; \
-        i386_mov_reg_membase(cd, tempregnum, REG_SP, (sptr)->regoff * 8); \
+        i386_mov_reg_membase(cd, tempregnum, REG_SP, (sptr)->regoff * 4); \
     }
 
 
@@ -265,7 +289,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     if ((sptr)->type == TYPE_FLT) { \
         if ((sptr)->flags & INMEMORY) { \
              COUNT_SPILLS; \
-             i386_fstps_membase(cd, REG_SP, (sptr)->regoff * 8); \
+             i386_fstps_membase(cd, REG_SP, (sptr)->regoff * 4); \
              fpu_st_offset--; \
         } else { \
 /*                  i386_fxch_reg((sptr)->regoff);*/ \
@@ -275,7 +299,7 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
     } else { \
         if ((sptr)->flags & INMEMORY) { \
             COUNT_SPILLS; \
-            i386_fstpl_membase(cd, REG_SP, (sptr)->regoff * 8); \
+            i386_fstpl_membase(cd, REG_SP, (sptr)->regoff * 4); \
             fpu_st_offset--; \
         } else { \
 /*                  i386_fxch_reg((sptr)->regoff);*/ \
@@ -297,14 +321,14 @@ rd->ifmemuse:     max. number of stackslots used for spilling parameters
             if (!IS_2_WORD_TYPE(from->type)) { \
                 if (to->flags & INMEMORY) { \
                      if (from->flags & INMEMORY) { \
-                         i386_mov_membase_reg(cd, REG_SP, from->regoff * 8, REG_ITMP1); \
-                         i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, to->regoff * 8); \
+                         i386_mov_membase_reg(cd, REG_SP, from->regoff * 4, REG_ITMP1); \
+                         i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, to->regoff * 4); \
                      } else { \
-                         i386_mov_reg_membase(cd, from->regoff, REG_SP, to->regoff * 8); \
+                         i386_mov_reg_membase(cd, from->regoff, REG_SP, to->regoff * 4); \
                      } \
                 } else { \
                      if (from->flags & INMEMORY) { \
-                         i386_mov_membase_reg(cd, REG_SP, from->regoff * 8, to->regoff); \
+                         i386_mov_membase_reg(cd, REG_SP, from->regoff * 4, to->regoff); \
                      } else { \
                          i386_mov_reg_reg(cd, from->regoff, to->regoff); \
                      } \
index c0e3d1d2171452dc4b6889b6f3c27e802a3d6583..5a5f3519a1533b7920b709fd1c38f83abfe553aa 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: emitfuncs.c 2338 2005-04-22 13:30:40Z twisti $
+   $Id: emitfuncs.c 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -48,60 +48,60 @@ void i386_emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
        if (iptr->dst->flags & INMEMORY) {
                if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->regoff == iptr->dst->regoff) {
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
 
                        } else if (src->prev->regoff == iptr->dst->regoff) {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
+                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, REG_ITMP1);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
                        if (src->regoff == iptr->dst->regoff) {
-                               i386_alu_reg_membase(cd, alu_op, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
+                               i386_alu_reg_membase(cd, alu_op, src->prev->regoff, REG_SP, iptr->dst->regoff * 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
                                i386_alu_reg_reg(cd, alu_op, src->prev->regoff, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->prev->regoff == iptr->dst->regoff) {
-                               i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 8);
+                               i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 4);
                                                
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
                                i386_alu_reg_reg(cd, alu_op, src->regoff, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else {
-                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
-                       i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4);
+                       i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 4);
                }
 
        } else {
                if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
-                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, iptr->dst->regoff);
+                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff);
+                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, iptr->dst->regoff);
 
                } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
                        if (src->prev->regoff != iptr->dst->regoff)
                                i386_mov_reg_reg(cd, src->prev->regoff, iptr->dst->regoff);
 
-                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, iptr->dst->regoff);
+                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, iptr->dst->regoff);
 
                } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->regoff != iptr->dst->regoff)
                                i386_mov_reg_reg(cd, src->regoff, iptr->dst->regoff);
 
-                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
+                       i386_alu_membase_reg(cd, alu_op, REG_SP, src->prev->regoff * 4, iptr->dst->regoff);
 
                } else {
                        if (src->regoff == iptr->dst->regoff) {
@@ -123,22 +123,22 @@ void i386_emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *
        if (iptr->dst->flags & INMEMORY) {
                if (src->flags & INMEMORY) {
                        if (src->regoff == iptr->dst->regoff) {
-                               i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8);
+                               i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
                                i386_alu_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else {
-                       i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 8);
-                       i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 4);
+                       i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4);
                }
 
        } else {
                if (src->flags & INMEMORY) {
-                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
+                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, iptr->dst->regoff);
                        i386_alu_imm_reg(cd, alu_op, iptr->val.i, iptr->dst->regoff);
 
                } else {
@@ -158,24 +158,24 @@ void i386_emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
        if (iptr->dst->flags & INMEMORY) {
                if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->regoff == iptr->dst->regoff) {
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8 + 4, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4 + 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4);
 
                        } else if (src->prev->regoff == iptr->dst->regoff) {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8 + 4, REG_ITMP1);
-                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4 + 4, REG_ITMP1);
+                               i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8 + 4, REG_ITMP1);
-                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8 + 4, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
+                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, REG_ITMP1);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4 + 4, REG_ITMP1);
+                               i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4 + 4, REG_ITMP1);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4);
                        }
                }
        }
@@ -187,16 +187,16 @@ void i386_emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *
        if (iptr->dst->flags & INMEMORY) {
                if (src->flags & INMEMORY) {
                        if (src->regoff == iptr->dst->regoff) {
-                               i386_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, iptr->dst->regoff * 8);
-                               i386_alu_imm_membase(cd, alu_op, iptr->val.l >> 32, REG_SP, iptr->dst->regoff * 8 + 4);
+                               i386_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, iptr->dst->regoff * 4);
+                               i386_alu_imm_membase(cd, alu_op, iptr->val.l >> 32, REG_SP, iptr->dst->regoff * 4 + 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
                                i386_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8 + 4, REG_ITMP1);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4 + 4, REG_ITMP1);
                                i386_alu_imm_reg(cd, alu_op, iptr->val.l >> 32, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4);
                        }
                }
        }
@@ -208,53 +208,53 @@ void i386_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *i
        if (iptr->dst->flags & INMEMORY) {
                if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->prev->regoff == iptr->dst->regoff) {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX);
-                               i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX);
+                               i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4);
 
                        } else {
-                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX);
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
                                i386_shift_reg(cd, shift_op, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX);
-                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
-                       i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX);
+                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4);
+                       i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4);
 
                } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
                        if (src->prev->regoff == iptr->dst->regoff) {
                                if (src->regoff != ECX)
                                        i386_mov_reg_reg(cd, src->regoff, ECX);
 
-                               i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8);
+                               i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4);
 
                        } else {        
                                if (src->regoff != ECX)
                                        i386_mov_reg_reg(cd, src->regoff, ECX);
 
-                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
+                               i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1);
                                i386_shift_reg(cd, shift_op, REG_ITMP1);
-                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                               i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                        }
 
                } else {
                        if (src->regoff != ECX)
                                i386_mov_reg_reg(cd, src->regoff, ECX);
 
-                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
-                       i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4);
+                       i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4);
                }
 
        } else {
                if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX);
-                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
+                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX);
+                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff);
                        i386_shift_reg(cd, shift_op, iptr->dst->regoff);
 
                } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX);
+                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX);
 
                        if (src->prev->regoff != iptr->dst->regoff)
                                i386_mov_reg_reg(cd, src->prev->regoff, iptr->dst->regoff);
@@ -265,7 +265,7 @@ void i386_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *i
                        if (src->regoff != ECX)
                                i386_mov_reg_reg(cd, src->regoff, ECX);
 
-                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
+                       i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff);
                        i386_shift_reg(cd, shift_op, iptr->dst->regoff);
 
                } else {
@@ -285,21 +285,21 @@ void i386_emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instructi
 {
        if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
                if (src->regoff == iptr->dst->regoff) {
-                       i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8);
+                       i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4);
 
                } else {
-                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
+                       i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1);
                        i386_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
-                       i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4);
                }
 
        } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
-               i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
+               i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, iptr->dst->regoff);
                i386_shift_imm_reg(cd, shift_op, iptr->val.i, iptr->dst->regoff);
                                
        } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
-               i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 8);
-               i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8);
+               i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 4);
+               i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4);
 
        } else {
                if (src->regoff != iptr->dst->regoff)
@@ -316,26 +316,26 @@ void i386_emit_ifcc_iconst(codegendata *cd, s4 if_op, stackptr src, instruction
                s4 offset = 0;
 
                if (src->flags & INMEMORY) {
-                       i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8);
+                       i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4);
 
                } else {
                        i386_test_reg_reg(cd, src->regoff, src->regoff);
                }
 
                offset += 7;
-               CALCOFFSETBYTES(offset, REG_SP, iptr->dst->regoff * 8);
+               CALCOFFSETBYTES(offset, REG_SP, iptr->dst->regoff * 4);
        
                i386_jcc(cd, if_op, offset + (iptr[1].opc == ICMD_ELSE_ICONST) ? 5 + offset : 0);
-               i386_mov_imm_membase(cd, iptr->val.i, REG_SP, iptr->dst->regoff * 8);
+               i386_mov_imm_membase(cd, iptr->val.i, REG_SP, iptr->dst->regoff * 4);
 
                if (iptr[1].opc == ICMD_ELSE_ICONST) {
                        i386_jmp_imm(cd, offset);
-                       i386_mov_imm_membase(cd, iptr[1].val.i, REG_SP, iptr->dst->regoff * 8);
+                       i386_mov_imm_membase(cd, iptr[1].val.i, REG_SP, iptr->dst->regoff * 4);
                }
 
        } else {
                if (src->flags & INMEMORY) {
-                       i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8);
+                       i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4);
 
                } else {
                        i386_test_reg_reg(cd, src->regoff, src->regoff);
index ca94ac50eab8524a6108ed97f58a745a5acb41b0..130f96c8632a879c651499532044ce95d2cab024 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: arch.h 2039 2005-03-20 11:24:19Z twisti $
+   $Id: arch.h 2356 2005-04-22 17:33:35Z christian $
 
 */
 
 /* #define CONDITIONAL_LOADCONST           1 */
 #define NOLONG_CONDITIONAL
 
-/* #define CONSECUTIVE_INTARGS */
-#define CONSECUTIVE_FLOATARGS
+/* #define CONSECUTIVE_INTEGER_ARGS */
+#define CONSECUTIVE_FLOAT_ARGS
 
 #define SPECIALMEMUSE
-#define USETWOREGS
-
+#define HAS_4BYTE_STACKSLOT
+#define SUPPORT_COMBINE_INTEGER_REGISTERS
 #endif /* _ARCH_H */
 
 
index 3a52873b25627d62a6c262775136162d3abdcb64..468ca666b5ae0493d3551b1fb97317258eeb841e 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: codegen.c 2297 2005-04-13 12:50:07Z christian $
+   $Id: codegen.c 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -3400,6 +3400,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
                stackframesize = 24+32;
        }
        stackframesize = stackframesize + 8; /* Reserve Space to store Result registers */
+       stackframesize = (stackframesize + 3) & ~3; /* Keep Stack 16 Byte aligned */
        M_STWU(REG_SP, REG_SP, -stackframesize);      /* build up stackframe                */
 
        /* if function is static, check for initialized */
index 2384a510e81632bf5093dec79101d65b83cfcabc..fe3f37eacfd195aa3c97784ee435168715d58ea3 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: reg.h 2297 2005-04-13 12:50:07Z christian $
+   $Id: reg.h 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -35,6 +35,8 @@
 #define _REG_H
 
 /* #define INVOKE_NEW_DEBUG */
+/* #define NEW_MEMORY */
+
 
 /* preliminary define for testing of the new creation of ARGVAR Stackslots in stack.c */
 /* Changes affect handling of ARGVAR Stackslots in reg_of_var in codegen.inc          */
@@ -118,10 +120,14 @@ struct registerdata {
        int freeargadrtop;              /* free argument address register count      */
 #endif
 
-#ifdef USETWOREGS
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
        int *secondregs;                /* used for longs in 2 32 bit registers   */
 #endif
 
+#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT)
+       int *freemem_2;
+       int freememtop_2;
+#endif
        int *freemem;                   /* free scratch memory                    */
        int memuse;                     /* used memory count                      */
        int ifmemuse;                   /* interface used memory count            */
index 09e7f54b55359ac5383c4ee4302a3a957f6f734a..afa940952683faeac2da87127990b10605f34f43 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Stefan Ring
             Christian Thalinger
 
-   $Id: reg.inc 2333 2005-04-22 13:26:36Z twisti $
+   $Id: reg.inc 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -96,7 +96,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
        rd->freeargintregs = DMNEW(s4, rd->intreg_argnum);
        rd->freetmpintregs = DMNEW(s4, rd->tmpintregcnt);
        rd->freesavintregs = DMNEW(s4, rd->savintregcnt);
-#ifdef USETWOREGS
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
        rd->secondregs = DMNEW(s4, rd->intregsnum);
 #endif
 
@@ -137,7 +137,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
        rd->argintregs[1] = i;
 #endif
                
-#ifdef USETWOREGS
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
        for (i = 1; i < rd->intreg_argnum; i++)
                rd->secondregs[rd->argintregs[i - 1]] = rd->argintregs[i];
        for (i = 1; i < rd->tmpintregcnt; i++)
@@ -259,6 +259,9 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id)
 
 
        rd->freemem    = DMNEW(s4, id->cummaxstack);
+#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT)
+       rd->freemem_2  = DMNEW(s4, id->cummaxstack);
+#endif
        rd->locals     = DMNEW(varinfo5, id->cumlocals);
        rd->interfaces = DMNEW(varinfo5, id->cummaxstack);
 
@@ -349,7 +352,8 @@ static void interface_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
        int     s, t, saved;
        int     intalloc, fltalloc; /* ?per Interface slot only one flt or one int type can be allocated to a register? */
        varinfo *v;
-       int             regsneeded = 0;
+       int             intregsneeded = 0;
+       int             memneeded = 0;
 
        /* allocate stack space for passing arguments to called methods */
 #ifdef INVOKE_NEW_DEBUG
@@ -399,91 +403,95 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd->
                for (t = TYPE_INT; t <= TYPE_ADR; t++) {
                        v = &rd->interfaces[s][t];
                        if (v->type >= 0) {
-#ifdef USETWOREGS
-                               regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+                               intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#endif
+#if defined(HAS_4BYTE_STACKSLOT)
+                               memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
 #endif
                                if (!saved) {
-#ifdef HAS_ADDRESS_REGISTER_FILE
-                                       if (t == TYPE_ADR) {
 #if defined(HAS_ADDRESS_REGISTER_FILE)
+                                       if (t == TYPE_ADR) {
                                                if (!m->isleafmethod &&(rd->ifargadrregcnt < rd->adrreg_argnum)) {
                                                        v->regoff = rd->argadrregs[rd->ifargadrregcnt++];
                                                } else 
-#endif 
-                                               if (rd->iftmpadrregcnt > 0) {
-                                                       rd->iftmpadrregcnt--;
-                                                       v->regoff = rd->tmpadrregs[rd->iftmpadrregcnt];
-                                               }
-                                               else if (rd->ifsavadrregcnt > 0) {
-                                                       rd->ifsavadrregcnt--;
-                                                       v->regoff = rd->savadrregs[rd->ifsavadrregcnt];
-                                               }
-                                               else {
-                                                       v->flags |= INMEMORY;
-                                                       v->regoff = rd->ifmemuse;
-                                                       rd->ifmemuse += regsneeded + 1;
-                                               }                                               
+                                                       if (rd->iftmpadrregcnt > 0) {
+                                                               rd->iftmpadrregcnt--;
+                                                               v->regoff = rd->tmpadrregs[rd->iftmpadrregcnt];
+                                                       }
+                                                       else if (rd->ifsavadrregcnt > 0) {
+                                                               rd->ifsavadrregcnt--;
+                                                               v->regoff = rd->savadrregs[rd->ifsavadrregcnt];
+                                                       }
+                                                       else {
+                                                               v->flags |= INMEMORY;
+                                                               v->regoff = rd->ifmemuse;
+                                                               rd->ifmemuse++;
+                                                       }                                               
                                        } else {
-#endif
-                                       if (IS_FLT_DBL_TYPE(t)) {
-                                               if (fltalloc >= 0) {
-                                                       v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY;
-                                                       v->regoff = rd->interfaces[s][fltalloc].regoff;
-                                               }
-                                               else if (!m->isleafmethod &&(rd->ifargfltregcnt < rd->fltreg_argnum)) {
-                                                       v->regoff = rd->argfltregs[rd->ifargfltregcnt++];
-                                               }
-                                               else if (rd->iftmpfltregcnt > 0) {
-                                                       rd->iftmpfltregcnt--;
-                                                       v->regoff = rd->tmpfltregs[rd->iftmpfltregcnt];
-                                               }
-                                               else if (rd->ifsavfltregcnt > 0) {
-                                                       rd->ifsavfltregcnt--;
-                                                       v->regoff = rd->savfltregs[rd->ifsavfltregcnt];
-                                               }
-                                               else {
-                                                       v->flags |= INMEMORY;
-                                                       v->regoff = rd->ifmemuse;
-                                                       rd->ifmemuse += regsneeded + 1;
-                                               }
-                                               fltalloc = t;
-                                       }
-                                       else {
-#if defined(__I386__)
-                                               /*
-                                                * for i386 put all longs in memory
-                                                */
-                                               if (IS_2_WORD_TYPE(t)) {
-                                                       v->flags |= INMEMORY;
-                                                       v->regoff = rd->ifmemuse++;
-                                               } else {
-#endif
-                                                       if (intalloc >= 0) {
-                                                               v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY;
-                                                               v->regoff = rd->interfaces[s][intalloc].regoff;
+#endif /* defined(HAS_ADDRESS_REGISTER_FILE) */
+                                               if (IS_FLT_DBL_TYPE(t)) {
+                                                       if (fltalloc >= 0) {
+                                                               v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY;
+                                                               v->regoff = rd->interfaces[s][fltalloc].regoff;
                                                        }
-                                                       else if (!m->isleafmethod &&(rd->ifargintregcnt +regsneeded < rd->intreg_argnum)) {
-                                                               v->regoff = rd->argintregs[rd->ifargintregcnt];
-                                                               rd->ifargintregcnt+=regsneeded+1;
+                                                       else if (!m->isleafmethod &&(rd->ifargfltregcnt < rd->fltreg_argnum)) {
+                                                               v->regoff = rd->argfltregs[rd->ifargfltregcnt++];
                                                        }
-                                                       else if (rd->iftmpintregcnt > regsneeded) {
-                                                               rd->iftmpintregcnt -= regsneeded + 1;
-                                                               v->regoff = rd->tmpintregs[rd->iftmpintregcnt];
+                                                       else if (rd->iftmpfltregcnt > 0) {
+                                                               rd->iftmpfltregcnt--;
+                                                               v->regoff = rd->tmpfltregs[rd->iftmpfltregcnt];
                                                        }
-                                                       else if (rd->ifsavintregcnt > regsneeded) {
-                                                               rd->ifsavintregcnt -= regsneeded + 1;
-                                                               v->regoff = rd->savintregs[rd->ifsavintregcnt];
+                                                       else if (rd->ifsavfltregcnt > 0) {
+                                                               rd->ifsavfltregcnt--;
+                                                               v->regoff = rd->savfltregs[rd->ifsavfltregcnt];
                                                        }
                                                        else {
                                                                v->flags |= INMEMORY;
                                                                v->regoff = rd->ifmemuse;
-                                                               rd->ifmemuse += regsneeded + 1;
+                                                               rd->ifmemuse += memneeded + 1;
                                                        }
-#if defined(__I386__)
+                                                       fltalloc = t;
+                                               }
+                                               else {
+                                                       /* #if defined(__I386__) */
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+                                                       /*
+                                                        * for i386 put all longs in memory
+                                                        */
+                                                       if (IS_2_WORD_TYPE(t)) {
+                                                               v->flags |= INMEMORY;
+                                                               v->regoff = rd->ifmemuse;
+                                                               rd->ifmemuse += memneeded + 1;
+                                                       } else
+#endif /* defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
+#if !defined(HAS_4BYTE_STACKSLOT)
+                                                               if (intalloc >= 0) {
+                                                                       v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY;
+                                                                       v->regoff = rd->interfaces[s][intalloc].regoff;
+                                                               }
+                                                               else 
+#endif /* !defined(HAS_4BYTE_STACKSLOT) */
+                                                                       if (!m->isleafmethod &&(rd->ifargintregcnt + intregsneeded < rd->intreg_argnum)) {
+                                                                               v->regoff = rd->argintregs[rd->ifargintregcnt];
+                                                                               rd->ifargintregcnt += intregsneeded + 1;
+                                                                       }
+                                                                       else if (rd->iftmpintregcnt > intregsneeded) {
+                                                                               rd->iftmpintregcnt -= intregsneeded + 1;
+                                                                               v->regoff = rd->tmpintregs[rd->iftmpintregcnt];
+                                                                       }
+                                                                       else if (rd->ifsavintregcnt > intregsneeded) {
+                                                                               rd->ifsavintregcnt -= intregsneeded + 1;
+                                                                               v->regoff = rd->savintregs[rd->ifsavintregcnt];
+                                                                       }
+                                                                       else {
+                                                                               v->flags |= INMEMORY;
+                                                                               v->regoff = rd->ifmemuse;
+                                                                               rd->ifmemuse += memneeded + 1;
+                                                                       }
+
+                                                       intalloc = t;
                                                }
-#endif
-                                               intalloc = t;
-                                       }
 #ifdef HAS_ADDRESS_REGISTER_FILE
                                        }
 #endif
@@ -498,7 +506,7 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd->
                                                else {
                                                        v->flags |= INMEMORY;
                                                        v->regoff = rd->ifmemuse;
-                                                       rd->ifmemuse += regsneeded + 1;
+                                                       rd->ifmemuse++;
                                                }                                               
                                        } else {
 #endif
@@ -506,44 +514,44 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd->
                                                if (fltalloc >= 0) {
                                                        v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY;
                                                        v->regoff = rd->interfaces[s][fltalloc].regoff;
-                                               }
-                                               else if (rd->ifsavfltregcnt > 0) {
+                                               } else
+                                               if (rd->ifsavfltregcnt > 0) {
                                                        rd->ifsavfltregcnt--;
                                                        v->regoff = rd->savfltregs[rd->ifsavfltregcnt];
                                                }
                                                else {
                                                        v->flags |= INMEMORY;
                                                        v->regoff = rd->ifmemuse;
-                                                       rd->ifmemuse += regsneeded + 1;
+                                                       rd->ifmemuse += memneeded + 1;
                                                }
                                                fltalloc = t;
                                        }
                                        else {
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
                                                if (IS_2_WORD_TYPE(t)) {
                                                        v->flags |= INMEMORY;
-                                                       v->regoff = rd->ifmemuse++;
-                                               } else {
+                                                       v->regoff = rd->ifmemuse;
+                                                       rd->ifmemuse += memneeded + 1;
+                                               } else
 #endif
+#if !defined(HAS_4BYTE_STACKSLOT)
                                                        if (intalloc >= 0) {
                                                                v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY;
                                                                v->regoff = rd->interfaces[s][intalloc].regoff;
-                                                       }
-                                                       else if (rd->ifsavintregcnt > regsneeded) {
-                                                               rd->ifsavintregcnt -= regsneeded + 1;
+                                                       } else
+#endif
+                                                       if (rd->ifsavintregcnt > intregsneeded) {
+                                                               rd->ifsavintregcnt -= intregsneeded + 1;
                                                                v->regoff = rd->savintregs[rd->ifsavintregcnt];
                                                        }
                                                        else {
                                                                v->flags |= INMEMORY;
                                                                v->regoff = rd->ifmemuse;
-                                                               rd->ifmemuse += regsneeded + 1;
+                                                               rd->ifmemuse += memneeded + 1;
                                                        }
-#if defined(__I386__)
-                                               }
-#endif
                                                intalloc = t;
                                        }
 #ifdef HAS_ADDRESS_REGISTER_FILE
@@ -583,11 +591,12 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd->
        
 static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
 {
-       int      s, t, tt;
-       int      intalloc, fltalloc;
+       int     s, t, tt;
+       int     intalloc, fltalloc;
        varinfo *v;
-       int      regsneeded = 0;
-       int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
+       int     intregsneeded = 0;
+       int     memneeded = 0;
+       int     typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
 
        if (m->isleafmethod) {
                int arg, doublewordarg, iargcnt, fargcnt;
@@ -607,13 +616,15 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                v = &rd->locals[s][t];
 
                                if (v->type >= 0) {
-#ifdef USETWOREGS
-                                       regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+                                       intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#endif
+#if defined(HAS_4BYTE_STACKSLOT)
+                                       memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
 #endif
 #ifdef HAS_ADDRESS_REGISTER_FILE
                                        if (t == TYPE_ADR) {
-                                               /* doublewordarg not possible for xdsp */
-#if !defined(CONSECUTIVE_ADDRESSARGS)
+#if !defined(CONSECUTIVE_ADDRESS_ARGS)
                                                aargcnt = arg;
 #endif
                                                if ((arg < m->paramcount) && (aargcnt < rd->adrreg_argnum)) {
@@ -633,12 +644,12 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                                else {
                                                        v->flags |= INMEMORY;
                                                        v->regoff = rd->ifmemuse;
-                                                       rd->ifmemuse += regsneeded + 1;
+                                                       rd->ifmemuse ++;
                                                }                                               
                                        } else {
 #endif
                                        if (IS_FLT_DBL_TYPE(t)) {
-#if !defined(CONSECUTIVE_FLOATARGS)
+#if !defined(CONSECUTIVE_FLOAT_ARGS)
                                                fargcnt = arg;
 #endif
                                                if (fltalloc >= 0) {
@@ -663,22 +674,23 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                                else {
                                                        v->flags = INMEMORY;
                                                        v->regoff = rd->maxmemuse;
-                                                       rd->maxmemuse += regsneeded + 1;
+                                                       rd->maxmemuse += memneeded + 1;
                                                }
                                                fltalloc = t;
 
                                        } else {
                                                int regtouse;
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
                                                if (IS_2_WORD_TYPE(t)) {
                                                        v->flags = INMEMORY;
-                                                       v->regoff = rd->maxmemuse++;
+                                                       v->regoff = rd->maxmemuse;
+                                                       rd->maxmemuse += memneeded + 1;
                                                } else {
 #endif
-#if !defined(CONSECUTIVE_INTARGS)
+#if !defined(CONSECUTIVE_INTEGER_ARGS)
                                                        iargcnt = arg;
 #endif
                                                        if (intalloc >= 0) {
@@ -686,22 +698,22 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                                                v->regoff = rd->locals[s][intalloc].regoff;
                                                        }
                                                        else if (!doublewordarg && (arg < m->paramcount)
-#ifndef USETWOREGS
+#ifndef SUPPORT_COMBINE_INTEGER_REGISTERS
                                                                         && ((regtouse = iargcnt) < rd->intreg_argnum)
 #else
-                                                                        && ((regtouse = s) < rd->intreg_argnum - regsneeded)
+                                                                        && ((regtouse = s) < rd->intreg_argnum - intregsneeded)
 #endif
                                                                         ) {
                                                                v->flags = 0;
                                                                v->regoff = rd->argintregs[regtouse];
                                                        }
-                                                       else if (rd->maxtmpintreguse > regsneeded) {
-                                                               rd->maxtmpintreguse -= regsneeded + 1;
+                                                       else if (rd->maxtmpintreguse > intregsneeded) {
+                                                               rd->maxtmpintreguse -= intregsneeded + 1;
                                                                v->flags = 0;
                                                                v->regoff = rd->tmpintregs[rd->maxtmpintreguse];
                                                        }
-                                                       else if (rd->maxsavintreguse > regsneeded) {
-                                                               rd->maxsavintreguse -= regsneeded + 1;
+                                                       else if (rd->maxsavintreguse > intregsneeded) {
+                                                               rd->maxsavintreguse -= intregsneeded + 1;
                                                                v->flags = 0;
                                                                v->regoff = rd->savintregs[rd->maxsavintreguse];
                                                        }
@@ -718,7 +730,7 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                                        else {
                                                                v->flags = INMEMORY;
                                                                v->regoff = rd->maxmemuse;
-                                                               rd->maxmemuse += regsneeded + 1;
+                                                               rd->maxmemuse += memneeded + 1;
                                                        }
 #if defined(__I386__)
                                                }
@@ -773,8 +785,11 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                        t = typeloop[tt];
                        v = &rd->locals[s][t];
                        if (v->type >= 0) {
-#ifdef USETWOREGS
-                               regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
+                               intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
+#endif
+#if defined(HAS_4BYTE_STACKSLOT)
+                               memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
 #endif
 #ifdef HAS_ADDRESS_REGISTER_FILE
                                if ( t == TYPE_ADR ) {
@@ -786,7 +801,7 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                        else {
                                                v->flags = INMEMORY;
                                                v->regoff = rd->maxmemuse;
-                                               rd->maxmemuse += regsneeded + 1;
+                                               rd->maxmemuse++;
                                        }
                                } else {
 #endif
@@ -802,36 +817,41 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
                                        }
                                        else {
                                                v->flags = INMEMORY;
+#if defined(NEW_MEMORY) 
+                                               if ( (memneeded) && (rd->maxmemuse&1))
+                                                       rd->maxmemuse++;
+#endif
                                                v->regoff = rd->maxmemuse;
-                                               rd->maxmemuse += regsneeded + 1;
+                                               rd->maxmemuse += memneeded + 1;
                                        }
                                        fltalloc = t;
                                }
                                else {
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
                                        if (IS_2_WORD_TYPE(t)) {
                                                v->flags = INMEMORY;
-                                               v->regoff = rd->maxmemuse++;
+                                               v->regoff = rd->maxmemuse;
+                                               rd->maxmemuse += memneeded + 1;
                                        } else {
 #endif
                                                if (intalloc >= 0) {
                                                        v->flags = rd->locals[s][intalloc].flags;
                                                        v->regoff = rd->locals[s][intalloc].regoff;
                                                }
-                                               else if (rd->maxsavintreguse > regsneeded) {
-                                                       rd->maxsavintreguse -= regsneeded+1;
+                                               else if (rd->maxsavintreguse > intregsneeded) {
+                                                       rd->maxsavintreguse -= intregsneeded+1;
                                                        v->flags = 0;
                                                        v->regoff = rd->savintregs[rd->maxsavintreguse];
                                                }
                                                else {
                                                        v->flags = INMEMORY;
                                                        v->regoff = rd->maxmemuse;
-                                                       rd->maxmemuse += regsneeded + 1;
+                                                       rd->maxmemuse += memneeded + 1;
                                                }
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        }
 #endif
                                        intalloc = t;
@@ -848,6 +868,9 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd)
 static void reg_init_temp(methodinfo *m, registerdata *rd)
 {
        rd->freememtop = 0;
+#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT)
+       rd->freememtop_2 = 0;
+#endif
        rd->memuse = rd->ifmemuse;
 
        rd->freetmpinttop = 0;
@@ -894,17 +917,23 @@ static void reg_init_temp(methodinfo *m, registerdata *rd)
 
 static void reg_new_temp_func(registerdata *rd, stackptr s)
 {
-       s4 regsneeded;
+       s4 intregsneeded;
+       s4 memneeded;
        s4 tryagain;
 
        /* Try to allocate a saved register if there is no temporary one          */
        /* available. This is what happens during the second run.                 */
        tryagain = (s->flags & SAVEDVAR) ? 1 : 2;
 
-#ifdef USETWOREGS
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
        regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
 #else
-       regsneeded = 0;
+       intregsneeded=0;
+#endif
+#if defined(HAS_4BYTE_STACKSLOT)
+       memneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
+#else
+       memneeded=0;
 #endif
 
        for(; tryagain; --tryagain) {
@@ -942,25 +971,25 @@ static void reg_new_temp_func(registerdata *rd, stackptr s)
                                }
 
                        } else {
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                /*
                                 * for i386 put all longs in memory
                                 */
                                if (!IS_2_WORD_TYPE(s->type)) {
 #endif
-                                       if (rd->freesavinttop > regsneeded) {
-                                               rd->freesavinttop -= regsneeded + 1;
+                                       if (rd->freesavinttop > intregsneeded) {
+                                               rd->freesavinttop -= intregsneeded + 1;
                                                s->regoff = rd->freesavintregs[rd->freesavinttop];
                                                return;
 
-                                       } else if (rd->savintreguse > regsneeded) {
-                                               rd->savintreguse -= regsneeded + 1;
+                                       } else if (rd->savintreguse > intregsneeded) {
+                                               rd->savintreguse -= intregsneeded + 1;
                                                if (rd->savintreguse < rd->maxsavintreguse)
                                                        rd->maxsavintreguse = rd->savintreguse;
                                                s->regoff = rd->savintregs[rd->savintreguse];
                                                return;
                                        }
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                }
 #endif
                        }
@@ -1010,37 +1039,37 @@ static void reg_new_temp_func(registerdata *rd, stackptr s)
                                        }
 
                                } else {
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                /*
                                 * for i386 put all longs in memory
                                 */
                                if (!IS_2_WORD_TYPE(s->type)) {
 #endif
-                                       if (rd->freearginttop > regsneeded) {
-                                               rd->freearginttop -= regsneeded + 1;
+                                       if (rd->freearginttop > intregsneeded) {
+                                               rd->freearginttop -= intregsneeded + 1;
                                                s->regoff = rd->freeargintregs[rd->freearginttop];
                                                s->flags |= TMPARG;
                                                return;
-                                       } else if (rd->argintreguse < rd->intreg_argnum - regsneeded) {
+                                       } else if (rd->argintreguse < rd->intreg_argnum - intregsneeded) {
                                                if (rd->argintreguse > rd->maxargintreguse)
                                                        rd->maxargintreguse = rd->argintreguse;
                                                s->regoff = rd->argintregs[rd->argintreguse];
                                                s->flags |= TMPARG;
-                                               rd->argintreguse += regsneeded + 1;
+                                               rd->argintreguse += intregsneeded + 1;
                                                return;
-                                       } else if (rd->freetmpinttop > regsneeded) {
-                                               rd->freetmpinttop -= regsneeded + 1;
+                                       } else if (rd->freetmpinttop > intregsneeded) {
+                                               rd->freetmpinttop -= intregsneeded + 1;
                                                s->regoff = rd->freetmpintregs[rd->freetmpinttop];
                                                return;
 
-                                       } else if (rd->tmpintreguse > regsneeded) {
-                                               rd->tmpintreguse -= regsneeded + 1;
+                                       } else if (rd->tmpintreguse > intregsneeded) {
+                                               rd->tmpintreguse -= intregsneeded + 1;
                                                if (rd->tmpintreguse < rd->maxtmpintreguse)
                                                        rd->maxtmpintreguse = rd->tmpintreguse;
                                                s->regoff = rd->tmpintregs[rd->tmpintreguse];
                                                return;
                                        }
-#if defined(__I386__)
+#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                }
 #endif
                        }
@@ -1050,16 +1079,41 @@ static void reg_new_temp_func(registerdata *rd, stackptr s)
                }
        }
 
-       if (rd->freememtop > regsneeded) {
-               rd->freememtop -= regsneeded + 1;
+#if defined(NEW_MEMORY) 
+#if defined(HAS_4BYTE_STACKSLOT)
+       if ((memneeded>0) && (rd->freememtop_2 > memneeded)) {
+               rd->freememtop_2--;
+               s->regoff = rd->freemem_2[rd->freememtop_2];
+       } else
+#endif /*defined(HAS_4BYTE_STACKSLOT) */
+               if ((memneeded == 0) && (rd->freememtop > memneeded)) {
+                       rd->freememtop--;;
+                       s->regoff = rd->freemem[rd->freememtop];
+               } else {
+#if defined(HAS_4BYTE_STACKSLOT)
+/* align 2 Word Types */
+/*                     if ((memneeded) && (rd->memuse & 1 == 1)) {  */
+/*                             rd->freemem[rd->freememtop] = rd->memuse; */
+/*                             rd->freememtop++; */
+/*                             rd->memuse++; */
+/*                     } */
+#endif /*defined(HAS_4BYTE_STACKSLOT) */
+                               s->regoff = rd->memuse;
+                       rd->memuse += memneeded + 1;
+                       if (rd->memuse > rd->maxmemuse)
+                               rd->maxmemuse = rd->memuse;
+               }
+#else /* defined(NEW_MEMORY) */
+       if ((rd->freememtop > memneeded) && (memneeded == 0)) {
+               rd->freememtop -= memneeded + 1;
                s->regoff = rd->freemem[rd->freememtop];
-
        } else {
                s->regoff = rd->memuse;
-               rd->memuse += regsneeded + 1;
+               rd->memuse += memneeded + 1;
                if (rd->memuse > rd->maxmemuse)
                        rd->maxmemuse = rd->memuse;
        }
+#endif /* defined(NEW_MEMORY) */
        s->flags |= INMEMORY;
 }
 
@@ -1069,20 +1123,35 @@ static void reg_new_temp_func(registerdata *rd, stackptr s)
 
 static void reg_free_temp_func(registerdata *rd, stackptr s)
 {
-       s4 regsneeded;
+       s4 intregsneeded;
+       s4 memneeded;
 
-#ifdef USETWOREGS
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
        regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
 #else
-       regsneeded = 0;
+       intregsneeded=0;
+#endif
+#if defined(HAS_4BYTE_STACKSLOT)
+       memneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0;
+#else
+       memneeded=0;
 #endif
 
        if (s->flags & INMEMORY) {
+#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT)
+               if (memneeded > 0) {
+                       rd->freemem_2[rd->freememtop_2] = s->regoff;
+                       rd->freememtop_2++;
+               } else {
+                       rd->freemem[rd->freememtop] = s->regoff;
+                       rd->freememtop++;
+               }
+#else
                rd->freemem[rd->freememtop] = s->regoff;
-               if (regsneeded)
+               if (memneeded)
                        rd->freemem[rd->freememtop + 1] = s->regoff + 1;
-               rd->freememtop += regsneeded + 1;
-
+               rd->freememtop += memneeded + 1;
+#endif /* defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT */
 #ifdef HAS_ADDRESS_REGISTER_FILE
        } else if (s->type == TYPE_ADR) {
                if (s->flags & (SAVEDVAR | SAVEDTMP)) {
@@ -1106,27 +1175,27 @@ static void reg_free_temp_func(registerdata *rd, stackptr s)
                if (s->flags & (SAVEDVAR | SAVEDTMP)) {
                        s->flags &= ~SAVEDTMP;
                        rd->freesavintregs[rd->freesavinttop] = s->regoff;
-#ifdef USETWOREGS
-                       if (regsneeded)
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
+                       if (intregsneeded)
                                rd->freesavintregs[rd->freesavinttop + 1] = rd->secondregs[s->regoff];
 #endif
-                       rd->freesavinttop += regsneeded + 1;
+                       rd->freesavinttop += intregsneeded + 1;
 
                } else if (s->flags & TMPARG) {
                        s->flags &= ~TMPARG;
                        rd->freeargintregs[rd->freearginttop] = s->regoff;
-#ifdef USETWOREGS
-                       if (regsneeded)
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
+                       if (intregsneeded)
                                rd->freeargintregs[rd->freearginttop + 1] = rd->secondregs[s->regoff];
 #endif
-                       rd->freearginttop += regsneeded + 1;
+                       rd->freearginttop += intregsneeded + 1;
                } else {
                        rd->freetmpintregs[rd->freetmpinttop] = s->regoff;
-#ifdef USETWOREGS
-                       if (regsneeded)
+#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
+                       if (intregsneeded)
                                rd->freetmpintregs[rd->freetmpinttop + 1] = rd->secondregs[s->regoff];
 #endif 
-                       rd->freetmpinttop += regsneeded + 1;
+                       rd->freetmpinttop += intregsneeded + 1;
                }
        }
 }
index 231d4ff1b96e967153f6d88b6ede760dfdf3905f..19bd0ce33a40026b27a88676331ac4ef900b6abb 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Edwin Steiner
             Christian Thalinger
 
-   $Id: stack.c 2333 2005-04-22 13:26:36Z twisti $
+   $Id: stack.c 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -1925,13 +1925,19 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd)
                                                        rd->argintreguse = 3;   
 
                                                i = iptr->op1;
+
                                                REQUIRE(i);
 #ifdef SPECIALMEMUSE
                                                if (rd->ifmemuse < (i + rd->intreg_argnum + 6))
                                                        rd->ifmemuse = i + rd->intreg_argnum + 6; 
 #else
+# if defined(__I386__)
+                                               if (rd->ifmemuse < i + 3)
+                                                       rd->ifmemuse = i + 3; /* n integer args spilled on stack */
+# else
                                                if (rd->ifmemuse < i)
                                                        rd->ifmemuse = i; /* n integer args spilled on stack */
+# endif /* defined(__I386__) */
 #endif
                                                if ((i + INT_ARG_CNT) > rd->arguments_num)
                                                        rd->arguments_num = i + INT_ARG_CNT;
@@ -1942,11 +1948,15 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd)
                                                                copy->varkind = ARGVAR;
                                                                copy->varnum = i + INT_ARG_CNT;
                                                                copy->flags|=INMEMORY;
-#ifdef SPECIALMEMUSE
+#if defined(SPECIALMEMUSE)
                                                                copy->regoff = i + rd->intreg_argnum + 6;
 #else
+# if defined(__I386__)
+                                                               copy->regoff = i + 3;
+# else
                                                                copy->regoff = i;
-#endif
+# endif /* defined(__I386__) */
+#endif /* defined(SPECIALMEMUSE) */
                                                        }
                                                        copy = copy->prev;
                                                }
index 8896f299f8ff5b78568cf3667d3e2b0c509f3b80..9bb01454708ccd932983d7cdb5121da44b026e9b 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.c 2352 2005-04-22 13:55:26Z twisti $
+   $Id: codegen.c 2356 2005-04-22 17:33:35Z christian $
 
 */
 
@@ -325,8 +325,9 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                if (!(var->flags & INMEMORY)) {      /* stack arg -> register */
                                        x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, var->regoff);    /* + 8 for return address */
                                } else {                             /* stack arg -> spilled  */
-                                       x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_ITMP1);    /* + 8 for return address */
-                                       x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, var->regoff * 8);
+                                       /* x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_ITMP1); */    /* + 8 for return address */
+/*                                     x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, var->regoff * 8); */
+                                       var->regoff = parentargs_base + pa + 1;
                                }
                        }
                        s1++;
@@ -349,8 +350,9 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                        x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, var->regoff);
 
                                } else {
-                                       x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_FTMP1);
-                                       x86_64_movq_reg_membase(cd, REG_FTMP1, REG_SP, var->regoff * 8);
+/*                                     x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_FTMP1); */
+/*                                     x86_64_movq_reg_membase(cd, REG_FTMP1, REG_SP, var->regoff * 8); */
+                                       var->regoff = parentargs_base + pa + 1;
                                }
                        }
                        s2++;