/* src/vm/jit/mips/asmpart.S - Java-C interface functions for MIPS
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
- C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
- E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
- J. Wenninger, Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Andreas Krall
-
- Changes: Christian Thalinger
- Edwin Steiner
-
- $Id: asmpart.S 7601 2007-03-28 23:02:50Z michi $
-
*/
#include "vm/jit/mips/md-abi.h"
#include "vm/jit/mips/md-asm.h"
-#include "vm/jit/mips/offsets.h"
#include "vm/jit/abi-asm.h"
#include "vm/jit/methodheader.h"
.globl asm_vm_call_method_exception_handler
.globl asm_vm_call_method_end
- .globl asm_call_jit_compiler
-
.globl asm_handle_exception
.globl asm_handle_nat_exception
.globl asm_abstractmethoderror
- .globl asm_patcher_wrapper
-
-#if defined(ENABLE_REPLACEMENT)
- .globl asm_replacement_out
- .globl asm_replacement_in
-#endif
-
- .globl asm_getclassvalues_atomic
- .globl asm_criticalsections
-
- .globl compare_and_swap
-
/* asm_vm_call_method **********************************************************
* *
#if SIZEOF_VOID_P == 8
- .dword 0 /* catch type all */
- .dword 0 /* handler pc */
- .dword 0 /* end pc */
- .dword 0 /* start pc */
- .word 1 /* extable size */
- .word 0 /* 4-byte ALIGNMENT PADDING */
- .dword 0 /* line number table start */
- .dword 0 /* line number table size */
- .word 0 /* 4-byte ALIGNMENT PADDING */
.word 0 /* fltsave */
.word 0 /* intsave */
.word 0 /* isleaf */
- .word 0 /* IsSync */
.word 0 /* frame size */
.dword 0 /* codeinfo pointer */
#else /* SIZEOF_VOID_P == 8 */
- .word 0 /* catch type all */
- .word 0 /* handler pc */
- .word 0 /* end pc */
- .word 0 /* start pc */
- .word 1 /* extable size */
- .word 0 /* line number table start */
- .word 0 /* line number table size */
.word 0 /* fltsave */
.word 0 /* intsave */
.word 0 /* isleaf */
- .word 0 /* IsSync */
.word 0 /* frame size */
.word 0 /* method pointer (pointer to name) */
L_asm_vm_call_method_compute_pv:
aaddiu pv,ra,-4*4
- ast s7,3*8(sp)
+ ast s0,3*8(sp) /* save callee saved register */
+ ast a0,4*8(sp) /* save method PV */
#if SIZEOF_VOID_P == 8
- sdc1 fss0,5*8(sp) /* save non JavaABI saved flt registers */
- sdc1 fss1,6*8(sp)
- sdc1 fss2,7*8(sp)
- sdc1 fss3,8*8(sp)
- sdc1 fss4,9*8(sp)
- sdc1 fss5,10*8(sp)
+ s.d fss0,5*8(sp) /* save non JavaABI saved flt registers */
+ s.d fss1,6*8(sp)
+ s.d fss2,7*8(sp)
+ s.d fss3,8*8(sp)
+ s.d fss4,9*8(sp)
+ s.d fss5,10*8(sp)
#endif
- ast a0,4*8(sp) /* save method pointer for compiler */
-
- move t0,a2 /* address of first block */
- move s7,a1 /* argument count */
- blez s7,calljava_argsloaded
- nop
+ move t0,a1 /* address of data structure */
+ move t1,a2 /* stack argument count */
+ move s0,sp /* save stack pointer */
#if SIZEOF_VOID_P == 8
- ald a0,offvmargdata(t0)
- ldc1 fa0,offvmargdata(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a1,offvmargdata+sizevmarg*1(t0)
- ldc1 fa1,offvmargdata+sizevmarg*1(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a2,offvmargdata+sizevmarg*2(t0)
- ldc1 fa2,offvmargdata+sizevmarg*2(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a3,offvmargdata+sizevmarg*3(t0)
- ldc1 fa3,offvmargdata+sizevmarg*3(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a4,offvmargdata+sizevmarg*4(t0)
- ldc1 fa4,offvmargdata+sizevmarg*4(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a5,offvmargdata+sizevmarg*5(t0)
- ldc1 fa5,offvmargdata+sizevmarg*5(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a6,offvmargdata+sizevmarg*6(t0)
- ldc1 fa6,offvmargdata+sizevmarg*6(t0)
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
- nop
-
- ald a7,offvmargdata+sizevmarg*7(t0)
- ldc1 fa7,offvmargdata+sizevmarg*7(t0)
- aaddi s7,s7,-1
+ ld a0,0*8(t0)
+ ld a1,1*8(t0)
+ ld a2,2*8(t0)
+ ld a3,3*8(t0)
+ ld a4,4*8(t0)
+ ld a5,5*8(t0)
+ ld a6,6*8(t0)
+ ld a7,7*8(t0)
+
+ l.d fa0,8*8(t0)
+ l.d fa1,9*8(t0)
+ l.d fa2,10*8(t0)
+ l.d fa3,11*8(t0)
+ l.d fa4,12*8(t0)
+ l.d fa5,13*8(t0)
+ l.d fa6,14*8(t0)
+ l.d fa7,15*8(t0)
#else /* SIZEOF_VOID_P == 8 */
-#if WORDS_BIGENDIAN == 1
- ald a0,offvmargdata+4(t0)
-#else
- ald a0,offvmargdata(t0)
-#endif
-#if !defined(ENABLE_SOFT_FLOAT)
- ldc1 fa0,offvmargdata(t0)
-#endif
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
-
-#if WORDS_BIGENDIAN == 1
- ald a1,offvmargdata+4+sizevmarg*1(t0)
-#else
- ald a1,offvmargdata+sizevmarg*1(t0)
-#endif
-#if !defined(ENABLE_SOFT_FLOAT)
- ldc1 fa1,offvmargdata+sizevmarg*1(t0)
-#endif
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
-
-#if WORDS_BIGENDIAN == 1
- ald a2,offvmargdata+4+sizevmarg*2(t0)
-#else
- ald a2,offvmargdata+sizevmarg*2(t0)
-#endif
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
+# if WORDS_BIGENDIAN == 1
+ lw a0,0*8+4(t0)
+ lw a1,1*8+4(t0)
+ lw a2,2*8+4(t0)
+ lw a3,3*8+4(t0)
+# else
+ lw a0,0*8(t0)
+ lw a1,1*8(t0)
+ lw a2,2*8(t0)
+ lw a3,3*8(t0)
+# endif
-#if WORDS_BIGENDIAN == 1
- ald a3,offvmargdata+4+sizevmarg*3(t0)
-#else
- ald a3,offvmargdata+sizevmarg*3(t0)
-#endif
- aaddi s7,s7,-1
- blez s7,calljava_argsloaded
+# if !defined(ENABLE_SOFT_FLOAT)
+ l.d fa0,4*8(t0)
+ l.d fa1,5*8(t0)
+# endif
#endif /* SIZEOF_VOID_P == 8 */
-calljava_argsloaded:
- move t4,sp /* save stack pointer */
- blez s7,calljava_nocopy
+ beqz t1,L_asm_vm_call_method_stack_copy_done
nop
-#if SIZEOF_VOID_P == 4
- aaddiu s7,s7,4 /* add stack space for 4 arguments */
-#endif
- subu t1,zero,s7 /* remaining argument count (negative) */
- sll t2,t1,3 /* calculate stackframe size */
- aaddu sp,sp,t2 /* create stackframe */
- aaddu t2,t2,t4 /* also set temp sp */
-#if SIZEOF_VOID_P == 4
- aaddiu t2,t2,4*8 /* skip stack space for 4 arguments */
- addiu t1,t1,4
-#endif
+ sll t2,t1,3 /* calculate stackframe size (* 8) */
+ asubu sp,sp,t2 /* create stackframe */
+ move t2,sp /* temporary stack pointer */
-calljava_copyloop:
+L_asm_vm_call_method_stack_copy_loop:
#if SIZEOF_VOID_P == 8
- ald t3,offvmargdata+sizevmarg*8(t0)
+ ld t3,16*8(t0) /* load argument */
+ sd t3,0(t2) /* store argument on stack */
#else
-# if WORDS_BIGENDIAN == 1
- ald t3,offvmargdata+4+sizevmarg*4(t0)
+# if !defined(ENABLE_SOFT_FLOAT)
+ lw t3,6*8+0(t0) /* load argument */
+ lw t4,6*8+4(t0)
+ sw t3,0(t2) /* store argument on stack */
+ sw t4,4(t2)
# else
- ald t3,offvmargdata+sizevmarg*4(t0)
+# error implement me
# endif
#endif
- ast t3,0(t2) /* store argument on stack */
- addi t1,t1,1 /* count 1 argument */
- aaddi t0,t0,sizevmarg /* load address of next block */
- aaddi t2,t2,8 /* increase stack position */
- bnez t1,calljava_copyloop /* all arguments copied? */
- nop
-calljava_nocopy:
- ald itmp1,4*8(t4) /* pass method pointer via itmp1 */
+ aaddi t1,t1,-1 /* subtract 1 argument */
+ aaddi t0,t0,8 /* load address of next argument */
+ aaddi t2,t2,8 /* increase stack pointer */
- ala mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
- ast mptr,2*8(t4) /* store function address */
- ala mptr,1*8(t4) /* set method pointer */
+ bgtz t1,L_asm_vm_call_method_stack_copy_loop
+ nop
- ald pv,1*8(mptr) /* method call as in Java */
- jalr pv /* call JIT compiler */
+L_asm_vm_call_method_stack_copy_done:
+ ala mptr,4*8(s0) /* get address of PV */
+ ald pv,0*8(mptr) /* load PV */
+ jalr pv
nop
L_asm_vm_call_method_recompute_pv:
#if SIZEOF_VOID_P == 8
.set reorder /* XXX we need to recompute pv */
- sll t1,s7,3 /* remove argument stackframe */
- aaddu sp,sp,t1
-
calljava_return2:
+ move sp,s0 /* restore stack pointer */
+
ald ra,0*8(sp) /* restore return address */
ald pv,1*8(sp) /* restore procedure vector */
- ald s7,3*8(sp)
+ ald s0,3*8(sp)
#if SIZEOF_VOID_P == 8
- ldc1 fss0,5*8(sp) /* restore non JavaABI saved flt regs */
- ldc1 fss1,6*8(sp)
- ldc1 fss2,7*8(sp)
- ldc1 fss3,8*8(sp)
- ldc1 fss4,9*8(sp)
- ldc1 fss5,10*8(sp)
+ l.d fss0,5*8(sp) /* restore non JavaABI saved flt regs */
+ l.d fss1,6*8(sp)
+ l.d fss2,7*8(sp)
+ l.d fss3,8*8(sp)
+ l.d fss4,9*8(sp)
+ l.d fss5,10*8(sp)
#endif
aaddiu sp,sp,12*8 /* free stack space */
j ra /* return */
asm_vm_call_method_exception_handler:
- sll t1,s7,3 /* remove stackframe */
- aaddu sp,sp,t1
+ move sp,s0 /* restore stack pointer */
#if SIZEOF_VOID_P == 4
aaddiu sp,sp,-4*4 /* reserve space for 1 argument */
#endif
.end asm_vm_call_method
-/****************** function asm_call_jit_compiler *****************************
-* *
-* invokes the compiler for untranslated JavaVM methods. *
-* *
-* Register REG_ITEMP1 contains a pointer to the method info structure *
-* (prepared by createcompilerstub). Using the return address in R31 and the *
-* offset in the LDA instruction or using the value in methodptr R25 the *
-* patching address for storing the method address can be computed: *
-* *
-* method address was either loaded using *
-* M_ALD (REG_PV, REG_PV, a) ; invokestatic/special ($28) *
-* M_JSR (REG_RA, REG_PV); *
-* M_NOP *
-* M_LDA (REG_PV, REG_RA, val) *
-* or *
-* M_ALD (REG_PV, REG_METHODPTR, m) ; invokevirtual/interface ($25) *
-* M_JSR (REG_RA, REG_PV); *
-* M_NOP *
-* in the static case the method pointer can be computed using the *
-* return address and the lda function following the jmp instruction *
-* *
-*******************************************************************************/
-
- .ent asm_call_jit_compiler
-
-asm_call_jit_compiler:
-#if SIZEOF_VOID_P == 8
-
- aaddiu sp,sp,-(ARG_CNT+2)*8 /* +2: keep stack 16-bytes aligned */
-
- ast ra,0*8(sp) /* save return address */
-
- SAVE_ARGUMENT_REGISTERS(1)
-
- move a0,itmp1 /* pass methodinfo pointer */
- move a1,mptr /* pass method pointer */
- aaddiu a2,sp,(ARG_CNT+2)*8 /* pass java sp */
- move a3,ra
- jal jit_asm_compile /* call jit compiler */
- move pv,v0
-
- ald ra,0*8(sp) /* restore return address */
-
- RESTORE_ARGUMENT_REGISTERS(1)
-
- aaddiu sp,sp,(ARG_CNT+2)*8 /* remove stack frame */
-
-#else /* SIZEOF_VOID_P == 8 */
-
- aaddiu sp,sp,-(ARG_CNT+2)*8 /* +4: keep stack 16-bytes aligned */
-
- ast ra,4*4+0*4(sp) /* save return address */
-
- SAVE_ARGUMENT_REGISTERS(6)
-
- move a0,itmp1 /* pass methodinfo pointer */
- move a1,mptr /* pass method pointer */
- aaddiu a2,sp,(ARG_CNT+2)*8 /* pass java sp */
- move a3,ra
- jal jit_asm_compile /* call jit compiler */
- move pv,v0
-
- ald ra,4*4+0*4(sp) /* restore return address */
-
- RESTORE_ARGUMENT_REGISTERS(6)
-
- aaddiu sp,sp,(ARG_CNT+2)*8 /* remove stack frame */
-
-#endif /* SIZEOF_VOID_P == 8 */
-
- beqz pv,L_asm_call_jit_compiler_exception
-
- jr pv /* and call method. The method returns */
- /* directly to the caller (ra). */
-
-L_asm_call_jit_compiler_exception:
- aaddiu sp,sp,-2*8
- ast ra,0*8(sp)
- jal exceptions_get_and_clear_exception
- ald ra,0*8(sp)
- aaddiu sp,sp,2*8
-
- move xptr,v0 /* get exception */
- aaddiu xpc,ra,-4 /* exception address is RA - 4 */
- b asm_handle_nat_exception
-
- .end asm_call_jit_compiler
-
-
/* asm_handle_exception ********************************************************
This function handles an exception. It does not use the usual calling
#endif
move a0,ra /* pass RA */
- jal md_codegen_get_pv_from_pc /* get PV from RA */
+ jal md_asm_codegen_get_pv_from_pc /* get PV from RA */
#if SIZEOF_VOID_P == 8
ast v0,2*8(sp) /* save PV */
jr t3 /* jump to save position */
#if SIZEOF_VOID_P == 8
- ldc1 fs0,-4*8(t1)
- ldc1 fs1,-3*8(t1)
- ldc1 fs2,-2*8(t1)
- ldc1 fs3,-1*8(t1)
-#else /* SIZEOF_VOID_P == 8 */
+ l.d fs0,-4*8(t1)
+ l.d fs1,-3*8(t1)
+ l.d fs2,-2*8(t1)
+ l.d fs3,-1*8(t1)
+#else
# if !defined(ENABLE_SOFT_FLOAT)
- ldc1 fs0,-4*8(t1)
- ldc1 fs1,-3*8(t1)
- ldc1 fs2,-2*8(t1)
- ldc1 fs3,-1*8(t1)
- ldc1 fs4,-1*8(t1)
- ldc1 fs5,-1*8(t1)
-# endif /* !defined(ENABLE_SOFT_FLOAT) */
-#endif /* SIZEOF_VOID_P == 8 */
+ l.d fs0,-6*8(t1)
+ l.d fs1,-5*8(t1)
+ l.d fs2,-4*8(t1)
+ l.d fs3,-3*8(t1)
+ l.d fs4,-2*8(t1)
+ l.d fs5,-1*8(t1)
+# endif
+#endif
ex_flt2:
lw t1,FrameSize(pv) /* get frame size */
.end asm_abstractmethoderror
-/* asm_patcher_wrapper *********************************************************
-
- XXX
-
- Stack layout:
- 56 return address into JIT code (patch position)
- 48 pointer to virtual java_objectheader
- 40 machine code (which is patched back later)
- 32 machine code (which is patched back later)
- 24 machine code (which is patched back later)
- 16 unresolved class/method/field reference
- 8 data segment displacement from load instructions
- 0 patcher function pointer to call
-
-*******************************************************************************/
-
- .ent asm_patcher_wrapper
-
-asm_patcher_wrapper:
-#if SIZEOF_VOID_P == 8
-
- aaddiu sp,sp,-((2+16+22+4)*8)/* create stack frame */
-
- SAVE_RETURN_REGISTERS(0) /* save 1 int/1 float return registers */
- SAVE_ARGUMENT_REGISTERS(2) /* save 8 int/8 float argument registers */
- SAVE_TEMPORARY_REGISTERS(18) /* save 5 int/16 float temporary registers */
-
- ast itmp1,(2+16+22+0)*8(sp) /* save itmp1 */
- ast itmp2,(2+16+22+1)*8(sp) /* save itmp2 */
- ast ra,(2+16+22+2)*8(sp) /* save method return address (for leafs) */
- ast pv,(2+16+22+3)*8(sp) /* save pv of calling java function */
-
- aaddiu a0,sp,(2+16+22+4)*8 /* pass SP of patcher stub */
- move a1,pv /* pass PV */
- move a2,ra /* pass RA (correct for leafs) */
- jal patcher_wrapper
- move itmp3,v0
-
- RESTORE_RETURN_REGISTERS(0) /* restore 1 int/1 float return registers */
- RESTORE_ARGUMENT_REGISTERS(2) /* restore 8 int/8 float argument registers */
- RESTORE_TEMPORARY_REGISTERS(18) /* restore 5 int/16 float temporary reg. */
-
- ald itmp1,(2+16+22+0)*8(sp) /* restore itmp1 */
- ald itmp2,(2+16+22+1)*8(sp) /* restore itmp2 */
- ald ra,(2+16+22+2)*8(sp) /* restore method return address (for leafs)*/
- ald pv,(2+16+22+3)*8(sp) /* restore pv of calling java function */
-
- bnez itmp3,L_asm_patcher_wrapper_exception
-
- ald itmp3,(7+2+16+22+4)*8(sp) /* load RA */
- aaddiu sp,sp,(8+2+16+22+4)*8 /* remove stack frame */
-
- jr itmp3 /* jump to new patched code */
-
-L_asm_patcher_wrapper_exception:
- move xptr,itmp3 /* get exception */
- ald xpc,(7+2+16+22+4)*8(sp) /* xpc is RA */
- aaddiu sp,sp,(8+2+16+22+4)*8 /* remove stack frame */
-
-#else /* SIZEOF_VOID_P == 8 */
-
- aaddiu sp,sp,-((6+4+8+16+7)*4) /* create stack frame */
- /* +7 keeps the SP 16-bytes aligned */
-
- SAVE_RETURN_REGISTERS(6) /* save 2 int / 1 float return registers */
- SAVE_ARGUMENT_REGISTERS(10) /* save 4 int / 2 float argument registers */
- SAVE_TEMPORARY_REGISTERS(18) /* save 8 int / 4 float temporary registers */
-
- ast itmp1,(6+4+8+16+0)*4(sp) /* save itmp1 */
- ast itmp2,(6+4+8+16+1)*4(sp) /* save itmp2 */
- ast ra,(6+4+8+16+2)*4(sp) /* save method return address (for leafs) */
- ast pv,(6+4+8+16+3)*4(sp) /* save pv of calling java function */
-
- aaddiu a0,sp,(6+4+8+16+7)*4 /* pass SP of patcher stub */
- move a1,pv /* pass PV */
- move a2,ra /* pass RA (correct for leafs) */
- jal patcher_wrapper
- move itmp3,v0
-
- RESTORE_RETURN_REGISTERS(6) /* restore 2 int / 2 float return registers */
- RESTORE_ARGUMENT_REGISTERS(10) /* restore 4 int / 2 float argument regs */
- RESTORE_TEMPORARY_REGISTERS(18) /* restore 8 int / 4 float temporary regs */
-
- ald itmp1,(6+4+8+16+0)*4(sp) /* restore itmp1 */
- ald itmp2,(6+4+8+16+1)*4(sp) /* restore itmp2 */
- ald ra,(6+4+8+16+2)*4(sp) /* restore method return address (for leafs)*/
- ald pv,(6+4+8+16+3)*4(sp) /* restore pv of calling java function */
-
- bnez itmp3,L_asm_wrapper_patcher_exception
-
- ald itmp3,7*8+(6+4+8+16+7)*4(sp) /* load RA */
- aaddiu sp,sp,8*8+(6+4+8+16+7)*4 /* remove stack frame */
-
- jr itmp3 /* jump to new patched code */
-
-L_asm_wrapper_patcher_exception:
- move xptr,itmp3 /* get exception */
- ald xpc,7*8+(6+4+8+16+7)*4(sp) /* xpc is RA */
- aaddiu sp,sp,8*8+(6+4+8+16+7)*4 /* remove stack frame */
-
-#endif /* SIZEOF_VOID_P == 8 */
-
- b asm_handle_exception
-
- .end asm_patcher_wrapper
-
-#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 REPLACEMENT_STACK_OFFSET ((sizeexecutionstate + REPLACEMENT_ROOM + 0xf) & ~0xf)
-
- .ent asm_replacement_out
-
-asm_replacement_out:
- /* create stack frame */
- aaddiu sp,sp,-REPLACEMENT_STACK_OFFSET
-
- /* save registers in execution state */
- ast $0 ,( 0*8+offes_intregs)(sp)
- ast $1 ,( 1*8+offes_intregs)(sp)
- ast $2 ,( 2*8+offes_intregs)(sp)
- ast $3 ,( 3*8+offes_intregs)(sp)
- ast $4 ,( 4*8+offes_intregs)(sp)
- ast $5 ,( 5*8+offes_intregs)(sp)
- ast $6 ,( 6*8+offes_intregs)(sp)
- ast $7 ,( 7*8+offes_intregs)(sp)
- ast $8 ,( 8*8+offes_intregs)(sp)
- ast $9 ,( 9*8+offes_intregs)(sp)
- ast $10,(10*8+offes_intregs)(sp)
- ast $11,(11*8+offes_intregs)(sp)
- ast $12,(12*8+offes_intregs)(sp)
- ast $13,(13*8+offes_intregs)(sp)
- ast $14,(14*8+offes_intregs)(sp)
- ast $15,(15*8+offes_intregs)(sp)
- ast $16,(16*8+offes_intregs)(sp)
- ast $17,(17*8+offes_intregs)(sp)
- ast $18,(18*8+offes_intregs)(sp)
- ast $19,(19*8+offes_intregs)(sp)
- ast $20,(20*8+offes_intregs)(sp)
- ast $21,(21*8+offes_intregs)(sp)
- ast $22,(22*8+offes_intregs)(sp)
- ast $23,(23*8+offes_intregs)(sp)
- ast $24,(24*8+offes_intregs)(sp)
- ast $25,(25*8+offes_intregs)(sp)
- ast $26,(26*8+offes_intregs)(sp)
- ast $27,(27*8+offes_intregs)(sp)
- ast $28,(28*8+offes_intregs)(sp)
- ast $29,(29*8+offes_intregs)(sp)
- ast $30,(30*8+offes_intregs)(sp)
- ast $31,(31*8+offes_intregs)(sp)
-
-#if SIZEOF_VOID_P == 8
-
- sdc1 $f0 ,( 0*8+offes_fltregs)(sp)
- sdc1 $f1 ,( 1*8+offes_fltregs)(sp)
- sdc1 $f2 ,( 2*8+offes_fltregs)(sp)
- sdc1 $f3 ,( 3*8+offes_fltregs)(sp)
- sdc1 $f4 ,( 4*8+offes_fltregs)(sp)
- sdc1 $f5 ,( 5*8+offes_fltregs)(sp)
- sdc1 $f6 ,( 6*8+offes_fltregs)(sp)
- sdc1 $f7 ,( 7*8+offes_fltregs)(sp)
- sdc1 $f8 ,( 8*8+offes_fltregs)(sp)
- sdc1 $f9 ,( 9*8+offes_fltregs)(sp)
- sdc1 $f10,(10*8+offes_fltregs)(sp)
- sdc1 $f11,(11*8+offes_fltregs)(sp)
- sdc1 $f12,(12*8+offes_fltregs)(sp)
- sdc1 $f13,(13*8+offes_fltregs)(sp)
- sdc1 $f14,(14*8+offes_fltregs)(sp)
- sdc1 $f15,(15*8+offes_fltregs)(sp)
- sdc1 $f16,(16*8+offes_fltregs)(sp)
- sdc1 $f17,(17*8+offes_fltregs)(sp)
- sdc1 $f18,(18*8+offes_fltregs)(sp)
- sdc1 $f19,(19*8+offes_fltregs)(sp)
- sdc1 $f20,(20*8+offes_fltregs)(sp)
- sdc1 $f21,(21*8+offes_fltregs)(sp)
- sdc1 $f22,(22*8+offes_fltregs)(sp)
- sdc1 $f23,(23*8+offes_fltregs)(sp)
- sdc1 $f24,(24*8+offes_fltregs)(sp)
- sdc1 $f25,(25*8+offes_fltregs)(sp)
- sdc1 $f26,(26*8+offes_fltregs)(sp)
- sdc1 $f27,(27*8+offes_fltregs)(sp)
- sdc1 $f28,(28*8+offes_fltregs)(sp)
- sdc1 $f29,(29*8+offes_fltregs)(sp)
- sdc1 $f30,(30*8+offes_fltregs)(sp)
- sdc1 $f31,(31*8+offes_fltregs)(sp)
-
-#else /* SIZEOF_VOID_P == 8 */
-
- sdc1 $f0 ,( 0*8+offes_fltregs)(sp)
- sdc1 $f2 ,( 2*8+offes_fltregs)(sp)
- sdc1 $f4 ,( 4*8+offes_fltregs)(sp)
- sdc1 $f6 ,( 6*8+offes_fltregs)(sp)
- sdc1 $f8 ,( 8*8+offes_fltregs)(sp)
- sdc1 $f10,(10*8+offes_fltregs)(sp)
- sdc1 $f12,(12*8+offes_fltregs)(sp)
- sdc1 $f14,(14*8+offes_fltregs)(sp)
- sdc1 $f16,(16*8+offes_fltregs)(sp)
- sdc1 $f18,(18*8+offes_fltregs)(sp)
- sdc1 $f20,(20*8+offes_fltregs)(sp)
- sdc1 $f22,(22*8+offes_fltregs)(sp)
- sdc1 $f24,(24*8+offes_fltregs)(sp)
- sdc1 $f26,(26*8+offes_fltregs)(sp)
- sdc1 $f28,(28*8+offes_fltregs)(sp)
- sdc1 $f30,(30*8+offes_fltregs)(sp)
-
-#endif /* SIZEOF_VOID_P == 8 */
-
- /* calculate sp of method */
- aaddiu itmp1,sp,(REPLACEMENT_STACK_OFFSET + 2*8)
- ast itmp1,(offes_sp)(sp)
-
- /* store pv */
- ast pv,(offes_pv)(sp)
-
- /* call replace_me */
- ald a0,-(2*8)(itmp1) /* arg0: rplpoint * */
- move a1,sp /* arg1: execution state */
- jal replace_me /* call C function replace_me */
- jal abort /* NEVER REACHED */
-
- .end asm_replacement_out
-
-/* 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!
-
- C prototype:
- void asm_replacement_in(executionstate *es);
-
-*******************************************************************************/
-
- .ent asm_replacement_in
-
-asm_replacement_in:
- /* a0 == executionstate *es */
-
- /* set new sp and pv */
- ald sp,(offes_sp)(a0)
- ald pv,(offes_pv)(a0)
-
- /* copy registers from execution state */
- /* $0 is zero */
- ald $1 ,( 1*8+offes_intregs)(a0)
- ald $2 ,( 2*8+offes_intregs)(a0)
- ald $3 ,( 2*8+offes_intregs)(a0)
- /* a0 is loaded below */
- ald $5 ,( 5*8+offes_intregs)(a0)
- ald $6 ,( 6*8+offes_intregs)(a0)
- ald $7 ,( 7*8+offes_intregs)(a0)
- ald $8 ,( 8*8+offes_intregs)(a0)
- ald $9 ,( 9*8+offes_intregs)(a0)
- ald $10,(10*8+offes_intregs)(a0)
- ald $11,(11*8+offes_intregs)(a0)
- ald $12,(12*8+offes_intregs)(a0)
- ald $13,(13*8+offes_intregs)(a0)
- ald $14,(14*8+offes_intregs)(a0)
- ald $15,(15*8+offes_intregs)(a0)
- ald $16,(16*8+offes_intregs)(a0)
- ald $17,(17*8+offes_intregs)(a0)
- ald $18,(18*8+offes_intregs)(a0)
- ald $19,(19*8+offes_intregs)(a0)
- ald $20,(20*8+offes_intregs)(a0)
- ald $21,(21*8+offes_intregs)(a0)
- ald $22,(22*8+offes_intregs)(a0)
- ald $23,(23*8+offes_intregs)(a0)
- ald $24,(24*8+offes_intregs)(a0)
- ald $25,(25*8+offes_intregs)(a0)
- ald $26,(26*8+offes_intregs)(a0)
- ald $27,(27*8+offes_intregs)(a0)
- ald $28,(28*8+offes_intregs)(a0)
- /* $29 is sp */
- /* $30 is pv */
- ald $31,(31*8+offes_intregs)(a0)
-
-#if SIZEOF_VOID_P == 8
-
- ldc1 $f0 ,( 0*8+offes_fltregs)(a0)
- ldc1 $f1 ,( 1*8+offes_fltregs)(a0)
- ldc1 $f2 ,( 2*8+offes_fltregs)(a0)
- ldc1 $f3 ,( 3*8+offes_fltregs)(a0)
- ldc1 $f4 ,( 4*8+offes_fltregs)(a0)
- ldc1 $f5 ,( 5*8+offes_fltregs)(a0)
- ldc1 $f6 ,( 6*8+offes_fltregs)(a0)
- ldc1 $f7 ,( 7*8+offes_fltregs)(a0)
- ldc1 $f8 ,( 8*8+offes_fltregs)(a0)
- ldc1 $f9 ,( 9*8+offes_fltregs)(a0)
- ldc1 $f10,(10*8+offes_fltregs)(a0)
- ldc1 $f11,(11*8+offes_fltregs)(a0)
- ldc1 $f12,(12*8+offes_fltregs)(a0)
- ldc1 $f13,(13*8+offes_fltregs)(a0)
- ldc1 $f14,(14*8+offes_fltregs)(a0)
- ldc1 $f15,(15*8+offes_fltregs)(a0)
- ldc1 $f16,(16*8+offes_fltregs)(a0)
- ldc1 $f17,(17*8+offes_fltregs)(a0)
- ldc1 $f18,(18*8+offes_fltregs)(a0)
- ldc1 $f19,(19*8+offes_fltregs)(a0)
- ldc1 $f20,(20*8+offes_fltregs)(a0)
- ldc1 $f21,(21*8+offes_fltregs)(a0)
- ldc1 $f22,(22*8+offes_fltregs)(a0)
- ldc1 $f23,(23*8+offes_fltregs)(a0)
- ldc1 $f24,(24*8+offes_fltregs)(a0)
- ldc1 $f25,(25*8+offes_fltregs)(a0)
- ldc1 $f26,(26*8+offes_fltregs)(a0)
- ldc1 $f27,(27*8+offes_fltregs)(a0)
- ldc1 $f28,(28*8+offes_fltregs)(a0)
- ldc1 $f29,(29*8+offes_fltregs)(a0)
- ldc1 $f30,(30*8+offes_fltregs)(a0)
- ldc1 $f31,(31*8+offes_fltregs)(a0)
-
-#else /* SIZEOF_VOID_P == 8 */
-
- ldc1 $f0 ,( 0*8+offes_fltregs)(a0)
- ldc1 $f2 ,( 2*8+offes_fltregs)(a0)
- ldc1 $f4 ,( 4*8+offes_fltregs)(a0)
- ldc1 $f6 ,( 6*8+offes_fltregs)(a0)
- ldc1 $f8 ,( 8*8+offes_fltregs)(a0)
- ldc1 $f10,(10*8+offes_fltregs)(a0)
- ldc1 $f12,(12*8+offes_fltregs)(a0)
- ldc1 $f14,(14*8+offes_fltregs)(a0)
- ldc1 $f16,(16*8+offes_fltregs)(a0)
- ldc1 $f18,(18*8+offes_fltregs)(a0)
- ldc1 $f20,(20*8+offes_fltregs)(a0)
- ldc1 $f22,(22*8+offes_fltregs)(a0)
- ldc1 $f24,(24*8+offes_fltregs)(a0)
- ldc1 $f26,(26*8+offes_fltregs)(a0)
- ldc1 $f28,(28*8+offes_fltregs)(a0)
- ldc1 $f30,(30*8+offes_fltregs)(a0)
-
-#endif /* SIZEOF_VOID_P == 8 */
-
- /* load new pc */
-
- ald itmp3,offes_pc(a0)
-
- /* load a0 */
-
- ald a0,(4*8+offes_intregs)(a0)
-
- /* jump to new code */
-
- jr itmp3
-
- .end asm_replacement_in
-
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
- .ent asm_getclassvalues_atomic
-
-asm_getclassvalues_atomic:
-_crit_restart:
-_crit_begin:
- lw t0,offbaseval(a0)
- lw t1,offdiffval(a0)
- lw t2,offbaseval(a1)
-_crit_end:
- sw t0,offcast_super_baseval(a2)
- sw t1,offcast_super_diffval(a2)
- sw t2,offcast_sub_baseval(a2)
- j ra
-
- .end asm_getclassvalues_atomic
-
- .data
-
-asm_criticalsections:
-#if defined(ENABLE_THREADS)
- .dword _crit_begin
- .dword _crit_end
- .dword _crit_restart
-#endif
- .dword 0
-
-
- .text
-
- .ent compare_and_swap
-
-compare_and_swap:
-1:
- all v0,0(a0)
- bne v0,a1,2f
- move t0,a2
- asc t0,0(a0)
- beqz t0,1b
-2:
- sync
- j ra
-
- .end compare_and_swap
-
-
-/* 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