* src/vm/jit/sparc64/codegen.c (codegen_emit_stub_native): Fixed the way
authorajordan <none@none>
Fri, 1 Jun 2007 00:45:04 +0000 (00:45 +0000)
committerajordan <none@none>
Fri, 1 Jun 2007 00:45:04 +0000 (00:45 +0000)
float arguments are preserved over codegen_start_native_call.
* src/vm/jit/sparc64/md-abi.c (codegen_start_native_call): Likewise.

* src/vm/jit/sparc64/machine-instr.h (compare_and_swap): Changed inline
assembly, so it survives gcc optimization.

* src/vm/jit/sparc64/asmpart.S (asm_patcher_wrapper): Saving and restoring
float return register.
* src/vm/jit/sparc64/md-asm.h: Likewise.

src/vm/jit/sparc64/asmpart.S
src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/machine-instr.h
src/vm/jit/sparc64/md-abi.c
src/vm/jit/sparc64/md-asm.h

index 975b4860e3052eb4f6a74f4412d1f24b825f1360..b135b6559702ba31b65dba3cbcb80cfb5d583360 100644 (file)
@@ -417,10 +417,11 @@ asm_patcher_wrapper:
        mov     pv_callee,pv_caller
 
        /* create window and stack frame              */
-       save  %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT+4)*8),%sp
+       save  %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT+6)*8),%sp
 
-       SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
-       SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
+       SAVE_FLOAT_RETURN_REGISTER(CSTACK_CNT)
+       SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT+1)
+       SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+1+FLT_ARG_CNT)
 
        mov     itmp1,%l0               /* save itmp1                             */
        mov     itmp2,%l1               /* save itmp2                             */
@@ -431,8 +432,9 @@ asm_patcher_wrapper:
        call    patcher_wrapper
        nop
 
-       RESTORE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
-       RESTORE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
+       RESTORE_FLOAT_RETURN_REGISTER(CSTACK_CNT)
+       RESTORE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT+1)
+       RESTORE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+1+FLT_ARG_CNT)
 
        mov     %l0,itmp1               /* restore itmp1                          */
        mov     %l1,itmp2               /* restore itmp2                          */
index 74912fbab76053efd529ddcaebdde4ab43e96a74..e0c75073404507fb77f791fb08bbaa6456000b81 100644 (file)
@@ -3115,8 +3115,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        for (i = 0, j = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
-                       s1 = WINSAVE_CNT + (j * 8);
-                       M_DST(abi_registers_float_argument[i], REG_SP, BIAS + s1);
+                       s1 = WINSAVE_CNT + nmd->memuse + j;
+                       M_DST(abi_registers_float_argument[i], REG_SP, BIAS + (s1*8));
                        fltregarg_offset[i] = s1; /* remember stack offset */
                        j++;
                }
@@ -3124,7 +3124,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* prepare data structures for native function call */
 
-       M_ADD_IMM(REG_FP, BIAS, REG_OUT0); /* datasp == top of the stack frame (absolute == +BIAS) */
+       M_ADD_IMM(REG_FP, BIAS, REG_OUT0); /* datasp == top of the stack frame (absolute, ie. + BIAS) */
        M_MOV(REG_PV_CALLEE, REG_OUT1);
        M_MOV(REG_FP, REG_OUT2); /* java sp */
        M_MOV(REG_RA_CALLEE, REG_OUT3);
@@ -3194,7 +3194,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                        s2 = nmd->params[j].regoff;
 
                                        /* JIT float regs are still on the stack */
-                                       M_DLD(s2, REG_SP, BIAS + fltregarg_offset[i]);
+                                       M_DLD(s2, REG_SP, BIAS + (fltregarg_offset[i] * 8));
                                } 
                                else {
                                        /* not supposed to happen with 16 NAT flt args */
index b69caa2cdf1e372beccef0803157f755c90ef3fc..d9741b09ae8d420f9de3ffc56f6e314dbc7d4d87 100644 (file)
@@ -30,9 +30,9 @@ compare_and_swap (volatile long *p, long oldval, long newval)
 
   __asm__ __volatile__ (
     "mov %3,%0\n\t"
-    "casx %1,%2,%0\n\t"
+    "casx [%4],%2,%0\n\t"
     : "=&r"(ret), "=m"(*p) 
-    : "r"(oldval), "r"(newval), "m"(*p));
+    : "r"(oldval), "r"(newval), "r"(p));
 
   /*dolog("compare_and_swap() return=%d mem=%d", ret, *p);*/
   return ret;
index faee75458c44fc0232d5e48dc518697f5043895e..a7ea007bd2a0fe38bd54a5d1ef9b4cfeef123f83 100644 (file)
@@ -42,6 +42,8 @@
 #include "mm/memory.h"
 #include <assert.h>
 
+/* helper macros for allocation methods ***************************************/
+#define MIN(a,b) (((a) <= (b)) ? (a) : (b))
 
 /* register descripton array **************************************************/
 
@@ -216,12 +218,17 @@ void md_param_alloc_native(methoddesc *md)
        s4         i;
        s4         reguse;
        s4         stacksize;
+       s4         min_nat_regs;
 
        /* set default values */
 
        reguse = 0;
        stacksize = 6;
 
+       /* when we are above this, we have to increase the stacksize with every */
+       /* single argument to create the proper argument array                  */
+       min_nat_regs = MIN(INT_NATARG_CNT, FLT_NATARG_CNT);
+
        /* get params field of methoddesc */
 
        pd = md->params;
@@ -241,8 +248,10 @@ void md_param_alloc_native(methoddesc *md)
                                pd->inmemory = true;
                                pd->regoff = reguse;
                                reguse++;
-                               stacksize++;
                        }
+
+                       if (i >= min_nat_regs)
+                               stacksize++;
                        break;
                case TYPE_FLT:
                case TYPE_DBL:
@@ -255,8 +264,10 @@ void md_param_alloc_native(methoddesc *md)
                                pd->inmemory = true;
                                pd->regoff = reguse;
                                reguse++;
-                               stacksize++;
                        }
+
+                       if (i >= min_nat_regs)
+                               stacksize++;
                        break;
                }
        }
index d366051a963660397400c9b52ce33a09c41ca2bd..50017946f378d78c8ea663d4c93da6d044ac3681 100644 (file)
 
 /* save and restore macros ****************************************************/
 
+#define SAVE_FLOAT_RETURN_REGISTER(off) \
+       std     fv0,[%sp + bias + ((off)*8)] ;
+
+#define RESTORE_FLOAT_RETURN_REGISTER(off) \
+       ldd     [%sp + bias + ((off)*8)],fv0 ;
+
 
 #define SAVE_FLOAT_ARGUMENT_REGISTERS(off) \
        std     fa0,[%sp + bias + ((0+(off))*8)] ; \