* src/vm/jit/sparc64/md-abi.h: increased number of JIT float argument registers to 5.
authorajordan <none@none>
Wed, 7 Mar 2007 00:32:35 +0000 (00:32 +0000)
committerajordan <none@none>
Wed, 7 Mar 2007 00:32:35 +0000 (00:32 +0000)
* src/vm/jit/sparc64/md-asm.h: likewise.
* src/vm/jit/sparc64/md-abi.c: likewise.

* src/vm/jit/sparc64/asmpart.S: added floating point argument handling in asm_vm_call.

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

index 74f7646560697719e0d4d0fb8c7afa10b27dfd22..6567e1da392e0a839b698eb49b84c4cf0369a7f9 100644 (file)
@@ -100,48 +100,52 @@ asm_vm_call_method_long:
 asm_vm_call_method_float: 
 asm_vm_call_method_double:
        
-       save %sp, -144, %sp             /* 16 reg-save + 2 */
+       save %sp,-144,%sp                                /* 16 reg-save + 2 */
 
 
-       /* todo: copy fp registers */
+       /* %i2 not needed after _nocopy -> calculate in branch delay */
 
-       brlez %i1, calljava_argsloaded
-       dec %i1
-       ldx [%i2 + offvmargdata], %o0
-       brlez %i1, calljava_argsloaded
+       brlez %i1, calljava_nocopy
+       
+       dec %i1   /* branch delay */
+       ldx [%i2 + offvmargdata],%o0
+       ldd [%i2 + offvmargdata],fa0
+       brlez %i1,calljava_nocopy
 
-       dec %i1
-       ldx [%i2 + (offvmargdata+sizevmarg*1)], %o1
-       brlez %i1, calljava_argsloaded
+       dec %i1   /* branch delay */
+       ldx [%i2 + (offvmargdata+sizevmarg*1)],%o1
+       ldd [%i2 + (offvmargdata+sizevmarg*1)],fa1
+       brlez %i1,calljava_nocopy
 
        dec %i1
-       ldx [%i2 + (offvmargdata+sizevmarg*2)], %o2
-       brlez %i1, calljava_argsloaded
+       ldx [%i2 + (offvmargdata+sizevmarg*2)],%o2
+       ldd [%i2 + (offvmargdata+sizevmarg*2)],fa2
+       brlez %i1,calljava_nocopy
 
        dec %i1
-       ldx [%i2 + (offvmargdata+sizevmarg*3)], %o3
-       brlez %i1, calljava_argsloaded
+       ldx [%i2 + (offvmargdata+sizevmarg*3)],%o3
+       ldd [%i2 + (offvmargdata+sizevmarg*3)],fa3
+       brlez %i1,calljava_nocopy
 
        dec %i1
-       ldx [%i2 + (offvmargdata+sizevmarg*4)], %o4
+       ldx [%i2 + (offvmargdata+sizevmarg*4)],%o4
+       ldd [%i2 + (offvmargdata+sizevmarg*4)],fa4
 
-       /* todo: use more out registers ? */
-
-calljava_argsloaded:
-       /* todo: stack frame layout!! */
-       
+calljava_argsloaded:   
        brlez %i1, calljava_nocopy
-       sllx %i1, 3, %l0        /* remaining args * 8           */
-       mov %sp, %l1            /* right above window save area */
-       sub %sp, %l0, %sp       /* allocate more stack space    */
+       nop
+       sllx %i1,3,%l0                     /* remaining args * 8           */
+       add %sp,16*8+bias,%l1              /* right above window save area */
+       sub %sp,%l0,%sp                    /* allocate more stack space    */
        
 calljava_copyloop:
-       ldx [%i2 + (offvmargdata+sizevmarg*5)], %l0
-       stx %l0, [%l1]
-       inc sizevmarg, %i2      /* src++                        */
-       inc 8, %l1              /* dst++                        */
-       dec %i1                 /* arg_count--                  */
-       bnz %xcc, calljava_copyloop
+       ldx [%i2 + (offvmargdata+sizevmarg*5)],%l0
+       stx %l0,[%l1]
+       inc sizevmarg,%i2                  /* src++                        */
+       subcc %i1,1,%i1                    /* arg_count--                  */
+       bnz %xcc, calljava_copyloop        /* use cc from previous instr   */
+       inc 8,%l1                          /* dst++ (delay)                */
+       
 
 calljava_nocopy:
        /* set pv, like a java method does */
@@ -203,7 +207,8 @@ asm_vm_call_method_exception_handler:
 
 asm_call_jit_compiler:
        
