GNU header update.
[cacao.git] / src / vm / jit / x86_64 / asmpart.S
index f79c905cb5b266e90e4638e8898f05c943501331..1ee9980d9f80ebb47e53b83a6e8e565c81372f92 100644 (file)
-/* -*- mode: asm; tab-width: 4 -*- */
-/****************************** asmpart.c **************************************
-*                                                                              *
-*   It contains the Java-C interface functions for x86_64 processors.          *
-*                                                                              *
-*   Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst              *
-*                                                                              *
-*   See file COPYRIGHT for information on usage and disclaimer of warranties   *
-*                                                                              *
-*   Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at            *
-*            Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at            *
-*            Christian Thalinger EMAIL: cacao@complang.tuwien.ac.at            *
-*                                                                              *
-*   Last Change: $Id: asmpart.S 559 2003-11-02 23:20:06Z twisti $        *
-*                                                                              *
-*******************************************************************************/
+/* vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
+
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Andreas Krall
+            Reinhard Grafl
+            Christian Thalinger
+
+   $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
+
+*/
+
+
+#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
 
-#include "offsets.h"
 
        .text
 
 
 /********************* exported functions and variables ***********************/
 
-       .globl has_no_x_instr_set
-       .globl asm_calljavamethod
        .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_builtin_checkcast    
+       .globl asm_check_clinit
        .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_idiv
-       .globl asm_builtin_irem
-       .globl asm_builtin_ldiv
-       .globl asm_builtin_lrem
-       .globl asm_builtin_frem
+       .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 class_java_lang_Object
-       .globl findmethod
-
-/*********************** function has_no_x_instr_set ***************************
-*                                                                              *
-*   determines if the byte support instruction set (21164a and higher)         *
-*   is available.                                                              *
-*                                                                              *
-*   Use it on i386 architecture to init the fpu.                               *
-*                                                                              *
-*******************************************************************************/
-
-has_no_x_instr_set:
-               finit                         /* intitialize the fpu                  */
-
-               pushl   $0x027f   /* Round to nearest, 53-bit mode, exceptions masked */
-               fldcw   (%esp)
-               addl    $4,%esp
-               
-               xor             %eax,%eax                               /* result code 0 (not used for i386)  */
-               ret
-
+       .globl codegen_findmethod
+        
 
-/********************* function asm_calljavamethod *****************************
+/********************* function asm_calljavafunction ***************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
-*   with up to 4 parameters.                                                   *
+*   with up to 4 address parameters.                                           *
 *                                                                              *
 *   This functions calls the JIT-compiler which eventually translates the      *
 *   method into machine code.                                                  *
 *                                                                              *
-*   An possibly throwed exception will be returned to the caller as function   *
-*   return value, so the java method cannot return a fucntion value (this      *
-*   function usually calls 'main' and '<clinit>' which do not return a         *
-*   function value).                                                           *
-*                                                                              *
 *   C-prototype:                                                               *
 *    javaobject_header *asm_calljavamethod (methodinfo *m,                     *
 *         void *arg1, void *arg2, void *arg3, void *arg4);                     *
 *                                                                              *
 *******************************************************************************/
 
-#define        MethodPointer   -4
-#define        FrameSize       -8
-#define     IsSync          -12
-#define     IsLeaf          -16
-#define     IntSave         -20
-#define     FltSave         -24
-#define     ExTableSize     -28
-#define     ExTableStart    -28
-
-#define     ExEntrySize     -16
-#define     ExStartPC       -4
-#define     ExEndPC         -8
-#define     ExHandlerPC     -12
-#define     ExCatchType     -16
-
 call_name:
-       .ascii  "calljavamethod\0\0"
-
-/*     .align  3 */
        .align  8
-       .long   0                         /* catch type all                       */
-       .long   calljava_xhandler         /* handler pc                           */
-       .long   calljava_xhandler         /* end pc                               */
-       .long   asm_calljavamethod        /* start pc                             */
+
+       .quad   0                         /* catch type all                       */
+       .quad   calljava_xhandler         /* handler pc                           */
+       .quad   calljava_xhandler         /* end pc                               */
+       .quad   asm_calljavafunction      /* start pc                             */
        .long   1                         /* extable size                         */
        .long   0                         /* fltsave                              */
        .long   0                         /* intsave                              */
        .long   0                         /* isleaf                               */
        .long   0                         /* IsSync                               */
-       .long   32                        /* frame size                           */
-       .long   0                         /* method pointer (pointer to name)     */
-
-asm_calljavamethod:
-               pushl   %ebp                  /* allocate stack space                 */
-               movl    %esp, %ebp
-
-               subl    $32,%esp              /* pass the remaining parameters        */
-               xorl    %edx,%edx
-
-               movl    %edx,28(%esp)         /* convert parms to 8 byte              */
-               movl    24(%ebp),%eax
-               movl    %eax,24(%esp)
-               
-               movl    %edx,20(%esp)
-               movl    20(%ebp),%eax
-               movl    %eax,16(%esp)
+       .long   8                         /* frame size                           */
+       .quad   0                         /* method pointer (pointer to name)     */
 
-               movl    %edx,12(%esp)
-               movl    16(%ebp),%eax
-               movl    %eax,8(%esp)
-
-               movl    %edx,4(%esp)
-               movl    12(%ebp),%eax
-               movl    %eax,(%esp)
+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                    */
 
-               movl    8(%ebp),%eax          /* move function pointer to %eax        */
-
-               lea             asm_call_jit_compiler,%ecx
-               call    *%ecx                 /* call JIT compiler                    */
-               
-calljava_jit:
-calljava_return:
-calljava_ret:
-               xorl    %eax,%eax
-               leave                                             /* free stack space                     */
-               ret
+       mov     0*8(%rsp),%rbp
+       mov             1*8(%rsp),%rbx
+       add     $(3*8),%rsp              /* free stack space                     */
+       ret
 
 calljava_xhandler:
-               pushl   %eax                              /* pass exception pointer               */
-               call    builtin_throw_exception
-               addl    $4,%esp
-               addl    $32,%esp
-               popl    %ebp
-               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 ***************************
@@ -188,64 +190,195 @@ calljava_xhandler:
 *******************************************************************************/
 
 call_name2:
-       .ascii  "calljavafunction\0\0"
-
-/*     .align  3 */
        .align  8
-       .long   0                         /* catch type all                       */
-       .long   calljava_xhandler2        /* handler pc                           */
-       .long   calljava_xhandler2        /* end pc                               */
-       .long   asm_calljavafunction      /* start pc                             */
+
+       .quad   0                         /* catch type all                       */
+       .quad   calljava_xhandler2        /* handler pc                           */
+       .quad   calljava_xhandler2        /* end pc                               */
+       .quad   asm_calljavafunction2     /* start pc                             */
        .long   1                         /* extable size                         */
        .long   0                         /* fltsave                              */
        .long   0                         /* intsave                              */
        .long   0                         /* isleaf                               */
        .long   0                         /* IsSync                               */
-       .long   32                        /* frame size                           */
-       .long   0                         /* method pointer (pointer to name)     */
-
-asm_calljavafunction:
-               pushl   %ebp                  /* allocate stack space                 */
-               movl    %esp, %ebp
-
-               subl    $32,%esp              /* pass the remaining parameters        */
-               xorl    %edx,%edx
-
-               movl    %edx,28(%esp)         /* convert parms to 8 byte              */
-               movl    24(%ebp),%eax
-               movl    %eax,24(%esp)
+       .long   24                        /* frame size                           */
+       .quad   0                         /* method pointer (pointer to name)     */
+
+asm_calljavafunction2:
+asm_calljavafunction2double:
+asm_calljavafunction2long:
+       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                 */
                
-               movl    %edx,20(%esp)
-               movl    20(%ebp),%eax
-               movl    %eax,16(%esp)
-
-               movl    %edx,12(%esp)
-               movl    16(%ebp),%eax
-               movl    %eax,8(%esp)
-
-               movl    %edx,4(%esp)
-               movl    12(%ebp),%eax
-               movl    %eax,(%esp)
-
-               movl    8(%ebp),%eax          /* move function pointer to %eax        */
-
-               lea             asm_call_jit_compiler,%ecx 
-               call    *%ecx                 /* call JIT compiler                    */
+       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:
-               leave
-               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:
-               pushl   %eax                              /* pass exception pointer               */
-               call    builtin_throw_exception
-               addl    $4,%esp
-               addl    $32,%esp
-               popl    %ebp
-               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 *****************************
 *                                                                              *
@@ -274,86 +407,103 @@ calljava_xhandler2:
 *                                                                              *
 *******************************************************************************/
 
-
 asm_call_jit_compiler:
-               pushl   %ebp
-               movl    %esp, %ebp
+        sub     $8,%rsp         /* keep stack 16-byte aligned                 */
 
-               pushl   %ebx            /* save register                              */
-/*             pushl   %esi*/
-/*             pushl   %edi*/
-                               
-               movl    4(%ebp),%edx    /* get return address                         */
-               movb    -1(%edx),%bl    /* get function code                          */
-               cmpb    $0xd2,%bl               /* called with `call *REG_ITMP2' (%edx)?      */
-               jne             L_not_static_special
+        mov     %rbx,(%rsp)     /* save register                              */
+        
+        mov     8(%rsp),%r11    /* get return address                         */
+        mov     -1(%r11),%bl   /* get function code                          */
+        cmp     $0xd2,%bl              /* called with `call *REG_ITMP2' (%r10)?      */
+        jne     L_not_static_special
 
-               subl    $6,%edx                 /* calculate address of immediate             */
-               jmp             L_call_jit_compile
+        sub     $11,%r11        /* calculate address of immediate             */
+        jmp            L_call_jit_compile
                
 L_not_static_special:
-               cmpb    $0xd0,%bl               /* called with `call *REG_ITMP1' (%eax)       */
-               jne             L_not_virtual_interface
+               cmp     $0xd0,%bl               /* called with `call *REG_ITMP1' (%rax)       */
+               jne     L_not_virtual_interface
                
-               subl    $6,%edx         /* calculate address of offset                */
-               movl    (%edx),%edx     /* get offset                                 */
-               addl    %ecx,%edx       /* add base address to get method address     */
-               jmp             L_call_jit_compile
+               sub     $7,%r11         /* calculate address of offset                */
+               mov     (%r11),%r11d    /* get offset (32-bit)                        */
+               add     %r10,%r11       /* add base address to get method address     */
+               jmp     L_call_jit_compile
 
 L_not_virtual_interface:        /* a call from asm_calljavamethod             */
-               xorl    %edx,%edx
+               xor     %r11,%r11
                
 L_call_jit_compile:
-               pushl   %edx            /* save address for method pointer            */
-
-               pushl   %eax                    /* push methodpointer on stack                */
+        mov     (%rsp),%rbx     /* restore register                           */
+        
+        sub     $(24*8),%rsp    /* 8 + 48 + 64 + 64                           */
+        
+               mov     %r11,0*8(%rsp)  /* save address for method pointer            */
+
+        mov     %rdi,1*8(%rsp)  /* save arguments                             */
+        mov     %rsi,2*8(%rsp)
+        mov     %rdx,3*8(%rsp)
+        mov     %rcx,4*8(%rsp)
+        mov     %r8,5*8(%rsp)
+        mov     %r9,6*8(%rsp)
+
+        movq    %xmm0,7*8(%rsp)
+        movq    %xmm1,8*8(%rsp)
+        movq    %xmm2,9*8(%rsp)
+        movq    %xmm3,10*8(%rsp)
+        movq    %xmm4,11*8(%rsp)
+        movq    %xmm5,12*8(%rsp)
+        movq    %xmm6,13*8(%rsp)
+        movq    %xmm7,14*8(%rsp)
+
+        movq    %xmm8,15*8(%rsp)/* we use them as callee saved registers      */
+        movq    %xmm9,16*8(%rsp)
+        movq    %xmm10,17*8(%rsp)
+        movq    %xmm11,18*8(%rsp)
+        movq    %xmm12,19*8(%rsp)
+        movq    %xmm13,20*8(%rsp)
+        movq    %xmm14,21*8(%rsp)
+        movq    %xmm15,22*8(%rsp)
+
+        mov     %rax,%rdi       /* pass method pointer                        */
                call    jit_compile
-               addl    $4,%esp
 
-               popl    %edx            /* restore address for method pointer         */
-               testl   %edx,%edx               /* is address == 0 (asm_calljavamethod)       */
+        mov     0*8(%rsp),%r11
+        
+        mov     1*8(%rsp),%rdi
+        mov     2*8(%rsp),%rsi
+        mov     3*8(%rsp),%rdx
+        mov     4*8(%rsp),%rcx
+        mov     5*8(%rsp),%r8
+        mov     6*8(%rsp),%r9
+
+        movq    7*8(%rsp),%xmm0
+        movq    8*8(%rsp),%xmm1
+        movq    9*8(%rsp),%xmm2
+        movq    10*8(%rsp),%xmm3
+        movq    11*8(%rsp),%xmm4
+        movq    12*8(%rsp),%xmm5
+        movq    13*8(%rsp),%xmm6
+        movq    14*8(%rsp),%xmm7
+
+        movq    15*8(%rsp),%xmm8
+        movq    16*8(%rsp),%xmm9
+        movq    17*8(%rsp),%xmm10
+        movq    18*8(%rsp),%xmm11
+        movq    19*8(%rsp),%xmm12
+        movq    20*8(%rsp),%xmm13
+        movq    21*8(%rsp),%xmm14
+        movq    22*8(%rsp),%xmm15
+
+        add     $(24*8),%rsp
+
+               test    %r11,%r11               /* is address == 0 (asm_calljavamethod)       */
                je              L_call_method
                
-               movl    %eax,(%edx)             /* and now save the new pointer               */
+               mov     %rax,(%r11)             /* and now save the new pointer               */
 
 L_call_method:
-/*             popl    %edi            /* restore registers                          */
-/*             popl    %esi*/
-               popl    %ebx
-               
-               leave
-               jmp             *%eax                   /* ...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:
-               push    %ebx
-               push    %ebp
-               push    %esi
-               push    %edi
-                               
-               movl    8(%ebp),%eax            /* load function pointer */
-               call    *%eax                           /* call function */
-
-               pop             %edi
-               pop             %esi
-               pop             %ebp
-               pop             %ebx
-               
-               ret
+        add     $8,%rsp         /* keep stack 16-byte aligned                 */
+               jmp             *%rax                   /* ...and now call the new method             */
 
 
 /********************* function asm_handle_exception ***************************
@@ -369,413 +519,578 @@ asm_dumpregistersandcall:
 *******************************************************************************/
 
 asm_handle_nat_exception:
-               addl    $4,%esp                                         /* clear return address of native stub */
+       add     $8,%rsp                     /* clear return address of native stub*/
                
 asm_handle_exception:
-               pushl   %eax
-               pushl   %edx                                            /* get the data segment ptr       */
-               call    findmethod
-               movl    %eax,%ecx
-               popl    %edx
-               popl    %eax
-
-               pushl   %ebp
-               movl    %esp,%ebp
-
-               pushl   %eax                                            /* save exception pointer         */
-/*             subl    $2,%edx */
-               pushl   %edx                                            /* save exception pc              */
-               pushl   %ecx                                            /* save data segment pointer      */
+       sub     $(4*8),%rsp
+       mov     xptr,0*8(%rsp)              /* save exception pointer             */
+       mov     xpc,1*8(%rsp)               /* save exception pc                  */
+        
+       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               */
         
-               pushl   %ebx
-               pushl   %esi
-               pushl   %edi
-               
 ex_stack_loop:
-               subl    $16,%esp
-
-               movl    %eax,(%esp)                                     /* exception pointer */
-
-               movl    MethodPointer(%ecx),%eax        /* method pointer */
-               movl    %eax,4(%esp)
-               
-               movl    %edx,8(%esp)                            /* exception pc */
-               movl    $1,12(%esp)                                     /* set no unwind flag */
-               call    builtin_trace_exception
-
-               addl    $16,%esp
-
-               movl    -12(%ebp),%esi                          /* %esi = data segment pointer */
-               movl    ExTableSize(%esi),%ecx          /* %ecx = exception table size */
-               test    %ecx,%ecx                                       /* if empty table skip */
-               je              empty_table
-
-               lea             ExTableStart(%esi),%edi         /* %edi = start of exception table */
-               movl    -4(%ebp),%eax                           /* 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:
-               movl    -8(%ebp),%edx                           /* get xpc */
+       mov     1*8(%rsp),xpc               /* get xpc                            */
                
-               movl    ExStartPC(%edi),%ebx            /* %ebx = exception start pc */
-               cmpl    %edx,%ebx                                       /* %ebx = (startpc <= xpc) */
-               jg              ex_table_cont                           /* if (false) continue */
-               movl    ExEndPC(%edi),%ebx                      /* %ebx = exception end pc */
-               cmpl    %ebx,%edx                                       /* %ebx = (xpc < endpc) */
-               jge             ex_table_cont                           /* if (false) continue */
-               movl    ExCatchType(%edi),%ebx          /* arg1 = exception catch type */
-               test    %ebx,%ebx                                       /* NULL catches everything */
-               je              ex_handle_it
-
-               movl    offobjvftbl(%eax),%esi          /* %esi = vftblptr(xptr) */
-               movl    offobjvftbl(%ebx),%ebx          /* %ebx = vftblptr(catchtype) class (not obj) */
-               movl    offbaseval(%esi),%esi           /* %esi = baseval(xptr) */
-               movl    offbaseval(%ebx),%edx           /* %edx = baseval(catchtype) */
-               movl    offdiffval(%ebx),%ebx           /* %ebx = diffval(catchtype) */
-               subl    %edx,%esi                                       /* %esi = baseval(xptr) - baseval(catchtype) */
-               cmpl    %ebx,%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:
-               movl    ExHandlerPC(%edi),%edx
-               
-               popl    %edi
-               popl    %esi
-               popl    %ebx
-        
-        popl    %eax                        /* pop %ecx (dummy) */
-        popl    %eax                        /* pop %edx (dummy) */
-        popl    %eax                        /* pop %eax */
-        
-               leave
+               mov     ExHandlerPC(%rdi),xpc       /* xpc = exception handler pc     */
+
+        mov     0*8(%rsp),%rax              /* restore exception pointer      */
+        add     $(4*8),%rsp                 /* free stack frame               */
 
-               jmp             *%edx
+        jmp            *xpc                        /* jump to the handler            */
 
 ex_table_cont:
-               lea             ExEntrySize(%edi),%edi
-               decl    %ecx
-               test    %ecx,%ecx
-               jg              ex_table_loop
+        lea            ExEntrySize(%rdi),%rdi      /* next exception table entry     */
+        dec     %rcx                        /* decrement entry counter        */
+        test   %rcx,%rcx                   /* if (t0 > 0) next entry         */
+        jg             ex_table_loop
                
 empty_table:
-               popl    %edi
-               popl    %esi
-               popl    %ebx
-               popl    %ecx                                            /* restore data segment pointer   */
-               popl    %edx
-               popl    %eax                                            /* restore exception pointer      */
-               popl    %ebp
-
-               movl    %eax,%edi                                       /* save exception pointer         */
+        mov     0*8(%rsp),%rax              /* restore exception pointer      */
+        mov     1*8(%rsp),%r10              /* restore exception pc           */
+        mov     2*8(%rsp),%r11                         /* restore data segment pointer   */
+        add     $(4*8),%rsp
+        
+               mov     %rax,%rcx                                       /* save exception pointer         */
                                
 ex_already_cleared:            
-               movl    IsSync(%ecx),%eax                       /* %eax = SyncOffset              */
-               test    %eax,%eax                                       /* if zero no monitorexit         */
+               movl    IsSync(%r11),%eax                       /* %rax = SyncOffset              */
+               test    %rax,%rax                                       /* if zero no monitorexit         */
                je              no_monitor_exit
                
-               addl    %esp,%eax
-               movl    -8(%eax),%eax
-               pushl   %eax
-               call    builtin_monitorexit
-               addl    $4,%esp
+               add     %rsp,%rax
+               mov     -8(%rax),%rdi
+
+        sub     $(4*8),%rsp
+        mov     %rcx,0*8(%rsp)
+        mov     %r10,1*8(%rsp)
+        mov     %r11,2*8(%rsp)
         
+               call    builtin_monitorexit
+
+        mov     0*8(%rsp),%rcx
+        mov     1*8(%rsp),%r10
+        mov     2*8(%rsp),%r11
+        add     $(4*8),%rsp
+                
 no_monitor_exit:
-               movl    FrameSize(%ecx),%eax            /* %eax = frame size              */
-               addl    %eax,%esp                                       /* unwind stack                   */
-               movl    %esp,%eax                                       /* %eax = pointer to save area    */
+               mov             FrameSize(%r11),%eax        /* %eax = frame size              */
+               add             %rax,%rsp                   /* unwind stack                   */
+               mov             %rsp,%rax                   /* %rax = pointer to save area    */
 
-               movl    IntSave(%ecx),%edx                      /* %edx = saved int register count */
-               test    %edx,%edx
-               je              noint
-               cmpl    $1,%edx
+               mov             IntSave(%r11),%edx          /* %edx = saved int register count*/
+        test   %edx,%edx
+        je             noint
+        
+               cmp     $1,%edx
                je              int1
-               
-int2:  
-               movl    -16(%eax),%ebx
-
-int1:  
-               movl    -8(%eax),%ebp
-
-               shll    $3,%edx                                         /* multiply by 8 bytes             */
-               subl    %edx,%eax
+               cmp             $2,%edx
+               je              int2
+               cmp             $3,%edx
+               je              int3
+               cmp             $4,%edx
+               je              int4
+               cmp             $5,%edx
+               je              int5
+        
+        mov     -48(%rax),%rbx
+int5:   
+        mov     -40(%rax),%rbp
+int4:   
+        mov     -32(%rax),%r12
+int3:   
+        mov     -24(%rax),%r13
+int2:   
+               mov     -16(%rax),%r14
+int1:   
+               mov     -8(%rax),%r15
+
+               shl             $3,%edx                     /* multiply by 8 bytes            */
+               sub     %rdx,%rax
                
 noint:
-               movl    FltSave(%ecx),%edx                      /* %edx = saved flt register count */
+               mov     FltSave(%r11),%edx          /* %edx = saved flt register count*/
                test    %edx,%edx
-               je              noflt
-               cmpl    $1,%edx
-               je              flt1
-               cmpl    $2,%edx
-               je              flt2
-               cmpl    $3,%edx
-               je              flt3
-               
-flt4:  
-               fldl    -32(%eax)
-               fstp    %st(1)
-
-flt3:  
-               fldl    -24(%eax)
-               fstp    %st(2)
-               
-flt2:  
-               fldl    -16(%eax)
-               fstp    %st(3)
-               
-flt1:  
-               fldl    -8(%eax)
-               fstp    %st(4)
-               
+               je      noflt
+
+        cmpl    $1,%edx
+        je      flt1
+        cmpl    $2,%edx
+        je      flt2
+        cmpl    $3,%edx
+        je      flt3
+        cmpl    $4,%edx
+        je      flt4
+        cmpl    $5,%edx
+        je      flt5
+        cmpl    $6,%edx
+        je      flt7
+        cmpl    $7,%edx
+        je      flt7
+
+        movq    -64(%rax),%xmm8
+flt7:   
+        movq    -56(%rax),%xmm9
+flt6:   
+        movq    -48(%rax),%xmm10
+flt5:   
+        movq    -40(%rax),%xmm11
+flt4:   
+        movq    -32(%rax),%xmm12
+flt3:   
+        movq    -24(%rax),%xmm13
+flt2:   
+        movq    -16(%rax),%xmm14
+flt1:   
+        movq    -8(%rax),%xmm15
+                
 noflt:                                 
-               popl    %edx                                            /* the new xpc is return address  */
-               subl    $2,%edx
-               
-               pushl   %edx
-               pushl   %ebx
-               pushl   %ebp
-               pushl   %esi
-               pushl   %edi
-                                                               
-               pushl   %edx                                            /* get the new data segment ptr   */
-               call    findmethod
-               movl    %eax,%ecx
-               addl    $4,%esp
-
-               popl    %edi
-               popl    %esi
-               popl    %ebp
-               popl    %ebx
-               popl    %edx
-               
-               movl    %edi,%eax                                       /* restore saved exception pointer */
-                               
-               pushl   %ebp
-               movl    %esp,%ebp
-
-               pushl   %eax                                            /* save exception pointer         */
-               pushl   %edx                                            /* save exception pc              */
-               pushl   %ecx                                            /* save data segment pointer      */
-               pushl   %ebx
-               pushl   %esi
-               pushl   %edi
-               
-               jmp             ex_stack_loop
-               
+               pop     %r10                                            /* the new xpc is return address  */
+               sub     $3,%r10                     /* subtract 3 bytes for call      */
 
-/********************* function asm_builtin_monitorenter ***********************
-*                                                                              *
-*   Does null check and calls monitorenter or throws an exception              *
-*                                                                              *
-*******************************************************************************/
+        sub     $(2*8),%rsp
+        mov     %rcx,0*8(%rsp)
+        mov     %r10,1*8(%rsp)
 
-asm_builtin_monitorenter:
-               cmpl    $0,4(%esp)
-               je              nb_monitorenter                 /* if (null) throw exception          */
-               jmp             builtin_monitorenter    /* else call builtin_monitorenter     */
+        mov     %r10,%rdi
+        call   codegen_findmethod          /* get the new data segment ptr   */
+        mov     %rax,%r11
+        
+        mov     0*8(%rsp),%rcx
+        mov     1*8(%rsp),%r10
+        add     $(2*8),%rsp
 
-nb_monitorenter:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               movl    proto_java_lang_NullPointerException,%eax
-               jmp             asm_handle_exception
+        mov     %rcx,%rax                                      /* restore saved exception pointer*/
+
+        sub     $(4*8),%rsp
+                                       
+        mov     %rax,0*8(%rsp)              /* save exception pointer         */
+        mov     %r10,1*8(%rsp)              /* save exception pc              */
+               mov     %r11,2*8(%rsp)                          /* save data segment pointer      */
                
+               jmp             ex_stack_loop
 
-/********************* function asm_builtin_monitorexit ************************
-*                                                                              *
-*   Does null check and calls monitorexit or throws an exception               *
-*                                                                              *
-*******************************************************************************/
 
-asm_builtin_monitorexit:
-               cmpl    $0,4(%esp)
-               je              nb_monitorexit                  /* if (null) throw exception          */
-               jmp             builtin_monitorexit             /* else call builtin_monitorenter     */
+/* asm_check_clinit ************************************************************
 
-nb_monitorexit:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               movl    proto_java_lang_NullPointerException,%eax
-               jmp             asm_handle_exception
+   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
 
-/************************ function asm_builtin_idiv ****************************
-*                                                                              *
-*   Does null check and calls idiv or throws an exception                      *
-*                                                                              *
 *******************************************************************************/
 
-asm_builtin_idiv:
-               cmpl    $0,12(%esp)             /* if (null) throw exception */
-               je              nb_idiv
+asm_check_clinit:
+       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     32(%rsp),itmp1              /* get return address                 */
+       sub     $5,itmp1                    /* remove size of `call rel32'        */
 
-               movl    4(%esp),%eax            /* 4 (return) = 4 */
-               cltd
-               idivl   12(%esp)
+       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              */
 
-               ret
+       add     $(5*8),%rsp                 /* remove stub stack frame incl. ra   */
 
-nb_idiv:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_ArithmeticException,%eax
-               jmp             asm_handle_exception
-               
+       jmp     *itmp1                      /* jump to patched code an execute it */
 
-/************************ function asm_builtin_ldiv ****************************
-*                                                                              *
-*   Does null check and calls ldiv or throws an exception                      *
-*                                                                              *
-*******************************************************************************/
+L_initializererror:
+       add     $(4*8),%rsp                 /* remove stub stack frame            */
 
-asm_builtin_ldiv:
-               movl    12(%esp),%eax
-               orl             16(%esp),%eax
-               test    %eax,%eax                               /* if (null) throw exception */
-               je              nb_ldiv
+#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
 
-               jmp             builtin_ldiv
+       pop     xpc                         /* delete return address              */
+       sub     $5,xpc                      /* faulting address is ra - 5         */
 
-nb_ldiv:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
+       jmp     asm_handle_exception
                
-               movl    proto_java_lang_ArithmeticException,%eax
-               jmp             asm_handle_exception
-                               
 
-/************************ function asm_builtin_irem ****************************
+/********************* function asm_builtin_monitorenter ***********************
 *                                                                              *
-*   Does null check and calls irem or throws an exception                      *
+*   Does null check and calls monitorenter or throws an exception              *
 *                                                                              *
 *******************************************************************************/
 
-asm_builtin_irem:
-               cmpl    $0,12(%esp)             /* if (null) throw exception */
-               je              nb_irem
-
-               movl    4(%esp),%eax            /* 4 (return) = 4 */
-               cltd
-               idivl   12(%esp)
-               
-               movl    %edx,%eax
-               ret
+asm_builtin_monitorenter:
+       test    %rdi,%rdi
+       je      nb_monitorenter             /* if (null) throw exception          */
+       jmp     builtin_monitorenter        /* else call builtin_monitorenter     */
 
-nb_irem:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
+nb_monitorenter:
+       call    new_nullpointerexception
+    pop     %r10                        /* delete return address              */
+    sub     $3,%r10                     /* faulting address is return adress - 3 */
+    jmp     asm_handle_exception
                
-               movl    proto_java_lang_ArithmeticException,%eax
-               jmp             asm_handle_exception
 
-
-/************************ function asm_builtin_lrem ****************************
+/********************* function asm_builtin_monitorexit ************************
 *                                                                              *
-*   Does null check and calls lrem or throws an exception                      *
+*   Does null check and calls monitorexit or throws an exception               *
 *                                                                              *
 *******************************************************************************/
 
-asm_builtin_lrem:
-               movl    12(%esp),%eax
-               orl             16(%esp),%eax
-               test    %eax,%eax                               /* if (null) throw exception */
-               je              nb_lrem
-
-               jmp             builtin_lrem
-
-nb_lrem:
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_ArithmeticException,%eax
-               jmp             asm_handle_exception
-               
+asm_builtin_monitorexit:
+       test    %rdi,%rdi
+       je      nb_monitorexit              /* if (null) throw exception          */
+       jmp     builtin_monitorexit         /* else call builtin_monitorenter     */
 
-/*********************** function new_builtin_checkcast ************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
+nb_monitorexit:
+       call    new_nullpointerexception
+    pop     %r10                        /* delete return address              */
+    sub     $3,%r10                     /* faulting address is return adress - 3 */
+    jmp     asm_handle_exception
 
-asm_builtin_checkcast:
-               xorl    %eax,%eax
-               movl    $0,(%eax)
-               ret
 
-               
-/******************* function asm_builtin_checkarraycast ***********************
+/********************* function asm_builtin_x2x ********************************
 *                                                                              *
-*   Does the cast check and eventually throws an exception                     *
+*   Wrapper functions for float to int corner cases                            *
 *                                                                              *
 *******************************************************************************/
 
-asm_builtin_checkarraycast:
-               subl    $8,%esp                                 /* build stack frame (2 * 4 bytes)    */
-
-               movl    12(%esp),%eax           /* 8 (frame) + 4 (return)             */
-               movl    %eax,(%esp)                             /* save object pointer                */
-
-               movl    20(%esp),%eax
-               movl    %eax,4(%esp)
-
-               call    builtin_checkarraycast  /* builtin_checkarraycast             */
+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)
        
-               test    %eax,%eax               /* if (false) throw exception         */
-               je              nb_carray_throw
+       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
 
-               movl    12(%esp),%eax                   /* return object pointer              */
-               addl    $8,%esp
-               ret
 
-nb_carray_throw:
-               addl    $8,%esp
-               
-               popl    %edx                                    /* delete return address              */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_ClassCastException,%eax
-               jmp             asm_handle_exception
-
-               
-/******************* function asm_builtin_anewarray ****************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
+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
 
-asm_builtin_anewarray:
-               subl    $8,%esp                                 /* build stack frame (2 * 4 bytes) */
 
-               movl    12(%esp),%eax
-               movl    %eax,(%esp)
+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
 
-               movl    20(%esp),%eax
-               movl    %eax,4(%esp)
 
-               call    builtin_anewarray
+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
        
-               addl    $8,%esp
-               ret
+       add     $(14*8),%rsp
+       ret
 
-               
-/******************* function asm_builtin_newarray_array ***********************
+
+/******************* function asm_builtin_checkarraycast ***********************
 *                                                                              *
 *   Does the cast check and eventually throws an exception                     *
 *                                                                              *
 *******************************************************************************/
 
-asm_builtin_newarray_array:
-               subl    $8,%esp                                 /* build stack frame (2 * 4 bytes) */
-
-               movl    12(%esp),%eax
-               movl    %eax,(%esp)
-
-               movl    20(%esp),%eax
-               movl    %eax,4(%esp)
+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
 
-               call    builtin_newarray_array
-       
-               addl    $8,%esp
-               ret
+nb_carray_throw:
+       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 ******************************
@@ -785,84 +1100,53 @@ asm_builtin_newarray_array:
 *******************************************************************************/
 
 asm_builtin_aastore:
-               subl    $12,%esp                                /* build stack frame (3 * 4 bytes)    */
-
-               movl    16(%esp),%eax           /* 12 (frame) + 4 (return)            */
-               test    %eax,%eax                               /* if null pointer throw exception    */
-               je              nb_aastore_null
+        sub     $(3*8),%rsp             /* allocate stack space               */
+        test    %rdi,%rdi               /* if null pointer throw exception    */
+        je      nb_aastore_null
 
-               movl    offarraysize(%eax),%edx /* load size                          */
-               movl    24(%esp),%ecx                   /* index                              */
-               cmpl    %edx,%ecx                               /* do bound check                     */
-               ja              nb_aastore_bound                /* if out of bounds throw exception   */
+        movl    offarraysize(%rdi),%eax /* load size                          */
+        cmpl    %eax,%esi                              /* do bound check                     */
+        jae     nb_aastore_bound               /* if out of bounds throw exception   */
 
-               shll    $2,%ecx                                 /* index * 4                          */
-               addl    %eax,%ecx                               /* add index * 4 to arrayref          */
+        shl     $3,%rsi                                        /* index * 8                          */
+        mov     %rdi,%r10
+        add     %rsi,%r10                              /* add index * 8 to arrayref          */
                
-               movl    %ecx,8(%esp)                    /* save store position                */
-               
-               movl    16(%esp),%eax           /* 12 (frame) + 4 (return)            */
-               movl    %eax,(%esp)
-
-               movl    32(%esp),%eax                   /* object is second argument          */
-               movl    %eax,4(%esp)
-               
-               call    builtin_canstore                /* builtin_canstore(arrayref,object)  */
-
-               test    %eax,%eax                               /* if (false) throw exception         */
-               je              nb_aastore_throw
-
-               movl    32(%esp),%eax
-               movl    8(%esp),%ecx
-               movl    %eax,offobjarrdata(%ecx)/* store objectptr in array           */
-               
-               addl    $12,%esp
-               ret
+        mov     %r10,(%rsp)                    /* save store position                */
+        mov     %rdx,8(%rsp)            /* save object                        */
+        
+        mov     %rdx,%rsi               /* object is second argument          */
+        call    builtin_canstore               /* builtin_canstore(arrayref,object)  */
+        test    %rax,%rax                              /* if (false) throw exception         */
+        je      nb_aastore_throw
+
+        mov     (%rsp),%r10             /* restore store position             */
+        mov     8(%rsp),%rdx            /* restore object                     */
+        mov     %rdx,offobjarrdata(%r10)/* store objectptr in array           */
+        add     $(3*8),%rsp             /* free stack space                   */
+        ret
 
 nb_aastore_null:
-               addl    $12,%esp
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_NullPointerException,%eax
-               jmp             asm_handle_exception
+               call    new_nullpointerexception
+        add     $24,%rsp
+        pop     %r10                                   /* delete return address              */
+        sub     $3,%r10                                        /* faulting address is return adress - 3 */
+        jmp     asm_handle_exception
 
 nb_aastore_bound:
-               addl    $12,%esp
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_ArrayIndexOutOfBoundsException,%eax
-               jmp             asm_handle_exception
+               mov     %rsi,%rdi               /* move index into a0                 */
+               call    new_arrayindexoutofboundsexception
+        add     $24,%rsp
+        pop     %r10                                   /* delete return address              */
+        sub     $3,%r10                                        /* faulting address is return adress - 3 */
+        jmp     asm_handle_exception
                
 nb_aastore_throw:
-               addl    $12,%esp
-               popl    %edx                                    /* delete return address */
-               subl    $2,%edx                                 /* faulting address is return adress - 2 */
-               
-               movl    proto_java_lang_ArrayStoreException,%eax
-               jmp             asm_handle_exception
-
-               
-/******************* function asm_builtin_arrayinstanceof **********************
-*                                                                              *
-*   Does the instanceof check of arrays                                        *
-*                                                                              *
-*******************************************************************************/
-
-asm_builtin_arrayinstanceof:
-               subl    $8,%esp                                 /* build stack frame (2 * 4 bytes) */
-
-               movl    12(%esp),%eax
-               movl    %eax,(%esp)
-
-               movl    20(%esp),%eax
-               movl    %eax,4(%esp)
-
-               call    builtin_arrayinstanceof
-       
-               addl    $8,%esp
-               ret
+               call    new_arraystoreexception
+        add     $24,%rsp
+        pop     %r10                                   /* delete return address              */
+        sub     $3,%r10                                        /* faulting address is return adress - 3 */
+        jmp            asm_handle_exception
 
                
 /******************* function asm_initialize_thread_stack **********************
@@ -873,23 +1157,19 @@ asm_builtin_arrayinstanceof:
 *******************************************************************************/
 
 asm_initialize_thread_stack:
-               movl    8(%esp),%eax            /* (to)->stackEnd                     */
-               subl    $36,%eax                                /* 4 bytes * 8 regs + 4 bytes func    */
-
-               xorl    %edx,%edx
-               movl    %edx,0(%eax)
-               movl    %edx,4(%eax)
-               movl    %edx,8(%eax)
-               movl    %edx,12(%eax)
-               movl    %edx,16(%eax)
-               movl    %edx,20(%eax)
-               movl    %edx,24(%eax)
-               movl    %edx,28(%eax)
-
-               movl    4(%esp),%edx            /* save (u1*) (func)                  */
-               movl    %edx,32(%eax)
-
-               ret                             /* return restorepoint in %eax        */
+        sub     $(7*8),%rsi
+
+        xor     %r10,%r10
+        mov     %r10,0*8(%rsi)
+        mov     %r10,1*8(%rsi)
+        mov     %r10,2*8(%rsi)
+        mov     %r10,3*8(%rsi)
+        mov     %r10,4*8(%rsi)
+        mov     %r10,5*8(%rsi)
+
+        mov     %rdi,6*8(%rsi)          /* save (u1*) (func)                  */
+        mov     %rsi,%rax               /* return restorepoint in %rax        */
+        ret
 
 
 /******************* function asm_perform_threadswitch *************************
@@ -901,192 +1181,105 @@ asm_initialize_thread_stack:
 *******************************************************************************/
 
 asm_perform_threadswitch:
-               subl    $36,%esp
-
-               movl    %eax,0(%esp)
-               movl    %edx,4(%esp)
-               movl    %ecx,8(%esp)
-               movl    %ebx,12(%esp)
-               movl    %esp,16(%esp)
-               movl    %ebp,20(%esp)
-               movl    %esi,24(%esp)
-               movl    %edi,28(%esp)
-
-               movl    36(%esp),%eax                   /* save current return address */
-               movl    %eax,32(%esp)
-
-               movl    40(%esp),%eax                   /* first argument **from */
-               movl    %esp,0(%eax)
-
-               movl    48(%esp),%eax                   /* third argument **stackTop */
-               movl    %esp,0(%eax)
-
-               movl    44(%esp),%eax                   /* second argument **to */
-               movl    0(%eax),%esp                    /* load new stack pointer */
-
-               movl    0(%esp),%eax
-               movl    4(%esp),%edx
-               movl    8(%esp),%ecx
-               movl    12(%esp),%ebx
-                                                                               /* skip stack pointer */
-               movl    20(%esp),%ebp
-               movl    24(%esp),%esi
-               movl    28(%esp),%edi
-
-               addl    $32,%esp                /* leave return address on stack      */
-               ret
-               
+        sub     $(7*8),%rsp             /* allocate stack frame               */
 
-/********************* function asm_switchstackandcall *************************
-*                                                                              *
-*  int 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                *
-*                                                                              *
-*******************************************************************************/
+        mov     %rbx,0*8(%rsp)
+        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)
 
-asm_switchstackandcall:
-               movl    4(%esp),%edx                    /* first argument *stack */
-               subl    $8,%edx                                 /* allocate new stack */
+        mov     7*8(%rsp),%rax                 /* save current return address        */
+        mov     %rax,6*8(%rsp)
 
-               movl    (%esp),%eax                             /* save return address on new stack */
-               movl    %eax,(%edx)
+        mov     %rsp,(%rdi)                    /* first argument **from              */
+        mov     %rsp,(%rdx)                    /* third argument **stackTop          */
 
-               movl    %esp,4(%edx)                    /* save old stack pointer on new stack */
+        mov     (%rsi),%rsp                    /* load new stack pointer             */
 
-               movl    12(%esp),%eax                   /* third argument **stacktopsave */
-               movl    %esp,(%eax)                             /* save old stack pointer to variable */
+        mov     0*8(%rsp),%rbx
+        mov     1*8(%rsp),%rbp
+        mov     2*8(%rsp),%r12
+        mov     3*8(%rsp),%r13
+        mov     4*8(%rsp),%r14
+        mov     5*8(%rsp),%r15
 
-               movl    8(%esp),%eax                    /* load function pointer */
-               movl    16(%esp),%ecx                   /* fourth argument *p */
+        mov     6*8(%rsp),%rax          /* restore return address             */
+        add     $(7*8),%rsp             /* free stack frame                   */
+        mov     %rax,(%rsp)
+        ret
                
-               movl    %edx,%esp                               /* switch to new stack */
-
-               subl    $4,%esp
-               movl    %ecx,0(%esp)                    /* pass pointer */
-               call    *%eax                                   /* and call function */
-               addl    $4,%esp
 
-               movl    (%esp),%edx                             /* load return address */
-               movl    4(%esp),%esp                    /* switch to old stack */
-               movl    %edx,(%esp)
-               ret
-
-               
-/********************* function asm_getcallingmethod ***************************
-*                                                                              *
-*   classinfo *asm_getcallingmethod ();                                                                   *
-*                                                                                                                                                         *    
-*   goes back stack frames to get the calling method                                              *       
-*                                                                                                                                                         *    
-*                              t2 .. sp                                                                                                       *
-*                              t3 .. ra                                                                                                       *
-*                              t4 .. pv                                                                                                       *
+/********************* function asm_switchstackandcall *************************
 *                                                                              *
-*******************************************************************************/
-
-asm_getcallingmethod:
-               xorl    %eax,%eax
-/*             movl    $0,(%eax) */
-               ret
-
-
-/*********************** function asm_builtin_trace ****************************
+*  int asm_switchstackandcall (void *stack, void *func, void **stacktopsave,   *
+*                                     void *p);                                       *
 *                                                                              *
-*   Intended to be called from the native stub. Saves all argument registers   *
-*   and calls builtin_trace_args.                                              *
+*   Switches to a new stack, calls a function and switches back.               *
+*       a0 (%rdi)     new stack pointer                                        *
+*       a1 (%rsi)     function pointer                                         *
+*              a2 (%rdx)     pointer to variable where stack top should be stored     *
+*       a3 (%rcx)     pointer to user data, is passed to the function          *
 *                                                                              *
 *******************************************************************************/
 
-asm_builtin_trace:
-        pusha
-        subl    $68,%esp                /* 4 + 8 * 4 + 68 = 104 */
-
-        movl    104(%esp),%eax
-        movl    108(%esp),%edx
-        movl    %eax,(%esp)
-        movl    %edx,4(%esp)
-
-        movl    112(%esp),%eax
-        movl    116(%esp),%edx
-        movl    %eax,8(%esp)
-        movl    %edx,12(%esp)
-
-        movl    120(%esp),%eax
-        movl    124(%esp),%edx
-        movl    %eax,16(%esp)
-        movl    %edx,20(%esp)
-
-        movl    128(%esp),%eax
-        movl    132(%esp),%edx
-        movl    %eax,24(%esp)
-        movl    %edx,28(%esp)
-
-        movl    136(%esp),%eax
-        movl    140(%esp),%edx
-        movl    %eax,32(%esp)
-        movl    %edx,36(%esp)
-
-        movl    144(%esp),%eax
-        movl    148(%esp),%edx
-        movl    %eax,40(%esp)
-        movl    %edx,44(%esp)
-
-        movl    152(%esp),%eax
-        movl    156(%esp),%edx
-        movl    %eax,48(%esp)
-        movl    %edx,52(%esp)
-
-        movl    160(%esp),%eax
-        movl    164(%esp),%edx
-        movl    %eax,56(%esp)
-        movl    %edx,60(%esp)
-
-        movl    168(%esp),%eax
-        movl    %eax,64(%esp)
-        
-        call    builtin_trace_args
-        addl    $68,%esp
+asm_switchstackandcall:
+        sub     $(1*8),%rsp             /* keep stack 16-byte aligned         */
+        sub     $16,%rdi                               /* allocate new stack                 */
 
-        popa
-        ret
+        mov     8(%rsp),%rax                   /* save return address on new stack   */
+        mov     %rax,(%rdi)
+        mov     %rsp,8(%rdi)                   /* save old stack pointer on new stack*/
+        mov     %rsp,(%rdx)                            /* save old stack pointer to variable */
 
+        mov     %rdi,%rsp                              /* switch to new stack                */
 
-/********************* function asm_builtin_exittrace **************************
-*                                                                              *
-*   Intended to be called from the native stub. Saves return value and calls   *
-*   builtin_displaymethodstop.                                                 *
-*                                                                              *
-*******************************************************************************/
-
-asm_builtin_exittrace:
-        pusha
-        subl    $24,%esp
-        
-        movl    60(%esp),%eax           /* 4 + 8 * 4 + 24 = 60 */
-        movl    %eax,(%esp)
+        mov     %rcx,%rdi                      /* pass pointer                       */
+        call   *%rsi                                   /* and call function                  */
 
-        movl    64(%esp),%eax
-        movl    68(%esp),%edx
-        movl    %eax,4(%esp)
-        movl    %edx,8(%esp)
+        mov     (%rsp),%r10                            /* load return address                */
+        mov     8(%rsp),%rsp                   /* switch to old stack                */
+        add     $(1*8),%rsp             /* free stack space                   */
+        mov     %r10,(%rsp)             /* write return adress                */
+        ret
 
-        movl    72(%esp),%eax
-        movl    76(%esp),%edx
-        movl    %eax,12(%esp)
-        movl    %edx,16(%esp)
 
-        movl    80(%esp),%eax
-        movl    %eax,20(%esp)
+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
 
-        call    builtin_displaymethodstop
-        addl    $24,%esp
+       .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
 
-        popa
-        ret
-        
\ No newline at end of file
+                               
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */