Merged revisions 7642-7664 via svnmerge from
[cacao.git] / src / vm / jit / alpha / asmpart.S
index 04a3968eecf98ba311d46ec5bb65a607156e5b42..25ceb1da460d34c07988017cc1f80f030117149d 100644 (file)
@@ -1,10 +1,9 @@
-/* jit/alpha/asmpart.S - Java-C interface functions for alpha
+/* src/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, 2006, 2007 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.
 
 
    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.
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+   $Id: asmpart.S 7661 2007-04-03 22:29:59Z twisti $
 
-   Authors: Andreas Krall
-            Reinhard Grafl
+*/
 
-   $Id: asmpart.S 963 2004-03-15 07:37:49Z jowenn $
 
-*/
+#include "config.h"
+
+#include "vm/jit/alpha/md-abi.h"
+#include "vm/jit/alpha/md-asm.h"
+#include "vm/jit/alpha/offsets.h"
+
+#include "vm/jit/abi-asm.h"
+#include "vm/jit/methodheader.h"
 
-        
-#include "offsets.h"
-
-#define v0      $0
-
-#define t0      $1
-#define t1      $2
-#define t2      $3
-#define t3      $4
-#define t4      $5
-#define t5      $6
-#define t6      $7
-#define t7      $8
-
-#define        s0      $9
-#define        s1      $10
-#define        s2      $11
-#define        s3      $12
-#define        s4      $13
-#define        s5      $14
-#define        s6      $15
-
-#define a0      $16
-#define a1      $17
-#define a2      $18
-#define a3      $19
-#define a4      $20
-#define a5      $21
-
-#define t8      $22
-#define t9      $23
-#define t10     $24
-#define t11     $25
-#define ra      $26
-#define t12     $27
-
-#define pv      t12
-#define AT      $at
-#define gp      $29
-#define sp      $30
-#define zero    $31
-
-#define itmp1   $25
-#define itmp2   $28
-#define itmp3   $29
-
-#define xptr    itmp1
-#define xpc     itmp2
-
-#define sf0     $f2
-#define sf1     $f3
-#define sf2     $f4
-#define sf3     $f5
-#define sf4     $f6
-#define sf5     $f7
-#define sf6     $f8
-#define sf7     $f9
-
-#define fzero   $f31
-
-
-#define PAL_imb 134
 
        .text
        .set    noat
        .set    noreorder
 
 
-/********************* exported functions and variables ***********************/
+/* export functions ***********************************************************/
+
+       .globl asm_vm_call_method
+       .globl asm_vm_call_method_int
+       .globl asm_vm_call_method_long
+       .globl asm_vm_call_method_float
+       .globl asm_vm_call_method_double
+       .globl asm_vm_call_method_exception_handler
+       .globl asm_vm_call_method_end
 
-       .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_dumpregistersandcall
+
        .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_builtin_monitorenter
-       .globl asm_builtin_monitorexit
-       .globl asm_builtin_idiv
-       .globl asm_builtin_irem
-       .globl asm_builtin_ldiv
-       .globl asm_builtin_lrem
-       .globl asm_perform_threadswitch
-       .globl asm_initialize_thread_stack
-       .globl asm_switchstackandcall
-       .globl asm_getcallingmethod
-       .globl asm_builtin_trace
-       .globl asm_builtin_exittrace
-
-/*************************** imported functions *******************************/
-
-       .globl jit_compile
-       .globl builtin_monitorexit
-       .globl builtin_throw_exception
-       .globl builtin_trace_exception
-       .globl class_java_lang_Object
-
-
-/*********************** function has_no_x_instr_set ***************************
-*                                                                              *
-*   determines if the byte support instruction set (21164a and higher)         *
-*   is available.                                                              *
-*                                                                              *
-*******************************************************************************/
-
-       .ent    has_no_x_instr_set
-has_no_x_instr_set:
-
-       .long   0x47e03c20                /* amask   1,v0                         */
-       jmp     zero,(ra)                 /* return                               */
-
-       .end    has_no_x_instr_set
-
-
-/********************* function synchronize_caches ****************************/
 
-       .ent    synchronize_caches
+       .globl asm_abstractmethoderror
 
-synchronize_caches:
-       call_pal PAL_imb                  /* synchronise instruction cache        */
-       jmp     zero,(ra)                 /* return                               */
+       .globl asm_patcher_wrapper
 
-       .end    synchronize_caches
+#if defined(ENABLE_REPLACEMENT)
+       .globl asm_replacement_out
+       .globl asm_replacement_in
+#endif
 
+       .globl asm_compare_and_swap
+       .globl asm_memory_barrier
 
-#define        MethodPointer   -8
-#define        FrameSize       -12
-#define     IsSync          -16
-#define     IsLeaf          -20
-#define     IntSave         -24
-#define     FltSave         -28
-#define     LineNumberTableSize     -32
-#define     LineNumberTableStart    -40
-#define     ExTableSize             -48
-#define     ExTableStart            -48
+       .globl asm_criticalsections
+       .globl asm_getclassvalues_atomic
 
+       .globl asm_md_init
+       .globl asm_cacheflush
 
-#define     ExEntrySize     -32
-#define     ExStartPC       -8
-#define     ExEndPC         -16
-#define     ExHandlerPC     -24
-#define     ExCatchType     -32
 
-#define LineEntrySize   -16
-#define LinePC          0
-#define LineLine        -8
-
-
-/********************* function asm_calljavafunction ***************************
+/* asm_vm_call_method **********************************************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
 *   with up to 4 address parameters.                                           *
@@ -202,126 +90,71 @@ synchronize_caches:
 *                                                                              *
 *******************************************************************************/
 
-       .ent    asm_calljavafunction
-
-call_name:
-       .ascii  "calljavafunction\0\0"
+       .ent    asm_vm_call_method
 
        .align  3
-       .quad   0                         /* catch type all                       */
-       .quad   calljava_xhandler         /* handler pc                           */
-       .quad   calljava_xhandler         /* end pc                               */
-       .quad   asm_calljavafunction      /* start pc                             */
-       .long   1                         /* extable size                         */
-       .quad   0                         /* line number table start              */
-       .quad   0                         /* line number table 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_calljavafunction:
-       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_calljavafunction-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                     */
-
-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_calljavafunction
-
-
-
-
-       .ent    asm_calljavafunction2
-
-call_name2:
-       .ascii  "calljavafunction2\0\0"
-
-       .align  3
-       .quad   0                         /* catch type all                       */
-       .quad   calljava_xhandler2        /* handler pc                           */
-       .quad   calljava_xhandler2        /* end pc                               */
-       .quad   asm_calljavafunction2     /* start pc                             */
-       .long   1                         /* extable size                         */
-       .quad   0                         /* line number table start              */
-       .quad   0                         /* line number table size               */
-       .long   0                         /* fltsave                              */
-       .long   1                         /* intsave                              */
-       .long   0                         /* isleaf                               */
-       .long   0                         /* IsSync                               */
-       .long   40                        /* frame size                           */
-       .quad   0                         /* method pointer (pointer to name)     */
-
-asm_calljavafunction2:
-asm_calljavafunction2double:
-asm_calljavafunction2long:
+       .quad   0                           /* catch type all                     */
+       .quad   0                           /* handler pc                         */
+       .quad   0                           /* end pc                             */
+       .quad   0                           /* start pc                           */
+       .long   1                           /* extable size                       */
+       .long   0                           /* ALIGNMENT PADDING                  */
+       .quad   0                           /* line number table start            */
+       .quad   0                           /* line number table size             */
+       .long   0                           /* ALIGNMENT PADDING                  */
+       .long   0                           /* fltsave                            */
+       .long   1                           /* intsave                            */
+       .long   0                           /* isleaf                             */
+       .long   0                           /* IsSync                             */
+       .long   0                           /* frame size                         */
+       .quad   0                           /* codeinfo pointer                   */
+
+asm_vm_call_method:
+asm_vm_call_method_int:
+asm_vm_call_method_long:
+asm_vm_call_method_float:
+asm_vm_call_method_double:
        ldgp    gp,0(pv)
-       lda     sp,-40(sp)                /* allocate stack space                 */
-       stq     ra,0(sp)                  /* save return address                  */
-       stq     s6,24(sp)
-       stq     gp,8(sp)                  /* save global pointer                  */
+       lda     sp,-5*8(sp)               /* allocate stack space                 */
+       stq     ra,0*8(sp)                /* save return address                  */
+       stq     gp,1*8(sp)                /* save global pointer                  */
+       stq     s6,3*8(sp)
+
+       stq     a0,4*8(sp)                /* save method pointer for compiler     */
 
-       stq     a0,32(sp)                 /* save method pointer for compiler     */
-       mov     a3,t0                     /* pointer to arg block                 */
+       mov     a2,t0                     /* pointer to arg block                 */
        mov     a1,s6                     /* arg count                            */
 
        ble     s6,calljava_argsloaded
        lda     s6,-1(s6)
-       ldq     a0,offjniitem(t0)
-       ldt     $f16,offjniitem(t0)
+       ldq     a0,offvmargdata(t0)
+       ldt     $f16,offvmargdata(t0)
        ble     s6,calljava_argsloaded
+
        lda     s6,-1(s6)
-       ldq     a1,offjniitem+sizejniblock*1(t0)
-       ldt     $f17,offjniitem+sizejniblock*1(t0)
+       ldq     a1,offvmargdata+sizevmarg*1(t0)
+       ldt     $f17,offvmargdata+sizevmarg*1(t0)
        ble     s6,calljava_argsloaded
+
        lda     s6,-1(s6)
-       ldq     a2,offjniitem+sizejniblock*2(t0)
-       ldt     $f18,offjniitem+sizejniblock*2(t0)
+       ldq     a2,offvmargdata+sizevmarg*2(t0)
+       ldt     $f18,offvmargdata+sizevmarg*2(t0)
        ble     s6,calljava_argsloaded
+
        lda     s6,-1(s6)
-       ldq     a3,offjniitem+sizejniblock*3(t0)
-       ldt     $f19,offjniitem+sizejniblock*3(t0)
+       ldq     a3,offvmargdata+sizevmarg*3(t0)
+       ldt     $f19,offvmargdata+sizevmarg*3(t0)
        ble     s6,calljava_argsloaded
+
        lda     s6,-1(s6)
-       ldq     a4,offjniitem+sizejniblock*4(t0)
-       ldt     $f20,offjniitem+sizejniblock*4(t0)
+       ldq     a4,offvmargdata+sizevmarg*4(t0)
+       ldt     $f20,offvmargdata+sizevmarg*4(t0)
        ble     s6,calljava_argsloaded
+
        lda     s6,-1(s6)
-       ldq     a5,offjniitem+sizejniblock*5(t0)
-       ldt     $f21,offjniitem+sizejniblock*5(t0)
+       ldq     a5,offvmargdata+sizevmarg*5(t0)
+       ldt     $f21,offvmargdata+sizevmarg*5(t0)
 calljava_argsloaded:
        mov     sp,t4
        ble     s6,calljava_nocopy
@@ -330,1007 +163,699 @@ calljava_argsloaded:
        s8addq  t1,t4,t2
 
 calljava_copyloop:
-       ldq     t3,offjniitem+sizejniblock*6(t0)
+       ldq     t3,offvmargdata+sizevmarg*6(t0)
        stq     t3,0(t2)
        lda     t1,1(t1)
-       lda     t0,sizejniblock(t0)
+       lda     t0,sizevmarg(t0)
        lda     t2,8(t2)
        bne     t1,calljava_copyloop
 
 calljava_nocopy:
-       lda     v0,32(t4)                 /* pass pointer to method pointer via v0*/
+       ldq     itmp1,4*8(t4)             /* pass method pointer via itmp1        */
 
-       lda     $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
-       stq     $28,16(t4)                /* store function address               */
-       lda     $28,8(t4)                 /* set method pointer                   */
+       lda     mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
+       stq     mptr,2*8(t4)              /* store function address               */
+       lda     mptr,1*8(t4)              /* set method pointer                   */
 
-       ldq     pv,8($28)                 /* method call as in Java               */
+       ldq     pv,1*8(mptr)              /* method call as in Java               */
        jmp     ra,(pv)                   /* call JIT compiler                    */
 calljava_jit2:
-       lda     pv,-200(ra)               /* asm_calljavafunction-calljava_jit !!!*/
+       lda     pv,(asm_vm_call_method - calljava_jit2)(ra)
 
        s8addq  s6,sp,sp
 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                     */
+       ldq     ra,0*8(sp)                /* restore return address               */
+       ldq     gp,1*8(sp)                /* restore global pointer               */
+       ldq     s6,3*8(sp)
+       lda     sp,5*8(sp)                /* free stack space                     */
 
 calljava_ret2:
        jmp     zero,(ra)
 
-calljava_xhandler2:
+asm_vm_call_method_exception_handler:
        s8addq  s6,sp,sp
-       ldq     gp,8(sp)                  /* restore global pointer               */
+       ldq     gp,1*8(sp)                /* restore global pointer               */
        mov     itmp1,a0
        jsr     ra,builtin_throw_exception
-       ldq     ra,0(sp)                  /* restore return address               */
-       ldq     s6,24(sp)
-       lda     sp,40(sp)                 /* free stack space                     */
+       ldq     ra,0*8(sp)                /* restore return address               */
+       ldq     s6,3*8(sp)
+       lda     sp,5*8(sp)                /* free stack space                     */
+asm_vm_call_method_end:                                        
        jmp     zero,(ra)
-       .end    asm_calljavafunction2
-                                               
 
-/****************** function asm_call_jit_compiler *****************************
-*                                                                              *
-*   invokes the compiler for untranslated JavaVM methods.                      *
-*                                                                              *
-*   Register R0 contains a pointer to the method info structure (prepared      *
-*   by createcompilerstub). Using the return address in R26 and the            *
-*   offset in the LDA instruction or using the value in methodptr R28 the      *
-*   patching address for storing the method address can be computed:           *
-*                                                                              *
-*   method address was either loaded using                                     *
-*   M_LDQ (REG_PV, REG_PV, a)        ; invokestatic/special    ($27)           *
-*   M_LDA (REG_PV, REG_RA, low)                                                *
-*   M_LDAH(REG_PV, REG_RA, high)     ; optional                                *
-*   or                                                                         *
-*   M_LDQ (REG_PV, REG_METHODPTR, m) ; invokevirtual/interface ($28)           *
-*   in the static case the method pointer can be computed using the            *
-*   return address and the lda function following the jmp instruction          *
-*                                                                              *
-*******************************************************************************/
+       .end    asm_vm_call_method
 
 
+/* asm_call_jit_compiler *******************************************************
+
+   Invokes the compiler for untranslated Java methods.
+
+*******************************************************************************/
+
        .ent    asm_call_jit_compiler
-asm_call_jit_compiler:
 
+asm_call_jit_compiler:
        ldgp    gp,0(pv)
