-/* -*- mode: asm; tab-width: 4 -*- */
-/****************************** asmpart.S **************************************
-* *
-* It contains the Java-C interface functions for Alpha processors. *
-* *
-* Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst *
-* *
-* See file COPYRIGHT for information on usage and disclaimer of warranties *
-* *
-* Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at *
-* Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at *
-* *
-* Last Change: 2003/02/17 *
-* *
-*******************************************************************************/
+/* vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
+
+ 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.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ 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.
+
+ Contact: cacao@complang.tuwien.ac.at
+
+ Authors: Andreas Krall
+ Reinhard Grafl
+
+ Changes: Joseph Wenninger
+
+ $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
+
+*/
+
+
+#include "config.h"
+#include "vm/jit/alpha/offsets.h"
+#include "vm/jit/alpha/asmoffsets.h"
-#include "offsets.h"
#define v0 $0
#define fzero $f31
-#define PAL_imb 134
+#define PAL_imb 0x86
.text
.set noat
/********************* exported functions and variables ***********************/
.globl has_no_x_instr_set
- .globl synchronize_caches
- .globl asm_calljavamethod
.globl asm_calljavafunction
.globl asm_calljavafunction2
.globl asm_calljavafunction2double
.globl asm_calljavafunction2long
.globl asm_call_jit_compiler
- .globl asm_dumpregistersandcall
+ .globl asm_throw_and_handle_exception
+ .globl asm_throw_and_handle_nat_exception
+ .globl asm_throw_and_handle_arithmetic_exception
+ .globl asm_throw_and_handle_arrayindexoutofbounds_exception
.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_perform_threadswitch
.globl asm_initialize_thread_stack
.globl asm_switchstackandcall
- .globl asm_getcallingmethod
.globl asm_builtin_trace
.globl asm_builtin_exittrace
+ .globl asm_criticalsections
+ .globl asm_getclassvalues_atomic
+ .globl asm_prepare_native_stackinfo
+ .globl asm_remove_native_stackinfo
+ .globl asm_refillin_and_handle_exception
/*************************** imported functions *******************************/
.end has_no_x_instr_set
-/********************* function synchronize_caches ****************************/
-
- .ent synchronize_caches
-synchronize_caches:
-
- call_pal PAL_imb /* synchronise instruction cache */
- jmp zero,(ra) /* return */
-
- .end synchronize_caches
-
-
-/********************* function asm_calljavamethod *****************************
-* *
-* This function calls a Java-method (which possibly needs compilation) *
-* with up to 4 parameters. *
-* *
-* This functions calls the JIT-compiler which eventually translates the *
-* method into machine code. *
-* *
-* An possibly throwed exception will be returned to the caller as function *
-* return value, so the java method cannot return a fucntion value (this *
-* function usually calls 'main' and '<clinit>' which do not return a *
-* function value). *
-* *
-* C-prototype: *
-* javaobject_header *asm_calljavamethod (methodinfo *m, *
-* void *arg1, void *arg2, void *arg3, void *arg4); *
-* *
-*******************************************************************************/
-
-#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
-
- .ent asm_calljavamethod
-
-call_name:
- .ascii "calljavamethod\0\0"
-
- .align 3
- .quad 0 /* catch type all */
- .quad calljava_xhandler /* handler pc */
- .quad calljava_xhandler /* end pc */
- .quad asm_calljavamethod /* 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_calljavamethod:
-
- 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_jit:
- lda pv,-64(ra) /* asm_calljavamethod-calljava_jit !!!!!*/
-
-calljava_return:
-
- ldq ra,0(sp) /* restore return address */
- ldq gp,24(sp) /* restore global pointer */
- lda sp,32(sp) /* free stack space */
- clr v0
-
-calljava_ret:
- jmp zero,(ra)
-
-calljava_xhandler:
-
- ldq gp,24(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_calljavamethod
-
-
/********************* function asm_calljavafunction ***************************
* *
* This function calls a Java-method (which possibly needs compilation) *
* method into machine code. *
* *
* C-prototype: *
-* javaobject_header *asm_calljavamethod (methodinfo *m, *
+* javaobject_header *asm_calljavafunction (methodinfo *m, *
* void *arg1, void *arg2, void *arg3, void *arg4); *
* *
*******************************************************************************/
.ent asm_calljavafunction
-call_name2:
+call_name:
.ascii "calljavafunction\0\0"
- .align 3
+ .align 2 /*3*/
.quad 0 /* catch type all */
- .quad calljava_xhandler2 /* handler pc */
- .quad calljava_xhandler2 /* end pc */
+ .quad calljava_xhandler /* handler pc */
+ .quad calljava_xhandler /* end pc */
.quad asm_calljavafunction /* start pc */
.long 1 /* extable size */
- .long 0 /* fltsave */
+ .long 0 /* PADDING */
+ .quad 0 /* line number table start */
+ .quad 0 /* line number table size */
+ .long 0 /* PADDING */
+ .long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
.long 0 /* IsSync */
.quad 0 /* method pointer (pointer to name) */
asm_calljavafunction:
-
ldgp gp,0(pv)
lda sp,-32(sp) /* allocate stack space */
stq gp,24(sp) /* save global pointer */
ldq pv,8($28) /* method call as in Java */
jmp ra,(pv) /* call JIT compiler */
-calljava_jit2:
+calljava_jit:
lda pv,-64(ra) /* asm_calljavafunction-calljava_jit !!!!!*/
-calljava_return2:
-
+calljava_return:
ldq ra,0(sp) /* restore return address */
ldq gp,24(sp) /* restore global pointer */
lda sp,32(sp) /* free stack space */
-calljava_ret2:
+calljava_ret:
jmp zero,(ra)
-calljava_xhandler2:
-
+calljava_xhandler:
ldq gp,24(sp) /* restore global pointer */
mov itmp1,a0
jsr ra,builtin_throw_exception
.ent asm_calljavafunction2
-call_name3:
+call_name2:
.ascii "calljavafunction2\0\0"
.align 3
.quad 0 /* catch type all */
- .quad calljava_xhandler3 /* handler pc */
- .quad calljava_xhandler3 /* end pc */
+ .quad calljava_xhandler2 /* handler pc */
+ .quad calljava_xhandler2 /* end pc */
.quad asm_calljavafunction2 /* start pc */
.long 1 /* extable size */
+ .long 0 /* PADDING */
+ .quad 0 /* line number table start */
+ .quad 0 /* line number table size */
+ .long 0 /* PADDING */
.long 0 /* fltsave */
.long 1 /* intsave */
.long 0 /* isleaf */
asm_calljavafunction2:
asm_calljavafunction2double:
asm_calljavafunction2long:
-
ldgp gp,0(pv)
lda sp,-40(sp) /* allocate stack space */
stq ra,0(sp) /* save return address */
ldq pv,8($28) /* method call as in Java */
jmp ra,(pv) /* call JIT compiler */
-calljava_jit3:
+calljava_jit2:
lda pv,-200(ra) /* asm_calljavafunction-calljava_jit !!!*/
s8addq s6,sp,sp
-calljava_return3:
-
+calljava_return2:
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:
+calljava_ret2:
jmp zero,(ra)
-calljava_xhandler3:
-
+calljava_xhandler2:
s8addq s6,sp,sp
ldq gp,8(sp) /* restore global pointer */
mov itmp1,a0
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)
addq t8,$28,t8 /* compute update address via method pointer*/
stq v0,0(t8) /* save new method address there */
+ call_pal PAL_imb /* synchronise instruction cache */
+
mov v0,pv /* load method address into pv */
jmp zero,(pv) /* and call method. The method returns */
.end asm_call_jit_compiler
-/****************** function asm_dumpregistersandcall **************************
+/**************** function asm_refillin_and_handle_exception *******************
* *
-* This funtion saves all callee saved registers and calls the function *
-* which is passed as parameter. *
+* This function handles an exception. It does not use the usual calling *
+* conventions. The exception is passed in REG_ITMP1 and the *
+* pc from the exception raising position is passed in REG_ITMP2. *
+* a0 contains the PV of the function causing the problem *
+* *
+* void asm_handle_arithmetic_exception (exceptionclass, exceptionpc); *
+* *
+*******************************************************************************/
+ .ent asm_refillin_and_handle_exception
+asm_refillin_and_handle_exception:
+ ldgp gp,0(pv)
+ 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_refillin_and_handle_exception_cont
+ 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 */
+
+asm_refillin_and_handle_exception_cont:
+
+ mov sp,t0
+ lda sp,-6*8(sp) /* prepare stackframe*/
+ stq pv,5*8(sp) /* store pv of caller */
+ stq xptr,4*8(sp) /*exception ptr*/
+ stq xpc,3*8(sp) /*address of failure*/
+ stq t0,2*8(sp) /*begin of java stack frame*/
+ stq pv,1*8(sp) /* store pv of caller */
+ stq zero,0*8(sp) /*builtin (invisible) function */
+ jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
+ ldgp gp,0(ra)
+
+ ldq a2,utf_fillInStackTrace_desc
+ ldq a1,utf_fillInStackTrace_name
+ ldq t0,6*8(sp)
+ ldq t1,offobjvftbl(t0)
+ ldq a0,offclass(t1)
+ jsr ra,class_resolvemethod
+ ldgp gp,0(ra)
+ /* now we have the method */
+
+ /*refillin */
+ mov v0,a0
+ ldq a1,6*8(sp)
+ jsr ra,asm_calljavafunction
+ ldgp gp,0(ra)
+
+ /*remove frame*/
+ jsr ra,asm_remove_native_stackinfo
+ ldgp gp,0(ra)
+
+
+ /*finish*/
+ ldq xpc,0(sp)
+ ldq xptr,1*8(sp)
+ ldq pv,2*8(sp)
+ lda sp,3*8(sp)
+ br asm_handle_exception
+
+ .end asm_refillin_and_handle_exception
+
+/****** function asm_throw_and_handle_arrayindexoutofbounds_exception **********
* *
-* 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. *
+* This function handles an exception. It does not use the usual calling *
+* conventions. The integer parameter is passed in REG_ITMP1 and the *
+* pc from the exception raising position is passed in REG_ITMP2. *
* *
-* void asm_dumpregistersandcall (functionptr f); *
+* void asm_handle_arithmetic_exception (exceptionclass, exceptionpc); *
* *
*******************************************************************************/
- .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
+ .ent asm_throw_and_handle_arrayindexoutofbounds_exception
+
+asm_throw_and_handle_arrayindexoutofbounds_exception:
+ ldgp gp,0(pv)
+
+ 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_throw_and_handle_arrayindexoutofbounds_exception_cont
+ 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 */
+
+asm_throw_and_handle_arrayindexoutofbounds_exception_cont:
+ mov sp,t0
+ lda sp,-6*8(sp) /*prepare stackframe*/
+ stq pv,5*8(sp) /*pv of failure*/
+ stq itmp1,4*8(sp) /*int parameter of the exception*/
+ stq xpc,3*8(sp) /*address of failure */
+ stq t0,2*8(sp) /*store begin of java stack frame*/
+ stq pv,1*8(sp) /*store pv of caller in structure*/
+ stq zero,0*8(sp) /*builtin (invisible function)*/
+
+ jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
+ ldgp gp,0(ra)
+
+ ldq a0,6*8(sp) /*int of exception*/
+ jsr ra,new_arrayindexoutofboundsexception
+ ldgp gp,0(ra)
+
+ mov v0,itmp1 /*itmp1 is not touched in asm_remove_native_stackinfo*/
+
+ jsr ra,asm_remove_native_stackinfo
+ ldgp gp,0(ra)
+
+ ldq itmp2,0(sp)
+ ldq pv,2*8(sp)
+ lda sp,3*8(sp)
+ br asm_handle_exception
+
+ .end asm_throw_and_handle_arrayindexoutofbounds_exception
+
+
+/* asm_throw_and_handle_arithmetic_exception ***********************************
+
+ DOCUMENT ME!
+
+*******************************************************************************/
+
+ .ent asm_throw_and_handle_arithmetic_exception
+
+asm_throw_and_handle_arithmetic_exception:
+ 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_throw_and_handle_arithmetic_exception_cont
+ 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 */
+
+asm_throw_and_handle_arithmetic_exception_cont:
+ mov sp,t0
+ lda sp,-6*8(sp) /*prepare stackframe*/
+ stq pv,5*8(sp) /*pv of failure*/
+ stq itmp1,4*8(sp) /*exception string of the exception*/
+ stq xpc,3*8(sp) /*address of failure */
+ stq t0,2*8(sp) /*store begin of java stack frame*/
+ stq pv,1*8(sp) /*store pv of caller in structure*/
+ stq zero,0*8(sp) /*builtin (invisible function)*/
+ jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
+ ldgp gp,0(ra)
+
+ jsr ra,new_arithmeticexception
+ ldgp gp,0(ra)
+ mov v0,itmp1 /*itmp1 is not touched in asm_remove_native_stackinfo*/
+
+ jsr ra,asm_remove_native_stackinfo
+ ldgp gp,0(ra)
+
+ ldq itmp2,0(sp)
+ ldq pv,2*8(sp)
+ lda sp,3*8(sp)
+ br asm_handle_exception
+
+ .end asm_throw_and_handle_arithmetic_exception
+
+
+/**************** function asm_throw_and_handle_exception **********************
+* *
+* This function handles an exception. It does not use the usual calling *
+* conventions. The exception class name is passed in REG_ITMP1 and the *
+* pc from the exception raising position is passed in REG_ITMP2. *
+* *
+* void asm_handle_exception (exceptionclass, exceptionpc); *
+* *
+*******************************************************************************/
+ .ent asm_throw_and_handle_nat_exception
+asm_throw_and_handle_nat_exception:
+ ldgp gp,0(pv)
+ 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_throw_and_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 */
+
+ .aent asm_throw_and_handle_exception
+asm_throw_and_handle_exception:
+ mov sp,t0
+ lda sp,-6*8(sp) /*prepare stackframe*/
+ stq pv,5*8(sp) /*pv of failure*/
+ stq itmp1,4*8(sp) /*classname of the exception*/
+ stq xpc,3*8(sp) /*address of failure */
+ stq t0,2*8(sp) /*store begin of java stack frame*/
+ stq pv,1*8(sp) /*store pv of caller in structure*/
+ stq zero,0*8(sp) /*builtin (invisible function)*/
+ jsr ra,asm_prepare_native_stackinfo /* puts 2 additional quadwords on stack */
+ ldgp gp,0(ra)
+
+ ldq a0,6*8(sp) /*classname of exception*/
+ jsr ra,new_exception
+ ldgp gp,0(ra)
+
+ mov v0,itmp1 /*itmp1 is not touched in asm_remove_native_stackinfo*/
+
+ jsr ra,asm_remove_native_stackinfo
+ ldgp gp,0(ra)
+
+ ldq itmp2,0(sp)
+ ldq pv,2*8(sp)
+ lda sp,3*8(sp)
+ br asm_handle_exception
+ .end asm_throw_and_handle_nat_exception
/********************* function asm_handle_exception ***************************
.ent asm_handle_nat_exception
asm_handle_nat_exception:
-
ldl t0,0(ra) /* load instruction LDA PV,xxx(RA) */
sll t0,48,t0
sra t0,48,t0 /* isolate offset */
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
+ 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 */
.aent asm_handle_exception
asm_handle_exception:
-
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 */
mov xptr,a0
ldq a1,MethodPointer(pv)
mov xpc,a2
- mov t3,a3
+/* mov t3,a3 */
+ lda a3,0(zero)
+ lda a4,1(zero)
br ra,ex_trace /* set ra for gp loading */
ex_trace:
ldgp gp,0(ra) /* load gp */
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 a1,ExCatchType(t1) /* arg1 = exception catch type */
beq a1,ex_handle_it /* NULL catches everything */
+ ldl itmp3,offclassloaded(a1)
+ bne itmp3,L_class_loaded
+
+ subq sp,8*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)
+ stq a1,7*8(sp)
+
+ mov a1,a0
+
+ br ra,L_class_load_ra /* set ra for gp loading */
+L_class_load_ra:
+ ldgp gp,0(ra) /* load gp */
+ jsr ra,class_load /* class_load(exceptionclass) */
+
+ 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)
+ ldq a1,7*8(sp)
+ addq sp,8*8,sp /* deallocate stack */
+
+L_class_loaded:
+ ldl itmp3,offclasslinked(a1)
+ subq sp,8*8,sp /* allocate stack */
+ stq a1,7*8(sp)
+ bne itmp3,L_class_linked
+
+ 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)
+
+ mov a1,a0
+
+ br ra,L_class_link_ra /* set ra for gp loading */
+L_class_link_ra:
+ ldgp gp,0(ra) /* load gp */
+ jsr ra,class_link /* class_load(exceptionclass) */
+
+ 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)
+
+L_class_linked:
+_crit_restart1:
+ ldq a1,7*8(sp)
+_crit_begin1:
ldq a0,offobjvftbl(xptr) /* a0 = vftblptr(xptr) */
- ldq a1,offclassvftbl(a1) /* a1 = vftblptr(catchtype) class (not obj) */
+ 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) */
+_crit_end1:
subl a0,v0,a0 /* a0 = baseval(xptr) - baseval(catchtype) */
cmpule a0,a1,v0 /* v0 = xptr is instanceof catchtype */
+ addq sp,8*8,sp /* deallocate stack */
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 */
.end asm_handle_nat_exception
+/* asm_check_clinit ************************************************************
+
+ DOCUMENT ME!!!
+
+ Arguments:
+
+ itmp1: pointer to class
+
+ Stack layout:
+
+ 0 mcode ; machine code to patch back in
+
+*******************************************************************************/
+
+ .ent asm_check_clinit
+
+asm_check_clinit:
+ ldgp gp,0(itmp2) /* function is called via `jsr ra,itmp1' */
+
+ subq sp,8*8,sp
+
+ stq ra,0*8(sp) /* save return address */
+ stq pv,1*8(sp) /* save pv of calling java function */
+ stq a0,2*8(sp) /* save argument registers for leaf */
+ stq a1,3*8(sp) /* functions and native stub */
+ stq a2,4*8(sp)
+ stq a3,5*8(sp)
+ stq a4,6*8(sp)
+ stq a5,7*8(sp)
+
+ ldl itmp2,offclassinit(itmp1)
+ bne itmp2,L_is_initialized
+
+ mov itmp1,a0 /* move class pointer to a0 */
+ jsr ra,class_init
+ ldgp gp,0(ra)
+
+ beq v0,L_initializererror
+
+L_is_initialized:
+ ldq ra,0*8(sp) /* get return address */
+ subq ra,1*4,ra /* go back 1 instruction */
+ ldl itmp1,8*8(sp) /* load machine code from stack */
+ stl itmp1,0(ra) /* store the machine code */
+
+ call_pal PAL_imb /* synchronise instruction cache */
+
+ ldq ra,0*8(sp) /* restore return address */
+ ldq pv,1*8(sp) /* restore pv of calling java function */
+ ldq a0,2*8(sp) /* restore argument registers */
+ ldq a1,3*8(sp)
+ ldq a2,4*8(sp)
+ ldq a3,5*8(sp)
+ ldq a4,6*8(sp)
+ ldq a5,7*8(sp)
+
+ addq sp,(8+1)*8,sp /* remove stack frame (+1 for machine code) */
+
+ subq ra,1*4,ra /* go back 1 instruction */
+ jmp zero,(ra) /* jump to the new code */
+
+L_initializererror:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ jsr ra,builtin_asm_get_exceptionptrptr
+#else
+ lda v0,_exceptionptr
+#endif
+ ldq xptr,0(v0) /* get the exception pointer */
+ stq zero,0(v0) /* clear the exception pointer */
+
+ ldq ra,0*8(sp) /* restore return address */
+ ldq pv,1*8(sp) /* restore pv of calling java function */
+ ldq a0,2*8(sp) /* restore argument registers */
+ ldq a1,3*8(sp)
+ ldq a2,4*8(sp)
+ ldq a3,5*8(sp)
+ ldq a4,6*8(sp)
+ ldq a5,7*8(sp)
+
+ addq sp,(8+1)*8,sp /* remove stack frame (+1 for machine code) */
+
+ subq ra,4,xpc
+ br asm_handle_exception /* we have the pv of the calling java func. */
+
+ .end asm_check_clinit
+
+
/********************* function asm_builtin_monitorenter ***********************
* *
* Does null check and calls monitorenter or throws an exception *
*******************************************************************************/
.ent asm_builtin_monitorenter
-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 */
nb_monitorenter:
- ldq xptr,proto_java_lang_NullPointerException
+ lda xpc,-4(ra)
+ ldq xptr,string_java_lang_NullPointerException
+ jmp zero,asm_throw_and_handle_nat_exception
+#if 0
+ subq sp,8,sp
+ stq ra,0(sp)
+ jsr ra,new_nullpointerexception
+ ldgp gp,0(ra)
+ mov v0,xptr
+ ldq ra,0(sp)
+ addq sp,8,sp
+
lda xpc,-4(ra) /* faulting address is return adress - 4*/
br asm_handle_nat_exception
+#endif
.end asm_builtin_monitorenter
*******************************************************************************/
.ent asm_builtin_monitorexit
-asm_builtin_monitorexit:
+asm_builtin_monitorexit:
ldgp gp,0(pv)
lda pv,builtin_monitorexit
beq a0,nb_monitorexit /* if (null) throw exception */
jmp zero,(pv) /* else call builtin_monitorexit */
nb_monitorexit:
- ldq xptr,proto_java_lang_NullPointerException
+ lda xpc,-4(ra)
+ ldq xptr,string_java_lang_NullPointerException
+ jmp zero,asm_throw_and_handle_nat_exception
+#if 0
+ subq sp,8,sp
+ stq ra,0(sp)
+ jsr ra,new_nullpointerexception
+ ldgp gp,0(ra)
+ mov v0,xptr
+ ldq ra,0(sp)
+ addq sp,8,sp
+
lda xpc,-4(ra) /* faulting address is return adress - 4*/
br asm_handle_nat_exception
+#endif
.end asm_builtin_monitorexit
*******************************************************************************/
.ent asm_builtin_idiv
-asm_builtin_idiv:
+asm_builtin_idiv:
ldgp gp,0(pv)
lda pv,builtin_idiv
beq a1,nb_idiv /* if (null) throw exception */
jmp zero,(pv) /* else call builtin_idiv */
nb_idiv:
- ldq xptr,proto_java_lang_ArithmeticException
+ ldq xptr,string_java_lang_ArithmeticException_message
lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
+ br asm_throw_and_handle_arithmetic_exception
+
.end asm_builtin_idiv
*******************************************************************************/
.ent asm_builtin_ldiv
-asm_builtin_ldiv:
+asm_builtin_ldiv:
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
+ ldq xptr,string_java_lang_ArithmeticException_message
lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
+ br asm_throw_and_handle_arithmetic_exception
+
.end asm_builtin_ldiv
*******************************************************************************/
.ent asm_builtin_irem
-asm_builtin_irem:
+asm_builtin_irem:
ldgp gp,0(pv)
lda pv,builtin_irem
beq a1,nb_irem /* if (null) throw exception */
jmp zero,(pv) /* else call builtin_irem */
nb_irem:
- ldq xptr,proto_java_lang_ArithmeticException
+ ldq xptr,string_java_lang_ArithmeticException_message
lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
+ br asm_throw_and_handle_arithmetic_exception
+
.end asm_builtin_irem
*******************************************************************************/
.ent asm_builtin_lrem
-asm_builtin_lrem:
+asm_builtin_lrem:
ldgp gp,0(pv)
lda pv,builtin_lrem
beq a1,nb_lrem /* if (null) throw exception */
jmp zero,(pv) /* else call builtin_lrem */
nb_lrem:
- ldq xptr,proto_java_lang_ArithmeticException
+ ldq xptr,string_java_lang_ArithmeticException_message
lda xpc,-4(ra) /* faulting address is return adress - 4*/
- br asm_handle_nat_exception
- .end asm_builtin_lrem
-
-
- /*********************** function new_builtin_checkcast ************************
- * *
- * Does the cast check and eventually throws an exception *
- * *
- *******************************************************************************/
+ br asm_throw_and_handle_arithmetic_exception
- .ent asm_builtin_checkcast
-asm_builtin_checkcast:
+ .end asm_builtin_lrem
- 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:
+asm_builtin_checkarraycast:
ldgp gp,0(pv)
lda sp,-16(sp) /* allocate stack space */
stq ra,0(sp) /* save return address */
jmp zero,(ra)
nb_carray_throw:
- ldq xptr,proto_java_lang_ClassCastException
+ ldq ra,0(sp)
+ lda sp,16(sp)
+ lda xpc,-4(ra)
+ ldq xptr,string_java_lang_ClassCastException
+ jmp zero,asm_throw_and_handle_nat_exception
+#if 0
+ ldq a0,string_java_lang_ClassCastException
+ jsr ra,new_exception
+ ldgp gp,0(ra)
+ mov v0,xptr
+
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
+#endif
+
.end asm_builtin_checkarraycast
*******************************************************************************/
.ent asm_builtin_aastore
-asm_builtin_aastore:
+asm_builtin_aastore:
ldgp gp,0(pv)
beq a0,nb_aastore_null /* if null pointer throw exception */
ldl t0,offarraysize(a0) /* load size */
jmp zero,(ra)
nb_aastore_null:
- ldq xptr,proto_java_lang_NullPointerException
+ ldq xptr,string_java_lang_NullPointerException
+ mov ra,xpc
+ jmp zero,asm_throw_and_handle_nat_exception
+#if 0
+ subq sp,8,sp /* allocate stack space */
+ stq ra,0(sp) /* save return address */
+ jsr ra,new_nullpointerexception
+ ldgp gp,0(ra)
+ mov v0,xptr
+ ldq ra,0(sp)
+ addq sp,8,sp
+
mov ra,xpc /* faulting address is return adress */
br asm_handle_nat_exception
-
+#endif
nb_aastore_bound:
- ldq xptr,proto_java_lang_ArrayIndexOutOfBoundsException
+ ldq ra,0(sp)
+ lda sp,24(sp)
+ mov ra,xpc
+ mov a1,xptr
+ jmp zero,asm_throw_and_handle_arrayindexoutofbounds_exception
+#if 0
+ ldq a0,string_java_lang_ArrayIndexOutOfBoundsException
+ jsr ra,new_exception_int /* a1 already contains the index */
+ ldgp gp,0(ra)
+ mov v0,xptr
+
+ ldq ra,0(sp) /* restore return address */
lda sp,24(sp) /* free stack space */
mov ra,xpc /* faulting address is return adress */
br asm_handle_nat_exception
-
+#endif
nb_aastore_throw:
- ldq xptr,proto_java_lang_ArrayStoreException
+ mov ra,xpc
+ ldq xptr,string_java_lang_ArrayStoreException
+ jmp zero,asm_throw_and_handle_nat_exception
+#if 0
+ subq sp,8,sp /* allocate stack space */
+ stq ra,0(sp) /* save return address */
+ jsr ra,new_arraystoreexception
+ ldgp gp,0(ra)
+ mov v0,xptr
+ ldq ra,0(sp)
+ addq sp,8,sp
+
mov ra,xpc /* faulting address is return adress */
br asm_handle_nat_exception
-
+#endif
.end asm_builtin_aastore
*******************************************************************************/
.ent asm_initialize_thread_stack
-asm_initialize_thread_stack:
+asm_initialize_thread_stack:
lda a1,-128(a1)
stq zero, 0(a1)
stq zero, 8(a1)
stq a0, 120(a1)
mov a1, v0
jmp zero,(ra)
+
.end asm_initialize_thread_stack
*******************************************************************************/
.ent asm_perform_threadswitch
-asm_perform_threadswitch:
+asm_perform_threadswitch:
subq sp,128,sp
stq s0, 0(sp)
stq s1, 8(sp)
mov ra, pv
addq sp, 128, sp
jmp zero,(ra)
+
.end asm_perform_threadswitch
.ent asm_switchstackandcall
+
asm_switchstackandcall:
lda a0,-2*8(a0) /* allocate new stack */
stq ra,0(a0) /* save return address on new stack */
.end asm_switchstackandcall
-
-/********************* function asm_getcallingmethod ***************************
-* *
-* classinfo *asm_getcallingmethodclass (); *
-* *
-* goes back stack frames to get the calling method *
-* *
-* t2 .. sp *
-* t3 .. ra *
-* t4 .. pv *
-* *
-*******************************************************************************/
-
-
- .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
-
-
-
-
-
-
-
-
-/*********************** function asm_builtin_trace ****************************
-* *
-* Intended to be called from the native stub. Saves all argument registers *
-* and calls builtin_trace_args. *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_trace
-asm_builtin_trace:
- ldgp gp,0(pv)
- lda sp,-112(sp)
- stq itmp1,0(sp)
- stq ra,8(sp)
- stq a0,16(sp)
- stq a1,24(sp)
- stq a2,32(sp)
- stq a3,40(sp)
- stq a4,48(sp)
- stq a5,56(sp)
- stt $f16,64(sp)
- stt $f17,72(sp)
- stt $f18,80(sp)
- stt $f19,88(sp)
- stt $f20,96(sp)
- stt $f21,104(sp)
-
- jsr ra,builtin_trace_args
-
- ldq ra,8(sp)
- ldq a0,16(sp)
- ldq a1,24(sp)
- ldq a2,32(sp)
- ldq a3,40(sp)
- ldq a4,48(sp)
- ldq a5,56(sp)
- ldt $f16,64(sp)
- ldt $f17,72(sp)
- ldt $f18,80(sp)
- ldt $f19,88(sp)
- ldt $f20,96(sp)
- ldt $f21,104(sp)
- lda sp,112(sp)
- jmp zero,(ra)
-
- .end asm_builtin_trace
-
-
-/********************* function asm_builtin_exittrace **************************
-* *
-* Intended to be called from the native stub. Saves return value and calls *
-* builtin_displaymethodstop. *
-* *
-*******************************************************************************/
-
- .ent asm_builtin_exittrace
-asm_builtin_exittrace:
- ldgp gp,0(pv)
+ .ent asm_getclassvalues_atomic
+
+asm_getclassvalues_atomic:
+_crit_restart2:
+_crit_begin2:
+ ldl t0,offbaseval(a0)
+ ldl t1,offdiffval(a0)
+ ldl t2,offbaseval(a1)
+_crit_end2:
+ stl t0,offcast_super_baseval(a2)
+ stl t1,offcast_super_diffval(a2)
+ stl t2,offcast_sub_baseval(a2)
+ jmp zero,(ra)
+
+ .end asm_getclassvalues_atomic
+
+ .data
+
+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
+#endif
+ .quad 0
+
+
+ .ent asm_prepare_native_stackinfo
+asm_prepare_native_stackinfo:
lda sp,-24(sp)
stq ra,0(sp)
- stq v0,8(sp)
- stt $f0,16(sp)
-
- jsr ra,builtin_displaymethodstop
-
+ jsr ra,builtin_asm_get_stackframeinfo
+ stq v0,16(sp)
+ ldq t0,0(v0)
+ stq t0,8(sp)
ldq ra,0(sp)
- ldq v0,8(sp)
- ldt $f0,16(sp)
- lda sp,24(sp)
- jmp zero,(ra)
-
- .end asm_builtin_exittrace
+ lda sp,8(sp)
+ stq sp,0(v0)
+ ret
+ .end asm_prepare_native_stackinfo
+
+ .ent asm_remove_native_stackinfo
+asm_remove_native_stackinfo:
+ ldq t0,0(sp)
+ ldq t1,8(sp)
+ stq t0,0(t1)
+ lda sp,40(sp)
+ ret
+ .end asm_remove_native_stackinfo
+
+/*
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */