X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fmips%2Fasmpart.S;h=73732e6c633c1132f565994df8c1401b9620cb53;hb=7659949229c634784f7d27aa8b679fdd4c8351ab;hp=53a00f0fee0d973d0f85b93ba704463030c009f1;hpb=9ae5b21542c6513b59af2bd4f11799e13b5b2ff4;p=cacao.git diff --git a/src/vm/jit/mips/asmpart.S b/src/vm/jit/mips/asmpart.S index 53a00f0fe..73732e6c6 100644 --- a/src/vm/jit/mips/asmpart.S +++ b/src/vm/jit/mips/asmpart.S @@ -1,9 +1,7 @@ /* 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. @@ -22,15 +20,6 @@ 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 $ - */ @@ -38,7 +27,6 @@ #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" @@ -58,25 +46,11 @@ .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 ********************************************************** * * @@ -103,35 +77,17 @@ #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) */ @@ -152,157 +108,96 @@ asm_vm_call_method_double: 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 @@ -313,29 +208,27 @@ L_asm_vm_call_method_recompute_pv: .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 @@ -351,95 +244,6 @@ asm_vm_call_method_end: .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 @@ -469,7 +273,7 @@ L_asm_handle_exception_stack_loop: #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 */ @@ -613,20 +417,20 @@ ex_int2: 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 */ @@ -660,427 +464,10 @@ asm_abstractmethoderror: .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