* Removed all Id tags.
[cacao.git] / src / vm / jit / powerpc / asmpart.S
index 8b42bd8248a29f6427ac3d66f5c1181c093897cd..a17fe5217c394ee5659ac43ae1a4cf76ab5fdf84 100644 (file)
@@ -1,9 +1,9 @@
-/* vm/jit/powerpc/asmpart.S - Java-C interface functions for powerpc
+/* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
                
-   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
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
+   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+   J. Wenninger, Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
 
    You should have received a copy of the GNU General Public License
    along with this program;  if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
-
-   Contact: cacao@complang.tuwien.ac.at
-
-   Authors: Andreas Krall
-            Reinhard Grafl
-
-   $Id: asmpart.S 1877 2005-01-21 11:32:53Z stefan $
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
 */
 
 
-#if defined(__LINUX__)
-# include <asm/ppc_asm.h>
-#endif
-
 #include "config.h"
-#include "vm/jit/powerpc/offsets.h"
-#include "vm/jit/powerpc/asmoffsets.h"
-
-
-#define itmp1 r11
-#define itmp2 r12
-#define itmp3 r0
-
-#define xptr itmp1
-#define xpc itmp2
-
-#define pv r13
-#define mptr r12
-#define mptrn 12
-
-
-#if defined(__DARWIN__)
-
-/* Defines for darwin's old gnu assembler *************************************/
-
-/* internal defines ***********************************************************/
-
-#define asm_calljavafunction                  _asm_calljavafunction
-#define asm_calljavafunction2                 _asm_calljavafunction2
-#define asm_calljavafunction2int              _asm_calljavafunction2int
-#define asm_calljavafunction2long             _asm_calljavafunction2long
-#define asm_calljavafunction2float            _asm_calljavafunction2float
-#define asm_calljavafunction2double           _asm_calljavafunction2double
-
-#define asm_call_jit_compiler                 _asm_call_jit_compiler
-
-#define asm_handle_nat_exception              _asm_handle_nat_exception
-#define asm_handle_exception                  _asm_handle_exception
-#define asm_handle_nullptr_exception          _asm_handle_nullptr_exception
 
-#define asm_check_clinit                      _asm_check_clinit
+#include "md-abi.h"
+#include "md-asm.h"
 
-#define asm_builtin_checkarraycast            _asm_builtin_checkarraycast
-#define asm_builtin_aastore                   _asm_builtin_aastore
-
-#define asm_builtin_monitorenter              _asm_builtin_monitorenter
-#define asm_builtin_monitorexit               _asm_builtin_monitorexit
-
-#define asm_builtin_idiv                      _asm_builtin_idiv
-#define asm_builtin_irem                      _asm_builtin_irem
-#define asm_builtin_ldiv                      _asm_builtin_ldiv
-#define asm_builtin_lrem                      _asm_builtin_lrem
-
-#define asm_cacheflush                        _asm_cacheflush
-#define asm_initialize_thread_stack           _asm_initialize_thread_stack
-#define asm_perform_threadswitch              _asm_perform_threadswitch
-#define asm_switchstackandcall                _asm_switchstackandcall
-#define asm_criticalsections                  _asm_criticalsections
-#define asm_getclassvalues_atomic             _asm_getclassvalues_atomic
-
-
-/* external defines ***********************************************************/
-
-#define builtin_asm_get_exceptionptrptr       _builtin_asm_get_exceptionptrptr
-#define builtin_canstore                      _builtin_canstore
-#define builtin_checkarraycast                _builtin_checkarraycast
-#define builtin_ldiv                          _builtin_ldiv
-#define builtin_lrem                          _builtin_lrem
-
-#if defined(USE_THREADS)
-#define builtin_monitorenter                  _builtin_monitorenter
-#define builtin_monitorexit                   _builtin_monitorexit
-#endif
-
-#define builtin_throw_exception               _builtin_throw_exception
-#define builtin_trace_exception               _builtin_trace_exception
-#define class_init                            _class_init
-#define class_link                            _class_link
-#define class_load                            _class_load
-#define jit_compile                           _jit_compile
-#define new_arithmeticexception               _new_arithmeticexception
-#define new_arrayindexoutofboundsexception    _new_arrayindexoutofboundsexception
-#define new_arraystoreexception               _new_arraystoreexception
-#define new_classcastexception                _new_classcastexception
-#define new_nullpointerexception              _new_nullpointerexception
-
-#if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
-#if 0
-#define _exceptionptr                         __exceptionptr
-#endif
-
-_exceptionptr:
-       .globl          __exceptionptr
-#endif
-
-#define fr0     f0
-#define fr1     f1
-#define fr2     f2
-#define fr3     f3
-#define fr4     f4
-#define fr5     f5
-#define fr6     f6
-#define fr7     f7
-#define fr8     f8
-#define fr9     f9
-#define fr10    f10
-#define fr11    f11
-#define fr12    f12
-#define fr13    f13
-#define fr14    f14
-#define fr15    f15
-#define fr16    f16
-#define fr17    f17
-#define fr18    f18
-#define fr19    f19
-#define fr20    f20
-#define fr21    f21
-#define fr22    f22
-#define fr23    f23
-#define fr24    f24
-#define fr25    f25
-#define fr26    f26
-#define fr27    f27
-#define fr28    f28
-#define fr29    f29
-#define fr30    f30
-#define fr31    f31
-
-#endif /* __DARWIN__ */
+#include "vm/jit/abi-asm.h"
+#include "vm/jit/methodheader.h"
 
 
        .text
 
        .align 2
 
-       .globl asm_calljavafunction
 
-       .globl asm_calljavafunction2
-       .globl asm_calljavafunction2int
-       .globl asm_calljavafunction2long
-       .globl asm_calljavafunction2float
-       .globl asm_calljavafunction2double
+/* export functions ***********************************************************/
+
+       .globl asm_vm_call_method
+       .globl asm_vm_call_method_int
+       .globl asm_vm_call_method_long
+       .globl asm_vm_call_method_float
+       .globl asm_vm_call_method_double
+
+       .globl asm_vm_call_method_exception_handler
+       .globl asm_vm_call_method_end
 
        .globl asm_call_jit_compiler
 
        .globl asm_handle_nat_exception
        .globl asm_handle_exception
-       .globl asm_handle_nullptr_exception
 
-       .globl asm_check_clinit
+       .globl asm_abstractmethoderror
 
-       .globl asm_builtin_checkarraycast
-       .globl asm_builtin_aastore
-
-#if defined(USE_THREADS)
-       .globl asm_builtin_monitorenter
-       .globl asm_builtin_monitorexit
+#if defined(ENABLE_REPLACEMENT)
+       .globl asm_replacement_out
+       .globl asm_replacement_in
 #endif
 
-       .globl asm_builtin_idiv
-       .globl asm_builtin_irem
-       .globl asm_builtin_ldiv
-       .globl asm_builtin_lrem
-
        .globl asm_cacheflush
-       .globl asm_initialize_thread_stack
-       .globl asm_perform_threadswitch
-       .globl asm_switchstackandcall
-       .globl asm_criticalsections
-       .globl asm_getclassvalues_atomic
 
+       .globl asm_compare_and_swap
+       .globl asm_memory_barrier
 
-/********************* function asm_calljavafunction ***************************
+
+/* asm_vm_call_method **********************************************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
 *   with up to 4 address parameters.                                           *
@@ -212,357 +76,281 @@ _exceptionptr:
 *   This functions calls the JIT-compiler which eventually translates the      *
 *   method into machine code.                                                  *
 *                                                                              *
-*   C-prototype:                                                                              *
+*   C-prototype:                                                               *
 *    javaobject_header *asm_calljavamethod (methodinfo *m,                     *
-*         void *arg1, void *arg2, void *arg3, void *arg4);                      *
+*         void *arg1, void *arg2, void *arg3, void *arg4);                     *
 *                                                                              *
 *******************************************************************************/
-               
+
        .align 2
 
-    .long   0                         /* catch type all                       */
-       .long   calljava_xhandler         /* handler pc                           */
-       .long   calljava_xhandler         /* end pc                               */
-       .long   asm_calljavafunction      /* start pc                             */
+       .long   0                         /* catch type all                       */
+       .long   0                         /* exception handler pc                 */
+       .long   0                         /* end pc                               */
+       .long   0                         /* start pc                             */
        .long   1                         /* extable size                         */
+       .long   0                         /* line number table start              */
+       .long   0                         /* line number table size               */
        .long   0                         /* fltsave                              */
        .long   0                         /* intsave                              */
-       .long   0                         /* isleaf                               */
+       .long   0                         /* IsLeaf                               */
        .long   0                         /* IsSync                               */
-       .long   24                        /* frame size                           */
-       .long   0                         /* method pointer (pointer to name)     */
-       .long   0                         /* padding                              */
-
-asm_calljavafunction:
+       .long   0                         /* frame size                           */
+       .long   0                         /* codeinfo pointer                     */
+
+asm_vm_call_method:
+asm_vm_call_method_int:
+asm_vm_call_method_long:
+asm_vm_call_method_float:
+asm_vm_call_method_double:
        mflr    r0
-       stw     r31,-4(r1)
-/*     stw     r30,-8(r1)*/
-       stw     pv,-12(r1)
-       stw     r0,8(r1)
-       stwu    r1,-148(r1)
+       stw     r0,LA_LR_OFFSET(sp)
+       stwu    sp,-40*4(sp)              /* keep stack 16-byte aligned           */
 
-       bl      0f
-0:
-       mflr    r31
-
-       stw             r16,40(r1)
-       stw             r17,44(r1)
-       stw             r18,48(r1)
-       stw             r19,52(r1)
-       stw             r20,56(r1)
-       stw             r21,60(r1)
-       stw             r22,64(r1)
-       stw             r23,68(r1)
-       stfd    fr16,72(r1)
-       stfd    fr17,80(r1)
-       stfd    fr18,88(r1)
-       stfd    fr19,96(r1)
-       stfd    fr20,104(r1)
-       stfd    fr21,112(r1)
-       stfd    fr22,120(r1)
-       stfd    fr23,128(r1)
-
-       stw     r3,36(r1)
-       addi    r2,r1,36
-       mr      r3,r4
-       mr      r4,r5
-       mr      r5,r6
-       mr      r6,r7
+       stw     s0,8*4(sp)                /* save used callee saved registers     */
+       stw     a0,9*4(sp)                /* save method PV                       */
 
 #if defined(__DARWIN__)
-/*     addis   mptr,r31,ha16(_asm_call_jit_compiler-0b)*/
-       addi    mptr,r31,lo16(asm_call_jit_compiler-0b)
+       stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
+#endif
+       stw     pv,11*4(sp)               /* save PV register                     */
+
+       stw     itmp3,12*4(sp)            /* registers r14-r31 are callee saved   */
+       stfd    ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
+       stfd    ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+       stw     t1,18*4(sp)
+       stw     t2,19*4(sp)
+       stw     t3,20*4(sp)
+       stw     t4,21*4(sp)
+       stw     t5,22*4(sp)
+       stw     t6,23*4(sp)
+       stw     t7,24*4(sp)
+
+       stfd    ft0,26*4(sp)
+       stfd    ft1,28*4(sp)
+       stfd    ft2,30*4(sp)
+       stfd    ft3,32*4(sp)
+       stfd    ft4,34*4(sp)
+       stfd    ft5,36*4(sp)
 #else
-       addi    mptr,r31,(asm_call_jit_compiler-0b)@l
+       SAVE_TEMPORARY_REGISTERS(18)        /* the offset has to be even          */
+#endif
+
+       mr      t0,a1                       /* address of data structure          */
+       mr      t1,a2                       /* stack argument count               */
+
+       mr      s0,sp                       /* save SP                            */
+
+       lwz     a0,0*8+4(t0)                /* we are on big-endian               */
+       lwz     a1,1*8+4(t0)
+       lwz     a2,2*8+4(t0)
+       lwz     a3,3*8+4(t0)
+       lwz     a4,4*8+4(t0)
+       lwz     a5,5*8+4(t0)
+       lwz     a6,6*8+4(t0)
+       lwz     a7,7*8+4(t0)
+
+       lfd     fa0,8*8(t0)
+       lfd     fa1,9*8(t0)
+       lfd     fa2,10*8(t0)
+       lfd     fa3,11*8(t0)
+       lfd     fa4,12*8(t0)
+       lfd     fa5,13*8(t0)
+       lfd     fa6,14*8(t0)
+       lfd     fa7,15*8(t0)
+
+#if defined(__DARWIN__)
+       lfd     fa8,16*8(t0)
+       lfd     fa9,17*8(t0)
+       lfd     fa10,18*8(t0)
+       lfd     fa11,19*8(t0)
+       lfd     fa12,20*8(t0)
 #endif
-       stw     mptr,32(r1)
-       addi    mptr,r1,28
 
-       lwz     pv,4(mptr)
+       mr.     t1,t1
+       beq     L_asm_vm_call_method_stack_copy_done
+
+       slwi    t2,t1,3                     /* calculate stackframe size (* 8)    */
+
+       sub     sp,sp,t2                    /* create stackframe                  */
+       mr      t2,sp                       /* temporary stack pointer            */
+
+L_asm_vm_call_method_stack_copy_loop:
+#if defined(__DARWIN__)
+       lwz     t3,21*8+0(t0)               /* load argument                      */
+       lwz     t4,21*8+4(t0)
+#else
+       lwz     t3,16*8+0(t0)               /* load argument                      */
+       lwz     t4,16*8+4(t0)
+#endif
+       stw     t3,0(t2)                    /* store argument on stack            */
+       stw     t4,4(t2)
+
+       addi    t0,t0,8                     /* load address of next argument      */
+       addi    t2,t2,8                     /* increase stack pointer             */
+       addi    t1,t1,-1                    /* subtract 1 argument                */
+       mr.     t1,t1
+       bgt     L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+       addi    mptr,s0,9*4                 /* get address of PV                  */
+       lwz     pv,0*4(mptr)                /* load PV                            */
        mtctr   pv
        bctrl
-
 1:
        mflr    itmp1
 #if defined(__DARWIN__)
-       addi    pv,itmp1,lo16(asm_calljavafunction-1b)
+       addi    pv,itmp1,lo16(asm_vm_call_method - 1b)
+#else
+       addi    pv,itmp1,(asm_vm_call_method - 1b)@l
+#endif
+
+L_asm_vm_call_method_return:
+       mr      sp,s0                       /* restore the SP                     */
+
+       lwz     s0,8*4(sp)                  /* restore used callee saved registers*/
+
+#if defined(__DARWIN__)
+       lwz     itmp1,10*4(sp)              /* register r11 is callee saved       */
+#endif
+       lwz     pv,11*4(sp)                 /* save PV register                   */
+
+       lwz     itmp3,12*4(sp)
+       lfd     ftmp1,14*4(sp)              /* registers f14-f31 are callee saved */
+       lfd     ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+       lwz     t1,18*4(sp)
+       lwz     t2,19*4(sp)
+       lwz     t3,20*4(sp)
+       lwz     t4,21*4(sp)
+       lwz     t5,22*4(sp)
+       lwz     t6,23*4(sp)
+       lwz     t7,24*4(sp)
+
+       lfd     ft0,26*4(sp)
+       lfd     ft1,28*4(sp)
+       lfd     ft2,30*4(sp)
+       lfd     ft3,32*4(sp)
+       lfd     ft4,34*4(sp)
+       lfd     ft5,36*4(sp)
 #else
-       addi    pv,itmp1,(asm_calljavafunction-1b)@l
+       RESTORE_TEMPORARY_REGISTERS(18)   /* the offset has to be even            */
 #endif
 
-calljava_regrestore:
-       lwz     r16,40(r1)
-       lwz             r17,44(r1)
-       lwz             r18,48(r1)
-       lwz             r19,52(r1)
-       lwz             r20,56(r1)
-       lwz             r21,60(r1)
-       lwz             r22,64(r1)
-       lwz             r23,68(r1)
-       lfd             fr16,72(r1)
-       lfd             fr17,80(r1)
-       lfd             fr18,88(r1)
-       lfd             fr19,96(r1)
-       lfd             fr20,104(r1)
-       lfd             fr21,112(r1)
-       lfd             fr22,120(r1)
-       lfd             fr23,128(r1)
-
-       lwz     r0,148+8(r1)
+       lwz     r0,40*4+LA_LR_OFFSET(sp)
        mtlr    r0
-       addi    r1,r1,148
-       lwz     pv,-12(r1)
-/*     lwz     r30,-8(r1)*/
-       lwz     r31,-4(r1)
+       addi    sp,sp,40*4
        blr
 
-calljava_xhandler:
-       mr      r3,itmp1
+asm_vm_call_method_exception_handler:
+       mr      a0,itmp1
        bl      builtin_throw_exception
-       b       calljava_regrestore
+       b       L_asm_vm_call_method_return
 
+asm_vm_call_method_end:
+       nop
 
 
+/* asm_call_jit_compiler *******************************************************
 
-       .align 2
+   Invokes the compiler for untranslated JavaVM methods.
 
-       .long   0                         /* catch type all                       */
-       .long   calljava_xhandler2        /* handler pc                           */
-       .long   calljava_xhandler2        /* end pc                               */
-       .long   asm_calljavafunction2     /* start pc                             */
-       .long   1                         /* extable size                         */
-       .long   0                         /* fltsave                              */
-       .long   0                         /* intsave                              */
-       .long   0                         /* isleaf                               */
-       .long   0                         /* IsSync                               */
-       .long   24                        /* frame size                           */
-       .long   0                         /* method pointer (pointer to name)     */
-       .long   0                         /* padding                              */
-
-asm_calljavafunction2:
-asm_calljavafunction2int:
-asm_calljavafunction2long:
-asm_calljavafunction2float:
-asm_calljavafunction2double:
+*******************************************************************************/
+
+asm_call_jit_compiler:
+L_asm_call_jit_compiler:                /* required for PIC code              */
        mflr    r0
-       stw     r31,-4(r1)
-/*     stw     r30,-8(r1)*/
-       stw     pv,-12(r1)
-       stw     r0,8(r1)
-       stwu    r1,-148(r1)
-       bl      0f
-0:
-       mflr    r31
-
-       stw     r16,40(r1)
-       stw         r17,44(r1)
-       stw     r18,48(r1)
-       stw         r19,52(r1)
-       stw     r20,56(r1)
-       stw     r21,60(r1)
-       stw     r22,64(r1)
-       stw     r23,68(r1)
-       stfd    fr16,72(r1)
-       stfd    fr17,80(r1)
-       stfd    fr18,88(r1)
-       stfd    fr19,96(r1)
-       stfd    fr20,104(r1)
-       stfd    fr21,112(r1)
-       stfd    fr22,120(r1)
-       stfd    fr23,128(r1)
-
-       stw     r3,36(r1)                 /* save method pointer for compiler     */
-       addi    r2,r1,36
-       mr      itmp1,r6                  /* pointer to arg block                 */
-       mr      itmp2,r4                  /* arg count                            */
-
-       mr.     itmp2,itmp2
-       ble     calljava_argsloaded
-
-       addi    itmp2,itmp2,-1
-       lwz     r3,offjniitem+4(itmp1)
-       mr.     itmp2,itmp2
-       ble     calljava_argsloaded
-
-       addi    itmp2,itmp2,-1
-       lwz     r4,offjniitem+sizejniblock*1+4(itmp1)
-       mr.     itmp2,itmp2
-       ble     calljava_argsloaded
-    addi    itmp2,itmp2,-1
-
-    addi    itmp2,itmp2,-1
-    lwz     r5,offjniitem+sizejniblock*2+4(itmp1)
-    mr.     itmp2,itmp2
-    ble     calljava_argsloaded
-    addi    itmp2,itmp2,-1
-
-    addi    itmp2,itmp2,-1
-    lwz     r6,offjniitem+sizejniblock*3+4(itmp1)
-    mr.     itmp2,itmp2
-    ble     calljava_argsloaded
-    addi    itmp2,itmp2,-1
-
-calljava_argsloaded:
+       stw     r0,LA_LR_OFFSET(sp)         /* save return address                */
+       stwu    sp,-(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(sp)
+
 #if defined(__DARWIN__)
-/*     addis   mptr,r31,ha16(_asm_call_jit_compiler-0b)*/
-       addi    mptr,r31,lo16(asm_call_jit_compiler-0b)
+       stw     a0,LA_SIZE+(4+0)*4(sp)
+       stw     a1,LA_SIZE+(4+1)*4(sp)
+       stw     a2,LA_SIZE+(4+2)*4(sp)
+       stw     a3,LA_SIZE+(4+3)*4(sp)
+       stw     a4,LA_SIZE+(4+4)*4(sp)
+       stw     a5,LA_SIZE+(4+5)*4(sp)
+       stw     a6,LA_SIZE+(4+6)*4(sp)
+       stw     a7,LA_SIZE+(4+7)*4(sp)
+
+       stfd    fa0,LA_SIZE+(4+8)*4(sp)
+       stfd    fa1,LA_SIZE+(4+10)*4(sp)
+       stfd    fa2,LA_SIZE+(4+12)*4(sp)
+       stfd    fa3,LA_SIZE+(4+14)*4(sp)
+       stfd    fa4,LA_SIZE+(4+16)*4(sp)
+       stfd    fa5,LA_SIZE+(4+18)*4(sp)
+       stfd    fa6,LA_SIZE+(4+20)*4(sp)
+       stfd    fa7,LA_SIZE+(4+22)*4(sp)
+       stfd    fa8,LA_SIZE+(4+24)*4(sp)
+       stfd    fa9,LA_SIZE+(4+26)*4(sp)
+       stfd    fa10,LA_SIZE+(4+28)*4(sp)
+       stfd    fa11,LA_SIZE+(4+30)*4(sp)
+       stfd    fa12,LA_SIZE+(4+32)*4(sp)
 #else
-       addi    mptr,r31,(asm_call_jit_compiler-0b)@l
+       SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
 #endif
-       stw     mptr,32(r1)
-       addi    mptr,r1,28
 
-       lwz     pv,4(mptr)
-       mtctr   pv
-       bctrl
-1:
-       mflr    itmp1
+       mr      a0,itmp1
+       mr      a1,mptr
+       addi    a2,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
+       lwz     a3,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
+       bl      jit_asm_compile
+       mr      pv,v0                       /* move address to pv register        */
+
 #if defined(__DARWIN__)
-       addi    pv,itmp1,lo16(asm_calljavafunction2-1b)
+       lwz     a0,LA_SIZE+(4+0)*4(sp)
+       lwz     a1,LA_SIZE+(4+1)*4(sp)
+       lwz     a2,LA_SIZE+(4+2)*4(sp)
+       lwz     a3,LA_SIZE+(4+3)*4(sp)
+       lwz     a4,LA_SIZE+(4+4)*4(sp)
+       lwz     a5,LA_SIZE+(4+5)*4(sp)
+       lwz     a6,LA_SIZE+(4+6)*4(sp)
+       lwz     a7,LA_SIZE+(4+7)*4(sp)
+
+       lfd     fa0,LA_SIZE+(4+8)*4(sp)
+       lfd     fa1,LA_SIZE+(4+10)*4(sp)
+       lfd     fa2,LA_SIZE+(4+12)*4(sp)
+       lfd     fa3,LA_SIZE+(4+14)*4(sp)
+       lfd     fa4,LA_SIZE+(4+16)*4(sp)
+       lfd     fa5,LA_SIZE+(4+18)*4(sp)
+       lfd     fa6,LA_SIZE+(4+20)*4(sp)
+       lfd     fa7,LA_SIZE+(4+22)*4(sp)
+       lfd     fa8,LA_SIZE+(4+24)*4(sp)
+       lfd     fa9,LA_SIZE+(4+26)*4(sp)
+       lfd     fa10,LA_SIZE+(4+28)*4(sp)
+       lfd     fa11,LA_SIZE+(4+30)*4(sp)
+       lfd     fa12,LA_SIZE+(4+32)*4(sp)
 #else
-       addi    pv,itmp1,(asm_calljavafunction2-1b)@l
+       RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
 #endif
 
-calljava_regrestore2:
-       lwz             r16,40(r1)
-       lwz             r17,44(r1)
-       lwz             r18,48(r1)
-       lwz             r19,52(r1)
-       lwz             r20,56(r1)
-       lwz             r21,60(r1)
-       lwz             r22,64(r1)
-       lwz             r23,68(r1)
-       lfd             fr16,72(r1)
-       lfd             fr17,80(r1)
-       lfd             fr18,88(r1)
-       lfd             fr19,96(r1)
-       lfd             fr20,104(r1)
-       lfd             fr21,112(r1)
-       lfd             fr22,120(r1)
-       lfd             fr23,128(r1)
-
-       lwz     r0,148+8(r1)
-       mtlr    r0
-       addi    r1,r1,148
-       lwz     pv,-12(r1)
-/*     lwz     r30,-8(r1)*/
-       lwz     r31,-4(r1)
-       blr
+       lwz     itmp1,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
+       mtlr    itmp1
 
-calljava_xhandler2:
-       mr      r3,itmp1
-       bl      builtin_throw_exception
-       b       calljava_regrestore2
+       addi    sp,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
 
+       mr.     pv,pv                       /* test for exception                 */
+       beq     L_asm_call_jit_compiler_exception
 
-asm_call_jit_compiler:
-       mflr    itmp1
-       stw     r31,-4(r1)
-/*     stw     pv,-8(r1)*/
-       stw     r29,-12(r1)
-       stw     itmp1,8(r1)
-       stwu    r1,-176(r1)
-       mr      r31,pv
-
-       lwz     itmp3,-12(itmp1)
-       srwi    itmp3,itmp3,16
-       andi.   itmp3,itmp3,31
-       cmpwi   itmp3,mptrn
-       beq     noregchange
-       lwz     itmp3,4(itmp1)
-       extsh   itmp3,itmp3
-       add     mptr,itmp3,itmp1
-       lwz     itmp3,8(itmp1)
-       srwi    itmp3,itmp3,16
-       cmpwi   itmp3,0x3dad
-       bne     noregchange
-       lwz     itmp3,8(itmp1)
-       slwi    itmp3,itmp3,16
-       add     mptr,mptr,itmp3
-               
-noregchange:
-       mr      r29,mptr
-       stw     r3,28(r1)
-       stw     r4,32(r1)
-       stw     r5,36(r1)
-       stw     r6,40(r1)
-       stw     r7,44(r1)
-       stw     r8,48(r1)
-       stw     r9,52(r1)
-       stfd    fr1,56(r1)
-       stfd    fr2,64(r1)
-       stfd    fr3,72(r1)
-       stfd    fr4,80(r1)
-       stfd    fr5,88(r1)
-       stfd    fr6,96(r1)
-       stfd    fr7,104(r1)
-       stfd    fr8,112(r1)
-       stfd    fr9,120(r1)
-       stfd    fr10,128(r1)
-       stfd    fr11,136(r1)
-       stfd    fr12,144(r1)
-       stfd    fr13,152(r1)
-       stw     r10,160(r1)
-
-       lwz     r3,0(r2)
-       bl      jit_compile
-       mr      pv,r3
-
-       mr      mptr,r29
-       lwz     r3,28(r1)
-       lwz             r4,32(r1)
-       lwz             r5,36(r1)
-       lwz             r6,40(r1)
-       lwz             r7,44(r1)
-       lwz             r8,48(r1)
-       lwz             r9,52(r1)
-       lfd             fr1,56(r1)
-       lfd             fr2,64(r1)
-       lfd             fr3,72(r1)
-       lfd             fr4,80(r1)
-       lfd             fr5,88(r1)
-       lfd             fr6,96(r1)
-       lfd             fr7,104(r1)
-       lfd             fr8,112(r1)
-       lfd             fr9,120(r1)
-       lfd             fr10,128(r1)
-       lfd             fr11,136(r1)
-       lfd             fr12,144(r1)
-       lfd             fr13,152(r1)
-       lwz             r10,160(r1)
-
-       lwz     itmp1,176+8(r1)
-       lwz     itmp3,-12(itmp1)
-       extsh   itmp3,itmp3
-       add     mptr,mptr,itmp3
-       stw     pv,0(mptr)
-
-       mtctr   pv
+       mtctr   pv                          /* move method address to control reg */
+       bctr                                /* and call the Java method           */
 
-       lwz     r0,176+8(r1)
-       mtlr    r0
-       addi    r1,r1,176
-       lwz     r29,-12(r1)
-/*     lwz     pv,-8(r1)*/
-       lwz     r31,-4(r1)
-       bctr
+L_asm_call_jit_compiler_exception:
+       mflr    r0
+       stw     r0,LA_LR_OFFSET(sp)
+       stwu    sp,-LA_SIZE_ALIGNED(sp)     /* preserve linkage area              */
+       bl      exceptions_get_and_clear_exception
+       lwz     xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
+       mtlr    xpc     
+       addi    sp,sp,LA_SIZE_ALIGNED
 
+       mr      xptr,v0                     /* get exception                      */
+       addi    xpc,xpc,-4                  /* exception address is ra - 4        */
+       b       L_asm_handle_nat_exception
 
-/***************** function asm_handle_nullptr_exception ***********************
-*                                                                              *
-*   This behaves the same as asm_handle_exception but calls                    *
-*   new_nullpointerexception first                                             *
-*                                                                              *
-*******************************************************************************/
-               
-asm_handle_nullptr_exception:
-       stwu    r1,-32(r1)
-       stw             xpc,24(r1)
-       bl              new_nullpointerexception
-       lwz             xpc,24(r1)
-       addi    r1,r1,32
-       mr      xptr,r3
-       b               asm_handle_exception
 
 /********************* function asm_handle_exception ***************************
 *                                                                              *
@@ -577,665 +365,457 @@ asm_handle_nullptr_exception:
 *******************************************************************************/
                
 asm_handle_nat_exception:
-       mflr    r2
-       lwz     itmp3,4(r2)
-       extsh   itmp3,itmp3
-       add     pv,itmp3,r2
-       lwz     itmp3,8(r2)
-       srwi    itmp3,itmp3,16
-       cmpwi   itmp3,0x3dad
-       bne     asm_handle_exception
-       lwz     itmp3,8(r2)
-       slwi    itmp3,itmp3,16
-       add     pv,pv,itmp3
+L_asm_handle_nat_exception:             /* required for PIC code              */
+L_asm_handle_exception_stack_loop:
+       mflr    r0
+       addi    sp,sp,-(LA_SIZE+((4+6)*4))  /* allocate stack (+4 for darwin)     */
+       stw     xptr,LA_SIZE+(4+0)*4(sp)    /* save exception pointer             */
+       stw     xpc,LA_SIZE+(4+1)*4(sp)     /* save exception pc                  */
+       stw     r0,LA_SIZE+(4+3)*4(sp)      /* save return address                */
+       li      itmp3,0
+       stw     itmp3,LA_SIZE+(4+4)*4(sp)   /* save maybe-leaf flag (cleared)     */
+
+       mr      a0,r0                       /* pass return address                */
+       bl      md_codegen_get_pv_from_pc   /* get PV from RA                     */
+       stw     v0,LA_SIZE+(4+2)*4(sp)      /* save data segment pointer          */
+
+       lwz     a0,LA_SIZE+(4+0)*4(sp)      /* pass xptr                          */
+       lwz     a1,LA_SIZE+(4+1)*4(sp)      /* pass xpc                           */
+       lwz     a2,LA_SIZE+(4+2)*4(sp)      /* pass PV (v0 == a0)                 */
+       addi    a3,sp,LA_SIZE+((4+6)*4)     /* pass Java SP                       */
+
+       b       L_asm_handle_exception_continue
 
 asm_handle_exception:
-       addi    r1,r1,-18*4
-       stw     r0,0*4(r1)
-       stw     r2,1*4(r1)
-       stw     r3,2*4(r1)
-       stw     r4,3*4(r1)
-       stw     r5,4*4(r1)
-       stw     r6,5*4(r1)
-       stw     r7,6*4(r1)
-       stw     r8,7*4(r1)
-       stw     r9,8*4(r1)
-       stw     r10,9*4(r1)
-       stw     r16,10*4(r1)
-       stw     r17,11*4(r1)
-       stw     r18,12*4(r1)
-       stw     r19,13*4(r1)
-       stw     r20,14*4(r1)
-       stw     r21,15*4(r1)
-       stw     r22,16*4(r1)
-       stw     r23,17*4(r1)
-
-       li      r2,1
-ex_stack_loop:
-       addi    r1,r1,-4*4
-       stw     xptr,0*4(r1)
-       stw     xpc,1*4(r1)
-       mflr    xptr
-       stw     xptr,2*4(r1)
-       stw     r2,3*4(r1)
-
-       lwz     r3,0*4(r1)            /* exception pointer                        */
-       lwz     r4,MethodPointer(pv)  /* method pointer                           */
-       mr      r5,xpc                /* exception pc                             */
-/*     mr      r6,r2 */
-       li      r6,0                  /* line number                              */
-       li      r7,4                  /* set no unwind flag                       */
-
-       /* XXX no valid stack frame chaining here */
-       addi    r1,r1,-(24+5*4)       /* 24 linkage area + 5 argument * 4         */
-       bl      builtin_trace_exception
-       addi    r1,r1,(24+5*4)
-
-       lwz     xptr,2*4(r1)
-       mtlr    xptr
-       lwz     xptr,0*4(r1)          /* restore xptr                             */
-       lwz     xpc,1*4(r1)
-       lwz     r2,3*4(r1)
-       addi    r1,r1,4*4
-
-       lwz     r3,ExTableSize(pv)    /* r3 = exception table size                */
-       mr.     r3,r3                 /* if empty table skip                      */
-       beq     empty_table
-
-       addi    r4,pv,ExTableStart    /* r4 = start of exception table            */
-
-ex_table_loop:
-       lwz     r5,ExStartPC(r4)      /* r5 = exception start pc                  */
-       cmplw   r5,xpc                /* (startpc <= xpc)                         */
-       bgt     ex_table_cont
-       lwz     r5,ExEndPC(r4)        /* r5 = exception end pc                    */
-       cmplw   xpc,r5                /* (xpc < endpc)                            */
-       bge     ex_table_cont
-       lwz     r7,ExCatchType(r4)    /* r7 = exception catch type                */
-       mr.     r7,r7
-       beq     ex_handle_it
-
-       lwz     itmp3,offclassloaded(r7)
-       mr.     itmp3,itmp3
-       bne     L_class_loaded
-
-       /* XXX no valid stack frame chaining here */
-       addi    r1,r1,-16*4           /* allocate stack                           */
-       stw     r3,7*4(r1)            /* save used registers                      */
-       stw     r4,8*4(r1)            /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save)  */
-       stw     r2,9*4(r1)
-       stw     xptr,10*4(r1)
-       stw     xpc,11*4(r1)
-       mflr    xptr
-       stw     xptr,12*4(r1)
-       stw     r7,13*4(r1)
-
-       mr      r3,r7                 /* arg1 = exceptionclass                    */
-       bl      class_load
-
-       lwz     r3,7*4(r1)
-       lwz     r4,8*4(r1)
-       lwz     r2,9*4(r1)
-       lwz     xptr,10*4(r1)
-       lwz     xpc,11*4(r1)
-       lwz     itmp3,12*4(r1)
-       mtlr    itmp3
-       lwz     r7,13*4(r1)     
-       addi    r1,r1,16*4
-
-L_class_loaded:
-       lwz     itmp3,offclasslinked(r7)
-       mr.     itmp3,itmp3
-       /* XXX no valid stack frame chaining here */
-       addi    r1,r1,-16*4           /* allocate stack                           */
-       stw     r7,13*4(r1)
-       bne     L_class_linked
-
-       stw     r3,7*4(r1)            /* save used registers                      */
-       stw     r4,8*4(r1)            /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save)  */
-       stw     r2,9*4(r1)
-       stw     xptr,10*4(r1)
-       stw     xpc,11*4(r1)
-       mflr    xptr
-       stw     xptr,12*4(r1)
-
-       mr      r3,r7                 /* arg1 = exceptionclass                    */
-       bl      class_link
-
-       lwz     r3,7*4(r1)
-       lwz     r4,8*4(r1)
-       lwz     r2,9*4(r1)
-       lwz     xptr,10*4(r1)
-       lwz     xpc,11*4(r1)
-       lwz     itmp3,12*4(r1)
-       mtlr    itmp3
+L_asm_handle_exception:                 /* required for PIC code              */
+       addi    sp,sp,-(ARG_CNT+TMP_CNT)*8  /* create maybe-leaf stackframe       */
 
-L_class_linked:
-_crit_restart1:
-       lwz     r7,13*4(r1)     
-_crit_begin1:
-       lwz     r6,offobjvftbl(xptr)  /* r6 = vftblptr(xptr)                      */
-       lwz     r7,offclassvftbl(r7)  /* r7 = vftblptr(catchtype) class (not obj) */
-       lwz     r6,offbaseval(r6)     /* r6 = baseval(xptr)                       */
-       lwz     r8,offbaseval(r7)     /* r8 = baseval(catchtype)                  */
-       lwz     r7,offdiffval(r7)     /* r7 = diffval(catchtype)                  */
-_crit_end1:
-       subf    r6,r8,r6              /* r6 = baseval(xptr) - baseval(catchtype)  */
-       cmplw   r6,r7                 /* xptr is instanceof catchtype             */
-       addi    r1,r1,16*4
-       bgt     ex_table_cont         /* if (false) continue                      */
-
-ex_handle_it:
-       lwz     xpc,ExHandlerPC(r4)   /* xpc = exception handler pc               */
-       mr.     r2,r2
-       beq     ex_jump
-
-       lwz     r0,0*4(r1)
-       lwz     r2,1*4(r1)
-       lwz     r3,2*4(r1)
-       lwz     r4,3*4(r1)
-       lwz     r5,4*4(r1)
-       lwz     r6,5*4(r1)
-       lwz     r7,6*4(r1)
-       lwz     r8,7*4(r1)
-       lwz     r9,8*4(r1)
-       lwz     r10,9*4(r1)
-       lwz     r16,10*4(r1)
-       lwz     r17,11*4(r1)
-       lwz     r18,12*4(r1)
-       lwz     r19,13*4(r1)
-       lwz     r20,14*4(r1)
-       lwz     r21,15*4(r1)
-       lwz     r22,16*4(r1)
-       lwz     r23,17*4(r1)
-       addi    r1,r1,18*4
-
-ex_jump:
-       mtctr   xpc
-       bctr
+#if defined(__DARWIN__)
+#else
+       SAVE_ARGUMENT_REGISTERS(0)          /* we save arg and temp registers in  */
+       SAVE_TEMPORARY_REGISTERS(ARG_CNT)   /* case this is a leaf method         */
+#endif
+
+       addi    sp,sp,-(LA_SIZE+(4+6)*4)    /* allocate stack                     */
+       stw     xptr,LA_SIZE+(4+0)*4(sp)    /* save xptr                          */
+       stw     pv,LA_SIZE+(4+2)*4(sp)      /* save PV                            */
+       mflr    r0                          /* save RA                            */
+       stw     r0,LA_SIZE+(4+3)*4(sp)
+       li      t0,1                        /* set maybe-leaf flag                */
+       stw     t0,LA_SIZE+(4+4)*4(sp)      /* save maybe-leaf flag               */
+
+       mr      a0,xptr                     /* pass exception pointer             */
+       mr      a1,xpc                      /* pass exception pc                  */
+       mr      a2,pv                       /* pass data segment pointer          */
+       addi    a3,sp,LA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*4
+
+L_asm_handle_exception_continue:
+       bl      exceptions_handle_exception
+
+       mr.     v0,v0
+       beq     L_asm_handle_exception_not_catched
+
+       mr      xpc,v0                      /* move handlerpc into xpc            */
+       lwz     xptr,LA_SIZE+(4+0)*4(sp)    /* restore xptr                       */
+       lwz     pv,LA_SIZE+(4+2)*4(sp)      /* restore PV                         */
+       lwz     r0,LA_SIZE+(4+3)*4(sp)      /* restore RA                         */
+       mtlr    r0
+       lwz     t0,LA_SIZE+(4+4)*4(sp)      /* get maybe-leaf flag                */
+       addi    sp,sp,LA_SIZE+(4+6)*4       /* free stack frame                   */
+
+       mr.     t0,t0
+       beq     L_asm_handle_exception_no_leaf
 
-ex_table_cont:
-       addi    r4,r4,ExEntrySize
-       addic.  r3,r3,-1
-       bgt     ex_table_loop
-
-empty_table:
-       mr.     r2,r2                 /* if here the first time, then             */
-       beq     ex_already_cleared
-       addi    r1,r1,18*4            /* deallocate stack and                     */
-       li      r2,0                  /* clear the no unwind flag                 */
-ex_already_cleared:
-       lwz     r3,IsSync(pv)
-       mr.     r3,r3
-       beq     no_monitor_exit
-
-#if defined(USE_THREADS)
-       add     r3,r1,r3
-       lwz     r6,-4(r3)
-
-       addi    r1,r1,-6*4
-       stw     r3,0*4(r1)
-       stw     r4,1*4(r1)
-       stw     r2,2*4(r1)
-       stw     xptr,3*4(r1)
-       stw     xpc,4*4(r1)
-       mflr    xptr
-       stw     xptr,5*4(r1)
-
-       mr      r3,r6
-       /* XXX no valid stack frame chaining here */
-       addi    r1,r1,-40
-       bl      builtin_monitorexit
-       addi    r1,r1,40
-
-       lwz     xptr,5*4(r1)
-       mtlr    xptr
-       lwz     r3,0*4(r1)
-       lwz     r4,1*4(r1)
-       lwz     r2,2*4(r1)
-       lwz     xptr,3*4(r1)
-       lwz     xpc,4*4(r1)
-       addi    r1,r1,6*4
+#if defined(__DARWIN__)
+#else
+       RESTORE_ARGUMENT_REGISTERS(0)       /* if this is a leaf method, we have  */
+       RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers  */
 #endif
 
-no_monitor_exit:
-       lwz     r3,FrameSize(pv)      /* r3 = frame size                          */
-       add     r1,r1,r3              /* unwind stack                             */
-       mr      r3,r1                 /* r3 = pointer to save area                */
-       lwz     r4,IsLeaf(pv)         /* r4 = is leaf procedure                   */
-       mr.     r4,r4
-       bne     ex_no_restore         /* if (leaf) skip                           */
-       lwz     r4,8(r3)              /* restore ra                               */
-       mtlr    r4                    /* t0--                                     */
-ex_no_restore:
-       mflr    r4                    /* the new xpc is ra                        */
-       mr      xpc,r4
-       lwz     r4,IntSave(pv)        /* r4 = saved int register count            */
+       addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
+
+L_asm_handle_exception_no_leaf:
+       mtctr   xpc                         /* jump to the handler                */
+       bctr
+
+L_asm_handle_exception_not_catched:
+       lwz     xptr,LA_SIZE+(4+0)*4(sp)    /* restore xptr                       */
+       lwz     pv,LA_SIZE+(4+2)*4(sp)      /* restore PV                         */
+       lwz     r0,LA_SIZE+(4+3)*4(sp)      /* restore RA                         */
+       mtlr    r0
+       lwz     t0,LA_SIZE+(4+4)*4(sp)      /* get maybe-leaf flag                */
+       addi    sp,sp,LA_SIZE+(4+6)*4       /* free stack frame                   */
+
+       mr.     t0,t0
+       beq     L_asm_handle_exception_no_leaf_stack
+
+       addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
+       li      t0,0                        /* clear the maybe-leaf flag          */
+
+L_asm_handle_exception_no_leaf_stack:
+       lwz     t1,FrameSize(pv)            /* get frame size                     */
+       add     t1,sp,t1                    /* pointer to save area               */
+
+       lwz     t2,IsLeaf(pv)               /* is leaf procedure                  */
+       mr.     t2,t2
+       bne     L_asm_handle_exception_no_ra_restore
+
+       lwz     r0,LA_LR_OFFSET(t1)         /* restore ra                         */
+       mtlr    r0
+
+L_asm_handle_exception_no_ra_restore:
+       mflr    xpc                         /* the new xpc is ra                  */
+       mr      t4,xpc                      /* save RA                            */
+       lwz     t2,IntSave(pv)              /* t2 = saved int register count      */
        bl      ex_int1
 ex_int1:
-       mflr    r5
+       mflr    t3                          /* t3 = current pc                    */
 #if defined(__DARWIN__)
-       addi    r5,r5,lo16(ex_int2-ex_int1)
+       addi    t3,t3,lo16(ex_int2-ex_int1)
 #else
-       addi    r5,r5,(ex_int2-ex_int1)@l
+       addi    t3,t3,(ex_int2-ex_int1)@l
 #endif
-       slwi    r4,r4,2
-       subf    r5,r4,r5
-       mtctr   r5
+       slwi    t2,t2,2                     /* t2 = register count * 4            */
+       subf    t3,t2,t3                    /* t3 = IntSave - t2                  */
+       mtctr   t3
        bctr
-       lwz     r14,-40(r3)
-       lwz     r15,-36(r3)
-       lwz     r24,-32(r3)
-       lwz     r25,-28(r3)
-       lwz     r26,-24(r3)
-       lwz     r27,-20(r3)
-       lwz     r28,-16(r3)
-       lwz     r29,-12(r3)
-       lwz     r30,-8(r3)
-       lwz     r31,-4(r3)
+
+       lwz     s0,-10*8(t1)
+       lwz     s1,-9*8(t1)
+       lwz     s2,-8*8(t1)
+       lwz     s3,-7*8(t1)
+       lwz     s4,-6*8(t1)
+       lwz     s5,-5*8(t1)
+       lwz     s6,-4*8(t1)
+       lwz     s7,-3*8(t1)
+       lwz     s8,-2*8(t1)
+       lwz     s9,-1*8(t1)
+
 ex_int2:
-       subf    r3,r4,r3
+       subf    t1,t2,t1                    /* t1 = t1 - register count * 4       */
 
-       lwz     r4,FltSave(pv)
+       lwz     t2,FltSave(pv)
        bl      ex_flt1
 ex_flt1:
-       mflr    r5
+       mflr    t3
 #if defined(__DARWIN__)
-       addi    r5,r5,lo16(ex_flt2-ex_flt1)
+       addi    t3,t3,lo16(ex_flt2-ex_flt1)
 #else
-       addi    r5,r5,(ex_flt2-ex_flt1)@l
+       addi    t3,t3,(ex_flt2-ex_flt1)@l
 #endif
-       slwi    r4,r4,2
-       subf    r5,r4,r5
-       mtctr   r5
+       slwi    t2,t2,2                     /* t2 = register count * 4            */
+       subf    t3,t2,t3                    /* t3 = FltSave - t2                  */
+       mtctr   t3
        bctr
-       lfd     fr14,-80(r3)
-       lfd     fr15,-72(r3)
-       lfd     fr24,-64(r3)
-       lfd     fr25,-56(r3)
-       lfd     fr26,-48(r3)
-       lfd     fr27,-40(r3)
-       lfd     fr28,-32(r3)
-       lfd     fr29,-24(r3)
-       lfd     fr30,-16(r3)
-       lfd     fr31,-8(r3)
+
+       lfd     fs0,-10*8(t1)
+       lfd     fs1,-9*8(t1)
+       lfd     fs2,-8*8(t1)
+       lfd     fs3,-7*8(t1)
+       lfd     fs4,-6*8(t1)
+       lfd     fs5,-5*8(t1)
+       lfd     fs6,-4*8(t1)
+       lfd     fs7,-3*8(t1)
+       lfd     fs8,-2*8(t1)
+       lfd     fs9,-1*8(t1)
+
 ex_flt2:
-       mtlr    xpc
-       lwz     itmp3,4(xpc)
-       extsh   itmp3,itmp3
-       add     pv,itmp3,xpc
-       lwz     itmp3,8(xpc)
-       srwi    itmp3,itmp3,16
-       cmpwi   itmp3,0x3dad
-       bne     ex_stack_loop
-       lwz     itmp3,8(xpc)
-       slwi    itmp3,itmp3,16
-       add     pv,pv,itmp3
-       b       ex_stack_loop
-
-
-/********************* asm_check_clinit ****************************************
-*                                                                              *
-*   call static class initializer for PUT/GETSTATIC instructions               *
-*                                                                              *
-*******************************************************************************/
+       mtlr    t4                          /* restore RA                         */
+       lwz     t1,FrameSize(pv)            /* get frame size                     */
+       add     sp,sp,t1                    /* unwind stack                       */
+       b       L_asm_handle_exception_stack_loop
 
-asm_check_clinit:
-       lwz     itmp2,offclassinit(itmp1)
-       mr.     itmp2,itmp2
-       bne     L_is_initialized
 
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-(26*8)(r1)        /* keep stack 16-bytes aligned              */
-
-    stw     r3,4*8(r1)            /* save argument registers                  */
-    stw     r4,5*8(r1)            /* preserve linkage area (24 bytes)         */
-    stw     r5,6*8(r1)            /* and 4 bytes (better 8) for 1 argument    */
-    stw     r6,7*8(r1)
-    stw     r7,8*8(r1)
-    stw     r8,9*8(r1)
-    stw     r9,10*8(r1)
-       stw     r10,11*8(r1)
-
-       stfd    fr1,12*8(r1)
-    stfd    fr2,13*8(r1)
-    stfd    fr3,14*8(r1)
-    stfd    fr4,15*8(r1)
-    stfd    fr5,16*8(r1)
-    stfd    fr6,17*8(r1)
-    stfd    fr7,18*8(r1)
-    stfd    fr8,19*8(r1)
-    stfd    fr9,20*8(r1)
-    stfd    fr10,21*8(r1)
-    stfd    fr11,22*8(r1)
-    stfd    fr12,23*8(r1)
-    stfd    fr13,24*8(r1)
-               
-       mr      r3,itmp1
-       bl      class_init
-       mr      itmp1,r3              /* save return value in temp register       */
-
-       lwz     r3,4*8(r1)
-       lwz     r4,5*8(r1)
-       lwz     r5,6*8(r1)
-       lwz     r6,7*8(r1)
-       lwz     r7,8*8(r1)
-       lwz     r8,9*8(r1)
-       lwz     r9,10*8(r1)
-       lwz     r10,11*8(r1)
-
-    lfd     fr1,12*8(r1)
-    lfd     fr2,13*8(r1)
-    lfd     fr3,14*8(r1)
-    lfd        fr4,15*8(r1)
-    lfd        fr5,16*8(r1)
-    lfd        fr6,17*8(r1)
-    lfd        fr7,18*8(r1)
-    lfd        fr8,19*8(r1)
-    lfd        fr9,20*8(r1)
-    lfd        fr10,21*8(r1)
-    lfd        fr11,22*8(r1)
-    lfd        fr12,23*8(r1)
-    lfd        fr13,24*8(r1)
-               
-       lwz     r0,(26*8)+8(r1)
-       mtlr    r0
-       addi    r1,r1,(26*8)
+/* asm_abstractmethoderror *****************************************************
 
-       mr.         itmp1,itmp1           /* check for an exception                   */
-       beq     L_initializererror
+   Creates and throws an AbstractMethodError.
 
-L_is_initialized:
-       blr
+*******************************************************************************/
 
-L_initializererror:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+asm_abstractmethoderror:
        mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-4*8(r1)           /* preserve linkage area (24 bytes)         */
-       bl      builtin_asm_get_exceptionptrptr
-       lwz     r0,(4*8)+8(r1)
-       mtlr    r0      
-       addi    r1,r1,4*8
-#else
-# if defined(__DARWIN__)
-       lwz     r3,lo16(_exceptionptr-0b)(pv)
-# else
-       lis     r3,_exceptionptr@ha
-       addi    r3,r3,_exceptionptr@l
-# endif
-#endif
+       stw     r0,LA_LR_OFFSET(sp)
+       stwu    sp,-LA_SIZE_ALIGNED(sp)     /* preserve linkage area              */
+       addi    a0,sp,LA_SIZE_ALIGNED       /* pass java sp                       */
+       mr      a1,r0                       /* pass exception address             */
+       bl      exceptions_asm_new_abstractmethoderror
+       lwz     r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
+       mtlr    r0                          /* restore return address             */
+       addi    sp,sp,LA_SIZE_ALIGNED
 
-       lwz     xptr,0(r3)            /* get the exception pointer                */
-       li      r0,0
-       stw     r0,0(r3)              /* clear the exception pointer              */
+       mr      xptr,v0                     /* get exception pointer              */
+       mr      xpc,r0                      /* we can't use r0 directly in addi   */
+       addi    xpc,xpc,-4                  /* exception address is ra - 4        */
+       b       L_asm_handle_nat_exception
 
-       mflr    xpc
-       b       asm_handle_nat_exception
 
+#if defined(ENABLE_REPLACEMENT)
 
-/******************* function asm_builtin_checkarraycast ***********************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
-*******************************************************************************/
-               
-asm_builtin_checkarraycast:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-48(r1)
+/* asm_replacement_out *********************************************************
 
-       stw     r3,32(r1)
-       bl      builtin_checkarraycast
+   This code is jumped to from the replacement-out stubs that are executed
+   when a thread reaches an activated replacement point.
 
-       lwz     r0,48+8(r1)
-       mtlr    r0
-       mr.     r3,r3
-       beq     nb_carray_throw
-       lwz     r3,32(r1)
-       addi    r1,r1,48
-       blr
+   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.
 
-nb_carray_throw:
-       addi    r1,r1,48
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_classcastexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+   Stack layout:
+      16                start of stack inside method to replace
+      0   rplpoint *    info on the replacement point that was reached
 
+   NOTE: itmp3 has been clobbered by the replacement-out stub!
 
-/******************* function asm_builtin_aastore ******************************
-*                                                                              *
-*   Does the cast check and eventually throws an exception                     *
-*                                                                              *
 *******************************************************************************/
+
+/* 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 sizeexecutionstate_ALIGNED  ((sizeexecutionstate + 15) & ~15)
+
+asm_replacement_out:
+    /* create stack frame */
+       addi    sp,sp,-(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM)
+
+       /* save link register */
+       mflr    itmp3
+
+       /* save registers in execution state */
+       stw     r0 ,( 0*4+offes_intregs)(sp)
+       stw     r1 ,( 1*4+offes_intregs)(sp)
+       stw     r2 ,( 2*4+offes_intregs)(sp)
+       stw     r3 ,( 3*4+offes_intregs)(sp)
+       stw     r4 ,( 4*4+offes_intregs)(sp)
+       stw     r5 ,( 5*4+offes_intregs)(sp)
+       stw     r6 ,( 6*4+offes_intregs)(sp)
+       stw     r7 ,( 7*4+offes_intregs)(sp)
+       stw     r8 ,( 8*4+offes_intregs)(sp)
+       stw     r9 ,( 9*4+offes_intregs)(sp)
+       stw     r10,(10*4+offes_intregs)(sp)
+       stw     r11,(11*4+offes_intregs)(sp)
+       stw     r12,(12*4+offes_intregs)(sp)
+       stw     r13,(13*4+offes_intregs)(sp)
+       stw     r14,(14*4+offes_intregs)(sp)
+       stw     r15,(15*4+offes_intregs)(sp)
+       stw     r16,(16*4+offes_intregs)(sp) /* link register stored as itmp3 */
+       stw     r17,(17*4+offes_intregs)(sp)
+       stw     r18,(18*4+offes_intregs)(sp)
+       stw     r19,(19*4+offes_intregs)(sp)
+       stw     r20,(20*4+offes_intregs)(sp)
+       stw     r21,(21*4+offes_intregs)(sp)
+       stw     r22,(22*4+offes_intregs)(sp)
+       stw     r23,(23*4+offes_intregs)(sp)
+       stw     r24,(24*4+offes_intregs)(sp)
+       stw     r25,(25*4+offes_intregs)(sp)
+       stw     r26,(26*4+offes_intregs)(sp)
+       stw     r27,(27*4+offes_intregs)(sp)
+       stw     r28,(28*4+offes_intregs)(sp)
+       stw     r29,(29*4+offes_intregs)(sp)
+       stw     r30,(30*4+offes_intregs)(sp)
+       stw     r31,(31*4+offes_intregs)(sp)
        
-asm_builtin_aastore:
-       mr.     r3,r3
-       beq     nb_aastore_null
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-48(r1)
-
-       lwz     itmp1,offarraysize(r3)
-       slwi    itmp3,r4,2
-       add     itmp2,r3,itmp3
-       cmplw   r4,itmp1
-       bge     nb_aastore_bound
-       mr      r4,r5
-       stw     itmp2,32(r1)
-       stw     r4,36(r1)
-       bl      builtin_canstore
-
-       lwz     r0,48+8(r1)
-       mtlr    r0
-       lwz     itmp1,32(r1)
-       lwz     itmp2,36(r1)
-       addi    r1,r1,48
-       mr.     r3,r3
-       beq     nb_aastore_store
-       stw     itmp2,offobjarrdata(itmp1)
-       blr
+       stfd    fr0 ,( 0*8+offes_fltregs)(sp)
+       stfd    fr1 ,( 1*8+offes_fltregs)(sp)
+       stfd    fr2 ,( 2*8+offes_fltregs)(sp)
+       stfd    fr3 ,( 3*8+offes_fltregs)(sp)
+       stfd    fr4 ,( 4*8+offes_fltregs)(sp)
+       stfd    fr5 ,( 5*8+offes_fltregs)(sp)
+       stfd    fr6 ,( 6*8+offes_fltregs)(sp)
+       stfd    fr7 ,( 7*8+offes_fltregs)(sp)
+       stfd    fr8 ,( 8*8+offes_fltregs)(sp)
+       stfd    fr9 ,( 9*8+offes_fltregs)(sp)
+       stfd    fr10,(10*8+offes_fltregs)(sp)
+       stfd    fr11,(11*8+offes_fltregs)(sp)
+       stfd    fr12,(12*8+offes_fltregs)(sp)
+       stfd    fr13,(13*8+offes_fltregs)(sp)
+       stfd    fr14,(14*8+offes_fltregs)(sp)
+       stfd    fr15,(15*8+offes_fltregs)(sp)
+       stfd    fr16,(16*8+offes_fltregs)(sp)
+       stfd    fr17,(17*8+offes_fltregs)(sp)
+       stfd    fr18,(18*8+offes_fltregs)(sp)
+       stfd    fr19,(19*8+offes_fltregs)(sp)
+       stfd    fr20,(20*8+offes_fltregs)(sp)
+       stfd    fr21,(21*8+offes_fltregs)(sp)
+       stfd    fr22,(22*8+offes_fltregs)(sp)
+       stfd    fr23,(23*8+offes_fltregs)(sp)
+       stfd    fr24,(24*8+offes_fltregs)(sp)
+       stfd    fr25,(25*8+offes_fltregs)(sp)
+       stfd    fr26,(26*8+offes_fltregs)(sp)
+       stfd    fr27,(27*8+offes_fltregs)(sp)
+       stfd    fr28,(28*8+offes_fltregs)(sp)
+       stfd    fr29,(29*8+offes_fltregs)(sp)
+       stfd    fr30,(30*8+offes_fltregs)(sp)
+       stfd    fr31,(31*8+offes_fltregs)(sp)
+       
+       /* calculate sp of method */
+       addi    itmp1,sp,(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM + 4*4)
+       stw     itmp1,(offes_sp)(sp)
 
-nb_aastore_null:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_nullpointerexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+       /* store pv */
+       stw     pv,(offes_pv)(sp)
 
-nb_aastore_bound:
-       addi    r1,r1,48
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-(24+1*4)(r1)
-       mr      r3,r4                 /* move index into a0                       */
-       bl      new_arrayindexoutofboundsexception
-       mr      xptr,r3
-       addi    r1,r1,(24+1*4)
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+       /* call replace_me */
+       lwz     a0,-(4*4)(itmp1)            /* arg0: rplpoint *                   */
+       mr      a1,sp                       /* arg1: execution state              */
+       addi    sp,sp,-(LA_SIZE_ALIGNED)
+       b       replace_me                  /* call C function replace_me         */
 
-nb_aastore_store:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_arraystoreexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+/* asm_replacement_in **********************************************************
 
+   This code writes the given execution state and jumps to the replacement
+   code.
 
-#if defined(USE_THREADS)
-asm_builtin_monitorenter:
-       mr.     r3,r3
-       beq     nb_monitorenter
-       b       builtin_monitorenter
+   This function never returns!
 
-nb_monitorenter:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_nullpointerexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-/*     addi    xpc,r0,-4 */
-       mr      xpc,r0
-       addi    xpc,xpc,-4
-       mtlr    r0
-       b       asm_handle_nat_exception
+   NOTE: itmp3 is not restored!
 
+   C prototype:
+      void asm_replacement_in(executionstate *es, replace_safestack_t *st);
 
-asm_builtin_monitorexit:
-       mr.     r3,r3
-       beq     nb_monitorexit
-       b       builtin_monitorexit
+*******************************************************************************/
 
-nb_monitorexit:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_nullpointerexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-/*     addi    xpc,r0,-4 */
-       mr      xpc,r0
-       addi    xpc,xpc,-4
-       mtlr    r0
-       b       asm_handle_nat_exception
-#endif
+asm_replacement_in:
+       /* a0 == executionstate *es      */
+       /* a1 == replace_safestack_t *st */
 
-       
-asm_builtin_idiv:
-       mr.     r4,r4
-       beq     nb_idiv
-       lis     itmp3,0x8000
-       cmpw    r3,itmp3
-       bne     normal_idiv
-       cmpwi   r4,-1
-       bne     normal_idiv
-       blr
+       /* get arguments */
+       mr              s1,a1                       /* replace_safestack_t *st            */
+       mr              s2,a0                       /* executionstate *es == safe stack   */
 
-normal_idiv:
-       divw    r3,r3,r4
-       blr
+       /* switch to the safe stack */
+       mr              sp,s2
 
-nb_idiv:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_arithmeticexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
-
-
-asm_builtin_irem:
-       mr      itmp2,r3
-       mr.     r4,r4
-       beq     nb_irem
-       lis     itmp3,0x8000
-       cmpw    itmp2,itmp3
-       bne     normal_irem
-       cmpwi   r4,-1
-       bne     normal_irem
-       li      r3,0
-       beqlr
-
-normal_irem:
-       divw    itmp3,itmp2,r4
-       mullw   itmp3,itmp3,r4
-       subf    r3,itmp3,itmp2
-       blr
+       /* reserve linkage area */
+       addi    sp,sp,-(LA_SIZE_ALIGNED)
 
-nb_irem:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_arithmeticexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+       /* call replace_build_execution_state(st) */
+       mr              a0,s1
+       bl              replace_build_execution_state
 
+       /* set new sp */
+       lwz             sp,(offes_sp)(s2)
 
-asm_builtin_ldiv:
-       or.     r0,r5,r6
-       beq     nb_ldiv
-       b       builtin_ldiv
+       /* build stack frame */
+       addi    sp,sp,-(sizeexecutionstate_ALIGNED)
 
-nb_ldiv:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_arithmeticexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+       /* call replace_free_safestack(st,& of allocated executionstate_t) */
+       mr              a1,sp /* tmpes */
+       mr              a0,s1 /* st    */
+       addi    sp,sp,-(LA_SIZE_ALIGNED)  /* reserve linkage area */
+       bl              replace_free_safestack
+       addi    sp,sp,+(LA_SIZE_ALIGNED)  /* tear down linkage area */
 
+       /* set new pv */
+       lwz     pv,(offes_pv)(sp)
+       
+       /* copy registers from execution state */
+       lwz     r0 ,( 0*4+offes_intregs)(sp)
+       /* r1 is sp                       */
+       /* r2 is reserved                 */
+       lwz     a0 ,( 3*4+offes_intregs)(sp)
+       lwz     r4 ,( 4*4+offes_intregs)(sp)
+       lwz     r5 ,( 5*4+offes_intregs)(sp)
+       lwz     r6 ,( 6*4+offes_intregs)(sp)
+       lwz     r7 ,( 7*4+offes_intregs)(sp)
+       lwz     r8 ,( 8*4+offes_intregs)(sp)
+       lwz     r9 ,( 9*4+offes_intregs)(sp)
+       lwz     r10,(10*4+offes_intregs)(sp)
+       lwz     r11,(11*4+offes_intregs)(sp)
+       lwz     r12,(12*4+offes_intregs)(sp)
+       /* r13 is pv                      */
+       lwz     r14,(14*4+offes_intregs)(sp)
+       lwz     r15,(15*4+offes_intregs)(sp)
+       lwz     r16,(16*4+offes_intregs)(sp) /* itmp3, later to link register */
+       lwz     r17,(17*4+offes_intregs)(sp)
+       lwz     r18,(18*4+offes_intregs)(sp)
+       lwz     r19,(19*4+offes_intregs)(sp)
+       lwz     r20,(20*4+offes_intregs)(sp)
+       lwz     r21,(21*4+offes_intregs)(sp)
+       lwz     r22,(22*4+offes_intregs)(sp)
+       lwz     r23,(23*4+offes_intregs)(sp)
+       lwz     r24,(24*4+offes_intregs)(sp)
+       lwz     r25,(25*4+offes_intregs)(sp)
+       lwz     r26,(26*4+offes_intregs)(sp)
+       lwz     r27,(27*4+offes_intregs)(sp)
+       lwz     r28,(28*4+offes_intregs)(sp)
+       lwz     r29,(29*4+offes_intregs)(sp)
+       lwz     r30,(30*4+offes_intregs)(sp)
+       lwz     r31,(31*4+offes_intregs)(sp)
+       
+       lfd     fr0 ,( 0*8+offes_fltregs)(sp)
+       lfd     fr1 ,( 1*8+offes_fltregs)(sp)
+       lfd     fr2 ,( 2*8+offes_fltregs)(sp)
+       lfd     fr3 ,( 3*8+offes_fltregs)(sp)
+       lfd     fr4 ,( 4*8+offes_fltregs)(sp)
+       lfd     fr5 ,( 5*8+offes_fltregs)(sp)
+       lfd     fr6 ,( 6*8+offes_fltregs)(sp)
+       lfd     fr7 ,( 7*8+offes_fltregs)(sp)
+       lfd     fr8 ,( 8*8+offes_fltregs)(sp)
+       lfd     fr9 ,( 9*8+offes_fltregs)(sp)
+       lfd     fr10,(10*8+offes_fltregs)(sp)
+       lfd     fr11,(11*8+offes_fltregs)(sp)
+       lfd     fr12,(12*8+offes_fltregs)(sp)
+       lfd     fr13,(13*8+offes_fltregs)(sp)
+       lfd     fr14,(14*8+offes_fltregs)(sp)
+       lfd     fr15,(15*8+offes_fltregs)(sp)
+       lfd     fr16,(16*8+offes_fltregs)(sp)
+       lfd     fr17,(17*8+offes_fltregs)(sp)
+       lfd     fr18,(18*8+offes_fltregs)(sp)
+       lfd     fr19,(19*8+offes_fltregs)(sp)
+       lfd     fr20,(20*8+offes_fltregs)(sp)
+       lfd     fr21,(21*8+offes_fltregs)(sp)
+       lfd     fr22,(22*8+offes_fltregs)(sp)
+       lfd     fr23,(23*8+offes_fltregs)(sp)
+       lfd     fr24,(24*8+offes_fltregs)(sp)
+       lfd     fr25,(25*8+offes_fltregs)(sp)
+       lfd     fr26,(26*8+offes_fltregs)(sp)
+       lfd     fr27,(27*8+offes_fltregs)(sp)
+       lfd     fr28,(28*8+offes_fltregs)(sp)
+       lfd     fr29,(29*8+offes_fltregs)(sp)
+       lfd     fr30,(30*8+offes_fltregs)(sp)
+       lfd     fr31,(31*8+offes_fltregs)(sp)
+
+       /* restore link register */
 
-asm_builtin_lrem:
-       or.     r0,r5,r6
-       beq     nb_lrem
-       b       builtin_lrem
+       mtlr    itmp3
+       
+       /* load new pc */
 
-nb_lrem:
-       mflr    r0
-       stw     r0,8(r1)
-       stwu    r1,-24(r1)
-       bl      new_arithmeticexception
-       mr      xptr,r3
-       addi    r1,r1,24
-       lwz     r0,8(r1)
-       mr      xpc,r0
-       mtlr    r0
-       b       asm_handle_nat_exception
+       lwz     itmp3,offes_pc(sp)
+
+       /* remove stack frame */
 
+       addi    sp,sp,+(sizeexecutionstate_ALIGNED)
+
+       /* jump to new code */
+
+       mtctr   itmp3
+       bctr
+
+#endif /* defined(ENABLE_REPLACEMENT) */
+
+/*********************************************************************/
 
 asm_cacheflush:
-       addi    r4,r4,31
-       mr      r5,r3
-       add     r4,r3,r4
+       add     a1,a0,a1
+       rlwinm  a0,a0,0,0,26
+       addi    a1,a1,31
+       rlwinm  a1,a1,0,0,26
+       mr      a2,a0
 1:
-       cmplw   r3,r4
+       cmplw   a0,a1
        bge     0f
-       dcbst   0,r3
-       addi    r3,r3,32
+       dcbst   0,a0
+       addi    a0,a0,32
        b       1b
 0:
        sync
 1:
-       cmplw   r5,r4
+       cmplw   a2,a1
        bge     0f
-       icbi    0,r5
-       addi    r5,r5,32
+       icbi    0,a2
+       addi    a2,a2,32
        b       1b
 0:
        sync
@@ -1243,204 +823,269 @@ asm_cacheflush:
        blr
 
 
-       .align 3
-doublezero:
-       .double 0.0
-
-asm_initialize_thread_stack:
-       addi r4,r4,-256
-       stw r3,120(r4)
-       li r3,0
-       stw r3,124(r4)
-       stw r3,0(r4)
-       stw r3,4(r4)
-       stw r3,8(r4)
-       stw r3,12(r4)
-       stw r3,16(r4)
-       stw r3,20(r4)
-       stw r3,24(r4)
-       stw r3,28(r4)
-       stw r3,32(r4)
-       stw r3,36(r4)
-
-       stw r3,128(r4)
-       stw r3,132(r4)
-       stw r3,136(r4)
-       stw r3,140(r4)
-       stw r3,144(r4)
-       stw r3,148(r4)
-       stw r3,152(r4)
-       stw r3,156(r4)
+/* asm_compare_and_swap ********************************************************
+
+   XXX
+
+*******************************************************************************/
+
+asm_compare_and_swap:
+1:
+       lwarx   a6,0,a0 
+       subf.   r0,a6,a1 
+       bne-    2f 
+       or      r0,a2,a2 
+       stwcx.  r0,0,a0 
+       bne-    1b 
+2: 
+       mr      a0,a6
+       blr
+
+
+/* asm_memory_barrier **********************************************************
+
+   XXX
 
+*******************************************************************************/
+
+asm_memory_barrier:
+       sync
+       blr
+
+
+#if defined(__DARWIN__)
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_builtin_throw_exception$stub:
+       .indirect_symbol _builtin_throw_exception
        mflr r0
-       bl 0f
-0:
-       mflr r3
+       bcl 20,31,L00$_builtin_throw_exception
+L00$_builtin_throw_exception:
+       mflr r11
+       addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
        mtlr r0
-#if defined(__DARWIN__)
-       lfd fr0,lo16(doublezero-0b)(r3)
-#else
-       lfd fr0,(doublezero-0b)@l(r3)
-#endif
+       lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_builtin_throw_exception$lazy_ptr:
+       .indirect_symbol _builtin_throw_exception
+       .long dyld_stub_binding_helper
 
-       stfd fr0,40(r4)
-       stfd fr0,48(r4)
-       stfd fr0,56(r4)
-       stfd fr0,64(r4)
-       stfd fr0,72(r4)
-       stfd fr0,80(r4)
-       stfd fr0,88(r4)
-       stfd fr0,96(r4)
-       stfd fr0,104(r4)
-       stfd fr0,112(r4)
-
-       stfd fr0,160(r4)
-       stfd fr0,168(r4)
-       stfd fr0,176(r4)
-       stfd fr0,184(r4)
-       stfd fr0,192(r4)
-       stfd fr0,200(r4)
-       stfd fr0,208(r4)
-       stfd fr0,216(r4)
-
-       mr r3,r4
-       blr
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_md_codegen_get_pv_from_pc$stub:
+       .indirect_symbol _md_codegen_get_pv_from_pc
+       mflr r0
+       bcl 20,31,L00$_md_codegen_get_pv_from_pc
+L00$_md_codegen_get_pv_from_pc:
+       mflr r11
+       addis r11,r11,ha16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)
+       mtlr r0
+       lwzu r12,lo16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_md_codegen_get_pv_from_pc$lazy_ptr:
+       .indirect_symbol _md_codegen_get_pv_from_pc
+       .long dyld_stub_binding_helper
 
 
-asm_perform_threadswitch:
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_exceptions_handle_exception$stub:
+       .indirect_symbol _exceptions_handle_exception
        mflr r0
-       addi r1,r1,-224
-       stw r0,120(r1)
-       stw pv,124(r1)
-       stw r14,0(r1)
-       stw r15,4(r1)
-       stw r24,8(r1)
-       stw r25,12(r1)
-       stw r26,16(r1)
-       stw r27,20(r1)
-       stw r28,24(r1)
-       stw r29,28(r1)
-       stw r30,32(r1)
-       stw r31,36(r1)
-       stfd fr14,40(r1)
-       stfd fr15,48(r1)
-       stfd fr24,56(r1)
-       stfd fr25,64(r1)
-       stfd fr26,72(r1)
-       stfd fr27,80(r1)
-       stfd fr28,88(r1)
-       stfd fr29,96(r1)
-       stfd fr30,104(r1)
-       stfd fr31,112(r1)
-
-       stw r16,128(r1)
-       stw r17,132(r1)
-       stw r18,136(r1)
-       stw r19,140(r1)
-       stw r20,144(r1)
-       stw r21,148(r1)
-       stw r22,152(r1)
-       stw r23,156(r1)
-       stfd fr16,160(r1)
-       stfd fr17,168(r1)
-       stfd fr18,176(r1)
-       stfd fr19,184(r1)
-       stfd fr20,192(r1)
-       stfd fr21,200(r1)
-       stfd fr22,208(r1)
-       stfd fr23,216(r1)
-
-       stw r1,0(r3)
-       stw r1,0(r5)
-       lwz r1,0(r4)
-
-       lwz r0,120(r1)
-       lwz pv,124(r1)
-       lwz r14,0(r1)
-       lwz r15,4(r1)
-       lwz r24,8(r1)
-       lwz r25,12(r1)
-       lwz r26,16(r1)
-       lwz r27,20(r1)
-       lwz r28,24(r1)
-       lwz r29,28(r1)
-       lwz r30,32(r1)
-       lwz r31,36(r1)
-       lfd fr14,40(r1)
-       lfd fr15,48(r1)
-       lfd fr24,56(r1)
-       lfd fr25,64(r1)
-       lfd fr26,72(r1)
-       lfd fr27,80(r1)
-       lfd fr28,88(r1)
-       lfd fr29,96(r1)
-       lfd fr30,104(r1)
-       lfd fr31,112(r1)
-
-       lwz r16,128(r1)
-       lwz r17,132(r1)
-       lwz r18,136(r1)
-       lwz r19,140(r1)
-       lwz r20,144(r1)
-       lwz r21,148(r1)
-       lwz r22,152(r1)
-       lwz r23,156(r1)
-       lfd fr16,160(r1)
-       lfd fr17,168(r1)
-       lfd fr18,176(r1)
-       lfd fr19,184(r1)
-       lfd fr20,192(r1)
-       lfd fr21,200(r1)
-       lfd fr22,208(r1)
-       lfd fr23,216(r1)
+       bcl 20,31,L00$_exceptions_handle_exception
+L00$_exceptions_handle_exception:
+       mflr r11
+       addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
+       mtlr r0
+       lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_exceptions_handle_exception$lazy_ptr:
+       .indirect_symbol _exceptions_handle_exception
+       .long dyld_stub_binding_helper
 
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_stacktrace_create_extern_stackframeinfo$stub:
+       .indirect_symbol _stacktrace_create_extern_stackframeinfo
+       mflr r0
+       bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
+L00$_stacktrace_create_extern_stackframeinfo:
+       mflr r11
+       addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
        mtlr r0
-       addi r1,r1,224
-       blr
+       lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
+       .indirect_symbol _stacktrace_create_extern_stackframeinfo
+       .long dyld_stub_binding_helper
 
 
-asm_switchstackandcall:
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_jit_asm_compile$stub:
+       .indirect_symbol _jit_asm_compile
        mflr r0
-       stwu r3,-48(r3)
-       stw r0,40(r3)
-       stw r1,44(r3)
-       stw r1,0(r5)
-       mr r1,r3
-
-       mtctr r4
-       mr r3,r6
-       bctrl
+       bcl 20,31,L00$_jit_asm_compile
+L00$_jit_asm_compile:
+       mflr r11
+       addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
+       mtlr r0
+       lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_jit_asm_compile$lazy_ptr:
+       .indirect_symbol _jit_asm_compile
+       .long dyld_stub_binding_helper
+
 
-       lwz r0,40(r1)
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_stacktrace_remove_stackframeinfo$stub:
+       .indirect_symbol _stacktrace_remove_stackframeinfo
+       mflr r0
+       bcl 20,31,L00$_stacktrace_remove_stackframeinfo
+L00$_stacktrace_remove_stackframeinfo:
+       mflr r11
+       addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
        mtlr r0
-       lwz r1,44(r1)
-       blr
+       lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_stacktrace_remove_stackframeinfo$lazy_ptr:
+       .indirect_symbol _stacktrace_remove_stackframeinfo
+       .long dyld_stub_binding_helper
 
 
-asm_getclassvalues_atomic:
-_crit_restart2:
-_crit_begin2:
-       lwz     r6,offbaseval(r3)
-       lwz     r7,offdiffval(r3)
-       lwz     r8,offbaseval(r4)
-_crit_end2:
-       stw     r6,offcast_super_baseval(r5)
-       stw     r7,offcast_super_diffval(r5)
-       stw     r8,offcast_sub_baseval(r5)
-       blr
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_exceptions_get_and_clear_exception$stub:
+       .indirect_symbol _exceptions_get_and_clear_exception
+       mflr r0
+       bcl 20,31,L00$_exceptions_get_and_clear_exception
+L00$_exceptions_get_and_clear_exception:
+       mflr r11
+       addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
+       mtlr r0
+       lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_exceptions_get_and_clear_exception$lazy_ptr:
+       .indirect_symbol _exceptions_get_and_clear_exception
+       .long dyld_stub_binding_helper
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_exceptions_asm_new_abstractmethoderror$stub:
+       .indirect_symbol _exceptions_asm_new_abstractmethoderror
+       mflr r0
+       bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
+L00$_exceptions_asm_new_abstractmethoderror:
+       mflr r11
+       addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
+       mtlr r0
+       lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
+       .indirect_symbol _exceptions_asm_new_abstractmethoderror
+       .long dyld_stub_binding_helper
+
+
+# if defined(ENABLE_REPLACEMENT)
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_replace_me$stub:
+       .indirect_symbol _replace_me
+       mflr r0
+       bcl 20,31,L00$_replace_me
+L00$_replace_me:
+       mflr r11
+       addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
+       mtlr r0
+       lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_replace_me$lazy_ptr:
+       .indirect_symbol _replace_me
+       .long dyld_stub_binding_helper
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_replace_build_execution_state$stub:
+       .indirect_symbol _replace_build_execution_state
+       mflr r0
+       bcl 20,31,L00$_replace_build_execution_state
+L00$_replace_build_execution_state:
+       mflr r11
+       addis r11,r11,ha16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)
+       mtlr r0
+       lwzu r12,lo16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_replace_build_execution_state$lazy_ptr:
+       .indirect_symbol _replace_build_execution_state
+       .long dyld_stub_binding_helper
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_replace_free_safestack$stub:
+       .indirect_symbol _replace_free_safestack
+       mflr r0
+       bcl 20,31,L00$_replace_free_safestack
+L00$_replace_free_safestack:
+       mflr r11
+       addis r11,r11,ha16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)
+       mtlr r0
+       lwzu r12,lo16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_replace_free_safestack$lazy_ptr:
+       .indirect_symbol _replace_free_safestack
+       .long dyld_stub_binding_helper
+
+# endif /* ENABLE_REPLACEMENT */
+
+#endif /* defined(__DARWIN__) */
+
 
-       .data
+/* disable exec-stacks ********************************************************/
 
-asm_criticalsections:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-       .long   _crit_begin1
-       .long   _crit_end1
-       .long   _crit_restart1
-       .long   _crit_begin2
-       .long   _crit_end2
-       .long   _crit_restart2
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
 #endif
-       .long 0
 
 
 /*
@@ -1454,4 +1099,5 @@ asm_criticalsections:
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */