/* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Andreas Krall
- Reinhard Grafl
- Stefan Ring
-
- Changes: Christian Thalinger
- Edwin Steiner
-
- $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
-
*/
#include "vm/jit/abi-asm.h"
#include "vm/jit/methodheader.h"
-#include "vm/jit/powerpc/offsets.h"
.text
.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_abstractmethoderror
- .globl asm_patcher_wrapper
-
#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
#endif
.globl asm_cacheflush
- .globl asm_criticalsections
- .globl asm_getclassvalues_atomic
+
+ .globl asm_compare_and_swap
+ .globl asm_memory_barrier
/* asm_vm_call_method **********************************************************
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 pointer for compiler */
+ stw a0,9*4(sp) /* save method PV */
#if defined(__DARWIN__)
stw itmp1,10*4(sp) /* register r11 is callee saved */
stfd ft4,34*4(sp)
stfd ft5,36*4(sp)
#else
- SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
-#endif
-
- mr itmp2,a1 /* arg count */
- mr itmp1,a2 /* pointer to arg block */
-
- mr t4,itmp2 /* save argument count */
- mr t5,itmp1 /* save argument block pointer */
-
- mr s0,sp /* save current sp to s0 */
-
- addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
- addi itmp2,itmp2,1 /* initialize argument count */
- li t0,0 /* initialize integer argument counter */
- li t1,0 /* initialize float argument counter */
- li t6,0 /* initialize integer register counter */
-#if defined(__DARWIN__)
- li t7,0 /* initialize stack slot counter */
+ SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
#endif
- mflr r0 /* save link register (PIC code) */
- bl L_asm_vm_call_method_get_pc
-L_asm_vm_call_method_get_pc:
- mflr t3 /* t3 contains the current pc */
- mtlr r0
-
-L_register_copy:
- addi itmp1,itmp1,sizevmarg /* goto next argument block */
- addi itmp2,itmp2,-1 /* argument count - 1 */
- mr. itmp2,itmp2
- beq L_register_copy_done
-
- lwz itmp3,offvmargtype+4(itmp1)
- andi. r0,itmp3,0x0002 /* is this a float/double type? */
- bne L_register_handle_float
-
-L_register_handle_int:
- cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
- beq L_register_copy /* registers? yes, next loop */
-
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_register_handle_long
+ 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__)
- addis itmp3,t3,ha16(L_jumptable_int - L_asm_vm_call_method_get_pc)
- la itmp3,lo16(L_jumptable_int - L_asm_vm_call_method_get_pc)(itmp3)
-#else
- lis itmp3,L_jumptable_int@ha
- addi itmp3,itmp3,L_jumptable_int@l
+ lfd fa8,16*8(t0)
+ lfd fa9,17*8(t0)
+ lfd fa10,18*8(t0)
+ lfd fa11,19*8(t0)
+ lfd fa12,20*8(t0)
#endif
- slwi t2,t6,2 /* multiple of 4-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- lwz itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t0,t0,1 /* integer argument counter */
- addi t6,t6,1 /* integer argument register counter */
-#if defined(__DARWIN__)
- addi t7,t7,1 /* stack slot counter */
-#endif
- bctr
-
-L_register_handle_long:
-#if defined(__DARWIN__)
- addis itmp3,t3,ha16(L_jumptable_long - L_asm_vm_call_method_get_pc)
- la itmp3,lo16(L_jumptable_long - L_asm_vm_call_method_get_pc)(itmp3)
-#else
- lis itmp3,L_jumptable_long@ha
- addi itmp3,itmp3,L_jumptable_long@l
-#endif
-#if !defined(__DARWIN__)
- addi t6,t6,1 /* align to even numbers */
- andi. t6,t6,0xfffe
-#endif
-
- cmpwi t6,(INT_ARG_CNT - 1) /* are we out of integer argument */
- blt L_register_handle_long_continue /* registers? */
-
- li t6,INT_ARG_CNT /* yes, set integer argument register */
- b L_register_copy /* count to max and next loop */
-
-L_register_handle_long_continue:
- slwi t2,t6,2 /* multiple of 4-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- lwz itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t0,t0,1 /* integer argument counter */
- addi t6,t6,2 /* integer argument register counter */
-#if defined(__DARWIN__)
- addi t7,t7,2 /* stack slot counter */
-#endif
- bctr
+ mr. t1,t1
+ beq L_asm_vm_call_method_stack_copy_done
-L_register_handle_float:
- cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
- beq L_register_copy /* registers? yes, next loop */
+ slwi t2,t1,3 /* calculate stackframe size (* 8) */
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_register_handle_double
+ sub sp,sp,t2 /* create stackframe */
+ mr t2,sp /* temporary stack pointer */
+L_asm_vm_call_method_stack_copy_loop:
#if defined(__DARWIN__)
- addis itmp3,t3,ha16(L_jumptable_float - L_asm_vm_call_method_get_pc)
- la itmp3,lo16(L_jumptable_float - L_asm_vm_call_method_get_pc)(itmp3)
+ lwz t3,21*8+0(t0) /* load argument */
+ lwz t4,21*8+4(t0)
#else
- lis itmp3,L_jumptable_float@ha
- addi itmp3,itmp3,L_jumptable_float@l
-#endif
-
- slwi t2,t1,2 /* multiple of 4-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- lwz itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t1,t1,1 /* float argument counter */
-#if defined(__DARWIN__)
- addi t7,t7,1 /* stack slot counter */
- addi t6,t6,1 /* skip 1 integer argument register */
+ lwz t3,16*8+0(t0) /* load argument */
+ lwz t4,16*8+4(t0)
#endif
- bctr
+ stw t3,0(t2) /* store argument on stack */
+ stw t4,4(t2)
-L_register_handle_double:
-#if defined(__DARWIN__)
- addis itmp3,t3,ha16(L_jumptable_double - L_asm_vm_call_method_get_pc)
- la itmp3,lo16(L_jumptable_double - L_asm_vm_call_method_get_pc)(itmp3)
-#else
- lis itmp3,L_jumptable_double@ha
- addi itmp3,itmp3,L_jumptable_double@l
-#endif
-
- slwi t2,t1,2 /* multiple of 4-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- lwz itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t1,t1,1 /* float argument counter */
-#if defined(__DARWIN__)
- addi t7,t7,2 /* stack slot counter */
- addi t6,t6,2 /* skip 2 integer argument registers */
-#endif
- bctr
-
-L_register_copy_done:
- /* calculate remaining arguments */
- sub itmp3,t4,t0 /* - integer arguments in registers */
- sub itmp3,itmp3,t1 /* - float arguments in registers */
- mr. itmp3,itmp3
- beq L_stack_copy_done
-
- mr itmp2,t4 /* restore argument count */
- mr itmp1,t5 /* restore argument block pointer */
-
- slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
- addi t4,t4,LA_SIZE /* add size of linkage area */
-
-#if defined(__DARWIN__)
- slwi t5,t7,2 /* add stack space for arguments */
- add t4,t4,t5
-#endif
-
- sub sp,sp,t4
-
- mr t6,sp /* use t6 as temporary sp */
- addi t6,t6,LA_SIZE /* skip linkage area */
-#if defined(__DARWIN__)
- add t6,t6,t5 /* skip stack space for arguments */
-#endif
-
- addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
- addi itmp2,itmp2,1 /* initialize argument count */
-
-L_stack_copy_loop:
- addi itmp1,itmp1,sizevmarg /* goto next argument block */
- addi itmp2,itmp2,-1 /* argument count - 1 */
- mr. itmp2,itmp2
- beq L_stack_copy_done
-
- lwz itmp3,offvmargtype+4(itmp1)
- andi. r0,itmp3,0x0002 /* is this a float/double type? */
- bne L_stack_handle_float
-
-L_stack_handle_int:
- addi t0,t0,-1 /* arguments assigned to registers */
- mr. t0,t0
- bge L_stack_copy_loop
-
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_stack_handle_long
-
- lwz itmp3,offvmargdata+4(itmp1) /* get integer argument */
- stw itmp3,0(t6) /* and store it on the stack */
- addi t6,t6,4 /* increase temporary sp by 1 slot */
- b L_stack_copy_loop
-
-L_stack_handle_long:
-#if !defined(__DARWIN__)
- addi t6,t6,4 /* align stack to 8-bytes */
- rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
-#endif
-
- lwz itmp3,offvmargdata+0(itmp1) /* get long argument */
- stw itmp3,0(t6) /* and store it on the stack */
- lwz itmp3,offvmargdata+4(itmp1)
- stw itmp3,4(t6)
- addi t6,t6,8 /* increase temporary sp by 2 slots */
- b L_stack_copy_loop
-
-L_stack_handle_float:
- addi t1,t1,-1 /* arguments assigned to registers */
+ 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
- bge L_stack_copy_loop
-
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_stack_handle_double
-
- lfs ftmp3,offvmargdata(itmp1) /* get float argument */
- stfs ftmp3,0(t6) /* and store it on the stack */
- addi t6,t6,4 /* increase temporary sp by 1 slot */
- b L_stack_copy_loop
-
-L_stack_handle_double:
-#if !defined(__DARWIN__)
- addi t6,t6,4 /* align stack to 8-bytes */
- rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
-#endif
-
- lfd ftmp3,offvmargdata(itmp1) /* get double argument */
- stfd ftmp3,0(t6) /* and store it on the stack */
- addi t6,t6,8 /* increase temporary sp by 2 slots */
- b L_stack_copy_loop
-
-L_stack_copy_done:
- lwz itmp1,9*4(s0) /* pass method pointer via tmp1 */
+ bgt L_asm_vm_call_method_stack_copy_loop
-#if defined(__DARWIN__)
- addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
- la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
-#else
- lis mptr,L_asm_call_jit_compiler@ha
- addi mptr,mptr,L_asm_call_jit_compiler@l
-#endif
- stw mptr,7*4(s0)
- addi mptr,s0,7*4
-
- lwz pv,0*4(mptr)
+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:
#endif
L_asm_vm_call_method_return:
- mr sp,s0 /* restore the function's sp */
+ mr sp,s0 /* restore the SP */
- lwz s0,8*4(sp) /* restore used callee saved registers */
+ lwz s0,8*4(sp) /* restore used callee saved registers*/
#if defined(__DARWIN__)
- lwz itmp1,10*4(sp) /* register r11 is callee saved */
+ lwz itmp1,10*4(sp) /* register r11 is callee saved */
#endif
- lwz pv,11*4(sp) /* save PV register */
+ 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 ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
lfd ftmp2,16*4(sp)
#if defined(__DARWIN__)
bl builtin_throw_exception
b L_asm_vm_call_method_return
-
- .data
- .align 2
-
-L_jumptable_int:
- .long L_handle_a0
- .long L_handle_a1
- .long L_handle_a2
- .long L_handle_a3
- .long L_handle_a4
- .long L_handle_a5
- .long L_handle_a6
- .long L_handle_a7
-
- .text
- .align 2
-
-L_handle_a0:
- lwz a0,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a1:
- lwz a1,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a2:
- lwz a2,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a3:
- lwz a3,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a4:
- lwz a4,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a5:
- lwz a5,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a6:
- lwz a6,offvmargdata+4(itmp1)
- b L_register_copy
-L_handle_a7:
- lwz a7,offvmargdata+4(itmp1)
- b L_register_copy
-
-
- .data
- .align 2
-
-L_jumptable_long:
-#if defined(__DARWIN__)
- .long L_handle_a0_a1
- .long L_handle_a1_a2
- .long L_handle_a2_a3
- .long L_handle_a3_a4
- .long L_handle_a4_a5
- .long L_handle_a5_a6
- .long L_handle_a6_a7
-#else
- /* we have two entries here, so we get the even argument register
- alignment for linux */
-
- .long L_handle_a0_a1
- .long 0
- .long L_handle_a2_a3
- .long 0
- .long L_handle_a4_a5
- .long 0
- .long L_handle_a6_a7
-#endif
-
- .text
- .align 2
-
-L_handle_a0_a1:
- lwz a0,offvmargdata+0(itmp1)
- lwz a1,offvmargdata+4(itmp1)
- b L_register_copy
-#if defined(__DARWIN__)
-L_handle_a1_a2:
- lwz a1,offvmargdata+0(itmp1)
- lwz a2,offvmargdata+4(itmp1)
- b L_register_copy
-#endif
-L_handle_a2_a3:
- lwz a2,offvmargdata+0(itmp1)
- lwz a3,offvmargdata+4(itmp1)
- b L_register_copy
-#if defined(__DARWIN__)
-L_handle_a3_a4:
- lwz a3,offvmargdata+0(itmp1)
- lwz a4,offvmargdata+4(itmp1)
- b L_register_copy
-#endif
-L_handle_a4_a5:
- lwz a4,offvmargdata+0(itmp1)
- lwz a5,offvmargdata+4(itmp1)
- b L_register_copy
-#if defined(__DARWIN__)
-L_handle_a5_a6:
- lwz a5,offvmargdata+0(itmp1)
- lwz a6,offvmargdata+4(itmp1)
- b L_register_copy
-#endif
-L_handle_a6_a7:
- lwz a6,offvmargdata+0(itmp1)
- lwz a7,offvmargdata+4(itmp1)
- b L_register_copy
-
-
- .data
- .align 2
-
-L_jumptable_float:
- .long L_handle_fa0
- .long L_handle_fa1
- .long L_handle_fa2
- .long L_handle_fa3
- .long L_handle_fa4
- .long L_handle_fa5
- .long L_handle_fa6
- .long L_handle_fa7
-
-#if defined(__DARWIN__)
- .long L_handle_fa8
- .long L_handle_fa9
- .long L_handle_fa10
- .long L_handle_fa11
- .long L_handle_fa12
-#endif
-
- .text
- .align 2
-
-L_handle_fa0:
- lfs fa0,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa1:
- lfs fa1,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa2:
- lfs fa2,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa3:
- lfs fa3,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa4:
- lfs fa4,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa5:
- lfs fa5,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa6:
- lfs fa6,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa7:
- lfs fa7,offvmargdata(itmp1)
- b L_register_copy
-
-#if defined(__DARWIN__)
-L_handle_fa8:
- lfs fa8,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa9:
- lfs fa9,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa10:
- lfs fa10,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa11:
- lfs fa11,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fa12:
- lfs fa12,offvmargdata(itmp1)
- b L_register_copy
-#endif
-
-
- .data
- .align 2
-
-L_jumptable_double:
- .long L_handle_fda0
- .long L_handle_fda1
- .long L_handle_fda2
- .long L_handle_fda3
- .long L_handle_fda4
- .long L_handle_fda5
- .long L_handle_fda6
- .long L_handle_fda7
-
-#if defined(__DARWIN__)
- .long L_handle_fda8
- .long L_handle_fda9
- .long L_handle_fda10
- .long L_handle_fda11
- .long L_handle_fda12
-#endif
-
- .text
- .align 2
-
-L_handle_fda0:
- lfd fa0,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda1:
- lfd fa1,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda2:
- lfd fa2,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda3:
- lfd fa3,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda4:
- lfd fa4,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda5:
- lfd fa5,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda6:
- lfd fa6,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda7:
- lfd fa7,offvmargdata(itmp1)
- b L_register_copy
-
-#if defined(__DARWIN__)
-L_handle_fda8:
- lfd fa8,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda9:
- lfd fa9,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda10:
- lfd fa10,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda11:
- lfd fa11,offvmargdata(itmp1)
- b L_register_copy
-L_handle_fda12:
- lfd fa12,offvmargdata(itmp1)
- b L_register_copy
-#endif
+asm_vm_call_method_end:
+ nop
/* asm_call_jit_compiler *******************************************************
mtctr t3
bctr
- lwz s0,-10*4(t1)
- lwz s1,-9*4(t1)
- lwz s2,-8*4(t1)
- lwz s3,-7*4(t1)
- lwz s4,-6*4(t1)
- lwz s5,-5*4(t1)
- lwz s6,-4*4(t1)
- lwz s7,-3*4(t1)
- lwz s8,-2*4(t1)
- lwz s9,-1*4(t1)
+ 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 t1,t2,t1 /* t1 = t1 - register count * 4 */
b L_asm_handle_nat_exception
-/* asm_patcher_wrapper *********************************************************
-
- XXX
-
- Stack layout:
- 20 return address into JIT code (patch position)
- 16 pointer to virtual java_objectheader
- 12 machine code (which is patched back later)
- 8 unresolved class/method/field reference
- 4 data segment displacement from load instructions
- 0 patcher function pointer to call (pv is saved here afterwards)
-
-*******************************************************************************/
-
-asm_patcher_wrapper:
- mflr r0 /* get Java return address (leaf) */
- stw r0,6*4(sp) /* store it in the stub stackframe */
- /* keep stack 16-bytes aligned: 6+1+37 = 44 */
- stwu sp,-(LA_SIZE+(5+58)*4)(sp)
-
-#if defined(__DARWIN__)
- stw a0,LA_SIZE+(5+0)*4(sp) /* save argument registers */
- stw a1,LA_SIZE+(5+1)*4(sp) /* preserve linkage area (24 bytes) */
- stw a2,LA_SIZE+(5+2)*4(sp) /* and 4 bytes for 4 argument */
- stw a3,LA_SIZE+(5+3)*4(sp)
- stw a4,LA_SIZE+(5+4)*4(sp)
- stw a5,LA_SIZE+(5+5)*4(sp)
- stw a6,LA_SIZE+(5+6)*4(sp)
- stw a7,LA_SIZE+(5+7)*4(sp)
-
- stfd fa0,LA_SIZE+(5+8)*4(sp)
- stfd fa1,LA_SIZE+(5+10)*4(sp)
- stfd fa2,LA_SIZE+(5+12)*4(sp)
- stfd fa3,LA_SIZE+(5+14)*4(sp)
- stfd fa4,LA_SIZE+(5+16)*4(sp)
- stfd fa5,LA_SIZE+(5+18)*4(sp)
- stfd fa6,LA_SIZE+(5+20)*4(sp)
- stfd fa7,LA_SIZE+(5+22)*4(sp)
- stfd fa8,LA_SIZE+(5+24)*4(sp)
- stfd fa9,LA_SIZE+(5+26)*4(sp)
- stfd fa10,LA_SIZE+(5+28)*4(sp)
- stfd fa11,LA_SIZE+(5+30)*4(sp)
- stfd fa12,LA_SIZE+(5+32)*4(sp)
-
- stw t0,LA_SIZE+(5+33)*4(sp)
- stw t1,LA_SIZE+(5+34)*4(sp)
- stw t2,LA_SIZE+(5+35)*4(sp)
- stw t3,LA_SIZE+(5+36)*4(sp)
- stw t4,LA_SIZE+(5+37)*4(sp)
- stw t5,LA_SIZE+(5+38)*4(sp)
- stw t6,LA_SIZE+(5+39)*4(sp)
- stw t7,LA_SIZE+(5+40)*4(sp)
-
- stfd ft0,LA_SIZE+(5+42)*4(sp)
- stfd ft1,LA_SIZE+(5+44)*4(sp)
- stfd ft2,LA_SIZE+(5+46)*4(sp)
- stfd ft3,LA_SIZE+(5+48)*4(sp)
- stfd ft4,LA_SIZE+(5+50)*4(sp)
- stfd ft5,LA_SIZE+(5+52)*4(sp)
-#else
- /* save 8 int/8 float arguments */
- SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
- SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
-#endif
-
- stw itmp1,LA_SIZE+(5+54)*4(sp)
- stw itmp2,LA_SIZE+(5+55)*4(sp)
- stw pv,LA_SIZE+(5+56)*4(sp)
-
- addi a0,sp,LA_SIZE+(5+58)*4 /* pass SP of patcher stub */
- mr a1,pv /* pass PV */
- mr a2,r0 /* pass RA (correct for leafs) */
- bl patcher_wrapper
- stw v0,LA_SIZE+(5+57)*4(sp) /* save return value */
-
-#if defined(__DARWIN__)
- lwz a0,LA_SIZE+(5+0)*4(sp)
- lwz a1,LA_SIZE+(5+1)*4(sp)
- lwz a2,LA_SIZE+(5+2)*4(sp)
- lwz a3,LA_SIZE+(5+3)*4(sp)
- lwz a4,LA_SIZE+(5+4)*4(sp)
- lwz a5,LA_SIZE+(5+5)*4(sp)
- lwz a6,LA_SIZE+(5+6)*4(sp)
- lwz a7,LA_SIZE+(5+7)*4(sp)
-
- lfd fa0,LA_SIZE+(5+8)*4(sp)
- lfd fa1,LA_SIZE+(5+10)*4(sp)
- lfd fa2,LA_SIZE+(5+12)*4(sp)
- lfd fa3,LA_SIZE+(5+14)*4(sp)
- lfd fa4,LA_SIZE+(5+16)*4(sp)
- lfd fa5,LA_SIZE+(5+18)*4(sp)
- lfd fa6,LA_SIZE+(5+20)*4(sp)
- lfd fa7,LA_SIZE+(5+22)*4(sp)
- lfd fa8,LA_SIZE+(5+24)*4(sp)
- lfd fa9,LA_SIZE+(5+26)*4(sp)
- lfd fa10,LA_SIZE+(5+28)*4(sp)
- lfd fa11,LA_SIZE+(5+30)*4(sp)
- lfd fa12,LA_SIZE+(5+32)*4(sp)
-
- lwz t0,LA_SIZE+(5+33)*4(sp)
- lwz t1,LA_SIZE+(5+34)*4(sp)
- lwz t2,LA_SIZE+(5+35)*4(sp)
- lwz t3,LA_SIZE+(5+36)*4(sp)
- lwz t4,LA_SIZE+(5+37)*4(sp)
- lwz t5,LA_SIZE+(5+38)*4(sp)
- lwz t6,LA_SIZE+(5+39)*4(sp)
- lwz t7,LA_SIZE+(5+40)*4(sp)
-
- lfd ft0,LA_SIZE+(5+42)*4(sp)
- lfd ft1,LA_SIZE+(5+44)*4(sp)
- lfd ft2,LA_SIZE+(5+46)*4(sp)
- lfd ft3,LA_SIZE+(5+48)*4(sp)
- lfd ft4,LA_SIZE+(5+50)*4(sp)
- lfd ft5,LA_SIZE+(5+52)*4(sp)
-#else
- /* restore 8 int/8 float arguments */
- RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
- RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
-#endif
-
- lwz itmp1,LA_SIZE+(5+54)*4(sp)
- lwz itmp2,LA_SIZE+(5+55)*4(sp)
- lwz pv,LA_SIZE+(5+56)*4(sp)
- lwz itmp3,LA_SIZE+(5+57)*4(sp) /* restore return value into temp reg.*/
-
- lwz r0,6*4+LA_SIZE+(5+58)*4(sp) /* restore RA */
- mtlr r0
-
- mr. itmp3,itmp3 /* check for an exception */
- bne L_asm_patcher_wrapper_exception
-
- /* get return address (into JIT code) */
- lwz itmp3,5*4+LA_SIZE+(5+58)*4(sp)
-
- /* remove stack frame + patcher stub stack */
- addi sp,sp,8*4+LA_SIZE+(5+58)*4
-
- mtctr itmp3
- bctr /* jump to new patched code */
-
-L_asm_patcher_wrapper_exception:
- mr xptr,itmp3 /* get exception */
- lwz xpc,5*4+LA_SIZE+(5+58)*4(sp)
- addi sp,sp,8*4+LA_SIZE+(5+58)*4
- b L_asm_handle_exception
-
#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
blr
-asm_getclassvalues_atomic:
-_crit_restart:
-_crit_begin:
- lwz a3,offbaseval(a0)
- lwz a4,offdiffval(a0)
- lwz a5,offbaseval(a1)
-_crit_end:
- stw a3,offcast_super_baseval(a2)
- stw a4,offcast_super_diffval(a2)
- stw a5,offcast_sub_baseval(a2)
+/* 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
- .data
-asm_criticalsections:
-#if defined(ENABLE_THREADS)
- .long _crit_begin
- .long _crit_end
- .long _crit_restart
-#endif
- .long 0
+/* asm_memory_barrier **********************************************************
+
+ XXX
+
+*******************************************************************************/
+
+asm_memory_barrier:
+ sync
+ blr
#if defined(__DARWIN__)
.long dyld_stub_binding_helper
-.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .align 2
-L_patcher_wrapper$stub:
- .indirect_symbol _patcher_wrapper
- mflr r0
- bcl 20,31,L00$_patcher_wrapper
-L00$_patcher_wrapper:
- mflr r11
- addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
- mtlr r0
- lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
- mtctr r12
- bctr
-.data
-.lazy_symbol_pointer
-L_patcher_wrapper$lazy_ptr:
- .indirect_symbol _patcher_wrapper
- .long dyld_stub_binding_helper
-
+# if defined(ENABLE_REPLACEMENT)
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.align 2
.indirect_symbol _replace_free_safestack
.long dyld_stub_binding_helper
+# endif /* ENABLE_REPLACEMENT */
+
#endif /* defined(__DARWIN__) */
-/* Disable exec-stacks, required for Gentoo ***********************************/
+/* disable exec-stacks ********************************************************/
-#if defined(__GCC__) && defined(__ELF__)
- .section .note.GNU-stack,"",@progbits
+#if defined(__linux__) && defined(__ELF__)
+ .section .note.GNU-stack,"",%progbits
#endif