-/* jit/mips/asmpart.S - Java-C interface functions for mips
+/* vm/jit/mips/asmpart.S - Java-C interface functions for mips
- 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 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.
Authors: Andreas Krall
- $Id: asmpart.S 860 2004-01-06 18:49:09Z twisti $
+ $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
*/
-#include "offsets.h"
+#include "config.h"
+#include "vm/jit/mips/offsets.h"
+#include "vm/jit/mips/asmoffsets.h"
+
#define zero $0
#define itmp1 $1
#define s6 $22
#define s7 $23
-#define t4 $24
+#define t8 $24
#define itmp3 $25
#define k0 $26
#define k1 $27
#define asll dsll
#define ashift 3
-#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
-
.text
.set noat
/********************* exported functions and variables ***********************/
- .globl synchronize_caches
.globl asm_calljavafunction
.globl asm_calljavafunction2
.globl asm_calljavafunction2long
.globl asm_perform_threadswitch
.globl asm_initialize_thread_stack
.globl asm_switchstackandcall
- .globl asm_getcallingmethod
.globl asm_builtin_trace
.globl asm_builtin_exittrace
+ .globl asm_getclassvalues_atomic
+ .globl asm_criticalsections
+
+ .globl compare_and_swap
/*************************** imported functions *******************************/
.globl jit_compile
+ .globl _exceptionptr
.globl builtin_monitorexit
.globl builtin_throw_exception
.globl builtin_trace_exception
.globl class_java_lang_Object
-/********************* function synchronize_caches ****************************/
-
- .ent synchronize_caches
-synchronize_caches:
-
-/* li a0,BCACHE */ /* flush both caches */
-/* li v0,SYS_cacheflush */ /* Syscall number for cacheflush() */
-/* syscall */ /* call cacheflush() */
- j ra /* return */
-
- .end synchronize_caches
-
-
-/********************* function asm_calljavafunction ****************************
+/********************* function asm_calljavafunction ***************************
* *
* This function calls a Java-method (which possibly needs compilation) *
* with up to 4 address parameters. *
.ent asm_calljavafunction
call_name:
- .ascii "calljavafunction\0\0"
-
.align 3
- .quad 0 /* catch type all */
- .quad calljava_xhandler /* handler pc */
- .quad calljava_xhandler /* end pc */
- .quad asm_calljavafunction /* start pc */
- .long 1 /* extable size */
- .long 0 /* fltsave */
- .long 0 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 80 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
+
+ .dword 0 /* catch type all */
+ .dword calljava_xhandler /* handler pc */
+ .dword calljava_xhandler /* end pc */
+ .dword asm_calljavafunction /* start pc */
+ .word 1 /* extable size */
+ .word 0 /* fltsave */
+ .word 0 /* intsave */
+ .word 0 /* isleaf */
+ .word 0 /* IsSync */
+ .word 10*8 /* frame size */
+ .dword 0 /* method pointer (pointer to name) */
asm_calljavafunction:
aaddiu sp,sp,-10*8 /* allocate stack space */
.ent asm_calljavafunction2
call_name2:
- .ascii "calljavafunction2\0\0"
-
.align 3
- .quad 0 /* catch type all */
- .quad calljava_xhandler2 /* handler pc */
- .quad calljava_xhandler2 /* end pc */
- .quad asm_calljavafunction2 /* start pc */
- .long 1 /* extable size */
- .long 0 /* fltsave */
- .long 1 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 96 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
+
+ .dword 0 /* catch type all */
+ .dword calljava_xhandler2 /* handler pc */
+ .dword calljava_xhandler2 /* end pc */
+ .dword asm_calljavafunction2 /* start pc */
+ .word 1 /* extable size */
+ .word 0 /* fltsave */
+ .word 1 /* intsave */
+ .word 0 /* isleaf */
+ .word 0 /* IsSync */
+ .word 12*8 /* frame size */
+ .dword 0 /* method pointer (pointer to name) */
asm_calljavafunction2:
asm_calljavafunction2double:
daddi s7,s7,-1
calljava_argsloaded:
- move t4,sp
+ move t8,sp
blez s7,calljava_nocopy
subu t1,zero,s7
sll t2,t1,3
daddu sp,sp,t2
- daddu t2,t2,t4
+ daddu t2,t2,t8
calljava_copyloop:
ald t3,offjniitem+sizejniblock*8(t0)
bnez t1,calljava_copyloop
calljava_nocopy:
- ala itmp1,32(t4) /* pass pointer to methodptr via itmp1 */
+ ala itmp1,32(t8) /* pass pointer to methodptr via itmp1 */
ala mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
ast mptr,16(sp) /* store function address */
- ala mptr,8(t4) /* set method pointer */
+ ala mptr,8(t8) /* set method pointer */
.set noreorder
.ent asm_call_jit_compiler
-asm_call_jit_compiler:
+asm_call_jit_compiler:
lw t0,-12(ra) /* load instruction LD PV,xxx($y) */
srl t0,t0,21 /* shift right register number $y */
and t0,t0,31 /* isolate register number */
aaddu mptr,t0,ra /* compute update address */
noregchange:
-
aaddiu sp,sp,-18*8 /* allocate stack space */
sd a0,0*8(sp) /* save all argument registers */
sd a1,1*8(sp) /* they could be used by method */
.end asm_call_jit_compiler
-/****************** function asm_dumpregistersandcall **************************
-* *
-* This funtion saves all callee saved (address) 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); *
-* *
-*******************************************************************************/
-
- .ent asm_dumpregistersandcall
-asm_dumpregistersandcall:
- aaddiu sp,sp,-10*8 /* allocate stack */
- sd ra,0(sp) /* save return address */
-
- sd s0,1*8(sp) /* save all callee saved registers */
- sd s1,2*8(sp)
- sd s2,3*8(sp)
- sd s3,4*8(sp)
- sd s4,5*8(sp)
- sd s5,6*8(sp)
- sd s6,7*8(sp)
- sd s7,8*8(sp)
- sd s8,9*8(sp)
-
- move itmp3,a0
- jalr itmp3 /* and call function */
-
- ld ra,0(sp) /* restore return address */
- aaddiu sp,sp,10*8 /* deallocate stack */
- j ra /* return */
-
- .end asm_dumpregistersandcall
-
-
/********************* function asm_handle_exception ***************************
* *
* This function handles an exception. It does not use the usual calling *
*******************************************************************************/
.ent asm_handle_nat_exception
-asm_handle_nat_exception:
+asm_handle_nat_exception:
lw t0,0(ra) /* load instruction LDA PV,xxx(RA) */
sll t0,t0,16
sra t0,t0,16 /* isolate offset */
aaddu pv,t0,ra /* compute update address */
.aent asm_handle_exception
-asm_handle_exception:
+asm_handle_exception:
aaddiu sp,sp,-14*8 /* allocate stack */
sd v0,0*8(sp) /* save possible used registers */
sd t0,1*8(sp) /* also registers used by trace_exception */
sd t1,2*8(sp)
sd t2,3*8(sp)
sd t3,4*8(sp)
- sd t4,5*8(sp)
+ sd t8,5*8(sp)
sd a0,6*8(sp)
sd a1,7*8(sp)
sd a2,8*8(sp)
ald a1,MethodPointer(pv)
move a2,xpc
/* move a3,t3 */
- addu a3,zero,1
+ move a3,zero
+ addu a4,zero,1
jal builtin_trace_exception /* trace_exception(xptr,methodptr) */
ld xptr,0*8(sp) /* restore used register */
ex_table_loop:
ald t2,ExStartPC(t1) /* t2 = exception start pc */
- slt t2,xpc,t2 /* t2 = (xpc < startpc) */
- bnez t2,ex_table_cont /* if (true) continue */
+ sle t2,t2,xpc /* t2 = (startpc <= xpc) */
+ beqz t2,ex_table_cont /* if (false) continue */
ald t2,ExEndPC(t1) /* t2 = exception end pc */
slt t2,xpc,t2 /* t2 = (xpc < endpc) */
beqz t2,ex_table_cont /* if (false) continue */
ald a1,ExCatchType(t1) /* arg1 = exception catch type */
beqz a1,ex_handle_it /* NULL catches everything */
+ lw itmp3,offclassloaded(a1)
+ bnez itmp3,L_class_loaded
+
+ aaddiu sp,sp,-8*8 /* allocate stack */
+ sd t0,0*8(sp) /* save used register */
+ sd t1,1*8(sp)
+ sd t3,2*8(sp)
+ sd xptr,3*8(sp)
+ sd xpc,4*8(sp)
+ sd pv,5*8(sp)
+ sd ra,6*8(sp)
+ sd a1,7*8(sp)
+
+ move a0,a1
+ jal class_load
+
+ ld t0,0*8(sp) /* restore used register */
+ ld t1,1*8(sp)
+ ld t3,2*8(sp)
+ ld xptr,3*8(sp)
+ ld xpc,4*8(sp)
+ ld pv,5*8(sp)
+ ld ra,6*8(sp)
+ ld a1,7*8(sp)
+ aaddiu sp,sp,8*8 /* deallocate stack */
+
+L_class_loaded:
+ lw itmp3,offclasslinked(a1)
+ aaddiu sp,sp,-8*8 /* allocate stack */
+ sd a1,7*8(sp)
+ bnez itmp3,L_class_linked
+
+ sd t0,0*8(sp) /* save used register */
+ sd t1,1*8(sp)
+ sd t3,2*8(sp)
+ sd xptr,3*8(sp)
+ sd xpc,4*8(sp)
+ sd pv,5*8(sp)
+ sd ra,6*8(sp)
+
+ move a0,a1
+ jal class_link
+
+ ld t0,0*8(sp) /* restore used register */
+ ld t1,1*8(sp)
+ ld t3,2*8(sp)
+ ld xptr,3*8(sp)
+ ld xpc,4*8(sp)
+ ld pv,5*8(sp)
+ ld ra,6*8(sp)
+
+L_class_linked:
+_crit_restart1:
+ ld a1,7*8(sp)
+_crit_begin1:
ald a0,offobjvftbl(xptr) /* a0 = vftblptr(xptr) */
ald a1,offclassvftbl(a1) /* a1 = vftblptr(catchtype) class (not obj) */
lw a0,offbaseval(a0) /* a0 = baseval(xptr) */
lw v0,offbaseval(a1) /* a2 = baseval(catchtype) */
lw a1,offdiffval(a1) /* a1 = diffval(catchtype) */
+_crit_end1:
subu a0,a0,v0 /* a0 = baseval(xptr) - baseval(catchtype) */
sltu v0,a1,a0 /* v0 = xptr is instanceof catchtype */
+ aaddiu sp,sp,8*8 /* deallocate stack */
bnez v0,ex_table_cont /* if (false) continue */
ex_handle_it:
-
ald xpc,ExHandlerPC(t1) /* xpc = exception handler pc */
beqz t3,ex_jump /* if (!(no stack unwinding) skip */
ld t1,2*8(sp)
ld t2,3*8(sp)
ld t3,4*8(sp)
- ld t4,5*8(sp)
+ ld t8,5*8(sp)
ld a0,6*8(sp)
ld a1,7*8(sp)
ld a2,8*8(sp)
*******************************************************************************/
.ent asm_check_clinit
+
asm_check_clinit:
- lw itmp2,offclassinit(itmp1)
- bnez itmp2,L_is_initialized
-
- aaddiu sp,sp,-18*8
- sd ra,0*8(sp)
+ daddiu sp,sp,-24*8
+
+ sd ra,0*8(sp) /* save return address */
+
sd a0,1*8(sp) /* save argument registers for leaf funcs */
sd a1,2*8(sp)
sd a2,3*8(sp)
sd a5,6*8(sp)
sd a6,7*8(sp)
sd a7,8*8(sp)
- sdc1 fa0,9*8(sp)
- sdc1 fa1,10*8(sp)
- sdc1 fa2,11*8(sp)
- sdc1 fa3,12*8(sp)
- sdc1 fa4,13*8(sp)
- sdc1 fa5,14*8(sp)
- sdc1 fa6,15*8(sp)
- sdc1 fa7,16*8(sp)
-
- move a0,itmp1
+
+ sd t0,9*8(sp)
+ sd t1,10*8(sp)
+ sd t2,11*8(sp)
+ sd t3,12*8(sp)
+ sd t8,13*8(sp)
+
+ sdc1 fa0,14*8(sp)
+ sdc1 fa1,15*8(sp)
+ sdc1 fa2,16*8(sp)
+ sdc1 fa3,17*8(sp)
+ sdc1 fa4,18*8(sp)
+ sdc1 fa5,19*8(sp)
+ sdc1 fa6,20*8(sp)
+ sdc1 fa7,21*8(sp)
+
+ sd itmp2,22*8(sp) /* save machine code */
+
+ /* check if class is initialized */
+ lw itmp3,offclassinit(itmp1)
+ bnez itmp3,L_is_initialized
+
+ move a0,itmp1 /* move class pointer to a0 */
jal class_init
- ld ra,0*8(sp)
+ beqz v0,L_initializererror
+
+L_is_initialized:
+ ld ra,0*8(sp) /* get return address */
+ ld itmp1,22*8(sp) /* get machine code */
+
+ daddiu ra,ra,-2*4 /* go back 2 instructions (jal + nop delay) */
+ sw itmp1,0(ra) /* patch first instruction */
+ dsrl32 itmp1,itmp1,0 /* get high 32 bit */
+ sw itmp1,4(ra) /* patch second instruction */
+
+ move a0,ra /* start of flush area */
+ addiu a1,zero,2*4 /* 2 instruction words long */
+ jal docacheflush /* flush! */
+
+ ld ra,0*8(sp) /* restore return address */
+
ld a0,1*8(sp) /* restore argument registers */
ld a1,2*8(sp)
ld a2,3*8(sp)
ld a5,6*8(sp)
ld a6,7*8(sp)
ld a7,8*8(sp)
- ldc1 fa0,9*8(sp)
- ldc1 fa1,10*8(sp)
- ldc1 fa2,11*8(sp)
- ldc1 fa3,12*8(sp)
- ldc1 fa4,13*8(sp)
- ldc1 fa5,14*8(sp)
- ldc1 fa6,15*8(sp)
- ldc1 fa7,16*8(sp)
- aaddiu sp,sp,18*8
-
-L_is_initialized:
- j ra
-
+
+ ld t0,9*8(sp)
+ ld t1,10*8(sp)
+ ld t2,11*8(sp)
+ ld t3,12*8(sp)
+ ld t8,13*8(sp)
+
+ ldc1 fa0,14*8(sp)
+ ldc1 fa1,15*8(sp)
+ ldc1 fa2,16*8(sp)
+ ldc1 fa3,17*8(sp)
+ ldc1 fa4,18*8(sp)
+ ldc1 fa5,19*8(sp)
+ ldc1 fa6,20*8(sp)
+ ldc1 fa7,21*8(sp)
+
+ daddiu sp,sp,24*8
+
+ daddiu ra,ra,-2*4 /* go back 2 instructions (jal + nop delay) */
+ jr ra
+
+L_initializererror:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ jal builtin_asm_get_exceptionptrptr
+#else
+ la v0,_exceptionptr
+#endif
+ ld xptr,0(v0) /* get the exception pointer */
+ sd zero,0(v0) /* clear the exception pointer */
+
+ ld ra,0*8(sp) /* restore return address */
+
+ ld a0,1*8(sp) /* restore argument registers */
+ ld a1,2*8(sp)
+ ld a2,3*8(sp)
+ ld a3,4*8(sp)
+ ld a4,5*8(sp)
+ ld a5,6*8(sp)
+ ld a6,7*8(sp)
+ ld a7,8*8(sp)
+
+ ld t0,9*8(sp)
+ ld t1,10*8(sp)
+ ld t2,11*8(sp)
+ ld t3,12*8(sp)
+ ld t8,13*8(sp)
+
+ ldc1 fa0,14*8(sp)
+ ldc1 fa1,15*8(sp)
+ ldc1 fa2,16*8(sp)
+ ldc1 fa3,17*8(sp)
+ ldc1 fa4,18*8(sp)
+ ldc1 fa5,19*8(sp)
+ ldc1 fa6,20*8(sp)
+ ldc1 fa7,21*8(sp)
+
+ daddiu sp,sp,24*8
+
+ aaddiu xpc,ra,-4 /* faulting address is return adress - 4 */
+ b asm_handle_exception
+
.end asm_check_clinit
*******************************************************************************/
.ent asm_builtin_monitorenter
-asm_builtin_monitorenter:
+asm_builtin_monitorenter:
beqz a0,nb_monitorenter /* if (null) throw exception */
ala t9,builtin_monitorenter /* else call builtin_monitorenter */
j t9
nb_monitorenter:
- ald xptr,proto_java_lang_NullPointerException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ ald a0,string_java_lang_NullPointerException
+ jal new_exception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_monitorenter
*******************************************************************************/
.ent asm_builtin_monitorexit
-asm_builtin_monitorexit:
+asm_builtin_monitorexit:
beqz a0,nb_monitorexit /* if (null) throw exception */
ala t9,builtin_monitorexit /* else call builtin_monitorexit */
j t9
nb_monitorexit:
- ald xptr,proto_java_lang_NullPointerException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_nullpointerexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_monitorexit
*******************************************************************************/
.ent asm_builtin_idiv
-asm_builtin_idiv:
+asm_builtin_idiv:
beqz a1,nb_idiv /* if (null) throw exception */
ala itmp3,builtin_idiv /* else call builtin_idiv */
j itmp3
nb_idiv:
- ald xptr,proto_java_lang_ArithmeticException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_arithmeticexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_idiv
*******************************************************************************/
.ent asm_builtin_ldiv
-asm_builtin_ldiv:
+asm_builtin_ldiv:
beqz a1,nb_ldiv /* if (null) throw exception */
ala itmp3,builtin_ldiv /* else call builtin_ldiv */
j itmp3
nb_ldiv:
- ald xptr,proto_java_lang_ArithmeticException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_arithmeticexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_ldiv
*******************************************************************************/
.ent asm_builtin_irem
-asm_builtin_irem:
+asm_builtin_irem:
beqz a1,nb_irem /* if (null) throw exception */
ala t9,builtin_irem /* else call builtin_irem */
j t9
nb_irem:
- ald xptr,proto_java_lang_ArithmeticException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_arithmeticexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_irem
*******************************************************************************/
.ent asm_builtin_lrem
-asm_builtin_lrem:
+asm_builtin_lrem:
beqz a1,nb_lrem /* if (null) throw exception */
ala t9,builtin_lrem /* else call builtin_lrem */
j t9
nb_lrem:
- ald xptr,proto_java_lang_ArithmeticException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_arithmeticexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_lrem
*******************************************************************************/
.ent asm_builtin_checkarraycast
-asm_builtin_checkarraycast:
+asm_builtin_checkarraycast:
aaddiu sp,sp,-16 /* allocate stack space */
sd ra,0(sp) /* save return address */
sd a0,8(sp) /* save object pointer */
j ra /* return */
nb_carray_throw:
- ald xptr,proto_java_lang_ClassCastException
+ jal new_classcastexception
+ move xptr,v0
+
ld ra,0(sp) /* restore return address */
aaddiu sp,sp,16 /* free stack space */
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_checkarraycast
*******************************************************************************/
.ent asm_builtin_checkcast
-asm_builtin_checkcast:
+asm_builtin_checkcast:
aaddiu sp,sp,-16 /* allocate stack space */
sd ra,0(sp) /* save return address */
sd a0,8(sp) /* save object pointer */
j ra /* return */
nb_ccast_throw:
- ald xptr,proto_java_lang_ClassCastException
+ jal new_classcastexception
+ move xptr,v0
+
ld ra,0(sp) /* restore return address */
aaddiu sp,sp,16 /* free stack space */
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
+
.end asm_builtin_checkcast
*******************************************************************************/
.ent asm_builtin_aastore
-asm_builtin_aastore:
+asm_builtin_aastore:
beqz a0,nb_aastore_null /* if null pointer throw exception */
lw t0,offarraysize(a0) /* load size */
aaddiu sp,sp,-32 /* allocate stack space */
ld a0,8(sp) /* restore store position */
ld a1,16(sp) /* restore object */
aaddiu sp,sp,32 /* free stack space */
- beqz v0,nb_aastore_throw /* if (false) throw exception */
+ beqz v0,nb_aastore_store /* if (false) throw exception */
ast a1,offobjarrdata(a0) /* store objectptr in array */
j ra /* return */
nb_aastore_null:
- ald xptr,proto_java_lang_NullPointerException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_nullpointerexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
move xpc,ra /* faulting address is return adress */
b asm_handle_nat_exception
nb_aastore_bound:
- ald xptr,proto_java_lang_ArrayIndexOutOfBoundsException
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ move a0,a1 /* move index into a0 */
+ jal new_arrayindexoutofboundsexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
aaddiu sp,sp,32 /* free stack space */
move xpc,ra /* faulting address is return adress */
b asm_handle_nat_exception
-nb_aastore_throw:
- ald xptr,proto_java_lang_ArrayStoreException
+nb_aastore_store:
+ daddiu sp,sp,-2*8
+ sd ra,0*8(sp)
+ jal new_arraystoreexception
+ move xptr,v0
+ ld ra,0*8(sp)
+ daddiu sp,sp,2*8
+
move xpc,ra /* faulting address is return adress */
b asm_handle_nat_exception
*******************************************************************************/
.ent asm_initialize_thread_stack
-asm_initialize_thread_stack:
+asm_initialize_thread_stack:
aaddiu a1,a1,-14*8 /* allocate save area */
sd zero, 0*8(a1) /* s0 initalize thread area */
sd zero, 1*8(a1) /* s1 */
sd a0, 13*8(a1)
move v0,a1
j ra /* return */
+
.end asm_initialize_thread_stack
*******************************************************************************/
.ent asm_perform_threadswitch
-asm_perform_threadswitch:
+asm_perform_threadswitch:
aaddiu sp,sp,-14*8 /* allocate new stack */
sd s0, 0*8(sp) /* save saved registers of old thread */
sd s1, 1*8(sp)
aaddiu sp,sp,14*8 /* deallocate new stack */
move itmp3, ra
j ra /* return */
+
.end asm_perform_threadswitch
*******************************************************************************/
.ent asm_switchstackandcall
+
asm_switchstackandcall:
aaddiu a0,a0,-16 /* allocate new stack */
sd ra,0(a0) /* save return address on new stack */
.end asm_switchstackandcall
- .ent asm_getcallingmethod
-asm_getcallingmethod:
- li v0,0
- j ra
- .end asm_getcallingmethod
-
-/*********************** function asm_builtin_trace ****************************
-* *
-* Intended to be called from the native stub. Saves all argument registers *
-* and calls builtin_trace_args. *
-* *
-*******************************************************************************/
+ .ent asm_getclassvalues_atomic
- .ent asm_builtin_trace
-asm_builtin_trace:
- daddiu sp,sp,-18*8
- sd itmp1,0*8(sp)
- sd ra,1*8(sp)
- sd a0,2*8(sp)
- sd a1,3*8(sp)
- sd a2,4*8(sp)
- sd a3,5*8(sp)
- sd a4,6*8(sp)
- sd a5,7*8(sp)
- sd a6,8*8(sp)
- sd a7,9*8(sp)
- sdc1 fa0,10*8(sp)
- sdc1 fa1,11*8(sp)
- sdc1 fa2,12*8(sp)
- sdc1 fa3,13*8(sp)
- sdc1 fa4,14*8(sp)
- sdc1 fa5,15*8(sp)
- sdc1 fa6,16*8(sp)
- sdc1 fa7,17*8(sp)
-
- jal builtin_trace_args
-
- ld ra,1*8(sp)
- ld a0,2*8(sp) /* restore argument registers */
- ld a1,3*8(sp) /* they could be used by method */
- ld a2,4*8(sp)
- ld a3,5*8(sp)
- ld a4,6*8(sp)
- ld a5,7*8(sp)
- ld a6,8*8(sp)
- ld a7,9*8(sp)
- ldc1 fa0,10*8(sp)
- ldc1 fa1,11*8(sp)
- ldc1 fa2,12*8(sp)
- ldc1 fa3,13*8(sp)
- ldc1 fa4,14*8(sp)
- ldc1 fa5,15*8(sp)
- ldc1 fa6,16*8(sp)
- ldc1 fa7,17*8(sp)
- daddiu sp,sp,18*8
+asm_getclassvalues_atomic:
+_crit_restart2:
+_crit_begin2:
+ lw t0,offbaseval(a0)
+ lw t1,offdiffval(a0)
+ lw t2,offbaseval(a1)
+_crit_end2:
+ sw t0,offcast_super_baseval(a2)
+ sw t1,offcast_super_diffval(a2)
+ sw t2,offcast_sub_baseval(a2)
j ra
- .end asm_builtin_trace
-
-
-/********************* function asm_builtin_exittrace **************************
-* *
-* Intended to be called from the native stub. Saves return value and calls *
-* builtin_displaymethodstop. *
-* *
-*******************************************************************************/
+ .end asm_getclassvalues_atomic
- .ent asm_builtin_exittrace
-asm_builtin_exittrace:
- daddiu sp,sp,-4*8
- sd ra,0*8(sp)
- sd v0,1*8(sp)
- sdc1 fv0,2*8(sp)
+ .data
- jal builtin_displaymethodstop
-
- ld ra,0*8(sp)
- ld v0,1*8(sp)
- ldc1 fv0,2*8(sp)
- daddiu sp,sp,4*8
- j ra
+asm_criticalsections:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ .dword _crit_begin1
+ .dword _crit_end1
+ .dword _crit_restart1
+ .dword _crit_begin2
+ .dword _crit_end2
+ .dword _crit_restart2
+#endif
+ .dword 0
- .end asm_builtin_exittrace
+ .text
+ .ent compare_and_swap
+compare_and_swap:
+1:
+ lld v0,0(a0)
+ bne v0,a1,2f
+ move t0,a2
+ scd t0,0(a0)
+ beqz t0,1b
+2:
+ sync
+ j ra
+ .end compare_and_swap
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where