.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
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) */
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 */
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
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 */
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
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
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 */
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 */
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) */
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 ??? */
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
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