1 /* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software.text; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY ; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: asmpart.S 7989 2007-05-30 21:04:42Z twisti $
35 #include "vm/jit/abi-asm.h"
36 #include "vm/jit/methodheader.h"
37 #include "vm/jit/powerpc/offsets.h"
45 /* export functions ***********************************************************/
47 .globl asm_vm_call_method
48 .globl asm_vm_call_method_int
49 .globl asm_vm_call_method_long
50 .globl asm_vm_call_method_float
51 .globl asm_vm_call_method_double
53 .globl asm_vm_call_method_exception_handler
54 .globl asm_vm_call_method_end
56 .globl asm_call_jit_compiler
58 .globl asm_handle_nat_exception
59 .globl asm_handle_exception
61 .globl asm_abstractmethoderror
63 .globl asm_patcher_wrapper
65 #if defined(ENABLE_REPLACEMENT)
66 .globl asm_replacement_out
67 .globl asm_replacement_in
72 .globl asm_compare_and_swap
73 .globl asm_memory_barrier
75 .globl asm_criticalsections
76 .globl asm_getclassvalues_atomic
79 /* asm_vm_call_method **********************************************************
81 * This function calls a Java-method (which possibly needs compilation) *
82 * with up to 4 address parameters. *
84 * This functions calls the JIT-compiler which eventually translates the *
85 * method into machine code. *
88 * javaobject_header *asm_calljavamethod (methodinfo *m, *
89 * void *arg1, void *arg2, void *arg3, void *arg4); *
91 *******************************************************************************/
95 .long 0 /* catch type all */
96 .long 0 /* exception handler pc */
98 .long 0 /* start pc */
99 .long 1 /* extable size */
100 .long 0 /* line number table start */
101 .long 0 /* line number table size */
102 .long 0 /* fltsave */
103 .long 0 /* intsave */
106 .long 0 /* frame size */
107 .long 0 /* codeinfo pointer */
110 asm_vm_call_method_int:
111 asm_vm_call_method_long:
112 asm_vm_call_method_float:
113 asm_vm_call_method_double:
115 stw r0,LA_LR_OFFSET(sp)
116 stwu sp,-40*4(sp) /* keep stack 16-byte aligned */
118 stw s0,8*4(sp) /* save used callee saved registers */
119 stw a0,9*4(sp) /* save method pointer for compiler */
121 #if defined(__DARWIN__)
122 stw itmp1,10*4(sp) /* register r11 is callee saved */
124 stw pv,11*4(sp) /* save PV register */
126 stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
127 stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
130 #if defined(__DARWIN__)
146 SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
149 mr itmp2,a1 /* arg count */
150 mr itmp1,a2 /* pointer to arg block */
152 mr t4,itmp2 /* save argument count */
153 mr t5,itmp1 /* save argument block pointer */
155 mr s0,sp /* save current sp to s0 */
157 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
158 addi itmp2,itmp2,1 /* initialize argument count */
159 li t0,0 /* initialize integer argument counter */
160 li t1,0 /* initialize float argument counter */
161 li t6,0 /* initialize integer register counter */
162 #if defined(__DARWIN__)
163 li t7,0 /* initialize stack slot counter */
166 mflr r0 /* save link register (PIC code) */
167 bl L_asm_vm_call_method_get_pc
168 L_asm_vm_call_method_get_pc:
169 mflr t3 /* t3 contains the current pc */
173 addi itmp1,itmp1,sizevmarg /* goto next argument block */
174 addi itmp2,itmp2,-1 /* argument count - 1 */
176 beq L_register_copy_done
178 lwz itmp3,offvmargtype+4(itmp1)
179 andi. r0,itmp3,0x0002 /* is this a float/double type? */
180 bne L_register_handle_float
182 L_register_handle_int:
183 cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
184 beq L_register_copy /* registers? yes, next loop */
186 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
187 bne L_register_handle_long
189 #if defined(__DARWIN__)
190 addis itmp3,t3,ha16(L_jumptable_int - L_asm_vm_call_method_get_pc)
191 la itmp3,lo16(L_jumptable_int - L_asm_vm_call_method_get_pc)(itmp3)
193 lis itmp3,L_jumptable_int@ha
194 addi itmp3,itmp3,L_jumptable_int@l
197 slwi t2,t6,2 /* multiple of 4-bytes */
198 add itmp3,itmp3,t2 /* calculate address of jumptable */
199 lwz itmp3,0(itmp3) /* load function address */
201 addi t0,t0,1 /* integer argument counter */
202 addi t6,t6,1 /* integer argument register counter */
203 #if defined(__DARWIN__)
204 addi t7,t7,1 /* stack slot counter */
208 L_register_handle_long:
209 #if defined(__DARWIN__)
210 addis itmp3,t3,ha16(L_jumptable_long - L_asm_vm_call_method_get_pc)
211 la itmp3,lo16(L_jumptable_long - L_asm_vm_call_method_get_pc)(itmp3)
213 lis itmp3,L_jumptable_long@ha
214 addi itmp3,itmp3,L_jumptable_long@l
216 #if !defined(__DARWIN__)
217 addi t6,t6,1 /* align to even numbers */
221 cmpwi t6,(INT_ARG_CNT - 1) /* are we out of integer argument */
222 blt L_register_handle_long_continue /* registers? */
224 li t6,INT_ARG_CNT /* yes, set integer argument register */
225 b L_register_copy /* count to max and next loop */
227 L_register_handle_long_continue:
228 slwi t2,t6,2 /* multiple of 4-bytes */
229 add itmp3,itmp3,t2 /* calculate address of jumptable */
230 lwz itmp3,0(itmp3) /* load function address */
232 addi t0,t0,1 /* integer argument counter */
233 addi t6,t6,2 /* integer argument register counter */
234 #if defined(__DARWIN__)
235 addi t7,t7,2 /* stack slot counter */
239 L_register_handle_float:
240 cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
241 beq L_register_copy /* registers? yes, next loop */
243 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
244 bne L_register_handle_double
246 #if defined(__DARWIN__)
247 addis itmp3,t3,ha16(L_jumptable_float - L_asm_vm_call_method_get_pc)
248 la itmp3,lo16(L_jumptable_float - L_asm_vm_call_method_get_pc)(itmp3)
250 lis itmp3,L_jumptable_float@ha
251 addi itmp3,itmp3,L_jumptable_float@l
254 slwi t2,t1,2 /* multiple of 4-bytes */
255 add itmp3,itmp3,t2 /* calculate address of jumptable */
256 lwz itmp3,0(itmp3) /* load function address */
258 addi t1,t1,1 /* float argument counter */
259 #if defined(__DARWIN__)
260 addi t7,t7,1 /* stack slot counter */
261 addi t6,t6,1 /* skip 1 integer argument register */
265 L_register_handle_double:
266 #if defined(__DARWIN__)
267 addis itmp3,t3,ha16(L_jumptable_double - L_asm_vm_call_method_get_pc)
268 la itmp3,lo16(L_jumptable_double - L_asm_vm_call_method_get_pc)(itmp3)
270 lis itmp3,L_jumptable_double@ha
271 addi itmp3,itmp3,L_jumptable_double@l
274 slwi t2,t1,2 /* multiple of 4-bytes */
275 add itmp3,itmp3,t2 /* calculate address of jumptable */
276 lwz itmp3,0(itmp3) /* load function address */
278 addi t1,t1,1 /* float argument counter */
279 #if defined(__DARWIN__)
280 addi t7,t7,2 /* stack slot counter */
281 addi t6,t6,2 /* skip 2 integer argument registers */
285 L_register_copy_done:
286 /* calculate remaining arguments */
287 sub itmp3,t4,t0 /* - integer arguments in registers */
288 sub itmp3,itmp3,t1 /* - float arguments in registers */
290 beq L_stack_copy_done
292 mr itmp2,t4 /* restore argument count */
293 mr itmp1,t5 /* restore argument block pointer */
295 slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
296 addi t4,t4,LA_SIZE /* add size of linkage area */
298 #if defined(__DARWIN__)
299 slwi t5,t7,2 /* add stack space for arguments */
305 mr t6,sp /* use t6 as temporary sp */
306 addi t6,t6,LA_SIZE /* skip linkage area */
307 #if defined(__DARWIN__)
308 add t6,t6,t5 /* skip stack space for arguments */
311 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
312 addi itmp2,itmp2,1 /* initialize argument count */
315 addi itmp1,itmp1,sizevmarg /* goto next argument block */
316 addi itmp2,itmp2,-1 /* argument count - 1 */
318 beq L_stack_copy_done
320 lwz itmp3,offvmargtype+4(itmp1)
321 andi. r0,itmp3,0x0002 /* is this a float/double type? */
322 bne L_stack_handle_float
325 addi t0,t0,-1 /* arguments assigned to registers */
327 bge L_stack_copy_loop
329 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
330 bne L_stack_handle_long
332 lwz itmp3,offvmargdata+4(itmp1) /* get integer argument */
333 stw itmp3,0(t6) /* and store it on the stack */
334 addi t6,t6,4 /* increase temporary sp by 1 slot */
338 #if !defined(__DARWIN__)
339 addi t6,t6,4 /* align stack to 8-bytes */
340 rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
343 lwz itmp3,offvmargdata+0(itmp1) /* get long argument */
344 stw itmp3,0(t6) /* and store it on the stack */
345 lwz itmp3,offvmargdata+4(itmp1)
347 addi t6,t6,8 /* increase temporary sp by 2 slots */
350 L_stack_handle_float:
351 addi t1,t1,-1 /* arguments assigned to registers */
353 bge L_stack_copy_loop
355 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
356 bne L_stack_handle_double
358 lfs ftmp3,offvmargdata(itmp1) /* get float argument */
359 stfs ftmp3,0(t6) /* and store it on the stack */
360 addi t6,t6,4 /* increase temporary sp by 1 slot */
363 L_stack_handle_double:
364 #if !defined(__DARWIN__)
365 addi t6,t6,4 /* align stack to 8-bytes */
366 rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
369 lfd ftmp3,offvmargdata(itmp1) /* get double argument */
370 stfd ftmp3,0(t6) /* and store it on the stack */
371 addi t6,t6,8 /* increase temporary sp by 2 slots */
375 lwz itmp1,9*4(s0) /* pass method pointer via tmp1 */
377 #if defined(__DARWIN__)
378 addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
379 la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
381 lis mptr,L_asm_call_jit_compiler@ha
382 addi mptr,mptr,L_asm_call_jit_compiler@l
392 #if defined(__DARWIN__)
393 addi pv,itmp1,lo16(asm_vm_call_method - 1b)
395 addi pv,itmp1,(asm_vm_call_method - 1b)@l
398 L_asm_vm_call_method_return:
399 mr sp,s0 /* restore the function's sp */
401 lwz s0,8*4(sp) /* restore used callee saved registers */
403 #if defined(__DARWIN__)
404 lwz itmp1,10*4(sp) /* register r11 is callee saved */
406 lwz pv,11*4(sp) /* save PV register */
409 lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
412 #if defined(__DARWIN__)
428 RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
431 lwz r0,40*4+LA_LR_OFFSET(sp)
436 asm_vm_call_method_exception_handler:
438 bl builtin_throw_exception
439 b L_asm_vm_call_method_return
459 lwz a0,offvmargdata+4(itmp1)
462 lwz a1,offvmargdata+4(itmp1)
465 lwz a2,offvmargdata+4(itmp1)
468 lwz a3,offvmargdata+4(itmp1)
471 lwz a4,offvmargdata+4(itmp1)
474 lwz a5,offvmargdata+4(itmp1)
477 lwz a6,offvmargdata+4(itmp1)
480 lwz a7,offvmargdata+4(itmp1)
488 #if defined(__DARWIN__)
497 /* we have two entries here, so we get the even argument register
498 alignment for linux */
513 lwz a0,offvmargdata+0(itmp1)
514 lwz a1,offvmargdata+4(itmp1)
516 #if defined(__DARWIN__)
518 lwz a1,offvmargdata+0(itmp1)
519 lwz a2,offvmargdata+4(itmp1)
523 lwz a2,offvmargdata+0(itmp1)
524 lwz a3,offvmargdata+4(itmp1)
526 #if defined(__DARWIN__)
528 lwz a3,offvmargdata+0(itmp1)
529 lwz a4,offvmargdata+4(itmp1)
533 lwz a4,offvmargdata+0(itmp1)
534 lwz a5,offvmargdata+4(itmp1)
536 #if defined(__DARWIN__)
538 lwz a5,offvmargdata+0(itmp1)
539 lwz a6,offvmargdata+4(itmp1)
543 lwz a6,offvmargdata+0(itmp1)
544 lwz a7,offvmargdata+4(itmp1)
561 #if defined(__DARWIN__)
573 lfs fa0,offvmargdata(itmp1)
576 lfs fa1,offvmargdata(itmp1)
579 lfs fa2,offvmargdata(itmp1)
582 lfs fa3,offvmargdata(itmp1)
585 lfs fa4,offvmargdata(itmp1)
588 lfs fa5,offvmargdata(itmp1)
591 lfs fa6,offvmargdata(itmp1)
594 lfs fa7,offvmargdata(itmp1)
597 #if defined(__DARWIN__)
599 lfs fa8,offvmargdata(itmp1)
602 lfs fa9,offvmargdata(itmp1)
605 lfs fa10,offvmargdata(itmp1)
608 lfs fa11,offvmargdata(itmp1)
611 lfs fa12,offvmargdata(itmp1)
629 #if defined(__DARWIN__)
641 lfd fa0,offvmargdata(itmp1)
644 lfd fa1,offvmargdata(itmp1)
647 lfd fa2,offvmargdata(itmp1)
650 lfd fa3,offvmargdata(itmp1)
653 lfd fa4,offvmargdata(itmp1)
656 lfd fa5,offvmargdata(itmp1)
659 lfd fa6,offvmargdata(itmp1)
662 lfd fa7,offvmargdata(itmp1)
665 #if defined(__DARWIN__)
667 lfd fa8,offvmargdata(itmp1)
670 lfd fa9,offvmargdata(itmp1)
673 lfd fa10,offvmargdata(itmp1)
676 lfd fa11,offvmargdata(itmp1)
679 lfd fa12,offvmargdata(itmp1)
683 asm_vm_call_method_end:
686 /* asm_call_jit_compiler *******************************************************
688 Invokes the compiler for untranslated JavaVM methods.
690 *******************************************************************************/
692 asm_call_jit_compiler:
693 L_asm_call_jit_compiler: /* required for PIC code */
695 stw r0,LA_LR_OFFSET(sp) /* save return address */
696 stwu sp,-(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(sp)
698 #if defined(__DARWIN__)
699 stw a0,LA_SIZE+(4+0)*4(sp)
700 stw a1,LA_SIZE+(4+1)*4(sp)
701 stw a2,LA_SIZE+(4+2)*4(sp)
702 stw a3,LA_SIZE+(4+3)*4(sp)
703 stw a4,LA_SIZE+(4+4)*4(sp)
704 stw a5,LA_SIZE+(4+5)*4(sp)
705 stw a6,LA_SIZE+(4+6)*4(sp)
706 stw a7,LA_SIZE+(4+7)*4(sp)
708 stfd fa0,LA_SIZE+(4+8)*4(sp)
709 stfd fa1,LA_SIZE+(4+10)*4(sp)
710 stfd fa2,LA_SIZE+(4+12)*4(sp)
711 stfd fa3,LA_SIZE+(4+14)*4(sp)
712 stfd fa4,LA_SIZE+(4+16)*4(sp)
713 stfd fa5,LA_SIZE+(4+18)*4(sp)
714 stfd fa6,LA_SIZE+(4+20)*4(sp)
715 stfd fa7,LA_SIZE+(4+22)*4(sp)
716 stfd fa8,LA_SIZE+(4+24)*4(sp)
717 stfd fa9,LA_SIZE+(4+26)*4(sp)
718 stfd fa10,LA_SIZE+(4+28)*4(sp)
719 stfd fa11,LA_SIZE+(4+30)*4(sp)
720 stfd fa12,LA_SIZE+(4+32)*4(sp)
722 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
727 addi a2,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
728 lwz a3,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
730 mr pv,v0 /* move address to pv register */
732 #if defined(__DARWIN__)
733 lwz a0,LA_SIZE+(4+0)*4(sp)
734 lwz a1,LA_SIZE+(4+1)*4(sp)
735 lwz a2,LA_SIZE+(4+2)*4(sp)
736 lwz a3,LA_SIZE+(4+3)*4(sp)
737 lwz a4,LA_SIZE+(4+4)*4(sp)
738 lwz a5,LA_SIZE+(4+5)*4(sp)
739 lwz a6,LA_SIZE+(4+6)*4(sp)
740 lwz a7,LA_SIZE+(4+7)*4(sp)
742 lfd fa0,LA_SIZE+(4+8)*4(sp)
743 lfd fa1,LA_SIZE+(4+10)*4(sp)
744 lfd fa2,LA_SIZE+(4+12)*4(sp)
745 lfd fa3,LA_SIZE+(4+14)*4(sp)
746 lfd fa4,LA_SIZE+(4+16)*4(sp)
747 lfd fa5,LA_SIZE+(4+18)*4(sp)
748 lfd fa6,LA_SIZE+(4+20)*4(sp)
749 lfd fa7,LA_SIZE+(4+22)*4(sp)
750 lfd fa8,LA_SIZE+(4+24)*4(sp)
751 lfd fa9,LA_SIZE+(4+26)*4(sp)
752 lfd fa10,LA_SIZE+(4+28)*4(sp)
753 lfd fa11,LA_SIZE+(4+30)*4(sp)
754 lfd fa12,LA_SIZE+(4+32)*4(sp)
756 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
759 lwz itmp1,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
762 addi sp,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
764 mr. pv,pv /* test for exception */
765 beq L_asm_call_jit_compiler_exception
767 mtctr pv /* move method address to control reg */
768 bctr /* and call the Java method */
770 L_asm_call_jit_compiler_exception:
772 stw r0,LA_LR_OFFSET(sp)
773 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
774 bl exceptions_get_and_clear_exception
775 lwz xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
777 addi sp,sp,LA_SIZE_ALIGNED
779 mr xptr,v0 /* get exception */
780 addi xpc,xpc,-4 /* exception address is ra - 4 */
781 b L_asm_handle_nat_exception
784 /********************* function asm_handle_exception ***************************
786 * This function handles an exception. It does not use the usual calling *
787 * conventions. The exception pointer is passed in REG_ITMP1 and the *
788 * pc from the exception raising position is passed in REG_ITMP2. It searches *
789 * the local exception table for a handler. If no one is found, it unwinds *
790 * stacks and continues searching the callers. *
792 * void asm_handle_exception (exceptionptr, exceptionpc); *
794 *******************************************************************************/
796 asm_handle_nat_exception:
797 L_asm_handle_nat_exception: /* required for PIC code */
798 L_asm_handle_exception_stack_loop:
800 addi sp,sp,-(LA_SIZE+((4+6)*4)) /* allocate stack (+4 for darwin) */
801 stw xptr,LA_SIZE+(4+0)*4(sp) /* save exception pointer */
802 stw xpc,LA_SIZE+(4+1)*4(sp) /* save exception pc */
803 stw r0,LA_SIZE+(4+3)*4(sp) /* save return address */
805 stw itmp3,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag (cleared) */
807 mr a0,r0 /* pass return address */
808 bl md_codegen_get_pv_from_pc /* get PV from RA */
809 stw v0,LA_SIZE+(4+2)*4(sp) /* save data segment pointer */
811 lwz a0,LA_SIZE+(4+0)*4(sp) /* pass xptr */
812 lwz a1,LA_SIZE+(4+1)*4(sp) /* pass xpc */
813 lwz a2,LA_SIZE+(4+2)*4(sp) /* pass PV (v0 == a0) */
814 addi a3,sp,LA_SIZE+((4+6)*4) /* pass Java SP */
816 b L_asm_handle_exception_continue
818 asm_handle_exception:
819 L_asm_handle_exception: /* required for PIC code */
820 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
822 #if defined(__DARWIN__)
824 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
825 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
828 addi sp,sp,-(LA_SIZE+(4+6)*4) /* allocate stack */
829 stw xptr,LA_SIZE+(4+0)*4(sp) /* save xptr */
830 stw pv,LA_SIZE+(4+2)*4(sp) /* save PV */
831 mflr r0 /* save RA */
832 stw r0,LA_SIZE+(4+3)*4(sp)
833 li t0,1 /* set maybe-leaf flag */
834 stw t0,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag */
836 mr a0,xptr /* pass exception pointer */
837 mr a1,xpc /* pass exception pc */
838 mr a2,pv /* pass data segment pointer */
839 addi a3,sp,LA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*4
841 L_asm_handle_exception_continue:
842 bl exceptions_handle_exception
845 beq L_asm_handle_exception_not_catched
847 mr xpc,v0 /* move handlerpc into xpc */
848 lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */
849 lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */
850 lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */
852 lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */
853 addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */
856 beq L_asm_handle_exception_no_leaf
858 #if defined(__DARWIN__)
860 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
861 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
864 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
866 L_asm_handle_exception_no_leaf:
867 mtctr xpc /* jump to the handler */
870 L_asm_handle_exception_not_catched:
871 lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */
872 lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */
873 lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */
875 lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */
876 addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */
879 beq L_asm_handle_exception_no_leaf_stack
881 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
882 li t0,0 /* clear the maybe-leaf flag */
884 L_asm_handle_exception_no_leaf_stack:
885 lwz t1,FrameSize(pv) /* get frame size */
886 add t1,sp,t1 /* pointer to save area */
888 lwz t2,IsLeaf(pv) /* is leaf procedure */
890 bne L_asm_handle_exception_no_ra_restore
892 lwz r0,LA_LR_OFFSET(t1) /* restore ra */
895 L_asm_handle_exception_no_ra_restore:
896 mflr xpc /* the new xpc is ra */
897 mr t4,xpc /* save RA */
898 lwz t2,IntSave(pv) /* t2 = saved int register count */
901 mflr t3 /* t3 = current pc */
902 #if defined(__DARWIN__)
903 addi t3,t3,lo16(ex_int2-ex_int1)
905 addi t3,t3,(ex_int2-ex_int1)@l
907 slwi t2,t2,2 /* t2 = register count * 4 */
908 subf t3,t2,t3 /* t3 = IntSave - t2 */
924 subf t1,t2,t1 /* t1 = t1 - register count * 4 */
930 #if defined(__DARWIN__)
931 addi t3,t3,lo16(ex_flt2-ex_flt1)
933 addi t3,t3,(ex_flt2-ex_flt1)@l
935 slwi t2,t2,2 /* t2 = register count * 4 */
936 subf t3,t2,t3 /* t3 = FltSave - t2 */
952 mtlr t4 /* restore RA */
953 lwz t1,FrameSize(pv) /* get frame size */
954 add sp,sp,t1 /* unwind stack */
955 b L_asm_handle_exception_stack_loop
958 /* asm_abstractmethoderror *****************************************************
960 Creates and throws an AbstractMethodError.
962 *******************************************************************************/
964 asm_abstractmethoderror:
966 stw r0,LA_LR_OFFSET(sp)
967 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
968 addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */
969 mr a1,r0 /* pass exception address */
970 bl exceptions_asm_new_abstractmethoderror
971 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
972 mtlr r0 /* restore return address */
973 addi sp,sp,LA_SIZE_ALIGNED
975 mr xptr,v0 /* get exception pointer */
976 mr xpc,r0 /* we can't use r0 directly in addi */
977 addi xpc,xpc,-4 /* exception address is ra - 4 */
978 b L_asm_handle_nat_exception
981 /* asm_patcher_wrapper *********************************************************
986 20 return address into JIT code (patch position)
987 16 pointer to virtual java_objectheader
988 12 machine code (which is patched back later)
989 8 unresolved class/method/field reference
990 4 data segment displacement from load instructions
991 0 patcher function pointer to call (pv is saved here afterwards)
993 *******************************************************************************/
996 mflr r0 /* get Java return address (leaf) */
997 stw r0,6*4(sp) /* store it in the stub stackframe */
998 /* keep stack 16-bytes aligned: 6+1+37 = 44 */
999 stwu sp,-(LA_SIZE+(5+58)*4)(sp)
1001 #if defined(__DARWIN__)
1002 stw a0,LA_SIZE+(5+0)*4(sp) /* save argument registers */
1003 stw a1,LA_SIZE+(5+1)*4(sp) /* preserve linkage area (24 bytes) */
1004 stw a2,LA_SIZE+(5+2)*4(sp) /* and 4 bytes for 4 argument */
1005 stw a3,LA_SIZE+(5+3)*4(sp)
1006 stw a4,LA_SIZE+(5+4)*4(sp)
1007 stw a5,LA_SIZE+(5+5)*4(sp)
1008 stw a6,LA_SIZE+(5+6)*4(sp)
1009 stw a7,LA_SIZE+(5+7)*4(sp)
1011 stfd fa0,LA_SIZE+(5+8)*4(sp)
1012 stfd fa1,LA_SIZE+(5+10)*4(sp)
1013 stfd fa2,LA_SIZE+(5+12)*4(sp)
1014 stfd fa3,LA_SIZE+(5+14)*4(sp)
1015 stfd fa4,LA_SIZE+(5+16)*4(sp)
1016 stfd fa5,LA_SIZE+(5+18)*4(sp)
1017 stfd fa6,LA_SIZE+(5+20)*4(sp)
1018 stfd fa7,LA_SIZE+(5+22)*4(sp)
1019 stfd fa8,LA_SIZE+(5+24)*4(sp)
1020 stfd fa9,LA_SIZE+(5+26)*4(sp)
1021 stfd fa10,LA_SIZE+(5+28)*4(sp)
1022 stfd fa11,LA_SIZE+(5+30)*4(sp)
1023 stfd fa12,LA_SIZE+(5+32)*4(sp)
1025 stw t0,LA_SIZE+(5+33)*4(sp)
1026 stw t1,LA_SIZE+(5+34)*4(sp)
1027 stw t2,LA_SIZE+(5+35)*4(sp)
1028 stw t3,LA_SIZE+(5+36)*4(sp)
1029 stw t4,LA_SIZE+(5+37)*4(sp)
1030 stw t5,LA_SIZE+(5+38)*4(sp)
1031 stw t6,LA_SIZE+(5+39)*4(sp)
1032 stw t7,LA_SIZE+(5+40)*4(sp)
1034 stfd ft0,LA_SIZE+(5+42)*4(sp)
1035 stfd ft1,LA_SIZE+(5+44)*4(sp)
1036 stfd ft2,LA_SIZE+(5+46)*4(sp)
1037 stfd ft3,LA_SIZE+(5+48)*4(sp)
1038 stfd ft4,LA_SIZE+(5+50)*4(sp)
1039 stfd ft5,LA_SIZE+(5+52)*4(sp)
1041 /* save 8 int/8 float arguments */
1042 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
1043 SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
1046 stw itmp1,LA_SIZE+(5+54)*4(sp)
1047 stw itmp2,LA_SIZE+(5+55)*4(sp)
1048 stw pv,LA_SIZE+(5+56)*4(sp)
1050 addi a0,sp,LA_SIZE+(5+58)*4 /* pass SP of patcher stub */
1051 mr a1,pv /* pass PV */
1052 mr a2,r0 /* pass RA (correct for leafs) */
1054 stw v0,LA_SIZE+(5+57)*4(sp) /* save return value */
1056 #if defined(__DARWIN__)
1057 lwz a0,LA_SIZE+(5+0)*4(sp)
1058 lwz a1,LA_SIZE+(5+1)*4(sp)
1059 lwz a2,LA_SIZE+(5+2)*4(sp)
1060 lwz a3,LA_SIZE+(5+3)*4(sp)
1061 lwz a4,LA_SIZE+(5+4)*4(sp)
1062 lwz a5,LA_SIZE+(5+5)*4(sp)
1063 lwz a6,LA_SIZE+(5+6)*4(sp)
1064 lwz a7,LA_SIZE+(5+7)*4(sp)
1066 lfd fa0,LA_SIZE+(5+8)*4(sp)
1067 lfd fa1,LA_SIZE+(5+10)*4(sp)
1068 lfd fa2,LA_SIZE+(5+12)*4(sp)
1069 lfd fa3,LA_SIZE+(5+14)*4(sp)
1070 lfd fa4,LA_SIZE+(5+16)*4(sp)
1071 lfd fa5,LA_SIZE+(5+18)*4(sp)
1072 lfd fa6,LA_SIZE+(5+20)*4(sp)
1073 lfd fa7,LA_SIZE+(5+22)*4(sp)
1074 lfd fa8,LA_SIZE+(5+24)*4(sp)
1075 lfd fa9,LA_SIZE+(5+26)*4(sp)
1076 lfd fa10,LA_SIZE+(5+28)*4(sp)
1077 lfd fa11,LA_SIZE+(5+30)*4(sp)
1078 lfd fa12,LA_SIZE+(5+32)*4(sp)
1080 lwz t0,LA_SIZE+(5+33)*4(sp)
1081 lwz t1,LA_SIZE+(5+34)*4(sp)
1082 lwz t2,LA_SIZE+(5+35)*4(sp)
1083 lwz t3,LA_SIZE+(5+36)*4(sp)
1084 lwz t4,LA_SIZE+(5+37)*4(sp)
1085 lwz t5,LA_SIZE+(5+38)*4(sp)
1086 lwz t6,LA_SIZE+(5+39)*4(sp)
1087 lwz t7,LA_SIZE+(5+40)*4(sp)
1089 lfd ft0,LA_SIZE+(5+42)*4(sp)
1090 lfd ft1,LA_SIZE+(5+44)*4(sp)
1091 lfd ft2,LA_SIZE+(5+46)*4(sp)
1092 lfd ft3,LA_SIZE+(5+48)*4(sp)
1093 lfd ft4,LA_SIZE+(5+50)*4(sp)
1094 lfd ft5,LA_SIZE+(5+52)*4(sp)
1096 /* restore 8 int/8 float arguments */
1097 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
1098 RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
1101 lwz itmp1,LA_SIZE+(5+54)*4(sp)
1102 lwz itmp2,LA_SIZE+(5+55)*4(sp)
1103 lwz pv,LA_SIZE+(5+56)*4(sp)
1104 lwz itmp3,LA_SIZE+(5+57)*4(sp) /* restore return value into temp reg.*/
1106 lwz r0,6*4+LA_SIZE+(5+58)*4(sp) /* restore RA */
1109 mr. itmp3,itmp3 /* check for an exception */
1110 bne L_asm_patcher_wrapper_exception
1112 /* get return address (into JIT code) */
1113 lwz itmp3,5*4+LA_SIZE+(5+58)*4(sp)
1115 /* remove stack frame + patcher stub stack */
1116 addi sp,sp,8*4+LA_SIZE+(5+58)*4
1119 bctr /* jump to new patched code */
1121 L_asm_patcher_wrapper_exception:
1122 mr xptr,itmp3 /* get exception */
1123 lwz xpc,5*4+LA_SIZE+(5+58)*4(sp)
1124 addi sp,sp,8*4+LA_SIZE+(5+58)*4
1125 b L_asm_handle_exception
1127 #if defined(ENABLE_REPLACEMENT)
1129 /* asm_replacement_out *********************************************************
1131 This code is jumped to from the replacement-out stubs that are executed
1132 when a thread reaches an activated replacement point.
1134 The purpose of asm_replacement_out is to read out the parts of the
1135 execution state that cannot be accessed from C code, store this state,
1136 and then call the C function replace_me.
1139 16 start of stack inside method to replace
1140 0 rplpoint * info on the replacement point that was reached
1142 NOTE: itmp3 has been clobbered by the replacement-out stub!
1144 *******************************************************************************/
1146 /* some room to accomodate changes of the stack frame size during replacement */
1147 /* XXX we should find a cleaner solution here */
1148 #define REPLACEMENT_ROOM 512
1150 #define sizeexecutionstate_ALIGNED ((sizeexecutionstate + 15) & ~15)
1152 asm_replacement_out:
1153 /* create stack frame */
1154 addi sp,sp,-(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM)
1156 /* save link register */
1159 /* save registers in execution state */
1160 stw r0 ,( 0*4+offes_intregs)(sp)
1161 stw r1 ,( 1*4+offes_intregs)(sp)
1162 stw r2 ,( 2*4+offes_intregs)(sp)
1163 stw r3 ,( 3*4+offes_intregs)(sp)
1164 stw r4 ,( 4*4+offes_intregs)(sp)
1165 stw r5 ,( 5*4+offes_intregs)(sp)
1166 stw r6 ,( 6*4+offes_intregs)(sp)
1167 stw r7 ,( 7*4+offes_intregs)(sp)
1168 stw r8 ,( 8*4+offes_intregs)(sp)
1169 stw r9 ,( 9*4+offes_intregs)(sp)
1170 stw r10,(10*4+offes_intregs)(sp)
1171 stw r11,(11*4+offes_intregs)(sp)
1172 stw r12,(12*4+offes_intregs)(sp)
1173 stw r13,(13*4+offes_intregs)(sp)
1174 stw r14,(14*4+offes_intregs)(sp)
1175 stw r15,(15*4+offes_intregs)(sp)
1176 stw r16,(16*4+offes_intregs)(sp) /* link register stored as itmp3 */
1177 stw r17,(17*4+offes_intregs)(sp)
1178 stw r18,(18*4+offes_intregs)(sp)
1179 stw r19,(19*4+offes_intregs)(sp)
1180 stw r20,(20*4+offes_intregs)(sp)
1181 stw r21,(21*4+offes_intregs)(sp)
1182 stw r22,(22*4+offes_intregs)(sp)
1183 stw r23,(23*4+offes_intregs)(sp)
1184 stw r24,(24*4+offes_intregs)(sp)
1185 stw r25,(25*4+offes_intregs)(sp)
1186 stw r26,(26*4+offes_intregs)(sp)
1187 stw r27,(27*4+offes_intregs)(sp)
1188 stw r28,(28*4+offes_intregs)(sp)
1189 stw r29,(29*4+offes_intregs)(sp)
1190 stw r30,(30*4+offes_intregs)(sp)
1191 stw r31,(31*4+offes_intregs)(sp)
1193 stfd fr0 ,( 0*8+offes_fltregs)(sp)
1194 stfd fr1 ,( 1*8+offes_fltregs)(sp)
1195 stfd fr2 ,( 2*8+offes_fltregs)(sp)
1196 stfd fr3 ,( 3*8+offes_fltregs)(sp)
1197 stfd fr4 ,( 4*8+offes_fltregs)(sp)
1198 stfd fr5 ,( 5*8+offes_fltregs)(sp)
1199 stfd fr6 ,( 6*8+offes_fltregs)(sp)
1200 stfd fr7 ,( 7*8+offes_fltregs)(sp)
1201 stfd fr8 ,( 8*8+offes_fltregs)(sp)
1202 stfd fr9 ,( 9*8+offes_fltregs)(sp)
1203 stfd fr10,(10*8+offes_fltregs)(sp)
1204 stfd fr11,(11*8+offes_fltregs)(sp)
1205 stfd fr12,(12*8+offes_fltregs)(sp)
1206 stfd fr13,(13*8+offes_fltregs)(sp)
1207 stfd fr14,(14*8+offes_fltregs)(sp)
1208 stfd fr15,(15*8+offes_fltregs)(sp)
1209 stfd fr16,(16*8+offes_fltregs)(sp)
1210 stfd fr17,(17*8+offes_fltregs)(sp)
1211 stfd fr18,(18*8+offes_fltregs)(sp)
1212 stfd fr19,(19*8+offes_fltregs)(sp)
1213 stfd fr20,(20*8+offes_fltregs)(sp)
1214 stfd fr21,(21*8+offes_fltregs)(sp)
1215 stfd fr22,(22*8+offes_fltregs)(sp)
1216 stfd fr23,(23*8+offes_fltregs)(sp)
1217 stfd fr24,(24*8+offes_fltregs)(sp)
1218 stfd fr25,(25*8+offes_fltregs)(sp)
1219 stfd fr26,(26*8+offes_fltregs)(sp)
1220 stfd fr27,(27*8+offes_fltregs)(sp)
1221 stfd fr28,(28*8+offes_fltregs)(sp)
1222 stfd fr29,(29*8+offes_fltregs)(sp)
1223 stfd fr30,(30*8+offes_fltregs)(sp)
1224 stfd fr31,(31*8+offes_fltregs)(sp)
1226 /* calculate sp of method */
1227 addi itmp1,sp,(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM + 4*4)
1228 stw itmp1,(offes_sp)(sp)
1231 stw pv,(offes_pv)(sp)
1233 /* call replace_me */
1234 lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */
1235 mr a1,sp /* arg1: execution state */
1236 addi sp,sp,-(LA_SIZE_ALIGNED)
1237 b replace_me /* call C function replace_me */
1239 /* asm_replacement_in **********************************************************
1241 This code writes the given execution state and jumps to the replacement
1244 This function never returns!
1246 NOTE: itmp3 is not restored!
1249 void asm_replacement_in(executionstate *es, replace_safestack_t *st);
1251 *******************************************************************************/
1254 /* a0 == executionstate *es */
1255 /* a1 == replace_safestack_t *st */
1258 mr s1,a1 /* replace_safestack_t *st */
1259 mr s2,a0 /* executionstate *es == safe stack */
1261 /* switch to the safe stack */
1264 /* reserve linkage area */
1265 addi sp,sp,-(LA_SIZE_ALIGNED)
1267 /* call replace_build_execution_state(st) */
1269 bl replace_build_execution_state
1272 lwz sp,(offes_sp)(s2)
1274 /* build stack frame */
1275 addi sp,sp,-(sizeexecutionstate_ALIGNED)
1277 /* call replace_free_safestack(st,& of allocated executionstate_t) */
1278 mr a1,sp /* tmpes */
1280 addi sp,sp,-(LA_SIZE_ALIGNED) /* reserve linkage area */
1281 bl replace_free_safestack
1282 addi sp,sp,+(LA_SIZE_ALIGNED) /* tear down linkage area */
1285 lwz pv,(offes_pv)(sp)
1287 /* copy registers from execution state */
1288 lwz r0 ,( 0*4+offes_intregs)(sp)
1290 /* r2 is reserved */
1291 lwz a0 ,( 3*4+offes_intregs)(sp)
1292 lwz r4 ,( 4*4+offes_intregs)(sp)
1293 lwz r5 ,( 5*4+offes_intregs)(sp)
1294 lwz r6 ,( 6*4+offes_intregs)(sp)
1295 lwz r7 ,( 7*4+offes_intregs)(sp)
1296 lwz r8 ,( 8*4+offes_intregs)(sp)
1297 lwz r9 ,( 9*4+offes_intregs)(sp)
1298 lwz r10,(10*4+offes_intregs)(sp)
1299 lwz r11,(11*4+offes_intregs)(sp)
1300 lwz r12,(12*4+offes_intregs)(sp)
1302 lwz r14,(14*4+offes_intregs)(sp)
1303 lwz r15,(15*4+offes_intregs)(sp)
1304 lwz r16,(16*4+offes_intregs)(sp) /* itmp3, later to link register */
1305 lwz r17,(17*4+offes_intregs)(sp)
1306 lwz r18,(18*4+offes_intregs)(sp)
1307 lwz r19,(19*4+offes_intregs)(sp)
1308 lwz r20,(20*4+offes_intregs)(sp)
1309 lwz r21,(21*4+offes_intregs)(sp)
1310 lwz r22,(22*4+offes_intregs)(sp)
1311 lwz r23,(23*4+offes_intregs)(sp)
1312 lwz r24,(24*4+offes_intregs)(sp)
1313 lwz r25,(25*4+offes_intregs)(sp)
1314 lwz r26,(26*4+offes_intregs)(sp)
1315 lwz r27,(27*4+offes_intregs)(sp)
1316 lwz r28,(28*4+offes_intregs)(sp)
1317 lwz r29,(29*4+offes_intregs)(sp)
1318 lwz r30,(30*4+offes_intregs)(sp)
1319 lwz r31,(31*4+offes_intregs)(sp)
1321 lfd fr0 ,( 0*8+offes_fltregs)(sp)
1322 lfd fr1 ,( 1*8+offes_fltregs)(sp)
1323 lfd fr2 ,( 2*8+offes_fltregs)(sp)
1324 lfd fr3 ,( 3*8+offes_fltregs)(sp)
1325 lfd fr4 ,( 4*8+offes_fltregs)(sp)
1326 lfd fr5 ,( 5*8+offes_fltregs)(sp)
1327 lfd fr6 ,( 6*8+offes_fltregs)(sp)
1328 lfd fr7 ,( 7*8+offes_fltregs)(sp)
1329 lfd fr8 ,( 8*8+offes_fltregs)(sp)
1330 lfd fr9 ,( 9*8+offes_fltregs)(sp)
1331 lfd fr10,(10*8+offes_fltregs)(sp)
1332 lfd fr11,(11*8+offes_fltregs)(sp)
1333 lfd fr12,(12*8+offes_fltregs)(sp)
1334 lfd fr13,(13*8+offes_fltregs)(sp)
1335 lfd fr14,(14*8+offes_fltregs)(sp)
1336 lfd fr15,(15*8+offes_fltregs)(sp)
1337 lfd fr16,(16*8+offes_fltregs)(sp)
1338 lfd fr17,(17*8+offes_fltregs)(sp)
1339 lfd fr18,(18*8+offes_fltregs)(sp)
1340 lfd fr19,(19*8+offes_fltregs)(sp)
1341 lfd fr20,(20*8+offes_fltregs)(sp)
1342 lfd fr21,(21*8+offes_fltregs)(sp)
1343 lfd fr22,(22*8+offes_fltregs)(sp)
1344 lfd fr23,(23*8+offes_fltregs)(sp)
1345 lfd fr24,(24*8+offes_fltregs)(sp)
1346 lfd fr25,(25*8+offes_fltregs)(sp)
1347 lfd fr26,(26*8+offes_fltregs)(sp)
1348 lfd fr27,(27*8+offes_fltregs)(sp)
1349 lfd fr28,(28*8+offes_fltregs)(sp)
1350 lfd fr29,(29*8+offes_fltregs)(sp)
1351 lfd fr30,(30*8+offes_fltregs)(sp)
1352 lfd fr31,(31*8+offes_fltregs)(sp)
1354 /* restore link register */
1360 lwz itmp3,offes_pc(sp)
1362 /* remove stack frame */
1364 addi sp,sp,+(sizeexecutionstate_ALIGNED)
1366 /* jump to new code */
1371 #endif /* defined(ENABLE_REPLACEMENT) */
1373 /*********************************************************************/
1401 /* asm_compare_and_swap ********************************************************
1405 *******************************************************************************/
1407 asm_compare_and_swap:
1420 /* asm_memory_barrier **********************************************************
1424 *******************************************************************************/
1431 asm_getclassvalues_atomic:
1434 lwz a3,offbaseval(a0)
1435 lwz a4,offdiffval(a0)
1436 lwz a5,offbaseval(a1)
1438 stw a3,offcast_super_baseval(a2)
1439 stw a4,offcast_super_diffval(a2)
1440 stw a5,offcast_sub_baseval(a2)
1445 asm_criticalsections:
1446 #if defined(ENABLE_THREADS)
1454 #if defined(__DARWIN__)
1456 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1458 L_builtin_throw_exception$stub:
1459 .indirect_symbol _builtin_throw_exception
1461 bcl 20,31,L00$_builtin_throw_exception
1462 L00$_builtin_throw_exception:
1464 addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1466 lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1470 .lazy_symbol_pointer
1471 L_builtin_throw_exception$lazy_ptr:
1472 .indirect_symbol _builtin_throw_exception
1473 .long dyld_stub_binding_helper
1476 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1478 L_md_codegen_get_pv_from_pc$stub:
1479 .indirect_symbol _md_codegen_get_pv_from_pc
1481 bcl 20,31,L00$_md_codegen_get_pv_from_pc
1482 L00$_md_codegen_get_pv_from_pc:
1484 addis r11,r11,ha16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)
1486 lwzu r12,lo16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)(r11)
1490 .lazy_symbol_pointer
1491 L_md_codegen_get_pv_from_pc$lazy_ptr:
1492 .indirect_symbol _md_codegen_get_pv_from_pc
1493 .long dyld_stub_binding_helper
1496 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1498 L_exceptions_handle_exception$stub:
1499 .indirect_symbol _exceptions_handle_exception
1501 bcl 20,31,L00$_exceptions_handle_exception
1502 L00$_exceptions_handle_exception:
1504 addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1506 lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1510 .lazy_symbol_pointer
1511 L_exceptions_handle_exception$lazy_ptr:
1512 .indirect_symbol _exceptions_handle_exception
1513 .long dyld_stub_binding_helper
1516 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1518 L_stacktrace_create_extern_stackframeinfo$stub:
1519 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1521 bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1522 L00$_stacktrace_create_extern_stackframeinfo:
1524 addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1526 lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1530 .lazy_symbol_pointer
1531 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1532 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1533 .long dyld_stub_binding_helper
1536 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1538 L_jit_asm_compile$stub:
1539 .indirect_symbol _jit_asm_compile
1541 bcl 20,31,L00$_jit_asm_compile
1542 L00$_jit_asm_compile:
1544 addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1546 lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1550 .lazy_symbol_pointer
1551 L_jit_asm_compile$lazy_ptr:
1552 .indirect_symbol _jit_asm_compile
1553 .long dyld_stub_binding_helper
1556 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1558 L_stacktrace_remove_stackframeinfo$stub:
1559 .indirect_symbol _stacktrace_remove_stackframeinfo
1561 bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1562 L00$_stacktrace_remove_stackframeinfo:
1564 addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1566 lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1570 .lazy_symbol_pointer
1571 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1572 .indirect_symbol _stacktrace_remove_stackframeinfo
1573 .long dyld_stub_binding_helper
1576 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1578 L_exceptions_get_and_clear_exception$stub:
1579 .indirect_symbol _exceptions_get_and_clear_exception
1581 bcl 20,31,L00$_exceptions_get_and_clear_exception
1582 L00$_exceptions_get_and_clear_exception:
1584 addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
1586 lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
1590 .lazy_symbol_pointer
1591 L_exceptions_get_and_clear_exception$lazy_ptr:
1592 .indirect_symbol _exceptions_get_and_clear_exception
1593 .long dyld_stub_binding_helper
1596 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1598 L_exceptions_asm_new_abstractmethoderror$stub:
1599 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1601 bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
1602 L00$_exceptions_asm_new_abstractmethoderror:
1604 addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
1606 lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
1610 .lazy_symbol_pointer
1611 L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
1612 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1613 .long dyld_stub_binding_helper
1616 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1618 L_patcher_wrapper$stub:
1619 .indirect_symbol _patcher_wrapper
1621 bcl 20,31,L00$_patcher_wrapper
1622 L00$_patcher_wrapper:
1624 addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
1626 lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
1630 .lazy_symbol_pointer
1631 L_patcher_wrapper$lazy_ptr:
1632 .indirect_symbol _patcher_wrapper
1633 .long dyld_stub_binding_helper
1636 # if defined(ENABLE_REPLACEMENT)
1638 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1641 .indirect_symbol _replace_me
1643 bcl 20,31,L00$_replace_me
1646 addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1648 lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1652 .lazy_symbol_pointer
1653 L_replace_me$lazy_ptr:
1654 .indirect_symbol _replace_me
1655 .long dyld_stub_binding_helper
1658 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1660 L_replace_build_execution_state$stub:
1661 .indirect_symbol _replace_build_execution_state
1663 bcl 20,31,L00$_replace_build_execution_state
1664 L00$_replace_build_execution_state:
1666 addis r11,r11,ha16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)
1668 lwzu r12,lo16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)(r11)
1672 .lazy_symbol_pointer
1673 L_replace_build_execution_state$lazy_ptr:
1674 .indirect_symbol _replace_build_execution_state
1675 .long dyld_stub_binding_helper
1678 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1680 L_replace_free_safestack$stub:
1681 .indirect_symbol _replace_free_safestack
1683 bcl 20,31,L00$_replace_free_safestack
1684 L00$_replace_free_safestack:
1686 addis r11,r11,ha16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)
1688 lwzu r12,lo16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)(r11)
1692 .lazy_symbol_pointer
1693 L_replace_free_safestack$lazy_ptr:
1694 .indirect_symbol _replace_free_safestack
1695 .long dyld_stub_binding_helper
1697 # endif /* ENABLE_REPLACEMENT */
1699 #endif /* defined(__DARWIN__) */
1702 /* disable exec-stacks ********************************************************/
1704 #if defined(__linux__) && defined(__ELF__)
1705 .section .note.GNU-stack,"",%progbits
1710 * These are local overrides for various environment variables in Emacs.
1711 * Please do not remove this and leave it at the end of the file, where
1712 * Emacs will automagically detect them.
1713 * ---------------------------------------------------------------------
1716 * indent-tabs-mode: t
1720 * vim:noexpandtab:sw=4:ts=4: