-#include "offsets.h"
+/* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
+
+ 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.
+
+ This program is free software.text; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY ; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+*/
-.text
- .align 2
- .globl _builtin_throw_exception
- .globl _jit_compile
- .globl _builtin_canstore
- .globl _builtin_trace_exception
- .globl _builtin_monitorenter
- .globl _builtin_monitorexit
- .globl _builtin_ldiv
- .globl _builtin_lrem
- .globl _builtin_checkarraycast
- .globl _proto_java_lang_NullPointerException
- .globl _proto_java_lang_ArrayIndexOutOfBoundsException
- .globl _proto_java_lang_ArrayStoreException
- .globl _proto_java_lang_ArithmeticException
- .globl _proto_java_lang_ClassCastException
-
- .globl _catch_Handler
-
-#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
-
-#define itmp1 r11
-#define itmp2 r12
-#define itmp3 r0
-
-#define xptr itmp1
-#define xpc itmp2
-
-#define pv r13
-#define mptr r12
-#define mptrn 12
+#include "config.h"
+
+#include "md-abi.h"
+#include "md-asm.h"
+
+#include "vm/jit/abi-asm.h"
+#include "vm/jit/methodheader.h"
+
+
+ .text
.align 2
-builtinthrow:
- .long _builtin_throw_exception
+
+
+/* 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_abstractmethoderror
+
+#if defined(ENABLE_REPLACEMENT)
+ .globl asm_replacement_out
+ .globl asm_replacement_in
+#endif
+
+ .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_calljavamethod /* 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 */
-
-
-.globl _asm_docalljavamethod
-_asm_docalljavamethod:
- 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)
- mtctr pv
+
+ .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 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)
- mtlr r0
- addi r1,r1,148
- lwz pv,-12(r1)
-// lwz r30,-8(r1)
- lwz r31,-4(r1)
+ mflr itmp1
+#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 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 *******************************************************
+
+ Invokes the compiler for untranslated JavaVM methods.
+
+*******************************************************************************/
+
+asm_call_jit_compiler:
+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_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
+
+ mr xptr,v0 /* get exception */
+ addi xpc,xpc,-4 /* exception address is ra - 4 */
+ b L_asm_handle_nat_exception
+
+
+/********************* 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); *
+* *
+*******************************************************************************/
+
+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. 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
+
+ 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 */
-jitcompile:
- .long _jit_compile
+ mr. t0,t0
+ beq L_asm_handle_exception_no_leaf_stack
-.globl _asm_call_jit_compiler
-_asm_call_jit_compiler:
-0:
- mflr itmp1
- stw r31,-4(r1)
-// stw pv,-8(r1)
- stw r29,-12(r1)
- stw itmp1,8(r1)
- stwu r1,-176(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:
- 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
+ addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
+ li t0,0 /* clear the maybe-leaf flag */
- 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)
-
- mtctr pv
-
- lwz r0,176+8(r1)
- mtlr r0
- addi r1,r1,176
- lwz r29,-12(r1)
-// lwz pv,-8(r1)
- lwz r31,-4(r1)
- bctr
+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
-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
-
-.globl _asm_handle_nat_exception
-_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
-
- .globl _asm_handle_exception
-_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)
- lwz r4,MethodPointer(pv)
- mr r5,xpc
- mr r6,r2
-
- bl 0f
-0:
- mflr itmp1
- lwz itmp1,lo16(builtin_traceexception-0b)(itmp1)
- mtctr itmp1
- addi r1,r1,-40
- bctrl
- addi r1,r1,40
-
- lwz xptr,2*4(r1)
- mtlr xptr
- lwz xptr,0*4(r1)
- lwz xpc,1*4(r1)
- lwz r2,3*4(r1)
- addi r1,r1,4*4
-
- lwz r3,ExTableSize(pv)
- mr. r3,r3
- beq empty_table
- addi r4,pv,ExTableStart
-
-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)
- lwz r7,offobjvftbl(r7)
- lwz r6,offbaseval(r6)
- lwz r8,offbaseval(r7)
- lwz r7,offdiffval(r7)
- subf r6,r8,r6
- cmplw r6,r7
- bgt ex_table_cont
-
-ex_handle_it:
- lwz xpc,ExHandlerPC(r4)
- 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
+ lwz r0,LA_LR_OFFSET(t1) /* restore ra */
+ mtlr r0
-ex_table_cont:
- addi r4,r4,ExEntrySize
- addic. r3,r3,-1
- bgt ex_table_loop
-
-empty_table:
- mr. r2,r2
- beq ex_already_cleared
- addi r1,r1,18*4
- li r2,0
-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)
- add r1,r1,r3
- mr r3,r1
- lwz r4,IsLeaf(pv)
- mr. r4,r4
- bne ex_no_restore
- lwz r4,8(r3)
- mtlr r4
-ex_no_restore:
- mflr r4
- mr xpc,r4
- lwz r4,IntSave(pv)
- bl ex_int1
+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)
- bl ex_flt1
+ 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
+ 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_abstractmethoderror *****************************************************
+
+ Creates and throws an AbstractMethodError.
+
+*******************************************************************************/
+
+asm_abstractmethoderror:
+ mflr r0
+ 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
+
+ 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
+
+
+#if defined(ENABLE_REPLACEMENT)
+
+/* asm_replacement_out *********************************************************
+
+ This code is jumped to from the replacement-out stubs that are executed
+ when a thread reaches an activated replacement point.
+
+ 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.
+
+ 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!
+
+*******************************************************************************/
+
+/* 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)
+ /* 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_replacement_in **********************************************************
+ This code writes the given execution state and jumps to the replacement
+ code.
+ This function never returns!
+ NOTE: itmp3 is not restored!
-.globl _asm_builtin_checkarraycast
-_asm_builtin_checkarraycast:
-0:
- mflr r0
- stw r0,8(r1)
- stwu r1,-48(r1)
+ C prototype:
+ void asm_replacement_in(executionstate *es, replace_safestack_t *st);
- stw r3,32(r1)
- lwz itmp1,lo16(builtincheckarraycast-0b)(pv)
- mtctr itmp1
- bctrl
+*******************************************************************************/
- lwz r0,48+8(r1)
- mtlr r0
- mr. r3,r3
- beq nb_carray_throw
- lwz r3,32(r1)
- addi r1,r1,48
- blr
+asm_replacement_in:
+ /* a0 == executionstate *es */
+ /* a1 == replace_safestack_t *st */
-nb_carray_throw:
- lwz xptr,lo16(proto_java_lang_ClassCastException-0b)(pv)
- lwz xptr,0(xptr)
- addi r1,r1,48
- mflr xpc
- b _asm_handle_nat_exception
+ /* get arguments */
+ mr s1,a1 /* replace_safestack_t *st */
+ mr s2,a0 /* executionstate *es == safe stack */
-.globl _asm_builtin_checkcast
-_asm_builtin_checkcast:
-0:
- lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
+ /* switch to the safe stack */
+ mr sp,s2
+ /* reserve linkage area */
+ addi sp,sp,-(LA_SIZE_ALIGNED)
-
-
-
-
-
-builtincanstore:
- .long _builtin_canstore
-builtincheckarraycast:
- .long _builtin_checkarraycast
-
-.globl _asm_builtin_aastore
-_asm_builtin_aastore:
-0:
- mr. r3,r3
- beq nb_aastore_null
- mflr r0
- stw r0,8(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)
-// addis pv,r31,ha16(builtincanstore-0b)
- lwz itmp1,lo16(builtincanstore-0b)(pv)
- mtctr itmp1
- bctrl
+ /* call replace_build_execution_state(st) */
+ mr a0,s1
+ bl replace_build_execution_state
- 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_throw
- stw itmp2,offobjarrdata(itmp1)
- blr
+ /* set new sp */
+ lwz sp,(offes_sp)(s2)
-proto_java_lang_NullPointerException:
- .long _proto_java_lang_NullPointerException
-proto_java_lang_ArrayIndexOutOfBoundsException:
- .long _proto_java_lang_ArrayIndexOutOfBoundsException
-proto_java_lang_ArrayStoreException:
- .long _proto_java_lang_ArrayStoreException
-proto_java_lang_ArithmeticException:
- .long _proto_java_lang_ArithmeticException
-proto_java_lang_ClassCastException:
- .long _proto_java_lang_ClassCastException
-
-nb_aastore_null:
- lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
-nb_aastore_bound:
- lwz xptr,lo16(proto_java_lang_ArrayIndexOutOfBoundsException-0b)(pv)
- lwz xptr,0(xptr)
- addi r1,r1,48
- mflr xpc
- b _asm_handle_nat_exception
-nb_aastore_throw:
- lwz xptr,lo16(proto_java_lang_ArrayStoreException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
-
-
-
-.globl _asm_dumpregistersandcall
-_asm_dumpregistersandcall:
- mflr r0
- stw r0,8(r1)
-
- stw r16,-72(r1)
- stw r17,-68(r1)
- stw r18,-64(r1)
- stw r19,-60(r1)
- stw r20,-56(r1)
- stw r21,-52(r1)
- stw r22,-48(r1)
- stw r23,-44(r1)
-
- stw r14,-40(r1)
- stw r15,-36(r1)
- stw r24,-32(r1)
- stw r25,-28(r1)
- stw r26,-24(r1)
- stw r27,-20(r1)
- stw r28,-16(r1)
- stw r29,-12(r1)
- stw r30,-8(r1)
- stw r31,-4(r1)
- addi r1,r1,-96
-
- mtctr r3
- bctrl
+ /* build stack frame */
+ addi sp,sp,-(sizeexecutionstate_ALIGNED)
- lwz r0,96+8(r1)
- mtlr r0
- addi r1,r1,96
- 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 */
+ /* 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)
-.globl _asm_builtin_monitorenter
-_asm_builtin_monitorenter:
-0:
- lwz itmp2,lo16(builtin_monitorenter-0b)(pv)
- mr. r3,r3
- beq nb_monitorenter
- mtctr itmp2
- bctr
-nb_monitorenter:
- mflr r2
- lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
- lwz xptr,0(xptr)
- addi xpc,r2,-4
- b _asm_handle_nat_exception
-
-.globl _asm_builtin_monitorexit
-_asm_builtin_monitorexit:
-0:
- lwz itmp2,lo16(builtin_monitorexit-0b)(pv)
- mr. r3,r3
- beq nb_monitorexit
- mtctr itmp2
- bctr
-nb_monitorexit:
- mflr r2
- lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
- lwz xptr,0(xptr)
- addi xpc,r2,-4
- b _asm_handle_nat_exception
-
-
+ 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
-
-
-.globl _synchronize_caches
-_synchronize_caches:
- blr
-.globl _asm_getcallingmethod
-_asm_getcallingmethod:
- li r3,0
- blr
+ /* load new pc */
-.globl _asm_builtin_ldiv
-_asm_builtin_ldiv:
-0:
- or. r0,r5,r6
- beq nb_ldiv
- lwz itmp1,lo16(builtin_ldiv-0b)(pv)
- mtctr itmp1
- bctr
-nb_ldiv:
- lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
-
-.globl _asm_builtin_lrem
-_asm_builtin_lrem:
-0:
- or. r0,r5,r6
- beq nb_lrem
- lwz itmp1,lo16(builtin_lrem-0b)(pv)
- mtctr itmp1
- bctr
-nb_lrem:
- lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
-
-.globl _asm_builtin_idiv
-_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
-normal_idiv:
- divw r3,r3,r4
- blr
-nb_idiv:
- lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
-
-.globl _asm_builtin_irem
-_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
-nb_irem:
- lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
- lwz xptr,0(xptr)
- mflr xpc
- b _asm_handle_nat_exception
+ lwz itmp3,offes_pc(sp)
+ /* remove stack frame */
-
-
-.globl _has_no_x_instr_set
-_has_no_x_instr_set:
- li r3,0
- blr
+ addi sp,sp,+(sizeexecutionstate_ALIGNED)
+ /* jump to new code */
- .globl _asm_cacheflush
-_asm_cacheflush:
- addi r4,r4,31
- mr r5,r3
- add r4,r3,r4
+ mtctr itmp3
+ bctr
+
+#endif /* defined(ENABLE_REPLACEMENT) */
+
+/*********************************************************************/
+
+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
- bge 0f
- dcbst 0,r3
- addi r3,r3,32
- b 1b
+ cmplw a0,a1
+ bge 0f
+ dcbst 0,a0
+ addi a0,a0,32
+ b 1b
0:
sync
1:
- cmplw r5,r4
- bge 0f
- icbi 0,r5
- addi r5,r5,32
- b 1b
+ cmplw a2,a1
+ bge 0f
+ icbi 0,a2
+ addi a2,a2,32
+ b 1b
0:
sync
isync
blr
- .align 3
-doublezero:
- .double 0.0
-
-.globl _asm_initialize_thread_stack
-_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)
- mflr r0
- bl 0f
-0:
- mflr r3
- 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
+/* 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
-.globl _asm_perform_threadswitch
-_asm_perform_threadswitch:
- 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)
- mtlr r0
- addi r1,r1,224
+/* asm_memory_barrier **********************************************************
+
+ XXX
+
+*******************************************************************************/
+
+asm_memory_barrier:
+ sync
blr
+#if defined(__DARWIN__)
-.globl _asm_switchstackandcall
-_asm_switchstackandcall:
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+ .align 2
+L_builtin_throw_exception$stub:
+ .indirect_symbol _builtin_throw_exception
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$_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
+ 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
+
- lwz r0,40(r1)
+.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
- lwz r1,44(r1)
- blr
+ 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
+ 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
- .globl _my_dump
-_my_dump:
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+ .align 2
+L_stacktrace_create_extern_stackframeinfo$stub:
+ .indirect_symbol _stacktrace_create_extern_stackframeinfo
mflr r0
- bl 0f
-0:
- mflr itmp1
+ 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
+
+
+.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 xptr,lo16(proto_java_lang_NullPointerException-0b)(itmp1)
- lwz xptr,0(xptr)
- b _asm_handle_exception
+ 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
+.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
+.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
-#define C_RED_ZONE 224
-catch_Handler:
- .long _catch_Handler
+# if defined(ENABLE_REPLACEMENT)
- .globl _asm_sighandler
-_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_replace_me$stub:
+ .indirect_symbol _replace_me
mflr r0
- stw r0,28(r1)
+ 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
- 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_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
- 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_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
-1:
- mtctr r3
- lmw r2,32+8(r1)
- lwz r0,32(r1)
- addi r1,r1,32*4 + 32 + C_RED_ZONE
+
+.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
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */