1 /* src/vm/jit/powerpc64/asmpart.S - Java-C interface functions for PowerPC
3 Copyright (C) 1996-2005, 2006 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 Contact: cacao@cacaojvm.org
29 Changes: Christian Thalinger
32 $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
42 #include "vm/jit/abi-asm.h"
43 #include "vm/jit/methodheader.h"
44 #include "vm/jit/powerpc64/offsets.h"
52 /* export functions ***********************************************************/
55 .globl asm_vm_call_method
56 .globl asm_vm_call_method_int
57 .globl asm_vm_call_method_long
58 .globl asm_vm_call_method_float
59 .globl asm_vm_call_method_double
61 .globl .asm_vm_call_method
62 .globl .asm_vm_call_method_int
63 .globl .asm_vm_call_method_long
64 .globl .asm_vm_call_method_float
65 .globl .asm_vm_call_method_double
67 .globl asm_vm_call_method_exception_handler
69 .globl asm_call_jit_compiler
71 .globl asm_handle_nat_exception
72 .globl asm_handle_exception
74 .globl asm_abstractmethoderror
76 .globl asm_patcher_wrapper
78 #if defined(ENABLE_REPLACEMENT)
79 .globl asm_replacement_out
80 .globl .asm_replacement_in
83 .globl .asm_cacheflush /* no function descriptor needed, only called direct */
84 .globl asm_criticalsections
85 .globl .asm_getclassvalues_atomic
88 /* asm_vm_call_method **********************************************************
90 * This function calls a Java-method (which possibly needs compilation) *
91 * with up to 4 address parameters. *
93 * This functions calls the JIT-compiler which eventually translates the *
94 * method into machine code. *
97 * javaobject_header *asm_calljavamethod (methodinfo *m, *
98 * void *arg1, void *arg2, void *arg3, void *arg4); *
100 *******************************************************************************/
101 /* this is the method header see src/vm/jit/methodheader.h */
105 .quad 0 /* catch type all */
106 .quad 0 /* handler pc */
108 .quad 0 /* start pc */
109 .long 1 /* extable size */
110 .long 0 /* ALIGNMENT PADDING */
111 .quad 0 /* line number table start */
112 .quad 0 /* line number table size */
113 .long 0 /* ALIGNMENT PADDING */
114 .long 0 /* fltsave */
115 .long 0 /* intsave */
118 .long 0 /* frame size */
119 .quad 0 /* codeinfo pointer */
126 asm_vm_call_method_int:
127 asm_vm_call_method_long:
128 asm_vm_call_method_float:
129 asm_vm_call_method_double:
130 .quad .asm_vm_call_method,.TOC.@tocbase,0
132 .size asm_vm_call_method, 24
133 .type .asm_vm_call_method,@function
134 .globl .asm_vm_call_method
137 .globl asm_vm_call_method
141 .asm_vm_call_method_int:
142 .asm_vm_call_method_long:
143 .asm_vm_call_method_float:
144 .asm_vm_call_method_double:
146 std r0,LA_LR_OFFSET(sp)
149 std s0,8*8(sp) /* save used callee saved registers */
150 std a0,9*8(sp) /* save method pointer for compiler */
152 #if defined(__DARWIN__)
153 std itmp1,10*8(sp) /* register r11 is callee saved */
155 std pv,11*8(sp) /* save PV register */
157 std itmp3,12*8(sp) /* registers r14-r31 are callee saved */
158 stfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
161 #if defined(__DARWIN__)
177 SAVE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
180 mr itmp2,a1 /* arg count */
181 mr itmp1,a2 /* pointer to arg block */
183 mr t4,itmp2 /* save argument count */
184 mr t5,itmp1 /* save argument block pointer */
186 mr s0,sp /* save current sp to s0 */
188 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
189 addi itmp2,itmp2,1 /* initialize argument count */
190 li t0,0 /* initialize integer argument counter */
191 li t1,0 /* initialize float argument counter */
192 li t6,0 /* initialize integer register counter */
193 li t3,8 /* initialize PA counter*/
196 addi itmp1,itmp1,sizevmarg /* goto next argument block */
197 addi itmp2,itmp2,-1 /* argument count - 1 */
199 beq L_register_copy_done
201 addi t3,t3,-1 /* uses a PA slot */
202 lwz itmp3,offvmargtype+4(itmp1)
203 andi. r0,itmp3,0x0002 /* is this a float/double type? */
204 bne L_register_handle_float
206 L_register_handle_int:
207 cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
208 beq L_register_copy /* registers? yes, next loop */
210 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
211 bne L_register_handle_long
213 #if defined(__DARWIN__)
214 #error "FIXME for darwin"
216 lis itmp3,L_jumptable_int@highest /* load 64bit address */
217 ori itmp3,itmp3,L_jumptable_int@higher
218 rldicr itmp3,itmp3,32,31
219 oris itmp3,itmp3,L_jumptable_int@h
220 ori itmp3,itmp3,L_jumptable_int@l
222 b L_register_do_copy_longint
224 L_register_handle_long:
226 #if defined(__DARWIN__)
227 #error "FIXME for darwin"
229 lis itmp3,L_jumptable_long@highest /* load 64bit address */
230 ori itmp3,itmp3,L_jumptable_long@higher
231 rldicr itmp3,itmp3,32,31
232 oris itmp3,itmp3,L_jumptable_long@h
233 ori itmp3,itmp3,L_jumptable_long@l
236 L_register_do_copy_longint:
237 slwi t2,t6,3 /* multiple of 8-bytes */
238 add itmp3,itmp3,t2 /* calculate address of jumptable */
239 ld itmp3,0(itmp3) /* load function address */
241 addi t0,t0,1 /* integer argument counter */
242 addi t6,t6,1 /* integer argument register counter */
245 L_register_handle_float:
246 cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
247 beq L_register_copy /* registers? yes, next loop */
249 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
250 bne L_register_handle_double
252 #if defined(__DARWIN__)
253 #error "FIXME for darwin"
255 lis itmp3,L_jumptable_float@highest /* load 64bit address */
256 ori itmp3,itmp3,L_jumptable_float@higher
257 rldicr itmp3,itmp3,32,31
258 oris itmp3,itmp3,L_jumptable_float@h
259 ori itmp3,itmp3,L_jumptable_float@l
261 b L_register_do_copy_floatdouble
263 L_register_handle_double:
265 #if defined(__DARWIN__)
266 #error "FIXME for darwin"
268 lis itmp3,L_jumptable_double@highest /* load 64bit address */
269 ori itmp3,itmp3,L_jumptable_double@higher
270 rldicr itmp3,itmp3,32,31
271 oris itmp3,itmp3,L_jumptable_double@h
272 ori itmp3,itmp3,L_jumptable_double@l
276 L_register_do_copy_floatdouble:
278 slwi t2,t1,3 /* multiple of 8-bytes */
279 add itmp3,itmp3,t2 /* calculate address of jumptable */
280 ld itmp3,0(itmp3) /* load function address */
282 addi t1,t1,1 /* float argument counter */
283 mr. t3,t3 /* are we still in PA ? */
284 blt L_float_not_uses_PA
285 addi t6,t6,1 /* if so it uses an interger arg reg */
290 L_register_copy_done:
291 subi sp,sp,PA_SIZE /* PA_SIZE are used by definition */
292 /* calculate remaining arguments */
293 sub itmp3,t4,t0 /* - integer arguments in registers */
294 sub itmp3,itmp3,t1 /* - float arguments in registers */
296 beq L_stack_copy_done
298 mr itmp2,t4 /* restore argument count */
299 mr itmp1,t5 /* restore argument block pointer */
301 slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
302 addi t4,t4,LA_SIZE /* add size of linkage area */
305 mr t6,sp /* use t6 as temporary sp */
306 addi t6,t6,LA_SIZE /* skip linkage area */
308 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
309 addi itmp2,itmp2,1 /* initialize argument count */
310 li t3,8 /* initialize PA counter */
311 addi t6,t6,-8 /* make code simpler */
314 addi itmp1,itmp1,sizevmarg /* goto next argument block */
315 addi itmp2,itmp2,-1 /* argument count - 1 */
317 beq L_stack_copy_done
318 addi t6,t6,8 /* increase stack */
321 lwz itmp3,offvmargtype+4(itmp1)
322 andi. r0,itmp3,0x0002 /* is this a float/double type? */
323 bne L_stack_handle_float
326 addi t0,t0,-1 /* arguments assigned to registers */
328 bge L_stack_copy_loop
330 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
331 bne L_stack_handle_long
333 lwa itmp3,offvmargdata+4(itmp1) /* get integer argument */
334 std itmp3,0(t6) /* and store it on the stack */
338 ld itmp3,offvmargdata+0(itmp1) /* get long argument */
339 std itmp3,0(t6) /* and store it on the stack */
342 L_stack_handle_float:
343 addi t1,t1,-1 /* arguments assigned to registers */
345 bge L_stack_copy_loop
347 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
348 bne L_stack_handle_double
350 lfs ftmp3,offvmargdata(itmp1) /* get float argument */
351 stfd ftmp3,0(t6) /* and store it on the stack */
354 L_stack_handle_double:
355 lfd ftmp3,offvmargdata(itmp1) /* get double argument */
356 stfd ftmp3,0(t6) /* and store it on the stack */
360 ld itmp1,9*8(s0) /* pass method pointer via tmp1 */
362 #if defined(__DARWIN__)
363 addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
364 la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
366 lis mptr,L_asm_call_jit_compiler@highest /* load 64bit address */
367 ori mptr,mptr,L_asm_call_jit_compiler@higher
368 rldicr mptr,mptr,32,31
369 oris mptr,mptr,L_asm_call_jit_compiler@h
370 ori mptr,mptr,L_asm_call_jit_compiler@l
380 #if defined(__DARWIN__)
381 addi pv,itmp1,lo16(.asm_vm_call_method - 1b)
383 addi pv,itmp1,(.asm_vm_call_method - 1b)@l
386 L_asm_vm_call_method_return:
387 mr sp,s0 /* restore the function's sp */
389 ld s0,8*8(sp) /* restore used callee saved registers */
391 #if defined(__DARWIN__)
392 lwz itmp1,10*4(sp) /* register r11 is callee saved */
394 ld pv,11*8(sp) /* save PV register */
397 lfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
400 #if defined(__DARWIN__)
416 RESTORE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
419 ld r0,40*8+LA_LR_OFFSET(r1)
424 asm_vm_call_method_exception_handler:
426 bl builtin_throw_exception
427 b L_asm_vm_call_method_return
447 lwa a0,offvmargdata+4(itmp1)
450 lwa a1,offvmargdata+4(itmp1)
453 lwa a2,offvmargdata+4(itmp1)
456 lwa a3,offvmargdata+4(itmp1)
459 lwa a4,offvmargdata+4(itmp1)
462 lwa a5,offvmargdata+4(itmp1)
465 lwa a6,offvmargdata+4(itmp1)
468 lwa a7,offvmargdata+4(itmp1)
489 ld a0,offvmargdata(itmp1)
492 ld a1,offvmargdata(itmp1)
495 ld a2,offvmargdata(itmp1)
498 ld a3,offvmargdata(itmp1)
501 ld a4,offvmargdata(itmp1)
504 ld a5,offvmargdata(itmp1)
507 ld a6,offvmargdata(itmp1)
510 ld a7,offvmargdata(itmp1)
535 lfs fa0,offvmargdata(itmp1)
538 lfs fa1,offvmargdata(itmp1)
541 lfs fa2,offvmargdata(itmp1)
544 lfs fa3,offvmargdata(itmp1)
547 lfs fa4,offvmargdata(itmp1)
550 lfs fa5,offvmargdata(itmp1)
553 lfs fa6,offvmargdata(itmp1)
556 lfs fa7,offvmargdata(itmp1)
559 lfs fa8,offvmargdata(itmp1)
562 lfs fa9,offvmargdata(itmp1)
565 lfs fa10,offvmargdata(itmp1)
568 lfs fa11,offvmargdata(itmp1)
571 lfs fa12,offvmargdata(itmp1)
596 lfd fa0,offvmargdata(itmp1)
599 lfd fa1,offvmargdata(itmp1)
602 lfd fa2,offvmargdata(itmp1)
605 lfd fa3,offvmargdata(itmp1)
608 lfd fa4,offvmargdata(itmp1)
611 lfd fa5,offvmargdata(itmp1)
614 lfd fa6,offvmargdata(itmp1)
617 lfd fa7,offvmargdata(itmp1)
620 lfd fa8,offvmargdata(itmp1)
623 lfd fa9,offvmargdata(itmp1)
626 lfd fa10,offvmargdata(itmp1)
629 lfd fa11,offvmargdata(itmp1)
632 lfd fa12,offvmargdata(itmp1)
636 /* asm_call_jit_compiler *******************************************************
638 Invokes the compiler for untranslated JavaVM methods.
640 *******************************************************************************/
642 asm_call_jit_compiler:
643 L_asm_call_jit_compiler: /* required for PIC code */
645 std r0,LA_LR_OFFSET(sp) /* save return address */
646 stdu r1,-(LA_SIZE+PA_SIZE+ARG_CNT*8)(sp)
648 #if defined(__DARWIN__)
649 stw a0,LA_SIZE+(5+0)*8(r1)
650 stw a1,LA_SIZE+(5+1)*8(r1)
651 stw a2,LA_SIZE+(5+2)*8(r1)
652 stw a3,LA_SIZE+(5+3)*8(r1)
653 stw a4,LA_SIZE+(5+4)*8(r1)
654 stw a5,LA_SIZE+(5+5)*8(r1)
655 stw a6,LA_SIZE+(5+6)*8(r1)
656 stw a7,LA_SIZE+(5+7)*8(r1)
658 stfd fa0,LA_SIZE+(5+8)*8(r1)
659 stfd fa1,LA_SIZE+(5+10)*8(r1)
660 stfd fa2,LA_SIZE+(5+12)*8(r1)
661 stfd fa3,LA_SIZE+(5+14)*8(r1)
662 stfd fa4,LA_SIZE+(5+16)*8(r1)
663 stfd fa5,LA_SIZE+(5+18)*8(r1)
664 stfd fa6,LA_SIZE+(5+20)*8(r1)
665 stfd fa7,LA_SIZE+(5+22)*8(r1)
666 stfd fa8,LA_SIZE+(5+24)*8(r1)
667 stfd fa9,LA_SIZE+(5+26)*8(r1)
668 stfd fa10,LA_SIZE+(5+28)*8(r1)
669 stfd fa11,LA_SIZE+(5+30)*8(r1)
670 stfd fa12,LA_SIZE+(5+32)*8(r1)
672 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
677 addi a2,sp,(LA_SIZE + PA_SIZE+ ARG_CNT*8)
678 ld a3,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
680 ori r0,r0,0 /* nop needed after jump to function desc. */
681 mr pv,v0 /* move address to pv register */
683 #if defined(__DARWIN__)
684 lwz a0,LA_SIZE+(+5+0)*8(r1)
685 lwz a1,LA_SIZE+(+5+1)*8(r1)
686 lwz a2,LA_SIZE+(+5+2)*8(r1)
687 lwz a3,LA_SIZE+(+5+3)*8(r1)
688 lwz a4,LA_SIZE+(+5+4)*8(r1)
689 lwz a5,LA_SIZE+(+5+5)*8(r1)
690 lwz a6,LA_SIZE+(+5+6)*8(r1)
691 lwz a7,LA_SIZE+(+5+7)*8(r1)
693 lfd fa0,LA_SIZE+(+5+8)*8(r1)
694 lfd fa1,LA_SIZE+(+5+10)*8(r1)
695 lfd fa2,LA_SIZE+(+5+12)*8(r1)
696 lfd fa3,LA_SIZE+(+5+14)*8(r1)
697 lfd fa4,LA_SIZE+(+5+16)*8(r1)
698 lfd fa5,LA_SIZE+(+5+18)*8(r1)
699 lfd fa6,LA_SIZE+(+5+20)*8(r1)
700 lfd fa7,LA_SIZE+(+5+22)*8(r1)
701 lfd fa8,LA_SIZE+(+5+24)*8(r1)
702 lfd fa9,LA_SIZE+(+5+26)*8(r1)
703 lfd fa10,LA_SIZE+(+5+28)*8(r1)
704 lfd fa11,LA_SIZE+(+5+30)*8(r1)
705 lfd fa12,LA_SIZE+(+5+32)*8(r1)
707 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
710 ld itmp1,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
713 addi sp,sp,(LA_SIZE + PA_SIZE + ARG_CNT*8)
715 mr. pv,pv /* test for exception */
716 beq L_asm_call_jit_compiler_exception
718 mtctr pv /* move method address to control reg */
719 bctr /* and call the Java method */
721 L_asm_call_jit_compiler_exception:
723 std r0,LA_LR_OFFSET(sp)
724 stdu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
725 bl exceptions_get_and_clear_exception
726 ld xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
728 addi sp,sp,LA_SIZE_ALIGNED
730 mr xptr,v0 /* get exception */
731 addi xpc,xpc,-4 /* exception address is ra - 4 */
732 b L_asm_handle_nat_exception
735 /********************* function asm_handle_exception ***************************
737 * This function handles an exception. It does not use the usual calling *
738 * conventions. The exception pointer is passed in REG_ITMP1 and the *
739 * pc from the exception raising position is passed in REG_ITMP2. It searches *
740 * the local exception table for a handler. If no one is found, it unwinds *
741 * stacks and continues searching the callers. *
743 * void asm_handle_exception (exceptionptr, exceptionpc); *
745 *******************************************************************************/
747 asm_handle_nat_exception:
748 L_asm_handle_nat_exception: /* required for PIC code */
749 L_asm_handle_exception_stack_loop:
751 addi sp,sp,-(LA_SIZE+PA_SIZE+((4+6)*8)) /* allocate stack (+4 for darwin) */
752 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
753 std xpc,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* save exception pc */
754 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* save return address */
756 std itmp3,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* save maybe-leaf flag (cleared) */
758 mr a0,r0 /* pass return address */
759 bl md_codegen_get_pv_from_pc /* get PV from RA */
760 std v0,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
762 ld a0,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* pass xptr */
763 ld a1,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* pass xpc */
764 ld a2,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* pass PV (v0 == a0) */
765 addi a3,sp,LA_SIZE+PA_SIZE+((4+6)*8) /* pass Java SP */
767 b L_asm_handle_exception_continue
770 asm_handle_exception:
771 L_asm_handle_exception: /* required for PIC code */
772 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
774 #if defined(__DARWIN__)
776 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
777 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
780 addi sp,sp,-(LA_SIZE+PA_SIZE+(4+6)*8) /* allocate stack */
781 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
782 std pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
783 mflr r0 /* save return address */
784 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp)
786 std t0, LA_SIZE+PA_SIZE+(4+4)*8(sp) /* maybe-leaf flag */
788 mr a0,xptr /* pass exception pointer */
789 mr a1,xpc /* pass exception pc */
790 mr a2,pv /* pass data segment pointer */
791 addi a3,sp,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*8
794 L_asm_handle_exception_continue:
795 bl exceptions_handle_exception
798 beq L_asm_handle_exception_not_catched
800 mr xpc,v0 /* move handlerpc into xpc */
801 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
802 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
803 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
805 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
806 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
809 beq L_asm_handle_exception_no_leaf
811 #if defined(__DARWIN__)
813 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
814 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
817 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
819 L_asm_handle_exception_no_leaf:
820 mtctr xpc /* jump to the handler */
823 L_asm_handle_exception_not_catched:
824 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
825 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
826 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
828 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
829 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
832 beq L_asm_handle_exception_no_leaf_stack
834 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
835 li t0,0 /* clear the maybe-leaf flag */
837 L_asm_handle_exception_no_leaf_stack:
838 lwz t1,FrameSize(pv) /* get frame size */
839 add t1,sp,t1 /* pointer to save area */
841 lwz t2,IsLeaf(pv) /* is leaf procedure */
843 bne L_asm_handle_exception_no_ra_restore
845 ld r0,LA_LR_OFFSET(t1) /* restore ra */
848 L_asm_handle_exception_no_ra_restore:
849 mflr xpc /* the new xpc is ra */
850 mr t4,xpc /* save RA */
851 lwz t2,IntSave(pv) /* t1 = saved int register count */
854 mflr t3 /* t3 = current pc */
855 #if defined(__DARWIN__)
856 addi t2,t2,lo16(ex_int2-ex_int1)
858 addi t3,t3,(ex_int2-ex_int1)@l
860 slwi t2,t2,2 /* t2 = register count * 4 */
861 subf t3,t2,t3 /* t3 = IntSave - t2 */
876 subf t1,t2,t1 /* t1 = t1 - register count * 4 */
881 #if defined(__DARWIN__)
882 addi t2,t2,lo16(ex_flt2-ex_flt1)
884 addi t3,t3,(ex_flt2-ex_flt1)@l
886 slwi t2,t2,2 /* t2 = register count * 4 */
887 subf t3,t2,t3 /* t3 = FltSave - t2 */
903 mtlr t4 /* restore RA */
905 add sp,sp,t1 /* unwind stack */
906 b L_asm_handle_exception_stack_loop
909 /* asm_abstractmethoderror *****************************************************
911 Creates and throws an AbstractMethodError.
913 *******************************************************************************/
915 asm_abstractmethoderror:
917 stw r0,LA_LR_OFFSET(sp)
918 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
919 addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */
920 mr a1,r0 /* pass exception address */
921 bl exceptions_asm_new_abstractmethoderror
922 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
923 mtlr r0 /* restore return address */
924 addi sp,sp,LA_SIZE_ALIGNED
926 mr xptr,v0 /* get exception pointer */
927 mr xpc,r0 /* we can't use r0 directly in addi */
928 addi xpc,xpc,-4 /* exception address is ra - 4 */
929 b L_asm_handle_nat_exception
932 /* asm_patcher_wrapper *********************************************************
937 40 return address into JIT code (patch position)
938 32 pointer to virtual java_objectheader
939 24 machine code (which is patched back later)
940 16 unresolved class/method/field reference
941 8 data segment displacement from load instructions
942 0 patcher function pointer to call (pv is saved here afterwards)
944 *******************************************************************************/
947 mflr r0 /* get Java return address (leaf) */
948 std r0,6*8(sp) /* store it in the stub stackframe */
949 /* keep stack 16-bytes aligned: 6+1+37 = 44 */
950 stdu sp,-(LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8)(sp)
952 #if defined(__DARWIN__)
953 stw a0,LA_SIZE+(5+0)*8(r1) /* save argument registers */
954 stw a1,LA_SIZE+(5+1)*8(r1) /* preserve linkage area (24 bytes) */
955 stw a2,LA_SIZE+(5+2)*8(r1) /* and 4 bytes for 4 argument */
956 stw a3,LA_SIZE+(5+3)*8(r1)
957 stw a4,LA_SIZE+(5+4)*8(r1)
958 stw a5,LA_SIZE+(5+5)*8(r1)
959 stw a6,LA_SIZE+(5+6)*8(r1)
960 stw a7,LA_SIZE+(5+7)*8(r1)
962 stfd fa0,LA_SIZE+(5+8)*8(sp)
963 stfd fa1,LA_SIZE+(5+10)*8(sp)
964 stfd fa2,LA_SIZE+(5+12)*8(sp)
965 stfd fa3,LA_SIZE+(5+14)*8(sp)
966 stfd fa4,LA_SIZE+(5+16)*8(sp)
967 stfd fa5,LA_SIZE+(5+18)*8(sp)
968 stfd fa6,LA_SIZE+(5+20)*8(sp)
969 stfd fa7,LA_SIZE+(5+22)*8(sp)
970 stfd fa8,LA_SIZE+(5+24)*8(sp)
971 stfd fa9,LA_SIZE+(5+26)*8(sp)
972 stfd fa10,LA_SIZE+(5+28)*8(sp)
973 stfd fa11,LA_SIZE+(5+30)*8(sp)
974 stfd fa12,LA_SIZE+(5+32)*8(sp) /* XXX */
976 stw t0,LA_SIZE+(+5+33)*8(r1)
977 stw t1,LA_SIZE+(+5+34)*8(r1)
978 stw t2,LA_SIZE+(+5+35)*8(r1)
979 stw t3,LA_SIZE+(+5+36)*8(r1)
980 stw t4,LA_SIZE+(+5+37)*8(r1)
981 stw t5,LA_SIZE+(+5+38)*8(r1)
982 stw t6,LA_SIZE+(+5+39)*8(r1)
983 stw t7,LA_SIZE+(+5+40)*8(r1)
985 stfd ft0,LA_SIZE+(+5+42)*8(r1)
986 stfd ft1,LA_SIZE+(+5+44)*8(r1)
987 stfd ft2,LA_SIZE+(+5+46)*8(r1)
988 stfd ft3,LA_SIZE+(+5+48)*8(r1)
989 stfd ft4,LA_SIZE+(+5+50)*8(r1)
990 stfd ft5,LA_SIZE+(+5+52)*8(r1)
992 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* save 8 int/8 float arguments */
993 SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
996 std itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
997 std itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
998 std pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
1000 addi a0,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8 /* pass SP of patcher stub */
1001 mr a1,pv /* pass PV */
1002 mr a2,r0 /* pass RA (correct for leafs) */
1004 std v0,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp) /* save return value */
1006 #if defined(__DARWIN__)
1007 lwz a0,LA_SIZE+(5+0)*8(r1)
1008 lwz a1,LA_SIZE+(5+1)*8(r1)
1009 lwz a2,LA_SIZE+(5+2)*8(r1)
1010 lwz a3,LA_SIZE+(5+3)*8(r1)
1011 lwz a4,LA_SIZE+(5+4)*8(r1)
1012 lwz a5,LA_SIZE+(5+5)*8(r1)
1013 lwz a6,LA_SIZE+(5+6)*8(r1)
1014 lwz a7,LA_SIZE+(5+7)*8(r1)
1016 lfd fa0,LA_SIZE+(5+8)*8(sp)
1017 lfd fa1,LA_SIZE+(5+10)*8(sp)
1018 lfd fa2,LA_SIZE+(5+12)*8(sp)
1019 lfd fa3,LA_SIZE+(5+14)*8(sp)
1020 lfd fa4,LA_SIZE+(5+16)*8(sp)
1021 lfd fa5,LA_SIZE+(5+18)*8(sp)
1022 lfd fa6,LA_SIZE+(5+20)*8(sp)
1023 lfd fa7,LA_SIZE+(5+22)*8(sp)
1024 lfd fa8,LA_SIZE+(5+24)*8(sp)
1025 lfd fa9,LA_SIZE+(5+26)*8(sp)
1026 lfd fa10,LA_SIZE+(5+28)*8(sp)
1027 lfd fa11,LA_SIZE+(5+30)*8(sp)
1028 lfd fa12,LA_SIZE+(5+32)*8(sp)
1030 lwz t0,LA_SIZE+(+5+33)*8(r1)
1031 lwz t1,LA_SIZE+(+5+34)*8(r1)
1032 lwz t2,LA_SIZE+(+5+35)*8(r1)
1033 lwz t3,LA_SIZE+(+5+36)*8(r1)
1034 lwz t4,LA_SIZE+(+5+37)*8(r1)
1035 lwz t5,LA_SIZE+(+5+38)*8(r1)
1036 lwz t6,LA_SIZE+(+5+39)*8(r1)
1037 lwz t7,LA_SIZE+(+5+40)*8(r1)
1039 lfd ft0,LA_SIZE+(+5+42)*8(r1)
1040 lfd ft1,LA_SIZE+(+5+44)*8(r1)
1041 lfd ft2,LA_SIZE+(+5+46)*8(r1)
1042 lfd ft3,LA_SIZE+(+5+48)*8(r1)
1043 lfd ft4,LA_SIZE+(+5+50)*8(r1)
1044 lfd ft5,LA_SIZE+(+5+52)*8(r1)
1046 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* restore 8 int/8 float args */
1047 RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
1050 ld itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
1051 ld itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
1052 ld pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
1053 ld itmp3,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp)
1055 ld r0,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+6*8(sp) /* restore RA */
1058 mr. itmp3,itmp3 /* check for an exception */
1059 bne L_asm_patcher_wrapper_exception
1061 /* get return address (into JIT code) */
1062 ld itmp3,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1064 /* remove stack frame + patcher stub stack */
1065 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1068 bctr /* jump to new patched code */
1070 L_asm_patcher_wrapper_exception:
1071 mr xptr,itmp3 /* get exception */
1072 ld xpc,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1073 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1074 b L_asm_handle_exception
1076 #if defined(ENABLE_REPLACEMENT)
1078 /* asm_replacement_out *********************************************************
1080 This code is jumped to from the replacement-out stubs that are executed
1081 when a thread reaches an activated replacement point.
1083 The purpose of asm_replacement_out is to read out the parts of the
1084 execution state that cannot be accessed from C code, store this state,
1085 and then call the C function replace_me.
1088 16 start of stack inside method to replace
1089 0 rplpoint * info on the replacement point that was reached
1091 NOTE: itmp3 has been clobbered by the replacement-out stub!
1093 *******************************************************************************/
1095 /* some room to accomodate changes of the stack frame size during replacement */
1096 /* XXX we should find a cleaner solution here */
1097 #define REPLACEMENT_ROOM 512
1099 asm_replacement_out:
1100 /* create stack frame */
1101 addi sp,sp,-(sizeexecutionstate + REPLACEMENT_ROOM) /* XXX align */
1103 /* save link register */
1106 /* save registers in execution state */
1107 stw r0 ,( 0*8+offes_intregs)(sp)
1108 stw r1 ,( 1*8+offes_intregs)(sp)
1109 stw r2 ,( 2*8+offes_intregs)(sp)
1110 stw r3 ,( 3*8+offes_intregs)(sp)
1111 stw r4 ,( 4*8+offes_intregs)(sp)
1112 stw r5 ,( 5*8+offes_intregs)(sp)
1113 stw r6 ,( 6*8+offes_intregs)(sp)
1114 stw r7 ,( 7*8+offes_intregs)(sp)
1115 stw r8 ,( 8*8+offes_intregs)(sp)
1116 stw r9 ,( 9*8+offes_intregs)(sp)
1117 stw r10,(10*8+offes_intregs)(sp)
1118 stw r11,(11*8+offes_intregs)(sp)
1119 stw r12,(12*8+offes_intregs)(sp)
1120 stw r13,(13*8+offes_intregs)(sp)
1121 stw r14,(14*8+offes_intregs)(sp)
1122 stw r15,(15*8+offes_intregs)(sp)
1123 stw r16,(16*8+offes_intregs)(sp) /* link register */
1124 stw r17,(17*8+offes_intregs)(sp)
1125 stw r18,(18*8+offes_intregs)(sp)
1126 stw r19,(19*8+offes_intregs)(sp)
1127 stw r20,(20*8+offes_intregs)(sp)
1128 stw r21,(21*8+offes_intregs)(sp)
1129 stw r22,(22*8+offes_intregs)(sp)
1130 stw r23,(23*8+offes_intregs)(sp)
1131 stw r24,(24*8+offes_intregs)(sp)
1132 stw r25,(25*8+offes_intregs)(sp)
1133 stw r26,(26*8+offes_intregs)(sp)
1134 stw r27,(27*8+offes_intregs)(sp)
1135 stw r28,(28*8+offes_intregs)(sp)
1136 stw r29,(29*8+offes_intregs)(sp)
1137 stw r30,(30*8+offes_intregs)(sp)
1138 stw r31,(31*8+offes_intregs)(sp)
1140 stfd fr0 ,( 0*8+offes_fltregs)(sp)
1141 stfd fr1 ,( 1*8+offes_fltregs)(sp)
1142 stfd fr2 ,( 2*8+offes_fltregs)(sp)
1143 stfd fr3 ,( 3*8+offes_fltregs)(sp)
1144 stfd fr4 ,( 4*8+offes_fltregs)(sp)
1145 stfd fr5 ,( 5*8+offes_fltregs)(sp)
1146 stfd fr6 ,( 6*8+offes_fltregs)(sp)
1147 stfd fr7 ,( 7*8+offes_fltregs)(sp)
1148 stfd fr8 ,( 8*8+offes_fltregs)(sp)
1149 stfd fr9 ,( 9*8+offes_fltregs)(sp)
1150 stfd fr10,(10*8+offes_fltregs)(sp)
1151 stfd fr11,(11*8+offes_fltregs)(sp)
1152 stfd fr12,(12*8+offes_fltregs)(sp)
1153 stfd fr13,(13*8+offes_fltregs)(sp)
1154 stfd fr14,(14*8+offes_fltregs)(sp)
1155 stfd fr15,(15*8+offes_fltregs)(sp)
1156 stfd fr16,(16*8+offes_fltregs)(sp)
1157 stfd fr17,(17*8+offes_fltregs)(sp)
1158 stfd fr18,(18*8+offes_fltregs)(sp)
1159 stfd fr19,(19*8+offes_fltregs)(sp)
1160 stfd fr20,(20*8+offes_fltregs)(sp)
1161 stfd fr21,(21*8+offes_fltregs)(sp)
1162 stfd fr22,(22*8+offes_fltregs)(sp)
1163 stfd fr23,(23*8+offes_fltregs)(sp)
1164 stfd fr24,(24*8+offes_fltregs)(sp)
1165 stfd fr25,(25*8+offes_fltregs)(sp)
1166 stfd fr26,(26*8+offes_fltregs)(sp)
1167 stfd fr27,(27*8+offes_fltregs)(sp)
1168 stfd fr28,(28*8+offes_fltregs)(sp)
1169 stfd fr29,(29*8+offes_fltregs)(sp)
1170 stfd fr30,(30*8+offes_fltregs)(sp)
1171 stfd fr31,(31*8+offes_fltregs)(sp)
1173 /* calculate sp of method */
1174 addi itmp1,sp,(sizeexecutionstate + REPLACEMENT_ROOM + 4*4)
1175 stw itmp1,(offes_sp)(sp)
1178 stw pv,(offes_pv)(sp)
1180 /* call replace_me */
1181 lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */
1182 mr a1,sp /* arg1: execution state */
1183 addi sp,sp,-(LA_SIZE_ALIGNED)
1184 b replace_me /* call C function replace_me */
1186 /* asm_replacement_in **********************************************************
1188 This code writes the given execution state and jumps to the replacement
1191 This function never returns!
1193 NOTE: itmp3 is not restored!
1196 void asm_replacement_in(executionstate *es);
1198 *******************************************************************************/
1200 .asm_replacement_in:
1201 /* a0 == executionstate *es */
1203 /* set new sp and pv */
1204 lwz sp,(offes_sp)(a0)
1205 lwz pv,(offes_pv)(a0)
1207 /* copy registers from execution state */
1208 lwz r0 ,( 0*8+offes_intregs)(a0)
1210 /* r2 is reserved */
1211 /* a0 is loaded below */
1212 lwz r4 ,( 4*8+offes_intregs)(a0)
1213 lwz r5 ,( 5*8+offes_intregs)(a0)
1214 lwz r6 ,( 6*8+offes_intregs)(a0)
1215 lwz r7 ,( 7*8+offes_intregs)(a0)
1216 lwz r8 ,( 8*8+offes_intregs)(a0)
1217 lwz r9 ,( 9*8+offes_intregs)(a0)
1218 lwz r10,(10*8+offes_intregs)(a0)
1219 lwz r11,(11*8+offes_intregs)(a0)
1220 lwz r12,(12*8+offes_intregs)(a0)
1222 lwz r14,(14*8+offes_intregs)(a0)
1223 lwz r15,(15*8+offes_intregs)(a0)
1224 lwz r16,(16*8+offes_intregs)(a0) /* link register */
1225 lwz r17,(17*8+offes_intregs)(a0)
1226 lwz r18,(18*8+offes_intregs)(a0)
1227 lwz r19,(19*8+offes_intregs)(a0)
1228 lwz r20,(20*8+offes_intregs)(a0)
1229 lwz r21,(21*8+offes_intregs)(a0)
1230 lwz r22,(22*8+offes_intregs)(a0)
1231 lwz r23,(23*8+offes_intregs)(a0)
1232 lwz r24,(24*8+offes_intregs)(a0)
1233 lwz r25,(25*8+offes_intregs)(a0)
1234 lwz r26,(26*8+offes_intregs)(a0)
1235 lwz r27,(27*8+offes_intregs)(a0)
1236 lwz r28,(28*8+offes_intregs)(a0)
1237 lwz r29,(29*8+offes_intregs)(a0)
1238 lwz r30,(30*8+offes_intregs)(a0)
1239 lwz r31,(31*8+offes_intregs)(a0)
1241 lfd fr0 ,( 0*8+offes_fltregs)(a0)
1242 lfd fr1 ,( 1*8+offes_fltregs)(a0)
1243 lfd fr2 ,( 2*8+offes_fltregs)(a0)
1244 lfd fr3 ,( 3*8+offes_fltregs)(a0)
1245 lfd fr4 ,( 4*8+offes_fltregs)(a0)
1246 lfd fr5 ,( 5*8+offes_fltregs)(a0)
1247 lfd fr6 ,( 6*8+offes_fltregs)(a0)
1248 lfd fr7 ,( 7*8+offes_fltregs)(a0)
1249 lfd fr8 ,( 8*8+offes_fltregs)(a0)
1250 lfd fr9 ,( 9*8+offes_fltregs)(a0)
1251 lfd fr10,(10*8+offes_fltregs)(a0)
1252 lfd fr11,(11*8+offes_fltregs)(a0)
1253 lfd fr12,(12*8+offes_fltregs)(a0)
1254 lfd fr13,(13*8+offes_fltregs)(a0)
1255 lfd fr14,(14*8+offes_fltregs)(a0)
1256 lfd fr15,(15*8+offes_fltregs)(a0)
1257 lfd fr16,(16*8+offes_fltregs)(a0)
1258 lfd fr17,(17*8+offes_fltregs)(a0)
1259 lfd fr18,(18*8+offes_fltregs)(a0)
1260 lfd fr19,(19*8+offes_fltregs)(a0)
1261 lfd fr20,(20*8+offes_fltregs)(a0)
1262 lfd fr21,(21*8+offes_fltregs)(a0)
1263 lfd fr22,(22*8+offes_fltregs)(a0)
1264 lfd fr23,(23*8+offes_fltregs)(a0)
1265 lfd fr24,(24*8+offes_fltregs)(a0)
1266 lfd fr25,(25*8+offes_fltregs)(a0)
1267 lfd fr26,(26*8+offes_fltregs)(a0)
1268 lfd fr27,(27*8+offes_fltregs)(a0)
1269 lfd fr28,(28*8+offes_fltregs)(a0)
1270 lfd fr29,(29*8+offes_fltregs)(a0)
1271 lfd fr30,(30*8+offes_fltregs)(a0)
1272 lfd fr31,(31*8+offes_fltregs)(a0)
1274 /* restore link register */
1280 lwz itmp3,offes_pc(a0)
1284 lwz a0,(3*8+offes_intregs)(a0)
1286 /* jump to new code */
1291 #endif /* defined(ENABLE_REPLACEMENT) */
1293 /* asm_cacheflush **************************************************************
1294 copied from linux/arch/ppc64/kernel/vdso64/cacheflush.S
1295 assumes 128 byte cache line size.
1296 *******************************************************************************/
1298 /* construct the AND mask */
1299 li r6, 0xffffffffffff8000
1300 ori r6,r6,0x000000000000ff80
1326 .asm_getclassvalues_atomic:
1329 lwz r6,offbaseval(r3)
1330 lwz r7,offdiffval(r3)
1331 lwz r8,offbaseval(r4)
1333 stw r6,offcast_super_baseval(r5)
1334 stw r7,offcast_super_diffval(r5)
1335 stw r8,offcast_sub_baseval(r5)
1340 asm_criticalsections:
1341 #if defined(ENABLE_THREADS)
1349 #if defined(__DARWIN__)
1351 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1353 L_builtin_throw_exception$stub:
1354 .indirect_symbol _builtin_throw_exception
1356 bcl 20,31,L00$_builtin_throw_exception
1357 L00$_builtin_throw_exception:
1359 addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1361 lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1365 .lazy_symbol_pointer
1366 L_builtin_throw_exception$lazy_ptr:
1367 .indirect_symbol _builtin_throw_exception
1368 .long dyld_stub_binding_helper
1371 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1373 L_exceptions_handle_exception$stub:
1374 .indirect_symbol _exceptions_handle_exception
1376 bcl 20,31,L00$_exceptions_handle_exception
1377 L00$_exceptions_handle_exception:
1379 addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1381 lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1385 .lazy_symbol_pointer
1386 L_exceptions_handle_exception$lazy_ptr:
1387 .indirect_symbol _exceptions_handle_exception
1388 .long dyld_stub_binding_helper
1391 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1393 L_stacktrace_create_extern_stackframeinfo$stub:
1394 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1396 bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1397 L00$_stacktrace_create_extern_stackframeinfo:
1399 addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1401 lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1405 .lazy_symbol_pointer
1406 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1407 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1408 .long dyld_stub_binding_helper
1411 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1413 L_jit_asm_compile$stub:
1414 .indirect_symbol _jit_asm_compile
1416 bcl 20,31,L00$_jit_asm_compile
1417 L00$_jit_asm_compile:
1419 addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1421 lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1425 .lazy_symbol_pointer
1426 L_jit_asm_compile$lazy_ptr:
1427 .indirect_symbol _jit_asm_compile
1428 .long dyld_stub_binding_helper
1430 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1432 L_stacktrace_remove_stackframeinfo$stub:
1433 .indirect_symbol _stacktrace_remove_stackframeinfo
1435 bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1436 L00$_stacktrace_remove_stackframeinfo:
1438 addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1440 lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1444 .lazy_symbol_pointer
1445 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1446 .indirect_symbol _stacktrace_remove_stackframeinfo
1447 .long dyld_stub_binding_helper
1450 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1452 L_exceptions_get_and_clear_exception$stub:
1453 .indirect_symbol _exceptions_get_and_clear_exception
1455 bcl 20,31,L00$_exceptions_get_and_clear_exception
1456 L00$_exceptions_get_and_clear_exception:
1458 addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
1460 lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
1464 .lazy_symbol_pointer
1465 L_exceptions_get_and_clear_exception$lazy_ptr:
1466 .indirect_symbol _exceptions_get_and_clear_exception
1467 .long dyld_stub_binding_helper
1470 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1472 L_exceptions_asm_new_abstractmethoderror$stub:
1473 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1475 bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
1476 L00$_exceptions_asm_new_abstractmethoderror:
1478 addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
1480 lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
1484 .lazy_symbol_pointer
1485 L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
1486 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1487 .long dyld_stub_binding_helper
1490 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1492 L_patcher_wrapper$stub:
1493 .indirect_symbol _patcher_wrapper
1495 bcl 20,31,L00$_patcher_wrapper
1496 L00$_patcher_wrapper:
1498 addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
1500 lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
1504 .lazy_symbol_pointer
1505 L_patcher_wrapper$lazy_ptr:
1506 .indirect_symbol _patcher_wrapper
1507 .long dyld_stub_binding_helper
1510 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1513 .indirect_symbol _replace_me
1515 bcl 20,31,L00$_replace_me
1518 addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1520 lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1524 .lazy_symbol_pointer
1525 L_replace_me$lazy_ptr:
1526 .indirect_symbol _replace_me
1527 .long dyld_stub_binding_helper
1529 #endif /* defined(__DARWIN__) */
1532 /* Disable exec-stacks, required for Gentoo ***********************************/
1534 #if defined(__GCC__) && defined(__ELF__)
1535 .section .note.GNU-stack,"",@progbits
1540 * These are local overrides for various environment variables in Emacs.
1541 * Please do not remove this and leave it at the end of the file, where
1542 * Emacs will automagically detect them.
1543 * ---------------------------------------------------------------------
1546 * indent-tabs-mode: t
1550 * vim:noexpandtab:sw=4:ts=4: