-/* jit/alpha/asmpart.S - Java-C interface functions for alpha
+/* src/vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- Institut f. Computersprachen, TU Wien
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
- S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
- J. Wenninger
+ Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+ R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+ C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+ Institut f. Computersprachen - TU Wien
This file is part of CACAO.
Authors: Andreas Krall
Reinhard Grafl
- $Id: asmpart.S 1218 2004-06-29 14:11:16Z twisti $
+ Changes: Joseph Wenninger
+ Christian Thalinger
+
+ $Id: asmpart.S 2992 2005-07-11 21:52:07Z twisti $
*/
#include "config.h"
-#include "offsets.h"
-
-
-#define MethodPointer -8
-#define FrameSize -12
-#define IsSync -16
-#define IsLeaf -20
-#define IntSave -24
-#define FltSave -28
-/* DEFINE LINE NUMBER STUFF HERE */
-#define ExTableSize -56
-#define ExTableStart -56
-
-#define ExEntrySize -32
-#define ExStartPC -8
-#define ExEndPC -16
-#define ExHandlerPC -24
-#define ExCatchType -32
-
-
-#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 $25
-#define itmp2 $28
-#define itmp3 $29
-
-#define xptr itmp1
-#define xpc itmp2
-
-#define sf0 $f2
-#define sf1 $f3
-#define sf2 $f4
-#define sf3 $f5
-#define sf4 $f6
-#define sf5 $f7
-#define sf6 $f8
-#define sf7 $f9
-
-#define fzero $f31
-
-
-#define PAL_imb 134
+#include "vm/jit/alpha/offsets.h"
+#include "vm/jit/alpha/asmoffsets.h"
+#include "vm/jit/alpha/md-asm.h"
+
.text
.set noat
/********************* exported functions and variables ***********************/
+ .globl asm_sync_instruction_cache
.globl has_no_x_instr_set
- .globl synchronize_caches
+
.globl asm_calljavafunction
+ .globl asm_calljavafunction_int
+
.globl asm_calljavafunction2
- .globl asm_calljavafunction2double
+ .globl asm_calljavafunction2int
.globl asm_calljavafunction2long
+ .globl asm_calljavafunction2float
+ .globl asm_calljavafunction2double
+
.globl asm_call_jit_compiler
.globl asm_handle_exception
.globl asm_handle_nat_exception
- .globl asm_check_clinit
- .globl asm_builtin_checkcast
- .globl asm_builtin_checkarraycast
- .globl asm_builtin_aastore
- .globl asm_builtin_monitorenter
- .globl asm_builtin_monitorexit
- .globl asm_builtin_idiv
- .globl asm_builtin_irem
- .globl asm_builtin_ldiv
- .globl asm_builtin_lrem
+
+ .globl asm_wrapper_patcher
+
.globl asm_perform_threadswitch
.globl asm_initialize_thread_stack
.globl asm_switchstackandcall
- .globl asm_getcallingmethod
- .globl asm_builtin_trace
- .globl asm_builtin_exittrace
.globl asm_criticalsections
.globl asm_getclassvalues_atomic
-/*************************** imported functions *******************************/
- .globl jit_compile
- .globl builtin_monitorexit
- .globl builtin_throw_exception
- .globl builtin_trace_exception
- .globl class_java_lang_Object
+/* asm_sync_instruction_cache **************************************************
+
+ XXX
+
+*******************************************************************************/
+
+ .ent asm_sync_instruction_cache
+
+asm_sync_instruction_cache:
+ call_pal PAL_imb /* synchronize instruction cache */
+ jmp zero,(ra)
+ .end asm_sync_instruction_cache
/*********************** function has_no_x_instr_set ***************************
* *
.quad 0 /* method pointer (pointer to name) */
asm_calljavafunction:
+asm_calljavafunction_int:
ldgp gp,0(pv)
lda sp,-32(sp) /* allocate stack space */
stq gp,24(sp) /* save global pointer */
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 */
calljava_xhandler:
ldq gp,24(sp) /* restore global pointer */
- mov itmp1,a0
+ mov xptr,a0
jsr ra,builtin_throw_exception
ldq ra,0(sp) /* restore return address */
lda sp,32(sp) /* free stack space */
+ mov zero,v0 /* return NULL */
jmp zero,(ra)
.end asm_calljavafunction
.ent asm_calljavafunction2
call_name2:
- .ascii "calljavafunction2\0\0"
-
.align 3
+
.quad 0 /* catch type all */
.quad calljava_xhandler2 /* handler pc */
.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 */
.quad 0 /* method pointer (pointer to name) */
asm_calljavafunction2:
-asm_calljavafunction2double:
+asm_calljavafunction2int:
asm_calljavafunction2long:
+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
-
+
/****************** function asm_call_jit_compiler *****************************
* *
* *
*******************************************************************************/
-
.ent asm_call_jit_compiler
-asm_call_jit_compiler:
+asm_call_jit_compiler:
ldgp gp,0(pv)
ldl t8,-8(ra) /* load instruction LDQ PV,xxx($yy) */
srl t8,16,t8 /* shift right register number $yy */
addq t8,$28,$28 /* compute update address */
noregchange:
lda sp,-14*8(sp) /* reserve stack space */
- stq a0,0*8(sp) /* save all argument registers */
- stq a1,1*8(sp) /* they could be used by method */
- stq a2,2*8(sp)
- stq a3,3*8(sp)
- stq a4,4*8(sp)
- stq a5,5*8(sp)
- stt $f16,6*8(sp)
- stt $f17,7*8(sp)
- stt $f18,8*8(sp)
- stt $f19,9*8(sp)
- stt $f20,10*8(sp)
- stt $f21,11*8(sp)
+
+ SAVE_ARGUMENT_REGISTERS(0) /* save 6 int/6 float argument registers */
+
stq $28,12*8(sp) /* save method pointer */
stq ra,13*8(sp) /* save return address */
jsr ra,jit_compile /* jit compiler */
ldgp gp,0(ra)
- call_pal PAL_imb /* synchronise instruction cache */
+ RESTORE_ARGUMENT_REGISTERS(0) /* restore 6 int/6 float argument registers */
- ldq a0,0*8(sp) /* load argument registers */
- ldq a1,1*8(sp)
- ldq a2,2*8(sp)
- ldq a3,3*8(sp)
- ldq a4,4*8(sp)
- ldq a5,5*8(sp)
- ldt $f16,6*8(sp)
- ldt $f17,7*8(sp)
- ldt $f18,8*8(sp)
- ldt $f19,9*8(sp)
- ldt $f20,10*8(sp)
- ldt $f21,11*8(sp)
ldq $28,12*8(sp) /* load method pointer */
ldq ra,13*8(sp) /* load return address */
lda sp,14*8(sp) /* deallocate stack area */
+ beq v0,L_asm_call_jit_compiler_exception
+
ldl t8,-8(ra) /* load instruction LDQ PV,xxx($yy) */
sll t8,48,t8
sra t8,48,t8 /* isolate offset */
addq t8,$28,t8 /* compute update address via method pointer*/
stq v0,0(t8) /* save new method address there */
- mov v0,pv /* load method address into pv */
+ call_pal PAL_imb /* synchronise instruction cache */
+ mov v0,pv /* load method address into pv */
jmp zero,(pv) /* and call method. The method returns */
/* directly to the caller (ra). */
+L_asm_call_jit_compiler_exception:
+ subq sp,1*8,sp
+ stq ra,0*8(sp)
+
+ 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
+
+ subq ra,4,xpc
+ br asm_handle_nat_exception
+
.end asm_call_jit_compiler
*******************************************************************************/
.ent asm_handle_nat_exception
+
asm_handle_nat_exception:
ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
sll t0,48,t0
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_handle_exception
+ bne t0,asm_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_handle_exception
+
asm_handle_exception:
lda sp,-18*8(sp) /* allocate stack */
stq t0,0*8(sp) /* save possible used registers */
br ra,L_class_load_ra /* set ra for gp loading */
L_class_load_ra:
ldgp gp,0(ra) /* load gp */
- jsr ra,class_load /* class_load(exceptionclass) */
+ jsr ra,load_class_bootstrap
ldq t0,0*8(sp) /* restore used register */
ldq t1,1*8(sp)
br ra,L_class_link_ra /* set ra for gp loading */
L_class_link_ra:
ldgp gp,0(ra) /* load gp */
- jsr ra,class_link /* class_load(exceptionclass) */
+ jsr ra,link_class
ldq t0,0*8(sp) /* restore used register */
ldq t1,1*8(sp)
ex_already_cleared:
ldl t0,IsSync(pv) /* t0 = SyncOffset */
beq t0,no_monitor_exit /* if zero no monitorexit */
+
+#if defined(USE_THREADS)
addq sp,t0,t0 /* add stackptr to Offset */
ldq a0,-8(t0) /* load monitorexit pointer */
ldq pv,5*8(sp)
ldq ra,6*8(sp)
lda sp,7*8(sp) /* deallocate stack */
+#endif
no_monitor_exit:
ldl t0,FrameSize(pv) /* t0 = frame size */
negl t1,t1 /* negate register count */
s4addq t1,t2,t2 /* t2 = ex_flt_sav - 4 * register count */
jmp zero,(t2) /* jump to save position */
- ldt $f2,-64(t0)
- ldt $f3,-56(t0)
- ldt $f4,-48(t0)
- ldt $f5,-40(t0)
- ldt $f6,-32(t0)
- ldt $f7,-24(t0)
- ldt $f8,-16(t0)
- ldt $f9,-8(t0)
+ ldt fs0,-64(t0)
+ ldt fs1,-56(t0)
+ ldt fs2,-48(t0)
+ ldt fs3,-40(t0)
+ ldt fs4,-32(t0)
+ ldt fs5,-24(t0)
+ ldt fs6,-16(t0)
+ ldt fs7,-8(t0)
ex_flt2:
ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
sll t0,48,t0
.end asm_handle_nat_exception
-/********************* asm_check_clinit ****************************************
-* *
-* Does null check and calls monitorenter or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_check_clinit
-
-asm_check_clinit:
- ldgp gp,0(pv)
-
- ldl itmp2,offclassinit(itmp1)
- bne itmp2,L_is_initialized
-
- subq sp,7*8,sp
- stq ra,0*8(sp)
- stq a0,1*8(sp) /* save argument registers for leaf */
- stq a1,2*8(sp) /* functions and native stub */
- stq a2,3*8(sp)
- stq a3,4*8(sp)
- stq a4,5*8(sp)
- stq a5,6*8(sp)
-
- mov itmp1,a0
- jsr ra,class_init
-
- ldgp gp,0(ra)
- ldq ra,0*8(sp)
- ldq a0,1*8(sp) /* restore argument registers */
- ldq a1,2*8(sp)
- ldq a2,3*8(sp)
- ldq a3,4*8(sp)
- ldq a4,5*8(sp)
- ldq a5,6*8(sp)
- addq sp,7*8,sp
-
- beq v0,L_initializererror
-
-L_is_initialized:
- mov ra,itmp1 /* now patch the calling code */
- subq itmp1,(3*4),itmp1 /* go back 3 instructions */
- ldah itmp2,-15392(zero) /* br -- 0xc3e0 == -15392 */
- lda itmp2,4(itmp2) /* jump over 4 instructions */
- stl itmp2,0(itmp1) /* store the new branch: br +4 */
-
- jmp zero,(ra)
-
-L_initializererror:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- subq sp,1*8,sp
- stq ra,0*8(sp)
- jsr ra,builtin_asm_get_exceptionptrptr
- ldq ra,0*8(sp)
- addq sp,1*8,sp
- ldq xptr,0(v0) /* get the exception pointer */
- stq zero,0(v0) /* clear the exception pointer */
-#else
- lda itmp3,_exceptionptr
- ldq xptr,0(itmp3)
- stq zero,0(itmp3)
-#endif
-
- subq ra,4,xpc
- br asm_handle_nat_exception
-
- .end asm_check_clinit
-
-
-/********************* function asm_builtin_monitorenter ***********************
-* *
-* Does null check and calls monitorenter or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_monitorenter
-
-asm_builtin_monitorenter:
- ldgp gp,0(pv)
- lda pv,builtin_monitorenter
- beq a0,nb_monitorenter /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_monitorenter */
-
-nb_monitorenter:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_NullPointerException
- jsr ra,new_exception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
-
- .end asm_builtin_monitorenter
-
+/* asm_wrapper_patcher *********************************************************
-/********************* function asm_builtin_monitorexit ************************
-* *
-* Does null check and calls monitorexit or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_monitorexit
-
-asm_builtin_monitorexit:
- ldgp gp,0(pv)
- lda pv,builtin_monitorexit
- beq a0,nb_monitorexit /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_monitorexit */
-
-nb_monitorexit:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_NullPointerException
- jsr ra,new_exception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
-
- .end asm_builtin_monitorexit
-
-
-/************************ 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:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_ArithmeticException
- ldq a1,string_java_lang_ArithmeticException_message
- jsr ra,new_exception_message
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
+ XXX
- .end asm_builtin_idiv
+ Stack layout:
+ 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 (pv afterwards)
+ ATTENTION: itmp3 == gp! But we don't need gp do call the patcher function.
-/************************ function asm_builtin_ldiv ****************************
-* *
-* Does null check and calls ldiv or throws an exception *
-* *
*******************************************************************************/
+
+ .ent asm_wrapper_patcher
- .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:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_ArithmeticException
- ldq a1,string_java_lang_ArithmeticException_message
- jsr ra,new_exception_message
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
-
- .end asm_builtin_ldiv
+asm_wrapper_patcher:
+ 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 */
-/************************ function asm_builtin_irem ****************************
-* *
-* Does null check and calls irem or throws an exception *
-* *
-*******************************************************************************/
+ stq itmp1,(12+27+0)*8(sp) /* save itmp1 */
+ stq itmp2,(12+27+1)*8(sp) /* save itmp2 */
+ 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 */
- .ent asm_builtin_irem
+ 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) */
-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:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_ArithmeticException
- ldq a1,string_java_lang_ArithmeticException_message
- jsr ra,new_exception_message
+ 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)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
-
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_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:
- subq sp,8,sp
- stq ra,0(sp)
- ldq a0,string_java_lang_ArithmeticException
- ldq a1,string_java_lang_ArithmeticException_message
- jsr ra,new_exception_message
+ 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)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_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 */
+ lda a0,(12+27+4)*8(sp) /* remove stackframe info */
+ jsr ra,stacktrace_remove_stackframeinfo
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 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
-
- .end asm_builtin_checkarraycast
-
-
-/******************* function asm_builtin_aastore ******************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
- .ent asm_builtin_aastore
+ RESTORE_ARGUMENT_REGISTERS(0) /* restore 6 int/6 float argument registers */
+ RESTORE_TEMPORARY_REGISTERS(12)/* restore 11 integer temporary registers */
-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:
- subq sp,8,sp /* allocate stack space */
- stq ra,0(sp) /* save return address */
- ldq a0,string_java_lang_NullPointerException
- jsr ra,new_exception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
+ ldq itmp1,(12+27+0)*8(sp) /* restore itmp1 */
+ ldq itmp2,(12+27+1)*8(sp) /* restore itmp2 */
+ 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 */
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
+ 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 */
-nb_aastore_bound:
- ldq a0,string_java_lang_ArrayIndexOutOfBoundsException
- jsr ra,new_exception_int /* a1 already contains the index */
- ldgp gp,0(ra)
- mov v0,xptr
+ beq v0,L_asm_wrapper_patcher_exception
- 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
+ jmp zero,(itmp3) /* jump to new patched code */
-nb_aastore_throw:
- subq sp,8,sp /* allocate stack space */
- stq ra,0(sp) /* save return address */
- ldq a0,string_java_lang_ArrayStoreException
- jsr ra,new_exception
- ldgp gp,0(ra)
- mov v0,xptr
- ldq ra,0(sp)
- addq sp,8,sp
+L_asm_wrapper_patcher_exception:
+ mov itmp3,xpc /* return address into JIT code is xpc */
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
+ br itmp1,L_asm_wrapper_patcher_exception_load_gp
+L_asm_wrapper_patcher_exception_load_gp:
+ ldgp gp,0(itmp1) /* itmp3 == gp, load the current gp */
- .end asm_builtin_aastore
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ subq sp,3*8,sp
+ stq xpc,0*8(sp) /* save return address (xpc) */
+ stq ra,1*8(sp)
+ stq pv,2*8(sp)
+ jsr ra,builtin_asm_get_exceptionptrptr
+ ldq xpc,0*8(sp) /* restore return address (xpc) */
+ ldq ra,1*8(sp)
+ ldq pv,2*8(sp)
+ addq sp,3*8,sp
+#else
+ lda v0,_exceptionptr
+#endif
+ ldq xptr,0(v0) /* get the exception pointer */
+ stq zero,0(v0) /* clear the exception pointer */
+ br asm_handle_exception /* we have the pv of the calling java func. */
+ .end asm_wrapper_patcher
+
/******************* function asm_initialize_thread_stack **********************
* *
* initialized a thread stack *
stq s4, 32(sp)
stq s5, 40(sp)
stq s6, 48(sp)
- stt sf0, 56(sp)
- stt sf1, 64(sp)
- stt sf2, 72(sp)
- stt sf3, 80(sp)
- stt sf4, 88(sp)
- stt sf5, 96(sp)
- stt sf6, 104(sp)
- stt sf7, 112(sp)
+ stt fs0, 56(sp)
+ stt fs1, 64(sp)
+ stt fs2, 72(sp)
+ stt fs3, 80(sp)
+ stt fs4, 88(sp)
+ stt fs5, 96(sp)
+ stt fs6, 104(sp)
+ stt fs7, 112(sp)
stq ra, 120(sp)
stq sp, 0(a0)
stq sp, 0(a2)
ldq s4, 32(sp)
ldq s5, 40(sp)
ldq s6, 48(sp)
- ldt sf0, 56(sp)
- ldt sf1, 64(sp)
- ldt sf2, 72(sp)
- ldt sf3, 80(sp)
- ldt sf4, 88(sp)
- ldt sf5, 96(sp)
- ldt sf6, 104(sp)
- ldt sf7, 112(sp)
+ ldt fs0, 56(sp)
+ ldt fs1, 64(sp)
+ ldt fs2, 72(sp)
+ ldt fs3, 80(sp)
+ ldt fs4, 88(sp)
+ ldt fs5, 96(sp)
+ ldt fs6, 104(sp)
+ ldt fs7, 112(sp)
ldq ra, 120(sp)
mov ra, pv
addq sp, 128, sp