GNU header update.
[cacao.git] / src / vm / jit / x86_64 / asmpart.S
index f9432c4e7a473ee1ee436946f0561a1b079697e3..1ee9980d9f80ebb47e53b83a6e8e565c81372f92 100644 (file)
@@ -1,10 +1,9 @@
-/* jit/x86_64/asmpart.S - Java-C interface functions for x86_64
+/* vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Institut f. Computersprachen, TU Wien
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
-   S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
-   J. Wenninger
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
             Reinhard Grafl
             Christian Thalinger
 
-   $Id: asmpart.S 926 2004-02-26 00:16:50Z twisti $
+   $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 
-#include "offsets.h"
+#include "config.h"
+#include "vm/jit/x86_64/arch.h"
+#include "vm/jit/x86_64/offsets.h"
+#include "vm/jit/x86_64/asmoffsets.h"
+
+
+/* define it like the risc way */
+
+#define v0       %rax
+
+#define a0       %rdi
+#define a1       %rsi
+#define a2       %rdx
+#define a3       %rcx
+#define a4       %r8
+#define a5       %r9
+
+#define fa0      %xmm0
+#define fa1      %xmm1
+#define fa2      %xmm2
+#define fa3      %xmm3
+#define fa4      %xmm4
+#define fa5      %xmm5
+#define fa6      %xmm6
+#define fa7      %xmm7
+
+#define itmp1    %rax
+#define itmp2    %r10
+#define itmp3    %r11
+
+#define itmp1l   %eax
+#define itmp2l   %r10d
+#define itmp3l   %r11d
+
+#define itmp1b   %al
+#define itmp2b   %r10b
+#define itmp3b   %r11b
+
+#define xptr     itmp1
+#define xpc      itmp2
+
 
        .text
 
 /********************* exported functions and variables ***********************/
 
        .globl asm_calljavafunction
+       .globl calljava_xhandler
        .globl asm_calljavafunction2
        .globl asm_calljavafunction2long
        .globl asm_calljavafunction2double
+       .globl calljava_xhandler2
        .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_anewarray
        .globl asm_builtin_newarray_array
        .globl asm_builtin_aastore
        .globl asm_builtin_monitorenter
        .globl asm_builtin_monitorexit
-    .globl asm_builtin_f2i
-    .globl asm_builtin_f2l
-    .globl asm_builtin_d2i
-    .globl asm_builtin_d2l
+       .globl asm_builtin_f2i
+       .globl asm_builtin_f2l
+       .globl asm_builtin_d2i
+       .globl asm_builtin_d2l
        .globl asm_builtin_arrayinstanceof
        .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
+               
+
 /*************************** imported functions *******************************/
 
        .globl jit_compile
        .globl builtin_monitorexit
        .globl builtin_throw_exception
        .globl builtin_trace_exception
-       .globl findmethod
-
+       .globl codegen_findmethod
         
 
-#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
-
-
 /********************* function asm_calljavafunction ***************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
 *******************************************************************************/
 
 call_name:
-       .ascii  "calljavafunction\0\0"
-
        .align  8
+
        .quad   0                         /* catch type all                       */
        .quad   calljava_xhandler         /* handler pc                           */
        .quad   calljava_xhandler         /* end pc                               */
@@ -126,36 +147,33 @@ call_name:
        .quad   0                         /* method pointer (pointer to name)     */
 
 asm_calljavafunction:
-        sub     $(3*8),%rsp           /* keep stack 16-byte aligned           */
-        mov     %rbp,0*8(%rsp)
-        mov     %rbx,1*8(%rsp)        /* %rbx is not a callee saved in cacao  */
-        mov     %rdi,%rax             /* move function pointer to %rax        */
-                                      /* compilerstub uses this               */
-
-        mov     %rsi,%rdi             /* pass remaining parameters            */
-        mov     %rdx,%rsi
-        mov     %rcx,%rdx
-        mov     %r8,%rcx
-        
-        lea     asm_call_jit_compiler,%r11
-        call    *%r11                 /* call JIT compiler                    */
+       sub     $(3*8),%rsp               /* keep stack 16-byte aligned           */
+       mov     %rbp,0*8(%rsp)
+       mov     %rbx,1*8(%rsp)            /* %rbx is not a callee saved in cacao  */
+       mov     %rdi,%rax                 /* move function pointer to %rax        */
+                                                                         /* compilerstub uses this               */
+
+       mov     %rsi,%rdi                 /* pass remaining parameters            */
+       mov     %rdx,%rsi
+       mov     %rcx,%rdx
+       mov     %r8,%rcx
        
-calljava_jit:
-calljava_return:
-calljava_ret:
-        mov     0*8(%rsp),%rbp
-               mov             1*8(%rsp),%rbx
-        add     $(3*8),%rsp           /* free stack space                     */
-        ret
+       lea     asm_call_jit_compiler,%r11
+       call    *%r11                     /* call JIT compiler                    */
+
+       mov     0*8(%rsp),%rbp
+       mov             1*8(%rsp),%rbx
+       add     $(3*8),%rsp              /* free stack space                     */
+       ret
 
 calljava_xhandler:
-        mov     %rax,%rdi                /* pass exception pointer               */
-        call    builtin_throw_exception
-        mov     0*8(%rsp),%rbp
-               mov             1*8(%rsp),%rbx
-        add     $(3*8),%rsp
-        ret
-                                               
+       mov     %rax,%rdi                /* pass exception pointer               */
+       call    builtin_throw_exception
+       mov     0*8(%rsp),%rbp
+       mov             1*8(%rsp),%rbx
+       add     $(3*8),%rsp
+       ret
+
 
 /********************* function asm_calljavafunction ***************************
 *                                                                              *
@@ -172,9 +190,8 @@ calljava_xhandler:
 *******************************************************************************/
 
 call_name2:
-       .ascii  "calljavafunction2\0\0"
-
        .align  8
+
        .quad   0                         /* catch type all                       */
        .quad   calljava_xhandler2        /* handler pc                           */
        .quad   calljava_xhandler2        /* end pc                               */
@@ -184,37 +201,184 @@ call_name2:
        .long   0                         /* intsave                              */
        .long   0                         /* isleaf                               */
        .long   0                         /* IsSync                               */
-       .long                           /* frame size                           */
+       .long   24                        /* frame size                           */
        .quad   0                         /* method pointer (pointer to name)     */
 
 asm_calljavafunction2:
 asm_calljavafunction2double:
 asm_calljavafunction2long:
-        sub     $8,%rsp               /* keep stack 16-byte aligned           */
-
-        mov     %rdi,%rax             /* save method pointer for compiler     */
-        mov     %rcx,%r10             /* pointer to arg block                 */
-        
-        mov     offjniitem(%r10),%rdi /* move args into registers             */
-        mov     offjniitem + sizejniblock * 1(%r10),%rsi
-        mov     offjniitem + sizejniblock * 2(%r10),%rdx
-        mov     offjniitem + sizejniblock * 3(%r10),%rcx
-        
-        lea     asm_call_jit_compiler,%r11
-        call    *%r11                 /* call JIT compiler                    */
+       sub     $(7*8),%rsp               /* keep stack 16-byte aligned           */
+       mov     %rbx,0*8(%rsp)            /* %rbx is not a callee saved in cacao  */
+       mov     %rbp,1*8(%rsp)
+       mov     %r12,2*8(%rsp)
+       mov     %r13,3*8(%rsp)
+       mov     %r14,4*8(%rsp)
+       mov     %r15,5*8(%rsp)
+
+       mov     %rdi,%rax                 /* move method pointer for compiler     */
+
+       mov     %rsi,itmp3                /* arg count                            */
+       mov     %rcx,itmp2                /* pointer to arg block                 */
+               
+       test    itmp3,itmp3               /* maybe we have no args...             */
+       jle     L_copy_done
+
+       mov     itmp2,%r14                /* save argument block pointer          */
+       mov     itmp3,%r15                /* save argument count                  */
+
+       sub     $sizejniblock,itmp2       /* initialize pointer (smaller code)    */
+       add     $1,itmp3                  /* initialize argument count            */
+       xor     %r12,%r12                 /* initialize integer argument counter  */
+       xor     %r13,%r13                 /* initialize float argument counter    */
+
+L_register_copy:
+       add     $sizejniblock,itmp2       /* goto next argument block             */
+       dec     itmp3                     /* argument count - 1                   */
+       jz      L_register_copy_done
+       andb    $0x02,offjniitemtype(itmp2) /* is this a float/double type?       */
+       jnz     L_register_handle_float   /* yes, handle it                       */
+
+       cmp     $(INT_ARG_CNT - 1),%r12   /* are we out of integer argument       */
+       je      L_register_copy           /* register? yes, next loop             */
+
+       lea     jumptable_integer,%rbp
+       mov     0(%rbp,%r12,8),%rbx
+       inc     %r12                      /* integer argument counter + 1         */
+       jmp     *%rbx
+
+L_register_handle_float:
+       cmp     $(FLT_ARG_CNT - 1),%r13   /* are we out of float argument         */
+       je      L_register_copy           /* register? yes, next loop             */
+
+       lea     jumptable_float,%rbp
+       mov     0(%rbp,%r13,8),%rbx
+       inc     %r13                      /* float argument counter + 1           */
+       jmp     *%rbx
        
-calljava_jit2:
-calljava_return2:
-calljava_ret2:
-        add     $8,%rsp               /* free stack space                     */
-        ret
-
+L_register_copy_done:
+       mov     %r15,itmp3                /* calculate remaining arguments after  */
+       sub     %r12,itmp3                /* register copy                        */
+       sub     %r13,itmp3
+       jle     L_copy_done               /* are all assigned to registers?       */
+
+       shl     $3,itmp3                  /* calculate stack size                 */
+       sub     itmp3,%rsp                /* stack frame for arguments            */
+       mov     %rsp,%rbx                 /* use %rbx as temp sp                  */
+
+       sub     $sizejniblock,itmp2       /* initialize pointer (smaller code)    */
+       add     $1,%r15                   /* initialize argument count            */
+               
+L_stack_copy_loop:
+       add     $sizejniblock,itmp2       /* goto next argument block             */
+       dec     %r15                      /* are there any arguments left?        */
+       jz      L_copy_done               /* no test needed after dec             */
+
+       andb    $0x02,offjniitemtype(itmp2) /* is this a float/double type?       */
+       jnz     L_stack_handle_float
+       dec     %r12                      /* arguments assigned to registers      */
+       jge     L_stack_copy_loop
+       jmp     L_stack_copy
+
+L_stack_handle_float:
+       dec     %r13                      /* arguments assigned to registers      */
+       jge     L_stack_copy_loop
+
+L_stack_copy:
+    mov     offjniitem(itmp2),itmp3   /* copy s8 argument onto stack          */
+    mov     itmp3,0(%rbx)
+    add     $8,%rbx                   /* increase sp to next argument         */
+       jmp     L_stack_copy_loop
+
+L_copy_done:
+       lea     asm_call_jit_compiler,%r11/* %rax still contains method pointer   */
+       call    *%r11                     /* call JIT compiler                    */
+
+       mov     5*8(%rsp),%r15            /* restore callee saved registers       */
+       mov     4*8(%rsp),%r14
+       mov     3*8(%rsp),%r13
+       mov     2*8(%rsp),%r12
+       mov     1*8(%rsp),%rbp
+       mov     0*8(%rsp),%rbx
+       add     $(7*8),%rsp               /* free stack space                     */
+       ret
+               
 calljava_xhandler2:
-        mov     %rax,%rdi                /* pass exception pointer               */
-        call    builtin_throw_exception
-        add     $8,%rsp
-        ret
-                                               
+       mov     %rax,%rdi                 /* pass exception pointer               */
+       call    builtin_throw_exception
+
+       mov     5*8(%rsp),%r15            /* restore callee saved registers       */
+       mov     4*8(%rsp),%r14
+       mov     3*8(%rsp),%r13
+       mov     2*8(%rsp),%r12
+       mov     1*8(%rsp),%rbp
+       mov     0*8(%rsp),%rbx
+       add     $(7*8),%rsp               /* free stack space                     */
+       ret
+
+
+jumptable_integer:
+       .quad   handle_a0
+       .quad   handle_a1
+       .quad   handle_a2
+       .quad   handle_a3
+       .quad   handle_a4
+       .quad   handle_a5
+
+handle_a0:
+       mov     offjniitem(itmp2),a0
+       jmp     L_register_copy
+handle_a1:
+       mov     offjniitem(itmp2),a1
+       jmp     L_register_copy
+handle_a2:
+       mov     offjniitem(itmp2),a2
+       jmp     L_register_copy
+handle_a3:
+       mov     offjniitem(itmp2),a3
+       jmp     L_register_copy
+handle_a4:
+       mov     offjniitem(itmp2),a4
+       jmp     L_register_copy
+handle_a5:
+       mov     offjniitem(itmp2),a5
+       jmp     L_register_copy
+
+
+jumptable_float:
+       .quad   handle_fa0
+       .quad   handle_fa1
+       .quad   handle_fa2
+       .quad   handle_fa3
+       .quad   handle_fa4
+       .quad   handle_fa5
+       .quad   handle_fa6
+       .quad   handle_fa7
+
+handle_fa0:
+       movq    offjniitem(itmp2),fa0
+       jmp     L_register_copy
+handle_fa1:
+       movq    offjniitem(itmp2),fa1
+       jmp     L_register_copy
+handle_fa2:
+       movq    offjniitem(itmp2),fa2
+       jmp     L_register_copy
+handle_fa3:
+       movq    offjniitem(itmp2),fa3
+       jmp     L_register_copy
+handle_fa4:
+       movq    offjniitem(itmp2),fa4
+       jmp     L_register_copy
+handle_fa5:
+       movq    offjniitem(itmp2),fa5
+       jmp     L_register_copy
+handle_fa6:
+       movq    offjniitem(itmp2),fa6
+       jmp     L_register_copy
+handle_fa7:
+       movq    offjniitem(itmp2),fa7
+       jmp     L_register_copy
+
 
 /****************** function asm_call_jit_compiler *****************************
 *                                                                              *
@@ -342,54 +506,6 @@ L_call_method:
                jmp             *%rax                   /* ...and now call the new method             */
 
 
-
-/****************** 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_dumpregistersandcall:
-        sub     $(7*8),%rsp             /* allocate stack space               */
-
-        mov     %rbx,0*8(%rsp)          /* save all callee saved registers    */
-        mov     %rsp,1*8(%rsp)
-        mov     %rbp,2*8(%rsp)
-        mov     %r12,3*8(%rsp)
-        mov     %r13,4*8(%rsp)
-        mov     %r14,5*8(%rsp)
-        mov     %r15,6*8(%rsp)
-
-        xor     %rax,%rax               /* intialize the remaining registers  */
-        xor     %rcx,%rcx
-        xor     %rdx,%rdx
-        xor     %rsi,%rsi
-        xor     %r8,%r8
-        xor     %r9,%r9
-        xor     %r10,%r10
-        xor     %r11,%r11
-        
-        call    *%rdi                   /* call function                      */
-
-        mov     0*8(%rsp),%rbx
-        mov     1*8(%rsp),%rsp
-        mov     2*8(%rsp),%rbp
-        mov     3*8(%rsp),%r12
-        mov     4*8(%rsp),%r13
-        mov     5*8(%rsp),%r14
-        mov     6*8(%rsp),%r15
-
-        add     $(7*8),%rsp        
-        ret
-
-
 /********************* function asm_handle_exception ***************************
 *                                                                              *
 *   This function handles an exception. It does not use the usual calling      *
@@ -403,65 +519,118 @@ asm_dumpregistersandcall:
 *******************************************************************************/
 
 asm_handle_nat_exception:
-        add     $8,%rsp                                                /* clear return address of native stub */
+       add     $8,%rsp                     /* clear return address of native stub*/
                
 asm_handle_exception:
-        sub     $(4*8),%rsp
-        mov     %rax,0*8(%rsp)              /* save exception pointer         */
-        mov     %r10,1*8(%rsp)              /* save exception pc              */
+       sub     $(4*8),%rsp
+       mov     xptr,0*8(%rsp)              /* save exception pointer             */
+       mov     xpc,1*8(%rsp)               /* save exception pc                  */
         
-        mov     %r10,%rdi                   /* exception pc                   */
-        call   findmethod
-        mov     %rax,%r11
-        mov     %rax,2*8(%rsp)                         /* save data segment pointer      */
+       mov     xpc,%rdi                    /* exception pc                       */
+       call    codegen_findmethod
+       mov     %rax,itmp3
+       mov     %rax,2*8(%rsp)              /* save data segment pointer          */
         
-        mov     0*8(%rsp),%rax              /* restore exception pointer      */
-        mov     1*8(%rsp),%r10              /* restore exception pc           */
+       mov     0*8(%rsp),%rax              /* restore exception pointer          */
+       mov     1*8(%rsp),%r10              /* restore exception pc               */
         
 ex_stack_loop:
-        mov     %rax,%rdi                                      /* exception pointer              */
-        mov     MethodPointer(%r11),%rsi       /* method pointer                 */
-        mov     %r10,%rdx                   /* exception pc                   */
-        mov     $1,%rcx                                        /* set noindent flag              */
-        call   builtin_trace_exception
-
-               mov     2*8(%rsp),%r11                          /* %r11 = data segment pointer    */
-               mov     ExTableSize(%r11),%rcx          /* %rcx = exception table size    */
-               test    %rcx,%rcx                                       /* if empty table skip            */
-               je              empty_table
-
-               lea             ExTableStart(%r11),%rdi         /* %rdi = start of exception table*/
-               mov     0*8(%rsp),%rax                          /* get xptr                       */
+       mov     %rax,%rdi                   /* exception pointer                  */
+       mov     MethodPointer(itmp3),%rsi   /* method pointer                     */
+       mov     xpc,%rdx                    /* exception pc                       */
+       mov     $0,%rcx
+       mov     $1,%r8                      /* set noindent flag                  */
+       call    builtin_trace_exception
+
+       mov     2*8(%rsp),itmp3             /* %r11 = data segment pointer        */
+       mov     ExTableSize(itmp3),%rcx     /* %rcx = exception table size        */
+       test    %rcx,%rcx                                       /* if empty table skip                */
+       je      empty_table
+
+       lea     ExTableStart(itmp3),%rdi    /* %rdi = start of exception table    */
+       mov     0*8(%rsp),xptr              /* get xptr                           */
                
 ex_table_loop:
-               mov     1*8(%rsp),%r10              /* get xpc                        */
+       mov     1*8(%rsp),xpc               /* get xpc                            */
                
-               mov     ExStartPC(%rdi),%rdx        /* %rdx = exception start pc      */
-               cmp     %r10,%rdx                   /* %rdx = (startpc <= xpc)        */
-               jg              ex_table_cont               /* if (false) continue            */
-               mov     ExEndPC(%rdi),%rdx          /* %rdx = exception end pc        */
-               cmp     %rdx,%r10                   /* %rdx = (xpc < endpc)           */
-               jge             ex_table_cont               /* if (false) continue            */
-               mov     ExCatchType(%rdi),%rdx      /* %rdx = exception catch type    */
-               test    %rdx,%rdx                   /* NULL catches everything        */
-               je              ex_handle_it
-
-               mov     offobjvftbl(%rax),%rsi      /* %rsi = vftblptr(xptr)          */
-               mov     offclassvftbl(%rdx),%rdx    /* %rdx = vftblptr(catchtype) class (not obj) */
-               mov     offbaseval(%rsi),%esi       /* %esi = baseval(xptr)           */
-               mov     offbaseval(%rdx),%r10d      /* %r10d = baseval(catchtype)     */
-               mov     offdiffval(%rdx),%edx       /* %edx = diffval(catchtype)      */
-               sub     %r10d,%esi                  /* %esi = baseval(xptr) - baseval(catchtype) */
-               cmp     %edx,%esi                   /* xptr is instanceof catchtype   */
-               ja              ex_table_cont
+       mov     ExStartPC(%rdi),%rdx        /* %rdx = exception start pc          */
+       cmp     xpc,%rdx                    /* %rdx = (startpc <= xpc)            */
+       jg      ex_table_cont               /* if (false) continue                */
+       mov     ExEndPC(%rdi),%rdx          /* %rdx = exception end pc            */
+       cmp     %rdx,xpc                    /* %rdx = (xpc < endpc)               */
+       jge     ex_table_cont               /* if (false) continue                */
+       mov     ExCatchType(%rdi),%rdx      /* %rdx = exception catch type        */
+       test    %rdx,%rdx                   /* NULL catches everything            */
+       je      ex_handle_it
+
+       cmpl    $0,offclassloaded(%rdx)     /* check if class is loaded           */
+       jne     L_class_loaded
+
+       sub     $(4*8),%rsp
+       mov     %rax,0*8(%rsp)
+       mov     %rcx,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rdi,3*8(%rsp)
+
+       mov     %rdx,%rdi
+       call    class_load
+
+       mov     0*8(%rsp),%rax
+       mov     1*8(%rsp),%rcx
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rdi
+       add     $(4*8),%rsp
+
+L_class_loaded:
+       cmpl    $0,offclasslinked(%rdx)     /* check if class is linked           */
+       jne     L_class_linked
+
+       sub     $(4*8),%rsp
+       mov     %rax,0*8(%rsp)
+       mov     %rcx,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rdi,3*8(%rsp)
+
+       mov     %rdx,%rdi
+       call    class_link
+
+       mov     0*8(%rsp),%rax
+       mov     1*8(%rsp),%rcx
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rdi
+       add     $(4*8),%rsp
+
+L_class_linked:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       push    %rdx
+
+_crit_restart1:
+       mov     0(%rsp),%rdx
+#endif
+
+_crit_begin1:
+       mov     offobjvftbl(%rax),%rsi      /* %rsi = vftblptr(xptr)              */
+       mov     offclassvftbl(%rdx),%rdx    /* %rdx = vftblptr(catchtype) class (not obj) */
+       mov     offbaseval(%rsi),%esi       /* %esi = baseval(xptr)               */
+       mov     offbaseval(%rdx),%r10d      /* %r10d = baseval(catchtype)         */
+       mov     offdiffval(%rdx),%edx       /* %edx = diffval(catchtype)          */
+_crit_end1:
+       sub     %r10d,%esi                  /* %esi = baseval(xptr) - baseval(catchtype) */
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       add     $8,%rsp
+#endif
+
+       cmp     %edx,%esi                   /* xptr is instanceof catchtype       */
+       ja      ex_table_cont
                
 ex_handle_it:
-               mov     ExHandlerPC(%rdi),%r10      /* xpc = exception handler pc     */
+               mov     ExHandlerPC(%rdi),xpc       /* xpc = exception handler pc     */
 
         mov     0*8(%rsp),%rax              /* restore exception pointer      */
         add     $(4*8),%rsp                 /* free stack frame               */
 
-        jmp            *%r10                       /* jump to the handler            */
+        jmp            *xpc                        /* jump to the handler            */
 
 ex_table_cont:
         lea            ExEntrySize(%rdi),%rdi      /* next exception table entry     */
@@ -577,7 +746,7 @@ noflt:
         mov     %r10,1*8(%rsp)
 
         mov     %r10,%rdi
-        call   findmethod                              /* get the new data segment ptr   */
+        call   codegen_findmethod          /* get the new data segment ptr   */
         mov     %rax,%r11
         
         mov     0*8(%rsp),%rcx
@@ -595,43 +764,100 @@ noflt:
                jmp             ex_stack_loop
 
 
-/********************* function asm_check_clinit *******************************
-*                                                                              *
-*   Does null check and calls monitorenter or throws an exception              *
-*                                                                              *
+/* asm_check_clinit ************************************************************
+
+   DOCUMENT ME!!!
+
+   Stack layout:
+
+       32  ra      ; return address of patched call in java machine code
+       24  xmcode  ; additional machine code (only for i386 and x86_64)
+       16  mcode   ; machine code to patch back in
+       8   class   ; pointer to class
+       0   sp      ; stack pointer of java stack frame + return address
+
 *******************************************************************************/
 
 asm_check_clinit:
-               mov             offclassinit(%rax),%r10d    /* get initialized flag (int)     */
-               test    %r10,%r10
-               jnz             L_is_initialized
-
-               sub             $(7*8),%rsp                 /* keep stack 16-byte aligned     */
-               mov             %rdi,0*8(%rsp)              /* save argument registers        */
-               mov             %rsi,1*8(%rsp)
-               mov             %rdx,2*8(%rsp)
-               mov             %rcx,3*8(%rsp)
-               mov             %r8,4*8(%rsp)
-               mov             %r9,5*8(%rsp)
-               
-               mov             %rax,%rdi                   /* pass classinfo pointer         */
-               call    class_init                  /* call class_init function       */
-               
-        mov     0*8(%rsp),%rdi              /* restore argument registers     */
-        mov     1*8(%rsp),%rsi
-        mov     2*8(%rsp),%rdx
-        mov     3*8(%rsp),%rcx
-        mov     4*8(%rsp),%r8
-        mov     5*8(%rsp),%r9
-               add             $(7*8),%rsp
+       mov     8(%rsp),itmp1
+       mov             offclassinit(itmp1),itmp1l  /* get initialized flag (int)         */
+       test    itmp1,itmp1
+       jnz             L_is_initialized
+
+       sub             $(15*8),%rsp                /* keep stack 16-byte aligned         */
+
+       mov             %rdi,0*8(%rsp)              /* save argument registers            */
+       mov             %rsi,1*8(%rsp)
+       mov             %rdx,2*8(%rsp)
+       mov             %rcx,3*8(%rsp)
+       mov             %r8,4*8(%rsp)
+       mov             %r9,5*8(%rsp)
+
+       movq    %xmm0,6*8(%rsp)             /* maybe cacao does not use all 8     */
+       movq    %xmm1,7*8(%rsp)             /* argument register, but who knows   */
+       movq    %xmm2,8*8(%rsp)
+       movq    %xmm3,9*8(%rsp)
+       movq    %xmm4,10*8(%rsp)
+       movq    %xmm5,11*8(%rsp)
+       movq    %xmm6,12*8(%rsp)
+       movq    %xmm7,13*8(%rsp)
+
+       mov             8+15*8(%rsp),%rdi           /* pass classinfo pointer             */
+       call    class_init                  /* call class_init function           */
+       
+    mov     0*8(%rsp),%rdi              /* restore argument registers         */
+    mov     1*8(%rsp),%rsi
+    mov     2*8(%rsp),%rdx
+    mov     3*8(%rsp),%rcx
+    mov     4*8(%rsp),%r8
+    mov     5*8(%rsp),%r9
+
+       movq    6*8(%rsp),%xmm0
+       movq    7*8(%rsp),%xmm1
+       movq    8*8(%rsp),%xmm2
+       movq    9*8(%rsp),%xmm3
+       movq    10*8(%rsp),%xmm4
+       movq    11*8(%rsp),%xmm5
+       movq    12*8(%rsp),%xmm6
+       movq    13*8(%rsp),%xmm7
+
+       add             $(15*8),%rsp
+
+       test    v0,v0                       /* we had an exception                */
+       je      L_initializererror
                                
 L_is_initialized:
-               mov     (%rsp),%rax                 /* get return address             */
-               sub     $23,%rax                    /* asm_putstatic call code size   */
-               movb    $0xeb,(%rax)                /* jmp rel8                       */
-               movb    $21,1(%rax)                 /* 8-bit offset                   */
-               ret
+       mov     32(%rsp),itmp1              /* get return address                 */
+       sub     $5,itmp1                    /* remove size of `call rel32'        */
+
+       mov     24(%rsp),itmp2              /* get xmcode machine code            */
+       movb    itmp2b,(itmp1)              /* patch back in 1 byte               */
+       mov     16(%rsp),itmp2              /* get mcode machine code             */
+       movl    itmp2l,1(itmp1)             /* patch back in 4 bytes              */
 
+       add     $(5*8),%rsp                 /* remove stub stack frame incl. ra   */
+
+       jmp     *itmp1                      /* jump to patched code an execute it */
+
+L_initializererror:
+       add     $(4*8),%rsp                 /* remove stub stack frame            */
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       call    builtin_asm_get_exceptionptrptr
+       mov     %rax,itmp2
+       mov     (itmp2),xptr                /* get the exception pointer          */
+       movl    $0,(itmp2)                  /* clear the exception pointer        */
+#else
+       lea     _exceptionptr,itmp2
+       mov     (itmp2),xptr                /* get the exception pointer          */
+       movl    $0,(itmp2)                  /* clear the exception pointer        */
+#endif
+
+       pop     xpc                         /* delete return address              */
+       sub     $5,xpc                      /* faulting address is ra - 5         */
+
+       jmp     asm_handle_exception
+               
 
 /********************* function asm_builtin_monitorenter ***********************
 *                                                                              *
@@ -640,15 +866,15 @@ L_is_initialized:
 *******************************************************************************/
 
 asm_builtin_monitorenter:
-        test    %rdi,%rdi
-        je      nb_monitorenter                        /* if (null) throw exception          */
-        jmp     builtin_monitorenter   /* else call builtin_monitorenter     */
+       test    %rdi,%rdi
+       je      nb_monitorenter             /* if (null) throw exception          */
+       jmp     builtin_monitorenter        /* else call builtin_monitorenter     */
 
 nb_monitorenter:
-        pop     %r10                                   /* delete return address */
-        sub     $3,%r10                                        /* faulting address is return adress - 3 */
-        mov     proto_java_lang_NullPointerException,%rax
-        jmp     asm_handle_exception
+       call    new_nullpointerexception
+    pop     %r10                        /* delete return address              */
+    sub     $3,%r10                     /* faulting address is return adress - 3 */
+    jmp     asm_handle_exception
                
 
 /********************* function asm_builtin_monitorexit ************************
@@ -658,15 +884,15 @@ nb_monitorenter:
 *******************************************************************************/
 
 asm_builtin_monitorexit:
-        test    %rdi,%rdi
-        je      nb_monitorexit                 /* if (null) throw exception          */
-        jmp     builtin_monitorexit            /* else call builtin_monitorenter     */
+       test    %rdi,%rdi
+       je      nb_monitorexit              /* if (null) throw exception          */
+       jmp     builtin_monitorexit         /* else call builtin_monitorenter     */
 
 nb_monitorexit:
-        pop     %r10                                   /* delete return address */
-        sub     $3,%r10                                        /* faulting address is return adress - 3 */
-        mov     proto_java_lang_NullPointerException,%rax
-        jmp     asm_handle_exception
+       call    new_nullpointerexception
+    pop     %r10                        /* delete return address              */
+    sub     $3,%r10                     /* faulting address is return adress - 3 */
+    jmp     asm_handle_exception
 
 
 /********************* function asm_builtin_x2x ********************************
@@ -676,184 +902,173 @@ nb_monitorexit:
 *******************************************************************************/
 
 asm_builtin_f2i:
