X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fsparc64%2Fasmpart.S;h=30e64416f719ea624fc4234afe5ae89b78a68057;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=3afa0d92dd72bee69c80824c63dd8a2895f86192;hpb=c01eb577313baf65afb433918efd5bfbd1b09244;p=cacao.git diff --git a/src/vm/jit/sparc64/asmpart.S b/src/vm/jit/sparc64/asmpart.S index 3afa0d92d..30e64416f 100644 --- a/src/vm/jit/sparc64/asmpart.S +++ b/src/vm/jit/sparc64/asmpart.S @@ -22,17 +22,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: asmpart.S 4749 2006-04-11 10:20:18Z twisti $ - */ #include "config.h" -#include "vm/jit/sparc64/md-abi.h" -#include "offsets.h" #include "md-asm.h" +#include "vm/jit/sparc64/md-abi.h" + + .register %g2,#scratch /* define as scratch */ .register %g3,#scratch /* XXX reserve for application */ .text @@ -56,9 +55,6 @@ .global asm_abstractmethoderror - .global asm_criticalsections - .global asm_getclassvalues_atomic - .global asm_store_fp_state_reg .global asm_load_fp_state_reg @@ -67,6 +63,8 @@ * * * 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); @@ -96,67 +94,53 @@ asm_vm_call_method_long: asm_vm_call_method_float: asm_vm_call_method_double: - save %sp,-144,%sp /* 16 reg-save + 2 */ - - - /* %i2 not needed after _nocopy -> calculate in branch delay */ - - brlez %i1, calljava_nocopy + save %sp,-((JITSTACK_CNT+2)*8),%sp + add %sp,JITSTACK,%l1 /* pointer to usable stack */ + + /* i0: PV */ + /* i1: ptr to arg array */ + /* i2: num stackargs */ + + ldx [%i1+0*8],%o0 + ldx [%i1+1*8],%o1 + ldx [%i1+2*8],%o2 + ldx [%i1+3*8],%o3 + ldx [%i1+4*8],%o4 + + ldd [%i1+5*8],fa0 + ldd [%i1+6*8],fa1 + ldd [%i1+7*8],fa2 + ldd [%i1+8*8],fa3 + ldd [%i1+9*8],fa4 + + brlez %i2, calljava_nocopy + nop /* delay: fill me! */ - dec %i1 /* branch delay */ - ldx [%i2 + offvmargdata],%o0 - ldd [%i2 + offvmargdata],fa0 - brlez %i1,calljava_nocopy - - 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 - ldd [%i2 + (offvmargdata+sizevmarg*2)],fa2 - brlez %i1,calljava_nocopy - - dec %i1 - ldx [%i2 + (offvmargdata+sizevmarg*3)],%o3 - ldd [%i2 + (offvmargdata+sizevmarg*3)],fa3 - brlez %i1,calljava_nocopy - - dec %i1 - ldx [%i2 + (offvmargdata+sizevmarg*4)],%o4 - ldd [%i2 + (offvmargdata+sizevmarg*4)],fa4 - -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 */ + sllx %i2,3,%l0 /* remaining args * 8 */ sub %sp,%l0,%sp /* allocate more stack space */ + add %sp,JITSTACK,%l1 /* adjust stack begin pointer */ -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 */ +asm_vm_call_copyloop: + ldx [%i1+10*8],%l0 /* load argument from array */ + stx %l0,[%l1] /* store argument to stack */ + + inc 8,%i1 /* src++ */ + subcc %i2,1,%i2 /* arg_count-- */ + bnz %xcc, asm_vm_call_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 */ + stx %i0,[%l1 + 1*8] /* store PV on stack */ + mov %l1,mptr_itmp2 /* set address of PV (-1*8) */ - 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 */ - - ldx [1*8 + mptr_itmp2], pv_caller /* method call as in Java */ - jmpl pv_caller,ra_caller /* call JIT compiler */ + ldx [1*8 + mptr_itmp2], pv_caller /* load PV from stack */ + jmpl pv_caller,ra_caller /* method call as in Java */ nop + calljava_jit2: /* pretend to restore pv */ add ra_caller,(asm_vm_call_method - calljava_jit2 + 8),zero @@ -178,7 +162,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 */ @@ -205,7 +189,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) @@ -288,7 +273,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+16+CSTACK_CNT)*8),%sp SAVE_FLOAT_ARGUMENT_REGISTERS(CSTACK_CNT) SAVE_FLOAT_TEMPORARY_REGISTERS(CSTACK_CNT+FLT_ARG_CNT) @@ -379,10 +364,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+16+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 */ @@ -393,8 +379,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 */ @@ -419,31 +406,6 @@ L_asm_patcher_wrapper_exception: nop -asm_getclassvalues_atomic: -_crit_restart: -_crit_begin: -/* not doing a window save, using the global temporary registers */ - ldsw [offbaseval+%o0],itmp1 - ldsw [offdiffval+%o0],itmp2 - ldsw [offbaseval+%o1],itmp3 -_crit_end: - stw itmp1,[offcast_super_baseval+%o2] - stw itmp2,[offcast_super_diffval+%o2] - stw itmp3,[offcast_sub_baseval+%o2] - jmpl ra_caller+8,zero /* caller's ra, b/c no window save */ - nop - - - .data - -asm_criticalsections: -#if defined(ENABLE_THREADS) - .xword _crit_begin - .xword _crit_end - .xword _crit_restart -#endif - .xword 0 - /* asm_store_fp_state_reg ************************************************** * *