X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Falpha%2Fasmpart.S;h=8c0d58f0bbafab44438b0f3cb0b2b7e72321270c;hb=04814e29ad09d4e2ffa70fcf2b1d9dd588054e7a;hp=58f1cbcecc54b93f07b1fd0344c02b1681555ff4;hpb=fe2ba070efec8b5529a6f26221ea9122335b6152;p=cacao.git diff --git a/src/vm/jit/alpha/asmpart.S b/src/vm/jit/alpha/asmpart.S index 58f1cbcec..8c0d58f0b 100644 --- a/src/vm/jit/alpha/asmpart.S +++ b/src/vm/jit/alpha/asmpart.S @@ -1,4 +1,4 @@ -/* vm/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-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner, @@ -28,8 +28,9 @@ Reinhard Grafl Changes: Joseph Wenninger + Christian Thalinger - $Id: asmpart.S 2142 2005-03-30 12:53:56Z twisti $ + $Id: asmpart.S 2992 2005-07-11 21:52:07Z twisti $ */ @@ -37,68 +38,9 @@ #include "config.h" #include "vm/jit/alpha/offsets.h" #include "vm/jit/alpha/asmoffsets.h" +#include "vm/jit/alpha/md-asm.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 $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 0x86 - .text .set noat .set noreorder @@ -106,9 +48,11 @@ /********************* exported functions and variables ***********************/ + .globl asm_sync_instruction_cache .globl has_no_x_instr_set .globl asm_calljavafunction + .globl asm_calljavafunction_int .globl asm_calljavafunction2 .globl asm_calljavafunction2int @@ -117,35 +61,32 @@ .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_check_clinit - .globl asm_builtin_checkarraycast - .globl asm_builtin_aastore -#if defined(USE_THREADS) - .globl asm_builtin_monitorenter - .globl asm_builtin_monitorexit -#endif + .globl asm_wrapper_patcher - .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 ************************************************** + + 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 *************************** * * * determines if the byte support instruction set (21164a and higher) * @@ -199,6 +140,7 @@ call_name: .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 */ @@ -212,14 +154,14 @@ asm_calljavafunction: 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 */ @@ -231,10 +173,11 @@ calljava_ret: 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 @@ -251,10 +194,10 @@ call_name2: .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 */ @@ -268,12 +211,12 @@ 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 */ @@ -282,22 +225,27 @@ asm_calljavafunction2double: 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) @@ -317,36 +265,38 @@ calljava_copyloop: 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 @@ -393,18 +343,9 @@ asm_call_jit_compiler: 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 */ @@ -412,23 +353,13 @@ noregchange: jsr ra,jit_compile /* jit compiler */ ldgp gp,0(ra) - 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) + RESTORE_ARGUMENT_REGISTERS(0) /* restore 6 int/6 float argument registers */ + 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,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 @@ -443,18 +374,19 @@ noregchange: 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 @@ -462,237 +394,6 @@ asm_call_jit_compiler_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 */ - 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 * @@ -804,7 +505,7 @@ ex_table_loop: 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) @@ -835,7 +536,7 @@ L_class_loaded: 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) @@ -963,14 +664,14 @@ ex_flt1: 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 @@ -989,377 +690,99 @@ ex_flt2: .end asm_handle_nat_exception -/* asm_check_clinit ************************************************************ - - DOCUMENT ME!!! +/* asm_wrapper_patcher ********************************************************* - Arguments: - - itmp1: pointer to class + XXX 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) - 0 mcode ; machine code to patch back in + ATTENTION: itmp3 == gp! But we don't need gp do call the patcher function. *******************************************************************************/ - .ent asm_check_clinit + .ent asm_wrapper_patcher -asm_check_clinit: - ldgp gp,0(itmp2) /* function is called via `jsr ra,itmp1' */ +asm_wrapper_patcher: + lda sp,-((12+27+4)*8+sizestackframeinfo)(sp) /* create stack frame */ - subq sp,8*8,sp + SAVE_ARGUMENT_REGISTERS(0) /* save 6 int/6 float argument registers */ + SAVE_TEMPORARY_REGISTERS(12) /* save 11 int/16 float temporary registers */ - stq ra,0*8(sp) /* save return address */ - stq pv,1*8(sp) /* save pv of calling java function */ - stq a0,2*8(sp) /* save argument registers for leaf */ - stq a1,3*8(sp) /* functions and native stub */ - stq a2,4*8(sp) - stq a3,5*8(sp) - stq a4,6*8(sp) - stq a5,7*8(sp) - - ldl itmp2,offclassinit(itmp1) - bne itmp2,L_is_initialized - - mov itmp1,a0 /* move class pointer to a0 */ - jsr ra,class_init - ldgp gp,0(ra) - - beq v0,L_initializererror + 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 */ -L_is_initialized: - ldq ra,0*8(sp) /* get return address */ - subq ra,1*4,ra /* go back 1 instruction */ - ldl itmp1,8*8(sp) /* load machine code from stack */ - stl itmp1,0(ra) /* store the machine code */ + 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) */ - call_pal PAL_imb /* synchronise instruction cache */ + 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) - ldq ra,0*8(sp) /* restore return address */ - ldq pv,1*8(sp) /* restore pv of calling java function */ - ldq a0,2*8(sp) /* restore argument registers */ - ldq a1,3*8(sp) - ldq a2,4*8(sp) - ldq a3,5*8(sp) - ldq a4,6*8(sp) - ldq a5,7*8(sp) + 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) - addq sp,(8+1)*8,sp /* remove stack frame (+1 for machine code) */ + lda a0,(12+27+4)*8(sp) /* remove stackframe info */ + jsr ra,stacktrace_remove_stackframeinfo + ldgp gp,0(ra) - subq ra,1*4,ra /* go back 1 instruction */ - jmp zero,(ra) /* jump to the new code */ + RESTORE_ARGUMENT_REGISTERS(0) /* restore 6 int/6 float argument registers */ + RESTORE_TEMPORARY_REGISTERS(12)/* restore 11 integer temporary registers */ + + 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 */ + + 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 + + jmp zero,(itmp3) /* jump to new patched code */ + +L_asm_wrapper_patcher_exception: + mov itmp3,xpc /* return address into JIT code is xpc */ + + 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 */ -L_initializererror: #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 */ - - ldq ra,0*8(sp) /* restore return address */ - ldq pv,1*8(sp) /* restore pv of calling java function */ - ldq a0,2*8(sp) /* restore argument registers */ - ldq a1,3*8(sp) - ldq a2,4*8(sp) - ldq a3,5*8(sp) - ldq a4,6*8(sp) - ldq a5,7*8(sp) - - addq sp,(8+1)*8,sp /* remove stack frame (+1 for machine code) */ - - subq ra,4,xpc br asm_handle_exception /* we have the pv of the calling java func. */ - .end asm_check_clinit + .end asm_wrapper_patcher -/********************* function asm_builtin_monitorenter *********************** -* * -* Does null check and calls monitorenter or throws an exception * -* * -*******************************************************************************/ - -#if defined(USE_THREADS) - .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: - lda xpc,-4(ra) - ldq xptr,string_java_lang_NullPointerException - jmp zero,asm_throw_and_handle_nat_exception -#if 0 - subq sp,8,sp - stq ra,0(sp) - jsr ra,new_nullpointerexception - 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 -#endif - - .end asm_builtin_monitorenter -#endif - - -/********************* function asm_builtin_monitorexit ************************ -* * -* Does null check and calls monitorexit or throws an exception * -* * -*******************************************************************************/ - -#if defined(USE_THREADS) - .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: - lda xpc,-4(ra) - ldq xptr,string_java_lang_NullPointerException - jmp zero,asm_throw_and_handle_nat_exception -#if 0 - subq sp,8,sp - stq ra,0(sp) - jsr ra,new_nullpointerexception - 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 -#endif - - .end asm_builtin_monitorexit -#endif - - -/************************ 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 * @@ -1411,14 +834,14 @@ asm_perform_threadswitch: 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) @@ -1430,14 +853,14 @@ asm_perform_threadswitch: 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 @@ -1510,29 +933,6 @@ asm_criticalsections: .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