* src/vm/jit/alpha/arch.h (SUPPORT_LONG_DIV_POW2)
[cacao.git] / src / vm / jit / powerpc / asmpart.S
index be9249c995e65e7cce31524b3cad22b528b96f5d..e7299572ac1a03d59c9fdad5cafc9581aae22a90 100644 (file)
@@ -29,8 +29,9 @@
             Stefan Ring
 
    Changes: Christian Thalinger
+            Edwin Steiner
 
-   $Id: asmpart.S 4539 2006-02-21 12:41:30Z twisti $
+   $Id: asmpart.S 4933 2006-05-17 12:10:25Z twisti $
 
 */
 
@@ -40,7 +41,7 @@
 #include "md-abi.h"
 #include "md-asm.h"
 
-#include "vm/jit/abi.h"
+#include "vm/jit/abi-asm.h"
 #include "vm/jit/methodheader.h"
 #include "vm/jit/powerpc/offsets.h"
 
        .align 2
 
 
-/* exported functions and variables *******************************************/
+/* export functions ***********************************************************/
 
-       .globl asm_calljavafunction
-       .type  asm_calljavafunction, @function
+       .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_calljavafunction_int
-
-       .globl asm_calljavafunction2
-       .globl asm_calljavafunction2int
-       .globl asm_calljavafunction2long
-       .globl asm_calljavafunction2float
-       .globl asm_calljavafunction2double
+       .globl asm_vm_call_method_exception_handler
 
        .globl asm_call_jit_compiler
 
 
        .globl asm_wrapper_patcher
 
+       .globl asm_replacement_out
+       .globl asm_replacement_in
+
        .globl asm_cacheflush
-       .globl asm_initialize_thread_stack
-       .globl asm_perform_threadswitch
-       .globl asm_switchstackandcall
        .globl asm_criticalsections
        .globl asm_getclassvalues_atomic
 
 
-/********************* function asm_calljavafunction ***************************
+/* asm_vm_call_method **********************************************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
 *   with up to 4 address parameters.                                           *
 *         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   L_asm_calljavafunction    /* start pc                             */
+       .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                         /* frame size                           */
        .long   0                         /* method pointer (pointer to name)     */
 
-asm_calljavafunction:
-asm_calljavafunction_int:
-L_asm_calljavafunction:               /* required for PIC code                */
+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     r0,LA_LR_OFFSET(r1)
        stwu    r1,-40*4(r1)
 
+       stw     s0,8*4(sp)                /* save used callee saved registers     */
+       stw     a0,9*4(sp)                /* save method pointer for compiler     */
+
 #if defined(__DARWIN__)
        stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
 #endif
@@ -143,219 +146,260 @@ L_asm_calljavafunction:               /* required for PIC code                */
        SAVE_TEMPORARY_REGISTERS(18)      /* the offset has to be even            */
 #endif
 
-       mr      itmp1,a0                  /* pass method pointer via tmp1         */
+       mr      itmp2,a1                  /* arg count                            */
+       mr      itmp1,a2                  /* pointer to arg block                 */
+
+       mr      t4,itmp2                  /* save argument count                  */
+       mr      t5,itmp1                  /* save argument block pointer          */
 
-       mr      a0,a1
-       mr      a1,a2
-       mr      a2,a3
-       mr      a3,a4
+       mr      s0,sp                     /* save current sp to s0                */
 
+       addi    itmp1,itmp1,-sizevmarg    /* initialize pointer (smaller code)    */
+       addi    itmp2,itmp2,1             /* initialize argument count            */
+       li      t0,0                      /* initialize integer argument counter  */
+       li      t1,0                      /* initialize float argument counter    */
+       li      t6,0                      /* initialize integer register counter  */
 #if defined(__DARWIN__)
-       lis     mptr,ha16(L_asm_call_jit_compiler)
-       addi    mptr,mptr,lo16(L_asm_call_jit_compiler)
-#else
-       lis     mptr,L_asm_call_jit_compiler@ha
-       addi    mptr,mptr,L_asm_call_jit_compiler@l
+       li      t7,0                      /* initialize stack slot counter        */
 #endif
-       stw     mptr,8*4(r1)
-       addi    mptr,r1,7*4
 
-       lwz     pv,1*4(mptr)
-       mtctr   pv
-       bctrl
+       mflr    r0                        /* save link register (PIC code)        */
+       bl      L_asm_vm_call_method_get_pc
+L_asm_vm_call_method_get_pc:
+       mflr    t3                        /* t3 contains the current pc           */
+       mtlr    r0
+
+L_register_copy:
+       addi    itmp1,itmp1,sizevmarg     /* goto next argument block             */
+       addi    itmp2,itmp2,-1            /* argument count - 1                   */
+       mr.     itmp2,itmp2
+       beq     L_register_copy_done
+
+       lwz     itmp3,offvmargtype+4(itmp1)
+       andi.   r0,itmp3,0x0002           /* is this a float/double type?         */
+       bne     L_register_handle_float
+       
+L_register_handle_int:
+       cmpwi   t6,INT_ARG_CNT            /* are we out of integer argument       */
+       beq     L_register_copy           /* registers? yes, next loop            */
+
+       andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
+       bne     L_register_handle_long
 
-1:
-       mflr    itmp1
 #if defined(__DARWIN__)
-       addi    pv,itmp1,lo16(L_asm_calljavafunction-1b)
+       addis   itmp3,t3,ha16(L_jumptable_int - L_asm_vm_call_method_get_pc)
+       la      itmp3,lo16(L_jumptable_int - L_asm_vm_call_method_get_pc)(itmp3)
 #else
-       addi    pv,itmp1,(L_asm_calljavafunction-1b)@l
+       lis     itmp3,L_jumptable_int@ha
+       addi    itmp3,itmp3,L_jumptable_int@l
 #endif
 
-L_asm_calljavafunction_return:
+       slwi    t2,t6,2                   /* multiple of 4-bytes                  */
+       add     itmp3,itmp3,t2            /* calculate address of jumptable       */
+       lwz     itmp3,0(itmp3)            /* load function address                */
+       mtctr   itmp3
+       addi    t0,t0,1                   /* integer argument counter             */
+       addi    t6,t6,1                   /* integer argument register counter    */
 #if defined(__DARWIN__)
-       lwz     itmp1,10*4(sp)            /* register r11 is callee saved         */
+       addi    t7,t7,1                   /* stack slot counter                   */
 #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)
+       bctr
 
+L_register_handle_long:
 #if defined(__DARWIN__)
-       lwz     t1,18*4(r1)
-       lwz     t2,19*4(r1)
-       lwz     t3,20*4(r1)
-       lwz     t4,21*4(r1)
-       lwz     t5,22*4(r1)
-       lwz     t6,23*4(r1)
-       lwz     t7,24*4(r1)
-
-       lfd     ft0,26*4(r1)
-       lfd     ft1,28*4(r1)
-       lfd     ft2,30*4(r1)
-       lfd     ft3,32*4(r1)
-       lfd     ft4,34*4(r1)
-       lfd     ft5,36*4(r1)
+       addis   itmp3,t3,ha16(L_jumptable_long - L_asm_vm_call_method_get_pc)
+       la      itmp3,lo16(L_jumptable_long - L_asm_vm_call_method_get_pc)(itmp3)
 #else
-       RESTORE_TEMPORARY_REGISTERS(18)   /* the offset has to be even            */
+       lis     itmp3,L_jumptable_long@ha
+       addi    itmp3,itmp3,L_jumptable_long@l
+#endif
+#if !defined(__DARWIN__)
+       addi    t6,t6,1                   /* align to even numbers                */
+       andi.   t6,t6,0xfffe
 #endif
 
-       lwz     r0,40*4+LA_LR_OFFSET(r1)
-       mtlr    r0
-       addi    r1,r1,40*4
-       blr
+       cmpwi   t6,(INT_ARG_CNT - 1)      /* are we out of integer argument       */
+       blt     L_register_handle_long_continue /* registers?                     */
 
-calljava_xhandler:
-       mr      a0,itmp1
-       bl      builtin_throw_exception
-       li      v0,0                      /* return NULL                          */
-       b       L_asm_calljavafunction_return
+       li      t6,INT_ARG_CNT            /* yes, set integer argument register   */
+       b       L_register_copy           /* count to max and next loop           */
 
+L_register_handle_long_continue:
+       slwi    t2,t6,2                   /* multiple of 4-bytes                  */
+       add     itmp3,itmp3,t2            /* calculate address of jumptable       */
+       lwz     itmp3,0(itmp3)            /* load function address                */
+       mtctr   itmp3
+       addi    t0,t0,1                   /* integer argument counter             */
+       addi    t6,t6,2                   /* integer argument register counter    */
+#if defined(__DARWIN__)
+       addi    t7,t7,2                   /* stack slot counter                   */
+#endif
+       bctr
 
+L_register_handle_float:
+       cmpwi   t1,FLT_ARG_CNT            /* are we out of float argument         */
+       beq     L_register_copy           /* registers? yes, next loop            */
 
+       andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
+       bne     L_register_handle_double
 
-       .align 2
+#if defined(__DARWIN__)
+       addis   itmp3,t3,ha16(L_jumptable_float - L_asm_vm_call_method_get_pc)
+       la      itmp3,lo16(L_jumptable_float - L_asm_vm_call_method_get_pc)(itmp3)
+#else
+       lis     itmp3,L_jumptable_float@ha
+       addi    itmp3,itmp3,L_jumptable_float@l
+#endif
 
-       .long   0                         /* catch type all                       */
-       .long   calljava_xhandler2        /* handler pc                           */
-       .long   calljava_xhandler2        /* end pc                               */
-       .long   L_asm_calljavafunction2   /* 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                         /* IsSync                               */
-       .long   0                         /* frame size                           */
-       .long   0                         /* method pointer (pointer to name)     */
+       slwi    t2,t1,2                   /* multiple of 4-bytes                  */
+       add     itmp3,itmp3,t2            /* calculate address of jumptable       */
+       lwz     itmp3,0(itmp3)            /* load function address                */
+       mtctr   itmp3
+       addi    t1,t1,1                   /* float argument counter               */
+#if defined(__DARWIN__)
+       addi    t7,t7,1                   /* stack slot counter                   */
+       addi    t6,t6,1                   /* skip 1 integer argument register     */
+#endif
+       bctr
 
-asm_calljavafunction2:
-asm_calljavafunction2int:
-asm_calljavafunction2long:
-asm_calljavafunction2float:
-asm_calljavafunction2double:
-L_asm_calljavafunction2:              /* required for PIC code                */
-       mflr    r0
-       stw     r0,LA_LR_OFFSET(r1)
-       stwu    r1,-40*4(r1)
+L_register_handle_double:
+#if defined(__DARWIN__)
+       addis   itmp3,t3,ha16(L_jumptable_double - L_asm_vm_call_method_get_pc)
+       la      itmp3,lo16(L_jumptable_double - L_asm_vm_call_method_get_pc)(itmp3)
+#else
+       lis     itmp3,L_jumptable_double@ha
+       addi    itmp3,itmp3,L_jumptable_double@l
+#endif
 
+       slwi    t2,t1,2                   /* multiple of 4-bytes                  */
+       add     itmp3,itmp3,t2            /* calculate address of jumptable       */
+       lwz     itmp3,0(itmp3)            /* load function address                */
+       mtctr   itmp3
+       addi    t1,t1,1                   /* float argument counter               */
 #if defined(__DARWIN__)
-       stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
+       addi    t7,t7,2                   /* stack slot counter                   */
+       addi    t6,t6,2                   /* skip 2 integer argument registers    */
 #endif
-       stw     pv,11*4(sp)               /* save PV register                     */
+       bctr
 
-       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)
+L_register_copy_done:
+                                         /* calculate remaining arguments        */
+       sub     itmp3,t4,t0               /* - integer arguments in registers     */
+       sub     itmp3,itmp3,t1            /* - float arguments in registers       */
+       mr.     itmp3,itmp3
+       beq     L_stack_copy_done
 
-#if defined(__DARWIN__)
-       stw     t1,18*4(r1)
-       stw     t2,19*4(r1)
-       stw     t3,20*4(r1)
-       stw     t4,21*4(r1)
-       stw     t5,22*4(r1)
-       stw     t6,23*4(r1)
-       stw     t7,24*4(r1)
+       mr      itmp2,t4                  /* restore argument count               */
+       mr      itmp1,t5                  /* restore argument block pointer       */
 
-       stfd    ft0,26*4(r1)
-       stfd    ft1,28*4(r1)
-       stfd    ft2,30*4(r1)
-       stfd    ft3,32*4(r1)
-       stfd    ft4,34*4(r1)
-       stfd    ft5,36*4(r1)
-#else
-       SAVE_TEMPORARY_REGISTERS(18)      /* the offset has to be even            */
+       slwi    t4,itmp3,3                /* XXX use 8-bytes slots for now        */
+       addi    t4,t4,LA_SIZE             /* add size of linkage area             */
+
+#if defined(__DARWIN__)
+       slwi    t5,t7,2                   /* add stack space for arguments        */
+       add     t4,t4,t5
 #endif
 
-       stw     a0,9*4(r1)                /* save method pointer for compiler     */
+       sub     sp,sp,t4
 
-       mr      itmp1,r6                  /* pointer to arg block                 */
-       mr      itmp2,r4                  /* arg count                            */
+       mr      t6,sp                     /* use t6 as temporary sp               */
+       addi    t6,t6,LA_SIZE             /* skip linkage area                    */
+#if defined(__DARWIN__)
+       add     t6,t6,t5                  /* skip stack space for arguments       */
+#endif
 
-       addi    itmp1,itmp1,-sizejniblock /* initialize pointer (smaller code)    */
+       addi    itmp1,itmp1,-sizevmarg    /* initialize pointer (smaller code)    */
        addi    itmp2,itmp2,1             /* initialize argument count            */
-       li      r17,0                     /* initialize integer argument counter  */
-       li      r18,0                     /* initialize float argument counter    */
-
-L_register_copy:
-       addi    itmp1,itmp1,sizejniblock  /* goto next argument block             */
+       
+L_stack_copy_loop:
+       addi    itmp1,itmp1,sizevmarg     /* goto next argument block             */
        addi    itmp2,itmp2,-1            /* argument count - 1                   */
        mr.     itmp2,itmp2
-       beq     L_register_copy_done
-
-       lwz     itmp3,offjniitemtype+4(itmp1)
+       beq     L_stack_copy_done
+       
+       lwz     itmp3,offvmargtype+4(itmp1)
        andi.   r0,itmp3,0x0002           /* is this a float/double type?         */
-       bne     L_register_handle_float
+       bne     L_stack_handle_float
 
-       cmpwi   r17,INT_ARG_CNT           /* are we out of integer argument       */
-       beq     L_register_copy           /* registers? yes, next loop            */
+L_stack_handle_int:
+       addi    t0,t0,-1                  /* arguments assigned to registers      */
+       mr.     t0,t0
+       bge     L_stack_copy_loop
 
-       andi.   r0,itmp3,0x0001           /* is this a long type?                 */
-       bne     L_register_handle_long
+       andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
+       bne     L_stack_handle_long
 
-L_register_handle_int:
-#if defined(__DARWIN__)
-       lis     itmp3,ha16(jumptable_int)
-       addi    itmp3,itmp3,lo16(jumptable_int)
-#else
-       lis     itmp3,jumptable_int@ha
-       addi    itmp3,itmp3,jumptable_int@l
+       lwz     itmp3,offvmargdata+4(itmp1) /* get integer argument               */
+       stw     itmp3,0(t6)               /* and store it on the stack            */
+       addi    t6,t6,4                   /* increase temporary sp by 1 slot      */
+       b       L_stack_copy_loop
+
+L_stack_handle_long:
+#if !defined(__DARWIN__)
+       addi    t6,t6,4                   /* align stack to 8-bytes               */
+       rlwinm  t6,t6,0,30,28             /* clear lower 4-bits                   */
 #endif
-       slwi    r19,r17,2                 /* multiple of 4-bytes                  */
-       add     itmp3,itmp3,r19           /* calculate address of jumptable       */
-       lwz     itmp3,0(itmp3)            /* load function address                */
-       addi    r17,r17,1                 /* integer argument counter + 1         */
-       mtctr   itmp3
-       bctr
 
-L_register_handle_long:
-#if defined(__DARWIN__)
-       lis     itmp3,ha16(jumptable_long)
-       addi    itmp3,itmp3,lo16(jumptable_long)
-#else
-       lis     itmp3,jumptable_long@ha
-       addi    itmp3,itmp3,jumptable_long@l
+       lwz     itmp3,offvmargdata+0(itmp1) /* get long argument                  */
+       stw     itmp3,0(t6)               /* and store it on the stack            */
+       lwz     itmp3,offvmargdata+4(itmp1)
+       stw     itmp3,4(t6)
+       addi    t6,t6,8                   /* increase temporary sp by 2 slots     */
+       b       L_stack_copy_loop
+               
+L_stack_handle_float:
+       addi    t1,t1,-1                  /* arguments assigned to registers      */
+       mr.     t1,t1
+       bge     L_stack_copy_loop
+
+       andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
+       bne     L_stack_handle_double
+
+       lfs     ftmp3,offvmargdata(itmp1) /* get float argument                   */
+       stfs    ftmp3,0(t6)               /* and store it on the stack            */
+       addi    t6,t6,4                   /* increase temporary sp by 1 slot      */
+       b       L_stack_copy_loop
+
+L_stack_handle_double:
+#if !defined(__DARWIN__)
+       addi    t6,t6,4                   /* align stack to 8-bytes               */
+       rlwinm  t6,t6,0,30,28             /* clear lower 4-bits                   */
 #endif
-       addi    r19,r17,1                 /* align to even numbers                */
-       srwi    r19,r19,1
-       slwi    r19,r19,1
-       slwi    r19,r19,2                 /* multiple of 4-bytes                  */
-       add     itmp3,itmp3,r19           /* calculate address of jumptable       */
-       lwz     itmp3,0(itmp3)            /* load function address                */
-       addi    r17,r17,1                 /* integer argument counter + 1         */
-       mtctr   itmp3
-       bctr
 
-L_register_handle_float:
-L_register_copy_done:
+       lfd     ftmp3,offvmargdata(itmp1) /* get double argument                  */
+       stfd    ftmp3,0(t6)               /* and store it on the stack            */
+       addi    t6,t6,8                   /* increase temporary sp by 2 slots     */
+       b       L_stack_copy_loop
 
 L_stack_copy_done:
-       lwz     itmp1,9*4(sp)             /* pass method pointer via tmp1         */
+       lwz     itmp1,9*4(s0)             /* pass method pointer via tmp1         */
 
 #if defined(__DARWIN__)
-       lis     mptr,ha16(L_asm_call_jit_compiler)
-       addi    mptr,mptr,lo16(L_asm_call_jit_compiler)
+       addis   mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
+       la      mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
 #else
        lis     mptr,L_asm_call_jit_compiler@ha
        addi    mptr,mptr,L_asm_call_jit_compiler@l
 #endif
-       stw     mptr,8*4(r1)
-       addi    mptr,r1,7*4
+       stw     mptr,7*4(s0)
+       addi    mptr,s0,7*4
 
-       lwz     pv,1*4(mptr)
+       lwz     pv,0*4(mptr)
        mtctr   pv
        bctrl
 1:
        mflr    itmp1
 #if defined(__DARWIN__)
-       addi    pv,itmp1,lo16(L_asm_calljavafunction2-1b)
+       addi    pv,itmp1,lo16(asm_vm_call_method - 1b)
 #else
-       addi    pv,itmp1,(L_asm_calljavafunction2-1b)@l
+       addi    pv,itmp1,(asm_vm_call_method - 1b)@l
 #endif
 
-L_asm_calljavafunction2_return:
+L_asm_vm_call_method_return:
+       mr      sp,s0                     /* restore the function's 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
@@ -389,14 +433,16 @@ L_asm_calljavafunction2_return:
        addi    r1,r1,40*4
        blr
 
-calljava_xhandler2:
+asm_vm_call_method_exception_handler:
        mr      r3,itmp1
        bl      builtin_throw_exception
-       li      v0,0                      /* return NULL                          */
-       b       L_asm_calljavafunction2_return
+       b       L_asm_vm_call_method_return
 
 
-jumptable_int:
+       .data
+       .align  2
+
+L_jumptable_int:
        .long   L_handle_a0
        .long   L_handle_a1
        .long   L_handle_a2
@@ -406,34 +452,47 @@ jumptable_int:
        .long   L_handle_a6
        .long   L_handle_a7
 
+       .text
+       .align  2
+
 L_handle_a0:
-       lwz     a0,offjniitem+4(itmp1)
+       lwz     a0,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a1:
-       lwz     a1,offjniitem+4(itmp1)
+       lwz     a1,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a2:
-       lwz     a2,offjniitem+4(itmp1)
+       lwz     a2,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a3:
-       lwz     a3,offjniitem+4(itmp1)
+       lwz     a3,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a4:
-       lwz     a4,offjniitem+4(itmp1)
+       lwz     a4,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a5:
-       lwz     a5,offjniitem+4(itmp1)
+       lwz     a5,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a6:
-       lwz     a6,offjniitem+4(itmp1)
+       lwz     a6,offvmargdata+4(itmp1)
        b       L_register_copy
 L_handle_a7:
-       lwz     a7,offjniitem+4(itmp1)
+       lwz     a7,offvmargdata+4(itmp1)
        b       L_register_copy
 
 
-jumptable_long:
+       .data
+       .align  2
+
+L_jumptable_long:
 #if defined(__DARWIN__)
+       .long   L_handle_a0_a1
+       .long   L_handle_a1_a2
+       .long   L_handle_a2_a3
+       .long   L_handle_a3_a4
+       .long   L_handle_a4_a5
+       .long   L_handle_a5_a6
+       .long   L_handle_a6_a7
 #else
        /* we have two entries here, so we get the even argument register
        alignment for linux */
@@ -445,25 +504,181 @@ jumptable_long:
        .long   L_handle_a4_a5
        .long   0
        .long   L_handle_a6_a7
-       .long   0
 #endif
 
+       .text
+       .align  2
+
 L_handle_a0_a1:
-       lwz     a0,offjniitem+0(itmp1)
-       lwz     a1,offjniitem+4(itmp1)
+       lwz     a0,offvmargdata+0(itmp1)
+       lwz     a1,offvmargdata+4(itmp1)
+       b       L_register_copy
+#if defined(__DARWIN__)
+L_handle_a1_a2:
+       lwz     a1,offvmargdata+0(itmp1)
+       lwz     a2,offvmargdata+4(itmp1)
        b       L_register_copy
+#endif
 L_handle_a2_a3:
-       lwz     a2,offjniitem+0(itmp1)
-       lwz     a3,offjniitem+4(itmp1)
+       lwz     a2,offvmargdata+0(itmp1)
+       lwz     a3,offvmargdata+4(itmp1)
+       b       L_register_copy
+#if defined(__DARWIN__)
+L_handle_a3_a4:
+       lwz     a3,offvmargdata+0(itmp1)
+       lwz     a4,offvmargdata+4(itmp1)
        b       L_register_copy
+#endif
 L_handle_a4_a5:
-       lwz     a4,offjniitem+0(itmp1)
-       lwz     a5,offjniitem+4(itmp1)
+       lwz     a4,offvmargdata+0(itmp1)
+       lwz     a5,offvmargdata+4(itmp1)
        b       L_register_copy
+#if defined(__DARWIN__)
+L_handle_a5_a6:
+       lwz     a5,offvmargdata+0(itmp1)
+       lwz     a6,offvmargdata+4(itmp1)
+       b       L_register_copy
+#endif
 L_handle_a6_a7:
-       lwz     a6,offjniitem+0(itmp1)
-       lwz     a7,offjniitem+4(itmp1)
+       lwz     a6,offvmargdata+0(itmp1)
+       lwz     a7,offvmargdata+4(itmp1)
+       b       L_register_copy
+
+
+       .data
+       .align  2
+
+L_jumptable_float:
+       .long   L_handle_fa0
+       .long   L_handle_fa1
+       .long   L_handle_fa2
+       .long   L_handle_fa3
+       .long   L_handle_fa4
+       .long   L_handle_fa5
+       .long   L_handle_fa6
+       .long   L_handle_fa7
+
+#if defined(__DARWIN__)
+       .long   L_handle_fa8
+       .long   L_handle_fa9
+       .long   L_handle_fa10
+       .long   L_handle_fa11
+       .long   L_handle_fa12
+#endif
+
+       .text
+       .align  2
+
+L_handle_fa0:
+       lfs     fa0,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa1:
+       lfs     fa1,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa2:
+       lfs     fa2,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa3:
+       lfs     fa3,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa4:
+       lfs     fa4,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa5:
+       lfs     fa5,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa6:
+       lfs     fa6,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa7:
+       lfs     fa7,offvmargdata(itmp1)
+       b       L_register_copy
+
+#if defined(__DARWIN__)
+L_handle_fa8:
+       lfs     fa8,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa9:
+       lfs     fa9,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa10:
+       lfs     fa10,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa11:
+       lfs     fa11,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fa12:
+       lfs     fa12,offvmargdata(itmp1)
+       b       L_register_copy
+#endif
+
+
+       .data
+       .align  2
+
+L_jumptable_double:
+       .long   L_handle_fda0
+       .long   L_handle_fda1
+       .long   L_handle_fda2
+       .long   L_handle_fda3
+       .long   L_handle_fda4
+       .long   L_handle_fda5
+       .long   L_handle_fda6
+       .long   L_handle_fda7
+
+#if defined(__DARWIN__)
+       .long   L_handle_fda8
+       .long   L_handle_fda9
+       .long   L_handle_fda10
+       .long   L_handle_fda11
+       .long   L_handle_fda12
+#endif
+
+       .text
+       .align  2
+
+L_handle_fda0:
+       lfd     fa0,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda1:
+       lfd     fa1,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda2:
+       lfd     fa2,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda3:
+       lfd     fa3,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda4:
+       lfd     fa4,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda5:
+       lfd     fa5,offvmargdata(itmp1)
        b       L_register_copy
+L_handle_fda6:
+       lfd     fa6,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda7:
+       lfd     fa7,offvmargdata(itmp1)
+       b       L_register_copy
+
+#if defined(__DARWIN__)
+L_handle_fda8:
+       lfd     fa8,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda9:
+       lfd     fa9,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda10:
+       lfd     fa10,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda11:
+       lfd     fa11,offvmargdata(itmp1)
+       b       L_register_copy
+L_handle_fda12:
+       lfd     fa12,offvmargdata(itmp1)
+       b       L_register_copy
+#endif
 
 
 /* asm_call_jit_compiler *******************************************************
@@ -476,28 +691,7 @@ asm_call_jit_compiler:
 L_asm_call_jit_compiler:                /* required for PIC code              */
        mflr    r0
        stw     r0,LA_LR_OFFSET(r1)         /* save return address                */
-       stwu    r1,-((LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo)(r1)
-       stw     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
-
-       mr      itmp1,r0                    /* save return address to other reg.  */
-       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:
-       stw     mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
+       stwu    r1,-(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(r1)
 
 #if defined(__DARWIN__)
        stw     a0,(LA_WORD_SIZE+5+0)*4(r1)
@@ -526,19 +720,12 @@ noregchange:
        SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
 #endif
 
-       addi    a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
-       li      a1,0                        /* we don't have pv handy             */
-       addi    a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
-       lwz     a3,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(sp)
-       mr      a4,a3                       /* xpc is equal to ra                 */
-       bl      stacktrace_create_extern_stackframeinfo
-
-       lwz     a0,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
-       bl      jit_compile                 /* compile the Java method            */
-       mr      pv,r3                       /* move address to pv register        */
-
-       addi    a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
-       bl      stacktrace_remove_stackframeinfo
+       mr      a0,itmp1
+       mr      a1,mptr
+       addi    a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
+       lwz     a3,(LA_SIZE + 5*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__)
        lwz     a0,(LA_WORD_SIZE+5+0)*4(r1)
@@ -567,25 +754,19 @@ noregchange:
        RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
 #endif
 
-       lwz     mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
-
-       lwz     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(r1)
+       lwz     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(r1)
        mtlr    itmp1
-       addi    r1,r1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
+
+       addi    sp,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
 
        mr.     pv,pv                       /* test for exception                 */
        beq     L_asm_call_jit_compiler_exception
 
-       lwz     itmp3,-12(itmp1)
-       extsh   itmp3,itmp3
-       add     mptr,mptr,itmp3
-       stw     pv,0(mptr)                  /* store method address               */
-
        mtctr   pv                          /* move method address to control reg */
        bctr                                /* and call the Java method           */
 
 L_asm_call_jit_compiler_exception:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#if defined(ENABLE_THREADS)
        mflr    r0
        stw     r0,LA_LR_OFFSET(sp)
        stwu    sp,-LA_SIZE_ALIGNED(sp)     /* preserve linkage area              */
@@ -595,7 +776,8 @@ L_asm_call_jit_compiler_exception:
        addi    sp,sp,LA_SIZE_ALIGNED
 #else
 # if defined(__DARWIN__)
-       lwz     v0,lo16(_no_threads_exceptionptr-0b)(pv)
+       lis     v0,ha16(_no_threads_exceptionptr)
+       addi    v0,v0,lo16(_no_threads_exceptionptr)
 # else
        lis     v0,_no_threads_exceptionptr@ha
        addi    v0,v0,_no_threads_exceptionptr@l
@@ -946,7 +1128,7 @@ L_asm_wrapper_patcher_exception:
        lwz     xpc,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
        addi    sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
 
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#if defined(ENABLE_THREADS)
        mflr    r0
        stw     r0,LA_LR_OFFSET(sp)
        stwu    sp,-(LA_SIZE+1*4)(sp) /* preserve linkage area                    */
@@ -958,7 +1140,8 @@ L_asm_wrapper_patcher_exception:
        addi    sp,sp,LA_SIZE+1*4
 #else
 # if defined(__DARWIN__)
-       lwz     v0,lo16(_no_threads_exceptionptr-0b)(pv)
+       lis     v0,ha16(_no_threads_exceptionptr)
+       addi    v0,v0,lo16(_no_threads_exceptionptr)
 # else
        lis     v0,_no_threads_exceptionptr@ha
        addi    v0,v0,_no_threads_exceptionptr@l
@@ -971,6 +1154,221 @@ L_asm_wrapper_patcher_exception:
        b       L_asm_handle_exception
 
 
+/* 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
+
+asm_replacement_out:
+    /* create stack frame */
+       addi    sp,sp,-(sizeexecutionstate + REPLACEMENT_ROOM) /* XXX align */
+
+       /* save link register */
+       mflr    r16
+
+       /* save registers in execution state */
+       stw     r0 ,( 0*8+offes_intregs)(sp)
+       stw     r1 ,( 1*8+offes_intregs)(sp)
+       stw     r2 ,( 2*8+offes_intregs)(sp)
+       stw     r3 ,( 3*8+offes_intregs)(sp)
+       stw     r4 ,( 4*8+offes_intregs)(sp)
+       stw     r5 ,( 5*8+offes_intregs)(sp)
+       stw     r6 ,( 6*8+offes_intregs)(sp)
+       stw     r7 ,( 7*8+offes_intregs)(sp)
+       stw     r8 ,( 8*8+offes_intregs)(sp)
+       stw     r9 ,( 9*8+offes_intregs)(sp)
+       stw     r10,(10*8+offes_intregs)(sp)
+       stw     r11,(11*8+offes_intregs)(sp)
+       stw     r12,(12*8+offes_intregs)(sp)
+       stw     r13,(13*8+offes_intregs)(sp)
+       stw     r14,(14*8+offes_intregs)(sp)
+       stw     r15,(15*8+offes_intregs)(sp)
+       stw     r16,(16*8+offes_intregs)(sp) /* link register */
+       stw     r17,(17*8+offes_intregs)(sp)
+       stw     r18,(18*8+offes_intregs)(sp)
+       stw     r19,(19*8+offes_intregs)(sp)
+       stw     r20,(20*8+offes_intregs)(sp)
+       stw     r21,(21*8+offes_intregs)(sp)
+       stw     r22,(22*8+offes_intregs)(sp)
+       stw     r23,(23*8+offes_intregs)(sp)
+       stw     r24,(24*8+offes_intregs)(sp)
+       stw     r25,(25*8+offes_intregs)(sp)
+       stw     r26,(26*8+offes_intregs)(sp)
+       stw     r27,(27*8+offes_intregs)(sp)
+       stw     r28,(28*8+offes_intregs)(sp)
+       stw     r29,(29*8+offes_intregs)(sp)
+       stw     r30,(30*8+offes_intregs)(sp)
+       stw     r31,(31*8+offes_intregs)(sp)
+       
+       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 + REPLACEMENT_ROOM + 4*4)
+       stw     itmp1,(offes_sp)(sp)
+
+       /* store pv */
+       stw     pv,(offes_pv)(sp)
+
+       /* 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         */
+
+/* asm_replacement_in **********************************************************
+
+   This code writes the given execution state and jumps to the replacement
+   code.
+
+   This function never returns!
+
+   NOTE: itmp3 is not restored!
+
+   C prototype:
+      void asm_replacement_in(executionstate *es);
+
+*******************************************************************************/
+
+asm_replacement_in:
+       /* a0 == executionstate *es */
+
+       /* set new sp and pv */
+       lwz     sp,(offes_sp)(a0)
+       lwz     pv,(offes_pv)(a0)
+       
+       /* copy registers from execution state */
+       lwz     r0 ,( 0*8+offes_intregs)(a0)
+       /* r1 is sp                       */
+       /* r2 is reserved                 */
+       /* a0 is loaded below             */
+       lwz     r4 ,( 4*8+offes_intregs)(a0)
+       lwz     r5 ,( 5*8+offes_intregs)(a0)
+       lwz     r6 ,( 6*8+offes_intregs)(a0)
+       lwz     r7 ,( 7*8+offes_intregs)(a0)
+       lwz     r8 ,( 8*8+offes_intregs)(a0)
+       lwz     r9 ,( 9*8+offes_intregs)(a0)
+       lwz     r10,(10*8+offes_intregs)(a0)
+       lwz     r11,(11*8+offes_intregs)(a0)
+       lwz     r12,(12*8+offes_intregs)(a0)
+       /* r13 is pv                      */
+       lwz     r14,(14*8+offes_intregs)(a0)
+       lwz     r15,(15*8+offes_intregs)(a0)
+       lwz     r16,(16*8+offes_intregs)(a0) /* link register */
+       lwz     r17,(17*8+offes_intregs)(a0)
+       lwz     r18,(18*8+offes_intregs)(a0)
+       lwz     r19,(19*8+offes_intregs)(a0)
+       lwz     r20,(20*8+offes_intregs)(a0)
+       lwz     r21,(21*8+offes_intregs)(a0)
+       lwz     r22,(22*8+offes_intregs)(a0)
+       lwz     r23,(23*8+offes_intregs)(a0)
+       lwz     r24,(24*8+offes_intregs)(a0)
+       lwz     r25,(25*8+offes_intregs)(a0)
+       lwz     r26,(26*8+offes_intregs)(a0)
+       lwz     r27,(27*8+offes_intregs)(a0)
+       lwz     r28,(28*8+offes_intregs)(a0)
+       lwz     r29,(29*8+offes_intregs)(a0)
+       lwz     r30,(30*8+offes_intregs)(a0)
+       lwz     r31,(31*8+offes_intregs)(a0)
+       
+       lfd     fr0 ,( 0*8+offes_fltregs)(a0)
+       lfd     fr1 ,( 1*8+offes_fltregs)(a0)
+       lfd     fr2 ,( 2*8+offes_fltregs)(a0)
+       lfd     fr3 ,( 3*8+offes_fltregs)(a0)
+       lfd     fr4 ,( 4*8+offes_fltregs)(a0)
+       lfd     fr5 ,( 5*8+offes_fltregs)(a0)
+       lfd     fr6 ,( 6*8+offes_fltregs)(a0)
+       lfd     fr7 ,( 7*8+offes_fltregs)(a0)
+       lfd     fr8 ,( 8*8+offes_fltregs)(a0)
+       lfd     fr9 ,( 9*8+offes_fltregs)(a0)
+       lfd     fr10,(10*8+offes_fltregs)(a0)
+       lfd     fr11,(11*8+offes_fltregs)(a0)
+       lfd     fr12,(12*8+offes_fltregs)(a0)
+       lfd     fr13,(13*8+offes_fltregs)(a0)
+       lfd     fr14,(14*8+offes_fltregs)(a0)
+       lfd     fr15,(15*8+offes_fltregs)(a0)
+       lfd     fr16,(16*8+offes_fltregs)(a0)
+       lfd     fr17,(17*8+offes_fltregs)(a0)
+       lfd     fr18,(18*8+offes_fltregs)(a0)
+       lfd     fr19,(19*8+offes_fltregs)(a0)
+       lfd     fr20,(20*8+offes_fltregs)(a0)
+       lfd     fr21,(21*8+offes_fltregs)(a0)
+       lfd     fr22,(22*8+offes_fltregs)(a0)
+       lfd     fr23,(23*8+offes_fltregs)(a0)
+       lfd     fr24,(24*8+offes_fltregs)(a0)
+       lfd     fr25,(25*8+offes_fltregs)(a0)
+       lfd     fr26,(26*8+offes_fltregs)(a0)
+       lfd     fr27,(27*8+offes_fltregs)(a0)
+       lfd     fr28,(28*8+offes_fltregs)(a0)
+       lfd     fr29,(29*8+offes_fltregs)(a0)
+       lfd     fr30,(30*8+offes_fltregs)(a0)
+       lfd     fr31,(31*8+offes_fltregs)(a0)
+
+       /* restore link register */
+
+       mtlr    r16
+       
+       /* load new pc */
+
+       lwz     itmp3,offes_pc(a0)
+
+       /* load a0 */
+       
+       lwz     a0,(3*8+offes_intregs)(a0)
+
+       /* jump to new code */
+
+       mtctr   itmp3
+       bctr
+
+/*********************************************************************/
+
 asm_cacheflush:
        add     r4,r3,r4
        rlwinm  r3,r3,0,0,26
@@ -997,180 +1395,6 @@ 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)
-
-       mflr r0
-       bl 0f
-0:
-       mflr r3
-       mtlr r0
-#if defined(__DARWIN__)
-       lfd fr0,lo16(doublezero-0b)(r3)
-#else
-       lfd fr0,(doublezero-0b)@l(r3)
-#endif
-
-       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
-
-
-asm_perform_threadswitch:
-       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)
-
-       mtlr r0
-       addi r1,r1,224
-       blr
-
-
-asm_switchstackandcall:
-       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
-
-       lwz r0,40(r1)
-       mtlr r0
-       lwz r1,44(r1)
-       blr
-
-
 asm_getclassvalues_atomic:
 _crit_restart:
 _crit_begin:
@@ -1186,7 +1410,7 @@ _crit_end:
        .data
 
 asm_criticalsections:
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#if defined(ENABLE_THREADS)
        .long   _crit_begin
        .long   _crit_end
        .long   _crit_restart
@@ -1194,6 +1418,150 @@ asm_criticalsections:
        .long 0
 
 
+#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
+       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
+       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
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_exceptions_handle_exception$stub:
+       .indirect_symbol _exceptions_handle_exception
+       mflr r0
+       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
+       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
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_jit_asm_compile$stub:
+       .indirect_symbol _jit_asm_compile
+       mflr r0
+       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
+
+
+.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
+       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
+
+
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
+L_builtin_asm_get_exceptionptrptr$stub:
+       .indirect_symbol _builtin_asm_get_exceptionptrptr
+       mflr r0
+       bcl 20,31,L00$_builtin_asm_get_exceptionptrptr
+L00$_builtin_asm_get_exceptionptrptr:
+       mflr r11
+       addis r11,r11,ha16(L_builtin_asm_get_exceptionptrptr$lazy_ptr - L00$_builtin_asm_get_exceptionptrptr)
+       mtlr r0
+       lwzu r12,lo16(L_builtin_asm_get_exceptionptrptr$lazy_ptr - L00$_builtin_asm_get_exceptionptrptr)(r11)
+       mtctr r12
+       bctr
+.data
+.lazy_symbol_pointer
+L_builtin_asm_get_exceptionptrptr$lazy_ptr:
+       .indirect_symbol _builtin_asm_get_exceptionptrptr
+       .long dyld_stub_binding_helper
+
+
+.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
+
+#endif /* defined(__DARWIN__) */
+
+
 /* Disable exec-stacks, required for Gentoo ***********************************/
 
 #if defined(__GCC__) && defined(__ELF__)
@@ -1212,4 +1580,5 @@ asm_criticalsections:
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */