-/* jit/alpha/asmpart.S - Java-C interface functions for alpha
+/* src/vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- Institut f. Computersprachen, TU Wien
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
- S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
- J. Wenninger
+ 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
This file is part of CACAO.
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., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+*/
- Authors: Andreas Krall
- Reinhard Grafl
- $Id: asmpart.S 899 2004-01-22 13:24:36Z twisti $
+#include "config.h"
-*/
+#include "vm/jit/alpha/md-abi.h"
+#include "vm/jit/alpha/md-asm.h"
+
+#include "vm/jit/abi-asm.h"
+#include "vm/jit/methodheader.h"
-
-#include "offsets.h"
-
-#define v0 $0
-
-#define t0 $1
-#define t1 $2
-#define t2 $3
-#define t3 $4
-#define t4 $5
-#define t5 $6
-#define t6 $7
-#define t7 $8
-
-#define s0 $9
-#define s1 $10
-#define s2 $11
-#define s3 $12
-#define s4 $13
-#define s5 $14
-#define s6 $15
-
-#define a0 $16
-#define a1 $17
-#define a2 $18
-#define a3 $19
-#define a4 $20
-#define a5 $21
-
-#define t8 $22
-#define t9 $23
-#define t10 $24
-#define t11 $25
-#define ra $26
-#define t12 $27
-
-#define pv t12
-#define AT $at
-#define gp $29
-#define sp $30
-#define zero $31
-
-#define itmp1 $25
-#define itmp2 $28
-#define itmp3 $29
-
-#define xptr itmp1
-#define xpc itmp2
-
-#define sf0 $f2
-#define sf1 $f3
-#define sf2 $f4
-#define sf3 $f5
-#define sf4 $f6
-#define sf5 $f7
-#define sf6 $f8
-#define sf7 $f9
-
-#define fzero $f31
-
-
-#define PAL_imb 134
.text
.set noat
.set noreorder
-/********************* exported functions and variables ***********************/
+/* 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 has_no_x_instr_set
- .globl synchronize_caches
- .globl asm_calljavafunction
- .globl asm_calljavafunction2
- .globl asm_calljavafunction2double
- .globl asm_calljavafunction2long
- .globl asm_call_jit_compiler
- .globl asm_dumpregistersandcall
.globl asm_handle_exception
.globl asm_handle_nat_exception
- .globl asm_check_clinit
- .globl asm_builtin_checkcast
- .globl asm_builtin_checkarraycast
- .globl asm_builtin_aastore
- .globl asm_builtin_monitorenter
- .globl asm_builtin_monitorexit
- .globl asm_builtin_idiv
- .globl asm_builtin_irem
- .globl asm_builtin_ldiv
- .globl asm_builtin_lrem
- .globl asm_perform_threadswitch
- .globl asm_initialize_thread_stack
- .globl asm_switchstackandcall
- .globl asm_getcallingmethod
- .globl asm_builtin_trace
- .globl asm_builtin_exittrace
-
-/*************************** imported functions *******************************/
-
- .globl jit_compile
- .globl builtin_monitorexit
- .globl builtin_throw_exception
- .globl builtin_trace_exception
- .globl class_java_lang_Object
-
-
-/*********************** function has_no_x_instr_set ***************************
-* *
-* determines if the byte support instruction set (21164a and higher) *
-* is available. *
-* *
-*******************************************************************************/
-
- .ent has_no_x_instr_set
-has_no_x_instr_set:
- .long 0x47e03c20 /* amask 1,v0 */
- jmp zero,(ra) /* return */
+ .globl asm_abstractmethoderror
- .end has_no_x_instr_set
+ .globl asm_compare_and_swap
+ .globl asm_memory_barrier
+ .globl asm_md_init
+ .globl asm_cacheflush
-/********************* function synchronize_caches ****************************/
- .ent synchronize_caches
-synchronize_caches:
-
- call_pal PAL_imb /* synchronise instruction cache */
- jmp zero,(ra) /* return */
-
- .end synchronize_caches
-
-
-#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 -32
-#define ExStartPC -8
-#define ExEndPC -16
-#define ExHandlerPC -24
-#define ExCatchType -32
-
-/********************* function asm_calljavafunction ***************************
+/* asm_vm_call_method **********************************************************
* *
* This function calls a Java-method (which possibly needs compilation) *
* with up to 4 address parameters. *
* *
*******************************************************************************/
- .ent asm_calljavafunction
-
-call_name2:
- .ascii "calljavafunction\0\0"
+ .ent asm_vm_call_method
.align 3
- .quad 0 /* catch type all */
- .quad calljava_xhandler2 /* handler pc */
- .quad calljava_xhandler2 /* end pc */
- .quad asm_calljavafunction /* start pc */
- .long 1 /* extable size */
- .long 0 /* fltsave */
- .long 0 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 32 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
-
-asm_calljavafunction:
+ .long 0 /* fltsave */
+ .long 1 /* intsave */
+ .long 0 /* isleaf */
+ .long 0 /* frame size */
+ .quad 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:
ldgp gp,0(pv)
- lda sp,-32(sp) /* allocate stack space */
- stq gp,24(sp) /* save global pointer */
- stq ra,0(sp) /* save return address */
-
- stq a0,16(sp) /* save method pointer for compiler */
- lda v0,16(sp) /* pass pointer to method pointer via v0*/
-
- mov a1,a0 /* pass the remaining parameters */
- mov a2,a1
- mov a3,a2
- mov a4,a3
-
- lda $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
- stq $28,8(sp) /* store function address */
- mov sp,$28 /* set method pointer */
-
- ldq pv,8($28) /* method call as in Java */
- jmp ra,(pv) /* call JIT compiler */
-calljava_jit2:
- lda pv,-64(ra) /* asm_calljavafunction-calljava_jit !!!!!*/
-
-calljava_return2:
-
- ldq ra,0(sp) /* restore return address */
- ldq gp,24(sp) /* restore global pointer */
- lda sp,32(sp) /* free stack space */
-
-calljava_ret2:
+ lda sp,-5*8(sp) /* allocate stack space */
+ stq ra,0*8(sp) /* save return address */
+ stq gp,1*8(sp) /* save global pointer */
+
+ stq s0,3*8(sp)
+ stq a0,4*8(sp) /* save method PV */
+
+ mov a1,t0 /* address of argument array */
+ mov a2,t1 /* stack argument count */
+ mov sp,s0 /* save stack pointer */
+
+ ldq a0,0*8(t0)
+ ldq a1,1*8(t0)
+ ldq a2,2*8(t0)
+ ldq a3,3*8(t0)
+ ldq a4,4*8(t0)
+ ldq a5,5*8(t0)
+
+ ldt fa0,6*8(t0)
+ ldt fa1,7*8(t0)
+ ldt fa2,8*8(t0)
+ ldt fa3,9*8(t0)
+ ldt fa4,10*8(t0)
+ ldt fa5,11*8(t0)
+
+ beq t1,L_asm_vm_call_method_stack_copy_done
+
+ negq t1,t2 /* calculate stackframe size (* 8) */
+ s8addq t2,sp,sp /* create stackframe */
+ mov sp,t2 /* temporary stack pointer */
+
+L_asm_vm_call_method_stack_copy_loop:
+ ldq t3,12*8(t0) /* load argument */
+ stq t3,0(t2) /* store argument on stack */
+
+ subq t1,1,t1 /* subtract 1 argument */
+ addq t0,8,t0 /* load address of next argument */
+ addq t2,8,t2 /* increase stack pointer */
+
+ bgt t1,L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+ lda mptr,4*8(s0) /* get address of PV */
+ ldq pv,0*8(mptr) /* load PV */
+ jmp ra,(pv)
+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 */
+
+ ldq ra,0*8(sp) /* restore RA */
+ ldq gp,1*8(sp) /* restore global pointer */
+ ldq s0,3*8(sp)
+
+ lda sp,5*8(sp) /* free stack space */
jmp zero,(ra)
-calljava_xhandler2:
-
- ldq gp,24(sp) /* restore global pointer */
+asm_vm_call_method_exception_handler:
+ mov s0,sp /* restore stack pointer */
+ ldq gp,1*8(sp) /* restore global pointer */
mov itmp1,a0
jsr ra,builtin_throw_exception
- ldq ra,0(sp) /* restore return address */
- lda sp,32(sp) /* free stack space */
- jmp zero,(ra)
- .end asm_calljavafunction
+asm_vm_call_method_end:
+ br L_asm_vm_call_method_recompute_return
+ .end asm_vm_call_method
- .ent asm_calljavafunction2
+/* asm_handle_exception ********************************************************
-call_name3:
- .ascii "calljavafunction2\0\0"
+ 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.
- .align 3
- .quad 0 /* catch type all */
- .quad calljava_xhandler3 /* handler pc */
- .quad calljava_xhandler3 /* end pc */
- .quad asm_calljavafunction2 /* start pc */
- .long 1 /* extable size */
- .long 0 /* fltsave */
- .long 1 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 40 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
-
-asm_calljavafunction2:
-asm_calljavafunction2double:
-asm_calljavafunction2long:
-
- ldgp gp,0(pv)
- lda sp,-40(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- stq s6,24(sp)
- stq gp,8(sp) /* save global pointer */
-
- stq a0,32(sp) /* save method pointer for compiler */
- mov a3,t0 /* pointer to arg block */
- mov a1,s6 /* arg count */
-
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a0,offjniitem(t0)
- ldt $f16,offjniitem(t0)
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a1,offjniitem+sizejniblock*1(t0)
- ldt $f17,offjniitem+sizejniblock*1(t0)
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a2,offjniitem+sizejniblock*2(t0)
- ldt $f18,offjniitem+sizejniblock*2(t0)
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a3,offjniitem+sizejniblock*3(t0)
- ldt $f19,offjniitem+sizejniblock*3(t0)
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a4,offjniitem+sizejniblock*4(t0)
- ldt $f20,offjniitem+sizejniblock*4(t0)
- ble s6,calljava_argsloaded
- lda s6,-1(s6)
- ldq a5,offjniitem+sizejniblock*5(t0)
- ldt $f21,offjniitem+sizejniblock*5(t0)
-calljava_argsloaded:
- mov sp,t4
- ble s6,calljava_nocopy
- negq s6,t1
- s8addq t1,sp,sp
- s8addq t1,t4,t2
-
-calljava_copyloop:
- ldq t3,offjniitem+sizejniblock*6(t0)
- stq t3,0(t2)
- lda t1,1(t1)
- lda t0,sizejniblock(t0)
- lda t2,8(t2)
- bne t1,calljava_copyloop
-
-calljava_nocopy:
- lda v0,32(t4) /* pass pointer to method pointer via v0*/
-
- lda $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
- stq $28,16(t4) /* store function address */
- lda $28,8(t4) /* set method pointer */
-
- ldq pv,8($28) /* method call as in Java */
- jmp ra,(pv) /* call JIT compiler */
-calljava_jit3:
- lda pv,-200(ra) /* asm_calljavafunction-calljava_jit !!!*/
-
- s8addq s6,sp,sp
-calljava_return3:
-
- ldq ra,0(sp) /* restore return address */
- ldq gp,8(sp) /* restore global pointer */
- ldq s6,24(sp)
- lda sp,40(sp) /* free stack space */
-
-calljava_ret3:
- jmp zero,(ra)
-
-calljava_xhandler3:
-
- s8addq s6,sp,sp
- ldq gp,8(sp) /* restore global pointer */
- mov itmp1,a0
- jsr ra,builtin_throw_exception
- ldq ra,0(sp) /* restore return address */
- ldq s6,24(sp)
- lda sp,40(sp) /* free stack space */
- jmp zero,(ra)
- .end asm_calljavafunction2
-
+ ATTENTION: itmp3 == gp!
-/****************** function asm_call_jit_compiler *****************************
-* *
-* invokes the compiler for untranslated JavaVM methods. *
-* *
-* Register R0 contains a pointer to the method info structure (prepared *
-* by createcompilerstub). Using the return address in R26 and the *
-* offset in the LDA instruction or using the value in methodptr R28 the *
-* patching address for storing the method address can be computed: *
-* *
-* method address was either loaded using *
-* M_LDQ (REG_PV, REG_PV, a) ; invokestatic/special ($27) *
-* M_LDA (REG_PV, REG_RA, low) *
-* M_LDAH(REG_PV, REG_RA, high) ; optional *
-* or *
-* M_LDQ (REG_PV, REG_METHODPTR, m) ; invokevirtual/interface ($28) *
-* in the static case the method pointer can be computed using the *
-* return address and the lda function following the jmp instruction *
-* *
*******************************************************************************/
+ .ent asm_handle_nat_exception
- .ent asm_call_jit_compiler
-asm_call_jit_compiler:
+asm_handle_nat_exception:
+L_asm_handle_nat_exception: /* required for PIC code */
+L_asm_handle_exception_stack_loop:
+ lda sp,-6*8(sp) /* keep stack 16-byte aligned */
+ stq xptr,0*8(sp) /* save xptr */
+ stq xpc,1*8(sp) /* save xpc */
+ stq ra,3*8(sp) /* save RA */
+ stq zero,4*8(sp) /* save maybe-leaf flag (cleared) */
- ldgp gp,0(pv)
- ldl t8,-8(ra) /* load instruction LDQ PV,xxx($yy) */
- srl t8,16,t8 /* shift right register number $yy */
- and t8,31,t8 /* isolate register number */
- subl t8,28,t8 /* test for REG_METHODPTR */
- beq t8,noregchange
- ldl t8,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t8,48,t8
- sra t8,48,t8 /* isolate offset */
- addq t8,ra,$28 /* compute update address */
- ldl t8,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t8,16,t8 /* isolate instruction code */
- lda t8,-0x177b(t8) /* test for LDAH */
- bne t8,noregchange
- ldl t8,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t8,16,t8 /* compute high offset */
- addl t8,0,t8 /* sign extend high offset */
- addq t8,$28,$28 /* compute update address */
-noregchange:
- lda sp,-14*8(sp) /* reserve stack space */
- stq a0,0*8(sp) /* save all argument registers */
- stq a1,1*8(sp) /* they could be used by method */
- stq a2,2*8(sp)
- stq a3,3*8(sp)
- stq a4,4*8(sp)
- stq a5,5*8(sp)
- stt $f16,6*8(sp)
- stt $f17,7*8(sp)
- stt $f18,8*8(sp)
- stt $f19,9*8(sp)
- stt $f20,10*8(sp)
- stt $f21,11*8(sp)
- stq $28,12*8(sp) /* save method pointer */
- stq ra,13*8(sp) /* save return address */
-
- ldq a0,0(v0) /* pass 'methodinfo' pointer to */
- jsr ra,jit_compile /* jit compiler */
- ldgp gp,0(ra)
-
- call_pal PAL_imb /* synchronise instruction cache */
-
- ldq a0,0*8(sp) /* load argument registers */
- ldq a1,1*8(sp)
- ldq a2,2*8(sp)
- ldq a3,3*8(sp)
- ldq a4,4*8(sp)
- ldq a5,5*8(sp)
- ldt $f16,6*8(sp)
- ldt $f17,7*8(sp)
- ldt $f18,8*8(sp)
- ldt $f19,9*8(sp)
- ldt $f20,10*8(sp)
- ldt $f21,11*8(sp)
- ldq $28,12*8(sp) /* load method pointer */
- ldq ra,13*8(sp) /* load return address */
- lda sp,14*8(sp) /* deallocate stack area */
-
- ldl t8,-8(ra) /* load instruction LDQ PV,xxx($yy) */
- sll t8,48,t8
- sra t8,48,t8 /* isolate offset */
-
- addq t8,$28,t8 /* compute update address via method pointer*/
- stq v0,0(t8) /* save new method address there */
-
- mov v0,pv /* load method address into pv */
-
- jmp zero,(pv) /* and call method. The method returns */
- /* directly to the caller (ra). */
-
- .end asm_call_jit_compiler
-
-
-/****************** function asm_dumpregistersandcall **************************
-* *
-* This funtion saves all callee saved registers and calls the function *
-* which is passed as parameter. *
-* *
-* This function is needed by the garbage collector, which needs to access *
-* all registers which are stored on the stack. Unused registers are *
-* cleared to avoid interferances with the GC. *
-* *
-* void asm_dumpregistersandcall (functionptr f); *
-* *
-*******************************************************************************/
+ mov ra,a0 /* pass RA */
- .ent asm_dumpregistersandcall
-asm_dumpregistersandcall:
- lda sp,-16*8(sp) /* allocate stack */
- stq ra,0(sp) /* save return address */
-
- stq s0,1*8(sp) /* save all callee saved registers */
- stq s1,2*8(sp) /* intialize the remaining registers */
- stq s2,3*8(sp)
- stq s3,4*8(sp)
- stq s4,5*8(sp)
- stq s5,6*8(sp)
- stq s6,7*8(sp)
- stt $f2,8*8(sp)
- stt $f3,9*8(sp)
- stt $f4,10*8(sp)
- stt $f5,11*8(sp)
- stt $f6,12*8(sp)
- stt $f7,13*8(sp)
- stt $f8,14*8(sp)
- stt $f9,15*8(sp)
-
- clr v0 /* intialize the remaining registers */
- clr t0
- clr t1
- clr t2
- clr t3
- clr t4
- clr t5
- clr t6
- clr t7
- clr a1
- clr a2
- clr a3
- clr a4
- clr a5
- clr t8
- clr t9
- clr t10
- clr t11
- clr t12
- clr $28
- clr $29
- cpys $f31,$f31,$f0
- cpys $f31,$f31,$f1
- cpys $f31,$f31,$f10
- cpys $f31,$f31,$f11
- cpys $f31,$f31,$f12
- cpys $f31,$f31,$f13
- cpys $f31,$f31,$f14
- cpys $f31,$f31,$f15
- cpys $f31,$f31,$f16
- cpys $f31,$f31,$f17
- cpys $f31,$f31,$f18
- cpys $f31,$f31,$f19
- cpys $f31,$f31,$f20
- cpys $f31,$f31,$f21
- cpys $f31,$f31,$f22
- cpys $f31,$f31,$f23
- cpys $f31,$f31,$f24
- cpys $f31,$f31,$f25
- cpys $f31,$f31,$f26
- cpys $f31,$f31,$f27
- cpys $f31,$f31,$f28
- cpys $f31,$f31,$f29
- cpys $f31,$f31,$f30
-
- mov a0,pv /* load function pointer */
- jmp ra,(pv) /* and call function */
-
- ldq ra,0(sp) /* load return address */
- lda sp,16*8(sp) /* deallocate stack */
- jmp zero,(ra) /* return */
-
- .end asm_dumpregistersandcall
-
-
-/********************* 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); *
-* *
-*******************************************************************************/
+ br ra,L_asm_handle_exception_load_gp
+L_asm_handle_exception_load_gp:
+ ldgp gp,0(ra) /* load gp */
- .ent asm_handle_nat_exception
-asm_handle_nat_exception:
+ 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 */
+ ldq a1,1*8(sp) /* pass xpc */
+ mov v0,a2 /* pass PV */
+ addq sp,6*8,a3 /* pass Java SP */
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,asm_handle_exception
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
+ br L_asm_handle_exception_continue
.aent asm_handle_exception
+
asm_handle_exception:
+L_asm_handle_exception: /* required for PIC code */
+ lda sp,-(ARG_CNT+TMP_CNT)*8(sp) /* create maybe-leaf stackframe */
- lda sp,-18*8(sp) /* allocate stack */
- stq t0,0*8(sp) /* save possible used registers */
- stq t1,1*8(sp) /* also registers used by trace_exception */
- stq t2,2*8(sp)
- stq t3,3*8(sp)
- stq t4,4*8(sp)
- stq t5,5*8(sp)
- stq t6,6*8(sp)
- stq t7,7*8(sp)
- stq t8,8*8(sp)
- stq t9,9*8(sp)
- stq t10,10*8(sp)
- stq v0,11*8(sp)
- stq a0,12*8(sp)
- stq a1,13*8(sp)
- stq a2,14*8(sp)
- stq a3,15*8(sp)
- stq a4,16*8(sp)
- stq a5,17*8(sp)
-
- lda t3,1(zero) /* set no unwind flag */
-ex_stack_loop:
- lda sp,-5*8(sp) /* allocate stack */
- stq xptr,0*8(sp) /* save used register */
- stq xpc,1*8(sp)
- stq pv,2*8(sp)
- stq ra,3*8(sp)
- stq t3,4*8(sp)
-
- mov xptr,a0
- ldq a1,MethodPointer(pv)
- mov xpc,a2
-/* mov t3,a3 */
- lda a3,1(zero)
- br ra,ex_trace /* set ra for gp loading */
-ex_trace:
- ldgp gp,0(ra) /* load gp */
- jsr ra,builtin_trace_exception /* trace_exception(xptr,methodptr) */
-
- ldq xptr,0*8(sp) /* restore used register */
- ldq xpc,1*8(sp)
- ldq pv,2*8(sp)
- ldq ra,3*8(sp)
- ldq t3,4*8(sp)
- lda sp,5*8(sp) /* deallocate stack */
-
- ldl t0,ExTableSize(pv) /* t0 = exception table size */
- beq t0,empty_table /* if empty table skip */
- lda t1,ExTableStart(pv) /* t1 = start of exception table */
-
-ex_table_loop:
- ldq t2,ExStartPC(t1) /* t2 = exception start pc */
- cmple t2,xpc,t2 /* t2 = (startpc <= xpc) */
- beq t2,ex_table_cont /* if (false) continue */
- ldq t2,ExEndPC(t1) /* t2 = exception end pc */
- cmplt xpc,t2,t2 /* t2 = (xpc < endpc) */
- beq t2,ex_table_cont /* if (false) continue */
- ldq a1,ExCatchType(t1) /* arg1 = exception catch type */
- beq a1,ex_handle_it /* NULL catches everything */
-
- ldq a0,offobjvftbl(xptr) /* a0 = vftblptr(xptr) */
- ldq a1,offclassvftbl(a1) /* a1 = vftblptr(catchtype) class (not obj) */
- ldl a0,offbaseval(a0) /* a0 = baseval(xptr) */
- ldl v0,offbaseval(a1) /* a2 = baseval(catchtype) */
- ldl a1,offdiffval(a1) /* a1 = diffval(catchtype) */
- subl a0,v0,a0 /* a0 = baseval(xptr) - baseval(catchtype) */
- cmpule a0,a1,v0 /* v0 = xptr is instanceof catchtype */
- beq v0,ex_table_cont /* if (false) continue */
-
-ex_handle_it:
-
- ldq xpc,ExHandlerPC(t1) /* xpc = exception handler pc */
-
- beq t3,ex_jump /* if (!(no stack unwinding) skip */
-
- ldq t0,0*8(sp) /* restore possible used registers */
- ldq t1,1*8(sp) /* also registers used by trace_exception */
- ldq t2,2*8(sp)
- ldq t3,3*8(sp)
- ldq t4,4*8(sp)
- ldq t5,5*8(sp)
- ldq t6,6*8(sp)
- ldq t7,7*8(sp)
- ldq t8,8*8(sp)
- ldq t9,9*8(sp)
- ldq t10,10*8(sp)
- ldq v0,11*8(sp)
- ldq a0,12*8(sp)
- ldq a1,13*8(sp)
- ldq a2,14*8(sp)
- ldq a3,15*8(sp)
- ldq a4,16*8(sp)
- ldq a5,17*8(sp)
- lda sp,18*8(sp) /* deallocate stack */
-
-ex_jump:
- jmp zero,(xpc) /* jump to the handler */
-
-ex_table_cont:
- lda t1,ExEntrySize(t1) /* next exception table entry */
- subl t0,1,t0 /* decrement entry counter */
- bgt t0,ex_table_loop /* if (t0 > 0) next entry */
-
-empty_table:
- beq t3,ex_already_cleared /* if here the first time, then */
- lda sp,18*8(sp) /* deallocate stack and */
- clr t3 /* clear the no unwind flag */
-ex_already_cleared:
- ldl t0,IsSync(pv) /* t0 = SyncOffset */
- beq t0,no_monitor_exit /* if zero no monitorexit */
- addq sp,t0,t0 /* add stackptr to Offset */
- ldq a0,-8(t0) /* load monitorexit pointer */
-
- lda sp,-7*8(sp) /* allocate stack */
- stq t0,0*8(sp) /* save used register */
- stq t1,1*8(sp)
- stq t3,2*8(sp)
- stq xptr,3*8(sp)
- stq xpc,4*8(sp)
- stq pv,5*8(sp)
- stq ra,6*8(sp)
-
- br ra,ex_mon_load /* set ra for gp loading */
-ex_mon_load:
- ldgp gp,0(ra) /* load gp */
- jsr ra,builtin_monitorexit/* builtin_monitorexit(objectptr) */
-
- ldq t0,0*8(sp) /* restore used register */
- ldq t1,1*8(sp)
- ldq t3,2*8(sp)
- ldq xptr,3*8(sp)
- ldq xpc,4*8(sp)
- ldq pv,5*8(sp)
- ldq ra,6*8(sp)
- lda sp,7*8(sp) /* deallocate stack */
-
-no_monitor_exit:
- ldl t0,FrameSize(pv) /* t0 = frame size */
- addq sp,t0,sp /* unwind stack */
- mov sp,t0 /* t0 = pointer to save area */
- ldl t1,IsLeaf(pv) /* t1 = is leaf procedure */
- bne t1,ex_no_restore /* if (leaf) skip */
- ldq ra,-8(t0) /* restore ra */
- lda t0,-8(t0) /* t0-- */
-ex_no_restore:
- mov ra,xpc /* the new xpc is ra */
- ldl t1,IntSave(pv) /* t1 = saved int register count */
- br t2,ex_int1 /* t2 = current pc */
-ex_int1:
- lda t2,44(t2) /* lda t2,ex_int2-ex_int1(t2) !!!!!!!!!!!!! */
- negl t1,t1 /* negate register count */
- s4addq t1,t2,t2 /* t2 = ex_int_sav - 4 * register count */
- jmp zero,(t2) /* jump to save position */
- ldq s0,-56(t0)
- ldq s1,-48(t0)
- ldq s2,-40(t0)
- ldq s3,-32(t0)
- ldq s4,-24(t0)
- ldq s5,-16(t0)
- ldq s6,-8(t0)
-ex_int2:
- s8addq t1,t0,t0 /* t0 = t0 - 8 * register count */
+ SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
+ SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
- ldl t1,FltSave(pv) /* t1 = saved flt register count */
- br t2,ex_flt1 /* t2 = current pc */
-ex_flt1:
- lda t2,48(t2) /* lda t2,ex_flt2-ex_flt1(t2) !!!!!!!!!!!!! */
- negl t1,t1 /* negate register count */
- s4addq t1,t2,t2 /* t2 = ex_flt_sav - 4 * register count */
- jmp zero,(t2) /* jump to save position */
- ldt $f2,-64(t0)
- ldt $f3,-56(t0)
- ldt $f4,-48(t0)
- ldt $f5,-40(t0)
- ldt $f6,-32(t0)
- ldt $f7,-24(t0)
- ldt $f8,-16(t0)
- ldt $f9,-8(t0)
-ex_flt2:
- ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,ra,pv /* compute update address */
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,ex_stack_loop
- ldl t0,4(ra) /* load instruction LDAH PV,xxx(RA) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,pv,pv /* compute update address */
- br ex_stack_loop
+ lda sp,-6*8(sp) /* keep stack 16-byte aligned */
+ stq xptr,0*8(sp) /* save xptr */
+ stq pv,2*8(sp) /* save PV */
+ stq ra,3*8(sp) /* save RA */
+ lda t0,1(zero) /* set maybe-leaf flag */
+ stq t0,4*8(sp) /* save maybe-leaf flag */
- .end asm_handle_nat_exception
+ br ra,L_asm_handle_exception_load_gp_2
+L_asm_handle_exception_load_gp_2:
+ ldgp gp,0(ra) /* load gp */
+ mov xptr,a0 /* pass xptr */
+ mov xpc,a1 /* pass xpc */
+ mov pv,a2 /* pass PV */
+ lda a3,(ARG_CNT+TMP_CNT+6)*8(sp)/* pass Java SP */
-/********************* asm_check_clinit ****************************************
-* *
-* Does null check and calls monitorenter or throws an exception *
-* *
-*******************************************************************************/
-
- .ent asm_check_clinit
-asm_check_clinit:
- ldgp gp,0(pv)
+L_asm_handle_exception_continue:
+ jsr ra,exceptions_handle_exception
- ldl itmp2,offclassinit(itmp1)
- bne itmp2,L_is_initialized
-
- subq sp,7*8,sp
- stq ra,0*8(sp)
- stq a0,1*8(sp) /* save argument registers for leaf funcs */
- stq a1,2*8(sp)
- stq a2,3*8(sp)
- stq a3,4*8(sp)
- stq a4,5*8(sp)
- stq a5,6*8(sp)
- mov itmp1,a0
- jsr ra,class_init
- ldgp gp,0(ra)
- ldq ra,0*8(sp)
- ldq a0,1*8(sp) /* restore argument registers */
- ldq a1,2*8(sp)
- ldq a2,3*8(sp)
- ldq a3,4*8(sp)
- ldq a4,5*8(sp)
- ldq a5,6*8(sp)
- addq sp,7*8,sp
-
-L_is_initialized:
- jmp zero,(ra)
-
- .end asm_check_clinit
-
-
-/********************* function asm_builtin_monitorenter ***********************
-* *
-* Does null check and calls monitorenter or throws an exception *
-* *
-*******************************************************************************/
+ beq v0,L_asm_handle_exception_not_catched
- .ent asm_builtin_monitorenter
-asm_builtin_monitorenter:
-
- ldgp gp,0(pv)
- lda pv,builtin_monitorenter
- beq a0,nb_monitorenter /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_monitorenter */
+ mov v0,xpc /* move handlerpc into xpc */
+ ldq xptr,0*8(sp) /* restore xptr */
+ ldq pv,2*8(sp) /* restore PV */
+ ldq ra,3*8(sp) /* restore RA */
+ ldq t0,4*8(sp) /* get maybe-leaf flag */
+ lda sp,6*8(sp) /* free stack frame */
-nb_monitorenter:
- ldq xptr,proto_java_lang_NullPointerException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_monitorenter
+ beq t0,L_asm_handle_exception_no_leaf
+ RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
+ RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
+
+ lda sp,(ARG_CNT+TMP_CNT)*8(sp) /* remove maybe-leaf stackframe */
-/********************* function asm_builtin_monitorexit ************************
-* *
-* Does null check and calls monitorexit or throws an exception *
-* *
-*******************************************************************************/
+L_asm_handle_exception_no_leaf:
+ jmp zero,(xpc) /* jump to the handler */
- .ent asm_builtin_monitorexit
-asm_builtin_monitorexit:
+L_asm_handle_exception_not_catched:
+ ldq xptr,0*8(sp) /* restore xptr */
+ ldq pv,2*8(sp) /* restore PV */
+ ldq ra,3*8(sp) /* restore RA */
+ ldq t0,4*8(sp) /* get maybe-leaf flag */
+ lda sp,6*8(sp)
- ldgp gp,0(pv)
- lda pv,builtin_monitorexit
- beq a0,nb_monitorexit /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_monitorexit */
+ beq t0,L_asm_handle_exception_no_leaf_stack
-nb_monitorexit:
- ldq xptr,proto_java_lang_NullPointerException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_monitorexit
+ lda sp,(ARG_CNT+TMP_CNT)*8(sp) /* remove maybe-leaf stackframe */
+ mov zero,t0 /* clear the maybe-leaf flag */
+L_asm_handle_exception_no_leaf_stack:
+ ldl t1,FrameSize(pv) /* get frame size */
+ addq t1,sp,t1 /* pointer to save area */
-/************************ function asm_builtin_idiv ****************************
-* *
-* Does null check and calls idiv or throws an exception *
-* *
-*******************************************************************************/
+ ldl t2,IsLeaf(pv) /* is leaf procedure */
+ bne t2,L_asm_handle_exception_no_ra_restore
- .ent asm_builtin_idiv
-asm_builtin_idiv:
+ ldq ra,-1*8(t1) /* restore ra */
+ subq t1,8,t1 /* t1-- */
- ldgp gp,0(pv)
- lda pv,builtin_idiv
- beq a1,nb_idiv /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_idiv */
+L_asm_handle_exception_no_ra_restore:
+ mov ra,xpc /* the new xpc is ra */
+ ldl t2,IntSave(pv) /* t2 = saved int register count */
+ br t3,ex_int1 /* t3 = current pc */
+ex_int1:
+ lda t3,(ex_int2 - ex_int1)(t3)
+ negl t2,t2 /* negate register count */
+ s4addq t2,t3,t3 /* t2 = IntSave - register count * 4 */
+ jmp zero,(t3) /* jump to save position */
+
+ ldq s0,-7*8(t1)
+ ldq s1,-6*8(t1)
+ ldq s2,-5*8(t1)
+ ldq s3,-4*8(t1)
+ ldq s4,-3*8(t1)
+ ldq s5,-2*8(t1)
+ ldq s6,-1*8(t1)
-nb_idiv:
- ldq xptr,proto_java_lang_ArithmeticException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_idiv
+ex_int2:
+ s8addq t2,t1,t1 /* t1 = t1 - 8 * register count */
+ ldl t2,FltSave(pv) /* t2 = saved flt register count */
+ br t3,ex_flt1 /* t3 = current pc */
+ex_flt1:
+ lda t3,(ex_flt2 - ex_flt1)(t3)
+ negl t2,t2 /* negate register count */
+ s4addq t2,t3,t3 /* t2 = FltSave - 4 * register count */
+ jmp zero,(t3) /* jump to save position */
+
+ ldt fs0,-8*8(t1)
+ ldt fs1,-7*8(t1)
+ ldt fs2,-6*8(t1)
+ ldt fs3,-5*8(t1)
+ ldt fs4,-4*8(t1)
+ ldt fs5,-3*8(t1)
+ ldt fs6,-2*8(t1)
+ ldt fs7,-1*8(t1)
-/************************ function asm_builtin_ldiv ****************************
-* *
-* Does null check and calls ldiv or throws an exception *
-* *
-*******************************************************************************/
+ex_flt2:
+ ldl t1,FrameSize(pv) /* get frame size */
+ addq sp,t1,sp /* unwind stack */
+ br L_asm_handle_exception_stack_loop
- .ent asm_builtin_ldiv
-asm_builtin_ldiv:
+ .end asm_handle_nat_exception
- ldgp gp,0(pv)
- lda pv,builtin_ldiv
- beq a1,nb_ldiv /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_ldiv */
-nb_ldiv:
- ldq xptr,proto_java_lang_ArithmeticException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_ldiv
+/* asm_abstractmethoderror *****************************************************
+ Creates and throws an AbstractMethodError.
-/************************ function asm_builtin_irem ****************************
-* *
-* Does null check and calls irem or throws an exception *
-* *
*******************************************************************************/
- .ent asm_builtin_irem
-asm_builtin_irem:
+ .ent asm_abstractmethoderror
- ldgp gp,0(pv)
- lda pv,builtin_irem
- beq a1,nb_irem /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_irem */
+asm_abstractmethoderror:
+ subq sp,2*8,sp /* create stackframe */
+ stq ra,0*8(sp) /* save return address */
+ addq sp,2*8,a0 /* pass java sp */
+ mov ra,a1 /* pass exception address */
+ jsr ra,exceptions_asm_new_abstractmethoderror
+ ldq ra,0*8(sp) /* restore return address */
+ addq sp,2*8,sp /* remove stackframe */
-nb_irem:
- ldq xptr,proto_java_lang_ArithmeticException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_irem
+ mov v0,xptr /* get exception pointer */
+ subq ra,4,xpc /* exception address is ra - 4 */
+ br L_asm_handle_nat_exception
+ .end asm_abstractmethoderror
-/************************ function asm_builtin_lrem ****************************
-* *
-* Does null check and calls lrem or throws an exception *
-* *
-*******************************************************************************/
- .ent asm_builtin_lrem
-asm_builtin_lrem:
+/* asm_compare_and_swap ********************************************************
- ldgp gp,0(pv)
- lda pv,builtin_lrem
- beq a1,nb_lrem /* if (null) throw exception */
- jmp zero,(pv) /* else call builtin_lrem */
+ Does an atomic compare and swap. Required for the lock
+ implementation.
-nb_lrem:
- ldq xptr,proto_java_lang_ArithmeticException
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_lrem
+ Atomically do the following: Check if the location still contains
+ `oldval`. If so, replace it by `newval` and return `oldval`.
+ RETURN VALUE:
+ the old value at *p
-/*********************** function new_builtin_checkcast ************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
+ long compare_and_swap(volatile long *p, long oldval, long newval);
- .ent asm_builtin_checkcast
-asm_builtin_checkcast:
-
- ldgp gp,0(pv)
- lda sp,-16(sp) # allocate stack space
- stq ra,0(sp) # save return address
- stq a0,8(sp) # save object pointer
- jsr ra,builtin_checkcast # builtin_checkcast
- ldgp gp,0(ra)
- beq v0,nb_ccast_throw # if (false) throw exception
- ldq ra,0(sp) # restore return address
- ldq v0,8(sp) # return object pointer
- lda sp,16(sp) # free stack space
- jmp zero,(ra)
-
-nb_ccast_throw:
- ldq xptr,proto_java_lang_ClassCastException
- ldq ra,0(sp) # restore return address
- lda sp,16(sp) # free stack space
- lda xpc,-4(ra) # faulting address is return adress - 4
- br asm_handle_nat_exception
- .end asm_builtin_checkcast
-
-
-/******************* function asm_builtin_checkarraycast ***********************
-* *
-* Does the cast check and eventually throws an exception *
-* *
*******************************************************************************/
- .ent asm_builtin_checkarraycast
-asm_builtin_checkarraycast:
-
- ldgp gp,0(pv)
- lda sp,-16(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- stq a0,8(sp) /* save object pointer */
- jsr ra,builtin_checkarraycast /* builtin_checkarraycast */
- ldgp gp,0(ra)
- beq v0,nb_carray_throw /* if (false) throw exception */
- ldq ra,0(sp) /* restore return address */
- ldq v0,8(sp) /* return object pointer */
- lda sp,16(sp) /* free stack space */
+ .ent asm_compare_and_swap
+
+asm_compare_and_swap:
+1:
+ ldq_l v0,0(a0)
+ cmpeq v0,a1,t0
+ beq t0,2f
+ mov a2,t0
+ stq_c t0,0(a0)
+ beq t0,1b
+2:
jmp zero,(ra)
-nb_carray_throw:
- ldq xptr,proto_java_lang_ClassCastException
- ldq ra,0(sp) /* restore return address */
- lda sp,16(sp) /* free stack space */
- lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_checkarraycast
+ .end asm_compare_and_swap
-/******************* function asm_builtin_aastore ******************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
+/* asm_memory_barrier **********************************************************
+
+ A memory barrier for the Java Memory Model.
+
*******************************************************************************/
- .ent asm_builtin_aastore
-asm_builtin_aastore:
+ .ent asm_memory_barrier
- ldgp gp,0(pv)
- beq a0,nb_aastore_null /* if null pointer throw exception */
- ldl t0,offarraysize(a0) /* load size */
- lda sp,-24(sp) /* allocate stack space */
- stq ra,0(sp) /* save return address */
- s8addq a1,a0,t1 /* add index*8 to arrayref */
- cmpult a1,t0,t0 /* do bound check */
- beq t0,nb_aastore_bound /* if out of bounds throw exception */
- mov a2,a1 /* object is second argument */
- stq t1,8(sp) /* save store position */
- stq a1,16(sp) /* save object */
- jsr ra,builtin_canstore /* builtin_canstore(arrayref,object) */
- ldgp gp,0(ra)
- ldq ra,0(sp) /* restore return address */
- ldq a0,8(sp) /* restore store position */
- ldq a1,16(sp) /* restore object */
- lda sp,24(sp) /* free stack space */
- beq v0,nb_aastore_throw /* if (false) throw exception */
- stq a1,offobjarrdata(a0) /* store objectptr in array */
+asm_memory_barrier:
+ mb
jmp zero,(ra)
-nb_aastore_null:
- ldq xptr,proto_java_lang_NullPointerException
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
+ .end asm_memory_barrier
-nb_aastore_bound:
- ldq xptr,proto_java_lang_ArrayIndexOutOfBoundsException
- lda sp,24(sp) /* free stack space */
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
-nb_aastore_throw:
- ldq xptr,proto_java_lang_ArrayStoreException
- mov ra,xpc /* faulting address is return adress */
- br asm_handle_nat_exception
+/* asm_md_init *****************************************************************
- .end asm_builtin_aastore
+ Initialize machine dependent stuff.
+ Determines if the byte support instruction set (21164a and higher)
+ is available.
-/******************* function asm_initialize_thread_stack **********************
-* *
-* initialized a thread stack *
-* *
*******************************************************************************/
- .ent asm_initialize_thread_stack
-asm_initialize_thread_stack:
-
- lda a1,-128(a1)
- stq zero, 0(a1)
- stq zero, 8(a1)
- stq zero, 16(a1)
- stq zero, 24(a1)
- stq zero, 32(a1)
- stq zero, 40(a1)
- stq zero, 48(a1)
- stt fzero, 56(a1)
- stt fzero, 64(a1)
- stt fzero, 72(a1)
- stt fzero, 80(a1)
- stt fzero, 88(a1)
- stt fzero, 96(a1)
- stt fzero, 104(a1)
- stt fzero, 112(a1)
- stq a0, 120(a1)
- mov a1, v0
- jmp zero,(ra)
- .end asm_initialize_thread_stack
+ .ent asm_md_init
+asm_md_init:
+ .long 0x47e03c20 /* amask 1,v0 */
+ jmp zero,(ra) /* return */
-/******************* function asm_perform_threadswitch *************************
-* *
-* void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop); *
-* *
-* performs a threadswitch *
-* *
-*******************************************************************************/
+ .end asm_md_init
- .ent asm_perform_threadswitch
-asm_perform_threadswitch:
-
- subq sp,128,sp
- stq s0, 0(sp)
- stq s1, 8(sp)
- stq s2, 16(sp)
- stq s3, 24(sp)
- stq s4, 32(sp)
- stq s5, 40(sp)
- stq s6, 48(sp)
- stt sf0, 56(sp)
- stt sf1, 64(sp)
- stt sf2, 72(sp)
- stt sf3, 80(sp)
- stt sf4, 88(sp)
- stt sf5, 96(sp)
- stt sf6, 104(sp)
- stt sf7, 112(sp)
- stq ra, 120(sp)
- stq sp, 0(a0)
- stq sp, 0(a2)
- ldq sp, 0(a1)
- ldq s0, 0(sp)
- ldq s1, 8(sp)
- ldq s2, 16(sp)
- ldq s3, 24(sp)
- ldq s4, 32(sp)
- ldq s5, 40(sp)
- ldq s6, 48(sp)
- ldt sf0, 56(sp)
- ldt sf1, 64(sp)
- ldt sf2, 72(sp)
- ldt sf3, 80(sp)
- ldt sf4, 88(sp)
- ldt sf5, 96(sp)
- ldt sf6, 104(sp)
- ldt sf7, 112(sp)
- ldq ra, 120(sp)
- mov ra, pv
- addq sp, 128, sp
- jmp zero,(ra)
- .end asm_perform_threadswitch
-
-
-/********************* function asm_switchstackandcall *************************
-* *
-* void *asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
-* void *p); *
-* *
-* Switches to a new stack, calls a function and switches back. *
-* a0 new stack pointer *
-* a1 function pointer *
-* a2 pointer to variable where stack top should be stored *
-* a3 pointer to user data, is passed to the function *
-* *
-*******************************************************************************/
+/* asm_cacheflush **************************************************************
- .ent asm_switchstackandcall
-asm_switchstackandcall:
- lda a0,-2*8(a0) /* allocate new stack */
- stq ra,0(a0) /* save return address on new stack */
- stq sp,1*8(a0) /* save old stack pointer on new stack */
- stq sp,0(a2) /* save old stack pointer to variable */
- mov a0,sp /* switch to new stack */
-
- mov a1,pv /* load function pointer */
- mov a3,a0 /* pass pointer */
- jmp ra,(pv) /* and call function */
+ XXX
- ldq ra,0(sp) /* load return address */
- ldq sp,1*8(sp) /* switch to old stack */
+*******************************************************************************/
- jmp zero,(ra) /* return */
+ .ent asm_cacheflush
- .end asm_switchstackandcall
+asm_cacheflush:
+ call_pal PAL_imb /* synchronize instruction cache */
+ jmp zero,(ra)
+
+ .end asm_cacheflush
-
-/********************* function asm_getcallingmethod ***************************
-* *
-* classinfo *asm_getcallingmethodclass (); *
-* *
-* goes back stack frames to get the calling method *
-* *
-* t2 .. sp *
-* t3 .. ra *
-* t4 .. pv *
-* *
-*******************************************************************************/
+/* disable exec-stacks ********************************************************/
- .ent asm_getcallingmethod
-asm_getcallingmethod:
-
- ldq t3,16(sp) /* load return address of native function */
- addq sp,24,t2 /* skip frames of C-Function and nativestub */
-
- /* determine pv (t3) of java-function from ra */
-
- ldl t0,0(t3) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,t3,t4 /* compute update address */
- ldl t0,4(t3) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,pv_ok1
- ldl t0,0(t3) /* load instruction LDA PV,xxx(RA) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,t4,t4 /* compute update address */
-
-pv_ok1:
- ldl t0,FrameSize(t4) /* t0 = frame size */
- addq t2,t0,t2 /* skip frame of java function */
- ldq t3,-8(t2) /* load new ra */
-
- /* determine pv (t3) of java-function from ra */
-
- ldl t0,0(t3) /* load instruction LDA PV,xxx(RA) */
- sll t0,48,t0
- sra t0,48,t0 /* isolate offset */
- addq t0,t3,t4 /* compute update address */
- ldl t0,4(t3) /* load instruction LDAH PV,xxx(PV) */
- srl t0,16,t0 /* isolate instruction code */
- lda t0,-0x177b(t0) /* test for LDAH */
- bne t0,pv_ok2
- ldl t0,0(t3) /* load instruction LDA PV,xxx(RA) */
- sll t0,16,t0 /* compute high offset */
- addl t0,0,t0 /* sign extend high offset */
- addq t0,t4,t4 /* compute update address */
-
-pv_ok2:
- ldq v0,MethodPointer(t4) /* */
-
-
- jmp zero,(ra) /* return */
-
- .end asm_getcallingmethod
+#if defined(__linux__) && defined(__ELF__)
+ .section .note.GNU-stack,"",%progbits
+#endif
/*
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/