-       ldl     t8,-8(ra)             /* load instruction LDQ PV,xxx($yy)         */
-       srl     t8,16,t8              /* shift right register number $yy          */
-       and     t8,31,t8              /* isolate register number                  */
-       subl    t8,28,t8              /* test for REG_METHODPTR                   */
-       beq     t8,noregchange       
-       ldl     t8,0(ra)              /* load instruction LDA PV,xxx(RA)          */
-       sll     t8,48,t8
-       sra     t8,48,t8              /* isolate offset                           */
-       addq    t8,ra,$28             /* compute update address                   */
-       ldl     t8,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
-       srl     t8,16,t8              /* isolate instruction code                 */
-       lda     t8,-0x177b(t8)        /* test for LDAH                            */
-       bne     t8,noregchange       
-       ldl     t8,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
-       sll     t8,16,t8              /* compute high offset                      */
-       addl    t8,0,t8               /* sign extend high offset                  */
-       addq    t8,$28,$28            /* compute update address                   */
-noregchange:
-       lda     sp,-14*8(sp)          /* reserve stack space                      */
-       stq     a0,0*8(sp)            /* save all argument registers              */
-       stq     a1,1*8(sp)            /* they could be used by method             */
-       stq     a2,2*8(sp)
-       stq     a3,3*8(sp)
-       stq     a4,4*8(sp)
-       stq     a5,5*8(sp)
-       stt     $f16,6*8(sp)
-       stt     $f17,7*8(sp)
-       stt     $f18,8*8(sp)
-       stt     $f19,9*8(sp)
-       stt     $f20,10*8(sp)
-       stt     $f21,11*8(sp)
-       stq     $28,12*8(sp)          /* save method pointer                      */
-       stq     ra,13*8(sp)           /* save return address                      */
-
-       ldq     a0,0(v0)              /* pass 'methodinfo' pointer to             */
-       jsr     ra,jit_compile        /* jit compiler                             */
-       ldgp    gp,0(ra)
+       lda     sp,-(ARG_CNT+2)*8(sp) /* +2: keep stack 16-byte aligned           */
+
+       stq     ra,0*8(sp)            /* save return address                      */
+
+       SAVE_ARGUMENT_REGISTERS(1)    /* save 6 int/6 float argument registers    */
+
+       mov     itmp1,a0              /* pass methodinfo pointer                  */
+       mov     mptr,a1               /* pass method pointer                      */
+       lda     a2,(ARG_CNT+2)*8(sp)  /* pass java sp                             */
+       mov     ra,a3
+       jsr     ra,jit_asm_compile    /* call jit compiler                        */
+       mov     v0,pv
+
+       ldq     ra,0*8(sp)            /* load return address                      */
+
+       RESTORE_ARGUMENT_REGISTERS(1) /* restore 6 int/6 float argument registers */
+
+       lda     sp,(ARG_CNT+2)*8(sp)  /* remove stack frame                       */
 
-       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)
-       ldq     a3,3*8(sp)
-       ldq     a4,4*8(sp)
-       ldq     a5,5*8(sp)
-       ldt     $f16,6*8(sp)
-       ldt     $f17,7*8(sp)
-       ldt     $f18,8*8(sp)
-       ldt     $f19,9*8(sp)
-       ldt     $f20,10*8(sp)
-       ldt     $f21,11*8(sp)
-       ldq     $28,12*8(sp)          /* load method pointer                      */
-       ldq     ra,13*8(sp)           /* load return address                      */
-       lda     sp,14*8(sp)           /* deallocate stack area                    */
-
-       ldl     t8,-8(ra)             /* load instruction LDQ PV,xxx($yy)         */
-       sll     t8,48,t8
-       sra     t8,48,t8              /* isolate offset                           */
-
-       addq    t8,$28,t8             /* compute update address via method pointer*/
-       stq     v0,0(t8)              /* save new method address there            */
-
-       mov     v0,pv                 /* load method address into pv              */
-
-       jmp     zero,(pv)             /* and call method. The method returns      */
+       beq     pv,L_asm_call_jit_compiler_exception
+
+       jmp     zero,(pv)             /* and call method, the method returns      */
                                      /* directly to the caller (ra).             */
 
+L_asm_call_jit_compiler_exception:
+       subq    sp,2*8,sp
+       stq     ra,0*8(sp)            /* save return address (xpc)                */
+       jsr     ra,exceptions_get_and_clear_exception
+       ldq     ra,0*8(sp)            /* restore return address (xpc)             */
+       addq    sp,2*8,sp
+
+       mov     v0,xptr               /* get exception                            */
+       subq    ra,4,xpc              /* exception address is ra - 4              */
+       br      L_asm_handle_nat_exception
+
        .end    asm_call_jit_compiler
 
 
-/****************** function asm_dumpregistersandcall **************************
-*                                                                              *
-*   This funtion saves all callee saved registers and calls the function       *
-*   which is passed as parameter.                                              *
-*                                                                              *
-*   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.                                *
-*                                                                              *
-*   void asm_dumpregistersandcall (functionptr f);                             *
-*                                                                              *
-*******************************************************************************/
+/* asm_handle_exception ********************************************************
+
+   This function handles an exception. It does not use the usual calling
+   conventions. The exception pointer is passed in REG_ITMP1 and the
+   pc from the exception raising position is passed in REG_ITMP2. It searches
+   the local exception table for a handler. If no one is found, it unwinds
+   stacks and continues searching the callers.
+
+   ATTENTION: itmp3 == gp!
 
-       .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
-
-
-/********************* function asm_handle_exception ***************************
-*                                                                              *
-*   This function handles an exception. It does not use the usual calling      *
-*   conventions. The exception pointer is passed in REG_ITMP1 and the          *
-*   pc from the exception raising position is passed in REG_ITMP2. It searches *
-*   the local exception table for a handler. If no one is found, it unwinds    *
-*   stacks and continues searching the callers.                                *
-*                                                                              *
-*   void asm_handle_exception (exceptionptr, exceptionpc);                     *
-*                                                                              *
 *******************************************************************************/
 
        .ent    asm_handle_nat_exception
+
 asm_handle_nat_exception:
+L_asm_handle_nat_exception:       /* required for PIC code                    */
+L_asm_handle_exception_stack_loop:
+       lda     sp,-6*8(sp)                 /* keep stack 16-byte aligned         */
+       stq     xptr,0*8(sp)                /* save xptr                          */
+       stq     xpc,1*8(sp)                 /* save xpc                           */
+       stq     ra,3*8(sp)                  /* save RA                            */
+       stq     zero,4*8(sp)                /* save maybe-leaf flag (cleared)     */
+
+       mov     ra,a0                       /* pass RA                            */
+
+       br      ra,L_asm_handle_exception_load_gp
+L_asm_handle_exception_load_gp:
+       ldgp    gp,0(ra)                    /* load gp                            */
 
-       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_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                   */
+       jsr     ra,md_codegen_get_pv_from_pc/* get PV from RA                     */
+       stq     v0,2*8(sp)                  /* save PV                            */
+
+       ldq     a0,0*8(sp)                  /* pass xptr                          */
+       ldq     a1,1*8(sp)                  /* pass xpc                           */
+       mov     v0,a2                       /* pass PV                            */
+       addq    sp,6*8,a3                   /* pass Java SP                       */
+
+       br      L_asm_handle_exception_continue
 
        .aent    asm_handle_exception
+
 asm_handle_exception:
+L_asm_handle_exception:                 /* required for PIC code              */
+       lda     sp,-(ARG_CNT+TMP_CNT)*8(sp) /* create maybe-leaf stackframe       */
 