-        sub     $(14*8),%rsp
-
-        mov     %rdi,0*8(%rsp)
-        mov     %rsi,1*8(%rsp)
-        mov     %rdx,2*8(%rsp)
-        mov     %rcx,3*8(%rsp)
-        mov     %r8,4*8(%rsp)
-        mov     %r9,5*8(%rsp)
-        
-        movq    %xmm0,6*8(%rsp)
-        movq    %xmm1,7*8(%rsp)
-        movq    %xmm2,8*8(%rsp)
-        movq    %xmm3,9*8(%rsp)
-        movq    %xmm4,10*8(%rsp)
-        movq    %xmm5,11*8(%rsp)
-        movq    %xmm6,12*8(%rsp)
-        movq    %xmm7,13*8(%rsp)
-
-        movq    %xmm8,%xmm0
-        call    builtin_f2i
-        
-        mov     0*8(%rsp),%rdi
-        mov     1*8(%rsp),%rsi
-        mov     2*8(%rsp),%rdx
-        mov     3*8(%rsp),%rcx
-        mov     4*8(%rsp),%r8
-        mov     5*8(%rsp),%r9
-
-        movq    6*8(%rsp),%xmm0
-        movq    7*8(%rsp),%xmm1
-        movq    8*8(%rsp),%xmm2
-        movq    9*8(%rsp),%xmm3
-        movq    10*8(%rsp),%xmm4
-        movq    11*8(%rsp),%xmm5
-        movq    12*8(%rsp),%xmm6
-        movq    13*8(%rsp),%xmm7
-        
-        add     $(14*8),%rsp
-        ret
+       sub     $(14*8),%rsp
+       
+       mov     %rdi,0*8(%rsp)
+       mov     %rsi,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rcx,3*8(%rsp)
+       mov     %r8,4*8(%rsp)
+       mov     %r9,5*8(%rsp)
+       
+       movq    %xmm0,6*8(%rsp)
+       movq    %xmm1,7*8(%rsp)
+       movq    %xmm2,8*8(%rsp)
+       movq    %xmm3,9*8(%rsp)
+       movq    %xmm4,10*8(%rsp)
+       movq    %xmm5,11*8(%rsp)
+       movq    %xmm6,12*8(%rsp)
+       movq    %xmm7,13*8(%rsp)
+       
+       movq    %xmm8,%xmm0
+       call    builtin_f2i
+       
+       mov     0*8(%rsp),%rdi
+       mov     1*8(%rsp),%rsi
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rcx
+       mov     4*8(%rsp),%r8
+       mov     5*8(%rsp),%r9
+       
+       movq    6*8(%rsp),%xmm0
+       movq    7*8(%rsp),%xmm1
+       movq    8*8(%rsp),%xmm2
+       movq    9*8(%rsp),%xmm3
+       movq    10*8(%rsp),%xmm4
+       movq    11*8(%rsp),%xmm5
+       movq    12*8(%rsp),%xmm6
+       movq    13*8(%rsp),%xmm7
+       
+       add     $(14*8),%rsp
+       ret
+
 
 asm_builtin_f2l:
-        sub     $(14*8),%rsp
-
-        mov     %rdi,0*8(%rsp)
-        mov     %rsi,1*8(%rsp)
-        mov     %rdx,2*8(%rsp)
-        mov     %rcx,3*8(%rsp)
-        mov     %r8,4*8(%rsp)
-        mov     %r9,5*8(%rsp)
-        
-        movq    %xmm0,6*8(%rsp)
-        movq    %xmm1,7*8(%rsp)
-        movq    %xmm2,8*8(%rsp)
-        movq    %xmm3,9*8(%rsp)
-        movq    %xmm4,10*8(%rsp)
-        movq    %xmm5,11*8(%rsp)
-        movq    %xmm6,12*8(%rsp)
-        movq    %xmm7,13*8(%rsp)
-
-        movq    %xmm8,%xmm0
-        call    builtin_f2l
-        
-        mov     0*8(%rsp),%rdi
-        mov     1*8(%rsp),%rsi
-        mov     2*8(%rsp),%rdx
-        mov     3*8(%rsp),%rcx
-        mov     4*8(%rsp),%r8
-        mov     5*8(%rsp),%r9
-
-        movq    6*8(%rsp),%xmm0
-        movq    7*8(%rsp),%xmm1
-        movq    8*8(%rsp),%xmm2
-        movq    9*8(%rsp),%xmm3
-        movq    10*8(%rsp),%xmm4
-        movq    11*8(%rsp),%xmm5
-        movq    12*8(%rsp),%xmm6
-        movq    13*8(%rsp),%xmm7
-        
-        add     $(14*8),%rsp
-        ret
+       sub     $(14*8),%rsp
+       
+       mov     %rdi,0*8(%rsp)
+       mov     %rsi,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rcx,3*8(%rsp)
+       mov     %r8,4*8(%rsp)
+       mov     %r9,5*8(%rsp)
+       
+       movq    %xmm0,6*8(%rsp)
+       movq    %xmm1,7*8(%rsp)
+       movq    %xmm2,8*8(%rsp)
+       movq    %xmm3,9*8(%rsp)
+       movq    %xmm4,10*8(%rsp)
+       movq    %xmm5,11*8(%rsp)
+       movq    %xmm6,12*8(%rsp)
+       movq    %xmm7,13*8(%rsp)
+       
+       movq    %xmm8,%xmm0
+       call    builtin_f2l
+       
+       mov     0*8(%rsp),%rdi
+       mov     1*8(%rsp),%rsi
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rcx
+       mov     4*8(%rsp),%r8
+       mov     5*8(%rsp),%r9
+       
+       movq    6*8(%rsp),%xmm0
+       movq    7*8(%rsp),%xmm1
+       movq    8*8(%rsp),%xmm2
+       movq    9*8(%rsp),%xmm3
+       movq    10*8(%rsp),%xmm4
+       movq    11*8(%rsp),%xmm5
+       movq    12*8(%rsp),%xmm6
+       movq    13*8(%rsp),%xmm7
+       
+       add     $(14*8),%rsp
+       ret
+
 
-                
 asm_builtin_d2i:
-        sub     $(14*8),%rsp
-
-        mov     %rdi,0*8(%rsp)
-        mov     %rsi,1*8(%rsp)
-        mov     %rdx,2*8(%rsp)
-        mov     %rcx,3*8(%rsp)
-        mov     %r8,4*8(%rsp)
-        mov     %r9,5*8(%rsp)
-        
-        movq    %xmm0,6*8(%rsp)
-        movq    %xmm1,7*8(%rsp)
-        movq    %xmm2,8*8(%rsp)
-        movq    %xmm3,9*8(%rsp)
-        movq    %xmm4,10*8(%rsp)
-        movq    %xmm5,11*8(%rsp)
-        movq    %xmm6,12*8(%rsp)
-        movq    %xmm7,13*8(%rsp)
-
-        movq    %xmm8,%xmm0
-        call    builtin_d2i
-        
-        mov     0*8(%rsp),%rdi
-        mov     1*8(%rsp),%rsi
-        mov     2*8(%rsp),%rdx
-        mov     3*8(%rsp),%rcx
-        mov     4*8(%rsp),%r8
-        mov     5*8(%rsp),%r9
-
-        movq    6*8(%rsp),%xmm0
-        movq    7*8(%rsp),%xmm1
-        movq    8*8(%rsp),%xmm2
-        movq    9*8(%rsp),%xmm3
-        movq    10*8(%rsp),%xmm4
-        movq    11*8(%rsp),%xmm5
-        movq    12*8(%rsp),%xmm6
-        movq    13*8(%rsp),%xmm7
-        
-        add     $(14*8),%rsp
-        ret
+       sub     $(14*8),%rsp
+       
+       mov     %rdi,0*8(%rsp)
+       mov     %rsi,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rcx,3*8(%rsp)
+       mov     %r8,4*8(%rsp)
+       mov     %r9,5*8(%rsp)
+       
+       movq    %xmm0,6*8(%rsp)
+       movq    %xmm1,7*8(%rsp)
+       movq    %xmm2,8*8(%rsp)
+       movq    %xmm3,9*8(%rsp)
+       movq    %xmm4,10*8(%rsp)
+       movq    %xmm5,11*8(%rsp)
+       movq    %xmm6,12*8(%rsp)
+       movq    %xmm7,13*8(%rsp)
+       
+       movq    %xmm8,%xmm0
+       call    builtin_d2i
+       
+       mov     0*8(%rsp),%rdi
+       mov     1*8(%rsp),%rsi
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rcx
+       mov     4*8(%rsp),%r8
+       mov     5*8(%rsp),%r9
+       
+       movq    6*8(%rsp),%xmm0
+       movq    7*8(%rsp),%xmm1
+       movq    8*8(%rsp),%xmm2
+       movq    9*8(%rsp),%xmm3
+       movq    10*8(%rsp),%xmm4
+       movq    11*8(%rsp),%xmm5
+       movq    12*8(%rsp),%xmm6
+       movq    13*8(%rsp),%xmm7
+       
+       add     $(14*8),%rsp
+       ret
 
 
 asm_builtin_d2l:
-        sub     $(14*8),%rsp
-
-        mov     %rdi,0*8(%rsp)
-        mov     %rsi,1*8(%rsp)
-        mov     %rdx,2*8(%rsp)
-        mov     %rcx,3*8(%rsp)
-        mov     %r8,4*8(%rsp)
-        mov     %r9,5*8(%rsp)
-        
-        movq    %xmm0,6*8(%rsp)
-        movq    %xmm1,7*8(%rsp)
-        movq    %xmm2,8*8(%rsp)
-        movq    %xmm3,9*8(%rsp)
-        movq    %xmm4,10*8(%rsp)
-        movq    %xmm5,11*8(%rsp)
-        movq    %xmm6,12*8(%rsp)
-        movq    %xmm7,13*8(%rsp)
-
-        movq    %xmm8,%xmm0
-        call    builtin_d2l
-        
-        mov     0*8(%rsp),%rdi
-        mov     1*8(%rsp),%rsi
-        mov     2*8(%rsp),%rdx
-        mov     3*8(%rsp),%rcx
-        mov     4*8(%rsp),%r8
-        mov     5*8(%rsp),%r9
-
-        movq    6*8(%rsp),%xmm0
-        movq    7*8(%rsp),%xmm1
-        movq    8*8(%rsp),%xmm2
-        movq    9*8(%rsp),%xmm3
-        movq    10*8(%rsp),%xmm4
-        movq    11*8(%rsp),%xmm5
-        movq    12*8(%rsp),%xmm6
-        movq    13*8(%rsp),%xmm7
-        
-        add     $(14*8),%rsp
-        ret
-
-        
-/*********************** function new_builtin_checkcast ************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
+       sub     $(14*8),%rsp
+       
+       mov     %rdi,0*8(%rsp)
+       mov     %rsi,1*8(%rsp)
+       mov     %rdx,2*8(%rsp)
+       mov     %rcx,3*8(%rsp)
+       mov     %r8,4*8(%rsp)
+       mov     %r9,5*8(%rsp)
+       
+       movq    %xmm0,6*8(%rsp)
+       movq    %xmm1,7*8(%rsp)
+       movq    %xmm2,8*8(%rsp)
+       movq    %xmm3,9*8(%rsp)
+       movq    %xmm4,10*8(%rsp)
+       movq    %xmm5,11*8(%rsp)
+       movq    %xmm6,12*8(%rsp)
+       movq    %xmm7,13*8(%rsp)
+       
+       movq    %xmm8,%xmm0
+       call    builtin_d2l
+       
+       mov     0*8(%rsp),%rdi
+       mov     1*8(%rsp),%rsi
+       mov     2*8(%rsp),%rdx
+       mov     3*8(%rsp),%rcx
+       mov     4*8(%rsp),%r8
+       mov     5*8(%rsp),%r9
+       
+       movq    6*8(%rsp),%xmm0
+       movq    7*8(%rsp),%xmm1
+       movq    8*8(%rsp),%xmm2
+       movq    9*8(%rsp),%xmm3
+       movq    10*8(%rsp),%xmm4
+       movq    11*8(%rsp),%xmm5
+       movq    12*8(%rsp),%xmm6
+       movq    13*8(%rsp),%xmm7
+       
+       add     $(14*8),%rsp
+       ret
 
-asm_builtin_checkcast:
-        xor     %rax,%rax
-        mov     %rax,(%rax)
-        ret
 
-               
 /******************* function asm_builtin_checkarraycast ***********************
 *                                                                              *
 *   Does the cast check and eventually throws an exception                     *
@@ -861,21 +1076,21 @@ asm_builtin_checkcast:
 *******************************************************************************/
 
 asm_builtin_checkarraycast:
-        sub     $24,%rsp                               /* keep stack 16-byte aligned         */
-        mov     %rdi,(%rsp)                            /* save object pointer                */
-        call    builtin_checkarraycast  /* builtin_checkarraycast             */
-        test    %rax,%rax               /* if (false) throw exception         */
-        je      nb_carray_throw
-        mov     (%rsp),%rax             /* return object pointer              */
-        add     $24,%rsp                /* free stack space                   */
-        ret
+       sub     $24,%rsp                /* keep stack 16-byte aligned         */
+       mov     %rdi,(%rsp)             /* save object pointer                */
+       call    builtin_checkarraycast  /* builtin_checkarraycast             */
+       test    %rax,%rax               /* if (false) throw exception         */
+       je      nb_carray_throw
+       mov     (%rsp),%rax             /* return object pointer              */
+       add     $24,%rsp                /* free stack space                   */
+       ret
 
 nb_carray_throw:
-        add     $24,%rsp
-        pop     %r10                                   /* delete return address              */
-        sub     $3,%r10                                        /* faulting address is return adress - 3 */
-        mov     proto_java_lang_ClassCastException,%rax
-        jmp     asm_handle_exception
+       call    new_classcastexception
+       add     $24,%rsp
+       pop     %r10                    /* delete return address              */
+       sub     $3,%r10                 /* faulting address is return adress - 3 */
+       jmp     asm_handle_exception
 
                
 /******************* function asm_builtin_aastore ******************************
@@ -885,13 +1100,13 @@ nb_carray_throw:
 *******************************************************************************/
 
 asm_builtin_aastore:
-        sub     $24,%rsp                       /* allocate stack space               */
-        test    %rdi,%rdi                              /* if null pointer throw exception    */
+        sub     $(3*8),%rsp             /* allocate stack space               */
+        test    %rdi,%rdi               /* if null pointer throw exception    */
         je      nb_aastore_null
 
         movl    offarraysize(%rdi),%eax /* load size                          */
         cmpl    %eax,%esi                              /* do bound check                     */
-        ja      nb_aastore_bound               /* if out of bounds throw exception   */
+        jae     nb_aastore_bound               /* if out of bounds throw exception   */
 
         shl     $3,%rsi                                        /* index * 8                          */
         mov     %rdi,%r10
@@ -908,31 +1123,29 @@ asm_builtin_aastore:
         mov     (%rsp),%r10             /* restore store position             */
         mov     8(%rsp),%rdx            /* restore object                     */
         mov     %rdx,offobjarrdata(%r10)/* store objectptr in array           */
-        add     $24,%rsp                /* free stack space                   */
+        add     $(3*8),%rsp             /* free stack space                   */
         ret
 
 nb_aastore_null:
+               call    new_nullpointerexception
         add     $24,%rsp
-        pop     %r10                                   /* delete return address */
+        pop     %r10                                   /* delete return address              */
         sub     $3,%r10                                        /* faulting address is return adress - 3 */
-               
-        mov     proto_java_lang_NullPointerException,%rax
         jmp     asm_handle_exception
 
 nb_aastore_bound:
+               mov     %rsi,%rdi               /* move index into a0                 */
+               call    new_arrayindexoutofboundsexception
         add     $24,%rsp
-        pop     %r10                                   /* delete return address */
+        pop     %r10                                   /* delete return address              */
         sub     $3,%r10                                        /* faulting address is return adress - 3 */
-               
-        mov     proto_java_lang_ArrayIndexOutOfBoundsException,%rax
         jmp     asm_handle_exception
                
 nb_aastore_throw:
+               call    new_arraystoreexception
         add     $24,%rsp
-        pop     %r10                                   /* delete return address */
+        pop     %r10                                   /* delete return address              */
         sub     $3,%r10                                        /* faulting address is return adress - 3 */
-               
-        mov     proto_java_lang_ArrayStoreException,%rax
         jmp            asm_handle_exception
 
                
@@ -1031,74 +1244,33 @@ asm_switchstackandcall:
         mov     %r10,(%rsp)             /* write return adress                */
         ret
 
-               
-/********************* function asm_getcallingmethod ***************************
-*                                                                              *
-*   classinfo *asm_getcallingmethod ();                                                                   *
-*                                                                                                                                                         *    
-*   goes back stack frames to get the calling method                                              *
-*                                                                                                                                                         *
-*                              t2 .. sp                                                                                                       *
-*                              t3 .. ra                                                                                                       *
-*                              t4 .. pv                                                                                                       *
-*                                                                              *
-*   Stack:                                                                     *
-*       java function                                                          *
-*       native stub                                                            *
-*       Java_java_lang_System_getCallerClass                                   *
-*                                                                              *
-*******************************************************************************/
 
-asm_getcallingmethod:
-        mov     %rbp,%rax               /* return address of native function  */
-        add     $(2*8),%rax             /* %rsp, return address               */
-        add     $(7*8),%rax             /* native stub stackframe             */
-        mov     (%rax),%rdi             /* return address to java function    */
-        call    findmethod
-        mov     MethodPointer(%rax),%rax
-        ret
+asm_getclassvalues_atomic:
+_crit_restart2:
+_crit_begin2:
+       movl    offbaseval(a0),itmp1l
+       movl    offdiffval(a0),itmp2l
+       movl    offbaseval(a1),itmp3l
+_crit_end2:
+       movl    itmp1l,offcast_super_baseval(a2)
+       movl    itmp2l,offcast_super_diffval(a2)
+       movl    itmp3l,offcast_sub_baseval(a2)
+       ret
 
+       .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
 
-asm_printf:
-        push    %rbp
-        mov     %rsp,%rbp
-        
-        push    %rax
-        push    %rcx
-        push    %rdx
-        push    %rbx
-        push    %rsi
-        push    %rdi
-        push    %r8
-        push    %r9
-        push    %r10
-        push    %r11
-        push    %r12
-        push    %r13
-        push    %r14
-        push    %r15
-
-        mov     16(%rbp),%rdi
-        call    asmprintf
-
-        pop     %r15
-        pop     %r14
-        pop     %r13
-        pop     %r12
-        pop     %r11
-        pop     %r10
-        pop     %r9
-        pop     %r8
-        pop     %rdi
-        pop     %rsi
-        pop     %rbx
-        pop     %rdx
-        pop     %rcx
-        pop     %rax
-        
-        leave
-        ret
-        
+                               
 /*
  * 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