-/* 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 1281 2004-07-05 22:03:43Z twisti $
+ $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
*/
#include "config.h"
-#include "offsets.h"
+#include "vm/jit/mips/offsets.h"
+#include "vm/jit/mips/asmoffsets.h"
#define zero $0
#define s6 $22
#define s7 $23
-#define t4 $24
+#define t8 $24
#define itmp3 $25
#define k0 $26
#define k1 $27
#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
.globl asm_getclassvalues_atomic
.globl asm_criticalsections
- .globl atomic_swap
.globl compare_and_swap
.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 10*8 /* 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
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)
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
-
- daddiu 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)
- daddiu sp,sp,18*8
- beqz v0,L_initializererror
+ 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)
-L_is_initialized:
- move itmp1,ra /* now patch the calling code */
- daddiu itmp1,itmp1,-4*4 /* go back 4 instructions */
- lui itmp2,0x1000 /* b */
- daddiu itmp2,itmp2,3 /* jump over 3 instructions */
- sw itmp2,0(itmp1) /* store the new branch: br +3 */
- sw zero,4(itmp1) /* and a nop delay slot */
+ 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)
- j ra
+ 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)
- daddiu sp,sp,-1*8
- sd ra,0*8(sp)
jal builtin_asm_get_exceptionptrptr
- move xptr,v0
- ld ra,0*8(sp)
- daddiu sp,sp,1*8
#else
- la itmp3,_exceptionptr
- ld xptr,0(itmp3)
- sd zero,0(itmp3)
+ 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
j t9
nb_monitorenter:
- daddiu sp,sp,-1*8
+ 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,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j t9
nb_monitorexit:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_NullPointerException
- jal new_exception
+ jal new_nullpointerexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j itmp3
nb_idiv:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArithmeticException
- ald a1,string_java_lang_ArithmeticException_message
- jal new_exception_message
+ jal new_arithmeticexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j itmp3
nb_ldiv:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArithmeticException
- ald a1,string_java_lang_ArithmeticException_message
- jal new_exception_message
+ jal new_arithmeticexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j t9
nb_irem:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArithmeticException
- ald a1,string_java_lang_ArithmeticException_message
- jal new_exception_message
+ jal new_arithmeticexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j t9
nb_lrem:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArithmeticException
- ald a1,string_java_lang_ArithmeticException_message
- jal new_exception_message
+ jal new_arithmeticexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
aaddiu xpc,ra,-4 /* faulting address is return adress - 4*/
b asm_handle_nat_exception
j ra /* return */
nb_carray_throw:
- ald a0,string_java_lang_ClassCastException
- jal new_exception
+ jal new_classcastexception
move xptr,v0
ld ra,0(sp) /* restore return address */
j ra /* return */
nb_ccast_throw:
- ald a0,string_java_lang_ClassCastException
- jal new_exception
+ jal new_classcastexception
move xptr,v0
ld ra,0(sp) /* restore return address */
j ra /* return */
nb_aastore_null:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_NullPointerException
- jal new_exception
+ jal new_nullpointerexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
move xpc,ra /* faulting address is return adress */
b asm_handle_nat_exception
nb_aastore_bound:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArrayIndexOutOfBoundsException
- jal new_exception_int /* a1 already contains the index */
+ move a0,a1 /* move index into a0 */
+ jal new_arrayindexoutofboundsexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ 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_store:
- daddiu sp,sp,-1*8
+ daddiu sp,sp,-2*8
sd ra,0*8(sp)
- ald a0,string_java_lang_ArrayStoreException
- jal new_exception
+ jal new_arraystoreexception
move xptr,v0
ld ra,0*8(sp)
- daddiu sp,sp,1*8
+ daddiu sp,sp,2*8
move xpc,ra /* faulting address is return adress */
b asm_handle_nat_exception
asm_criticalsections:
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- .quad _crit_begin1
- .quad _crit_end1
- .quad _crit_restart1
- .quad _crit_begin2
- .quad _crit_end2
- .quad _crit_restart2
+ .dword _crit_begin1
+ .dword _crit_end1
+ .dword _crit_restart1
+ .dword _crit_begin2
+ .dword _crit_end2
+ .dword _crit_restart2
#endif
- .quad 0
+ .dword 0
.text
- .ent atomic_swap
-atomic_swap:
+ .ent compare_and_swap
+compare_and_swap:
1:
lld v0,0(a0)
- move t0,a1
+ bne v0,a1,2f
+ move t0,a2
scd t0,0(a0)
beqz t0,1b
- j ra
- .end atomic_swap
-
- .ent compare_and_swap
-compare_and_swap:
- move v0,zero
-1:
- lld t0,0(a0)
- bne t0,a1,2f
- move v0,a2
- scd v0,0(a0)
- beqz v0,1b
2:
+ sync
j ra
.end compare_and_swap
/*