/* src/vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
- Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
+ Copyright (C) 1996-2005, 2006, 2007, 2008 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.
- $Id: asmpart.S 8274 2007-08-08 15:58:17Z twisti $
-
*/
.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
-#if defined(ENABLE_REPLACEMENT)
- .globl asm_replacement_out
- .globl asm_replacement_in
-#endif
-
.globl asm_compare_and_swap
.globl asm_memory_barrier
.align 3
- .quad 0 /* catch type all */
- .quad 0 /* handler pc */
- .quad 0 /* end pc */
- .quad 0 /* start pc */
- .long 1 /* extable size */
- .long 0 /* ALIGNMENT PADDING */
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
- .long 0 /* ALIGNMENT PADDING */
.long 0 /* fltsave */
.long 1 /* intsave */
.long 0 /* isleaf */
- .long 0 /* IsSync */
.long 0 /* frame size */
.quad 0 /* codeinfo pointer */
L_asm_vm_call_method_recompute_pv:
lda pv,(asm_vm_call_method - L_asm_vm_call_method_recompute_pv)(ra)
+L_asm_vm_call_method_recompute_return:
mov s0,sp /* restore stack pointer */
-L_asm_vm_call_method_recompute_return:
ldq ra,0*8(sp) /* restore RA */
ldq gp,1*8(sp) /* restore global pointer */
ldq s0,3*8(sp)
.end asm_vm_call_method
-/* asm_call_jit_compiler *******************************************************
-
- Invokes the compiler for untranslated Java methods.
-
-*******************************************************************************/
-
- .ent asm_call_jit_compiler
-
-asm_call_jit_compiler:
- ldgp gp,0(pv)
- lda sp,-(ARG_CNT+2)*8(sp) /* +2: keep stack 16-byte aligned */
-
- stq ra,0*8(sp) /* save return address */
-
- SAVE_ARGUMENT_REGISTERS(1) /* save 6 int/6 float argument registers */
-
- mov itmp1,a0 /* pass methodinfo pointer */
- mov mptr,a1 /* pass method pointer */
- lda a2,(ARG_CNT+2)*8(sp) /* pass java sp */
- mov ra,a3
- jsr ra,jit_asm_compile /* call jit compiler */
- mov v0,pv
-
- ldq ra,0*8(sp) /* load return address */
-
- RESTORE_ARGUMENT_REGISTERS(1) /* restore 6 int/6 float argument registers */
-
- lda sp,(ARG_CNT+2)*8(sp) /* remove stack frame */
-
- beq pv,L_asm_call_jit_compiler_exception
-
- jmp zero,(pv) /* and call method, the method returns */
- /* directly to the caller (ra). */
-
-L_asm_call_jit_compiler_exception:
- subq sp,2*8,sp
- stq ra,0*8(sp) /* save return address (xpc) */
- jsr ra,exceptions_get_and_clear_exception
- ldq ra,0*8(sp) /* restore return address (xpc) */
- addq sp,2*8,sp
-
- mov v0,xptr /* get exception */
- subq ra,4,xpc /* exception address is ra - 4 */
- br L_asm_handle_nat_exception
-
- .end asm_call_jit_compiler
-
-
/* asm_handle_exception ********************************************************
This function handles an exception. It does not use the usual calling
L_asm_handle_exception_load_gp:
ldgp gp,0(ra) /* load gp */
- jsr ra,md_codegen_get_pv_from_pc/* get PV from RA */
+ jsr ra,md_asm_codegen_get_pv_from_pc /* get PV from RA */
stq v0,2*8(sp) /* save PV */
ldq a0,0*8(sp) /* pass xptr */
.end asm_abstractmethoderror
-#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 */
- lda sp,-(REPLACEMENT_STACK_OFFSET)(sp)
-
- /* save registers in execution state */
- stq $0 ,( 0*8+offes_intregs)(sp)
- stq $1 ,( 1*8+offes_intregs)(sp)
- stq $2 ,( 2*8+offes_intregs)(sp)
- stq $3 ,( 3*8+offes_intregs)(sp)
- stq $4 ,( 4*8+offes_intregs)(sp)
- stq $5 ,( 5*8+offes_intregs)(sp)
- stq $6 ,( 6*8+offes_intregs)(sp)
- stq $7 ,( 7*8+offes_intregs)(sp)
- stq $8 ,( 8*8+offes_intregs)(sp)
- stq $9 ,( 9*8+offes_intregs)(sp)
- stq $10,(10*8+offes_intregs)(sp)
- stq $11,(11*8+offes_intregs)(sp)
- stq $12,(12*8+offes_intregs)(sp)
- stq $13,(13*8+offes_intregs)(sp)
- stq $14,(14*8+offes_intregs)(sp)
- stq $15,(15*8+offes_intregs)(sp)
- stq $16,(16*8+offes_intregs)(sp)
- stq $17,(17*8+offes_intregs)(sp)
- stq $18,(18*8+offes_intregs)(sp)
- stq $19,(19*8+offes_intregs)(sp)
- stq $20,(20*8+offes_intregs)(sp)
- stq $21,(21*8+offes_intregs)(sp)
- stq $22,(22*8+offes_intregs)(sp)
- stq $23,(23*8+offes_intregs)(sp)
- stq $24,(24*8+offes_intregs)(sp)
- stq $25,(25*8+offes_intregs)(sp)
- stq $26,(26*8+offes_intregs)(sp)
- stq $27,(27*8+offes_intregs)(sp)
- stq $28,(28*8+offes_intregs)(sp)
- stq $29,(29*8+offes_intregs)(sp)
- stq $30,(30*8+offes_intregs)(sp)
- stq $31,(31*8+offes_intregs)(sp)
-
- stt $f0 ,( 0*8+offes_fltregs)(sp)
- stt $f1 ,( 1*8+offes_fltregs)(sp)
- stt $f2 ,( 2*8+offes_fltregs)(sp)
- stt $f3 ,( 3*8+offes_fltregs)(sp)
- stt $f4 ,( 4*8+offes_fltregs)(sp)
- stt $f5 ,( 5*8+offes_fltregs)(sp)
- stt $f6 ,( 6*8+offes_fltregs)(sp)
- stt $f7 ,( 7*8+offes_fltregs)(sp)
- stt $f8 ,( 8*8+offes_fltregs)(sp)
- stt $f9 ,( 9*8+offes_fltregs)(sp)
- stt $f10,(10*8+offes_fltregs)(sp)
- stt $f11,(11*8+offes_fltregs)(sp)
- stt $f12,(12*8+offes_fltregs)(sp)
- stt $f13,(13*8+offes_fltregs)(sp)
- stt $f14,(14*8+offes_fltregs)(sp)
- stt $f15,(15*8+offes_fltregs)(sp)
- stt $f16,(16*8+offes_fltregs)(sp)
- stt $f17,(17*8+offes_fltregs)(sp)
- stt $f18,(18*8+offes_fltregs)(sp)
- stt $f19,(19*8+offes_fltregs)(sp)
- stt $f20,(20*8+offes_fltregs)(sp)
- stt $f21,(21*8+offes_fltregs)(sp)
- stt $f22,(22*8+offes_fltregs)(sp)
- stt $f23,(23*8+offes_fltregs)(sp)
- stt $f24,(24*8+offes_fltregs)(sp)
- stt $f25,(25*8+offes_fltregs)(sp)
- stt $f26,(26*8+offes_fltregs)(sp)
- stt $f27,(27*8+offes_fltregs)(sp)
- stt $f28,(28*8+offes_fltregs)(sp)
- stt $f29,(29*8+offes_fltregs)(sp)
- stt $f30,(30*8+offes_fltregs)(sp)
- stt $f31,(31*8+offes_fltregs)(sp)
-
- /* calculate sp of method */
- lda itmp1,(REPLACEMENT_STACK_OFFSET + 2*8)(sp)
- stq itmp1,(offes_sp)(sp)
-
- br ra,L_asm_replacement_out_load_gp
-L_asm_replacement_out_load_gp:
- ldgp gp,0(ra) /* load gp */
-
- /* store pv */
- stq pv,(offes_pv)(sp)
-
- /* call replace_me */
- ldq a0,-(2*8)(itmp1) /* arg0: rplpoint * */
- mov sp,a1 /* arg1: execution state */
- jmp zero,replace_me /* call C function replace_me */
- jmp zero,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, replace_safestack_t *st);
-
-*******************************************************************************/
-
- .ent asm_replacement_in
-
-asm_replacement_in:
- /* a0 == executionstate *es */
-
- /* get arguments */
- mov a1,s1 /* replace_safestack_t *st */
- mov a0,s2 /* executionstate *es == safe stack */
-
- /* switch to the safe stack */
- mov s2,sp
-
- /* call replace_build_execution_state(st) */
- mov s1,a0
- jsr ra,replace_build_execution_state
-
- /* set new sp */
- ldq sp,(offes_sp)(s2)
-
- /* build stack frame */
- lda sp,(-sizeexecutionstate)(sp)
-
- /* call replace_free_safestack(st,& of allocated executionstate_t) */
- mov sp,a1 /* tmpes */
- mov s1,a0 /* st */
- jsr ra,replace_free_safestack
-
- /* set new pv */
- ldq pv,(offes_pv)(sp)
-
- /* copy registers from execution state */
- ldq $0 ,( 0*8+offes_intregs)(sp)
- ldq $1 ,( 1*8+offes_intregs)(sp)
- ldq $2 ,( 2*8+offes_intregs)(sp)
- ldq $3 ,( 3*8+offes_intregs)(sp)
- ldq $4 ,( 4*8+offes_intregs)(sp)
- ldq $5 ,( 5*8+offes_intregs)(sp)
- ldq $6 ,( 6*8+offes_intregs)(sp)
- ldq $7 ,( 7*8+offes_intregs)(sp)
- ldq $8 ,( 8*8+offes_intregs)(sp)
- ldq $9 ,( 9*8+offes_intregs)(sp)
- ldq $10,(10*8+offes_intregs)(sp)
- ldq $11,(11*8+offes_intregs)(sp)
- ldq $12,(12*8+offes_intregs)(sp)
- ldq $13,(13*8+offes_intregs)(sp)
- ldq $14,(14*8+offes_intregs)(sp)
- ldq $15,(15*8+offes_intregs)(sp)
- ldq a0, (16*8+offes_intregs)(sp)
- ldq $17,(17*8+offes_intregs)(sp)
- ldq $18,(18*8+offes_intregs)(sp)
- ldq $19,(19*8+offes_intregs)(sp)
- ldq $20,(20*8+offes_intregs)(sp)
- ldq $21,(21*8+offes_intregs)(sp)
- ldq $22,(22*8+offes_intregs)(sp)
- ldq $23,(23*8+offes_intregs)(sp)
- ldq $24,(24*8+offes_intregs)(sp)
- ldq $25,(25*8+offes_intregs)(sp)
- ldq $26,(26*8+offes_intregs)(sp)
- /* $27 is pv */
- ldq $28,(28*8+offes_intregs)(sp)
- ldq $29,(29*8+offes_intregs)(sp)
- /* $30 is sp */
- /* $31 is zero */
-
- ldt $f0 ,( 0*8+offes_fltregs)(sp)
- ldt $f1 ,( 1*8+offes_fltregs)(sp)
- ldt $f2 ,( 2*8+offes_fltregs)(sp)
- ldt $f3 ,( 3*8+offes_fltregs)(sp)
- ldt $f4 ,( 4*8+offes_fltregs)(sp)
- ldt $f5 ,( 5*8+offes_fltregs)(sp)
- ldt $f6 ,( 6*8+offes_fltregs)(sp)
- ldt $f7 ,( 7*8+offes_fltregs)(sp)
- ldt $f8 ,( 8*8+offes_fltregs)(sp)
- ldt $f9 ,( 9*8+offes_fltregs)(sp)
- ldt $f10,(10*8+offes_fltregs)(sp)
- ldt $f11,(11*8+offes_fltregs)(sp)
- ldt $f12,(12*8+offes_fltregs)(sp)
- ldt $f13,(13*8+offes_fltregs)(sp)
- ldt $f14,(14*8+offes_fltregs)(sp)
- ldt $f15,(15*8+offes_fltregs)(sp)
- ldt $f16,(16*8+offes_fltregs)(sp)
- ldt $f17,(17*8+offes_fltregs)(sp)
- ldt $f18,(18*8+offes_fltregs)(sp)
- ldt $f19,(19*8+offes_fltregs)(sp)
- ldt $f20,(20*8+offes_fltregs)(sp)
- ldt $f21,(21*8+offes_fltregs)(sp)
- ldt $f22,(22*8+offes_fltregs)(sp)
- ldt $f23,(23*8+offes_fltregs)(sp)
- ldt $f24,(24*8+offes_fltregs)(sp)
- ldt $f25,(25*8+offes_fltregs)(sp)
- ldt $f26,(26*8+offes_fltregs)(sp)
- ldt $f27,(27*8+offes_fltregs)(sp)
- ldt $f28,(28*8+offes_fltregs)(sp)
- ldt $f29,(29*8+offes_fltregs)(sp)
- ldt $f30,(30*8+offes_fltregs)(sp)
- ldt $f31,(31*8+offes_fltregs)(sp)
-
- /* load new pc */
-
- ldq itmp3,offes_pc(sp)
-
- /* remove stack frame */
-
- lda sp,(sizeexecutionstate)(sp)
-
- /* jump to new code */
-
- jmp zero,(itmp3)
-
- .end asm_replacement_in
-
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
/* asm_compare_and_swap ********************************************************
Does an atomic compare and swap. Required for the lock