Merged revisions 7940-8026 via svnmerge from
[cacao.git] / src / vm / jit / sparc64 / asmpart.S
index c19e01e6280dc9b3438aba759e24628d944ccdd5..b135b6559702ba31b65dba3cbcb80cfb5d583360 100644 (file)
        
        .global asm_criticalsections
        .global asm_getclassvalues_atomic
+       
+       .global asm_store_fp_state_reg
+       .global asm_load_fp_state_reg
 
 
 /* asm_vm_call_method ******************************************************
  *                                                                         *
  * This function calls a Java-method (which possibly needs compilation)    *
  *
+ * If the java method is throwing an exception, NULL will be returned.
+ *
  * C-prototype:
  *  java_objectheader *asm_vm_call_method(methodinfo *m, s4 vmargscount,
  *                                              vm_arg *vmargs);
@@ -93,47 +98,82 @@ 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,-((JITSTACK_CNT+2)*8),%sp
+       add %sp,JITSTACK,%l1               /* right above window save area */
 
 
-       /* %i2 not needed after _nocopy -> calculate in branch delay */
+       /* %i1 not needed after _nocopy -> calculate in branch delay */
 
        brlez %i1, calljava_nocopy
        
        dec %i1   /* branch delay */
        ldx [%i2 + offvmargdata],%o0
+       ldx [%i2 + offvmargtype],%l2
+       cmp %l2,2
+       be,a %xcc,calljava_arg0isfloat
+       ld  [%i2 + offvmargdata],fa0f   /* delay: annulled if branch not taken */
        ldd [%i2 + offvmargdata],fa0
+calljava_arg0isfloat:
        brlez %i1,calljava_nocopy
 
        dec %i1   /* branch delay */
        ldx [%i2 + (offvmargdata+sizevmarg*1)],%o1
+       ldx [%i2 + (offvmargtype+sizevmarg*1)],%l2
+       cmp %l2,2
+       be,a %xcc,calljava_arg1isfloat
+       ld  [%i2 + (offvmargdata+sizevmarg*1)],fa1f
        ldd [%i2 + (offvmargdata+sizevmarg*1)],fa1
+calljava_arg1isfloat:
        brlez %i1,calljava_nocopy
 
        dec %i1
        ldx [%i2 + (offvmargdata+sizevmarg*2)],%o2
+       ldx [%i2 + (offvmargtype+sizevmarg*2)],%l2
+       cmp %l2,2
+       be,a %xcc,calljava_arg2isfloat
+       ld  [%i2 + (offvmargdata+sizevmarg*2)],fa2f
        ldd [%i2 + (offvmargdata+sizevmarg*2)],fa2
+calljava_arg2isfloat:
        brlez %i1,calljava_nocopy
 
        dec %i1
        ldx [%i2 + (offvmargdata+sizevmarg*3)],%o3
+       ldx [%i2 + (offvmargtype+sizevmarg*3)],%l2
+       cmp %l2,2
+       be,a %xcc,calljava_arg3isfloat
+       ld  [%i2 + (offvmargdata+sizevmarg*3)],fa3f
        ldd [%i2 + (offvmargdata+sizevmarg*3)],fa3
+calljava_arg3isfloat:
        brlez %i1,calljava_nocopy
 
        dec %i1
        ldx [%i2 + (offvmargdata+sizevmarg*4)],%o4
+       ldx [%i2 + (offvmargtype+sizevmarg*4)],%l2
+       cmp %l2,2
+       be,a %xcc,calljava_arg4isfloat
+       ld  [%i2 + (offvmargdata+sizevmarg*4)],fa4f
        ldd [%i2 + (offvmargdata+sizevmarg*4)],fa4
+calljava_arg4isfloat:
 
 calljava_argsloaded:   
        brlez %i1, calljava_nocopy
        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    */
+       add %sp,JITSTACK,%l1               /* adjust stack begin pointer   */
        
 calljava_copyloop:
+       ldx [%i2 + (offvmargtype+sizevmarg*5)],%l2
+       cmp %l2,2
+       be  %xcc,calljava_copyloop_float
+       nop
        ldx [%i2 + (offvmargdata+sizevmarg*5)],%l0
        stx %l0,[%l1]
+       b   calljava_copy_done
+calljava_copyloop_float:
+       ld  [%i2 + (offvmargdata+sizevmarg*5)],%f1      
+       std %f0,[%l1]
+calljava_copy_done:
        inc sizevmarg,%i2                  /* src++                        */
        subcc %i1,1,%i1                    /* arg_count--                  */
        bnz %xcc, calljava_copyloop        /* use cc from previous instr   */
@@ -148,8 +188,8 @@ calljava_nocopy:
        mov   %i0,itmp1         /* pass method info pointer via itmp1 */
        
        setx  asm_call_jit_compiler,%l0,mptr_itmp2  /* fake virtual function call (2 instr) */
-       stx   mptr_itmp2,[%sp + 2047 + 17*8]        /* store function address               */
-       add   %sp,2047 + 16*8,mptr_itmp2            /* set method pointer                   */
+       stx   mptr_itmp2,[%l1 + 1*8]        /* store function address               */
+       mov   %l1,mptr_itmp2            /* set method pointer                   */
        
        ldx  [1*8 + mptr_itmp2], pv_caller          /* method call as in Java               */
        jmpl pv_caller,ra_caller                      /* call JIT compiler          */
@@ -175,7 +215,7 @@ asm_vm_call_method_exception_handler:
        nop
        return  %i7 + 8                          /* implicit window restore */
 asm_vm_call_method_end:
-       nop
+       mov    zero,%o0                  /* delay: return NULL      */
        
 
 
@@ -202,7 +242,8 @@ asm_vm_call_method_end:
 asm_call_jit_compiler:
        
        /* stacksave for regsave(16) + argslots(6) + float args  */
-       save    %sp,-((16+6+FLT_ARG_CNT)*8),%sp
+       /* Note: +1 to keep stack 16-byte aligned                */
+       save    %sp,-((16+6+FLT_ARG_CNT+1)*8),%sp
 
        SAVE_FLOAT_ARGUMENT_REGISTERS(22)
 
@@ -376,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                             */
@@ -390,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                          */
@@ -416,6 +459,40 @@ L_asm_patcher_wrapper_exception:
        nop
 
 
+    
+/* asm_store_fp_state_reg **************************************************
+ *                                                                         *
+ * This function stores the 64-bit floating point state register to a      *
+ * memory location. (which needs to be 8-byte aligned)                     *
+ *                                                                         *
+ * C-prototype:                                                            *
+ *  void asm_store_fp_state_reg(u8 *mem);                                  *
+ *                                                                            *
+ **************************************************************************/
+asm_store_fp_state_reg:
+       stx %fsr,[%o0]
+       retl  /* return from leaf */
+       nop
+       
+/* asm_load_fp_state_reg ***************************************************
+ *                                                                         *
+ * This function loades the 64-bit floating point state register from a    *
+ * memory location. (which needs to be 8-byte aligned)                     *
+ *                                                                         *
+ * C-prototype:                                                            *
+ *  void asm_load_fp_state_reg(u8 *mem);                                   *
+ *                                                                            *
+ **************************************************************************/
+asm_load_fp_state_reg:
+       ldx [%o0],%fsr
+       retl  /* return from leaf */
+       nop
+
+
+
+
 asm_getclassvalues_atomic:
 _crit_restart:
 _crit_begin:
@@ -440,6 +517,25 @@ asm_criticalsections:
     .xword   _crit_restart
 #endif
     .xword   0
+    
 
+/* disable exec-stacks ********************************************************/
+
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
+#endif
 
 
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */