X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Fasmpart.S;h=a17fe5217c394ee5659ac43ae1a4cf76ab5fdf84;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=a7db0e9533483be3b6b2457183d718deab219cca;hpb=e7bb913a0ada03d26960fb1bf33fb3b25067f71b;p=cacao.git diff --git a/src/vm/jit/powerpc/asmpart.S b/src/vm/jit/powerpc/asmpart.S index a7db0e953..a17fe5217 100644 --- a/src/vm/jit/powerpc/asmpart.S +++ b/src/vm/jit/powerpc/asmpart.S @@ -1,10 +1,9 @@ -/* jit/powerpc/asmpart.S - Java-C interface functions for powerpc +/* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC - 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, 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. @@ -20,1122 +19,803 @@ 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. + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - Contact: cacao@complang.tuwien.ac.at +*/ - Authors: Andreas Krall - Reinhard Grafl - $Id: asmpart.S 979 2004-03-25 23:46:22Z twisti $ +#include "config.h" -*/ +#include "md-abi.h" +#include "md-asm.h" +#include "vm/jit/abi-asm.h" +#include "vm/jit/methodheader.h" -#include "offsets.h" + .text -#define MethodPointer -8 -#define FrameSize -12 -#define IsSync -16 -#define IsLeaf -20 -#define IntSave -24 -#define FltSave -28 -#define ExTableSize -32 -#define ExTableStart -32 + .align 2 -#define ExEntrySize -16 -#define ExStartPC -4 -#define ExEndPC -8 -#define ExHandlerPC -12 -#define ExCatchType -16 -#define itmp1 r11 -#define itmp2 r12 -#define itmp3 r0 +/* export functions ***********************************************************/ -#define xptr itmp1 -#define xpc itmp2 + .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 -#define pv r13 -#define mptr r12 -#define mptrn 12 + .globl asm_vm_call_method_exception_handler + .globl asm_vm_call_method_end + .globl asm_call_jit_compiler - .text + .globl asm_handle_nat_exception + .globl asm_handle_exception - .align 2 + .globl asm_abstractmethoderror - .globl _asm_docalljavamethod - .globl _asm_calljavafunction2 - .globl _asm_calljavafunction2long - .globl _asm_calljavafunction2double - .globl _asm_call_jit_compiler - - .globl _jit_compile - .globl _asm_handle_nat_exception - .globl _asm_handle_exception - .globl _asm_check_clinit - .globl _asm_builtin_checkarraycast - .globl _asm_builtin_aastore - .globl _builtin_canstore - .globl _builtin_trace_exception - .globl _builtin_monitorenter - .globl _builtin_monitorexit - .globl _builtin_ldiv - .globl _builtin_lrem - .globl _builtin_checkarraycast - .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_cacheflush - .globl _asm_initialize_thread_stack - .globl _asm_perform_threadswitch - .globl _asm_switchstackandcall - - .globl _string_java_lang_NullPointerException - .globl _string_java_lang_ArrayIndexOutOfBoundsException - .globl _string_java_lang_ArrayStoreException - .globl _string_java_lang_ArithmeticException - .globl _string_java_lang_ArithmeticException_message - .globl _string_java_lang_ClassCastException - - .globl _builtin_throw_exception - .globl _class_init - .globl _catch_Handler - .globl _new_exception - .globl _new_exception_message - .globl _new_exception_int - - .globl _asm_sighandler - -jitcompile: - .long _jit_compile - -class_init: - .long _class_init - -builtinthrow: - .long _builtin_throw_exception - -builtin_traceexception: - .long _builtin_trace_exception -builtin_monitorenter: - .long _builtin_monitorenter -builtin_monitorexit: - .long _builtin_monitorexit -builtin_ldiv: - .long _builtin_ldiv -builtin_lrem: - .long _builtin_lrem - -builtincanstore: - .long _builtin_canstore -builtincheckarraycast: - .long _builtin_checkarraycast - -new_exception: - .long _new_exception -new_exception_message: - .long _new_exception_message -new_exception_int: - .long _new_exception_int - -string_java_lang_NullPointerException: - .long _string_java_lang_NullPointerException -string_java_lang_ArrayIndexOutOfBoundsException: - .long _string_java_lang_ArrayIndexOutOfBoundsException -string_java_lang_ArrayStoreException: - .long _string_java_lang_ArrayStoreException -string_java_lang_ArithmeticException: - .long _string_java_lang_ArithmeticException -string_java_lang_ArithmeticException_message: - .long _string_java_lang_ArithmeticException_message -string_java_lang_ClassCastException: - .long _string_java_lang_ClassCastException - -catch_Handler: - .long _catch_Handler +#if defined(ENABLE_REPLACEMENT) + .globl asm_replacement_out + .globl asm_replacement_in +#endif - -#define MethodPointer -8 -#define FrameSize -12 -#define IsSync -16 -#define IsLeaf -20 -#define IntSave -24 -#define FltSave -28 -#define ExTableSize -32 -#define ExTableStart -32 - -#define ExEntrySize -16 -#define ExStartPC -4 -#define ExEndPC -8 -#define ExHandlerPC -12 -#define ExCatchType -16 + .globl asm_cacheflush + .globl asm_compare_and_swap + .globl asm_memory_barrier + + +/* asm_vm_call_method ********************************************************** +* * +* This function calls a Java-method (which possibly needs compilation) * +* with up to 4 address parameters. * +* * +* This functions calls the JIT-compiler which eventually translates the * +* method into machine code. * +* * +* C-prototype: * +* javaobject_header *asm_calljavamethod (methodinfo *m, * +* 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 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_docalljavamethod: + + .long 0 /* catch type all */ + .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 /* IsSync */ + .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,8(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 f16,72(r1) - stfd f17,80(r1) - stfd f18,88(r1) - stfd f19,96(r1) - stfd f20,104(r1) - stfd f21,112(r1) - stfd f22,120(r1) - stfd f23,128(r1) - - stw r3,36(r1) - addi r2,r1,36 - mr r3,r4 - mr r4,r5 - mr r5,r6 - mr r6,r7 - -// addis mptr,r31,ha16(_asm_call_jit_compiler-0b) - addi mptr,r31,lo16(_asm_call_jit_compiler-0b) - stw mptr,32(r1) - addi mptr,r1,28 - - lwz pv,4(mptr) + 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__) + stw itmp1,10*4(sp) /* register r11 is callee saved */ +#endif + stw pv,11*4(sp) /* save PV register */ + + 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__) + 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 + SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */ +#endif + + 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) + +#if defined(__DARWIN__) + 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 + + 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 */ + +L_asm_vm_call_method_stack_copy_loop: +#if defined(__DARWIN__) + lwz t3,21*8+0(t0) /* load argument */ + lwz t4,21*8+4(t0) +#else + lwz t3,16*8+0(t0) /* load argument */ + lwz t4,16*8+4(t0) +#endif + 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 - addi pv,itmp1,lo16(_asm_docalljavamethod-1b) - -calljava_regrestore: - 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 f16,72(r1) - lfd f17,80(r1) - lfd f18,88(r1) - lfd f19,96(r1) - lfd f20,104(r1) - lfd f21,112(r1) - lfd f22,120(r1) - lfd f23,128(r1) - - lwz r0,148+8(r1) +#if defined(__DARWIN__) + 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 + RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */ +#endif + + 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_xhandler: - mr r3,itmp1 -// addis pv,r31,ha16(builtinthrow-0b) - lwz itmp1,lo16(builtinthrow-0b)(r31) - mtctr itmp1 - bctrl - b calljava_regrestore +asm_vm_call_method_exception_handler: + mr a0,itmp1 + bl builtin_throw_exception + b L_asm_vm_call_method_return +asm_vm_call_method_end: + nop +/* asm_call_jit_compiler ******************************************************* - .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_calljavafunction2long: -_asm_calljavafunction2double: + Invokes the compiler for untranslated JavaVM methods. + +*******************************************************************************/ + +asm_call_jit_compiler: +L_asm_call_jit_compiler: /* required for PIC code */ mflr r0 - stw r31,-4(r1) -// stw r30,-8(r1) - stw pv,-12(r1) - stw r0,8(r1) - addi r1,r1,-148 - 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 f16,72(r1) - stfd f17,80(r1) - stfd f18,88(r1) - stfd f19,96(r1) - stfd f20,104(r1) - stfd f21,112(r1) - stfd f22,120(r1) - stfd f23,128(r1) - - stw r3,36(r1) /* save method pointer for compiler */ - addi r2,r1,36 - 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: -// addis mptr,r31,ha16(_asm_call_jit_compiler-0b) - addi mptr,r31,lo16(_asm_call_jit_compiler-0b) - stw mptr,32(r1) - addi mptr,r1,28 - - lwz pv,4(mptr) - mtctr pv - bctrl -1: - mflr itmp1 - addi pv,itmp1,lo16(_asm_docalljavamethod-1b) - -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 f16,72(r1) - lfd f17,80(r1) - lfd f18,88(r1) - lfd f19,96(r1) - lfd f20,104(r1) - lfd f21,112(r1) - lfd f22,120(r1) - lfd f23,128(r1) - - lwz r0,148+8(r1) - mtlr r0 - addi r1,r1,148 - lwz pv,-12(r1) -// lwz r30,-8(r1) - lwz r31,-4(r1) - blr + 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_SIZE_IN_POINTERS) +#endif + + 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_SIZE_IN_POINTERS) +#endif + + lwz itmp1,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp) + mtlr itmp1 + + addi sp,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8) + + 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 -calljava_xhandler2: - mr r3,itmp1 -// addis pv,r31,ha16(builtinthrow-0b) - lwz itmp1,lo16(builtinthrow-0b)(r31) - mtctr itmp1 - bctrl - b calljava_regrestore2 + mr xptr,v0 /* get exception */ + addi xpc,xpc,-4 /* exception address is ra - 4 */ + b L_asm_handle_nat_exception -_asm_call_jit_compiler: -0: - mflr itmp1 - stw r31,-4(r1) -// stw pv,-8(r1) - stw r29,-12(r1) - stw itmp1,8(r1) - addi r1,r1,-176 - 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 +/********************* function asm_handle_exception *************************** +* * +* This function handles an exception. It does not use the usual calling * +* conventions. The exception pointer is passed in REG_ITMP1 and the * +* pc from the exception raising position is passed in REG_ITMP2. It searches * +* the local exception table for a handler. If no one is found, it unwinds * +* stacks and continues searching the callers. * +* * +* void asm_handle_exception (exceptionptr, exceptionpc); * +* * +*******************************************************************************/ -noregchange: - mr r29,mptr - stw r3,28(r1) - stw r4,32(r1) - stw r5,36(r1) - stw r6,40(r1) - stw r7,44(r1) - stw r8,48(r1) - stw r9,52(r1) - stfd f1,56(r1) - stfd f2,64(r1) - stfd f3,72(r1) - stfd f4,80(r1) - stfd f5,88(r1) - stfd f6,96(r1) - stfd f7,104(r1) - stfd f8,112(r1) - stfd f9,120(r1) - stfd f10,128(r1) - stfd f11,136(r1) - stfd f12,144(r1) - stfd f13,152(r1) - stw r10,160(r1) - - lwz r3,0(r2) -// addis pv,r31,ha16(jitcompile-0b) - lwz itmp1,lo16(jitcompile-0b)(r31) - mtctr itmp1 - bctrl +asm_handle_nat_exception: +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: +L_asm_handle_exception: /* required for PIC code */ + addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */ + +#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 + + 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 pv,r3 - mr mptr,r29 - lwz r3,28(r1) - lwz r4,32(r1) - lwz r5,36(r1) - lwz r6,40(r1) - lwz r7,44(r1) - lwz r8,48(r1) - lwz r9,52(r1) - lfd f1,56(r1) - lfd f2,64(r1) - lfd f3,72(r1) - lfd f4,80(r1) - lfd f5,88(r1) - lfd f6,96(r1) - lfd f7,104(r1) - lfd f8,112(r1) - lfd f9,120(r1) - lfd f10,128(r1) - lfd f11,136(r1) - lfd f12,144(r1) - lfd f13,152(r1) - lwz r10,160(r1) - - lwz itmp1,176+8(r1) - lwz itmp3,-12(itmp1) - extsh itmp3,itmp3 - add mptr,mptr,itmp3 - stw pv,0(mptr) + mr. t0,t0 + beq L_asm_handle_exception_no_leaf - mtctr pv +#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 - lwz r0,176+8(r1) - mtlr r0 - addi r1,r1,176 - lwz r29,-12(r1) -// lwz pv,-8(r1) - lwz r31,-4(r1) + 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 -_asm_handle_nat_exception: - mflr r2 - lwz itmp3,4(r2) - extsh itmp3,itmp3 - add pv,itmp3,r2 - lwz itmp3,8(r2) - srwi itmp3,itmp3,16 - cmpwi itmp3,0x3dad - bne _asm_handle_exception - lwz itmp3,8(r2) - slwi itmp3,itmp3,16 - add pv,pv,itmp3 - -_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 r2,1 -ex_stack_loop: - addi r1,r1,-4*4 - stw xptr,0*4(r1) - stw xpc,1*4(r1) - mflr xptr - stw xptr,2*4(r1) - stw r2,3*4(r1) - - lwz r3,0*4(r1) /* exception pointer */ - lwz r4,MethodPointer(pv) /* method pointer */ - mr r5,xpc /* exception pc */ -/* mr r6,r2 */ - li r6,0 /* line number */ - li r7,4 /* set no unwind flag */ - - bl 0f -0: - mflr itmp1 - lwz itmp1,lo16(builtin_traceexception-0b)(itmp1) - mtctr itmp1 - addi r1,r1,-(24+5*4) /* 24 linkage area + 5 argument * 4 */ - bctrl - 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 r2,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) - cmplw r5,xpc - bgt ex_table_cont - lwz r5,ExEndPC(r4) - cmplw xpc,r5 - bge ex_table_cont - lwz r7,ExCatchType(r4) - mr. r7,r7 - beq ex_handle_it - - 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) */ - subf r6,r8,r6 /* r6 = baseval(xptr) - baseval(catchtype) */ - cmplw r6,r7 /* xptr is instanceof catchtype */ - bgt ex_table_cont /* if (false) continue */ - -ex_handle_it: - lwz xpc,ExHandlerPC(r4) /* xpc = exception handler pc */ - mr. r2,r2 - 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 + addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */ + li t0,0 /* clear the maybe-leaf flag */ -ex_table_cont: - addi r4,r4,ExEntrySize - addic. r3,r3,-1 - bgt ex_table_loop - -empty_table: - mr. r2,r2 /* if here the first time, then */ - beq ex_already_cleared - addi r1,r1,18*4 /* deallocate stack and */ - li r2,0 /* clear the no unwind flag */ -ex_already_cleared: - lwz r3,IsSync(pv) - mr. r3,r3 - beq no_monitor_exit - add r3,r1,r3 - lwz r6,-4(r3) - - addi r1,r1,-6*4 - stw r3,0*4(r1) - stw r4,1*4(r1) - stw r2,2*4(r1) - stw xptr,3*4(r1) - stw xpc,4*4(r1) - mflr xptr - stw xptr,5*4(r1) - - mr r3,r6 - bl 0f -0: - mflr itmp1 - lwz itmp1,lo16(builtin_monitorexit-0b)(itmp1) - mtctr itmp1 - addi r1,r1,-40 - bctrl - addi r1,r1,40 - - lwz xptr,5*4(r1) - mtlr xptr - lwz r3,0*4(r1) - lwz r4,1*4(r1) - lwz r2,2*4(r1) - lwz xptr,3*4(r1) - lwz xpc,4*4(r1) - addi r1,r1,6*4 - -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,8(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 */ +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 - addi r5,r5,lo16(ex_int2-ex_int1) - slwi r4,r4,2 - subf r5,r4,r5 - mtctr r5 + mflr t3 /* t3 = current pc */ +#if defined(__DARWIN__) + addi t3,t3,lo16(ex_int2-ex_int1) +#else + addi t3,t3,(ex_int2-ex_int1)@l +#endif + slwi t2,t2,2 /* t2 = register count * 4 */ + subf t3,t2,t3 /* t3 = IntSave - t2 */ + mtctr t3 bctr - lwz r14,-40(r3) - lwz r15,-36(r3) - lwz r24,-32(r3) - lwz r25,-28(r3) - lwz r26,-24(r3) - lwz r27,-20(r3) - lwz r28,-16(r3) - lwz r29,-12(r3) - lwz r30,-8(r3) - lwz r31,-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 - addi r5,r5,lo16(ex_flt2-ex_flt1) - slwi r4,r4,2 - subf r5,r4,r5 - mtctr r5 + mflr t3 +#if defined(__DARWIN__) + addi t3,t3,lo16(ex_flt2-ex_flt1) +#else + addi t3,t3,(ex_flt2-ex_flt1)@l +#endif + slwi t2,t2,2 /* t2 = register count * 4 */ + subf t3,t2,t3 /* t3 = FltSave - t2 */ + mtctr t3 bctr - lfd f14,-80(r3) - lfd f15,-72(r3) - lfd f24,-64(r3) - lfd f25,-56(r3) - lfd f26,-48(r3) - lfd f27,-40(r3) - lfd f28,-32(r3) - lfd f29,-24(r3) - lfd f30,-16(r3) - lfd f31,-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_check_clinit **************************************** -* * -* call static class initializer for PUT/GETSTATIC instructions * -* * -*******************************************************************************/ + mtlr t4 /* restore RA */ + lwz t1,FrameSize(pv) /* get frame size */ + add sp,sp,t1 /* unwind stack */ + b L_asm_handle_exception_stack_loop -_asm_check_clinit: -0: - lwz itmp2,offclassinit(itmp1) - mr. itmp2,itmp2 - bne L_is_initialized +/* asm_abstractmethoderror ***************************************************** + + Creates and throws an AbstractMethodError. + +*******************************************************************************/ + +asm_abstractmethoderror: mflr r0 - stw r0,8(r1) - addi r1,r1,-(24*8) - - stw r3,3*8(r1) /* save argument registers */ - stw r4,4*8(r1) /* preserve linkage area (24 bytes) */ - stw r5,5*8(r1) - stw r6,6*8(r1) - stw r7,7*8(r1) - stw r8,8*8(r1) - stw r9,9*8(r1) - stw r10,10*8(r1) - - stfd f1,11*8(r1) - stfd f2,12*8(r1) - stfd f3,13*8(r1) - stfd f4,14*8(r1) - stfd f5,15*8(r1) - stfd f6,16*8(r1) - stfd f7,17*8(r1) - stfd f8,18*8(r1) - stfd f9,19*8(r1) - stfd f10,20*8(r1) - stfd f11,21*8(r1) - stfd f12,22*8(r1) - stfd f13,23*8(r1) - - mr r3,itmp1 - lwz itmp1,lo16(class_init-0b)(pv) - mtctr itmp1 - bctrl + 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 - lwz r3,3*8(r1) - lwz r4,4*8(r1) - lwz r5,5*8(r1) - lwz r6,6*8(r1) - lwz r7,7*8(r1) - lwz r8,8*8(r1) - lwz r9,9*8(r1) - lwz r10,10*8(r1) - - lfd f1,11*8(r1) - lfd f2,12*8(r1) - lfd f3,13*8(r1) - lfd f4,14*8(r1) - lfd f5,15*8(r1) - lfd f6,16*8(r1) - lfd f7,17*8(r1) - lfd f8,18*8(r1) - lfd f9,19*8(r1) - lfd f10,20*8(r1) - lfd f11,21*8(r1) - lfd f12,22*8(r1) - lfd f13,23*8(r1) - - lwz r0,(24*8)+8(r1) - mtlr r0 - addi r1,r1,(24*8) + 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 -L_is_initialized: - blr +#if defined(ENABLE_REPLACEMENT) -/******************* function asm_builtin_checkarraycast *********************** -* * -* Does the cast check and eventually throws an exception * -* * -*******************************************************************************/ - -_asm_builtin_checkarraycast: -0: - mflr r0 - stw r0,8(r1) - stwu r1,-48(r1) +/* asm_replacement_out ********************************************************* - stw r3,32(r1) - lwz itmp1,lo16(builtincheckarraycast-0b)(pv) - mtctr itmp1 - bctrl + This code is jumped to from the replacement-out stubs that are executed + when a thread reaches an activated replacement point. - lwz r0,48+8(r1) - mtlr r0 - mr. r3,r3 - beq nb_carray_throw - lwz r3,32(r1) - addi r1,r1,48 - blr + 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. -nb_carray_throw: - addi r1,r1,48 - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+4) - lwz r3,lo16(string_java_lang_ClassCastException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,24+4 - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + Stack layout: + 16 start of stack inside method to replace + 0 rplpoint * info on the replacement point that was reached + NOTE: itmp3 has been clobbered by the replacement-out stub! -/******************* function asm_builtin_aastore ****************************** -* * -* Does the cast check and eventually throws an exception * -* * *******************************************************************************/ + +/* 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) -_asm_builtin_aastore: -0: - mr. r3,r3 - beq nb_aastore_null - mflr r0 - stw r0,8(r1) - addi r1,r1,-48 - - 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) -// addis pv,r31,ha16(builtincanstore-0b) - lwz itmp1,lo16(builtincanstore-0b)(pv) - mtctr itmp1 - bctrl + 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) - lwz r0,48+8(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 + /* store pv */ + stw pv,(offes_pv)(sp) -nb_aastore_null: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+4) - lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + /* 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 */ -nb_aastore_bound: - addi r1,r1,48 - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+2*4) - lwz r3,lo16(string_java_lang_ArrayIndexOutOfBoundsException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception_int-0b)(pv) - mtctr itmp1 - bctrl /* r4 already contains the index */ - mr xptr,r3 - addi r1,r1,(24+2*4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception +/* asm_replacement_in ********************************************************** -nb_aastore_store: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+4) - lwz r3,lo16(string_java_lang_ArrayStoreException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + This code writes the given execution state and jumps to the replacement + code. + This function never returns! -_asm_builtin_monitorenter: -0: - lwz itmp2,lo16(builtin_monitorenter-0b)(pv) - mr. r3,r3 - beq nb_monitorenter - mtctr itmp2 - bctr + NOTE: itmp3 is not restored! -nb_monitorenter: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+4) - lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,24+4 - lwz r0,8(r1) -/* addi xpc,r0,-4 */ - mr xpc,r0 - addi xpc,xpc,-4 + C prototype: + void asm_replacement_in(executionstate *es, replace_safestack_t *st); - mtlr r0 - b _asm_handle_nat_exception +*******************************************************************************/ +asm_replacement_in: + /* a0 == executionstate *es */ + /* a1 == replace_safestack_t *st */ -_asm_builtin_monitorexit: -0: - lwz itmp2,lo16(builtin_monitorexit-0b)(pv) - mr. r3,r3 - beq nb_monitorexit - mtctr itmp2 - bctr + /* get arguments */ + mr s1,a1 /* replace_safestack_t *st */ + mr s2,a0 /* executionstate *es == safe stack */ -nb_monitorexit: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+4) - lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv) - lwz r3,0(r3) - lwz itmp1,lo16(new_exception-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,24+4 - lwz r0,8(r1) -/* addi xpc,r0,-4 */ - mr xpc,r0 - addi xpc,xpc,-4 + /* switch to the safe stack */ + mr sp,s2 - mtlr r0 - b _asm_handle_nat_exception - - -_asm_builtin_idiv: -0: - mr. r4,r4 - beq nb_idiv - lis itmp3,0x8000 - cmpw r3,itmp3 - bne normal_idiv - cmpwi r4,-1 - bne normal_idiv - blr + /* reserve linkage area */ + addi sp,sp,-(LA_SIZE_ALIGNED) -normal_idiv: - divw r3,r3,r4 - blr + /* call replace_build_execution_state(st) */ + mr a0,s1 + bl replace_build_execution_state -nb_idiv: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+2*4) - lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv) - lwz r3,0(r3) - lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv) - lwz r4,0(r4) - lwz itmp1,lo16(new_exception_message-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+2*4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + /* set new sp */ + lwz sp,(offes_sp)(s2) + /* build stack frame */ + addi sp,sp,-(sizeexecutionstate_ALIGNED) -_asm_builtin_irem: -0: - 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 + /* 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_irem: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+2*4) - lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv) - lwz r3,0(r3) - lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv) - lwz r4,0(r4) - lwz itmp1,lo16(new_exception_message-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+2*4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + /* 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 */ + + mtlr itmp3 + + /* load new pc */ + lwz itmp3,offes_pc(sp) -_asm_builtin_ldiv: -0: - or. r0,r5,r6 - beq nb_ldiv - lwz itmp1,lo16(builtin_ldiv-0b)(pv) - mtctr itmp1 - bctr + /* remove stack frame */ -nb_ldiv: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+2*4) - lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv) - lwz r3,0(r3) - lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv) - lwz r4,0(r4) - lwz itmp1,lo16(new_exception_message-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+2*4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception + addi sp,sp,+(sizeexecutionstate_ALIGNED) + /* jump to new code */ - _asm_builtin_lrem: -0: - or. r0,r5,r6 - beq nb_lrem - lwz itmp1,lo16(builtin_lrem-0b)(pv) - mtctr itmp1 + mtctr itmp3 bctr -nb_lrem: - mflr r0 - stw r0,8(r1) - addi r1,r1,-(24+2*4) - lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv) - lwz r3,0(r3) - lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv) - lwz r4,0(r4) - lwz itmp1,lo16(new_exception_message-0b)(pv) - mtctr itmp1 - bctrl - mr xptr,r3 - addi r1,r1,(24+2*4) - lwz r0,8(r1) - mr xpc,r0 - mtlr r0 - b _asm_handle_nat_exception +#endif /* defined(ENABLE_REPLACEMENT) */ +/*********************************************************************/ -_asm_cacheflush: - addi r4,r4,31 - mr r5,r3 - add r4,r3,r4 +asm_cacheflush: + 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 @@ -1143,207 +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 - lfd f0,lo16(doublezero-0b)(r3) - - stfd f0,40(r4) - stfd f0,48(r4) - stfd f0,56(r4) - stfd f0,64(r4) - stfd f0,72(r4) - stfd f0,80(r4) - stfd f0,88(r4) - stfd f0,96(r4) - stfd f0,104(r4) - stfd f0,112(r4) - - stfd f0,160(r4) - stfd f0,168(r4) - stfd f0,176(r4) - stfd f0,184(r4) - stfd f0,192(r4) - stfd f0,200(r4) - stfd f0,208(r4) - stfd f0,216(r4) - - mr r3,r4 - blr + 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 -_asm_perform_threadswitch: +.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 - 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 f14,40(r1) - stfd f15,48(r1) - stfd f24,56(r1) - stfd f25,64(r1) - stfd f26,72(r1) - stfd f27,80(r1) - stfd f28,88(r1) - stfd f29,96(r1) - stfd f30,104(r1) - stfd f31,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 f16,160(r1) - stfd f17,168(r1) - stfd f18,176(r1) - stfd f19,184(r1) - stfd f20,192(r1) - stfd f21,200(r1) - stfd f22,208(r1) - stfd f23,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 f14,40(r1) - lfd f15,48(r1) - lfd f24,56(r1) - lfd f25,64(r1) - lfd f26,72(r1) - lfd f27,80(r1) - lfd f28,88(r1) - lfd f29,96(r1) - lfd f30,104(r1) - lfd f31,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 f16,160(r1) - lfd f17,168(r1) - lfd f18,176(r1) - lfd f19,184(r1) - lfd f20,192(r1) - lfd f21,200(r1) - lfd f22,208(r1) - lfd f23,216(r1) + 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 + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_exceptions_handle_exception$stub: + .indirect_symbol _exceptions_handle_exception + mflr r0 + 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 - addi r1,r1,224 - blr + 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 -_asm_switchstackandcall: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_stacktrace_create_extern_stackframeinfo$stub: + .indirect_symbol _stacktrace_create_extern_stackframeinfo mflr r0 - addi r3,r3,-48 - 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$_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 + 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 + - lwz r0,40(r1) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +L_jit_asm_compile$stub: + .indirect_symbol _jit_asm_compile + mflr r0 + 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 - lwz r1,44(r1) - blr + 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 -#define C_RED_ZONE 224 +.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 + 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_sighandler: - addi r1,r1,-32*4 - 32 - C_RED_ZONE - stmw r0,32(r1) +.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 - stw r0,28(r1) + 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 - bl 0f -0: - mflr r31 - lwz r0,lo16(catch_Handler-0b)(r31) - mtctr r0 - addi r3,r1,32 - bctrl - - lwz r0,28(r1) + +.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 - cmpwi r3,0 - bne 1f - lmw r2,32+8(r1) - lwz r0,32(r1) - addi r1,r1,32*4 + 32 + C_RED_ZONE - b _asm_handle_exception + 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 -1: - mtctr r3 - lmw r2,32+8(r1) - lwz r0,32(r1) - addi r1,r1,32*4 + 32 + C_RED_ZONE + +# 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__) */ + + +/* disable exec-stacks ********************************************************/ + +#if defined(__linux__) && defined(__ELF__) + .section .note.GNU-stack,"",%progbits +#endif /* @@ -1357,4 +1099,5 @@ _asm_sighandler: * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */