X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fmips%2Fasmpart.S;h=3966740d8bdf95336420f1951b7c8248e9a08588;hb=d75b6037acf17c342166b9c9bd6e657dfdd12cd9;hp=6ecda66f0e08113b40a9a97cec9a9284724806ee;hpb=8395b7e9d40e3ca38f98ff3d3684541c2c2fd87e;p=cacao.git diff --git a/src/vm/jit/mips/asmpart.S b/src/vm/jit/mips/asmpart.S index 6ecda66f0..3966740d8 100644 --- a/src/vm/jit/mips/asmpart.S +++ b/src/vm/jit/mips/asmpart.S @@ -1,10 +1,9 @@ -/* 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. @@ -27,13 +26,14 @@ Authors: Andreas Krall - $Id: asmpart.S 1166 2004-06-12 13:34:06Z stefan $ + $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 @@ -63,7 +63,7 @@ #define s6 $22 #define s7 $23 -#define t4 $24 +#define t8 $24 #define itmp3 $25 #define k0 $26 #define k1 $27 @@ -134,22 +134,6 @@ #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 @@ -182,7 +166,6 @@ .globl asm_getclassvalues_atomic .globl asm_criticalsections - .globl atomic_swap .globl compare_and_swap @@ -196,7 +179,7 @@ .globl class_java_lang_Object -/********************* function asm_calljavafunction **************************** +/********************* function asm_calljavafunction *************************** * * * This function calls a Java-method (which possibly needs compilation) * * with up to 4 address parameters. * @@ -218,20 +201,19 @@ .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 */ @@ -301,20 +283,19 @@ calljava_xhandler: .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: @@ -382,12 +363,12 @@ call_java_pc2: 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) @@ -398,11 +379,11 @@ calljava_copyloop: 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 @@ -563,7 +544,7 @@ asm_handle_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) @@ -687,7 +668,7 @@ ex_handle_it: 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) @@ -792,11 +773,10 @@ ex_flt2: .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) @@ -805,19 +785,48 @@ asm_check_clinit: 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) @@ -826,42 +835,63 @@ asm_check_clinit: 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) -#error TODO TWISTI please check me for correctness - 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 @@ -883,13 +913,13 @@ asm_builtin_monitorenter: 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 @@ -911,13 +941,12 @@ asm_builtin_monitorexit: 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 @@ -939,14 +968,12 @@ asm_builtin_idiv: 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 @@ -968,14 +995,12 @@ asm_builtin_ldiv: 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 @@ -997,14 +1022,12 @@ asm_builtin_irem: 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 @@ -1026,14 +1049,12 @@ asm_builtin_lrem: 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 @@ -1061,8 +1082,7 @@ asm_builtin_checkarraycast: 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 */ @@ -1093,8 +1113,7 @@ asm_builtin_checkcast: 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 */ @@ -1136,38 +1155,36 @@ asm_builtin_aastore: 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 @@ -1309,38 +1326,28 @@ _crit_end2: 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 /*