-       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   */
-       stq     t2,2*8(sp)
-       stq     t3,3*8(sp)
-       stq     t4,4*8(sp)
-       stq     t5,5*8(sp)
-       stq     t6,6*8(sp)
-       stq     t7,7*8(sp)
-       stq     t8,8*8(sp)
-       stq     t9,9*8(sp)
-       stq     t10,10*8(sp)
-       stq     v0,11*8(sp)
-       stq     a0,12*8(sp)
-       stq     a1,13*8(sp)
-       stq     a2,14*8(sp)
-       stq     a3,15*8(sp)
-       stq     a4,16*8(sp)
-       stq     a5,17*8(sp)
-
-       lda     t3,1(zero)            /* set no unwind flag                       */
-ex_stack_loop:
-       lda     sp,-5*8(sp)           /* allocate stack                           */
-       stq     xptr,0*8(sp)          /* save used register                       */
-       stq     xpc,1*8(sp)
-       stq     pv,2*8(sp)
-       stq     ra,3*8(sp)
-       stq     t3,4*8(sp)
-
-       mov     xptr,a0
-       ldq     a1,MethodPointer(pv)
-       mov     xpc,a2
-/*     mov     t3,a3 */
-       lda             a3,1(zero)
-       br      ra,ex_trace           /* set ra for gp loading                    */
-ex_trace:
-       ldgp    gp,0(ra)              /* load gp                                  */
-       jsr     ra,builtin_trace_exception /* trace_exception(xptr,methodptr)     */
-       
-       ldq     xptr,0*8(sp)          /* restore used register                    */
-       ldq     xpc,1*8(sp)
-       ldq     pv,2*8(sp)
-       ldq     ra,3*8(sp)
-       ldq     t3,4*8(sp)
-       lda     sp,5*8(sp)            /* deallocate stack                         */
-       
-       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     t2,ExStartPC(t1)      /* t2 = exception start pc                  */
-       cmple   t2,xpc,t2             /* t2 = (startpc <= xpc)                    */
-       beq     t2,ex_table_cont      /* if (false) continue                      */
-       ldq     t2,ExEndPC(t1)        /* t2 = exception end pc                    */
-       cmplt   xpc,t2,t2             /* t2 = (xpc < endpc)                       */
-       beq     t2,ex_table_cont      /* if (false) continue                      */
-       ldq     a1,ExCatchType(t1)    /* arg1 = exception catch type              */
-       beq     a1,ex_handle_it       /* NULL catches everything                  */
-
-       ldq     a0,offobjvftbl(xptr)  /* a0 = vftblptr(xptr)                      */
-       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)                  */
-       subl    a0,v0,a0              /* a0 = baseval(xptr) - baseval(catchtype)  */
-       cmpule  a0,a1,v0              /* v0 = xptr is instanceof catchtype        */
-       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           */
-
-       ldq     t0,0*8(sp)            /* restore possible used registers          */
-       ldq     t1,1*8(sp)            /* also registers used by trace_exception   */
-       ldq     t2,2*8(sp)
-       ldq     t3,3*8(sp)
-       ldq     t4,4*8(sp)
-       ldq     t5,5*8(sp)
-       ldq     t6,6*8(sp)
-       ldq     t7,7*8(sp)
-       ldq     t8,8*8(sp)
-       ldq     t9,9*8(sp)
-       ldq     t10,10*8(sp)
-       ldq     v0,11*8(sp)
-       ldq     a0,12*8(sp)
-       ldq     a1,13*8(sp)
-       ldq     a2,14*8(sp)
-       ldq     a3,15*8(sp)
-       ldq     a4,16*8(sp)
-       ldq     a5,17*8(sp)
-       lda     sp,18*8(sp)           /* deallocate stack                         */
-
-ex_jump:
-       jmp     zero,(xpc)            /* jump to the handler                      */
-
-ex_table_cont:
-       lda     t1,ExEntrySize(t1)    /* next exception table entry               */
-       subl    t0,1,t0               /* decrement entry counter                  */
-       bgt     t0,ex_table_loop      /* if (t0 > 0) next entry                   */
-
-empty_table:
-       beq     t3,ex_already_cleared /* if here the first time, then             */
-       lda     sp,18*8(sp)           /* deallocate stack and                     */
-       clr     t3                    /* clear the no unwind flag                 */
-ex_already_cleared:
-       ldl     t0,IsSync(pv)         /* t0 = SyncOffset                          */
-       beq     t0,no_monitor_exit    /* if zero no monitorexit                   */
-       addq    sp,t0,t0              /* add stackptr to Offset                   */
-       ldq     a0,-8(t0)             /* load monitorexit pointer                 */
-
-       lda     sp,-7*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)
-
-       br      ra,ex_mon_load        /* set ra for gp loading                    */
-ex_mon_load:
-       ldgp    gp,0(ra)              /* load gp                                  */
-       jsr     ra,builtin_monitorexit/* builtin_monitorexit(objectptr)           */
+       SAVE_ARGUMENT_REGISTERS(0)          /* we save arg and temp registers in  */
+       SAVE_TEMPORARY_REGISTERS(ARG_CNT)   /* case this is a leaf method         */
+
+       lda     sp,-6*8(sp)                 /* keep stack 16-byte aligned         */
+       stq     xptr,0*8(sp)                /* save xptr                          */
+       stq     pv,2*8(sp)                  /* save PV                            */
+       stq     ra,3*8(sp)                  /* save RA                            */
+       lda     t0,1(zero)                  /* set maybe-leaf flag                */
+       stq     t0,4*8(sp)                  /* save maybe-leaf flag               */
+
+       br      ra,L_asm_handle_exception_load_gp_2
+L_asm_handle_exception_load_gp_2:
+       ldgp    gp,0(ra)                    /* load gp                            */
+
+       mov     xptr,a0                     /* pass xptr                          */
+       mov     xpc,a1                      /* pass xpc                           */
+       mov     pv,a2                       /* pass PV                            */
+       lda     a3,(ARG_CNT+TMP_CNT+6)*8(sp)/* pass Java SP                       */
+
+L_asm_handle_exception_continue:
+       jsr     ra,exceptions_handle_exception
+
+       beq     v0,L_asm_handle_exception_not_catched
+
+       mov     v0,xpc                      /* move handlerpc into xpc            */
+       ldq     xptr,0*8(sp)                /* restore xptr                       */
+       ldq     pv,2*8(sp)                  /* restore PV                         */
+       ldq     ra,3*8(sp)                  /* restore RA                         */
+       ldq     t0,4*8(sp)                  /* get maybe-leaf flag                */
+       lda     sp,6*8(sp)                  /* free stack frame                   */
+
+       beq     t0,L_asm_handle_exception_no_leaf
+
+       RESTORE_ARGUMENT_REGISTERS(0)       /* if this is a leaf method, we have  */
+       RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers  */
        
-       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)
-       lda     sp,7*8(sp)            /* deallocate stack                         */
-
-no_monitor_exit:
-       ldl     t0,FrameSize(pv)      /* t0 = frame size                          */
-       addq    sp,t0,sp              /* unwind stack                             */
-       mov     sp,t0                 /* t0 = pointer to save area                */
-       ldl     t1,IsLeaf(pv)         /* t1 = is leaf procedure                   */
-       bne     t1,ex_no_restore      /* if (leaf) skip                           */
-       ldq     ra,-8(t0)             /* restore ra                               */
-       lda     t0,-8(t0)             /* t0--                                     */
-ex_no_restore:
-       mov     ra,xpc                /* the new xpc is ra                        */
-       ldl     t1,IntSave(pv)        /* t1 = saved int register count            */
-       br      t2,ex_int1            /* t2 = current pc                          */
+       lda     sp,(ARG_CNT+TMP_CNT)*8(sp)  /* remove maybe-leaf stackframe       */
+
+L_asm_handle_exception_no_leaf:
+       jmp     zero,(xpc)                  /* jump to the handler                */
+
+L_asm_handle_exception_not_catched:
+       ldq     xptr,0*8(sp)                /* restore xptr                       */
+       ldq     pv,2*8(sp)                  /* restore PV                         */
+       ldq     ra,3*8(sp)                  /* restore RA                         */
+       ldq     t0,4*8(sp)                  /* get maybe-leaf flag                */
+       lda     sp,6*8(sp)
+
+       beq     t0,L_asm_handle_exception_no_leaf_stack
+
+       lda     sp,(ARG_CNT+TMP_CNT)*8(sp)  /* remove maybe-leaf stackframe       */
+       mov     zero,t0                     /* clear the maybe-leaf flag          */
+
+L_asm_handle_exception_no_leaf_stack:
+       ldl     t1,FrameSize(pv)            /* get frame size                     */
+       addq    t1,sp,t1                    /* pointer to save area               */
+
+       ldl     t2,IsLeaf(pv)               /* is leaf procedure                  */
+       bne     t2,L_asm_handle_exception_no_ra_restore
+
+       ldq     ra,-1*8(t1)                 /* restore ra                         */
+       subq    t1,8,t1                     /* t1--                               */
+
+L_asm_handle_exception_no_ra_restore:
+       mov     ra,xpc                      /* the new xpc is ra                  */
+       ldl     t2,IntSave(pv)              /* t2 = saved int register count      */
+       br      t3,ex_int1                  /* t3 = current pc                    */
 ex_int1:
-       lda     t2,44(t2)             /* lda t2,ex_int2-ex_int1(t2) !!!!!!!!!!!!! */
-       negl    t1,t1                 /* negate register count                    */
-       s4addq  t1,t2,t2              /* t2 = ex_int_sav - 4 * register count     */
-       jmp     zero,(t2)             /* jump to save position                    */
-       ldq     s0,-56(t0)
-       ldq     s1,-48(t0)
-       ldq     s2,-40(t0)
-       ldq     s3,-32(t0)
-       ldq     s4,-24(t0)
-       ldq     s5,-16(t0)
-       ldq     s6,-8(t0)
+       lda     t3,(ex_int2 - ex_int1)(t3)
+       negl    t2,t2                       /* negate register count              */
+       s4addq  t2,t3,t3                    /* t2 = IntSave - register count * 4  */
+       jmp     zero,(t3)                   /* jump to save position              */
+
+       ldq     s0,-7*8(t1)
+       ldq     s1,-6*8(t1)
+       ldq     s2,-5*8(t1)
+       ldq     s3,-4*8(t1)
+       ldq     s4,-3*8(t1)
+       ldq     s5,-2*8(t1)
+       ldq     s6,-1*8(t1)
+
 ex_int2:
-       s8addq  t1,t0,t0              /* t0 = t0 - 8 * register count             */
+       s8addq  t2,t1,t1                    /* t1 = t1 - 8 * register count       */
 
-       ldl     t1,FltSave(pv)        /* t1 = saved flt register count            */
-       br      t2,ex_flt1            /* t2 = current pc                          */
+       ldl     t2,FltSave(pv)              /* t2 = saved flt register count      */
+       br      t3,ex_flt1                  /* t3 = current pc                    */
 ex_flt1:
-       lda     t2,48(t2)             /* lda t2,ex_flt2-ex_flt1(t2) !!!!!!!!!!!!! */
-       negl    t1,t1                 /* negate register count                    */
-       s4addq  t1,t2,t2              /* t2 = ex_flt_sav - 4 * register count     */
-       jmp     zero,(t2)             /* jump to save position                    */
-       ldt     $f2,-64(t0)
-       ldt     $f3,-56(t0)
-       ldt     $f4,-48(t0)
-       ldt     $f5,-40(t0)
-       ldt     $f6,-32(t0)
-       ldt     $f7,-24(t0)
-       ldt     $f8,-16(t0)
-       ldt     $f9,-8(t0)
+       lda     t3,(ex_flt2 - ex_flt1)(t3)
+       negl    t2,t2                       /* negate register count              */
+       s4addq  t2,t3,t3                    /* t2 = FltSave - 4 * register count  */
+       jmp     zero,(t3)                   /* jump to save position              */
+
+       ldt     fs0,-8*8(t1)
+       ldt     fs1,-7*8(t1)
+       ldt     fs2,-6*8(t1)
+       ldt     fs3,-5*8(t1)
+       ldt     fs4,-4*8(t1)
+       ldt     fs5,-3*8(t1)
+       ldt     fs6,-2*8(t1)
+       ldt     fs7,-1*8(t1)
+
 ex_flt2:
-       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,ex_stack_loop       
-       ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(RA)         */
-       sll     t0,16,t0              /* compute high offset                      */
-       addl    t0,0,t0               /* sign extend high offset                  */
-       addq    t0,pv,pv              /* compute update address                   */
-       br      ex_stack_loop
+       ldl     t1,FrameSize(pv)            /* get frame size                     */
+       addq    sp,t1,sp                    /* unwind stack                       */
+       br      L_asm_handle_exception_stack_loop
 
        .end    asm_handle_nat_exception
 
 
-/********************* asm_check_clinit ****************************************
-*                                                                              *
-*   Does null check and calls monitorenter or throws an exception              *
-*                                                                              *
+/* asm_abstractmethoderror *****************************************************
+
+   Creates and throws an AbstractMethodError.
+
 *******************************************************************************/
-               
-    .ent    asm_check_clinit
-asm_check_clinit:
-       ldgp    gp,0(pv)
 
-       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 funcs   */
-       stq             a1,2*8(sp)
-       stq             a2,3*8(sp)
-       stq             a3,4*8(sp)
-       stq             a4,5*8(sp)
-       stq             a5,6*8(sp)
-               
-       mov             itmp1,a0
-       jsr             ra,class_init
-               
-       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
-       
-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              */
-
-       jmp             zero,(ra)
+       .ent    asm_abstractmethoderror
+
+asm_abstractmethoderror:
+       subq    sp,2*8,sp                   /* create stackframe                  */
+       stq     ra,0*8(sp)                  /* save return address                */
+       addq    sp,2*8,a0                   /* pass java sp                       */
+       mov     ra,a1                       /* pass exception address             */
+       jsr     ra,exceptions_asm_new_abstractmethoderror
+       ldq     ra,0*8(sp)                  /* restore return address             */
+       addq    sp,2*8,sp                   /* remove stackframe                  */
+
+       mov     v0,xptr                     /* get exception pointer              */
+       subq    ra,4,xpc                    /* exception address is ra - 4        */
+       br      L_asm_handle_nat_exception
+
+       .end    asm_abstractmethoderror
+
+
+/* asm_patcher_wrapper *********************************************************
+
+   XXX
+
+   Stack layout:
+     40   return address into JIT code (patch position)
+     32   pointer to virtual java_objectheader
+     24   machine code (which is patched back later)
+     16   unresolved class/method/field reference
+      8   data segment displacement from load instructions
+      0   patcher function pointer to call (pv afterwards)
+
+   ATTENTION: itmp3 == gp! But we don't need gp do call the patcher function.
+
+*******************************************************************************/
                
-       .end    asm_check_clinit
+       .ent    asm_patcher_wrapper
+
+asm_patcher_wrapper:
+       lda     sp,-((2+12+27+4)*8)(sp) /* create stack frame                     */
+
+       SAVE_RETURN_REGISTERS(0)      /* save 1 int/1 float return registers      */
+       SAVE_ARGUMENT_REGISTERS(2)    /* save 6 int/6 float argument registers    */
+       SAVE_TEMPORARY_REGISTERS(14)  /* save 11 int/16 float temporary registers */
+
+       stq     itmp1,(2+12+27+0)*8(sp) /* save itmp1                             */
+       stq     itmp2,(2+12+27+1)*8(sp) /* save itmp2                             */
+       stq     ra,(2+12+27+2)*8(sp)  /* save method return address (for leafs)   */
+       stq     pv,(2+12+27+3)*8(sp)  /* save pv of calling java function         */
+
+       br      ra,L_asm_patcher_wrapper_load_gp
+L_asm_patcher_wrapper_load_gp:
+       ldgp    gp,0(ra)              /* load gp (it's not set correctly in jit)  */
+
+       lda     a0,(2+12+27+4)*8(sp)  /* pass SP of patcher stub                  */
+       mov     pv,a1                 /* pass PV                                  */
+       ldq     a2,(2+12+27+2)*8(sp)  /* pass RA (correct for leafs)              */
+       jsr     ra,patcher_wrapper
+       ldgp    gp,0(ra)
+       stq     v0,(0+2+12+27+4)*8(sp) /* save return value                       */
+
+       RESTORE_RETURN_REGISTERS(0)   /* restore 1 int/1 float return registers   */
+       RESTORE_ARGUMENT_REGISTERS(2) /* restore 6 int/6 float argument registers */
+       RESTORE_TEMPORARY_REGISTERS(14) /* restore 11 integer temporary registers */
+
+       ldq     itmp1,(2+12+27+0)*8(sp) /* restore itmp1                          */
+       ldq     itmp2,(2+12+27+1)*8(sp) /* restore itmp2                          */
+       ldq     ra,(2+12+27+2)*8(sp)  /* restore method return address (for leafs)*/
+       ldq     pv,(2+12+27+3)*8(sp)  /* restore pv of calling java function      */
+
+       ldq     itmp3,(0+2+12+27+4)*8(sp) /* get return value                     */
+       bne     itmp3,L_asm_patcher_wrapper_exception
+
+       ldq     itmp3,(5+2+12+27+4)*8(sp) /* get RA to JIT                        */
+       lda     sp,(6+2+12+27+4)*8(sp) /* remove stack frame                      */
+
+       jmp     zero,(itmp3)          /* jump to new patched code                 */
+
+L_asm_patcher_wrapper_exception:
+       mov     itmp3,xptr            /* get exception                            */
+       ldq     xpc,(5+2+12+27+4)*8(sp) /* RA is xpc                              */
+       lda     sp,(6+2+12+27+4)*8(sp) /* remove stack frame                      */
+       br      L_asm_handle_exception
+
+       .end    asm_patcher_wrapper
 
                
-/********************* function asm_builtin_monitorenter ***********************
-*                                                                              *
-*   Does null check and calls monitorenter or throws an exception              *
-*                                                                              *
-*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
 
-       .ent    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:
-       subq    sp,8,sp
-    stq     ra,0(sp)
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception_message
-    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
-       .end    asm_builtin_monitorenter
+/* asm_replacement_out *********************************************************
 
+   This code is jumped to from the replacement-out stubs that are executed
+   when a thread reaches an activated replacement point.
+
+   The purpose of asm_replacement_out is to read out the parts of the
+   execution state that cannot be accessed from C code, store this state,
+   and then call the C function replace_me.
+
+   Stack layout:
+     16                 start of stack inside method to replace
+      0   rplpoint *    info on the replacement point that was reached
+
+   NOTE: itmp3 has been clobbered by the replacement-out stub!
 
-/********************* function asm_builtin_monitorexit ************************
-*                                                                              *
-*   Does null check and calls monitorexit or throws an exception               *
-*                                                                              *
 *******************************************************************************/
 
-       .ent    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:
-       subq    sp,8,sp
-    stq     ra,0(sp)
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception_message
-    ldgp    gp,0(ra)
-       mov     v0,xptr
-    ldq     ra,0(sp)
-       addq    sp,8,sp
+/* some room to accomodate changes of the stack frame size during replacement */
+       /* XXX we should find a cleaner solution here */
+#define REPLACEMENT_ROOM  512
+
+#define REPLACEMENT_STACK_OFFSET ((sizeexecutionstate + REPLACEMENT_ROOM + 0xf) & ~0xf)
+
+       .ent asm_replacement_out
+
+asm_replacement_out:
+    /* create stack frame */
+       lda     sp,-(REPLACEMENT_STACK_OFFSET)(sp)
+
+       /* save registers in execution state */
+       stq     $0 ,( 0*8+offes_intregs)(sp)
+       stq     $1 ,( 1*8+offes_intregs)(sp)
+       stq     $2 ,( 2*8+offes_intregs)(sp)
+       stq     $3 ,( 3*8+offes_intregs)(sp)
+       stq     $4 ,( 4*8+offes_intregs)(sp)
+       stq     $5 ,( 5*8+offes_intregs)(sp)
+       stq     $6 ,( 6*8+offes_intregs)(sp)
+       stq     $7 ,( 7*8+offes_intregs)(sp)
+       stq     $8 ,( 8*8+offes_intregs)(sp)
+       stq     $9 ,( 9*8+offes_intregs)(sp)
+       stq     $10,(10*8+offes_intregs)(sp)
+       stq     $11,(11*8+offes_intregs)(sp)
+       stq     $12,(12*8+offes_intregs)(sp)
+       stq     $13,(13*8+offes_intregs)(sp)
+       stq     $14,(14*8+offes_intregs)(sp)
+       stq     $15,(15*8+offes_intregs)(sp)
+       stq     $16,(16*8+offes_intregs)(sp)
+       stq     $17,(17*8+offes_intregs)(sp)
+       stq     $18,(18*8+offes_intregs)(sp)
+       stq     $19,(19*8+offes_intregs)(sp)
+       stq     $20,(20*8+offes_intregs)(sp)
+       stq     $21,(21*8+offes_intregs)(sp)
+       stq     $22,(22*8+offes_intregs)(sp)
+       stq     $23,(23*8+offes_intregs)(sp)
+       stq     $24,(24*8+offes_intregs)(sp)
+       stq     $25,(25*8+offes_intregs)(sp)
+       stq     $26,(26*8+offes_intregs)(sp)
+       stq     $27,(27*8+offes_intregs)(sp)
+       stq     $28,(28*8+offes_intregs)(sp)
+       stq     $29,(29*8+offes_intregs)(sp)
+       stq     $30,(30*8+offes_intregs)(sp)
+       stq     $31,(31*8+offes_intregs)(sp)
        
-       lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
-       br      asm_handle_nat_exception
-       .end    asm_builtin_monitorexit
+       stt     $f0 ,( 0*8+offes_fltregs)(sp)
+       stt     $f1 ,( 1*8+offes_fltregs)(sp)
+       stt     $f2 ,( 2*8+offes_fltregs)(sp)
+       stt     $f3 ,( 3*8+offes_fltregs)(sp)
+       stt     $f4 ,( 4*8+offes_fltregs)(sp)
+       stt     $f5 ,( 5*8+offes_fltregs)(sp)
+       stt     $f6 ,( 6*8+offes_fltregs)(sp)
+       stt     $f7 ,( 7*8+offes_fltregs)(sp)
+       stt     $f8 ,( 8*8+offes_fltregs)(sp)
+       stt     $f9 ,( 9*8+offes_fltregs)(sp)
+       stt     $f10,(10*8+offes_fltregs)(sp)
+       stt     $f11,(11*8+offes_fltregs)(sp)
+       stt     $f12,(12*8+offes_fltregs)(sp)
+       stt     $f13,(13*8+offes_fltregs)(sp)
+       stt     $f14,(14*8+offes_fltregs)(sp)
+       stt     $f15,(15*8+offes_fltregs)(sp)
+       stt     $f16,(16*8+offes_fltregs)(sp)
+       stt     $f17,(17*8+offes_fltregs)(sp)
+       stt     $f18,(18*8+offes_fltregs)(sp)
+       stt     $f19,(19*8+offes_fltregs)(sp)
+       stt     $f20,(20*8+offes_fltregs)(sp)
+       stt     $f21,(21*8+offes_fltregs)(sp)
+       stt     $f22,(22*8+offes_fltregs)(sp)
+       stt     $f23,(23*8+offes_fltregs)(sp)
+       stt     $f24,(24*8+offes_fltregs)(sp)
+       stt     $f25,(25*8+offes_fltregs)(sp)
+       stt     $f26,(26*8+offes_fltregs)(sp)
+       stt     $f27,(27*8+offes_fltregs)(sp)
+       stt     $f28,(28*8+offes_fltregs)(sp)
+       stt     $f29,(29*8+offes_fltregs)(sp)
+       stt     $f30,(30*8+offes_fltregs)(sp)
+       stt     $f31,(31*8+offes_fltregs)(sp)
+       
+       /* calculate sp of method */
+       lda     itmp1,(REPLACEMENT_STACK_OFFSET + 2*8)(sp)
+       stq     itmp1,(offes_sp)(sp)
 
+       br      ra,L_asm_replacement_out_load_gp
+L_asm_replacement_out_load_gp:
+       ldgp    gp,0(ra)                    /* load gp                            */
 
-/************************ function asm_builtin_idiv ****************************
-*                                                                              *
-*   Does null check and calls idiv or throws an exception                      *
-*                                                                              *
-*******************************************************************************/
+       /* store pv */
+       stq     pv,(offes_pv)(sp)
 
-       .ent    asm_builtin_idiv
+       /* call replace_me */
+       ldq     a0,-(2*8)(itmp1)            /* arg0: rplpoint *                   */
+    mov     sp,a1                       /* arg1: execution state              */
+    jmp     zero,replace_me             /* call C function replace_me         */
+    jmp     zero,abort                  /* NEVER REACHED                      */
 
-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:
-       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
-       
-       lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
-       br      asm_handle_nat_exception
+       .end asm_replacement_out
 
-       .end    asm_builtin_idiv
+/* asm_replacement_in **********************************************************
 
+   This code writes the given execution state and jumps to the replacement
+   code.
+
+   This function never returns!
+
+   NOTE: itmp3 is not restored!
+
+   C prototype:
+      void asm_replacement_in(executionstate *es, replace_safestack_t *st);
 
-/************************ function asm_builtin_ldiv ****************************
-*                                                                              *
-*   Does null check and calls ldiv or throws an exception                      *
-*                                                                              *
 *******************************************************************************/
 
-       .ent    asm_builtin_ldiv
+       .ent asm_replacement_in
+       
+asm_replacement_in:
+       /* a0 == executionstate *es */
 
-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:
-       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
+       /* get arguments */
+       mov     a1,s1                       /* replace_safestack_t *st            */
+       mov     a0,s2                       /* executionstate *es == safe stack   */
 
-       lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
-       br      asm_handle_nat_exception
+       /* switch to the safe stack */
+       mov     s2,sp
 
-       .end    asm_builtin_ldiv
+       /* call replace_build_execution_state(st) */
+       mov             s1,a0
+       jsr             ra,replace_build_execution_state
 
+       /* set new sp */
+       ldq             sp,(offes_sp)(s2)
 
-/************************ function asm_builtin_irem ****************************
-*                                                                              *
-*   Does null check and calls irem or throws an exception                      *
-*                                                                              *
-*******************************************************************************/
+       /* build stack frame */
+       lda     sp,(-sizeexecutionstate)(sp)
 
-       .ent    asm_builtin_irem
+       /* call replace_free_safestack(st,& of allocated executionstate_t) */
+       mov             sp,a1 /* tmpes */
+       mov             s1,a0 /* st    */
+       jsr             ra,replace_free_safestack
 
-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:
-       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
+       /* set new pv */
+       ldq     pv,(offes_pv)(sp)
+       
+       /* copy registers from execution state */
+       ldq     $0 ,( 0*8+offes_intregs)(sp)
+       ldq     $1 ,( 1*8+offes_intregs)(sp)
+       ldq     $2 ,( 2*8+offes_intregs)(sp)
+       ldq     $3 ,( 3*8+offes_intregs)(sp)
+       ldq     $4 ,( 4*8+offes_intregs)(sp)
+       ldq     $5 ,( 5*8+offes_intregs)(sp)
+       ldq     $6 ,( 6*8+offes_intregs)(sp)
+       ldq     $7 ,( 7*8+offes_intregs)(sp)
+       ldq     $8 ,( 8*8+offes_intregs)(sp)
+       ldq     $9 ,( 9*8+offes_intregs)(sp)
+       ldq     $10,(10*8+offes_intregs)(sp)
+       ldq     $11,(11*8+offes_intregs)(sp)
+       ldq     $12,(12*8+offes_intregs)(sp)
+       ldq     $13,(13*8+offes_intregs)(sp)
+       ldq     $14,(14*8+offes_intregs)(sp)
+       ldq     $15,(15*8+offes_intregs)(sp)
+       ldq     a0, (16*8+offes_intregs)(sp)
+       ldq     $17,(17*8+offes_intregs)(sp)
+       ldq     $18,(18*8+offes_intregs)(sp)
+       ldq     $19,(19*8+offes_intregs)(sp)
+       ldq     $20,(20*8+offes_intregs)(sp)
+       ldq     $21,(21*8+offes_intregs)(sp)
+       ldq     $22,(22*8+offes_intregs)(sp)
+       ldq     $23,(23*8+offes_intregs)(sp)
+       ldq     $24,(24*8+offes_intregs)(sp)
+       ldq     $25,(25*8+offes_intregs)(sp)
+       ldq     $26,(26*8+offes_intregs)(sp)
+       /* $27 is pv                    */
+       ldq     $28,(28*8+offes_intregs)(sp)
+       ldq     $29,(29*8+offes_intregs)(sp)
+       /* $30 is sp                      */
+       /* $31 is zero                    */
+       
+       ldt     $f0 ,( 0*8+offes_fltregs)(sp)
+       ldt     $f1 ,( 1*8+offes_fltregs)(sp)
+       ldt     $f2 ,( 2*8+offes_fltregs)(sp)
+       ldt     $f3 ,( 3*8+offes_fltregs)(sp)
+       ldt     $f4 ,( 4*8+offes_fltregs)(sp)
+       ldt     $f5 ,( 5*8+offes_fltregs)(sp)
+       ldt     $f6 ,( 6*8+offes_fltregs)(sp)
+       ldt     $f7 ,( 7*8+offes_fltregs)(sp)
+       ldt     $f8 ,( 8*8+offes_fltregs)(sp)
+       ldt     $f9 ,( 9*8+offes_fltregs)(sp)
+       ldt     $f10,(10*8+offes_fltregs)(sp)
+       ldt     $f11,(11*8+offes_fltregs)(sp)
+       ldt     $f12,(12*8+offes_fltregs)(sp)
+       ldt     $f13,(13*8+offes_fltregs)(sp)
+       ldt     $f14,(14*8+offes_fltregs)(sp)
+       ldt     $f15,(15*8+offes_fltregs)(sp)
+       ldt     $f16,(16*8+offes_fltregs)(sp)
+       ldt     $f17,(17*8+offes_fltregs)(sp)
+       ldt     $f18,(18*8+offes_fltregs)(sp)
+       ldt     $f19,(19*8+offes_fltregs)(sp)
+       ldt     $f20,(20*8+offes_fltregs)(sp)
+       ldt     $f21,(21*8+offes_fltregs)(sp)
+       ldt     $f22,(22*8+offes_fltregs)(sp)
+       ldt     $f23,(23*8+offes_fltregs)(sp)
+       ldt     $f24,(24*8+offes_fltregs)(sp)
+       ldt     $f25,(25*8+offes_fltregs)(sp)
+       ldt     $f26,(26*8+offes_fltregs)(sp)
+       ldt     $f27,(27*8+offes_fltregs)(sp)
+       ldt     $f28,(28*8+offes_fltregs)(sp)
+       ldt     $f29,(29*8+offes_fltregs)(sp)
+       ldt     $f30,(30*8+offes_fltregs)(sp)
+       ldt     $f31,(31*8+offes_fltregs)(sp)
 
-       lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
-       br      asm_handle_nat_exception
+       /* load new pc */
 
-       .end    asm_builtin_irem
+       ldq     itmp3,offes_pc(sp)
 
+       /* remove stack frame */
 
-/************************ function asm_builtin_lrem ****************************
-*                                                                              *
-*   Does null check and calls lrem or throws an exception                      *
-*                                                                              *
-*******************************************************************************/
+       lda             sp,(sizeexecutionstate)(sp)
 
-       .ent    asm_builtin_lrem
+       /* jump to new code */
 
-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:
-       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
+       jmp     zero,(itmp3)
 
-       lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
-       br      asm_handle_nat_exception
+       .end asm_replacement_in
 
-       .end    asm_builtin_lrem
+#endif /* defined(ENABLE_REPLACEMENT) */
 
 
-/*********************** function new_builtin_checkcast ************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
+/* asm_compare_and_swap ********************************************************
 
-    .ent    asm_builtin_checkcast
-
-asm_builtin_checkcast:
-    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     a0,string_java_lang_ClassCastException
-       jsr     ra,new_exception
-       ldgp    gp,0(ra)
-       mov     v0,xptr
+   Does an atomic compare and swap.  Required for the lock
+   implementation.
 
-    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
+   Atomically do the following: Check if the location still contains
+   `oldval`. If so, replace it by `newval` and return `oldval`.
 
-    .end    asm_builtin_checkcast
+   RETURN VALUE:
+       the old value at *p
 
-               
-/******************* function asm_builtin_checkarraycast ***********************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
+   long compare_and_swap(volatile long *p, long oldval, long newval);
 
-       .ent    asm_builtin_checkarraycast
+*******************************************************************************/
 
-asm_builtin_checkarraycast:
-       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_checkarraycast /* builtin_checkarraycast               */
-       ldgp    gp,0(ra)
-       beq     v0,nb_carray_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                     */
+       .ent    asm_compare_and_swap
+
+asm_compare_and_swap:
+1:
+       ldq_l   v0,0(a0)
+       cmpeq   v0,a1,t0
+       beq     t0,2f
+       mov     a2,t0
+       stq_c   t0,0(a0)
+       beq     t0,1b
+2:
        jmp     zero,(ra)
 
-nb_carray_throw:
-       ldq     a0,string_java_lang_ClassCastException
-    jsr     ra,new_exception
-    ldgp    gp,0(ra)
-       mov     v0,xptr
+       .end    asm_compare_and_swap
 
-       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_checkarraycast
+/* asm_memory_barrier **********************************************************
 
+   A memory barrier for the Java Memory Model.
 
-/******************* function asm_builtin_aastore ******************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
 *******************************************************************************/
 
-       .ent    asm_builtin_aastore
+       .ent    asm_memory_barrier
 
-asm_builtin_aastore:
-       ldgp    gp,0(pv)
-       beq     a0,nb_aastore_null        /* if null pointer throw exception      */
-       ldl     t0,offarraysize(a0)       /* load size                            */
-       lda     sp,-24(sp)                /* allocate stack space                 */
-       stq     ra,0(sp)                  /* save return address                  */
-       s8addq  a1,a0,t1                  /* add index*8 to arrayref              */
-       cmpult  a1,t0,t0                  /* do bound check                       */
-       beq     t0,nb_aastore_bound       /* if out of bounds throw exception     */
-       mov     a2,a1                     /* object is second argument            */
-       stq     t1,8(sp)                  /* save store position                  */
-       stq     a1,16(sp)                 /* save object                          */
-       jsr     ra,builtin_canstore       /* builtin_canstore(arrayref,object)    */
-       ldgp    gp,0(ra)
-       ldq     ra,0(sp)                  /* restore return address               */
-       ldq     a0,8(sp)                  /* restore store position               */
-       ldq     a1,16(sp)                 /* restore object                       */
-       lda     sp,24(sp)                 /* free stack space                     */
-       beq     v0,nb_aastore_throw       /* if (false) throw exception           */
-       stq     a1,offobjarrdata(a0)      /* store objectptr in array             */
+asm_memory_barrier:
+       mb
        jmp     zero,(ra)
 
-nb_aastore_null:       
-       subq    sp,8,sp                   /* allocate stack space                 */
-       stq     ra,0(sp)                  /* save return address                  */
-       ldq     a0,string_java_lang_NullPointerException
-    jsr     ra,new_exception
-    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
-
-nb_aastore_bound:
-       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
-
-nb_aastore_throw:
-       subq    sp,8,sp                   /* allocate stack space                 */
-       stq     ra,0(sp)                  /* save return address                  */
-       ldq     a0,string_java_lang_ArrayStoreException
-    jsr     ra,new_exception
-    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
-
-       .end    asm_builtin_aastore
-
-
-/******************* function asm_initialize_thread_stack **********************
-*                                                                              *
-*   initialized a thread stack                                                 *
-*                                                                              *
-*******************************************************************************/
+       .end    asm_memory_barrier
+
 
-       .ent    asm_initialize_thread_stack
-
-asm_initialize_thread_stack:
-       lda     a1,-128(a1)
-       stq     zero, 0(a1)
-       stq     zero, 8(a1)
-       stq     zero, 16(a1)
-       stq     zero, 24(a1)
-       stq     zero, 32(a1)
-       stq     zero, 40(a1)
-       stq     zero, 48(a1)
-       stt     fzero, 56(a1)
-       stt     fzero, 64(a1)
-       stt     fzero, 72(a1)
-       stt     fzero, 80(a1)
-       stt     fzero, 88(a1)
-       stt     fzero, 96(a1)
-       stt     fzero, 104(a1)
-       stt     fzero, 112(a1)
-       stq     a0, 120(a1)
-       mov     a1, v0
+       .ent    asm_getclassvalues_atomic
+
+asm_getclassvalues_atomic:
+_crit_restart:
+_crit_begin:
+       ldl     t0,offbaseval(a0)
+       ldl     t1,offdiffval(a0)
+       ldl     t2,offbaseval(a1)
+_crit_end:
+       stl     t0,offcast_super_baseval(a2)
+       stl     t1,offcast_super_diffval(a2)
+       stl     t2,offcast_sub_baseval(a2)
        jmp     zero,(ra)
 
-       .end    asm_initialize_thread_stack
+       .end    asm_getclassvalues_atomic
 
 
-/******************* function asm_perform_threadswitch *************************
-*                                                                              *
-*   void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop);         *
-*                                                                              *
-*   performs a threadswitch                                                    *
-*                                                                              *
-*******************************************************************************/
+    .data
+
+asm_criticalsections:
+#if defined(ENABLE_THREADS)
+    .quad   _crit_begin
+    .quad   _crit_end
+    .quad   _crit_restart
+#endif
+    .quad   0
+
+
+/* asm_md_init *****************************************************************
+
+   Initialize machine dependent stuff.
+
+   Determines if the byte support instruction set (21164a and higher)
+   is available.
 
-       .ent    asm_perform_threadswitch
-
-asm_perform_threadswitch:
-       subq    sp,128,sp
-       stq     s0, 0(sp)
-       stq     s1, 8(sp)
-       stq     s2, 16(sp)
-       stq     s3, 24(sp)
-       stq     s4, 32(sp)
-       stq     s5, 40(sp)
-       stq     s6, 48(sp)
-       stt     sf0, 56(sp)
-       stt     sf1, 64(sp)
-       stt     sf2, 72(sp)
-       stt     sf3, 80(sp)
-       stt     sf4, 88(sp)
-       stt     sf5, 96(sp)
-       stt     sf6, 104(sp)
-       stt     sf7, 112(sp)
-       stq     ra, 120(sp)
-       stq     sp, 0(a0)
-       stq     sp, 0(a2)
-       ldq     sp, 0(a1)
-       ldq     s0, 0(sp)
-       ldq     s1, 8(sp)
-       ldq     s2, 16(sp)
-       ldq     s3, 24(sp)
-       ldq     s4, 32(sp)
-       ldq     s5, 40(sp)
-       ldq     s6, 48(sp)
-       ldt     sf0, 56(sp)
-       ldt     sf1, 64(sp)
-       ldt     sf2, 72(sp)
-       ldt     sf3, 80(sp)
-       ldt     sf4, 88(sp)
-       ldt     sf5, 96(sp)
-       ldt     sf6, 104(sp)
-       ldt     sf7, 112(sp)
-       ldq     ra, 120(sp)
-       mov     ra, pv
-       addq    sp, 128, sp
-       jmp     zero,(ra)
-
-       .end    asm_perform_threadswitch
-
-
-/********************* function asm_switchstackandcall *************************
-*                                                                              *
-*  void *asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
-*                               void *p);                                      *
-*                                                                              *
-*   Switches to a new stack, calls a function and switches back.               *
-*       a0      new stack pointer                                              *
-*       a1      function pointer                                               *
-*              a2              pointer to variable where stack top should be stored           *
-*              a3      pointer to user data, is passed to the function                *
-*                                                                              *
 *******************************************************************************/
 
+       .ent    asm_md_init
 
-       .ent    asm_switchstackandcall
+asm_md_init:
+       .long   0x47e03c20                  /* amask   1,v0                       */
+       jmp     zero,(ra)                   /* return                             */
 
-asm_switchstackandcall:
-       lda     a0,-2*8(a0)     /* allocate new stack                                 */
-       stq     ra,0(a0)        /* save return address on new stack                   */
-       stq     sp,1*8(a0)      /* save old stack pointer on new stack                */
-       stq sp,0(a2)        /* save old stack pointer to variable                 */
-       mov     a0,sp           /* switch to new stack                                */
-       
-       mov     a1,pv           /* load function pointer                              */
-       mov a3,a0           /* pass pointer */
-       jmp     ra,(pv)         /* and call function                                  */
+       .end    asm_md_init
 
-       ldq     ra,0(sp)        /* load return address                                */
-       ldq     sp,1*8(sp)      /* switch to old stack                                */
 
-       jmp     zero,(ra)       /* return                                             */
+/* asm_cacheflush **************************************************************
 
-       .end    asm_switchstackandcall
+   XXX
 
-               
-/********************* function asm_getcallingmethod ***************************
-*                                                                              *
-*   classinfo *asm_getcallingmethodclass ();                                                              *
-*                                                                                                                                                         *
-*   goes back stack frames to get the calling method                                              *
-*                                                                                                                                                         *
-*                              t2 .. sp                                                                                                       *
-*                              t3 .. ra                                                                                                       *
-*                              t4 .. pv                                                                                                       *
-*                                                                              *
 *******************************************************************************/
 
+       .ent    asm_cacheflush
 
-       .ent    asm_getcallingmethod
+asm_cacheflush:
+       call_pal PAL_imb              /* synchronize instruction cache            */
+       jmp     zero,(ra)
 
-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
+       .end    asm_cacheflush
+
+
+/* disable exec-stacks ********************************************************/
+
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",@progbits
+#endif
 
 
 /*
@@ -1344,4 +869,5 @@ pv_ok2:
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */