GNU header update.
[cacao.git] / src / vm / jit / alpha / asmpart.S
index 59c230e0f076285659e305876462f59469b873da..081fe32436f4b3b768d4500341534151d685c107 100644 (file)
@@ -1,10 +1,9 @@
-/* jit/alpha/asmpart.S - Java-C interface functions for alpha
+/* 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 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
             Reinhard Grafl
 
-   $Id: asmpart.S 1077 2004-05-20 18:06:55Z twisti $
+   Changes: Joseph Wenninger
+
+   $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 
 #include "config.h"        
-#include "offsets.h"
-
-
-#define        MethodPointer   -8
-#define        FrameSize       -12
-#define     IsSync          -16
-#define     IsLeaf          -20
-#define     IntSave         -24
-#define     FltSave         -28
-/* DEFINE LINE NUMBER STUFF HERE */
-#define     ExTableSize     -56
-#define     ExTableStart    -56
-
-#define     ExEntrySize     -32
-#define     ExStartPC       -8
-#define     ExEndPC         -16
-#define     ExHandlerPC     -24
-#define     ExCatchType     -32
+#include "vm/jit/alpha/offsets.h"
+#include "vm/jit/alpha/asmoffsets.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_calljavafunction
        .globl asm_calljavafunction2
        .globl asm_calljavafunction2double
        .globl asm_calljavafunction2long
        .globl asm_call_jit_compiler
+       .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_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 *******************************/
 
        .globl jit_compile
-       .globl _exceptionptr
        .globl builtin_monitorexit
        .globl builtin_throw_exception
        .globl builtin_trace_exception
@@ -425,8 +414,6 @@ noregchange:
        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)
@@ -450,6 +437,8 @@ noregchange:
        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      */
@@ -458,6 +447,235 @@ noregchange:
        .end    asm_call_jit_compiler
 
 
+/**************** function asm_refillin_and_handle_exception *******************
+*                                                                              *
+*   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 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_handle_arithmetic_exception (exceptionclass, exceptionpc);        *
+*                                                                              *
+*******************************************************************************/
+
+       .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 ***************************
 *                                                                              *
 *   This function handles an exception. It does not use the usual calling      *
@@ -479,7 +697,7 @@ asm_handle_nat_exception:
        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                  */
@@ -749,70 +967,89 @@ ex_flt2:
        .end    asm_handle_nat_exception
 
 
-/********************* asm_check_clinit ****************************************
-*                                                                              *
-*   Does null check and calls monitorenter or throws an 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(pv)
-
+       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
        
-       subq    sp,7*8,sp
-       stq             ra,0*8(sp)
-       stq             a0,1*8(sp)            /* save argument registers for leaf         */
-       stq             a1,2*8(sp)            /* functions and native stub                */
-       stq             a2,3*8(sp)
-       stq             a3,4*8(sp)
-       stq             a4,5*8(sp)
-       stq             a5,6*8(sp)
-               
-       mov             itmp1,a0
+       mov             itmp1,a0              /* move class pointer to a0                 */
        jsr             ra,class_init
+    ldgp    gp,0(ra)
                
-       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
-
        beq     v0,L_initializererror
 
 L_is_initialized:
-       mov     ra,itmp1              /* now patch the calling code               */
-       subq    itmp1,(3*4),itmp1     /* go back 3 instructions                   */
-       ldah    itmp2,-15392(zero)    /* br -- 0xc3e0 == -15392                   */
-       lda     itmp2,4(itmp2)        /* jump over 4 instructions                 */
-       stl     itmp2,0(itmp1)        /* store the new branch: br +4              */
+       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) */
 
-       jmp             zero,(ra)
+       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)
-       subq    sp,1*8,sp
-       stq     ra,0*8(sp)
        jsr     ra,builtin_asm_get_exceptionptrptr
-       ldq     ra,0*8(sp)
-       addq    sp,1*8,sp
-       ldq     xptr,0(v0)            /* get the exception pointer                */
-       stq     zero,0(v0)            /* clear the exception pointer              */
 #else
-       lda     itmp3,_exceptionptr
-       ldq     xptr,0(itmp3)
-       stq     zero,0(itmp3)
+       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_nat_exception
+       br      asm_handle_exception  /* we have the pv of the calling java func. */
 
        .end    asm_check_clinit
 
@@ -832,10 +1069,13 @@ asm_builtin_monitorenter:
        jmp     zero,(pv)                 /* else call builtin_monitorenter       */
 
 nb_monitorenter:
+       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)
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception
+    jsr     ra,new_nullpointerexception
     ldgp    gp,0(ra)
        mov     v0,xptr
     ldq     ra,0(sp)
@@ -843,7 +1083,7 @@ nb_monitorenter:
        
        lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
        br      asm_handle_nat_exception
-
+#endif
        .end    asm_builtin_monitorenter
 
 
@@ -862,10 +1102,13 @@ asm_builtin_monitorexit:
        jmp     zero,(pv)                 /* else call builtin_monitorexit        */
 
 nb_monitorexit:
+       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)
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception
+    jsr     ra,new_nullpointerexception
     ldgp    gp,0(ra)
        mov     v0,xptr
     ldq     ra,0(sp)
@@ -873,7 +1116,7 @@ nb_monitorexit:
        
        lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
        br      asm_handle_nat_exception
-
+#endif
        .end    asm_builtin_monitorexit
 
 
@@ -892,18 +1135,9 @@ asm_builtin_idiv:
        jmp     zero,(pv)                 /* else call builtin_idiv               */
 
 nb_idiv:
-       subq    sp,8,sp
-       stq     ra,0(sp)
-       ldq     a0,string_java_lang_ArithmeticException
-       ldq     a1,string_java_lang_ArithmeticException_message
-       jsr     ra,new_exception_message
-       ldgp    gp,0(ra)
-       mov     v0,xptr
-       ldq     ra,0(sp)
-       addq    sp,8,sp
-       
+       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
 
@@ -923,18 +1157,9 @@ asm_builtin_ldiv:
        jmp     zero,(pv)                 /* else call builtin_ldiv               */
 
 nb_ldiv:
-       subq    sp,8,sp
-       stq     ra,0(sp)
-       ldq     a0,string_java_lang_ArithmeticException
-       ldq     a1,string_java_lang_ArithmeticException_message
-       jsr     ra,new_exception_message
-       ldgp    gp,0(ra)
-       mov     v0,xptr
-       ldq     ra,0(sp)
-       addq    sp,8,sp
-
+       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
 
@@ -954,18 +1179,9 @@ asm_builtin_irem:
        jmp     zero,(pv)                 /* else call builtin_irem               */
 
 nb_irem:
-       subq    sp,8,sp
-       stq     ra,0(sp)
-       ldq     a0,string_java_lang_ArithmeticException
-       ldq     a1,string_java_lang_ArithmeticException_message
-       jsr     ra,new_exception_message
-       ldgp    gp,0(ra)
-       mov     v0,xptr
-       ldq     ra,0(sp)
-       addq    sp,8,sp
-
+       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
 
@@ -985,18 +1201,9 @@ asm_builtin_lrem:
        jmp     zero,(pv)                 /* else call builtin_lrem               */
 
 nb_lrem:
-       subq    sp,8,sp
-       stq     ra,0(sp)
-       ldq     a0,string_java_lang_ArithmeticException
-       ldq     a1,string_java_lang_ArithmeticException_message
-       jsr     ra,new_exception_message
-       ldgp    gp,0(ra)
-       mov     v0,xptr
-       ldq     ra,0(sp)
-       addq    sp,8,sp
-
+       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_lrem
 
@@ -1023,6 +1230,12 @@ asm_builtin_checkarraycast:
        jmp     zero,(ra)
 
 nb_carray_throw:
+       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)
@@ -1032,6 +1245,7 @@ nb_carray_throw:
        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
 
@@ -1066,11 +1280,14 @@ asm_builtin_aastore:
        stq     a1,offobjarrdata(a0)      /* store objectptr in array             */
        jmp     zero,(ra)
 
-nb_aastore_null:       
+nb_aastore_null:
+       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                  */
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception
+    jsr     ra,new_nullpointerexception
     ldgp    gp,0(ra)
        mov     v0,xptr
        ldq     ra,0(sp)
@@ -1078,8 +1295,14 @@ nb_aastore_null:
 
        mov     ra,xpc                    /* faulting address is return adress    */
        br      asm_handle_nat_exception
-
+#endif
 nb_aastore_bound:
+       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)
@@ -1089,12 +1312,15 @@ nb_aastore_bound:
        lda     sp,24(sp)                 /* free stack space                     */
        mov     ra,xpc                    /* faulting address is return adress    */
        br      asm_handle_nat_exception
-
+#endif
 nb_aastore_throw:
+       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                  */
-       ldq     a0,string_java_lang_ArrayStoreException
-    jsr     ra,new_exception
+    jsr     ra,new_arraystoreexception
     ldgp    gp,0(ra)
        mov     v0,xptr
        ldq     ra,0(sp)
@@ -1102,7 +1328,7 @@ nb_aastore_throw:
 
        mov     ra,xpc                    /* faulting address is return adress    */
        br      asm_handle_nat_exception
-
+#endif
        .end    asm_builtin_aastore
 
 
@@ -1231,14 +1457,14 @@ asm_switchstackandcall:
 asm_getclassvalues_atomic:
 _crit_restart2:
 _crit_begin2:
-       ldq t0,offbaseval(a0)
-       ldq t1,offdiffval(a0)
-       ldq t2,offbaseval(a1)
+       ldl     t0,offbaseval(a0)
+       ldl     t1,offdiffval(a0)
+       ldl     t2,offbaseval(a1)
 _crit_end2:
-       stq t0,offcast_super_baseval(a2)
-       stq t1,offcast_super_diffval(a2)
-       stq t2,offcast_sub_baseval(a2)
-       jmp zero,(ra)
+       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
 
@@ -1246,14 +1472,38 @@ _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
+    .quad   _crit_begin1
+    .quad   _crit_end1
+    .quad   _crit_restart1
+    .quad   _crit_begin2
+    .quad   _crit_end2
+    .quad   _crit_restart2
 #endif
-    .quad 0
+    .quad   0
+
+
+       .ent asm_prepare_native_stackinfo
+asm_prepare_native_stackinfo:
+       lda sp,-24(sp)
+       stq ra,0(sp)
+       jsr ra,builtin_asm_get_stackframeinfo
+       stq v0,16(sp)
+       ldq t0,0(v0)
+       stq t0,8(sp)
+       ldq ra,0(sp)
+       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.