X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Fasmpart.S;h=a17fe5217c394ee5659ac43ae1a4cf76ab5fdf84;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=50ce128b9973a7b46f390cc8e3ee25a8ab55bf56;hpb=c9ce732ed49438bfa6c84be8157b0882fb89400f;p=cacao.git diff --git a/src/vm/jit/powerpc/asmpart.S b/src/vm/jit/powerpc/asmpart.S index 50ce128b9..a17fe5217 100644 --- a/src/vm/jit/powerpc/asmpart.S +++ b/src/vm/jit/powerpc/asmpart.S @@ -1,9 +1,9 @@ /* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC - 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 + Copyright (C) 1996-2005, 2006, 2007 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. @@ -19,67 +19,56 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Andreas Krall - Reinhard Grafl - Stefan Ring - - Changes: Christian Thalinger - - $Id: asmpart.S 2806 2005-06-23 13:51:06Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include "config.h" + #include "md-abi.h" #include "md-asm.h" -#include "vm/jit/powerpc/offsets.h" -#include "vm/jit/powerpc/asmoffsets.h" +#include "vm/jit/abi-asm.h" +#include "vm/jit/methodheader.h" .text .align 2 - .globl asm_calljavafunction - .globl asm_calljavafunction_int - .globl asm_calljavafunction2 - .globl asm_calljavafunction2int - .globl asm_calljavafunction2long - .globl asm_calljavafunction2float - .globl asm_calljavafunction2double +/* export functions ***********************************************************/ + + .globl asm_vm_call_method + .globl asm_vm_call_method_int + .globl asm_vm_call_method_long + .globl asm_vm_call_method_float + .globl asm_vm_call_method_double + + .globl asm_vm_call_method_exception_handler + .globl asm_vm_call_method_end .globl asm_call_jit_compiler .globl asm_handle_nat_exception .globl asm_handle_exception - .globl asm_wrapper_patcher - - .globl asm_builtin_arraycheckcast - .globl asm_builtin_aastore + .globl asm_abstractmethoderror - .globl asm_builtin_idiv - .globl asm_builtin_irem - .globl asm_builtin_ldiv - .globl asm_builtin_lrem +#if defined(ENABLE_REPLACEMENT) + .globl asm_replacement_out + .globl asm_replacement_in +#endif .globl asm_cacheflush - .globl asm_initialize_thread_stack - .globl asm_perform_threadswitch - .globl asm_switchstackandcall - .globl asm_criticalsections - .globl asm_getclassvalues_atomic + + .globl asm_compare_and_swap + .globl asm_memory_barrier -/********************* function asm_calljavafunction *************************** +/* asm_vm_call_method ********************************************************** * * * This function calls a Java-method (which possibly needs compilation) * * with up to 4 address parameters. * @@ -87,256 +76,182 @@ * This functions calls the JIT-compiler which eventually translates the * * method into machine code. * * * -* C-prototype: * +* C-prototype: * * javaobject_header *asm_calljavamethod (methodinfo *m, * -* void *arg1, void *arg2, void *arg3, void *arg4); * +* void *arg1, void *arg2, void *arg3, void *arg4); * * * *******************************************************************************/ - + .align 2 .long 0 /* catch type all */ - .long calljava_xhandler /* handler pc */ - .long calljava_xhandler /* end pc */ - .long asm_calljavafunction /* start pc */ + .long 0 /* exception handler pc */ + .long 0 /* end pc */ + .long 0 /* start pc */ .long 1 /* extable size */ + .long 0 /* line number table start */ + .long 0 /* line number table size */ .long 0 /* fltsave */ .long 0 /* intsave */ - .long 0 /* isleaf */ + .long 0 /* IsLeaf */ .long 0 /* IsSync */ - .long 24 /* frame size */ - .long 0 /* method pointer (pointer to name) */ - .long 0 /* padding */ - -asm_calljavafunction: -asm_calljavafunction_int: + .long 0 /* frame size */ + .long 0 /* codeinfo pointer */ + +asm_vm_call_method: +asm_vm_call_method_int: +asm_vm_call_method_long: +asm_vm_call_method_float: +asm_vm_call_method_double: mflr r0 - stw r31,-4(r1) -/* stw r30,-8(r1)*/ - stw pv,-12(r1) - stw r0,LA_LR_OFFSET(r1) - stwu r1,-148(r1) + stw r0,LA_LR_OFFSET(sp) + stwu sp,-40*4(sp) /* keep stack 16-byte aligned */ + + stw s0,8*4(sp) /* save used callee saved registers */ + stw a0,9*4(sp) /* save method PV */ #if defined(__DARWIN__) - bl 0f -0: - mflr r31 + stw itmp1,10*4(sp) /* register r11 is callee saved */ #endif + stw pv,11*4(sp) /* save PV register */ - stw t0,40(r1) - stw t1,44(r1) - stw t2,48(r1) - stw t3,52(r1) - stw t4,56(r1) - stw t5,60(r1) - stw t6,64(r1) - stw t7,68(r1) - - stfd ftmp1,72(r1) - stfd ftmp2,80(r1) - stfd ft0,88(r1) - stfd ft1,96(r1) - stfd ft2,104(r1) - stfd ft3,112(r1) - stfd ft4,120(r1) - stfd ft5,128(r1) - - stw a0,36(r1) - addi itmp1,r1,36 - mr a0,a1 - mr a1,a2 - mr a2,a3 - mr a3,a4 + stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */ + stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */ + stfd ftmp2,16*4(sp) #if defined(__DARWIN__) -/* addis mptr,r31,ha16(_asm_call_jit_compiler-0b)*/ - addi mptr,r31,lo16(asm_call_jit_compiler-0b) + stw t1,18*4(sp) + stw t2,19*4(sp) + stw t3,20*4(sp) + stw t4,21*4(sp) + stw t5,22*4(sp) + stw t6,23*4(sp) + stw t7,24*4(sp) + + stfd ft0,26*4(sp) + stfd ft1,28*4(sp) + stfd ft2,30*4(sp) + stfd ft3,32*4(sp) + stfd ft4,34*4(sp) + stfd ft5,36*4(sp) #else -/* addi mptr,r31,(asm_call_jit_compiler-0b)@l*/ - lis mptr,asm_call_jit_compiler@ha - addi mptr,mptr,asm_call_jit_compiler@l + SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */ #endif - stw mptr,32(r1) - addi mptr,r1,28 - lwz pv,4(mptr) - mtctr pv - bctrl + mr t0,a1 /* address of data structure */ + mr t1,a2 /* stack argument count */ + + mr s0,sp /* save SP */ + + lwz a0,0*8+4(t0) /* we are on big-endian */ + lwz a1,1*8+4(t0) + lwz a2,2*8+4(t0) + lwz a3,3*8+4(t0) + lwz a4,4*8+4(t0) + lwz a5,5*8+4(t0) + lwz a6,6*8+4(t0) + lwz a7,7*8+4(t0) + + lfd fa0,8*8(t0) + lfd fa1,9*8(t0) + lfd fa2,10*8(t0) + lfd fa3,11*8(t0) + lfd fa4,12*8(t0) + lfd fa5,13*8(t0) + lfd fa6,14*8(t0) + lfd fa7,15*8(t0) -1: - mflr itmp1 #if defined(__DARWIN__) - addi pv,itmp1,lo16(asm_calljavafunction-1b) -#else - addi pv,itmp1,(asm_calljavafunction-1b)@l + lfd fa8,16*8(t0) + lfd fa9,17*8(t0) + lfd fa10,18*8(t0) + lfd fa11,19*8(t0) + lfd fa12,20*8(t0) #endif -calljava_regrestore: - lwz t0,40(r1) - lwz t1,44(r1) - lwz t2,48(r1) - lwz t3,52(r1) - lwz t4,56(r1) - lwz t5,60(r1) - lwz t6,64(r1) - lwz t7,68(r1) - - lfd ftmp1,72(r1) - lfd ftmp2,80(r1) - lfd ft0,88(r1) - lfd ft1,96(r1) - lfd ft2,104(r1) - lfd ft3,112(r1) - lfd ft4,120(r1) - lfd ft5,128(r1) - - lwz r0,148+LA_LR_OFFSET(r1) - mtlr r0 - addi r1,r1,148 - lwz pv,-12(r1) -/* lwz r30,-8(r1)*/ - lwz r31,-4(r1) - blr - -calljava_xhandler: - mr r3,itmp1 - bl builtin_throw_exception - li v0,0 /* return NULL */ - b calljava_regrestore - + mr. t1,t1 + beq L_asm_vm_call_method_stack_copy_done + slwi t2,t1,3 /* calculate stackframe size (* 8) */ + sub sp,sp,t2 /* create stackframe */ + mr t2,sp /* temporary stack pointer */ - .align 2 - - .long 0 /* catch type all */ - .long calljava_xhandler2 /* handler pc */ - .long calljava_xhandler2 /* end pc */ - .long asm_calljavafunction2 /* start pc */ - .long 1 /* extable size */ - .long 0 /* fltsave */ - .long 0 /* intsave */ - .long 0 /* isleaf */ - .long 0 /* IsSync */ - .long 24 /* frame size */ - .long 0 /* method pointer (pointer to name) */ - .long 0 /* padding */ - -asm_calljavafunction2: -asm_calljavafunction2int: -asm_calljavafunction2long: -asm_calljavafunction2float: -asm_calljavafunction2double: - mflr r0 - stw r31,-4(r1) -/* stw r30,-8(r1)*/ - stw pv,-12(r1) - stw r0,LA_LR_OFFSET(r1) - stwu r1,-148(r1) - bl 0f -0: - mflr r31 - - stw r16,40(r1) - stw r17,44(r1) - stw r18,48(r1) - stw r19,52(r1) - stw r20,56(r1) - stw r21,60(r1) - stw r22,64(r1) - stw r23,68(r1) - stfd fr16,72(r1) - stfd fr17,80(r1) - stfd fr18,88(r1) - stfd fr19,96(r1) - stfd fr20,104(r1) - stfd fr21,112(r1) - stfd fr22,120(r1) - stfd fr23,128(r1) - - stw r3,36(r1) /* save method pointer for compiler */ - mr itmp1,r6 /* pointer to arg block */ - mr itmp2,r4 /* arg count */ - - mr. itmp2,itmp2 - ble calljava_argsloaded - - addi itmp2,itmp2,-1 - lwz r3,offjniitem+4(itmp1) - mr. itmp2,itmp2 - ble calljava_argsloaded - - addi itmp2,itmp2,-1 - lwz r4,offjniitem+sizejniblock*1+4(itmp1) - mr. itmp2,itmp2 - ble calljava_argsloaded - addi itmp2,itmp2,-1 - - addi itmp2,itmp2,-1 - lwz r5,offjniitem+sizejniblock*2+4(itmp1) - mr. itmp2,itmp2 - ble calljava_argsloaded - addi itmp2,itmp2,-1 - - addi itmp2,itmp2,-1 - lwz r6,offjniitem+sizejniblock*3+4(itmp1) - mr. itmp2,itmp2 - ble calljava_argsloaded - addi itmp2,itmp2,-1 - -calljava_argsloaded: - addi itmp1,r1,36 +L_asm_vm_call_method_stack_copy_loop: #if defined(__DARWIN__) -/* addis mptr,r31,ha16(_asm_call_jit_compiler-0b)*/ - addi mptr,r31,lo16(asm_call_jit_compiler-0b) + lwz t3,21*8+0(t0) /* load argument */ + lwz t4,21*8+4(t0) #else - addi mptr,r31,(asm_call_jit_compiler-0b)@l + lwz t3,16*8+0(t0) /* load argument */ + lwz t4,16*8+4(t0) #endif - stw mptr,32(r1) - addi mptr,r1,28 - - lwz pv,4(mptr) + stw t3,0(t2) /* store argument on stack */ + stw t4,4(t2) + + addi t0,t0,8 /* load address of next argument */ + addi t2,t2,8 /* increase stack pointer */ + addi t1,t1,-1 /* subtract 1 argument */ + mr. t1,t1 + bgt L_asm_vm_call_method_stack_copy_loop + +L_asm_vm_call_method_stack_copy_done: + addi mptr,s0,9*4 /* get address of PV */ + lwz pv,0*4(mptr) /* load PV */ mtctr pv bctrl 1: mflr itmp1 #if defined(__DARWIN__) - addi pv,itmp1,lo16(asm_calljavafunction2-1b) + addi pv,itmp1,lo16(asm_vm_call_method - 1b) +#else + addi pv,itmp1,(asm_vm_call_method - 1b)@l +#endif + +L_asm_vm_call_method_return: + mr sp,s0 /* restore the SP */ + + lwz s0,8*4(sp) /* restore used callee saved registers*/ + +#if defined(__DARWIN__) + lwz itmp1,10*4(sp) /* register r11 is callee saved */ +#endif + lwz pv,11*4(sp) /* save PV register */ + + lwz itmp3,12*4(sp) + lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */ + lfd ftmp2,16*4(sp) + +#if defined(__DARWIN__) + lwz t1,18*4(sp) + lwz t2,19*4(sp) + lwz t3,20*4(sp) + lwz t4,21*4(sp) + lwz t5,22*4(sp) + lwz t6,23*4(sp) + lwz t7,24*4(sp) + + lfd ft0,26*4(sp) + lfd ft1,28*4(sp) + lfd ft2,30*4(sp) + lfd ft3,32*4(sp) + lfd ft4,34*4(sp) + lfd ft5,36*4(sp) #else - addi pv,itmp1,(asm_calljavafunction2-1b)@l + RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */ #endif -calljava_regrestore2: - lwz r16,40(r1) - lwz r17,44(r1) - lwz r18,48(r1) - lwz r19,52(r1) - lwz r20,56(r1) - lwz r21,60(r1) - lwz r22,64(r1) - lwz r23,68(r1) - lfd fr16,72(r1) - lfd fr17,80(r1) - lfd fr18,88(r1) - lfd fr19,96(r1) - lfd fr20,104(r1) - lfd fr21,112(r1) - lfd fr22,120(r1) - lfd fr23,128(r1) - - lwz r0,148+LA_LR_OFFSET(r1) + lwz r0,40*4+LA_LR_OFFSET(sp) mtlr r0 - addi r1,r1,148 - lwz pv,-12(r1) -/* lwz r30,-8(r1)*/ - lwz r31,-4(r1) + addi sp,sp,40*4 blr -calljava_xhandler2: - mr r3,itmp1 +asm_vm_call_method_exception_handler: + mr a0,itmp1 bl builtin_throw_exception - li v0,0 /* return NULL */ - b calljava_regrestore2 + b L_asm_vm_call_method_return + +asm_vm_call_method_end: + nop /* asm_call_jit_compiler ******************************************************* @@ -346,111 +261,95 @@ calljava_xhandler2: *******************************************************************************/ asm_call_jit_compiler: - stw itmp1,-8(r1) - mflr itmp1 - stw r31,-4(r1) - stw r29,-12(r1) - stw itmp1,LA_LR_OFFSET(r1) - stwu r1,-(LA_SIZE + 1*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)(r1) - mr r31,pv - - lwz itmp3,-12(itmp1) - srwi itmp3,itmp3,16 - andi. itmp3,itmp3,31 - cmpwi itmp3,mptrn - beq noregchange - lwz itmp3,4(itmp1) - extsh itmp3,itmp3 - add mptr,itmp3,itmp1 - lwz itmp3,8(itmp1) - srwi itmp3,itmp3,16 - cmpwi itmp3,0x3dad - bne noregchange - lwz itmp3,8(itmp1) - slwi itmp3,itmp3,16 - add mptr,mptr,itmp3 - -noregchange: - lwz itmp1,(LA_SIZE + 1*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1) - mr r29,mptr - -#if 1 - stw a0,28(r1) - stw a1,32(r1) - stw a2,36(r1) - stw a3,40(r1) - stw a4,44(r1) - stw a5,48(r1) - stw a6,52(r1) - - stfd fa0,56(r1) - stfd fa1,64(r1) - stfd fa2,72(r1) - stfd fa3,80(r1) - stfd fa4,88(r1) - stfd fa5,96(r1) - stfd fa6,104(r1) - stfd fa7,112(r1) - stfd fa8,120(r1) - stfd fa9,128(r1) - stfd fa10,136(r1) - stfd fa11,144(r1) - stfd fa12,152(r1) - - stw r10,160(r1) +L_asm_call_jit_compiler: /* required for PIC code */ + mflr r0 + stw r0,LA_LR_OFFSET(sp) /* save return address */ + stwu sp,-(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(sp) + +#if defined(__DARWIN__) + stw a0,LA_SIZE+(4+0)*4(sp) + stw a1,LA_SIZE+(4+1)*4(sp) + stw a2,LA_SIZE+(4+2)*4(sp) + stw a3,LA_SIZE+(4+3)*4(sp) + stw a4,LA_SIZE+(4+4)*4(sp) + stw a5,LA_SIZE+(4+5)*4(sp) + stw a6,LA_SIZE+(4+6)*4(sp) + stw a7,LA_SIZE+(4+7)*4(sp) + + stfd fa0,LA_SIZE+(4+8)*4(sp) + stfd fa1,LA_SIZE+(4+10)*4(sp) + stfd fa2,LA_SIZE+(4+12)*4(sp) + stfd fa3,LA_SIZE+(4+14)*4(sp) + stfd fa4,LA_SIZE+(4+16)*4(sp) + stfd fa5,LA_SIZE+(4+18)*4(sp) + stfd fa6,LA_SIZE+(4+20)*4(sp) + stfd fa7,LA_SIZE+(4+22)*4(sp) + stfd fa8,LA_SIZE+(4+24)*4(sp) + stfd fa9,LA_SIZE+(4+26)*4(sp) + stfd fa10,LA_SIZE+(4+28)*4(sp) + stfd fa11,LA_SIZE+(4+30)*4(sp) + stfd fa12,LA_SIZE+(4+32)*4(sp) #else - SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE + 1) + SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS) #endif - lwz r3,0(itmp1) - bl jit_compile - mr pv,r3 - - mr mptr,r29 - -#if 1 - lwz a0,28(r1) - lwz a1,32(r1) - lwz a2,36(r1) - lwz a3,40(r1) - lwz a4,44(r1) - lwz a5,48(r1) - lwz a6,52(r1) - - lfd fa0,56(r1) - lfd fa1,64(r1) - lfd fa2,72(r1) - lfd fa3,80(r1) - lfd fa4,88(r1) - lfd fa5,96(r1) - lfd fa6,104(r1) - lfd fa7,112(r1) - lfd fa8,120(r1) - lfd fa9,128(r1) - lfd fa10,136(r1) - lfd fa11,144(r1) - lfd fa12,152(r1) - - lwz r10,160(r1) + mr a0,itmp1 + mr a1,mptr + addi a2,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8) + lwz a3,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp) + bl jit_asm_compile + mr pv,v0 /* move address to pv register */ + +#if defined(__DARWIN__) + lwz a0,LA_SIZE+(4+0)*4(sp) + lwz a1,LA_SIZE+(4+1)*4(sp) + lwz a2,LA_SIZE+(4+2)*4(sp) + lwz a3,LA_SIZE+(4+3)*4(sp) + lwz a4,LA_SIZE+(4+4)*4(sp) + lwz a5,LA_SIZE+(4+5)*4(sp) + lwz a6,LA_SIZE+(4+6)*4(sp) + lwz a7,LA_SIZE+(4+7)*4(sp) + + lfd fa0,LA_SIZE+(4+8)*4(sp) + lfd fa1,LA_SIZE+(4+10)*4(sp) + lfd fa2,LA_SIZE+(4+12)*4(sp) + lfd fa3,LA_SIZE+(4+14)*4(sp) + lfd fa4,LA_SIZE+(4+16)*4(sp) + lfd fa5,LA_SIZE+(4+18)*4(sp) + lfd fa6,LA_SIZE+(4+20)*4(sp) + lfd fa7,LA_SIZE+(4+22)*4(sp) + lfd fa8,LA_SIZE+(4+24)*4(sp) + lfd fa9,LA_SIZE+(4+26)*4(sp) + lfd fa10,LA_SIZE+(4+28)*4(sp) + lfd fa11,LA_SIZE+(4+30)*4(sp) + lfd fa12,LA_SIZE+(4+32)*4(sp) #else - RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE + 1) + RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS) #endif - lwz itmp1,(LA_SIZE + 1*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+LA_LR_OFFSET(r1) - lwz itmp3,-12(itmp1) - extsh itmp3,itmp3 - add mptr,mptr,itmp3 - stw pv,0(mptr) + lwz itmp1,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp) + mtlr itmp1 - mtctr pv + addi sp,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8) - lwz r0,(LA_SIZE + 1*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+LA_LR_OFFSET(r1) - mtlr r0 - addi r1,r1,(LA_SIZE + 1*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4) - lwz r29,-12(r1) -/* lwz pv,-8(r1)*/ - lwz r31,-4(r1) - bctr + mr. pv,pv /* test for exception */ + beq L_asm_call_jit_compiler_exception + + mtctr pv /* move method address to control reg */ + bctr /* and call the Java method */ + +L_asm_call_jit_compiler_exception: + mflr r0 + stw r0,LA_LR_OFFSET(sp) + stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */ + bl exceptions_get_and_clear_exception + lwz xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp) + mtlr xpc + addi sp,sp,LA_SIZE_ALIGNED + + mr xptr,v0 /* get exception */ + addi xpc,xpc,-4 /* exception address is ra - 4 */ + b L_asm_handle_nat_exception /********************* function asm_handle_exception *************************** @@ -466,672 +365,457 @@ noregchange: *******************************************************************************/ asm_handle_nat_exception: - mflr r9 - lwz itmp3,4(r9) - extsh itmp3,itmp3 - add pv,itmp3,r9 - lwz itmp3,8(r9) - srwi itmp3,itmp3,16 - cmpwi itmp3,0x3dad - bne asm_handle_exception - lwz itmp3,8(r9) - slwi itmp3,itmp3,16 - add pv,pv,itmp3 +L_asm_handle_nat_exception: /* required for PIC code */ +L_asm_handle_exception_stack_loop: + mflr r0 + addi sp,sp,-(LA_SIZE+((4+6)*4)) /* allocate stack (+4 for darwin) */ + stw xptr,LA_SIZE+(4+0)*4(sp) /* save exception pointer */ + stw xpc,LA_SIZE+(4+1)*4(sp) /* save exception pc */ + stw r0,LA_SIZE+(4+3)*4(sp) /* save return address */ + li itmp3,0 + stw itmp3,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag (cleared) */ + + mr a0,r0 /* pass return address */ + bl md_codegen_get_pv_from_pc /* get PV from RA */ + stw v0,LA_SIZE+(4+2)*4(sp) /* save data segment pointer */ + + lwz a0,LA_SIZE+(4+0)*4(sp) /* pass xptr */ + lwz a1,LA_SIZE+(4+1)*4(sp) /* pass xpc */ + lwz a2,LA_SIZE+(4+2)*4(sp) /* pass PV (v0 == a0) */ + addi a3,sp,LA_SIZE+((4+6)*4) /* pass Java SP */ + + b L_asm_handle_exception_continue asm_handle_exception: - addi r1,r1,-18*4 - stw r0,0*4(r1) - stw r2,1*4(r1) - stw r3,2*4(r1) - stw r4,3*4(r1) - stw r5,4*4(r1) - stw r6,5*4(r1) - stw r7,6*4(r1) - stw r8,7*4(r1) - stw r9,8*4(r1) - stw r10,9*4(r1) - stw r16,10*4(r1) - stw r17,11*4(r1) - stw r18,12*4(r1) - stw r19,13*4(r1) - stw r20,14*4(r1) - stw r21,15*4(r1) - stw r22,16*4(r1) - stw r23,17*4(r1) - - li r9,1 -ex_stack_loop: - addi r1,r1,-4*4 /* allocate stack */ - stw xptr,0*4(r1) /* save used register */ - stw xpc,1*4(r1) - mflr xptr - stw xptr,2*4(r1) - stw r9,3*4(r1) - - lwz r3,0*4(r1) /* exception pointer */ - lwz r4,MethodPointer(pv) /* method pointer */ - mr r5,xpc /* exception pc */ -/* mr r6,r9 */ - li r6,0 /* line number */ - li r7,4 /* set no unwind flag */ - - /* XXX no valid stack frame chaining here */ - addi r1,r1,-(24+5*4) /* 24 linkage area + 5 argument * 4 */ - bl builtin_trace_exception - addi r1,r1,(24+5*4) - - lwz xptr,2*4(r1) - mtlr xptr - lwz xptr,0*4(r1) /* restore xptr */ - lwz xpc,1*4(r1) - lwz r9,3*4(r1) - addi r1,r1,4*4 - - lwz r3,ExTableSize(pv) /* r3 = exception table size */ - mr. r3,r3 /* if empty table skip */ - beq empty_table - - addi r4,pv,ExTableStart /* r4 = start of exception table */ - -ex_table_loop: - lwz r5,ExStartPC(r4) /* r5 = exception start pc */ - cmplw r5,xpc /* (startpc <= xpc) */ - bgt ex_table_cont - lwz r5,ExEndPC(r4) /* r5 = exception end pc */ - cmplw xpc,r5 /* (xpc < endpc) */ - bge ex_table_cont - lwz r7,ExCatchType(r4) /* r7 = exception catch type */ - mr. r7,r7 - beq ex_handle_it - - lwz itmp3,offclassloaded(r7) - mr. itmp3,itmp3 - bne L_class_loaded - - /* XXX no valid stack frame chaining here */ - addi r1,r1,-16*4 /* allocate stack */ - stw r3,7*4(r1) /* save used registers */ - stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */ - stw r9,9*4(r1) - stw xptr,10*4(r1) - stw xpc,11*4(r1) - mflr xptr - stw xptr,12*4(r1) - stw r7,13*4(r1) - - mr r3,r7 /* arg1 = exceptionclass */ - bl load_class_bootstrap - - lwz r3,7*4(r1) - lwz r4,8*4(r1) - lwz r9,9*4(r1) - lwz xptr,10*4(r1) - lwz xpc,11*4(r1) - lwz itmp3,12*4(r1) - mtlr itmp3 - lwz r7,13*4(r1) - addi r1,r1,16*4 - -L_class_loaded: - lwz itmp3,offclasslinked(r7) - mr. itmp3,itmp3 - /* XXX no valid stack frame chaining here */ - addi r1,r1,-16*4 /* allocate stack */ - stw r7,13*4(r1) - bne L_class_linked - - stw r3,7*4(r1) /* save used registers */ - stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */ - stw r9,9*4(r1) - stw xptr,10*4(r1) - stw xpc,11*4(r1) - mflr xptr - stw xptr,12*4(r1) - - mr r3,r7 /* arg1 = exceptionclass */ - bl link_class - - lwz r3,7*4(r1) - lwz r4,8*4(r1) - lwz r9,9*4(r1) - lwz xptr,10*4(r1) - lwz xpc,11*4(r1) - lwz itmp3,12*4(r1) - mtlr itmp3 +L_asm_handle_exception: /* required for PIC code */ + addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */ -L_class_linked: -_crit_restart1: - lwz r7,13*4(r1) -_crit_begin1: - lwz r6,offobjvftbl(xptr) /* r6 = vftblptr(xptr) */ - lwz r7,offclassvftbl(r7) /* r7 = vftblptr(catchtype) class (not obj) */ - lwz r6,offbaseval(r6) /* r6 = baseval(xptr) */ - lwz r8,offbaseval(r7) /* r8 = baseval(catchtype) */ - lwz r7,offdiffval(r7) /* r7 = diffval(catchtype) */ -_crit_end1: - subf r6,r8,r6 /* r6 = baseval(xptr) - baseval(catchtype) */ - cmplw r6,r7 /* xptr is instanceof catchtype */ - addi r1,r1,16*4 - bgt ex_table_cont /* if (false) continue */ - -ex_handle_it: - lwz xpc,ExHandlerPC(r4) /* xpc = exception handler pc */ - mr. r9,r9 - beq ex_jump - - lwz r0,0*4(r1) - lwz r2,1*4(r1) - lwz r3,2*4(r1) - lwz r4,3*4(r1) - lwz r5,4*4(r1) - lwz r6,5*4(r1) - lwz r7,6*4(r1) - lwz r8,7*4(r1) - lwz r9,8*4(r1) - lwz r10,9*4(r1) - lwz r16,10*4(r1) - lwz r17,11*4(r1) - lwz r18,12*4(r1) - lwz r19,13*4(r1) - lwz r20,14*4(r1) - lwz r21,15*4(r1) - lwz r22,16*4(r1) - lwz r23,17*4(r1) - addi r1,r1,18*4 - -ex_jump: - mtctr xpc - bctr +#if defined(__DARWIN__) +#else + SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */ + SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */ +#endif -ex_table_cont: - addi r4,r4,ExEntrySize /* next exception table entry */ - addic. r3,r3,-1 /* decrement entry counter */ - bgt ex_table_loop /* if (t0 > 0) next entry */ - -empty_table: - mr. r9,r9 /* if here the first time, then */ - beq ex_already_cleared - addi r1,r1,18*4 /* deallocate stack and */ - li r9,0 /* clear the no unwind flag */ -ex_already_cleared: - lwz r3,IsSync(pv) /* t0 = SyncOffset */ - mr. r3,r3 - beq no_monitor_exit /* if zero no monitorexit */ - -#if defined(USE_THREADS) - add r3,r1,r3 - lwz r6,-4(r3) - - addi r1,r1,-6*4 - stw r3,0*4(r1) - stw r4,1*4(r1) - stw r9,2*4(r1) - stw xptr,3*4(r1) - stw xpc,4*4(r1) - mflr xptr - stw xptr,5*4(r1) - - mr r3,r6 - /* XXX no valid stack frame chaining here */ - addi r1,r1,-40 - bl builtin_monitorexit - addi r1,r1,40 - - lwz xptr,5*4(r1) - mtlr xptr - lwz r3,0*4(r1) - lwz r4,1*4(r1) - lwz r9,2*4(r1) - lwz xptr,3*4(r1) - lwz xpc,4*4(r1) - addi r1,r1,6*4 + addi sp,sp,-(LA_SIZE+(4+6)*4) /* allocate stack */ + stw xptr,LA_SIZE+(4+0)*4(sp) /* save xptr */ + stw pv,LA_SIZE+(4+2)*4(sp) /* save PV */ + mflr r0 /* save RA */ + stw r0,LA_SIZE+(4+3)*4(sp) + li t0,1 /* set maybe-leaf flag */ + stw t0,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag */ + + mr a0,xptr /* pass exception pointer */ + mr a1,xpc /* pass exception pc */ + mr a2,pv /* pass data segment pointer */ + addi a3,sp,LA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*4 + +L_asm_handle_exception_continue: + bl exceptions_handle_exception + + mr. v0,v0 + beq L_asm_handle_exception_not_catched + + mr xpc,v0 /* move handlerpc into xpc */ + lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */ + lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */ + lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */ + mtlr r0 + lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */ + addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */ + + mr. t0,t0 + beq L_asm_handle_exception_no_leaf + +#if defined(__DARWIN__) +#else + RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */ + RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */ #endif -no_monitor_exit: - lwz r3,FrameSize(pv) /* r3 = frame size */ - add r1,r1,r3 /* unwind stack */ - mr r3,r1 /* r3 = pointer to save area */ - lwz r4,IsLeaf(pv) /* r4 = is leaf procedure */ - mr. r4,r4 - bne ex_no_restore /* if (leaf) skip */ - lwz r4,LA_LR_OFFSET(r3) /* restore ra */ - mtlr r4 /* t0-- */ -ex_no_restore: - mflr r4 /* the new xpc is ra */ - mr xpc,r4 - lwz r4,IntSave(pv) /* r4 = saved int register count */ + addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */ + +L_asm_handle_exception_no_leaf: + mtctr xpc /* jump to the handler */ + bctr + +L_asm_handle_exception_not_catched: + lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */ + lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */ + lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */ + mtlr r0 + lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */ + addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */ + + mr. t0,t0 + beq L_asm_handle_exception_no_leaf_stack + + addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */ + li t0,0 /* clear the maybe-leaf flag */ + +L_asm_handle_exception_no_leaf_stack: + lwz t1,FrameSize(pv) /* get frame size */ + add t1,sp,t1 /* pointer to save area */ + + lwz t2,IsLeaf(pv) /* is leaf procedure */ + mr. t2,t2 + bne L_asm_handle_exception_no_ra_restore + + lwz r0,LA_LR_OFFSET(t1) /* restore ra */ + mtlr r0 + +L_asm_handle_exception_no_ra_restore: + mflr xpc /* the new xpc is ra */ + mr t4,xpc /* save RA */ + lwz t2,IntSave(pv) /* t2 = saved int register count */ bl ex_int1 ex_int1: - mflr r5 + mflr t3 /* t3 = current pc */ #if defined(__DARWIN__) - addi r5,r5,lo16(ex_int2-ex_int1) + addi t3,t3,lo16(ex_int2-ex_int1) #else - addi r5,r5,(ex_int2-ex_int1)@l + addi t3,t3,(ex_int2-ex_int1)@l #endif - slwi r4,r4,2 - subf r5,r4,r5 - mtctr r5 + slwi t2,t2,2 /* t2 = register count * 4 */ + subf t3,t2,t3 /* t3 = IntSave - t2 */ + mtctr t3 bctr - lwz s0,-40(r3) - lwz s1,-36(r3) - lwz s2,-32(r3) - lwz s3,-28(r3) - lwz s4,-24(r3) - lwz s5,-20(r3) - lwz s6,-16(r3) - lwz s7,-12(r3) - lwz s8,-8(r3) - lwz s9,-4(r3) + + lwz s0,-10*8(t1) + lwz s1,-9*8(t1) + lwz s2,-8*8(t1) + lwz s3,-7*8(t1) + lwz s4,-6*8(t1) + lwz s5,-5*8(t1) + lwz s6,-4*8(t1) + lwz s7,-3*8(t1) + lwz s8,-2*8(t1) + lwz s9,-1*8(t1) ex_int2: - subf r3,r4,r3 + subf t1,t2,t1 /* t1 = t1 - register count * 4 */ - lwz r4,FltSave(pv) + lwz t2,FltSave(pv) bl ex_flt1 ex_flt1: - mflr r5 + mflr t3 #if defined(__DARWIN__) - addi r5,r5,lo16(ex_flt2-ex_flt1) + addi t3,t3,lo16(ex_flt2-ex_flt1) #else - addi r5,r5,(ex_flt2-ex_flt1)@l + addi t3,t3,(ex_flt2-ex_flt1)@l #endif - slwi r4,r4,2 - subf r5,r4,r5 - mtctr r5 + slwi t2,t2,2 /* t2 = register count * 4 */ + subf t3,t2,t3 /* t3 = FltSave - t2 */ + mtctr t3 bctr - lfd fs0,-80(r3) - lfd fs1,-72(r3) - lfd fs2,-64(r3) - lfd fs3,-56(r3) - lfd fs4,-48(r3) - lfd fs5,-40(r3) - lfd fs6,-32(r3) - lfd fs7,-24(r3) - lfd fs8,-16(r3) - lfd fs9,-8(r3) + + lfd fs0,-10*8(t1) + lfd fs1,-9*8(t1) + lfd fs2,-8*8(t1) + lfd fs3,-7*8(t1) + lfd fs4,-6*8(t1) + lfd fs5,-5*8(t1) + lfd fs6,-4*8(t1) + lfd fs7,-3*8(t1) + lfd fs8,-2*8(t1) + lfd fs9,-1*8(t1) ex_flt2: - mtlr xpc - lwz itmp3,4(xpc) - extsh itmp3,itmp3 - add pv,itmp3,xpc - lwz itmp3,8(xpc) - srwi itmp3,itmp3,16 - cmpwi itmp3,0x3dad - bne ex_stack_loop - lwz itmp3,8(xpc) - slwi itmp3,itmp3,16 - add pv,pv,itmp3 - b ex_stack_loop - - -/* asm_wrapper_patcher ********************************************************* + mtlr t4 /* restore RA */ + lwz t1,FrameSize(pv) /* get frame size */ + add sp,sp,t1 /* unwind stack */ + b L_asm_handle_exception_stack_loop - XXX - Stack layout: - 16 return address into JIT code (patch position) - 12 pointer to virtual java_objectheader - 8 machine code (which is patched back later) - 4 unresolved class/method/field reference - 0 patcher function pointer to call +/* asm_abstractmethoderror ***************************************************** + + Creates and throws an AbstractMethodError. *******************************************************************************/ -asm_wrapper_patcher: +asm_abstractmethoderror: mflr r0 - stw r0,8*4+LA_LR_OFFSET(r1) /* skip stack frame of patcher stub */ - stwu r1,-((6+1+37)*4)(r1) /* keep stack 16-bytes aligned: 6+1+37 = 44 */ - -#if 1 - stw a0,(6+1+0)*4(r1) /* save argument registers */ - stw a1,(6+1+1)*4(r1) /* preserve linkage area (24 bytes) */ - stw a2,(6+1+2)*4(r1) /* and 4 bytes for 1 argument */ - stw a3,(6+1+3)*4(r1) - stw a4,(6+1+4)*4(r1) - stw a5,(6+1+5)*4(r1) - stw a6,(6+1+6)*4(r1) - stw a7,(6+1+7)*4(r1) - - stfd fa0,(6+1+8)*4(sp) - stfd fa1,(6+1+10)*4(sp) - stfd fa2,(6+1+12)*4(sp) - stfd fa3,(6+1+14)*4(sp) - stfd fa4,(6+1+16)*4(sp) - stfd fa5,(6+1+18)*4(sp) - stfd fa6,(6+1+20)*4(sp) - stfd fa7,(6+1+22)*4(sp) - stfd fa8,(6+1+24)*4(sp) - stfd fa9,(6+1+26)*4(sp) - stfd fa10,(6+1+28)*4(sp) - stfd fa11,(6+1+30)*4(sp) - stfd fa12,(6+1+32)*4(sp) -#else - SAVE_ARGUMENT_REGISTERS(6+1) /* save 8 int/13 float argument registers */ -#endif - -#if 0 - stw r2,25*8(r1) - stw r16,26*8(r1) - stw r17,27*8(r1) - stw r18,28*8(r1) - stw r19,29*8(r1) - stw r20,30*8(r1) - stw r21,31*8(r1) - stw r22,32*8(r1) - stw r23,33*8(r1) -#endif + stw r0,LA_LR_OFFSET(sp) + stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */ + addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */ + mr a1,r0 /* pass exception address */ + bl exceptions_asm_new_abstractmethoderror + lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp) + mtlr r0 /* restore return address */ + addi sp,sp,LA_SIZE_ALIGNED - stw itmp1,(6+1+34)*4(sp) - stw itmp2,(6+1+35)*4(sp) - stw pv,(6+1+36)*4(sp) + mr xptr,v0 /* get exception pointer */ + mr xpc,r0 /* we can't use r0 directly in addi */ + addi xpc,xpc,-4 /* exception address is ra - 4 */ + b L_asm_handle_nat_exception - addi a0,sp,(1+6+1+37)*4 /* pass sp, skip patcher function pointer */ - lwz pv,(0+6+1+37)*4(sp) /* get function pointer */ - mtctr pv /* call the patcher function */ - bctrl - mr itmp3,r3 /* save return value in temp register */ - -#if 1 - lwz a0,(6+1+0)*4(r1) - lwz a1,(6+1+1)*4(r1) - lwz a2,(6+1+2)*4(r1) - lwz a3,(6+1+3)*4(r1) - lwz a4,(6+1+4)*4(r1) - lwz a5,(6+1+5)*4(r1) - lwz a6,(6+1+6)*4(r1) - lwz a7,(6+1+7)*4(r1) - - lfd fa0,(6+1+8)*4(sp) - lfd fa1,(6+1+10)*4(sp) - lfd fa2,(6+1+12)*4(sp) - lfd fa3,(6+1+14)*4(sp) - lfd fa4,(6+1+16)*4(sp) - lfd fa5,(6+1+18)*4(sp) - lfd fa6,(6+1+20)*4(sp) - lfd fa7,(6+1+22)*4(sp) - lfd fa8,(6+1+24)*4(sp) - lfd fa9,(6+1+26)*4(sp) - lfd fa10,(6+1+28)*4(sp) - lfd fa11,(6+1+30)*4(sp) - lfd fa12,(6+1+32)*4(sp) -#else - RESTORE_ARGUMENT_REGISTERS(6+1)/* restore 8 int/13 float argument reg. */ -#endif -#if 0 - lwz r2,25*8(r1) - lwz r16,26*8(r1) - lwz r17,27*8(r1) - lwz r18,28*8(r1) - lwz r19,29*8(r1) - lwz r20,30*8(r1) - lwz r21,31*8(r1) - lwz r22,32*8(r1) - lwz r23,33*8(r1) -#endif +#if defined(ENABLE_REPLACEMENT) - lwz itmp1,(4+6+1+37)*4(sp)/* get return address (into JIT code) */ - mtlr itmp1 +/* asm_replacement_out ********************************************************* - lwz itmp1,(6+1+34)*4(sp) - lwz itmp2,(6+1+35)*4(sp) - lwz pv,(6+1+36)*4(sp) + This code is jumped to from the replacement-out stubs that are executed + when a thread reaches an activated replacement point. - addi r1,r1,(8+6+1+37)*4 /* remove stack frame + patcher stub stack */ + The purpose of asm_replacement_out is to read out the parts of the + execution state that cannot be accessed from C code, store this state, + and then call the C function replace_me. - mr. itmp3,itmp3 /* check for an exception */ - beq L_asm_wrapper_patcher_exception + Stack layout: + 16 start of stack inside method to replace + 0 rplpoint * info on the replacement point that was reached - blr /* jump to new patched code */ + NOTE: itmp3 has been clobbered by the replacement-out stub! -L_asm_wrapper_patcher_exception: -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-LA_SIZE_ALIGNED(r1) /* preserve linkage area */ - bl builtin_asm_get_exceptionptrptr - lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(r1) - mtlr r0 - addi r1,r1,LA_SIZE_ALIGNED -#else -# if defined(__DARWIN__) - lwz v0,lo16(_exceptionptr-0b)(pv) -# else - lis v0,_exceptionptr@ha - addi v0,v0,_exceptionptr@l -# endif -#endif +*******************************************************************************/ - lwz xptr,0(v0) /* get the exception pointer */ - li itmp3,0 - stw itmp3,0(v0) /* clear the exception pointer */ +/* some room to accomodate changes of the stack frame size during replacement */ + /* XXX we should find a cleaner solution here */ +#define REPLACEMENT_ROOM 512 + +#define sizeexecutionstate_ALIGNED ((sizeexecutionstate + 15) & ~15) + +asm_replacement_out: + /* create stack frame */ + addi sp,sp,-(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM) + + /* save link register */ + mflr itmp3 + + /* save registers in execution state */ + stw r0 ,( 0*4+offes_intregs)(sp) + stw r1 ,( 1*4+offes_intregs)(sp) + stw r2 ,( 2*4+offes_intregs)(sp) + stw r3 ,( 3*4+offes_intregs)(sp) + stw r4 ,( 4*4+offes_intregs)(sp) + stw r5 ,( 5*4+offes_intregs)(sp) + stw r6 ,( 6*4+offes_intregs)(sp) + stw r7 ,( 7*4+offes_intregs)(sp) + stw r8 ,( 8*4+offes_intregs)(sp) + stw r9 ,( 9*4+offes_intregs)(sp) + stw r10,(10*4+offes_intregs)(sp) + stw r11,(11*4+offes_intregs)(sp) + stw r12,(12*4+offes_intregs)(sp) + stw r13,(13*4+offes_intregs)(sp) + stw r14,(14*4+offes_intregs)(sp) + stw r15,(15*4+offes_intregs)(sp) + stw r16,(16*4+offes_intregs)(sp) /* link register stored as itmp3 */ + stw r17,(17*4+offes_intregs)(sp) + stw r18,(18*4+offes_intregs)(sp) + stw r19,(19*4+offes_intregs)(sp) + stw r20,(20*4+offes_intregs)(sp) + stw r21,(21*4+offes_intregs)(sp) + stw r22,(22*4+offes_intregs)(sp) + stw r23,(23*4+offes_intregs)(sp) + stw r24,(24*4+offes_intregs)(sp) + stw r25,(25*4+offes_intregs)(sp) + stw r26,(26*4+offes_intregs)(sp) + stw r27,(27*4+offes_intregs)(sp) + stw r28,(28*4+offes_intregs)(sp) + stw r29,(29*4+offes_intregs)(sp) + stw r30,(30*4+offes_intregs)(sp) + stw r31,(31*4+offes_intregs)(sp) + + stfd fr0 ,( 0*8+offes_fltregs)(sp) + stfd fr1 ,( 1*8+offes_fltregs)(sp) + stfd fr2 ,( 2*8+offes_fltregs)(sp) + stfd fr3 ,( 3*8+offes_fltregs)(sp) + stfd fr4 ,( 4*8+offes_fltregs)(sp) + stfd fr5 ,( 5*8+offes_fltregs)(sp) + stfd fr6 ,( 6*8+offes_fltregs)(sp) + stfd fr7 ,( 7*8+offes_fltregs)(sp) + stfd fr8 ,( 8*8+offes_fltregs)(sp) + stfd fr9 ,( 9*8+offes_fltregs)(sp) + stfd fr10,(10*8+offes_fltregs)(sp) + stfd fr11,(11*8+offes_fltregs)(sp) + stfd fr12,(12*8+offes_fltregs)(sp) + stfd fr13,(13*8+offes_fltregs)(sp) + stfd fr14,(14*8+offes_fltregs)(sp) + stfd fr15,(15*8+offes_fltregs)(sp) + stfd fr16,(16*8+offes_fltregs)(sp) + stfd fr17,(17*8+offes_fltregs)(sp) + stfd fr18,(18*8+offes_fltregs)(sp) + stfd fr19,(19*8+offes_fltregs)(sp) + stfd fr20,(20*8+offes_fltregs)(sp) + stfd fr21,(21*8+offes_fltregs)(sp) + stfd fr22,(22*8+offes_fltregs)(sp) + stfd fr23,(23*8+offes_fltregs)(sp) + stfd fr24,(24*8+offes_fltregs)(sp) + stfd fr25,(25*8+offes_fltregs)(sp) + stfd fr26,(26*8+offes_fltregs)(sp) + stfd fr27,(27*8+offes_fltregs)(sp) + stfd fr28,(28*8+offes_fltregs)(sp) + stfd fr29,(29*8+offes_fltregs)(sp) + stfd fr30,(30*8+offes_fltregs)(sp) + stfd fr31,(31*8+offes_fltregs)(sp) + + /* calculate sp of method */ + addi itmp1,sp,(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM + 4*4) + stw itmp1,(offes_sp)(sp) - mflr xpc - b asm_handle_exception + /* store pv */ + stw pv,(offes_pv)(sp) + /* call replace_me */ + lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */ + mr a1,sp /* arg1: execution state */ + addi sp,sp,-(LA_SIZE_ALIGNED) + b replace_me /* call C function replace_me */ -/* asm_builtin_arraycheckcast ************************************************** +/* asm_replacement_in ********************************************************** - Does the cast check and eventually throws an exception. + This code writes the given execution state and jumps to the replacement + code. -*******************************************************************************/ - -asm_builtin_arraycheckcast: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-48(r1) + This function never returns! - stw r3,32(r1) - bl builtin_arraycheckcast + NOTE: itmp3 is not restored! - lwz r0,48+LA_LR_OFFSET(r1) - mtlr r0 - mr. r3,r3 - beq nb_carray_throw - lwz r3,32(r1) - addi r1,r1,48 - blr + C prototype: + void asm_replacement_in(executionstate *es, replace_safestack_t *st); -nb_carray_throw: - addi r1,r1,48 - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_classcastexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception +*******************************************************************************/ +asm_replacement_in: + /* a0 == executionstate *es */ + /* a1 == replace_safestack_t *st */ -/******************* function asm_builtin_aastore ****************************** -* * -* Does the cast check and eventually throws an exception * -* * -*******************************************************************************/ - -asm_builtin_aastore: - mr. r3,r3 - beq nb_aastore_null - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-48(r1) - - lwz itmp1,offarraysize(r3) - slwi itmp3,r4,2 - add itmp2,r3,itmp3 - cmplw r4,itmp1 - bge nb_aastore_bound - mr r4,r5 - stw itmp2,32(r1) - stw r4,36(r1) - bl builtin_canstore - - lwz r0,48+LA_LR_OFFSET(r1) - mtlr r0 - lwz itmp1,32(r1) - lwz itmp2,36(r1) - addi r1,r1,48 - mr. r3,r3 - beq nb_aastore_store - stw itmp2,offobjarrdata(itmp1) - blr + /* get arguments */ + mr s1,a1 /* replace_safestack_t *st */ + mr s2,a0 /* executionstate *es == safe stack */ -nb_aastore_null: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_nullpointerexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception + /* switch to the safe stack */ + mr sp,s2 -nb_aastore_bound: - addi r1,r1,48 - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-(24+1*4)(r1) - mr r3,r4 /* move index into a0 */ - bl new_arrayindexoutofboundsexception - mr xptr,r3 - addi r1,r1,(24+1*4) - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception + /* reserve linkage area */ + addi sp,sp,-(LA_SIZE_ALIGNED) -nb_aastore_store: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_arraystoreexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception + /* call replace_build_execution_state(st) */ + mr a0,s1 + bl replace_build_execution_state + /* set new sp */ + lwz sp,(offes_sp)(s2) -asm_builtin_idiv: - mr. r4,r4 - beq nb_idiv - lis itmp3,0x8000 - cmpw r3,itmp3 - bne normal_idiv - cmpwi r4,-1 - bne normal_idiv - blr + /* build stack frame */ + addi sp,sp,-(sizeexecutionstate_ALIGNED) -normal_idiv: - divw r3,r3,r4 - blr + /* call replace_free_safestack(st,& of allocated executionstate_t) */ + mr a1,sp /* tmpes */ + mr a0,s1 /* st */ + addi sp,sp,-(LA_SIZE_ALIGNED) /* reserve linkage area */ + bl replace_free_safestack + addi sp,sp,+(LA_SIZE_ALIGNED) /* tear down linkage area */ -nb_idiv: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_arithmeticexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception - - -asm_builtin_irem: - mr itmp2,r3 - mr. r4,r4 - beq nb_irem - lis itmp3,0x8000 - cmpw itmp2,itmp3 - bne normal_irem - cmpwi r4,-1 - bne normal_irem - li r3,0 - beqlr - -normal_irem: - divw itmp3,itmp2,r4 - mullw itmp3,itmp3,r4 - subf r3,itmp3,itmp2 - blr + /* set new pv */ + lwz pv,(offes_pv)(sp) + + /* copy registers from execution state */ + lwz r0 ,( 0*4+offes_intregs)(sp) + /* r1 is sp */ + /* r2 is reserved */ + lwz a0 ,( 3*4+offes_intregs)(sp) + lwz r4 ,( 4*4+offes_intregs)(sp) + lwz r5 ,( 5*4+offes_intregs)(sp) + lwz r6 ,( 6*4+offes_intregs)(sp) + lwz r7 ,( 7*4+offes_intregs)(sp) + lwz r8 ,( 8*4+offes_intregs)(sp) + lwz r9 ,( 9*4+offes_intregs)(sp) + lwz r10,(10*4+offes_intregs)(sp) + lwz r11,(11*4+offes_intregs)(sp) + lwz r12,(12*4+offes_intregs)(sp) + /* r13 is pv */ + lwz r14,(14*4+offes_intregs)(sp) + lwz r15,(15*4+offes_intregs)(sp) + lwz r16,(16*4+offes_intregs)(sp) /* itmp3, later to link register */ + lwz r17,(17*4+offes_intregs)(sp) + lwz r18,(18*4+offes_intregs)(sp) + lwz r19,(19*4+offes_intregs)(sp) + lwz r20,(20*4+offes_intregs)(sp) + lwz r21,(21*4+offes_intregs)(sp) + lwz r22,(22*4+offes_intregs)(sp) + lwz r23,(23*4+offes_intregs)(sp) + lwz r24,(24*4+offes_intregs)(sp) + lwz r25,(25*4+offes_intregs)(sp) + lwz r26,(26*4+offes_intregs)(sp) + lwz r27,(27*4+offes_intregs)(sp) + lwz r28,(28*4+offes_intregs)(sp) + lwz r29,(29*4+offes_intregs)(sp) + lwz r30,(30*4+offes_intregs)(sp) + lwz r31,(31*4+offes_intregs)(sp) + + lfd fr0 ,( 0*8+offes_fltregs)(sp) + lfd fr1 ,( 1*8+offes_fltregs)(sp) + lfd fr2 ,( 2*8+offes_fltregs)(sp) + lfd fr3 ,( 3*8+offes_fltregs)(sp) + lfd fr4 ,( 4*8+offes_fltregs)(sp) + lfd fr5 ,( 5*8+offes_fltregs)(sp) + lfd fr6 ,( 6*8+offes_fltregs)(sp) + lfd fr7 ,( 7*8+offes_fltregs)(sp) + lfd fr8 ,( 8*8+offes_fltregs)(sp) + lfd fr9 ,( 9*8+offes_fltregs)(sp) + lfd fr10,(10*8+offes_fltregs)(sp) + lfd fr11,(11*8+offes_fltregs)(sp) + lfd fr12,(12*8+offes_fltregs)(sp) + lfd fr13,(13*8+offes_fltregs)(sp) + lfd fr14,(14*8+offes_fltregs)(sp) + lfd fr15,(15*8+offes_fltregs)(sp) + lfd fr16,(16*8+offes_fltregs)(sp) + lfd fr17,(17*8+offes_fltregs)(sp) + lfd fr18,(18*8+offes_fltregs)(sp) + lfd fr19,(19*8+offes_fltregs)(sp) + lfd fr20,(20*8+offes_fltregs)(sp) + lfd fr21,(21*8+offes_fltregs)(sp) + lfd fr22,(22*8+offes_fltregs)(sp) + lfd fr23,(23*8+offes_fltregs)(sp) + lfd fr24,(24*8+offes_fltregs)(sp) + lfd fr25,(25*8+offes_fltregs)(sp) + lfd fr26,(26*8+offes_fltregs)(sp) + lfd fr27,(27*8+offes_fltregs)(sp) + lfd fr28,(28*8+offes_fltregs)(sp) + lfd fr29,(29*8+offes_fltregs)(sp) + lfd fr30,(30*8+offes_fltregs)(sp) + lfd fr31,(31*8+offes_fltregs)(sp) + + /* restore link register */ -nb_irem: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_arithmeticexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception + mtlr itmp3 + + /* load new pc */ + lwz itmp3,offes_pc(sp) -asm_builtin_ldiv: - or. r0,r5,r6 - beq nb_ldiv - b builtin_ldiv + /* remove stack frame */ -nb_ldiv: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_arithmeticexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception + addi sp,sp,+(sizeexecutionstate_ALIGNED) + /* jump to new code */ -asm_builtin_lrem: - or. r0,r5,r6 - beq nb_lrem - b builtin_lrem + mtctr itmp3 + bctr -nb_lrem: - mflr r0 - stw r0,LA_LR_OFFSET(r1) - stwu r1,-24(r1) - bl new_arithmeticexception - mr xptr,r3 - addi r1,r1,24 - lwz r0,LA_LR_OFFSET(r1) - mr xpc,r0 - mtlr r0 - b asm_handle_nat_exception +#endif /* defined(ENABLE_REPLACEMENT) */ +/*********************************************************************/ asm_cacheflush: - add r4,r3,r4 - rlwinm r3,r3,0,0,26 - addi r4,r4,31 - rlwinm r4,r4,0,0,26 - mr r5,r3 + add a1,a0,a1 + rlwinm a0,a0,0,0,26 + addi a1,a1,31 + rlwinm a1,a1,0,0,26 + mr a2,a0 1: - cmplw r3,r4 + cmplw a0,a1 bge 0f - dcbst 0,r3 - addi r3,r3,32 + dcbst 0,a0 + addi a0,a0,32 b 1b 0: sync 1: - cmplw r5,r4 + cmplw a2,a1 bge 0f - icbi 0,r5 - addi r5,r5,32 + icbi 0,a2 + addi a2,a2,32 b 1b 0: sync @@ -1139,204 +823,269 @@ asm_cacheflush: blr - .align 3 -doublezero: - .double 0.0 - -asm_initialize_thread_stack: - addi r4,r4,-256 - stw r3,120(r4) - li r3,0 - stw r3,124(r4) - stw r3,0(r4) - stw r3,4(r4) - stw r3,8(r4) - stw r3,12(r4) - stw r3,16(r4) - stw r3,20(r4) - stw r3,24(r4) - stw r3,28(r4) - stw r3,32(r4) - stw r3,36(r4) - - stw r3,128(r4) - stw r3,132(r4) - stw r3,136(r4) - stw r3,140(r4) - stw r3,144(r4) - stw r3,148(r4) - stw r3,152(r4) - stw r3,156(r4) +/* asm_compare_and_swap ******************************************************** + + XXX + +*******************************************************************************/ + +asm_compare_and_swap: +1: + lwarx a6,0,a0 + subf. r0,a6,a1 + bne- 2f + or r0,a2,a2 + stwcx. r0,0,a0 + bne- 1b +2: + mr a0,a6 + blr + + +/* asm_memory_barrier ********************************************************** + + XXX + +*******************************************************************************/ + +asm_memory_barrier: + sync + blr + + +#if defined(__DARWIN__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_builtin_throw_exception$stub: + .indirect_symbol _builtin_throw_exception mflr r0 - bl 0f -0: - mflr r3 + bcl 20,31,L00$_builtin_throw_exception +L00$_builtin_throw_exception: + mflr r11 + addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception) mtlr r0 -#if defined(__DARWIN__) - lfd fr0,lo16(doublezero-0b)(r3) -#else - lfd fr0,(doublezero-0b)@l(r3) -#endif + lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_builtin_throw_exception$lazy_ptr: + .indirect_symbol _builtin_throw_exception + .long dyld_stub_binding_helper - stfd fr0,40(r4) - stfd fr0,48(r4) - stfd fr0,56(r4) - stfd fr0,64(r4) - stfd fr0,72(r4) - stfd fr0,80(r4) - stfd fr0,88(r4) - stfd fr0,96(r4) - stfd fr0,104(r4) - stfd fr0,112(r4) - - stfd fr0,160(r4) - stfd fr0,168(r4) - stfd fr0,176(r4) - stfd fr0,184(r4) - stfd fr0,192(r4) - stfd fr0,200(r4) - stfd fr0,208(r4) - stfd fr0,216(r4) - - mr r3,r4 - blr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_md_codegen_get_pv_from_pc$stub: + .indirect_symbol _md_codegen_get_pv_from_pc + mflr r0 + bcl 20,31,L00$_md_codegen_get_pv_from_pc +L00$_md_codegen_get_pv_from_pc: + mflr r11 + addis r11,r11,ha16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc) + mtlr r0 + lwzu r12,lo16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_md_codegen_get_pv_from_pc$lazy_ptr: + .indirect_symbol _md_codegen_get_pv_from_pc + .long dyld_stub_binding_helper -asm_perform_threadswitch: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_exceptions_handle_exception$stub: + .indirect_symbol _exceptions_handle_exception mflr r0 - addi r1,r1,-224 - stw r0,120(r1) - stw pv,124(r1) - stw r14,0(r1) - stw r15,4(r1) - stw r24,8(r1) - stw r25,12(r1) - stw r26,16(r1) - stw r27,20(r1) - stw r28,24(r1) - stw r29,28(r1) - stw r30,32(r1) - stw r31,36(r1) - stfd fr14,40(r1) - stfd fr15,48(r1) - stfd fr24,56(r1) - stfd fr25,64(r1) - stfd fr26,72(r1) - stfd fr27,80(r1) - stfd fr28,88(r1) - stfd fr29,96(r1) - stfd fr30,104(r1) - stfd fr31,112(r1) - - stw r16,128(r1) - stw r17,132(r1) - stw r18,136(r1) - stw r19,140(r1) - stw r20,144(r1) - stw r21,148(r1) - stw r22,152(r1) - stw r23,156(r1) - stfd fr16,160(r1) - stfd fr17,168(r1) - stfd fr18,176(r1) - stfd fr19,184(r1) - stfd fr20,192(r1) - stfd fr21,200(r1) - stfd fr22,208(r1) - stfd fr23,216(r1) - - stw r1,0(r3) - stw r1,0(r5) - lwz r1,0(r4) - - lwz r0,120(r1) - lwz pv,124(r1) - lwz r14,0(r1) - lwz r15,4(r1) - lwz r24,8(r1) - lwz r25,12(r1) - lwz r26,16(r1) - lwz r27,20(r1) - lwz r28,24(r1) - lwz r29,28(r1) - lwz r30,32(r1) - lwz r31,36(r1) - lfd fr14,40(r1) - lfd fr15,48(r1) - lfd fr24,56(r1) - lfd fr25,64(r1) - lfd fr26,72(r1) - lfd fr27,80(r1) - lfd fr28,88(r1) - lfd fr29,96(r1) - lfd fr30,104(r1) - lfd fr31,112(r1) - - lwz r16,128(r1) - lwz r17,132(r1) - lwz r18,136(r1) - lwz r19,140(r1) - lwz r20,144(r1) - lwz r21,148(r1) - lwz r22,152(r1) - lwz r23,156(r1) - lfd fr16,160(r1) - lfd fr17,168(r1) - lfd fr18,176(r1) - lfd fr19,184(r1) - lfd fr20,192(r1) - lfd fr21,200(r1) - lfd fr22,208(r1) - lfd fr23,216(r1) + bcl 20,31,L00$_exceptions_handle_exception +L00$_exceptions_handle_exception: + mflr r11 + addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception) + mtlr r0 + lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_exceptions_handle_exception$lazy_ptr: + .indirect_symbol _exceptions_handle_exception + .long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_stacktrace_create_extern_stackframeinfo$stub: + .indirect_symbol _stacktrace_create_extern_stackframeinfo + mflr r0 + bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo +L00$_stacktrace_create_extern_stackframeinfo: + mflr r11 + addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo) mtlr r0 - addi r1,r1,224 - blr + lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_stacktrace_create_extern_stackframeinfo$lazy_ptr: + .indirect_symbol _stacktrace_create_extern_stackframeinfo + .long dyld_stub_binding_helper -asm_switchstackandcall: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_jit_asm_compile$stub: + .indirect_symbol _jit_asm_compile mflr r0 - stwu r3,-48(r3) - stw r0,40(r3) - stw r1,44(r3) - stw r1,0(r5) - mr r1,r3 - - mtctr r4 - mr r3,r6 - bctrl + bcl 20,31,L00$_jit_asm_compile +L00$_jit_asm_compile: + mflr r11 + addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile) + mtlr r0 + lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_jit_asm_compile$lazy_ptr: + .indirect_symbol _jit_asm_compile + .long dyld_stub_binding_helper - lwz r0,40(r1) + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_stacktrace_remove_stackframeinfo$stub: + .indirect_symbol _stacktrace_remove_stackframeinfo + mflr r0 + bcl 20,31,L00$_stacktrace_remove_stackframeinfo +L00$_stacktrace_remove_stackframeinfo: + mflr r11 + addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo) mtlr r0 - lwz r1,44(r1) - blr + lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_stacktrace_remove_stackframeinfo$lazy_ptr: + .indirect_symbol _stacktrace_remove_stackframeinfo + .long dyld_stub_binding_helper -asm_getclassvalues_atomic: -_crit_restart2: -_crit_begin2: - lwz r6,offbaseval(r3) - lwz r7,offdiffval(r3) - lwz r8,offbaseval(r4) -_crit_end2: - stw r6,offcast_super_baseval(r5) - stw r7,offcast_super_diffval(r5) - stw r8,offcast_sub_baseval(r5) - blr +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_exceptions_get_and_clear_exception$stub: + .indirect_symbol _exceptions_get_and_clear_exception + mflr r0 + bcl 20,31,L00$_exceptions_get_and_clear_exception +L00$_exceptions_get_and_clear_exception: + mflr r11 + addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception) + mtlr r0 + lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_exceptions_get_and_clear_exception$lazy_ptr: + .indirect_symbol _exceptions_get_and_clear_exception + .long dyld_stub_binding_helper + + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_exceptions_asm_new_abstractmethoderror$stub: + .indirect_symbol _exceptions_asm_new_abstractmethoderror + mflr r0 + bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror +L00$_exceptions_asm_new_abstractmethoderror: + mflr r11 + addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror) + mtlr r0 + lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_exceptions_asm_new_abstractmethoderror$lazy_ptr: + .indirect_symbol _exceptions_asm_new_abstractmethoderror + .long dyld_stub_binding_helper + + +# if defined(ENABLE_REPLACEMENT) + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_replace_me$stub: + .indirect_symbol _replace_me + mflr r0 + bcl 20,31,L00$_replace_me +L00$_replace_me: + mflr r11 + addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me) + mtlr r0 + lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_replace_me$lazy_ptr: + .indirect_symbol _replace_me + .long dyld_stub_binding_helper + + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_replace_build_execution_state$stub: + .indirect_symbol _replace_build_execution_state + mflr r0 + bcl 20,31,L00$_replace_build_execution_state +L00$_replace_build_execution_state: + mflr r11 + addis r11,r11,ha16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state) + mtlr r0 + lwzu r12,lo16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_replace_build_execution_state$lazy_ptr: + .indirect_symbol _replace_build_execution_state + .long dyld_stub_binding_helper + + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_replace_free_safestack$stub: + .indirect_symbol _replace_free_safestack + mflr r0 + bcl 20,31,L00$_replace_free_safestack +L00$_replace_free_safestack: + mflr r11 + addis r11,r11,ha16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack) + mtlr r0 + lwzu r12,lo16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_replace_free_safestack$lazy_ptr: + .indirect_symbol _replace_free_safestack + .long dyld_stub_binding_helper + +# endif /* ENABLE_REPLACEMENT */ + +#endif /* defined(__DARWIN__) */ + - .data +/* disable exec-stacks ********************************************************/ -asm_criticalsections: -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - .long _crit_begin1 - .long _crit_end1 - .long _crit_restart1 - .long _crit_begin2 - .long _crit_end2 - .long _crit_restart2 +#if defined(__linux__) && defined(__ELF__) + .section .note.GNU-stack,"",%progbits #endif - .long 0 /* @@ -1350,4 +1099,5 @@ asm_criticalsections: * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */