* Removed all Id tags.
[cacao.git] / src / vm / jit / alpha / asmpart.S
index 9ae20fda879a2df9c613ee26d2192ccb403190c6..c19d61f3a99671a69f45c5bb6e94c248edb65ccc 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Andreas Krall
-            Reinhard Grafl
-
-   Changes: Joseph Wenninger
-            Christian Thalinger
-               Edwin Steiner
-
-   $Id: asmpart.S 4921 2006-05-15 14:24:36Z twisti $
-
 */
 
 
@@ -40,7 +29,6 @@
 
 #include "vm/jit/alpha/md-abi.h"
 #include "vm/jit/alpha/md-asm.h"
-#include "vm/jit/alpha/offsets.h"
 
 #include "vm/jit/abi-asm.h"
 #include "vm/jit/methodheader.h"
        .globl asm_vm_call_method_float
        .globl asm_vm_call_method_double
        .globl asm_vm_call_method_exception_handler
+       .globl asm_vm_call_method_end
 
        .globl asm_call_jit_compiler
+
        .globl asm_handle_exception
        .globl asm_handle_nat_exception
 
-       .globl asm_wrapper_patcher
+       .globl asm_abstractmethoderror
 
-       .globl asm_replacement_out
-       .globl asm_replacement_in
-
-       .globl asm_perform_threadswitch
-       .globl asm_initialize_thread_stack
-       .globl asm_switchstackandcall
-       .globl asm_criticalsections
-       .globl asm_getclassvalues_atomic
+       .globl asm_compare_and_swap
+       .globl asm_memory_barrier
 
        .globl asm_md_init
        .globl asm_cacheflush
        .long   0                           /* isleaf                             */
        .long   0                           /* IsSync                             */
        .long   0                           /* frame size                         */
-       .quad   0                           /* method pointer (pointer to name)   */
+       .quad   0                           /* codeinfo pointer                   */
 
 asm_vm_call_method:
 asm_vm_call_method_int:
@@ -119,91 +103,72 @@ asm_vm_call_method_long:
 asm_vm_call_method_float:
 asm_vm_call_method_double:
        ldgp    gp,0(pv)
-       lda     sp,-5*8(sp)               /* allocate stack space                 */
-       stq     ra,0*8(sp)                /* save return address                  */
-       stq     gp,1*8(sp)                /* save global pointer                  */
-       stq     s6,3*8(sp)
-
-       stq     a0,4*8(sp)                /* save method pointer for compiler     */
-
-       mov     a2,t0                     /* pointer to arg block                 */
-       mov     a1,s6                     /* arg count                            */
-
-       ble     s6,calljava_argsloaded
-       lda     s6,-1(s6)
-       ldq     a0,offvmargdata(t0)
-       ldt     $f16,offvmargdata(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a1,offvmargdata+sizevmarg*1(t0)
-       ldt     $f17,offvmargdata+sizevmarg*1(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a2,offvmargdata+sizevmarg*2(t0)
-       ldt     $f18,offvmargdata+sizevmarg*2(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a3,offvmargdata+sizevmarg*3(t0)
-       ldt     $f19,offvmargdata+sizevmarg*3(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a4,offvmargdata+sizevmarg*4(t0)
-       ldt     $f20,offvmargdata+sizevmarg*4(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a5,offvmargdata+sizevmarg*5(t0)
-       ldt     $f21,offvmargdata+sizevmarg*5(t0)
-calljava_argsloaded:
-       mov     sp,t4
-       ble     s6,calljava_nocopy
-       negq    s6,t1
-       s8addq  t1,sp,sp
-       s8addq  t1,t4,t2
-
-calljava_copyloop:
-       ldq     t3,offvmargdata+sizevmarg*6(t0)
-       stq     t3,0(t2)
-       lda     t1,1(t1)
-       lda     t0,sizevmarg(t0)
-       lda     t2,8(t2)
-       bne     t1,calljava_copyloop
-
-calljava_nocopy:
-       ldq     itmp1,4*8(t4)             /* pass method pointer via itmp1        */
-
-       lda     mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
-       stq     mptr,2*8(t4)              /* store function address               */
-       lda     mptr,1*8(t4)              /* set method pointer                   */
-
-       ldq     pv,1*8(mptr)              /* method call as in Java               */
-       jmp     ra,(pv)                   /* call JIT compiler                    */
-calljava_jit2:
-       lda     pv,(asm_vm_call_method - calljava_jit2)(ra)
-
-       s8addq  s6,sp,sp
-calljava_return2:
-       ldq     ra,0*8(sp)                /* restore return address               */
-       ldq     gp,1*8(sp)                /* restore global pointer               */
-       ldq     s6,3*8(sp)
-       lda     sp,5*8(sp)                /* free stack space                     */
-
-calljava_ret2:
+       lda     sp,-5*8(sp)                 /* allocate stack space               */
+       stq     ra,0*8(sp)                  /* save return address                */
+       stq     gp,1*8(sp)                  /* save global pointer                */
+
+       stq     s0,3*8(sp)
+       stq     a0,4*8(sp)                  /* save method PV                     */
+
+       mov     a1,t0                       /* address of argument array          */
+       mov     a2,t1                       /* stack argument count               */
+       mov     sp,s0                       /* save stack pointer                 */
+
+       ldq     a0,0*8(t0)
+       ldq     a1,1*8(t0)
+       ldq     a2,2*8(t0)
+       ldq     a3,3*8(t0)
+       ldq     a4,4*8(t0)
+       ldq     a5,5*8(t0)
+
+       ldt     fa0,6*8(t0)
+       ldt     fa1,7*8(t0)
+       ldt     fa2,8*8(t0)
+       ldt     fa3,9*8(t0)
+       ldt     fa4,10*8(t0)
+       ldt     fa5,11*8(t0)
+
+       beq     t1,L_asm_vm_call_method_stack_copy_done
+
+       negq    t1,t2                       /* calculate stackframe size (* 8)    */
+       s8addq  t2,sp,sp                    /* create stackframe                  */
+       mov     sp,t2                       /* temporary stack pointer            */
+
+L_asm_vm_call_method_stack_copy_loop:
+       ldq     t3,12*8(t0)                 /* load argument                      */
+       stq     t3,0(t2)                    /* store argument on stack            */
+
+       subq    t1,1,t1                     /* subtract 1 argument                */
+       addq    t0,8,t0                     /* load address of next argument      */
+       addq    t2,8,t2                     /* increase stack pointer             */
+
+       bgt     t1,L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+       lda     mptr,4*8(s0)                /* get address of PV                  */
+       ldq     pv,0*8(mptr)                /* load PV                            */
+       jmp     ra,(pv)
+L_asm_vm_call_method_recompute_pv:
+       lda     pv,(asm_vm_call_method - L_asm_vm_call_method_recompute_pv)(ra)
+
+       mov     s0,sp                       /* restore stack pointer              */
+
+L_asm_vm_call_method_recompute_return:
+       ldq     ra,0*8(sp)                  /* restore RA                         */
+       ldq     gp,1*8(sp)                  /* restore global pointer             */
+       ldq     s0,3*8(sp)
+
+       lda     sp,5*8(sp)                  /* free stack space                   */
        jmp     zero,(ra)
 
 asm_vm_call_method_exception_handler:
-       s8addq  s6,sp,sp
-       ldq     gp,1*8(sp)                /* restore global pointer               */
+       mov     s0,sp                       /* restore stack pointer              */
+       ldq     gp,1*8(sp)                  /* restore global pointer             */
        mov     itmp1,a0
        jsr     ra,builtin_throw_exception
-       ldq     ra,0*8(sp)                /* restore return address               */
-       ldq     s6,3*8(sp)
-       lda     sp,5*8(sp)                /* free stack space                     */
-       jmp     zero,(ra)
+
+asm_vm_call_method_end:                                        
+       br      L_asm_vm_call_method_recompute_return
 
        .end    asm_vm_call_method
 
@@ -243,19 +208,14 @@ asm_call_jit_compiler:
                                      /* directly to the caller (ra).             */
 
 L_asm_call_jit_compiler_exception:
-#if defined(ENABLE_THREADS)
        subq    sp,2*8,sp
        stq     ra,0*8(sp)            /* save return address (xpc)                */
-       jsr     ra,builtin_asm_get_exceptionptrptr
+       jsr     ra,exceptions_get_and_clear_exception
        ldq     ra,0*8(sp)            /* restore return address (xpc)             */
        addq    sp,2*8,sp
-#else
-       lda     v0,_exceptionptr
-#endif
-       ldq     xptr,0(v0)            /* get the exception pointer                */
-       stq     zero,0(v0)            /* clear the exception pointer              */
 
-       subq    ra,4,xpc
+       mov     v0,xptr               /* get exception                            */
+       subq    ra,4,xpc              /* exception address is ra - 4              */
        br      L_asm_handle_nat_exception
 
        .end    asm_call_jit_compiler
@@ -277,18 +237,28 @@ L_asm_call_jit_compiler_exception:
 
 asm_handle_nat_exception:
 L_asm_handle_nat_exception:       /* required for PIC code                    */
-       ldl     t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
-       sll     t0,48,t0
-       sra     t0,48,t0              /* isolate offset                           */
-       addq    t0,ra,pv              /* compute update address                   */
-       ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
-       srl     t0,16,t0              /* isolate instruction code                 */
-       lda     t0,-0x177b(t0)        /* test for LDAH                            */
-       bne     t0,L_asm_handle_exception
-       ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
-       sll     t0,16,t0              /* compute high offset                      */
-       addl    t0,0,t0               /* sign extend high offset                  */
-       addq    t0,pv,pv              /* compute update address                   */
+L_asm_handle_exception_stack_loop:
+       lda     sp,-6*8(sp)                 /* keep stack 16-byte aligned         */
+       stq     xptr,0*8(sp)                /* save xptr                          */
+       stq     xpc,1*8(sp)                 /* save xpc                           */
+       stq     ra,3*8(sp)                  /* save RA                            */
+       stq     zero,4*8(sp)                /* save maybe-leaf flag (cleared)     */
+
+       mov     ra,a0                       /* pass RA                            */
+
+       br      ra,L_asm_handle_exception_load_gp
+L_asm_handle_exception_load_gp:
+       ldgp    gp,0(ra)                    /* load gp                            */
+
+       jsr     ra,md_codegen_get_pv_from_pc/* get PV from RA                     */
+       stq     v0,2*8(sp)                  /* save PV                            */
+
+       ldq     a0,0*8(sp)                  /* pass xptr                          */
+       ldq     a1,1*8(sp)                  /* pass xpc                           */
+       mov     v0,a2                       /* pass PV                            */
+       addq    sp,6*8,a3                   /* pass Java SP                       */
+
+       br      L_asm_handle_exception_continue
 
        .aent    asm_handle_exception
 
@@ -299,39 +269,35 @@ L_asm_handle_exception:                 /* required for PIC code              */
        SAVE_ARGUMENT_REGISTERS(0)          /* we save arg and temp registers in  */
        SAVE_TEMPORARY_REGISTERS(ARG_CNT)   /* case this is a leaf method         */
 
-       lda     a3,(ARG_CNT+TMP_CNT)*8(zero)/* prepare a3 for handle_exception */
-       lda     a4,1(zero)                  /* set maybe-leaf flag                */
+       lda     sp,-6*8(sp)                 /* keep stack 16-byte aligned         */
+       stq     xptr,0*8(sp)                /* save xptr                          */
+       stq     pv,2*8(sp)                  /* save PV                            */
+       stq     ra,3*8(sp)                  /* save RA                            */
+       lda     t0,1(zero)                  /* set maybe-leaf flag                */
+       stq     t0,4*8(sp)                  /* save maybe-leaf flag               */
 
-L_asm_handle_exception_stack_loop:
-       lda     sp,-5*8(sp)                 /* allocate stack                     */
-       stq     xptr,0*8(sp)                /* save exception pointer             */
-       stq     xpc,1*8(sp)                 /* save exception pc                  */
-       stq     pv,2*8(sp)                  /* save data segment pointer          */
-       stq     ra,3*8(sp)                  /* save return address                */
-       addq    a3,sp,a3                    /* calculate Java sp into a3...       */
-       addq    a3,5*8,a3
-       stq     a4,4*8(sp)                  /* save maybe-leaf flag               */
-
-       br      ra,L_asm_handle_exception_load_gp /* set ra for gp loading        */
-L_asm_handle_exception_load_gp:
+       br      ra,L_asm_handle_exception_load_gp_2
+L_asm_handle_exception_load_gp_2:
        ldgp    gp,0(ra)                    /* load gp                            */
 
-       mov     xptr,a0                     /* pass exception pointer             */
-       mov     xpc,a1                      /* pass exception pc                  */
-       mov     pv,a2                       /* pass data segment pointer          */
-                                           /* a3 is still set                    */
+       mov     xptr,a0                     /* pass xptr                          */
+       mov     xpc,a1                      /* pass xpc                           */
+       mov     pv,a2                       /* pass PV                            */
+       lda     a3,(ARG_CNT+TMP_CNT+6)*8(sp)/* pass Java SP                       */
+
+L_asm_handle_exception_continue:
        jsr     ra,exceptions_handle_exception
 
        beq     v0,L_asm_handle_exception_not_catched
 
        mov     v0,xpc                      /* move handlerpc into xpc            */
-       ldq     xptr,0*8(sp)                /* restore exception pointer          */
-       ldq     pv,2*8(sp)                  /* restore data segment pointer       */
-       ldq     ra,3*8(sp)                  /* restore return address             */
-       ldq     a4,4*8(sp)                  /* get maybe-leaf flag                */
-       lda     sp,5*8(sp)                  /* free stack frame                   */
+       ldq     xptr,0*8(sp)                /* restore xptr                       */
+       ldq     pv,2*8(sp)                  /* restore PV                         */
+       ldq     ra,3*8(sp)                  /* restore RA                         */
+       ldq     t0,4*8(sp)                  /* get maybe-leaf flag                */
+       lda     sp,6*8(sp)                  /* free stack frame                   */
 
-       beq     a4,L_asm_handle_exception_no_leaf
+       beq     t0,L_asm_handle_exception_no_leaf
 
        RESTORE_ARGUMENT_REGISTERS(0)       /* if this is a leaf method, we have  */
        RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers  */
@@ -342,553 +308,141 @@ L_asm_handle_exception_no_leaf:
        jmp     zero,(xpc)                  /* jump to the handler                */
 
 L_asm_handle_exception_not_catched:
-       ldq     xptr,0*8(sp)                /* restore exception pointer          */
-       ldq     pv,2*8(sp)                  /* restore data segment pointer       */
-       ldq     ra,3*8(sp)                  /* restore return address             */
-       ldq     a4,4*8(sp)                  /* get maybe-leaf flag                */
-       lda     sp,5*8(sp)
+       ldq     xptr,0*8(sp)                /* restore xptr                       */
+       ldq     pv,2*8(sp)                  /* restore PV                         */
+       ldq     ra,3*8(sp)                  /* restore RA                         */
+       ldq     t0,4*8(sp)                  /* get maybe-leaf flag                */
+       lda     sp,6*8(sp)
 
-       beq     a4,L_asm_handle_exception_no_leaf_stack
+       beq     t0,L_asm_handle_exception_no_leaf_stack
 
        lda     sp,(ARG_CNT+TMP_CNT)*8(sp)  /* remove maybe-leaf stackframe       */
-       mov     zero,a4                     /* clear the maybe-leaf flag          */
+       mov     zero,t0                     /* clear the maybe-leaf flag          */
 
 L_asm_handle_exception_no_leaf_stack:
-       ldl     t0,FrameSize(pv)            /* get frame size                     */
-       addq    t0,sp,t0                    /* pointer to save area               */
+       ldl     t1,FrameSize(pv)            /* get frame size                     */
+       addq    t1,sp,t1                    /* pointer to save area               */
 
-       ldl     t1,IsLeaf(pv)               /* is leaf procedure                  */
-       bne     t1,L_asm_handle_exception_no_ra_restore
+       ldl     t2,IsLeaf(pv)               /* is leaf procedure                  */
+       bne     t2,L_asm_handle_exception_no_ra_restore
 
-       ldq     ra,-1*8(t0)                 /* restore ra                         */
-       subq    t0,8,t0                     /* t0--                               */
+       ldq     ra,-1*8(t1)                 /* restore ra                         */
+       subq    t1,8,t1                     /* t1--                               */
 
 L_asm_handle_exception_no_ra_restore:
        mov     ra,xpc                      /* the new xpc is ra                  */
-       ldl     t1,IntSave(pv)              /* t1 = saved int register count      */
-       br      t2,ex_int1                  /* t2 = current pc                    */
+       ldl     t2,IntSave(pv)              /* t2 = saved int register count      */
+       br      t3,ex_int1                  /* t3 = current pc                    */
 ex_int1:
-       lda     t2,(ex_int2-ex_int1)(t2)
-       negl    t1,t1                       /* negate register count              */
-       s4addq  t1,t2,t2                    /* t2 = IntSave - register count * 4  */
-       jmp     zero,(t2)                   /* jump to save position              */
-
-       ldq     s0,-7*8(t0)
-       ldq     s1,-6*8(t0)
-       ldq     s2,-5*8(t0)
-       ldq     s3,-4*8(t0)
-       ldq     s4,-3*8(t0)
-       ldq     s5,-2*8(t0)
-       ldq     s6,-1*8(t0)
+       lda     t3,(ex_int2 - ex_int1)(t3)
+       negl    t2,t2                       /* negate register count              */
+       s4addq  t2,t3,t3                    /* t2 = IntSave - register count * 4  */
+       jmp     zero,(t3)                   /* jump to save position              */
+
+       ldq     s0,-7*8(t1)
+       ldq     s1,-6*8(t1)
+       ldq     s2,-5*8(t1)
+       ldq     s3,-4*8(t1)
+       ldq     s4,-3*8(t1)
+       ldq     s5,-2*8(t1)
+       ldq     s6,-1*8(t1)
 
 ex_int2:
-       s8addq  t1,t0,t0                    /* t0 = t0 - 8 * register count       */
+       s8addq  t2,t1,t1                    /* t1 = t1 - 8 * register count       */
 
-       ldl     t1,FltSave(pv)              /* t1 = saved flt register count      */
-       br      t2,ex_flt1                  /* t2 = current pc                    */
+       ldl     t2,FltSave(pv)              /* t2 = saved flt register count      */
+       br      t3,ex_flt1                  /* t3 = current pc                    */
 ex_flt1:
-       lda     t2,(ex_flt2-ex_flt1)(t2)
-       negl    t1,t1                       /* negate register count              */
-       s4addq  t1,t2,t2                    /* t2 = FltSave - 4 * register count  */
-       jmp     zero,(t2)                   /* jump to save position              */
-
-       ldt     fs0,-8*8(t0)
-       ldt     fs1,-7*8(t0)
-       ldt     fs2,-6*8(t0)
-       ldt     fs3,-5*8(t0)
-       ldt     fs4,-4*8(t0)
-       ldt     fs5,-3*8(t0)
-       ldt     fs6,-2*8(t0)
-       ldt     fs7,-1*8(t0)
+       lda     t3,(ex_flt2 - ex_flt1)(t3)
+       negl    t2,t2                       /* negate register count              */
+       s4addq  t2,t3,t3                    /* t2 = FltSave - 4 * register count  */
+       jmp     zero,(t3)                   /* jump to save position              */
+
+       ldt     fs0,-8*8(t1)
+       ldt     fs1,-7*8(t1)
+       ldt     fs2,-6*8(t1)
+       ldt     fs3,-5*8(t1)
+       ldt     fs4,-4*8(t1)
+       ldt     fs5,-3*8(t1)
+       ldt     fs6,-2*8(t1)
+       ldt     fs7,-1*8(t1)
 
 ex_flt2:
-       ldl     t0,FrameSize(pv)            /* get frame size                     */
-       addq    sp,t0,sp                    /* unwind stack                       */
-       mov     zero,a3                     /* prepare a3 for handle_exception    */
-
-       ldl     t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
-       sll     t0,48,t0
-       sra     t0,48,t0              /* isolate offset                           */
-       addq    t0,ra,pv              /* compute update address                   */
-       ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
-       srl     t0,16,t0              /* isolate instruction code                 */
-       lda     t0,-0x177b(t0)        /* test for LDAH                            */
-       bne     t0,L_asm_handle_exception_stack_loop
-       ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(RA)         */
-       sll     t0,16,t0              /* compute high offset                      */
-       addl    t0,0,t0               /* sign extend high offset                  */
-       addq    t0,pv,pv              /* compute update address                   */
-
+       ldl     t1,FrameSize(pv)            /* get frame size                     */
+       addq    sp,t1,sp                    /* unwind stack                       */
        br      L_asm_handle_exception_stack_loop
 
        .end    asm_handle_nat_exception
 
 
-/* asm_wrapper_patcher *********************************************************
-
-   XXX
+/* asm_abstractmethoderror *****************************************************
 
-   Stack layout:
-     40   return address into JIT code (patch position)
-     32   pointer to virtual java_objectheader
-     24   machine code (which is patched back later)
-     16   unresolved class/method/field reference
-      8   data segment displacement from load instructions
-      0   patcher function pointer to call (pv afterwards)
-
-   ATTENTION: itmp3 == gp! But we don't need gp do call the patcher function.
+   Creates and throws an AbstractMethodError.
 
 *******************************************************************************/
-               
-       .ent    asm_wrapper_patcher
-
-asm_wrapper_patcher:
-       lda     sp,-((2+12+27+4)*8+sizestackframeinfo)(sp) /* create stack frame  */
-
-       SAVE_RETURN_REGISTERS(0)      /* save 1 int/1 float return registers      */
-       SAVE_ARGUMENT_REGISTERS(2)    /* save 6 int/6 float argument registers    */
-       SAVE_TEMPORARY_REGISTERS(14)  /* save 11 int/16 float temporary registers */
-
-       stq     itmp1,(2+12+27+0)*8(sp) /* save itmp1                             */
-       stq     itmp2,(2+12+27+1)*8(sp) /* save itmp2                             */
-       stq     ra,(2+12+27+2)*8(sp)  /* save method return address (for leafs)   */
-       stq     pv,(2+12+27+3)*8(sp)  /* save pv of calling java function         */
-
-       br      ra,L_asm_wrapper_patcher_load_gp
-L_asm_wrapper_patcher_load_gp:
-       ldgp    gp,0(ra)              /* load gp (it's not set correctly in jit)  */
-
-       lda     a0,(2+12+27+4)*8(sp)  /* create stackframe info                   */
-       mov     pv,a1                 /* pass java pv                             */
-       lda     a2,((6+2+12+27+4)*8+sizestackframeinfo)(sp) /* pass java sp       */
-       ldq     a3,(2+12+27+2)*8(sp)  /* this is correct for leafs                */
-       ldq     a4,((5+2+12+27+4)*8+sizestackframeinfo)(sp) /* pass xpc           */
-       jsr     ra,stacktrace_create_extern_stackframeinfo
-       ldgp    gp,0(ra)
-
-       lda     a0,((0+2+12+27+4)*8+sizestackframeinfo)(sp) /* pass sp            */
-       ldq     pv,((0+2+12+27+4)*8+sizestackframeinfo)(sp) /* get function       */
-       ldq     itmp1,(2+12+27+3)*8(sp) /* save pv to the position of fp          */
-       stq     itmp1,((0+2+12+27+4)*8+sizestackframeinfo)(sp)
-       jmp     ra,(pv)               /* call the patcher function                */
-       ldgp    gp,0(ra)
-       stq     v0,((0+2+12+27+4)*8+sizestackframeinfo)(sp) /* save return value  */
-
-       lda     a0,(2+12+27+4)*8(sp)  /* remove stackframe info                   */
-       jsr     ra,stacktrace_remove_stackframeinfo
-       ldgp    gp,0(ra)
-
-       RESTORE_RETURN_REGISTERS(0)   /* restore 1 int/1 float return registers   */
-       RESTORE_ARGUMENT_REGISTERS(2) /* restore 6 int/6 float argument registers */
-       RESTORE_TEMPORARY_REGISTERS(14) /* restore 11 integer temporary registers */
-
-       ldq     itmp1,(2+12+27+0)*8(sp) /* restore itmp1                          */
-       ldq     itmp2,(2+12+27+1)*8(sp) /* restore itmp2                          */
-       ldq     ra,(2+12+27+2)*8(sp)  /* restore method return address (for leafs)*/
-       ldq     pv,(2+12+27+3)*8(sp)  /* restore pv of calling java function      */
-
-       ldq     itmp3,((0+2+12+27+4)*8+sizestackframeinfo)(sp) /* get return value*/
-       beq     itmp3,L_asm_wrapper_patcher_exception
-
-       ldq     itmp3,((5+2+12+27+4)*8+sizestackframeinfo)(sp)/* get RA to JIT    */
-       lda     sp,((6+2+12+27+4)*8+sizestackframeinfo)(sp) /* remove stack frame */
-
-       jmp     zero,(itmp3)          /* jump to new patched code                 */
-
-L_asm_wrapper_patcher_exception:
-       ldq     xpc,((5+2+12+27+4)*8+sizestackframeinfo)(sp) /* RA is xpc         */
-       lda     sp,((6+2+12+27+4)*8+sizestackframeinfo)(sp) /* remove stack frame */
-
-       br      itmp1,L_asm_wrapper_patcher_exception_load_gp
-L_asm_wrapper_patcher_exception_load_gp:
-       ldgp    gp,0(itmp1)           /* itmp3 == gp, load the current gp         */
-
-#if defined(ENABLE_THREADS)
-       subq    sp,3*8,sp
-       stq     xpc,0*8(sp)           /* save return address (xpc)                */
-       stq     ra,1*8(sp)
-       stq     pv,2*8(sp)
-       jsr     ra,builtin_asm_get_exceptionptrptr
-       ldq     xpc,0*8(sp)           /* restore return address (xpc)             */
-       ldq     ra,1*8(sp)
-       ldq     pv,2*8(sp)
-       addq    sp,3*8,sp
-#else
-       lda     v0,_exceptionptr
-#endif
-       ldq     xptr,0(v0)            /* get the exception pointer                */
-       stq     zero,0(v0)            /* clear the exception pointer              */
-       br      L_asm_handle_exception/* we have the pv of the calling java func. */
-
-       .end    asm_wrapper_patcher
-
-               
-/* asm_replacement_out *********************************************************
-
-   This code is jumped to from the replacement-out stubs that are executed
-   when a thread reaches an activated replacement point.
-
-   The purpose of asm_replacement_out is to read out the parts of the
-   execution state that cannot be accessed from C code, store this state,
-   and then call the C function replace_me.
-
-   Stack layout:
-     16                 start of stack inside method to replace
-      0   rplpoint *    info on the replacement point that was reached
-
-   NOTE: itmp3 has been clobbered by the replacement-out stub!
-
-*******************************************************************************/
-
-/* some room to accomodate changes of the stack frame size during replacement */
-       /* XXX we should find a cleaner solution here */
-#define REPLACEMENT_ROOM  512
-
-#define REPLACEMENT_STACK_OFFSET ((sizeexecutionstate + REPLACEMENT_ROOM + 0xf) & ~0xf)
-
-       .ent asm_replacement_out
-
-asm_replacement_out:
-    /* create stack frame */
-       lda     sp,-(REPLACEMENT_STACK_OFFSET)(sp)
-
-       /* save registers in execution state */
-       stq     $0 ,( 0*8+offes_intregs)(sp)
-       stq     $1 ,( 1*8+offes_intregs)(sp)
-       stq     $2 ,( 2*8+offes_intregs)(sp)
-       stq     $3 ,( 3*8+offes_intregs)(sp)
-       stq     $4 ,( 4*8+offes_intregs)(sp)
-       stq     $5 ,( 5*8+offes_intregs)(sp)
-       stq     $6 ,( 6*8+offes_intregs)(sp)
-       stq     $7 ,( 7*8+offes_intregs)(sp)
-       stq     $8 ,( 8*8+offes_intregs)(sp)
-       stq     $9 ,( 9*8+offes_intregs)(sp)
-       stq     $10,(10*8+offes_intregs)(sp)
-       stq     $11,(11*8+offes_intregs)(sp)
-       stq     $12,(12*8+offes_intregs)(sp)
-       stq     $13,(13*8+offes_intregs)(sp)
-       stq     $14,(14*8+offes_intregs)(sp)
-       stq     $15,(15*8+offes_intregs)(sp)
-       stq     $16,(16*8+offes_intregs)(sp)
-       stq     $17,(17*8+offes_intregs)(sp)
-       stq     $18,(18*8+offes_intregs)(sp)
-       stq     $19,(19*8+offes_intregs)(sp)
-       stq     $20,(20*8+offes_intregs)(sp)
-       stq     $21,(21*8+offes_intregs)(sp)
-       stq     $22,(22*8+offes_intregs)(sp)
-       stq     $23,(23*8+offes_intregs)(sp)
-       stq     $24,(24*8+offes_intregs)(sp)
-       stq     $25,(25*8+offes_intregs)(sp)
-       stq     $26,(26*8+offes_intregs)(sp)
-       stq     $27,(27*8+offes_intregs)(sp)
-       stq     $28,(28*8+offes_intregs)(sp)
-       stq     $29,(29*8+offes_intregs)(sp)
-       stq     $30,(30*8+offes_intregs)(sp)
-       stq     $31,(31*8+offes_intregs)(sp)
-       
-       stt     $f0 ,( 0*8+offes_fltregs)(sp)
-       stt     $f1 ,( 1*8+offes_fltregs)(sp)
-       stt     $f2 ,( 2*8+offes_fltregs)(sp)
-       stt     $f3 ,( 3*8+offes_fltregs)(sp)
-       stt     $f4 ,( 4*8+offes_fltregs)(sp)
-       stt     $f5 ,( 5*8+offes_fltregs)(sp)
-       stt     $f6 ,( 6*8+offes_fltregs)(sp)
-       stt     $f7 ,( 7*8+offes_fltregs)(sp)
-       stt     $f8 ,( 8*8+offes_fltregs)(sp)
-       stt     $f9 ,( 9*8+offes_fltregs)(sp)
-       stt     $f10,(10*8+offes_fltregs)(sp)
-       stt     $f11,(11*8+offes_fltregs)(sp)
-       stt     $f12,(12*8+offes_fltregs)(sp)
-       stt     $f13,(13*8+offes_fltregs)(sp)
-       stt     $f14,(14*8+offes_fltregs)(sp)
-       stt     $f15,(15*8+offes_fltregs)(sp)
-       stt     $f16,(16*8+offes_fltregs)(sp)
-       stt     $f17,(17*8+offes_fltregs)(sp)
-       stt     $f18,(18*8+offes_fltregs)(sp)
-       stt     $f19,(19*8+offes_fltregs)(sp)
-       stt     $f20,(20*8+offes_fltregs)(sp)
-       stt     $f21,(21*8+offes_fltregs)(sp)
-       stt     $f22,(22*8+offes_fltregs)(sp)
-       stt     $f23,(23*8+offes_fltregs)(sp)
-       stt     $f24,(24*8+offes_fltregs)(sp)
-       stt     $f25,(25*8+offes_fltregs)(sp)
-       stt     $f26,(26*8+offes_fltregs)(sp)
-       stt     $f27,(27*8+offes_fltregs)(sp)
-       stt     $f28,(28*8+offes_fltregs)(sp)
-       stt     $f29,(29*8+offes_fltregs)(sp)
-       stt     $f30,(30*8+offes_fltregs)(sp)
-       stt     $f31,(31*8+offes_fltregs)(sp)
-       
-       /* calculate sp of method */
-       lda     itmp1,(REPLACEMENT_STACK_OFFSET + 2*8)(sp)
-       stq     itmp1,(offes_sp)(sp)
-
-       br      ra,L_asm_replacement_out_load_gp
-L_asm_replacement_out_load_gp:
-       ldgp    gp,0(ra)                    /* load gp                            */
-
-       /* store pv */
-       stq     pv,(offes_pv)(sp)
-
-       /* call replace_me */
-       ldq     a0,-(2*8)(itmp1)            /* arg0: rplpoint *                   */
-    mov     sp,a1                       /* arg1: execution state              */
-    jmp     zero,replace_me             /* call C function replace_me         */
-    jmp     zero,abort                  /* NEVER REACHED                      */
 
-       .end asm_replacement_out
+       .ent    asm_abstractmethoderror
 
-/* asm_replacement_in **********************************************************
+asm_abstractmethoderror:
+       subq    sp,2*8,sp                   /* create stackframe                  */
+       stq     ra,0*8(sp)                  /* save return address                */
+       addq    sp,2*8,a0                   /* pass java sp                       */
+       mov     ra,a1                       /* pass exception address             */
+       jsr     ra,exceptions_asm_new_abstractmethoderror
+       ldq     ra,0*8(sp)                  /* restore return address             */
+       addq    sp,2*8,sp                   /* remove stackframe                  */
 
-   This code writes the given execution state and jumps to the replacement
-   code.
-
-   This function never returns!
+       mov     v0,xptr                     /* get exception pointer              */
+       subq    ra,4,xpc                    /* exception address is ra - 4        */
+       br      L_asm_handle_nat_exception
 
-   NOTE: itmp3 is not restored!
+       .end    asm_abstractmethoderror
 
-   C prototype:
-      void asm_replacement_in(executionstate *es);
 
-*******************************************************************************/
+/* asm_compare_and_swap ********************************************************
 
-       .ent asm_replacement_in
-       
-asm_replacement_in:
-       /* a0 == executionstate *es */
+   Does an atomic compare and swap.  Required for the lock
+   implementation.
 
-       /* set new sp and pv */
-       ldq     sp,(offes_sp)(a0)
-       ldq     pv,(offes_pv)(a0)
-       
-       /* copy registers from execution state */
-       ldq     $0 ,( 0*8+offes_intregs)(a0)
-       ldq     $1 ,( 1*8+offes_intregs)(a0)
-       ldq     $2 ,( 2*8+offes_intregs)(a0)
-       ldq     $3 ,( 3*8+offes_intregs)(a0)
-       ldq     $4 ,( 4*8+offes_intregs)(a0)
-       ldq     $5 ,( 5*8+offes_intregs)(a0)
-       ldq     $6 ,( 6*8+offes_intregs)(a0)
-       ldq     $7 ,( 7*8+offes_intregs)(a0)
-       ldq     $8 ,( 8*8+offes_intregs)(a0)
-       ldq     $9 ,( 9*8+offes_intregs)(a0)
-       ldq     $10,(10*8+offes_intregs)(a0)
-       ldq     $11,(11*8+offes_intregs)(a0)
-       ldq     $12,(12*8+offes_intregs)(a0)
-       ldq     $13,(13*8+offes_intregs)(a0)
-       ldq     $14,(14*8+offes_intregs)(a0)
-       ldq     $15,(15*8+offes_intregs)(a0)
-       /* a0 is loaded below             */
-       ldq     $17,(17*8+offes_intregs)(a0)
-       ldq     $18,(18*8+offes_intregs)(a0)
-       ldq     $19,(19*8+offes_intregs)(a0)
-       ldq     $20,(20*8+offes_intregs)(a0)
-       ldq     $21,(21*8+offes_intregs)(a0)
-       ldq     $22,(22*8+offes_intregs)(a0)
-       ldq     $23,(23*8+offes_intregs)(a0)
-       ldq     $24,(24*8+offes_intregs)(a0)
-       ldq     $25,(25*8+offes_intregs)(a0)
-       ldq     $26,(26*8+offes_intregs)(a0)
-       /* $27 is pv                      */
-       ldq     $28,(28*8+offes_intregs)(a0)
-       ldq     $29,(29*8+offes_intregs)(a0)
-       /* $30 is sp                      */
-       /* $31 is zero                    */
-       
-       ldt     $f0 ,( 0*8+offes_fltregs)(a0)
-       ldt     $f1 ,( 1*8+offes_fltregs)(a0)
-       ldt     $f2 ,( 2*8+offes_fltregs)(a0)
-       ldt     $f3 ,( 3*8+offes_fltregs)(a0)
-       ldt     $f4 ,( 4*8+offes_fltregs)(a0)
-       ldt     $f5 ,( 5*8+offes_fltregs)(a0)
-       ldt     $f6 ,( 6*8+offes_fltregs)(a0)
-       ldt     $f7 ,( 7*8+offes_fltregs)(a0)
-       ldt     $f8 ,( 8*8+offes_fltregs)(a0)
-       ldt     $f9 ,( 9*8+offes_fltregs)(a0)
-       ldt     $f10,(10*8+offes_fltregs)(a0)
-       ldt     $f11,(11*8+offes_fltregs)(a0)
-       ldt     $f12,(12*8+offes_fltregs)(a0)
-       ldt     $f13,(13*8+offes_fltregs)(a0)
-       ldt     $f14,(14*8+offes_fltregs)(a0)
-       ldt     $f15,(15*8+offes_fltregs)(a0)
-       ldt     $f16,(16*8+offes_fltregs)(a0)
-       ldt     $f17,(17*8+offes_fltregs)(a0)
-       ldt     $f18,(18*8+offes_fltregs)(a0)
-       ldt     $f19,(19*8+offes_fltregs)(a0)
-       ldt     $f20,(20*8+offes_fltregs)(a0)
-       ldt     $f21,(21*8+offes_fltregs)(a0)
-       ldt     $f22,(22*8+offes_fltregs)(a0)
-       ldt     $f23,(23*8+offes_fltregs)(a0)
-       ldt     $f24,(24*8+offes_fltregs)(a0)
-       ldt     $f25,(25*8+offes_fltregs)(a0)
-       ldt     $f26,(26*8+offes_fltregs)(a0)
-       ldt     $f27,(27*8+offes_fltregs)(a0)
-       ldt     $f28,(28*8+offes_fltregs)(a0)
-       ldt     $f29,(29*8+offes_fltregs)(a0)
-       ldt     $f30,(30*8+offes_fltregs)(a0)
-       ldt     $f31,(31*8+offes_fltregs)(a0)
-
-       /* load new pc */
-
-       ldq     itmp3,offes_pc(a0)
-
-       /* load a0 */
-       
-       ldq     a0,(16*8+offes_intregs)(a0)
-       
-       /* jump to new code */
+   Atomically do the following: Check if the location still contains
+   `oldval`. If so, replace it by `newval` and return `oldval`.
 
-       jmp     zero,(itmp3)
+   RETURN VALUE:
+       the old value at *p
 
-       .end asm_replacement_in
+   long compare_and_swap(volatile long *p, long oldval, long newval);
 
-/******************* function asm_initialize_thread_stack **********************
-*                                                                              *
-*   initialized a thread stack                                                 *
-*                                                                              *
 *******************************************************************************/
 
-       .ent    asm_initialize_thread_stack
-
-asm_initialize_thread_stack:
-       lda     a1,-128(a1)
-       stq     zero, 0(a1)
-       stq     zero, 8(a1)
-       stq     zero, 16(a1)
-       stq     zero, 24(a1)
-       stq     zero, 32(a1)
-       stq     zero, 40(a1)
-       stq     zero, 48(a1)
-       stt     fzero, 56(a1)
-       stt     fzero, 64(a1)
-       stt     fzero, 72(a1)
-       stt     fzero, 80(a1)
-       stt     fzero, 88(a1)
-       stt     fzero, 96(a1)
-       stt     fzero, 104(a1)
-       stt     fzero, 112(a1)
-       stq     a0, 120(a1)
-       mov     a1, v0
+       .ent    asm_compare_and_swap
+
+asm_compare_and_swap:
+1:
+       ldq_l   v0,0(a0)
+       cmpeq   v0,a1,t0
+       beq     t0,2f
+       mov     a2,t0
+       stq_c   t0,0(a0)
+       beq     t0,1b
+2:
        jmp     zero,(ra)
 
-       .end    asm_initialize_thread_stack
+       .end    asm_compare_and_swap
 
 
-/******************* function asm_perform_threadswitch *************************
-*                                                                              *
-*   void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop);         *
-*                                                                              *
-*   performs a threadswitch                                                    *
-*                                                                              *
-*******************************************************************************/
+/* asm_memory_barrier **********************************************************
 
-       .ent    asm_perform_threadswitch
-
-asm_perform_threadswitch:
-       subq    sp,128,sp
-       stq     s0, 0(sp)
-       stq     s1, 8(sp)
-       stq     s2, 16(sp)
-       stq     s3, 24(sp)
-       stq     s4, 32(sp)
-       stq     s5, 40(sp)
-       stq     s6, 48(sp)
-       stt     fs0, 56(sp)
-       stt     fs1, 64(sp)
-       stt     fs2, 72(sp)
-       stt     fs3, 80(sp)
-       stt     fs4, 88(sp)
-       stt     fs5, 96(sp)
-       stt     fs6, 104(sp)
-       stt     fs7, 112(sp)
-       stq     ra, 120(sp)
-       stq     sp, 0(a0)
-       stq     sp, 0(a2)
-       ldq     sp, 0(a1)
-       ldq     s0, 0(sp)
-       ldq     s1, 8(sp)
-       ldq     s2, 16(sp)
-       ldq     s3, 24(sp)
-       ldq     s4, 32(sp)
-       ldq     s5, 40(sp)
-       ldq     s6, 48(sp)
-       ldt     fs0, 56(sp)
-       ldt     fs1, 64(sp)
-       ldt     fs2, 72(sp)
-       ldt     fs3, 80(sp)
-       ldt     fs4, 88(sp)
-       ldt     fs5, 96(sp)
-       ldt     fs6, 104(sp)
-       ldt     fs7, 112(sp)
-       ldq     ra, 120(sp)
-       mov     ra, pv
-       addq    sp, 128, sp
-       jmp     zero,(ra)
-
-       .end    asm_perform_threadswitch
-
-
-/********************* function asm_switchstackandcall *************************
-*                                                                              *
-*  void *asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
-*                               void *p);                                      *
-*                                                                              *
-*   Switches to a new stack, calls a function and switches back.               *
-*       a0      new stack pointer                                              *
-*       a1      function pointer                                               *
-*              a2              pointer to variable where stack top should be stored           *
-*              a3      pointer to user data, is passed to the function                *
-*                                                                              *
-*******************************************************************************/
-
-
-       .ent    asm_switchstackandcall
-
-asm_switchstackandcall:
-       lda     a0,-2*8(a0)     /* allocate new stack                                 */
-       stq     ra,0(a0)        /* save return address on new stack                   */
-       stq     sp,1*8(a0)      /* save old stack pointer on new stack                */
-       stq sp,0(a2)        /* save old stack pointer to variable                 */
-       mov     a0,sp           /* switch to new stack                                */
-       
-       mov     a1,pv           /* load function pointer                              */
-       mov a3,a0           /* pass pointer */
-       jmp     ra,(pv)         /* and call function                                  */
-
-       ldq     ra,0(sp)        /* load return address                                */
-       ldq     sp,1*8(sp)      /* switch to old stack                                */
-
-       jmp     zero,(ra)       /* return                                             */
-
-       .end    asm_switchstackandcall
+   A memory barrier for the Java Memory Model.
 
+*******************************************************************************/
 
-       .ent    asm_getclassvalues_atomic
+       .ent    asm_memory_barrier
 
-asm_getclassvalues_atomic:
-_crit_restart:
-_crit_begin:
-       ldl     t0,offbaseval(a0)
-       ldl     t1,offdiffval(a0)
-       ldl     t2,offbaseval(a1)
-_crit_end:
-       stl     t0,offcast_super_baseval(a2)
-       stl     t1,offcast_super_diffval(a2)
-       stl     t2,offcast_sub_baseval(a2)
+asm_memory_barrier:
+       mb
        jmp     zero,(ra)
 
-       .end    asm_getclassvalues_atomic
-
-
-    .data
-
-asm_criticalsections:
-#if defined(ENABLE_THREADS)
-    .quad   _crit_begin
-    .quad   _crit_end
-    .quad   _crit_restart
-#endif
-    .quad   0
+       .end    asm_memory_barrier
 
 
 /* asm_md_init *****************************************************************
@@ -924,10 +478,10 @@ asm_cacheflush:
        .end    asm_cacheflush
 
 
-/* Disable exec-stacks, required for Gentoo ***********************************/
+/* disable exec-stacks ********************************************************/
 
-#if defined(__GCC__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
 #endif