Changes: Joseph Wenninger
Christian Thalinger
- $Id: asmpart.S 2399 2005-04-27 12:53:03Z twisti $
+ $Id: asmpart.S 2992 2005-07-11 21:52:07Z twisti $
*/
#include "config.h"
#include "vm/jit/alpha/offsets.h"
#include "vm/jit/alpha/asmoffsets.h"
-
-
-#define v0 $0
-
-#define t0 $1
-#define t1 $2
-#define t2 $3
-#define t3 $4
-#define t4 $5
-#define t5 $6
-#define t6 $7
-#define t7 $8
-
-#define s0 $9
-#define s1 $10
-#define s2 $11
-#define s3 $12
-#define s4 $13
-#define s5 $14
-#define s6 $15
-
-#define a0 $16
-#define a1 $17
-#define a2 $18
-#define a3 $19
-#define a4 $20
-#define a5 $21
-
-#define t8 $22
-#define t9 $23
-#define t10 $24
-#define t11 $25
-#define ra $26
-#define t12 $27
-
-#define pv t12
-#define AT $at
-#define gp $29
-#define sp $30
-#define zero $31
-
-#define itmp1 t11
-#define itmp2 $28
-#define itmp3 gp
-
-#define xptr itmp1
-#define xpc itmp2
-
-
-#define ft0 $f1
-
-#define fs0 $f2
-#define fs1 $f3
-#define fs2 $f4
-#define fs3 $f5
-#define fs4 $f6
-#define fs5 $f7
-#define fs6 $f8
-#define fs7 $f9
-
-#define ft1 $f10
-#define ft2 $f11
-#define ft3 $f12
-#define ft4 $f13
-#define ft5 $f14
-#define ft6 $f15
-
-#define fa0 $f16
-#define fa1 $f17
-#define fa2 $f18
-#define fa3 $f19
-#define fa4 $f20
-#define fa5 $f21
-
-#define ft7 $f22
-#define ft8 $f23
-#define ft9 $f24
-#define ft10 $f25
-#define ft11 $f26
-#define ft12 $f27
-#define ft13 $f28
-#define ft14 $f29
-#define ft15 $f20
-
-#define fzero $f31
-
-#define ftmp1 ft13
-#define ftmp2 ft14
-#define ftmp3 ft15
-
-#define PAL_imb 0x86
-
-
-/* save and restore macros ****************************************************/
-
-#define SAVE_ARGUMENT_REGISTERS(off) \
- stq a0,(0+(off))*8(sp) ; \
- stq a1,(1+(off))*8(sp) ; \
- stq a2,(2+(off))*8(sp) ; \
- stq a3,(3+(off))*8(sp) ; \
- stq a4,(4+(off))*8(sp) ; \
- stq a5,(5+(off))*8(sp) ; \
- \
- stt fa0,(6+(off))*8(sp) ; \
- stt fa1,(7+(off))*8(sp) ; \
- stt fa2,(8+(off))*8(sp) ; \
- stt fa3,(9+(off))*8(sp) ; \
- stt fa4,(10+(off))*8(sp) ; \
- stt fa5,(11+(off))*8(sp) ;
-
-#define RESTORE_ARGUMENT_REGISTERS(off) \
- ldq a0,(0+(off))*8(sp) ; \
- ldq a1,(1+(off))*8(sp) ; \
- ldq a2,(2+(off))*8(sp) ; \
- ldq a3,(3+(off))*8(sp) ; \
- ldq a4,(4+(off))*8(sp) ; \
- ldq a5,(5+(off))*8(sp) ; \
- \
- ldt fa0,(6+(off))*8(sp) ; \
- ldt fa1,(7+(off))*8(sp) ; \
- ldt fa2,(8+(off))*8(sp) ; \
- ldt fa3,(9+(off))*8(sp) ; \
- ldt fa4,(10+(off))*8(sp) ; \
- ldt fa5,(11+(off))*8(sp) ;
-
-#define SAVE_TEMPORARY_REGISTERS(off) \
- stq t0,(0+(off))*8(sp) ; \
- stq t1,(1+(off))*8(sp) ; \
- stq t2,(2+(off))*8(sp) ; \
- stq t3,(3+(off))*8(sp) ; \
- stq t4,(4+(off))*8(sp) ; \
- stq t5,(5+(off))*8(sp) ; \
- stq t6,(6+(off))*8(sp) ; \
- stq t7,(7+(off))*8(sp) ; \
- stq t8,(8+(off))*8(sp) ; \
- stq t9,(9+(off))*8(sp) ; \
- stq t10,(10+(off))*8(sp) ; \
- \
- stt ft0,(11+(off))*8(sp) ; \
- stt ft1,(12+(off))*8(sp) ; \
- stt ft2,(13+(off))*8(sp) ; \
- stt ft3,(14+(off))*8(sp) ; \
- stt ft4,(15+(off))*8(sp) ; \
- stt ft5,(16+(off))*8(sp) ; \
- stt ft6,(17+(off))*8(sp) ; \
- stt ft7,(18+(off))*8(sp) ; \
- stt ft8,(19+(off))*8(sp) ; \
- stt ft9,(20+(off))*8(sp) ; \
- stt ft10,(21+(off))*8(sp) ; \
- stt ft11,(22+(off))*8(sp) ; \
- stt ft12,(23+(off))*8(sp) ; \
- stt ft13,(24+(off))*8(sp) ; \
- stt ft14,(25+(off))*8(sp) ; \
- stt ft15,(26+(off))*8(sp) ;
-
-
-#define RESTORE_TEMPORARY_REGISTERS(off) \
- ldq t0,(0+(off))*8(sp) ; \
- ldq t1,(1+(off))*8(sp) ; \
- ldq t2,(2+(off))*8(sp) ; \
- ldq t3,(3+(off))*8(sp) ; \
- ldq t4,(4+(off))*8(sp) ; \
- ldq t5,(5+(off))*8(sp) ; \
- ldq t6,(6+(off))*8(sp) ; \
- ldq t7,(7+(off))*8(sp) ; \
- ldq t8,(8+(off))*8(sp) ; \
- ldq t9,(9+(off))*8(sp) ; \
- ldq t10,(10+(off))*8(sp) ; \
- \
- ldt ft0,(11+(off))*8(sp) ; \
- ldt ft1,(12+(off))*8(sp) ; \
- ldt ft2,(13+(off))*8(sp) ; \
- ldt ft3,(14+(off))*8(sp) ; \
- ldt ft4,(15+(off))*8(sp) ; \
- ldt ft5,(16+(off))*8(sp) ; \
- ldt ft6,(17+(off))*8(sp) ; \
- ldt ft7,(18+(off))*8(sp) ; \
- ldt ft8,(19+(off))*8(sp) ; \
- ldt ft9,(20+(off))*8(sp) ; \
- ldt ft10,(21+(off))*8(sp) ; \
- ldt ft11,(22+(off))*8(sp) ; \
- ldt ft12,(23+(off))*8(sp) ; \
- ldt ft13,(24+(off))*8(sp) ; \
- ldt ft14,(25+(off))*8(sp) ; \
- ldt ft15,(26+(off))*8(sp) ;
+#include "vm/jit/alpha/md-asm.h"
.text
.globl asm_calljavafunction2double
.globl asm_call_jit_compiler
- .globl asm_throw_and_handle_exception
- .globl asm_throw_and_handle_nat_exception
- .globl asm_throw_and_handle_arithmetic_exception
- .globl asm_throw_and_handle_arrayindexoutofbounds_exception
.globl asm_handle_exception
.globl asm_handle_nat_exception
.globl asm_wrapper_patcher
- .globl asm_builtin_checkarraycast
- .globl asm_builtin_aastore
-
- .globl asm_builtin_idiv
- .globl asm_builtin_irem
- .globl asm_builtin_ldiv
- .globl asm_builtin_lrem
-
.globl asm_perform_threadswitch
.globl asm_initialize_thread_stack
.globl asm_switchstackandcall
.globl asm_criticalsections
.globl asm_getclassvalues_atomic
- .globl asm_prepare_native_stackinfo
- .globl asm_remove_native_stackinfo
- .globl asm_refillin_and_handle_exception
/* asm_sync_instruction_cache **************************************************
mov a3,a2
mov a4,a3
- lda $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
- stq $28,8(sp) /* store function address */
- mov sp,$28 /* set method pointer */
+ lda itmp2,asm_call_jit_compiler/* fake virtual function call (2 instr)*/
+ stq itmp2,8(sp) /* store function address */
+ mov sp,itmp2 /* set method pointer */
- ldq pv,8($28) /* method call as in Java */
+ ldq pv,8(itmp2) /* method call as in Java */
jmp ra,(pv) /* call JIT compiler */
calljava_jit:
- lda pv,-64(ra) /* asm_calljavafunction-calljava_jit !!!!!*/
+ lda pv,(asm_calljavafunction - calljava_jit)(ra)
calljava_return:
ldq ra,0(sp) /* restore return address */
.quad calljava_xhandler2 /* end pc */
.quad asm_calljavafunction2 /* start pc */
.long 1 /* extable size */
- .long 0 /* PADDING */
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
- .long 0 /* PADDING */
+ .long 0 /* PADDING */
+ .quad 0 /* line number table start */
+ .quad 0 /* line number table size */
+ .long 0 /* PADDING */
.long 0 /* fltsave */
.long 1 /* intsave */
.long 0 /* isleaf */
asm_calljavafunction2float:
asm_calljavafunction2double:
ldgp gp,0(pv)
- lda sp,-40(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- stq s6,24(sp)
- stq gp,8(sp) /* save global pointer */
+ lda sp,-5*8(sp) /* allocate stack space */
+ stq ra,0*8(sp) /* save return address */
+ stq gp,1*8(sp) /* save global pointer */
+ stq s6,3*8(sp)
- stq a0,32(sp) /* save method pointer for compiler */
+ stq a0,4*8(sp) /* save method pointer for compiler */
mov a3,t0 /* pointer to arg block */
mov a1,s6 /* arg count */
ldq a0,offjniitem(t0)
ldt $f16,offjniitem(t0)
ble s6,calljava_argsloaded
+
lda s6,-1(s6)
ldq a1,offjniitem+sizejniblock*1(t0)
ldt $f17,offjniitem+sizejniblock*1(t0)
ble s6,calljava_argsloaded
+
lda s6,-1(s6)
ldq a2,offjniitem+sizejniblock*2(t0)
ldt $f18,offjniitem+sizejniblock*2(t0)
ble s6,calljava_argsloaded
+
lda s6,-1(s6)
ldq a3,offjniitem+sizejniblock*3(t0)
ldt $f19,offjniitem+sizejniblock*3(t0)
ble s6,calljava_argsloaded
+
lda s6,-1(s6)
ldq a4,offjniitem+sizejniblock*4(t0)
ldt $f20,offjniitem+sizejniblock*4(t0)
ble s6,calljava_argsloaded
+
lda s6,-1(s6)
ldq a5,offjniitem+sizejniblock*5(t0)
ldt $f21,offjniitem+sizejniblock*5(t0)
bne t1,calljava_copyloop
calljava_nocopy:
- lda v0,32(t4) /* pass pointer to method pointer via v0*/
+ lda v0,4*8(t4) /* pass pointer to method pointer via v0*/
- lda $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
- stq $28,16(t4) /* store function address */
- lda $28,8(t4) /* set method pointer */
+ lda itmp2,asm_call_jit_compiler/* fake virtual function call (2 instr)*/
+ stq itmp2,16(t4) /* store function address */
+ lda itmp2,8(t4) /* set method pointer */
- ldq pv,8($28) /* method call as in Java */
+ ldq pv,8(itmp2) /* method call as in Java */
jmp ra,(pv) /* call JIT compiler */
calljava_jit2:
- lda pv,-200(ra) /* asm_calljavafunction-calljava_jit !!!*/
+ lda pv,(asm_calljavafunction2 - calljava_jit2)(ra)
s8addq s6,sp,sp
calljava_return2:
- ldq ra,0(sp) /* restore return address */
- ldq gp,8(sp) /* restore global pointer */
- ldq s6,24(sp)
- lda sp,40(sp) /* free stack space */
+ ldq ra,0*8(sp) /* restore return address */
+ ldq gp,1*8(sp) /* restore global pointer */
+ ldq s6,3*8(sp)
+ lda sp,5*8(sp) /* free stack space */
calljava_ret2:
jmp zero,(ra)
calljava_xhandler2:
s8addq s6,sp,sp
- ldq gp,8(sp) /* restore global pointer */
+ ldq gp,1*8(sp) /* restore global pointer */
mov itmp1,a0
jsr ra,builtin_throw_exception
- ldq ra,0(sp) /* restore return address */
- ldq s6,24(sp)
- lda sp,40(sp) /* free stack space */
+ ldq ra,0*8(sp) /* restore return address */
+ ldq s6,3*8(sp)
+ lda sp,5*8(sp) /* free stack space */
mov zero,v0 /* return NULL */
jmp zero,(ra)
+
.end asm_calljavafunction2
ldq ra,13*8(sp) /* load return address */
lda sp,14*8(sp) /* deallocate stack area */
- beq v0,asm_call_jit_compiler_exception
+ beq v0,L_asm_call_jit_compiler_exception
ldl t8,-8(ra) /* load instruction LDQ PV,xxx($yy) */
sll t8,48,t8
jmp zero,(pv) /* and call method. The method returns */
/* directly to the caller (ra). */
-asm_call_jit_compiler_exception:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+L_asm_call_jit_compiler_exception:
subq sp,1*8,sp
stq ra,0*8(sp)
- jsr ra,builtin_asm_get_exceptionptrptr
+
+ mov zero,a0 /* fill in the correct stacktrace */
+ lda a1,1*8(sp) /* pass sp of parent Java function */
+ mov ra,a2 /* pass ra to parent Java function */
+ mov ra,a3 /* xpc is the same as ra */
+ jsr ra,stacktrace_extern_fillInStackTrace
+ mov v0,xptr
+
ldq ra,0*8(sp)
addq sp,1*8,sp
-#else
- lda v0,_exceptionptr
-#endif
- ldq xptr,0(v0) /* get the exception pointer */
- stq zero,0(v0) /* clear the exception pointer */
subq ra,4,xpc
br asm_handle_nat_exception
.end asm_call_jit_compiler
-/**************** function asm_refillin_and_handle_exception *******************
-* *
-* This function handles an exception. It does not use the usual calling *
-* conventions. The exception is passed in REG_ITMP1 and the *
-* pc from the exception raising position is passed in REG_ITMP2. *
-* a0 contains the PV of the function causing the problem *
-* *
-* void asm_handle_arithmetic_exception (exceptionclass, exceptionpc); *
-* *
-*******************************************************************************/
- .ent asm_refillin_and_handle_exception
-asm_refillin_and_handle_exception:
- ldgp gp,0(pv)
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0, asm_refillin_and_handle_exception_cont
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
-
-asm_refillin_and_handle_exception_cont:
-
- mov sp,t0
- lda sp,-6*8(sp) /* prepare stackframe*/
- stq pv,5*8(sp) /* store pv of caller */
- stq xptr,4*8(sp) /*exception ptr*/
- stq xpc,3*8(sp) /*address of failure*/
- stq t0,2*8(sp) /*begin of java stack frame*/
- stq pv,1*8(sp) /* store pv of caller */
- stq zero,0*8(sp) /*builtin (invisible) function */
- jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
- ldgp gp,0(ra)
-
- ldq a2,utf_void__java_lang_Throwable
- ldq a1,utf_fillInStackTrace
- ldq t0,6*8(sp)
- ldq t1,offobjvftbl(t0)
- ldq a0,offclass(t1)
- jsr ra,class_resolvemethod
- ldgp gp,0(ra)
- /* now we have the method */
-
- /*refillin */
- mov v0,a0
- ldq a1,6*8(sp)
- jsr ra,asm_calljavafunction
- ldgp gp,0(ra)
-
- /*remove frame*/
- jsr ra,asm_remove_native_stackinfo
- ldgp gp,0(ra)
-
-
- /*finish*/
- ldq xpc,0(sp)
- ldq xptr,1*8(sp)
- ldq pv,2*8(sp)
- lda sp,3*8(sp)
- br asm_handle_exception
-
- .end asm_refillin_and_handle_exception
-
-/****** function asm_throw_and_handle_arrayindexoutofbounds_exception **********
-* *
-* This function handles an exception. It does not use the usual calling *
-* conventions. The integer parameter is passed in REG_ITMP1 and the *
-* pc from the exception raising position is passed in REG_ITMP2. *
-* *
-* void asm_handle_arithmetic_exception (exceptionclass, exceptionpc); *
-* *
-*******************************************************************************/
-
- .ent asm_throw_and_handle_arrayindexoutofbounds_exception
-
-asm_throw_and_handle_arrayindexoutofbounds_exception:
- ldgp gp,0(pv)
-
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,asm_throw_and_handle_arrayindexoutofbounds_exception_cont
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
-
-asm_throw_and_handle_arrayindexoutofbounds_exception_cont:
- mov sp,t0
- lda sp,-6*8(sp) /*prepare stackframe*/
- stq pv,5*8(sp) /*pv of failure*/
- stq itmp1,4*8(sp) /*int parameter of the exception*/
- stq xpc,3*8(sp) /*address of failure */
- stq t0,2*8(sp) /*store begin of java stack frame*/
- stq pv,1*8(sp) /*store pv of caller in structure*/
- stq zero,0*8(sp) /*builtin (invisible function)*/
-
- jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
- ldgp gp,0(ra)
-
- ldq a0,6*8(sp) /*int of exception*/
- jsr ra,new_arrayindexoutofboundsexception
- ldgp gp,0(ra)
-
- mov v0,itmp1 /*itmp1 is not touched in asm_remove_native_stackinfo*/
-
- jsr ra,asm_remove_native_stackinfo
- ldgp gp,0(ra)
-
- ldq itmp2,0(sp)
- ldq pv,2*8(sp)
- lda sp,3*8(sp)
- br asm_handle_exception
-
- .end asm_throw_and_handle_arrayindexoutofbounds_exception
-
-
-/* asm_throw_and_handle_arithmetic_exception ***********************************
-
- DOCUMENT ME!
-
-*******************************************************************************/
-
- .ent asm_throw_and_handle_arithmetic_exception
-
-asm_throw_and_handle_arithmetic_exception:
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,asm_throw_and_handle_arithmetic_exception_cont
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
-
-asm_throw_and_handle_arithmetic_exception_cont:
- mov sp,t0
- lda sp,-6*8(sp) /*prepare stackframe*/
- stq pv,5*8(sp) /*pv of failure*/
- stq itmp1,4*8(sp) /*exception string of the exception*/
- stq xpc,3*8(sp) /*address of failure */
- stq t0,2*8(sp) /*store begin of java stack frame*/
- stq pv,1*8(sp) /*store pv of caller in structure*/
- stq zero,0*8(sp) /*builtin (invisible function)*/
- jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
- ldgp gp,0(ra)
-
- jsr ra,new_arithmeticexception
- ldgp gp,0(ra)
- mov v0,itmp1 /*itmp1 is not touched in asm_remove_native_stackinfo*/
-
- jsr ra,asm_remove_native_stackinfo
- ldgp gp,0(ra)
-
- ldq itmp2,0(sp)
- ldq pv,2*8(sp)
- lda sp,3*8(sp)
- br asm_handle_exception
-
- .end asm_throw_and_handle_arithmetic_exception
-
-
-/* asm_throw_and_handle_exception **********************************************
-
- DOCUMENT ME!!!
-
-*******************************************************************************/
-
- .ent asm_throw_and_handle_nat_exception
-
-asm_throw_and_handle_nat_exception:
- ldgp gp,0(pv)
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,asm_throw_and_handle_exception
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
-
- .aent asm_throw_and_handle_exception
-
-asm_throw_and_handle_exception:
- mov sp,t0
- lda sp,-6*8(sp) /* prepare stackframe */
- stq pv,5*8(sp) /* pv of failure */
- stq xptr,4*8(sp) /* classname of the exception */
- stq xpc,3*8(sp) /* address of failure */
- stq t0,2*8(sp) /* store begin of java stack frame */
- stq pv,1*8(sp) /* store pv of caller in structure */
- stq zero,0*8(sp) /* builtin (invisible function) */
- /* puts 2 additional quadwords on stack */
-
- br ra,L_asm_throw_and_handle_exception_load_gp
-L_asm_throw_and_handle_exception_load_gp:
- ldgp gp,0(ra) /* load gp (it's not set correctly in jit) */
-
- jsr ra,asm_prepare_native_stackinfo
- ldgp gp,0(ra)
-
- ldq a0,6*8(sp) /* classname of exception */
- jsr ra,new_exception
- ldgp gp,0(ra)
-
- mov v0,xptr /* xptr (itmp1) is not touched in */
- /* asm_remove_native_stackinfo */
-
- jsr ra,asm_remove_native_stackinfo
- ldgp gp,0(ra)
-
- ldq itmp2,0(sp)
- ldq pv,2*8(sp)
- lda sp,3*8(sp)
- br asm_handle_exception
-
- .end asm_throw_and_handle_nat_exception
-
-
/********************* function asm_handle_exception ***************************
* *
* This function handles an exception. It does not use the usual calling *
XXX
Stack layout:
- 24 return address into JIT code (patch position)
+ 32 return address into JIT code (patch position)
+ 24 pointer to virtual java_objectheader
16 machine code (which is patched back later)
8 unresolved class/method/field reference
- 0 patcher function pointer to call
+ 0 patcher function pointer to call (pv afterwards)
ATTENTION: itmp3 == gp! But we don't need gp do call the patcher function.
.ent asm_wrapper_patcher
asm_wrapper_patcher:
- lda sp,-(12+27+4)*8(sp) /* create stack frame */
+ lda sp,-((12+27+4)*8+sizestackframeinfo)(sp) /* create stack frame */
SAVE_ARGUMENT_REGISTERS(0) /* save 6 int/6 float argument registers */
SAVE_TEMPORARY_REGISTERS(12) /* save 11 int/16 float temporary registers */
stq ra,(12+27+2)*8(sp) /* save method return address (for leafs) */
stq pv,(12+27+3)*8(sp) /* save pv of calling java function */
- lda a0,(1+12+27+4)*8(sp) /* pass sp, skip patcher function pointer */
- ldq pv,(0+12+27+4)*8(sp) /* get function pointer */
+ br ra,L_asm_wrapper_patcher_load_gp
+L_asm_wrapper_patcher_load_gp:
+ ldgp gp,0(ra) /* load gp (it's not set correctly in jit) */
+
+ lda a0,(12+27+4)*8(sp) /* create stackframe info */
+ mov pv,a1 /* pass java pv */
+ lda a2,((5+12+27+4)*8+sizestackframeinfo)(sp) /* pass java sp */
+ ldq a3,(12+27+2)*8(sp) /* this is correct for leafs */
+ ldq a4,((4+12+27+4)*8+sizestackframeinfo)(sp) /* pass xpc */
+ jsr ra,stacktrace_create_extern_stackframeinfo
+ ldgp gp,0(ra)
+
+ lda a0,((0+12+27+4)*8+sizestackframeinfo)(sp) /* pass sp */
+ ldq pv,((0+12+27+4)*8+sizestackframeinfo)(sp) /* get function pointer */
+ ldq itmp1,(12+27+3)*8(sp) /* save pv to the position of fp */
+ stq itmp1,((0+12+27+4)*8+sizestackframeinfo)(sp)
jmp ra,(pv) /* call the patcher function */
ldgp gp,0(ra)
-
+
+ lda a0,(12+27+4)*8(sp) /* remove stackframe info */
+ jsr ra,stacktrace_remove_stackframeinfo
+ ldgp gp,0(ra)
+
RESTORE_ARGUMENT_REGISTERS(0) /* restore 6 int/6 float argument registers */
RESTORE_TEMPORARY_REGISTERS(12)/* restore 11 integer temporary registers */
ldq ra,(12+27+2)*8(sp) /* restore method return address (for leafs)*/
ldq pv,(12+27+3)*8(sp) /* restore pv of calling java function */
- ldq itmp3,(3+12+27+4)*8(sp)/* get return address (into JIT code) */
- lda sp,(4+12+27+4)*8(sp) /* remove stack frame */
+ ldq itmp3,((4+12+27+4)*8+sizestackframeinfo)(sp)/* get RA to jit code */
+ lda sp,((5+12+27+4)*8+sizestackframeinfo)(sp) /* remove stack frame */
beq v0,L_asm_wrapper_patcher_exception
.end asm_wrapper_patcher
-/************************ function asm_builtin_idiv ****************************
-* *
-* Does null check and calls idiv or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_idiv
-
-asm_builtin_idiv:
- ldgp gp,0(pv)
- lda pv,builtin_idiv
- beq a1,nb_idiv /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_idiv */
-
-nb_idiv:
- ldq xptr,string_java_lang_ArithmeticException_message
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_throw_and_handle_arithmetic_exception
-
- .end asm_builtin_idiv
-
-
-/************************ function asm_builtin_ldiv ****************************
-* *
-* Does null check and calls ldiv or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_ldiv
-
-asm_builtin_ldiv:
- ldgp gp,0(pv)
- lda pv,builtin_ldiv
- beq a1,nb_ldiv /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_ldiv */
-
-nb_ldiv:
- ldq xptr,string_java_lang_ArithmeticException_message
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_throw_and_handle_arithmetic_exception
-
- .end asm_builtin_ldiv
-
-
-/************************ function asm_builtin_irem ****************************
-* *
-* Does null check and calls irem or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_irem
-
-asm_builtin_irem:
- ldgp gp,0(pv)
- lda pv,builtin_irem
- beq a1,nb_irem /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_irem */
-
-nb_irem:
- ldq xptr,string_java_lang_ArithmeticException_message
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_throw_and_handle_arithmetic_exception
-
- .end asm_builtin_irem
-
-
-/************************ function asm_builtin_lrem ****************************
-* *
-* Does null check and calls lrem or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_lrem
-
-asm_builtin_lrem:
- ldgp gp,0(pv)
- lda pv,builtin_lrem
- beq a1,nb_lrem /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_lrem */
-
-nb_lrem:
- ldq xptr,string_java_lang_ArithmeticException_message
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_throw_and_handle_arithmetic_exception
-
- .end asm_builtin_lrem
-
-
-/******************* function asm_builtin_checkarraycast ***********************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_checkarraycast
-
-asm_builtin_checkarraycast:
- ldgp gp,0(pv)
- lda sp,-16(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- stq a0,8(sp) /* save object pointer */
- jsr ra,builtin_checkarraycast /* builtin_checkarraycast */
- ldgp gp,0(ra)
- beq v0,nb_carray_throw /* if (false) throw exception */
- ldq ra,0(sp) /* restore return address */
- ldq v0,8(sp) /* return object pointer */
- lda sp,16(sp) /* free stack space */
- jmp zero,(ra)
-
-nb_carray_throw:
- ldq ra,0(sp)
- lda sp,16(sp)
- lda xpc,-4(ra)
- ldq xptr,string_java_lang_ClassCastException
- jmp zero,asm_throw_and_handle_nat_exception
-#if 0
- ldq a0,string_java_lang_ClassCastException
- jsr ra,new_exception
- ldgp gp,0(ra)
- mov v0,xptr
-
- ldq ra,0(sp) /* restore return address */
- lda sp,16(sp) /* free stack space */
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
-#endif
-
- .end asm_builtin_checkarraycast
-
-
-/******************* function asm_builtin_aastore ******************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_aastore
-
-asm_builtin_aastore:
- ldgp gp,0(pv)
- beq a0,nb_aastore_null /* if null pointer throw exception */
- ldl t0,offarraysize(a0) /* load size */
- lda sp,-24(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- s8addq a1,a0,t1 /* add index*8 to arrayref */
- cmpult a1,t0,t0 /* do bound check */
- beq t0,nb_aastore_bound /* if out of bounds throw exception */
- mov a2,a1 /* object is second argument */
- stq t1,8(sp) /* save store position */
- stq a1,16(sp) /* save object */
- jsr ra,builtin_canstore /* builtin_canstore(arrayref,object) */
- ldgp gp,0(ra)
- ldq ra,0(sp) /* restore return address */
- ldq a0,8(sp) /* restore store position */
- ldq a1,16(sp) /* restore object */
- lda sp,24(sp) /* free stack space */
- beq v0,nb_aastore_throw /* if (false) throw exception */
- stq a1,offobjarrdata(a0) /* store objectptr in array */
- jmp zero,(ra)
-
-nb_aastore_null:
- ldq xptr,string_java_lang_NullPointerException
- mov ra,xpc
- jmp zero,asm_throw_and_handle_nat_exception
-#if 0
- subq sp,8,sp /* allocate stack space */
- stq ra,0(sp) /* save return address */
- jsr ra,new_nullpointerexception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
-#endif
-nb_aastore_bound:
- ldq ra,0(sp)
- lda sp,24(sp)
- mov ra,xpc
- mov a1,xptr
- jmp zero,asm_throw_and_handle_arrayindexoutofbounds_exception
-#if 0
- ldq a0,string_java_lang_ArrayIndexOutOfBoundsException
- jsr ra,new_exception_int /* a1 already contains the index */
- ldgp gp,0(ra)
- mov v0,xptr
-
- ldq ra,0(sp) /* restore return address */
- lda sp,24(sp) /* free stack space */
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
-#endif
-nb_aastore_throw:
- mov ra,xpc
- ldq xptr,string_java_lang_ArrayStoreException
- jmp zero,asm_throw_and_handle_nat_exception
-#if 0
- subq sp,8,sp /* allocate stack space */
- stq ra,0(sp) /* save return address */
- jsr ra,new_arraystoreexception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
-#endif
- .end asm_builtin_aastore
-
-
/******************* function asm_initialize_thread_stack **********************
* *
* initialized a thread stack *
.quad 0
- .ent asm_prepare_native_stackinfo
-asm_prepare_native_stackinfo:
- lda sp,-24(sp)
- stq ra,0(sp)
- jsr ra,builtin_asm_get_stackframeinfo
- stq v0,16(sp)
- ldq t0,0(v0)
- stq t0,8(sp)
- ldq ra,0(sp)
- lda sp,8(sp)
- stq sp,0(v0)
- ret
- .end asm_prepare_native_stackinfo
-
- .ent asm_remove_native_stackinfo
-asm_remove_native_stackinfo:
- ldq t0,0(sp)
- ldq t1,8(sp)
- stq t0,0(t1)
- lda sp,40(sp)
- ret
- .end asm_remove_native_stackinfo
-
/*
* 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