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 6100 2006-12-01 11:38:47Z tbfg $
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 .globl asm_replacement_out
79 .globl .asm_replacement_in
81 .globl .asm_cacheflush /* no function descriptor needed, only called direct */
82 .globl asm_criticalsections
83 .globl .asm_getclassvalues_atomic
86 /* asm_vm_call_method **********************************************************
88 * This function calls a Java-method (which possibly needs compilation) *
89 * with up to 4 address parameters. *
91 * This functions calls the JIT-compiler which eventually translates the *
92 * method into machine code. *
95 * javaobject_header *asm_calljavamethod (methodinfo *m, *
96 * void *arg1, void *arg2, void *arg3, void *arg4); *
98 *******************************************************************************/
99 /* this is the method header see src/vm/jit/methodheader.h */
103 .quad 0 /* catch type all */
104 .quad 0 /* handler pc */
106 .quad 0 /* start pc */
107 .long 1 /* extable size */
108 .long 0 /* ALIGNMENT PADDING */
109 .quad 0 /* line number table start */
110 .quad 0 /* line number table size */
111 .long 0 /* ALIGNMENT PADDING */
112 .long 0 /* fltsave */
113 .long 0 /* intsave */
116 .long 0 /* frame size */
117 .quad 0 /* codeinfo pointer */
124 asm_vm_call_method_int:
125 asm_vm_call_method_long:
126 asm_vm_call_method_float:
127 asm_vm_call_method_double:
128 .quad .asm_vm_call_method,.TOC.@tocbase,0
130 .size asm_vm_call_method, 24
131 .type .asm_vm_call_method,@function
132 .globl .asm_vm_call_method
135 .globl asm_vm_call_method
139 .asm_vm_call_method_int:
140 .asm_vm_call_method_long:
141 .asm_vm_call_method_float:
142 .asm_vm_call_method_double:
144 std r0,LA_LR_OFFSET(sp)
147 std s0,8*8(sp) /* save used callee saved registers */
148 std a0,9*8(sp) /* save method pointer for compiler */
150 #if defined(__DARWIN__)
151 std itmp1,10*8(sp) /* register r11 is callee saved */
153 std pv,11*8(sp) /* save PV register */
155 std itmp3,12*8(sp) /* registers r14-r31 are callee saved */
156 stfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
159 #if defined(__DARWIN__)
175 SAVE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
178 mr itmp2,a1 /* arg count */
179 mr itmp1,a2 /* pointer to arg block */
181 mr t4,itmp2 /* save argument count */
182 mr t5,itmp1 /* save argument block pointer */
184 mr s0,sp /* save current sp to s0 */
186 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
187 addi itmp2,itmp2,1 /* initialize argument count */
188 li t0,0 /* initialize integer argument counter */
189 li t1,0 /* initialize float argument counter */
190 li t6,0 /* initialize integer register counter */
191 li t3,8 /* initialize PA counter*/
194 addi itmp1,itmp1,sizevmarg /* goto next argument block */
195 addi itmp2,itmp2,-1 /* argument count - 1 */
197 beq L_register_copy_done
199 addi t3,t3,-1 /* uses a PA slot */
200 lwz itmp3,offvmargtype+4(itmp1)
201 andi. r0,itmp3,0x0002 /* is this a float/double type? */
202 bne L_register_handle_float
204 L_register_handle_int:
205 cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
206 beq L_register_copy /* registers? yes, next loop */
208 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
209 bne L_register_handle_long
211 #if defined(__DARWIN__)
212 #error "FIXME for darwin"
214 lis itmp3,L_jumptable_int@highest /* load 64bit address */
215 ori itmp3,itmp3,L_jumptable_int@higher
216 rldicr itmp3,itmp3,32,31
217 oris itmp3,itmp3,L_jumptable_int@h
218 ori itmp3,itmp3,L_jumptable_int@l
220 b L_register_do_copy_longint
222 L_register_handle_long:
224 #if defined(__DARWIN__)
225 #error "FIXME for darwin"
227 lis itmp3,L_jumptable_long@highest /* load 64bit address */
228 ori itmp3,itmp3,L_jumptable_long@higher
229 rldicr itmp3,itmp3,32,31
230 oris itmp3,itmp3,L_jumptable_long@h
231 ori itmp3,itmp3,L_jumptable_long@l
234 L_register_do_copy_longint:
235 slwi t2,t6,3 /* multiple of 8-bytes */
236 add itmp3,itmp3,t2 /* calculate address of jumptable */
237 ld itmp3,0(itmp3) /* load function address */
239 addi t0,t0,1 /* integer argument counter */
240 addi t6,t6,1 /* integer argument register counter */
243 L_register_handle_float:
244 cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
245 beq L_register_copy /* registers? yes, next loop */
247 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
248 bne L_register_handle_double
250 #if defined(__DARWIN__)
251 #error "FIXME for darwin"
253 lis itmp3,L_jumptable_float@highest /* load 64bit address */
254 ori itmp3,itmp3,L_jumptable_float@higher
255 rldicr itmp3,itmp3,32,31
256 oris itmp3,itmp3,L_jumptable_float@h
257 ori itmp3,itmp3,L_jumptable_float@l
259 b L_register_do_copy_floatdouble
261 L_register_handle_double:
263 #if defined(__DARWIN__)
264 #error "FIXME for darwin"
266 lis itmp3,L_jumptable_double@highest /* load 64bit address */
267 ori itmp3,itmp3,L_jumptable_double@higher
268 rldicr itmp3,itmp3,32,31
269 oris itmp3,itmp3,L_jumptable_double@h
270 ori itmp3,itmp3,L_jumptable_double@l
274 L_register_do_copy_floatdouble:
276 slwi t2,t1,3 /* multiple of 8-bytes */
277 add itmp3,itmp3,t2 /* calculate address of jumptable */
278 ld itmp3,0(itmp3) /* load function address */
280 addi t1,t1,1 /* float argument counter */
281 mr. t3,t3 /* are we still in PA ? */
282 blt L_float_not_uses_PA
283 addi t6,t6,1 /* if so it uses an interger arg reg */
288 L_register_copy_done:
289 subi sp,sp,PA_SIZE /* PA_SIZE are used by definition */
290 /* calculate remaining arguments */
291 sub itmp3,t4,t0 /* - integer arguments in registers */
292 sub itmp3,itmp3,t1 /* - float arguments in registers */
294 beq L_stack_copy_done
296 mr itmp2,t4 /* restore argument count */
297 mr itmp1,t5 /* restore argument block pointer */
299 slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
300 addi t4,t4,LA_SIZE /* add size of linkage area */
303 mr t6,sp /* use t6 as temporary sp */
304 addi t6,t6,LA_SIZE /* skip linkage area */
306 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
307 addi itmp2,itmp2,1 /* initialize argument count */
308 li t3,8 /* initialize PA counter */
309 addi t6,t6,-8 /* make code simpler */
312 addi itmp1,itmp1,sizevmarg /* goto next argument block */
313 addi itmp2,itmp2,-1 /* argument count - 1 */
315 beq L_stack_copy_done
316 addi t6,t6,8 /* increase stack */
319 lwz itmp3,offvmargtype+4(itmp1)
320 andi. r0,itmp3,0x0002 /* is this a float/double type? */
321 bne L_stack_handle_float
324 addi t0,t0,-1 /* arguments assigned to registers */
326 bge L_stack_copy_loop
328 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
329 bne L_stack_handle_long
331 lwa itmp3,offvmargdata+4(itmp1) /* get integer argument */
332 std itmp3,0(t6) /* and store it on the stack */
336 ld itmp3,offvmargdata+0(itmp1) /* get long argument */
337 std itmp3,0(t6) /* and store it on the stack */
340 L_stack_handle_float:
341 addi t1,t1,-1 /* arguments assigned to registers */
343 bge L_stack_copy_loop
345 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
346 bne L_stack_handle_double
348 lfs ftmp3,offvmargdata(itmp1) /* get float argument */
349 stfd ftmp3,0(t6) /* and store it on the stack */
352 L_stack_handle_double:
353 lfd ftmp3,offvmargdata(itmp1) /* get double argument */
354 stfd ftmp3,0(t6) /* and store it on the stack */
358 ld itmp1,9*8(s0) /* pass method pointer via tmp1 */
360 #if defined(__DARWIN__)
361 addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
362 la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
364 lis mptr,L_asm_call_jit_compiler@highest /* load 64bit address */
365 ori mptr,mptr,L_asm_call_jit_compiler@higher
366 rldicr mptr,mptr,32,31
367 oris mptr,mptr,L_asm_call_jit_compiler@h
368 ori mptr,mptr,L_asm_call_jit_compiler@l
378 #if defined(__DARWIN__)
379 addi pv,itmp1,lo16(.asm_vm_call_method - 1b)
381 addi pv,itmp1,(.asm_vm_call_method - 1b)@l
384 L_asm_vm_call_method_return:
385 mr sp,s0 /* restore the function's sp */
387 ld s0,8*8(sp) /* restore used callee saved registers */
389 #if defined(__DARWIN__)
390 lwz itmp1,10*4(sp) /* register r11 is callee saved */
392 ld pv,11*8(sp) /* save PV register */
395 lfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
398 #if defined(__DARWIN__)
414 RESTORE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
417 ld r0,40*8+LA_LR_OFFSET(r1)
422 asm_vm_call_method_exception_handler:
424 bl builtin_throw_exception
425 b L_asm_vm_call_method_return
445 lwa a0,offvmargdata+4(itmp1)
448 lwa a1,offvmargdata+4(itmp1)
451 lwa a2,offvmargdata+4(itmp1)
454 lwa a3,offvmargdata+4(itmp1)
457 lwa a4,offvmargdata+4(itmp1)
460 lwa a5,offvmargdata+4(itmp1)
463 lwa a6,offvmargdata+4(itmp1)
466 lwa a7,offvmargdata+4(itmp1)
487 ld a0,offvmargdata(itmp1)
490 ld a1,offvmargdata(itmp1)
493 ld a2,offvmargdata(itmp1)
496 ld a3,offvmargdata(itmp1)
499 ld a4,offvmargdata(itmp1)
502 ld a5,offvmargdata(itmp1)
505 ld a6,offvmargdata(itmp1)
508 ld a7,offvmargdata(itmp1)
533 lfs fa0,offvmargdata(itmp1)
536 lfs fa1,offvmargdata(itmp1)
539 lfs fa2,offvmargdata(itmp1)
542 lfs fa3,offvmargdata(itmp1)
545 lfs fa4,offvmargdata(itmp1)
548 lfs fa5,offvmargdata(itmp1)
551 lfs fa6,offvmargdata(itmp1)
554 lfs fa7,offvmargdata(itmp1)
557 lfs fa8,offvmargdata(itmp1)
560 lfs fa9,offvmargdata(itmp1)
563 lfs fa10,offvmargdata(itmp1)
566 lfs fa11,offvmargdata(itmp1)
569 lfs fa12,offvmargdata(itmp1)
594 lfd fa0,offvmargdata(itmp1)
597 lfd fa1,offvmargdata(itmp1)
600 lfd fa2,offvmargdata(itmp1)
603 lfd fa3,offvmargdata(itmp1)
606 lfd fa4,offvmargdata(itmp1)
609 lfd fa5,offvmargdata(itmp1)
612 lfd fa6,offvmargdata(itmp1)
615 lfd fa7,offvmargdata(itmp1)
618 lfd fa8,offvmargdata(itmp1)
621 lfd fa9,offvmargdata(itmp1)
624 lfd fa10,offvmargdata(itmp1)
627 lfd fa11,offvmargdata(itmp1)
630 lfd fa12,offvmargdata(itmp1)
634 /* asm_call_jit_compiler *******************************************************
636 Invokes the compiler for untranslated JavaVM methods.
638 *******************************************************************************/
640 asm_call_jit_compiler:
641 L_asm_call_jit_compiler: /* required for PIC code */
643 std r0,LA_LR_OFFSET(sp) /* save return address */
644 stdu r1,-(LA_SIZE+PA_SIZE+ARG_CNT*8)(sp)
646 #if defined(__DARWIN__)
647 stw a0,LA_SIZE+(5+0)*8(r1)
648 stw a1,LA_SIZE+(5+1)*8(r1)
649 stw a2,LA_SIZE+(5+2)*8(r1)
650 stw a3,LA_SIZE+(5+3)*8(r1)
651 stw a4,LA_SIZE+(5+4)*8(r1)
652 stw a5,LA_SIZE+(5+5)*8(r1)
653 stw a6,LA_SIZE+(5+6)*8(r1)
654 stw a7,LA_SIZE+(5+7)*8(r1)
656 stfd fa0,LA_SIZE+(5+8)*8(r1)
657 stfd fa1,LA_SIZE+(5+10)*8(r1)
658 stfd fa2,LA_SIZE+(5+12)*8(r1)
659 stfd fa3,LA_SIZE+(5+14)*8(r1)
660 stfd fa4,LA_SIZE+(5+16)*8(r1)
661 stfd fa5,LA_SIZE+(5+18)*8(r1)
662 stfd fa6,LA_SIZE+(5+20)*8(r1)
663 stfd fa7,LA_SIZE+(5+22)*8(r1)
664 stfd fa8,LA_SIZE+(5+24)*8(r1)
665 stfd fa9,LA_SIZE+(5+26)*8(r1)
666 stfd fa10,LA_SIZE+(5+28)*8(r1)
667 stfd fa11,LA_SIZE+(5+30)*8(r1)
668 stfd fa12,LA_SIZE+(5+32)*8(r1)
670 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
675 addi a2,sp,(LA_SIZE + PA_SIZE+ ARG_CNT*8)
676 ld a3,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
678 ori r0,r0,0 /* nop needed after jump to function desc. */
679 mr pv,v0 /* move address to pv register */
681 #if defined(__DARWIN__)
682 lwz a0,LA_SIZE+(+5+0)*8(r1)
683 lwz a1,LA_SIZE+(+5+1)*8(r1)
684 lwz a2,LA_SIZE+(+5+2)*8(r1)
685 lwz a3,LA_SIZE+(+5+3)*8(r1)
686 lwz a4,LA_SIZE+(+5+4)*8(r1)
687 lwz a5,LA_SIZE+(+5+5)*8(r1)
688 lwz a6,LA_SIZE+(+5+6)*8(r1)
689 lwz a7,LA_SIZE+(+5+7)*8(r1)
691 lfd fa0,LA_SIZE+(+5+8)*8(r1)
692 lfd fa1,LA_SIZE+(+5+10)*8(r1)
693 lfd fa2,LA_SIZE+(+5+12)*8(r1)
694 lfd fa3,LA_SIZE+(+5+14)*8(r1)
695 lfd fa4,LA_SIZE+(+5+16)*8(r1)
696 lfd fa5,LA_SIZE+(+5+18)*8(r1)
697 lfd fa6,LA_SIZE+(+5+20)*8(r1)
698 lfd fa7,LA_SIZE+(+5+22)*8(r1)
699 lfd fa8,LA_SIZE+(+5+24)*8(r1)
700 lfd fa9,LA_SIZE+(+5+26)*8(r1)
701 lfd fa10,LA_SIZE+(+5+28)*8(r1)
702 lfd fa11,LA_SIZE+(+5+30)*8(r1)
703 lfd fa12,LA_SIZE+(+5+32)*8(r1)
705 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
708 ld itmp1,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
711 addi sp,sp,(LA_SIZE + PA_SIZE + ARG_CNT*8)
713 mr. pv,pv /* test for exception */
714 beq L_asm_call_jit_compiler_exception
716 mtctr pv /* move method address to control reg */
717 bctr /* and call the Java method */
719 L_asm_call_jit_compiler_exception:
721 std r0,LA_LR_OFFSET(sp)
722 stdu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
723 bl exceptions_get_and_clear_exception
724 ld xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
726 addi sp,sp,LA_SIZE_ALIGNED
728 mr xptr,v0 /* get exception */
729 addi xpc,xpc,-4 /* exception address is ra - 4 */
730 b L_asm_handle_nat_exception
733 /********************* function asm_handle_exception ***************************
735 * This function handles an exception. It does not use the usual calling *
736 * conventions. The exception pointer is passed in REG_ITMP1 and the *
737 * pc from the exception raising position is passed in REG_ITMP2. It searches *
738 * the local exception table for a handler. If no one is found, it unwinds *
739 * stacks and continues searching the callers. *
741 * void asm_handle_exception (exceptionptr, exceptionpc); *
743 *******************************************************************************/
745 asm_handle_nat_exception:
746 L_asm_handle_nat_exception: /* required for PIC code */
747 L_asm_handle_exception_stack_loop:
749 addi sp,sp,-(LA_SIZE+PA_SIZE+((4+6)*8)) /* allocate stack (+4 for darwin) */
750 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
751 std xpc,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* save exception pc */
752 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* save return address */
754 std itmp3,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* save maybe-leaf flag (cleared) */
756 mr a0,r0 /* pass return address */
757 bl md_codegen_get_pv_from_pc /* get PV from RA */
758 std v0,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
760 ld a0,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* pass xptr */
761 ld a1,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* pass xpc */
762 ld a2,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* pass PV (v0 == a0) */
763 addi a3,sp,LA_SIZE+PA_SIZE+((4+6)*8) /* pass Java SP */
765 b L_asm_handle_exception_continue
768 asm_handle_exception:
769 L_asm_handle_exception: /* required for PIC code */
770 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
772 #if defined(__DARWIN__)
774 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
775 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
778 addi sp,sp,-(LA_SIZE+PA_SIZE+(4+6)*8) /* allocate stack */
779 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
780 std pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
781 mflr r0 /* save return address */
782 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp)
784 std t0, LA_SIZE+PA_SIZE+(4+4)*8(sp) /* maybe-leaf flag */
786 mr a0,xptr /* pass exception pointer */
787 mr a1,xpc /* pass exception pc */
788 mr a2,pv /* pass data segment pointer */
789 addi a3,sp,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*8
792 L_asm_handle_exception_continue:
793 bl exceptions_handle_exception
796 beq L_asm_handle_exception_not_catched
798 mr xpc,v0 /* move handlerpc into xpc */
799 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
800 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
801 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
803 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
804 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
807 beq L_asm_handle_exception_no_leaf
809 #if defined(__DARWIN__)
811 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
812 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
815 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
817 L_asm_handle_exception_no_leaf:
818 mtctr xpc /* jump to the handler */
821 L_asm_handle_exception_not_catched:
822 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
823 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
824 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
826 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
827 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
830 beq L_asm_handle_exception_no_leaf_stack
832 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
833 li t0,0 /* clear the maybe-leaf flag */
835 L_asm_handle_exception_no_leaf_stack:
836 lwz t1,FrameSize(pv) /* get frame size */
837 add t1,sp,t1 /* pointer to save area */
839 lwz t2,IsLeaf(pv) /* is leaf procedure */
841 bne L_asm_handle_exception_no_ra_restore
843 ld r0,LA_LR_OFFSET(t1) /* restore ra */
846 L_asm_handle_exception_no_ra_restore:
847 mflr xpc /* the new xpc is ra */
848 mr t4,xpc /* save RA */
849 lwz t2,IntSave(pv) /* t1 = saved int register count */
852 mflr t3 /* t3 = current pc */
853 #if defined(__DARWIN__)
854 addi t2,t2,lo16(ex_int2-ex_int1)
856 addi t3,t3,(ex_int2-ex_int1)@l
858 slwi t2,t2,2 /* t2 = register count * 4 */
859 subf t3,t2,t3 /* t3 = IntSave - t2 */
874 subf t1,t2,t1 /* t1 = t1 - register count * 4 */
879 #if defined(__DARWIN__)
880 addi t2,t2,lo16(ex_flt2-ex_flt1)
882 addi t3,t3,(ex_flt2-ex_flt1)@l
884 slwi t2,t2,2 /* t2 = register count * 4 */
885 subf t3,t2,t3 /* t3 = FltSave - t2 */
901 mtlr t4 /* restore RA */
903 add sp,sp,t1 /* unwind stack */
904 b L_asm_handle_exception_stack_loop
907 /* asm_abstractmethoderror *****************************************************
909 Creates and throws an AbstractMethodError.
911 *******************************************************************************/
913 asm_abstractmethoderror:
915 stw r0,LA_LR_OFFSET(sp)
916 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
917 addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */
918 mr a1,r0 /* pass exception address */
919 bl exceptions_asm_new_abstractmethoderror
920 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
921 mtlr r0 /* restore return address */
922 addi sp,sp,LA_SIZE_ALIGNED
924 mr xptr,v0 /* get exception pointer */
925 mr xpc,r0 /* we can't use r0 directly in addi */
926 addi xpc,xpc,-4 /* exception address is ra - 4 */
927 b L_asm_handle_nat_exception
930 /* asm_patcher_wrapper *********************************************************
935 40 return address into JIT code (patch position)
936 32 pointer to virtual java_objectheader
937 24 machine code (which is patched back later)
938 16 unresolved class/method/field reference
939 8 data segment displacement from load instructions
940 0 patcher function pointer to call (pv is saved here afterwards)
942 *******************************************************************************/
945 mflr r0 /* get Java return address (leaf) */
946 std r0,6*8(sp) /* store it in the stub stackframe */
947 /* keep stack 16-bytes aligned: 6+1+37 = 44 */
948 stdu sp,-(LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8)(sp)
950 #if defined(__DARWIN__)
951 stw a0,LA_SIZE+(5+0)*8(r1) /* save argument registers */
952 stw a1,LA_SIZE+(5+1)*8(r1) /* preserve linkage area (24 bytes) */
953 stw a2,LA_SIZE+(5+2)*8(r1) /* and 4 bytes for 4 argument */
954 stw a3,LA_SIZE+(5+3)*8(r1)
955 stw a4,LA_SIZE+(5+4)*8(r1)
956 stw a5,LA_SIZE+(5+5)*8(r1)
957 stw a6,LA_SIZE+(5+6)*8(r1)
958 stw a7,LA_SIZE+(5+7)*8(r1)
960 stfd fa0,LA_SIZE+(5+8)*8(sp)
961 stfd fa1,LA_SIZE+(5+10)*8(sp)
962 stfd fa2,LA_SIZE+(5+12)*8(sp)
963 stfd fa3,LA_SIZE+(5+14)*8(sp)
964 stfd fa4,LA_SIZE+(5+16)*8(sp)
965 stfd fa5,LA_SIZE+(5+18)*8(sp)
966 stfd fa6,LA_SIZE+(5+20)*8(sp)
967 stfd fa7,LA_SIZE+(5+22)*8(sp)
968 stfd fa8,LA_SIZE+(5+24)*8(sp)
969 stfd fa9,LA_SIZE+(5+26)*8(sp)
970 stfd fa10,LA_SIZE+(5+28)*8(sp)
971 stfd fa11,LA_SIZE+(5+30)*8(sp)
972 stfd fa12,LA_SIZE+(5+32)*8(sp) /* XXX */
974 stw t0,LA_SIZE+(+5+33)*8(r1)
975 stw t1,LA_SIZE+(+5+34)*8(r1)
976 stw t2,LA_SIZE+(+5+35)*8(r1)
977 stw t3,LA_SIZE+(+5+36)*8(r1)
978 stw t4,LA_SIZE+(+5+37)*8(r1)
979 stw t5,LA_SIZE+(+5+38)*8(r1)
980 stw t6,LA_SIZE+(+5+39)*8(r1)
981 stw t7,LA_SIZE+(+5+40)*8(r1)
983 stfd ft0,LA_SIZE+(+5+42)*8(r1)
984 stfd ft1,LA_SIZE+(+5+44)*8(r1)
985 stfd ft2,LA_SIZE+(+5+46)*8(r1)
986 stfd ft3,LA_SIZE+(+5+48)*8(r1)
987 stfd ft4,LA_SIZE+(+5+50)*8(r1)
988 stfd ft5,LA_SIZE+(+5+52)*8(r1)
990 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* save 8 int/8 float arguments */
991 SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
994 std itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
995 std itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
996 std pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
998 addi a0,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8 /* pass SP of patcher stub */
999 mr a1,pv /* pass PV */
1000 mr a2,r0 /* pass RA (correct for leafs) */
1002 std v0,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp) /* save return value */
1004 #if defined(__DARWIN__)
1005 lwz a0,LA_SIZE+(5+0)*8(r1)
1006 lwz a1,LA_SIZE+(5+1)*8(r1)
1007 lwz a2,LA_SIZE+(5+2)*8(r1)
1008 lwz a3,LA_SIZE+(5+3)*8(r1)
1009 lwz a4,LA_SIZE+(5+4)*8(r1)
1010 lwz a5,LA_SIZE+(5+5)*8(r1)
1011 lwz a6,LA_SIZE+(5+6)*8(r1)
1012 lwz a7,LA_SIZE+(5+7)*8(r1)
1014 lfd fa0,LA_SIZE+(5+8)*8(sp)
1015 lfd fa1,LA_SIZE+(5+10)*8(sp)
1016 lfd fa2,LA_SIZE+(5+12)*8(sp)
1017 lfd fa3,LA_SIZE+(5+14)*8(sp)
1018 lfd fa4,LA_SIZE+(5+16)*8(sp)
1019 lfd fa5,LA_SIZE+(5+18)*8(sp)
1020 lfd fa6,LA_SIZE+(5+20)*8(sp)
1021 lfd fa7,LA_SIZE+(5+22)*8(sp)
1022 lfd fa8,LA_SIZE+(5+24)*8(sp)
1023 lfd fa9,LA_SIZE+(5+26)*8(sp)
1024 lfd fa10,LA_SIZE+(5+28)*8(sp)
1025 lfd fa11,LA_SIZE+(5+30)*8(sp)
1026 lfd fa12,LA_SIZE+(5+32)*8(sp)
1028 lwz t0,LA_SIZE+(+5+33)*8(r1)
1029 lwz t1,LA_SIZE+(+5+34)*8(r1)
1030 lwz t2,LA_SIZE+(+5+35)*8(r1)
1031 lwz t3,LA_SIZE+(+5+36)*8(r1)
1032 lwz t4,LA_SIZE+(+5+37)*8(r1)
1033 lwz t5,LA_SIZE+(+5+38)*8(r1)
1034 lwz t6,LA_SIZE+(+5+39)*8(r1)
1035 lwz t7,LA_SIZE+(+5+40)*8(r1)
1037 lfd ft0,LA_SIZE+(+5+42)*8(r1)
1038 lfd ft1,LA_SIZE+(+5+44)*8(r1)
1039 lfd ft2,LA_SIZE+(+5+46)*8(r1)
1040 lfd ft3,LA_SIZE+(+5+48)*8(r1)
1041 lfd ft4,LA_SIZE+(+5+50)*8(r1)
1042 lfd ft5,LA_SIZE+(+5+52)*8(r1)
1044 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* restore 8 int/8 float args */
1045 RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
1048 ld itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
1049 ld itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
1050 ld pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
1051 ld itmp3,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp)
1053 ld r0,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+6*8(sp) /* restore RA */
1056 mr. itmp3,itmp3 /* check for an exception */
1057 bne L_asm_patcher_wrapper_exception
1059 /* get return address (into JIT code) */
1060 ld itmp3,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1062 /* remove stack frame + patcher stub stack */
1063 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1066 bctr /* jump to new patched code */
1068 L_asm_patcher_wrapper_exception:
1069 mr xptr,itmp3 /* get exception */
1070 ld xpc,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1071 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1072 b L_asm_handle_exception
1075 /* asm_replacement_out *********************************************************
1077 This code is jumped to from the replacement-out stubs that are executed
1078 when a thread reaches an activated replacement point.
1080 The purpose of asm_replacement_out is to read out the parts of the
1081 execution state that cannot be accessed from C code, store this state,
1082 and then call the C function replace_me.
1085 16 start of stack inside method to replace
1086 0 rplpoint * info on the replacement point that was reached
1088 NOTE: itmp3 has been clobbered by the replacement-out stub!
1090 *******************************************************************************/
1092 /* some room to accomodate changes of the stack frame size during replacement */
1093 /* XXX we should find a cleaner solution here */
1094 #define REPLACEMENT_ROOM 512
1096 asm_replacement_out:
1097 /* create stack frame */
1098 addi sp,sp,-(sizeexecutionstate + REPLACEMENT_ROOM) /* XXX align */
1100 /* save link register */
1103 /* save registers in execution state */
1104 stw r0 ,( 0*8+offes_intregs)(sp)
1105 stw r1 ,( 1*8+offes_intregs)(sp)
1106 stw r2 ,( 2*8+offes_intregs)(sp)
1107 stw r3 ,( 3*8+offes_intregs)(sp)
1108 stw r4 ,( 4*8+offes_intregs)(sp)
1109 stw r5 ,( 5*8+offes_intregs)(sp)
1110 stw r6 ,( 6*8+offes_intregs)(sp)
1111 stw r7 ,( 7*8+offes_intregs)(sp)
1112 stw r8 ,( 8*8+offes_intregs)(sp)
1113 stw r9 ,( 9*8+offes_intregs)(sp)
1114 stw r10,(10*8+offes_intregs)(sp)
1115 stw r11,(11*8+offes_intregs)(sp)
1116 stw r12,(12*8+offes_intregs)(sp)
1117 stw r13,(13*8+offes_intregs)(sp)
1118 stw r14,(14*8+offes_intregs)(sp)
1119 stw r15,(15*8+offes_intregs)(sp)
1120 stw r16,(16*8+offes_intregs)(sp) /* link register */
1121 stw r17,(17*8+offes_intregs)(sp)
1122 stw r18,(18*8+offes_intregs)(sp)
1123 stw r19,(19*8+offes_intregs)(sp)
1124 stw r20,(20*8+offes_intregs)(sp)
1125 stw r21,(21*8+offes_intregs)(sp)
1126 stw r22,(22*8+offes_intregs)(sp)
1127 stw r23,(23*8+offes_intregs)(sp)
1128 stw r24,(24*8+offes_intregs)(sp)
1129 stw r25,(25*8+offes_intregs)(sp)
1130 stw r26,(26*8+offes_intregs)(sp)
1131 stw r27,(27*8+offes_intregs)(sp)
1132 stw r28,(28*8+offes_intregs)(sp)
1133 stw r29,(29*8+offes_intregs)(sp)
1134 stw r30,(30*8+offes_intregs)(sp)
1135 stw r31,(31*8+offes_intregs)(sp)
1137 stfd fr0 ,( 0*8+offes_fltregs)(sp)
1138 stfd fr1 ,( 1*8+offes_fltregs)(sp)
1139 stfd fr2 ,( 2*8+offes_fltregs)(sp)
1140 stfd fr3 ,( 3*8+offes_fltregs)(sp)
1141 stfd fr4 ,( 4*8+offes_fltregs)(sp)
1142 stfd fr5 ,( 5*8+offes_fltregs)(sp)
1143 stfd fr6 ,( 6*8+offes_fltregs)(sp)
1144 stfd fr7 ,( 7*8+offes_fltregs)(sp)
1145 stfd fr8 ,( 8*8+offes_fltregs)(sp)
1146 stfd fr9 ,( 9*8+offes_fltregs)(sp)
1147 stfd fr10,(10*8+offes_fltregs)(sp)
1148 stfd fr11,(11*8+offes_fltregs)(sp)
1149 stfd fr12,(12*8+offes_fltregs)(sp)
1150 stfd fr13,(13*8+offes_fltregs)(sp)
1151 stfd fr14,(14*8+offes_fltregs)(sp)
1152 stfd fr15,(15*8+offes_fltregs)(sp)
1153 stfd fr16,(16*8+offes_fltregs)(sp)
1154 stfd fr17,(17*8+offes_fltregs)(sp)
1155 stfd fr18,(18*8+offes_fltregs)(sp)
1156 stfd fr19,(19*8+offes_fltregs)(sp)
1157 stfd fr20,(20*8+offes_fltregs)(sp)
1158 stfd fr21,(21*8+offes_fltregs)(sp)
1159 stfd fr22,(22*8+offes_fltregs)(sp)
1160 stfd fr23,(23*8+offes_fltregs)(sp)
1161 stfd fr24,(24*8+offes_fltregs)(sp)
1162 stfd fr25,(25*8+offes_fltregs)(sp)
1163 stfd fr26,(26*8+offes_fltregs)(sp)
1164 stfd fr27,(27*8+offes_fltregs)(sp)
1165 stfd fr28,(28*8+offes_fltregs)(sp)
1166 stfd fr29,(29*8+offes_fltregs)(sp)
1167 stfd fr30,(30*8+offes_fltregs)(sp)
1168 stfd fr31,(31*8+offes_fltregs)(sp)
1170 /* calculate sp of method */
1171 addi itmp1,sp,(sizeexecutionstate + REPLACEMENT_ROOM + 4*4)
1172 stw itmp1,(offes_sp)(sp)
1175 stw pv,(offes_pv)(sp)
1177 /* call replace_me */
1178 lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */
1179 mr a1,sp /* arg1: execution state */
1180 addi sp,sp,-(LA_SIZE_ALIGNED)
1181 b replace_me /* call C function replace_me */
1183 /* asm_replacement_in **********************************************************
1185 This code writes the given execution state and jumps to the replacement
1188 This function never returns!
1190 NOTE: itmp3 is not restored!
1193 void asm_replacement_in(executionstate *es);
1195 *******************************************************************************/
1197 .asm_replacement_in:
1198 /* a0 == executionstate *es */
1200 /* set new sp and pv */
1201 lwz sp,(offes_sp)(a0)
1202 lwz pv,(offes_pv)(a0)
1204 /* copy registers from execution state */
1205 lwz r0 ,( 0*8+offes_intregs)(a0)
1207 /* r2 is reserved */
1208 /* a0 is loaded below */
1209 lwz r4 ,( 4*8+offes_intregs)(a0)
1210 lwz r5 ,( 5*8+offes_intregs)(a0)
1211 lwz r6 ,( 6*8+offes_intregs)(a0)
1212 lwz r7 ,( 7*8+offes_intregs)(a0)
1213 lwz r8 ,( 8*8+offes_intregs)(a0)
1214 lwz r9 ,( 9*8+offes_intregs)(a0)
1215 lwz r10,(10*8+offes_intregs)(a0)
1216 lwz r11,(11*8+offes_intregs)(a0)
1217 lwz r12,(12*8+offes_intregs)(a0)
1219 lwz r14,(14*8+offes_intregs)(a0)
1220 lwz r15,(15*8+offes_intregs)(a0)
1221 lwz r16,(16*8+offes_intregs)(a0) /* link register */
1222 lwz r17,(17*8+offes_intregs)(a0)
1223 lwz r18,(18*8+offes_intregs)(a0)
1224 lwz r19,(19*8+offes_intregs)(a0)
1225 lwz r20,(20*8+offes_intregs)(a0)
1226 lwz r21,(21*8+offes_intregs)(a0)
1227 lwz r22,(22*8+offes_intregs)(a0)
1228 lwz r23,(23*8+offes_intregs)(a0)
1229 lwz r24,(24*8+offes_intregs)(a0)
1230 lwz r25,(25*8+offes_intregs)(a0)
1231 lwz r26,(26*8+offes_intregs)(a0)
1232 lwz r27,(27*8+offes_intregs)(a0)
1233 lwz r28,(28*8+offes_intregs)(a0)
1234 lwz r29,(29*8+offes_intregs)(a0)
1235 lwz r30,(30*8+offes_intregs)(a0)
1236 lwz r31,(31*8+offes_intregs)(a0)
1238 lfd fr0 ,( 0*8+offes_fltregs)(a0)
1239 lfd fr1 ,( 1*8+offes_fltregs)(a0)
1240 lfd fr2 ,( 2*8+offes_fltregs)(a0)
1241 lfd fr3 ,( 3*8+offes_fltregs)(a0)
1242 lfd fr4 ,( 4*8+offes_fltregs)(a0)
1243 lfd fr5 ,( 5*8+offes_fltregs)(a0)
1244 lfd fr6 ,( 6*8+offes_fltregs)(a0)
1245 lfd fr7 ,( 7*8+offes_fltregs)(a0)
1246 lfd fr8 ,( 8*8+offes_fltregs)(a0)
1247 lfd fr9 ,( 9*8+offes_fltregs)(a0)
1248 lfd fr10,(10*8+offes_fltregs)(a0)
1249 lfd fr11,(11*8+offes_fltregs)(a0)
1250 lfd fr12,(12*8+offes_fltregs)(a0)
1251 lfd fr13,(13*8+offes_fltregs)(a0)
1252 lfd fr14,(14*8+offes_fltregs)(a0)
1253 lfd fr15,(15*8+offes_fltregs)(a0)
1254 lfd fr16,(16*8+offes_fltregs)(a0)
1255 lfd fr17,(17*8+offes_fltregs)(a0)
1256 lfd fr18,(18*8+offes_fltregs)(a0)
1257 lfd fr19,(19*8+offes_fltregs)(a0)
1258 lfd fr20,(20*8+offes_fltregs)(a0)
1259 lfd fr21,(21*8+offes_fltregs)(a0)
1260 lfd fr22,(22*8+offes_fltregs)(a0)
1261 lfd fr23,(23*8+offes_fltregs)(a0)
1262 lfd fr24,(24*8+offes_fltregs)(a0)
1263 lfd fr25,(25*8+offes_fltregs)(a0)
1264 lfd fr26,(26*8+offes_fltregs)(a0)
1265 lfd fr27,(27*8+offes_fltregs)(a0)
1266 lfd fr28,(28*8+offes_fltregs)(a0)
1267 lfd fr29,(29*8+offes_fltregs)(a0)
1268 lfd fr30,(30*8+offes_fltregs)(a0)
1269 lfd fr31,(31*8+offes_fltregs)(a0)
1271 /* restore link register */
1277 lwz itmp3,offes_pc(a0)
1281 lwz a0,(3*8+offes_intregs)(a0)
1283 /* jump to new code */
1288 /* asm_cacheflush **************************************************************
1289 copied from linux/arch/ppc64/kernel/vdso64/cacheflush.S
1290 assumes 128 byte cache line size.
1291 *******************************************************************************/
1293 /* construct the AND mask */
1294 li r6, 0xffffffffffff8000
1295 ori r6,r6,0x000000000000ff80
1321 .asm_getclassvalues_atomic:
1324 lwz r6,offbaseval(r3)
1325 lwz r7,offdiffval(r3)
1326 lwz r8,offbaseval(r4)
1328 stw r6,offcast_super_baseval(r5)
1329 stw r7,offcast_super_diffval(r5)
1330 stw r8,offcast_sub_baseval(r5)
1335 asm_criticalsections:
1336 #if defined(ENABLE_THREADS)
1344 #if defined(__DARWIN__)
1346 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1348 L_builtin_throw_exception$stub:
1349 .indirect_symbol _builtin_throw_exception
1351 bcl 20,31,L00$_builtin_throw_exception
1352 L00$_builtin_throw_exception:
1354 addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1356 lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1360 .lazy_symbol_pointer
1361 L_builtin_throw_exception$lazy_ptr:
1362 .indirect_symbol _builtin_throw_exception
1363 .long dyld_stub_binding_helper
1366 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1368 L_exceptions_handle_exception$stub:
1369 .indirect_symbol _exceptions_handle_exception
1371 bcl 20,31,L00$_exceptions_handle_exception
1372 L00$_exceptions_handle_exception:
1374 addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1376 lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1380 .lazy_symbol_pointer
1381 L_exceptions_handle_exception$lazy_ptr:
1382 .indirect_symbol _exceptions_handle_exception
1383 .long dyld_stub_binding_helper
1386 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1388 L_stacktrace_create_extern_stackframeinfo$stub:
1389 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1391 bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1392 L00$_stacktrace_create_extern_stackframeinfo:
1394 addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1396 lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1400 .lazy_symbol_pointer
1401 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1402 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1403 .long dyld_stub_binding_helper
1406 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1408 L_jit_asm_compile$stub:
1409 .indirect_symbol _jit_asm_compile
1411 bcl 20,31,L00$_jit_asm_compile
1412 L00$_jit_asm_compile:
1414 addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1416 lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1420 .lazy_symbol_pointer
1421 L_jit_asm_compile$lazy_ptr:
1422 .indirect_symbol _jit_asm_compile
1423 .long dyld_stub_binding_helper
1425 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1427 L_stacktrace_remove_stackframeinfo$stub:
1428 .indirect_symbol _stacktrace_remove_stackframeinfo
1430 bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1431 L00$_stacktrace_remove_stackframeinfo:
1433 addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1435 lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1439 .lazy_symbol_pointer
1440 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1441 .indirect_symbol _stacktrace_remove_stackframeinfo
1442 .long dyld_stub_binding_helper
1445 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1447 L_exceptions_get_and_clear_exception$stub:
1448 .indirect_symbol _exceptions_get_and_clear_exception
1450 bcl 20,31,L00$_exceptions_get_and_clear_exception
1451 L00$_exceptions_get_and_clear_exception:
1453 addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
1455 lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
1459 .lazy_symbol_pointer
1460 L_exceptions_get_and_clear_exception$lazy_ptr:
1461 .indirect_symbol _exceptions_get_and_clear_exception
1462 .long dyld_stub_binding_helper
1465 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1467 L_exceptions_asm_new_abstractmethoderror$stub:
1468 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1470 bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
1471 L00$_exceptions_asm_new_abstractmethoderror:
1473 addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
1475 lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
1479 .lazy_symbol_pointer
1480 L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
1481 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1482 .long dyld_stub_binding_helper
1485 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1487 L_patcher_wrapper$stub:
1488 .indirect_symbol _patcher_wrapper
1490 bcl 20,31,L00$_patcher_wrapper
1491 L00$_patcher_wrapper:
1493 addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
1495 lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
1499 .lazy_symbol_pointer
1500 L_patcher_wrapper$lazy_ptr:
1501 .indirect_symbol _patcher_wrapper
1502 .long dyld_stub_binding_helper
1505 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1508 .indirect_symbol _replace_me
1510 bcl 20,31,L00$_replace_me
1513 addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1515 lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1519 .lazy_symbol_pointer
1520 L_replace_me$lazy_ptr:
1521 .indirect_symbol _replace_me
1522 .long dyld_stub_binding_helper
1524 #endif /* defined(__DARWIN__) */
1527 /* Disable exec-stacks, required for Gentoo ***********************************/
1529 #if defined(__GCC__) && defined(__ELF__)
1530 .section .note.GNU-stack,"",@progbits
1535 * These are local overrides for various environment variables in Emacs.
1536 * Please do not remove this and leave it at the end of the file, where
1537 * Emacs will automagically detect them.
1538 * ---------------------------------------------------------------------
1541 * indent-tabs-mode: t
1545 * vim:noexpandtab:sw=4:ts=4: