* Merged in twisti-branch.
[cacao.git] / src / vm / jit / sparc64 / asmpart.S
index f6f981809ed50304fe3eaed22276e599b3525a2c..cfaf31e2ab3b5742a7e43ff4ce3c093559864248 100644 (file)
@@ -53,6 +53,7 @@
        .global asm_vm_call_method_float  
        .global asm_vm_call_method_double 
        .global asm_vm_call_method_exception_handler
+       .global asm_vm_call_method_end
 
        .global asm_call_jit_compiler
 
@@ -100,51 +101,58 @@ 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
-
-       /* todo: use more out registers ? */
+       ldx [%i2 + (offvmargdata+sizevmarg*4)],%o4
+       ldd [%i2 + (offvmargdata+sizevmarg*4)],fa4
 
-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 */
+       /*      add  ra_caller,(asm_vm_call_method - calljava_nocopy + 8),pv_callee */
+       setx  asm_vm_call_method,%l0,pv_callee
+       
        mov   %i0,itmp1         /* pass method info pointer via itmp1 */
        
        setx  asm_call_jit_compiler,%l0,mptr_itmp2  /* fake virtual function call (2 instr) */
@@ -156,7 +164,7 @@ calljava_nocopy:
        nop
 calljava_jit2:
        /* pretend to restore pv */
-       add  ra_caller,(asm_vm_call_method - calljava_jit2 + 8),pv_callee
+       add  ra_caller,(asm_vm_call_method - calljava_jit2 + 8),zero
        
 calljava_return:
        mov %o0, %i0            /* pass on the return value     */
@@ -166,10 +174,15 @@ calljava_return:
 
 asm_vm_call_method_exception_handler:
        
-       mov             itmp1,%o0
+       /* so far this function did not call any c functions */
+       /* but now we need ABI compliant argslots on the stack */
+       sub   %sp,6*8,%sp
+       
+       mov             xptr_itmp2,%o0
        call    builtin_throw_exception
        nop
        return  %i7 + 8                          /* implicit window restore */
+asm_vm_call_method_end:
        nop
        
 
@@ -196,9 +209,10 @@ asm_vm_call_method_exception_handler:
 
 asm_call_jit_compiler:
        
-       save    %sp,-160,%sp         /* regsave + 4 slots for float args          */
+       /* stacksave for regsave(16) + argslots(6) + float args  */
+       save    %sp,-((16+6+FLT_ARG_CNT)*8),%sp
 
-       SAVE_FLOAT_ARGUMENT_REGISTERS(16)
+       SAVE_FLOAT_ARGUMENT_REGISTERS(22)
 
        mov     itmp1,%o0             /* pass methodinfo pointer                  */
        mov     mptr_itmp2,%o1        /* pass method pointer                      */
@@ -208,36 +222,40 @@ asm_call_jit_compiler:
        call    jit_asm_compile       /* call jit compiler                        */
        nop
        
-       RESTORE_FLOAT_ARGUMENT_REGISTERS(16)
+       RESTORE_FLOAT_ARGUMENT_REGISTERS(22)
+
+       brz     %o0,L_asm_call_jit_compiler_exception
+       nop
        
        restore %o0,%g0,pv_caller     /* restore the callers window               */
                                      /* the source o0 references the old window  */
                                      /* pv_caller references the new window      */
 
 
-
-       brz     pv_caller,L_asm_call_jit_compiler_exception
-       nop
-
        /* synchronise instruction cache moved somewhere else           */
 
        jmpl    pv_caller,zero        /* and call method, the method returns      */
-                                     /* directly to the caller (ra).             */    
+                                     /* directly to the caller (ra).             */
+       nop     
        
 L_asm_call_jit_compiler_exception:
-       /* no need to do a save, only ra needs to be preserved */
+       /* window still open, ra_callee valid, pv_callee undefined      */
 
-       /* we save ra in one of the application globals */
-       mov     ra_caller,xpc_itmp3   /* save return address (xpc)                */
-       
-       call    exceptions_get_and_clear_exception
+       /* get pv for further exception handling */
+       mov     ra_callee,%o0   
+       call    md_codegen_get_pv_from_pc   /* get PV from RA                     */
        nop
+       mov     %o0,pv_callee
 
-       mov     xpc_itmp3,ra_caller   /* restore return address (xpc)             */
+       call    exceptions_get_and_clear_exception
+       nop
 
        mov     %o0,xptr_itmp2        /* get exception                            */
-       sub     ra_caller,4,xpc_itmp3 /* exception address is ra - 4              */
-       ba      L_asm_handle_nat_exception
+       mov     ra_callee,xpc_itmp3 /* exception address is ra               */
+
+       /* don't restore callers window, behave like java non-leaf */
+
+       b      L_asm_handle_nat_exception
        nop
 
 
@@ -257,7 +275,7 @@ asm_handle_nat_exception:
 L_asm_handle_nat_exception:       /* required for PIC code                    */
 L_asm_handle_exception_stack_loop:
        /* exception handling assumes that the current java method saved       */
-       /* the caller's window                                                 */
+       /* the caller's window, and has a valid pv                             */
 
        /* get ra and pv before saving the window */
        mov     ra_callee,itmp1
@@ -273,14 +291,17 @@ L_asm_handle_exception_stack_loop:
        mov     %g4,%o2                     /* pass PV                            */
        mov     %fp,%o3                     /* pass Java SP                       */
 
+       b       L_asm_handle_exception_continue
+       nop
+
 asm_handle_exception:
        mov     pv_callee,%g4
 
        /* save bigger stack frame for float args and temps */
-       save    %sp,(FLT_ARG_CNT+FLT_TMP_CNT+ABICALL_OFF)*8,%sp
+       save    %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT)*8),%sp
 
-       SAVE_FLOAT_ARGUMENT_REGISTERS(ABICALL_OFF)
-       SAVE_FLOAT_TEMPORARY_REGISTERS(ABICALL_OFF+FLT_ARG_CNT)
+       SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
+       SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
 
        mov     xptr_itmp2,%l0              /* save exception pointer             */
        add     zero,1,%l2                  /* set maybe-leaf flag                */
@@ -292,21 +313,25 @@ asm_handle_exception:
 
 L_asm_handle_exception_continue:
        call    exceptions_handle_exception
+       nop
 
        brz     %o0,L_asm_handle_exception_not_caught
+       nop
 
        mov     %o0,xpc_itmp3               /* move handlerpc into xpc            */
        mov     %l0,xptr_itmp2              /* restore exception pointer          */
 
        brz     %l2,L_asm_handle_exception_no_leaf
+       nop
 
-       RESTORE_FLOAT_ARGUMENT_REGISTERS(ABICALL_OFF)
-       RESTORE_FLOAT_TEMPORARY_REGISTERS(ABICALL_OFF+FLT_ARG_CNT)
+       RESTORE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
+       RESTORE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
        
 L_asm_handle_exception_no_leaf:
        /* restore java window and stackframe (ra and pv are in there) */
        restore
        jmpl    xpc_itmp3, zero             /* jump to the handler                */
+       nop
 
 L_asm_handle_exception_not_caught:
        mov     %l0,xptr_itmp2              /* restore xptr                       */
@@ -315,7 +340,7 @@ L_asm_handle_exception_not_caught:
        
        restore                             /* unwind stack and window            */
        ba      L_asm_handle_exception_stack_loop
-       mov     xpc_itmp3,ra_caller         /* the new xpc is ra (delay)          */
+       mov     ra_caller,xpc_itmp3         /* the new xpc is ra (delay)          */
        
 
 
@@ -333,10 +358,12 @@ asm_abstractmethoderror:
        mov     %fp,%o0                     /* pass java sp(==fp)                 */
        mov     ra_callee,%o1               /* pass exception address             */
        call    exceptions_asm_new_abstractmethoderror
+       nop
 
        mov     %o0,xptr_itmp2              /* get exception pointer              */
        sub     ra_callee,4,xpc_itmp3       /* exception address is ra - 4        */
        ba      L_asm_handle_nat_exception
+       nop
 
        /* XXX: leave the register window open for handle_exception ??? */
 
@@ -357,44 +384,46 @@ asm_abstractmethoderror:
                
 
 asm_patcher_wrapper:
-       /* get pv and ra from current window */
-       mov     ra_callee,temp4
-       mov     pv_callee,temp5
+       /* get pv and ra, since the emit code is not passing it on */
+       mov     ra_callee,ra_caller
+       mov     pv_callee,pv_caller
 
        /* create window and stack frame              */
-       save  %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+ABICALL_OFF+4)*8),%sp
+       save  %sp,-((FLT_ARG_CNT+FLT_TMP_CNT+CSTACK_CNT+4)*8),%sp
 
-       SAVE_FLOAT_ARGUMENT_REGISTERS(ABICALL_OFF)
-       SAVE_FLOAT_TEMPORARY_REGISTERS(ABICALL_OFF+FLT_ARG_CNT)
+       SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
+       SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
 
        mov     itmp1,%l0               /* save itmp1                             */
        mov     itmp2,%l1               /* save itmp2                             */
 
-       add     %fp,USESTACK,%o0      /* pass pseudo SP                           */
-       mov     temp5,%o1             /* pass PV                                  */
-       mov     temp4,%o2             /* pass RA (correct for leafs)              */
+       add     %fp,JITSTACK,%o0      /* pass pseudo SP                           */
+       mov     pv_callee,%o1         /* pass PV                                  */
+       mov     ra_callee,%o2         /* pass RA (correct for leafs)              */
        call    patcher_wrapper
        nop
 
-       RESTORE_FLOAT_ARGUMENT_REGISTERS(ABICALL_OFF)
-       RESTORE_FLOAT_ARGUMENT_REGISTERS(ABICALL_OFF+FLT_ARG_CNT)
+       RESTORE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT)
+       RESTORE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT)
 
        mov     %l0,itmp1               /* restore itmp1                          */
        mov     %l1,itmp2               /* restore itmp2                          */
 
        brnz    %o0,L_asm_patcher_wrapper_exception
+       nop
 
        /* load RA (patch position from patcher data on the stack */
-       ldx     [%fp+USESTACK+5*8],itmp3
+       ldx     [%fp+JITSTACK+5*8],itmp3
 
        /* remove window and stack frame (and stack space allocated in the stub code */
        restore  %fp,6*8,%sp /* (source regs refer to old window, rd to new window)  */
 
        jmpl     itmp3,zero              /* jump to newly patched code               */
+       nop
 
 L_asm_patcher_wrapper_exception:
-       mov      itmp3,xptr_itmp2      /* get exception                            */
-       ldx      [%fp+USESTACK+5*8],xpc_itmp3 /* xpc is RA                         */
+       mov      %o0,xptr_itmp2        /* get exception                            */
+       ldx      [%fp+JITSTACK+5*8],xpc_itmp3 /* xpc is RA                         */
        restore  %fp,6*8,%sp           /* remove stack frame                       */
        ba       asm_handle_exception
        nop
@@ -411,9 +440,8 @@ _crit_end:
        stw     itmp1,[offcast_super_baseval+%o2]
        stw     itmp2,[offcast_super_diffval+%o2]
        stw     itmp3,[offcast_sub_baseval+%o2]
-       jmpl    ra_caller,zero  /* caller's ra, b/c no window save */
-
-       .end    asm_getclassvalues_atomic
+       jmpl    ra_caller+8,zero  /* caller's ra, b/c no window save */
+       nop
 
 
     .data