GNU header update.
[cacao.git] / src / vm / jit / alpha / asmpart.S
index aa43be2522fa4e53da04046d59e4e3b9f8f4df46..081fe32436f4b3b768d4500341534151d685c107 100644 (file)
@@ -1,20 +1,43 @@
-/* -*- 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
 
@@ -74,7 +97,7 @@
 #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 *******************************/
 
@@ -135,114 +164,6 @@ has_no_x_instr_set:
        .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)       *
@@ -252,23 +173,27 @@ calljava_xhandler:
 *   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                               */
@@ -276,7 +201,6 @@ call_name2:
        .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                  */
@@ -296,20 +220,18 @@ asm_calljavafunction:
 
        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
@@ -323,15 +245,19 @@ calljava_xhandler2:
 
        .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                               */
@@ -342,7 +268,6 @@ call_name3:
 asm_calljavafunction2:
 asm_calljavafunction2double:
 asm_calljavafunction2long:
-
        ldgp    gp,0(pv)
        lda     sp,-40(sp)                /* allocate stack space                 */
        stq     ra,0(sp)                  /* save return address                  */
@@ -401,22 +326,20 @@ calljava_nocopy:
 
        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
@@ -491,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)
@@ -516,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      */
@@ -524,93 +447,233 @@ noregchange:
        .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 ***************************
@@ -627,7 +690,6 @@ asm_dumpregistersandcall:
 
        .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                           */
@@ -635,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                  */
@@ -643,7 +705,6 @@ asm_handle_nat_exception:
 
        .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   */
@@ -676,7 +737,9 @@ ex_stack_loop:
        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                                  */
@@ -691,6 +754,7 @@ ex_trace:
        
        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:
@@ -703,17 +767,81 @@ 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           */
@@ -839,6 +967,93 @@ ex_flt2:
        .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              *
@@ -846,17 +1061,29 @@ ex_flt2:
 *******************************************************************************/
 
        .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
 
 
@@ -867,17 +1094,29 @@ nb_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
 
 
@@ -888,17 +1127,18 @@ nb_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
 
 
@@ -909,17 +1149,18 @@ nb_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
 
 
@@ -930,17 +1171,18 @@ nb_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
 
 
@@ -951,50 +1193,21 @@ nb_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                     *
@@ -1002,8 +1215,8 @@ nb_ccast_throw:
 *******************************************************************************/
 
        .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                  */
@@ -1017,11 +1230,23 @@ asm_builtin_checkarraycast:
        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
 
 
@@ -1032,8 +1257,8 @@ nb_carray_throw:
 *******************************************************************************/
 
        .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                            */
@@ -1056,21 +1281,54 @@ asm_builtin_aastore:
        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
 
 
@@ -1081,8 +1339,8 @@ nb_aastore_throw:
 *******************************************************************************/
 
        .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)
@@ -1102,6 +1360,7 @@ asm_initialize_thread_stack:
        stq     a0, 120(a1)
        mov     a1, v0
        jmp     zero,(ra)
+
        .end    asm_initialize_thread_stack
 
 
@@ -1114,8 +1373,8 @@ 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)
@@ -1155,6 +1414,7 @@ asm_perform_threadswitch:
        mov     ra, pv
        addq    sp, 128, sp
        jmp     zero,(ra)
+
        .end    asm_perform_threadswitch
 
 
@@ -1173,6 +1433,7 @@ 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                   */
@@ -1191,144 +1452,68 @@ asm_switchstackandcall:
 
        .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:
+ */