-       save    %sp,-208,%sp         /* regsave(16) + argslots(6) + 4 float args  */
+       /* stacksave for regsave(16) + argslots(6) + float args  */
+       save    %sp,-((16+6+FLT_ARG_CNT)*8),%sp
 
        SAVE_FLOAT_ARGUMENT_REGISTERS(22)
 
@@ -291,7 +296,7 @@ asm_handle_exception:
        mov     pv_callee,%g4
 
        /* save bigger stack frame for float args and temps */
-       save    %sp,(FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT)*8,%sp
+       save    %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT)*8),%sp
 
        SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
        SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
index 67b40e9eb3633b8c6fb1b9c2217bbfb72b660b73..68a5fe11ccb7da06fe572060d615900c9703d44f 100644 (file)
@@ -72,7 +72,7 @@ const char *abi_registers_integer_name[] = {
 
 s4 nregdescfloat[] = {
        REG_RET, REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
-       REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
+       REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_TMP, REG_TMP, REG_TMP,
        REG_END
 };
 
index 1a2e7323dbf827e2c8617d9098f38bddc1afe387..8f62e0432f27ab8072b7a9cdeaed34c5bba1b3e2 100644 (file)
@@ -69,7 +69,7 @@
 #define REG_OUT2        10
 #define REG_OUT3        11
 #define REG_OUT4        12
-#define REG_OUT5        13
+#define REG_OUT5        13   /* available only when doing a C-call            */
 
 /* floating point registers */
 /* only using the lower half of the floating registers for now */
@@ -93,8 +93,8 @@
 
 #define FLT_REG_CNT     16   /* number of float registers                     */
 #define FLT_SAV_CNT      0   /* number of flt callee saved registers          */
-#define FLT_ARG_CNT      4   /* number of flt argument registers              */
-#define FLT_TMP_CNT      8   /* number of flt temp registers                  */
+#define FLT_ARG_CNT      5   /* number of flt argument registers              */
+#define FLT_TMP_CNT      7   /* number of flt temp registers                  */
 #define FLT_RES_CNT      3   /* number of reserved float registers            */
                              /* the one "missing" register is the return reg  */
                              
index c7db522b5fa7f8f32b9608249213b65457feb2cf..e1af0541c788546c8d196ec4c09001419c0fa7dd 100644 (file)
 #define fa1     %f18
 #define fa2     %f20
 #define fa3     %f22
-#define ft7     %f24
-#define ft8     %f26
-#define ft9     %f28
-#define ft10    %f30
+#define fa4     %f24
+#define ft7     %f26
+#define ft8     %f28
+#define ft    %f30
 
 
 #define bias    2047
        std     fa0,[%sp + bias + ((0+(off))*8)] ; \
        std     fa1,[%sp + bias + ((1+(off))*8)] ; \
        std     fa2,[%sp + bias + ((2+(off))*8)] ; \
-       std     fa3,[%sp + bias + ((3+(off))*8)] ;
+       std     fa3,[%sp + bias + ((3+(off))*8)] ; \
+       std     fa4,[%sp + bias + ((4+(off))*8)] ;
 
 
 #define RESTORE_FLOAT_ARGUMENT_REGISTERS(off) \
        ldd     [%sp + bias + ((0+(off))*8)],fa0 ; \
        ldd     [%sp + bias + ((1+(off))*8)],fa1 ; \
        ldd     [%sp + bias + ((2+(off))*8)],fa2 ; \
-       ldd     [%sp + bias + ((3+(off))*8)],fa3 ;
+       ldd     [%sp + bias + ((3+(off))*8)],fa3 ; \
+       ldd     [%sp + bias + ((4+(off))*8)],fa4 ;
        
 #define SAVE_FLOAT_TEMPORARY_REGISTERS(off) \
        std     ft0,[%sp + bias + ((0+(off))*8)] ; \
        std     ft7,[%sp + bias + ((7+(off))*8)] ; \
        std     ft8,[%sp + bias + ((8+(off))*8)] ; \
        std     ft9,[%sp + bias + ((9+(off))*8)] ; \
-       std     ft10,[%sp + bias + ((10+(off))*8)] ;
 
 #define RESTORE_FLOAT_TEMPORARY_REGISTERS(off) \
        ldd     [%sp + bias + ((0+(off))*8)],ft0 ; \
        ldd     [%sp + bias + ((7+(off))*8)],ft7 ; \
        ldd     [%sp + bias + ((8+(off))*8)],ft8 ; \
        ldd     [%sp + bias + ((9+(off))*8)],ft9 ; \
-       ldd     [%sp + bias + ((10+(off))*8)],ft10 ;