1 /* src/vm/jit/powerpc64/asmpart.S - Java-C interface functions for PowerPC64
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 7667 2007-04-05 00:16:05Z michi $
37 #include "vm/jit/abi-asm.h"
38 #include "vm/jit/methodheader.h"
39 #include "vm/jit/powerpc64/offsets.h"
47 /* export functions ***********************************************************/
49 .globl asm_vm_call_method_exception_handler
50 .globl asm_vm_call_method_end
52 .globl asm_call_jit_compiler
54 .globl asm_handle_nat_exception
55 .globl asm_handle_exception
57 .globl asm_abstractmethoderror
59 .globl asm_patcher_wrapper
61 #if defined(ENABLE_REPLACEMENT)
62 .globl asm_replacement_out
63 .globl .asm_replacement_in
67 .globl asm_criticalsections
68 .globl asm_getclassvalues_atomic
71 /* asm_vm_call_method **********************************************************
73 * This function calls a Java-method (which possibly needs compilation) *
74 * with up to 4 address parameters. *
76 * This functions calls the JIT-compiler which eventually translates the *
77 * method into machine code. *
80 * javaobject_header *asm_calljavamethod (methodinfo *m, *
81 * void *arg1, void *arg2, void *arg3, void *arg4); *
83 *******************************************************************************/
84 /* this is the method header see src/vm/jit/methodheader.h */
88 .quad 0 /* catch type all */
89 .quad 0 /* handler pc */
91 .quad 0 /* start pc */
92 .long 1 /* extable size */
93 .long 0 /* ALIGNMENT PADDING */
94 .quad 0 /* line number table start */
95 .quad 0 /* line number table size */
96 .long 0 /* ALIGNMENT PADDING */
101 .long 0 /* frame size */
102 .quad 0 /* codeinfo pointer */
106 .globl asm_vm_call_method
107 .globl asm_vm_call_method_int
108 .globl asm_vm_call_method_long
109 .globl asm_vm_call_method_float
110 .globl asm_vm_call_method_double
115 asm_vm_call_method_int:
116 asm_vm_call_method_long:
117 asm_vm_call_method_float:
118 asm_vm_call_method_double:
119 .quad .asm_vm_call_method,.TOC.@tocbase,0
121 .size asm_vm_call_method, 24
122 .type .asm_vm_call_method,@function
123 .globl .asm_vm_call_method
126 .globl asm_vm_call_method
127 asm_vm_call_method_int:
128 .globl asm_vm_call_method_int
129 asm_vm_call_method_long:
130 .globl asm_vm_call_method_long
131 asm_vm_call_method_float:
132 .globl asm_vm_call_method_float
133 asm_vm_call_method_double:
134 .globl asm_vm_call_method_double
138 .asm_vm_call_method_int:
139 .asm_vm_call_method_long:
140 .asm_vm_call_method_float:
141 .asm_vm_call_method_double:
143 std r0,LA_LR_OFFSET(sp)
146 std s0,8*8(sp) /* save used callee saved registers */
147 std a0,9*8(sp) /* save method pointer for compiler */
149 #if defined(__DARWIN__)
150 std itmp1,10*8(sp) /* register r11 is callee saved */
152 std pv,11*8(sp) /* save PV register */
154 std itmp3,12*8(sp) /* registers r14-r31 are callee saved */
155 stfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
158 #if defined(__DARWIN__)
174 SAVE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
177 mr itmp2,a1 /* arg count */
178 mr itmp1,a2 /* pointer to arg block */
180 mr t4,itmp2 /* save argument count */
181 mr t5,itmp1 /* save argument block pointer */
183 mr s0,sp /* save current sp to s0 */
185 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
186 addi itmp2,itmp2,1 /* initialize argument count */
187 li t0,0 /* initialize integer argument counter */
188 li t1,0 /* initialize float argument counter */
189 li t6,0 /* initialize integer register counter */
190 li t3,8 /* initialize PA counter*/
193 addi itmp1,itmp1,sizevmarg /* goto next argument block */
194 addi itmp2,itmp2,-1 /* argument count - 1 */
196 beq L_register_copy_done
198 addi t3,t3,-1 /* uses a PA slot */
199 lwz itmp3,offvmargtype+4(itmp1)
200 andi. r0,itmp3,0x0002 /* is this a float/double type? */
201 bne L_register_handle_float
203 L_register_handle_int:
204 cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
205 beq L_register_copy /* registers? yes, next loop */
207 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
208 bne L_register_handle_long
210 #if defined(__DARWIN__)
211 #error "FIXME for darwin"
213 lis itmp3,L_jumptable_int@highest /* load 64bit address */
214 ori itmp3,itmp3,L_jumptable_int@higher
215 rldicr itmp3,itmp3,32,31
216 oris itmp3,itmp3,L_jumptable_int@h
217 ori itmp3,itmp3,L_jumptable_int@l
219 b L_register_do_copy_longint
221 L_register_handle_long:
223 #if defined(__DARWIN__)
224 #error "FIXME for darwin"
226 lis itmp3,L_jumptable_long@highest /* load 64bit address */
227 ori itmp3,itmp3,L_jumptable_long@higher
228 rldicr itmp3,itmp3,32,31
229 oris itmp3,itmp3,L_jumptable_long@h
230 ori itmp3,itmp3,L_jumptable_long@l
233 L_register_do_copy_longint:
234 slwi t2,t6,3 /* multiple of 8-bytes */
235 add itmp3,itmp3,t2 /* calculate address of jumptable */
236 ld itmp3,0(itmp3) /* load function address */
238 addi t0,t0,1 /* integer argument counter */
239 addi t6,t6,1 /* integer argument register counter */
242 L_register_handle_float:
243 cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
244 beq L_register_copy /* registers? yes, next loop */
246 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
247 bne L_register_handle_double
249 #if defined(__DARWIN__)
250 #error "FIXME for darwin"
252 lis itmp3,L_jumptable_float@highest /* load 64bit address */
253 ori itmp3,itmp3,L_jumptable_float@higher
254 rldicr itmp3,itmp3,32,31
255 oris itmp3,itmp3,L_jumptable_float@h
256 ori itmp3,itmp3,L_jumptable_float@l
258 b L_register_do_copy_floatdouble
260 L_register_handle_double:
262 #if defined(__DARWIN__)
263 #error "FIXME for darwin"
265 lis itmp3,L_jumptable_double@highest /* load 64bit address */
266 ori itmp3,itmp3,L_jumptable_double@higher
267 rldicr itmp3,itmp3,32,31
268 oris itmp3,itmp3,L_jumptable_double@h
269 ori itmp3,itmp3,L_jumptable_double@l
273 L_register_do_copy_floatdouble:
275 slwi t2,t1,3 /* multiple of 8-bytes */
276 add itmp3,itmp3,t2 /* calculate address of jumptable */
277 ld itmp3,0(itmp3) /* load function address */
279 addi t1,t1,1 /* float argument counter */
280 mr. t3,t3 /* are we still in PA ? */
281 blt L_float_not_uses_PA
282 addi t6,t6,1 /* if so it uses an interger arg reg */
287 L_register_copy_done:
288 subi sp,sp,PA_SIZE /* PA_SIZE are used by definition */
289 /* calculate remaining arguments */
290 sub itmp3,t4,t0 /* - integer arguments in registers */
291 sub itmp3,itmp3,t1 /* - float arguments in registers */
293 beq L_stack_copy_done
295 mr itmp2,t4 /* restore argument count */
296 mr itmp1,t5 /* restore argument block pointer */
298 slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
299 addi t4,t4,LA_SIZE /* add size of linkage area */
302 mr t6,sp /* use t6 as temporary sp */
303 addi t6,t6,LA_SIZE /* skip linkage area */
305 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
306 addi itmp2,itmp2,1 /* initialize argument count */
307 li t3,8 /* initialize PA counter */
308 addi t6,t6,-8 /* make code simpler */
311 addi itmp1,itmp1,sizevmarg /* goto next argument block */
312 addi itmp2,itmp2,-1 /* argument count - 1 */
314 beq L_stack_copy_done
315 addi t6,t6,8 /* increase stack */
318 lwz itmp3,offvmargtype+4(itmp1)
319 andi. r0,itmp3,0x0002 /* is this a float/double type? */
320 bne L_stack_handle_float
323 addi t0,t0,-1 /* arguments assigned to registers */
325 bge L_stack_copy_loop
327 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
328 bne L_stack_handle_long
330 lwa itmp3,offvmargdata+4(itmp1) /* get integer argument */
331 std itmp3,0(t6) /* and store it on the stack */
335 ld itmp3,offvmargdata+0(itmp1) /* get long argument */
336 std itmp3,0(t6) /* and store it on the stack */
339 L_stack_handle_float:
340 addi t1,t1,-1 /* arguments assigned to registers */
342 bge L_stack_copy_loop
344 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
345 bne L_stack_handle_double
347 lfs ftmp3,offvmargdata(itmp1) /* get float argument */
348 stfd ftmp3,0(t6) /* and store it on the stack */
351 L_stack_handle_double:
352 lfd ftmp3,offvmargdata(itmp1) /* get double argument */
353 stfd ftmp3,0(t6) /* and store it on the stack */
357 ld itmp1,9*8(s0) /* pass method pointer via tmp1 */
359 #if defined(__DARWIN__)
360 addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
361 la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
363 lis mptr,L_asm_call_jit_compiler@highest /* load 64bit address */
364 ori mptr,mptr,L_asm_call_jit_compiler@higher
365 rldicr mptr,mptr,32,31
366 oris mptr,mptr,L_asm_call_jit_compiler@h
367 ori mptr,mptr,L_asm_call_jit_compiler@l
377 #if defined(__DARWIN__)
378 addi pv,itmp1,lo16(.asm_vm_call_method - 1b)
380 addi pv,itmp1,(.asm_vm_call_method - 1b)@l
383 L_asm_vm_call_method_return:
384 mr sp,s0 /* restore the function's sp */
386 ld s0,8*8(sp) /* restore used callee saved registers */
388 #if defined(__DARWIN__)
389 lwz itmp1,10*4(sp) /* register r11 is callee saved */
391 ld pv,11*8(sp) /* save PV register */
394 lfd ftmp1,13*8(sp) /* registers f14-f31 are callee saved */
397 #if defined(__DARWIN__)
413 RESTORE_TEMPORARY_REGISTERS(15) /* the offset has to be even */
416 ld r0,40*8+LA_LR_OFFSET(r1)
421 asm_vm_call_method_exception_handler:
423 bl builtin_throw_exception
424 b L_asm_vm_call_method_return
444 lwa a0,offvmargdata+4(itmp1)
447 lwa a1,offvmargdata+4(itmp1)
450 lwa a2,offvmargdata+4(itmp1)
453 lwa a3,offvmargdata+4(itmp1)
456 lwa a4,offvmargdata+4(itmp1)
459 lwa a5,offvmargdata+4(itmp1)
462 lwa a6,offvmargdata+4(itmp1)
465 lwa a7,offvmargdata+4(itmp1)
486 ld a0,offvmargdata(itmp1)
489 ld a1,offvmargdata(itmp1)
492 ld a2,offvmargdata(itmp1)
495 ld a3,offvmargdata(itmp1)
498 ld a4,offvmargdata(itmp1)
501 ld a5,offvmargdata(itmp1)
504 ld a6,offvmargdata(itmp1)
507 ld a7,offvmargdata(itmp1)
532 lfs fa0,offvmargdata(itmp1)
535 lfs fa1,offvmargdata(itmp1)
538 lfs fa2,offvmargdata(itmp1)
541 lfs fa3,offvmargdata(itmp1)
544 lfs fa4,offvmargdata(itmp1)
547 lfs fa5,offvmargdata(itmp1)
550 lfs fa6,offvmargdata(itmp1)
553 lfs fa7,offvmargdata(itmp1)
556 lfs fa8,offvmargdata(itmp1)
559 lfs fa9,offvmargdata(itmp1)
562 lfs fa10,offvmargdata(itmp1)
565 lfs fa11,offvmargdata(itmp1)
568 lfs fa12,offvmargdata(itmp1)
593 lfd fa0,offvmargdata(itmp1)
596 lfd fa1,offvmargdata(itmp1)
599 lfd fa2,offvmargdata(itmp1)
602 lfd fa3,offvmargdata(itmp1)
605 lfd fa4,offvmargdata(itmp1)
608 lfd fa5,offvmargdata(itmp1)
611 lfd fa6,offvmargdata(itmp1)
614 lfd fa7,offvmargdata(itmp1)
617 lfd fa8,offvmargdata(itmp1)
620 lfd fa9,offvmargdata(itmp1)
623 lfd fa10,offvmargdata(itmp1)
626 lfd fa11,offvmargdata(itmp1)
629 lfd fa12,offvmargdata(itmp1)
632 asm_vm_call_method_end:
635 /* asm_call_jit_compiler *******************************************************
637 Invokes the compiler for untranslated JavaVM methods.
639 *******************************************************************************/
641 asm_call_jit_compiler:
642 L_asm_call_jit_compiler: /* required for PIC code */
644 std r0,LA_LR_OFFSET(sp) /* save return address */
645 stdu r1,-(LA_SIZE+PA_SIZE+ARG_CNT*8)(sp)
647 #if defined(__DARWIN__)
648 stw a0,LA_SIZE+(5+0)*8(r1)
649 stw a1,LA_SIZE+(5+1)*8(r1)
650 stw a2,LA_SIZE+(5+2)*8(r1)
651 stw a3,LA_SIZE+(5+3)*8(r1)
652 stw a4,LA_SIZE+(5+4)*8(r1)
653 stw a5,LA_SIZE+(5+5)*8(r1)
654 stw a6,LA_SIZE+(5+6)*8(r1)
655 stw a7,LA_SIZE+(5+7)*8(r1)
657 stfd fa0,LA_SIZE+(5+8)*8(r1)
658 stfd fa1,LA_SIZE+(5+10)*8(r1)
659 stfd fa2,LA_SIZE+(5+12)*8(r1)
660 stfd fa3,LA_SIZE+(5+14)*8(r1)
661 stfd fa4,LA_SIZE+(5+16)*8(r1)
662 stfd fa5,LA_SIZE+(5+18)*8(r1)
663 stfd fa6,LA_SIZE+(5+20)*8(r1)
664 stfd fa7,LA_SIZE+(5+22)*8(r1)
665 stfd fa8,LA_SIZE+(5+24)*8(r1)
666 stfd fa9,LA_SIZE+(5+26)*8(r1)
667 stfd fa10,LA_SIZE+(5+28)*8(r1)
668 stfd fa11,LA_SIZE+(5+30)*8(r1)
669 stfd fa12,LA_SIZE+(5+32)*8(r1)
671 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
676 addi a2,sp,(LA_SIZE + PA_SIZE+ ARG_CNT*8)
677 ld a3,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
679 ori r0,r0,0 /* nop needed after jump to function desc. */
680 mr pv,v0 /* move address to pv register */
682 #if defined(__DARWIN__)
683 lwz a0,LA_SIZE+(+5+0)*8(r1)
684 lwz a1,LA_SIZE+(+5+1)*8(r1)
685 lwz a2,LA_SIZE+(+5+2)*8(r1)
686 lwz a3,LA_SIZE+(+5+3)*8(r1)
687 lwz a4,LA_SIZE+(+5+4)*8(r1)
688 lwz a5,LA_SIZE+(+5+5)*8(r1)
689 lwz a6,LA_SIZE+(+5+6)*8(r1)
690 lwz a7,LA_SIZE+(+5+7)*8(r1)
692 lfd fa0,LA_SIZE+(+5+8)*8(r1)
693 lfd fa1,LA_SIZE+(+5+10)*8(r1)
694 lfd fa2,LA_SIZE+(+5+12)*8(r1)
695 lfd fa3,LA_SIZE+(+5+14)*8(r1)
696 lfd fa4,LA_SIZE+(+5+16)*8(r1)
697 lfd fa5,LA_SIZE+(+5+18)*8(r1)
698 lfd fa6,LA_SIZE+(+5+20)*8(r1)
699 lfd fa7,LA_SIZE+(+5+22)*8(r1)
700 lfd fa8,LA_SIZE+(+5+24)*8(r1)
701 lfd fa9,LA_SIZE+(+5+26)*8(r1)
702 lfd fa10,LA_SIZE+(+5+28)*8(r1)
703 lfd fa11,LA_SIZE+(+5+30)*8(r1)
704 lfd fa12,LA_SIZE+(+5+32)*8(r1)
706 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS)
709 ld itmp1,(LA_SIZE + PA_SIZE + ARG_CNT*8)+LA_LR_OFFSET(sp)
712 addi sp,sp,(LA_SIZE + PA_SIZE + ARG_CNT*8)
714 mr. pv,pv /* test for exception */
715 beq L_asm_call_jit_compiler_exception
717 mtctr pv /* move method address to control reg */
718 bctr /* and call the Java method */
720 L_asm_call_jit_compiler_exception:
722 std r0,LA_LR_OFFSET(sp)
723 stdu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
724 bl exceptions_get_and_clear_exception
725 ld xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
727 addi sp,sp,LA_SIZE_ALIGNED
729 mr xptr,v0 /* get exception */
730 addi xpc,xpc,-4 /* exception address is ra - 4 */
731 b L_asm_handle_nat_exception
734 /********************* function asm_handle_exception ***************************
736 * This function handles an exception. It does not use the usual calling *
737 * conventions. The exception pointer is passed in REG_ITMP1 and the *
738 * pc from the exception raising position is passed in REG_ITMP2. It searches *
739 * the local exception table for a handler. If no one is found, it unwinds *
740 * stacks and continues searching the callers. *
742 * void asm_handle_exception (exceptionptr, exceptionpc); *
744 *******************************************************************************/
746 asm_handle_nat_exception:
747 L_asm_handle_nat_exception: /* required for PIC code */
748 L_asm_handle_exception_stack_loop:
750 addi sp,sp,-(LA_SIZE+PA_SIZE+((4+6)*8)) /* allocate stack (+4 for darwin) */
751 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
752 std xpc,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* save exception pc */
753 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* save return address */
755 std itmp3,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* save maybe-leaf flag (cleared) */
757 mr a0,r0 /* pass return address */
758 bl md_codegen_get_pv_from_pc /* get PV from RA */
759 std v0,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
761 ld a0,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* pass xptr */
762 ld a1,LA_SIZE+PA_SIZE+(4+1)*8(sp) /* pass xpc */
763 ld a2,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* pass PV (v0 == a0) */
764 addi a3,sp,LA_SIZE+PA_SIZE+((4+6)*8) /* pass Java SP */
766 b L_asm_handle_exception_continue
769 asm_handle_exception:
770 L_asm_handle_exception: /* required for PIC code */
771 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
773 #if defined(__DARWIN__)
775 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
776 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
779 addi sp,sp,-(LA_SIZE+PA_SIZE+(4+6)*8) /* allocate stack */
780 std xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* save exception pointer */
781 std pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* save data segment pointer */
782 mflr r0 /* save return address */
783 std r0,LA_SIZE+PA_SIZE+(4+3)*8(sp)
785 std t0, LA_SIZE+PA_SIZE+(4+4)*8(sp) /* maybe-leaf flag */
787 mr a0,xptr /* pass exception pointer */
788 mr a1,xpc /* pass exception pc */
789 mr a2,pv /* pass data segment pointer */
790 addi a3,sp,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*8
793 L_asm_handle_exception_continue:
794 bl exceptions_handle_exception
797 beq L_asm_handle_exception_not_catched
799 mr xpc,v0 /* move handlerpc into xpc */
800 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
801 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
802 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
804 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
805 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
808 beq L_asm_handle_exception_no_leaf
810 #if defined(__DARWIN__)
812 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
813 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
816 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
818 L_asm_handle_exception_no_leaf:
819 mtctr xpc /* jump to the handler */
822 L_asm_handle_exception_not_catched:
823 ld xptr,LA_SIZE+PA_SIZE+(4+0)*8(sp) /* restore exception pointer */
824 ld pv,LA_SIZE+PA_SIZE+(4+2)*8(sp) /* restore data segment pointer */
825 ld r0,LA_SIZE+PA_SIZE+(4+3)*8(sp) /* restore return address */
827 ld t0,LA_SIZE+PA_SIZE+(4+4)*8(sp) /* get maybe-leaf flag */
828 addi sp,sp,LA_SIZE+PA_SIZE+(4+6)*8 /* free stack frame */
831 beq L_asm_handle_exception_no_leaf_stack
833 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
834 li t0,0 /* clear the maybe-leaf flag */
836 L_asm_handle_exception_no_leaf_stack:
837 lwz t1,FrameSize(pv) /* get frame size */
838 add t1,sp,t1 /* pointer to save area */
840 lwz t2,IsLeaf(pv) /* is leaf procedure */
842 bne L_asm_handle_exception_no_ra_restore
844 ld r0,LA_LR_OFFSET(t1) /* restore ra */
847 L_asm_handle_exception_no_ra_restore:
848 mflr xpc /* the new xpc is ra */
849 mr t4,xpc /* save RA */
850 lwz t2,IntSave(pv) /* t1 = saved int register count */
853 mflr t3 /* t3 = current pc */
854 #if defined(__DARWIN__)
855 addi t2,t2,lo16(ex_int2-ex_int1)
857 addi t3,t3,(ex_int2-ex_int1)@l
859 slwi t2,t2,2 /* t2 = register count * 4 */
860 subf t3,t2,t3 /* t3 = IntSave - t2 */
875 subf t1,t2,t1 /* t1 = t1 - register count * 4 */
880 #if defined(__DARWIN__)
881 addi t2,t2,lo16(ex_flt2-ex_flt1)
883 addi t3,t3,(ex_flt2-ex_flt1)@l
885 slwi t2,t2,2 /* t2 = register count * 4 */
886 subf t3,t2,t3 /* t3 = FltSave - t2 */
902 mtlr t4 /* restore RA */
904 add sp,sp,t1 /* unwind stack */
905 b L_asm_handle_exception_stack_loop
908 /* asm_abstractmethoderror *****************************************************
910 Creates and throws an AbstractMethodError.
912 *******************************************************************************/
914 asm_abstractmethoderror:
916 stw r0,LA_LR_OFFSET(sp)
917 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
918 addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */
919 mr a1,r0 /* pass exception address */
920 bl exceptions_asm_new_abstractmethoderror
921 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
922 mtlr r0 /* restore return address */
923 addi sp,sp,LA_SIZE_ALIGNED
925 mr xptr,v0 /* get exception pointer */
926 mr xpc,r0 /* we can't use r0 directly in addi */
927 addi xpc,xpc,-4 /* exception address is ra - 4 */
928 b L_asm_handle_nat_exception
931 /* asm_patcher_wrapper *********************************************************
936 40 return address into JIT code (patch position)
937 32 pointer to virtual java_objectheader
938 24 machine code (which is patched back later)
939 16 unresolved class/method/field reference
940 8 data segment displacement from load instructions
941 0 patcher function pointer to call (pv is saved here afterwards)
943 *******************************************************************************/
946 mflr r0 /* get Java return address (leaf) */
947 std r0,6*8(sp) /* store it in the stub stackframe */
948 /* keep stack 16-bytes aligned: 6+1+37 = 44 */
949 stdu sp,-(LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8)(sp)
951 #if defined(__DARWIN__)
952 stw a0,LA_SIZE+(5+0)*8(r1) /* save argument registers */
953 stw a1,LA_SIZE+(5+1)*8(r1) /* preserve linkage area (24 bytes) */
954 stw a2,LA_SIZE+(5+2)*8(r1) /* and 4 bytes for 4 argument */
955 stw a3,LA_SIZE+(5+3)*8(r1)
956 stw a4,LA_SIZE+(5+4)*8(r1)
957 stw a5,LA_SIZE+(5+5)*8(r1)
958 stw a6,LA_SIZE+(5+6)*8(r1)
959 stw a7,LA_SIZE+(5+7)*8(r1)
961 stfd fa0,LA_SIZE+(5+8)*8(sp)
962 stfd fa1,LA_SIZE+(5+10)*8(sp)
963 stfd fa2,LA_SIZE+(5+12)*8(sp)
964 stfd fa3,LA_SIZE+(5+14)*8(sp)
965 stfd fa4,LA_SIZE+(5+16)*8(sp)
966 stfd fa5,LA_SIZE+(5+18)*8(sp)
967 stfd fa6,LA_SIZE+(5+20)*8(sp)
968 stfd fa7,LA_SIZE+(5+22)*8(sp)
969 stfd fa8,LA_SIZE+(5+24)*8(sp)
970 stfd fa9,LA_SIZE+(5+26)*8(sp)
971 stfd fa10,LA_SIZE+(5+28)*8(sp)
972 stfd fa11,LA_SIZE+(5+30)*8(sp)
973 stfd fa12,LA_SIZE+(5+32)*8(sp) /* XXX */
975 stw t0,LA_SIZE+(+5+33)*8(r1)
976 stw t1,LA_SIZE+(+5+34)*8(r1)
977 stw t2,LA_SIZE+(+5+35)*8(r1)
978 stw t3,LA_SIZE+(+5+36)*8(r1)
979 stw t4,LA_SIZE+(+5+37)*8(r1)
980 stw t5,LA_SIZE+(+5+38)*8(r1)
981 stw t6,LA_SIZE+(+5+39)*8(r1)
982 stw t7,LA_SIZE+(+5+40)*8(r1)
984 stfd ft0,LA_SIZE+(+5+42)*8(r1)
985 stfd ft1,LA_SIZE+(+5+44)*8(r1)
986 stfd ft2,LA_SIZE+(+5+46)*8(r1)
987 stfd ft3,LA_SIZE+(+5+48)*8(r1)
988 stfd ft4,LA_SIZE+(+5+50)*8(r1)
989 stfd ft5,LA_SIZE+(+5+52)*8(r1)
991 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* save 8 int/8 float arguments */
992 SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
995 std itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
996 std itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
997 std pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
999 addi a0,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8 /* pass SP of patcher stub */
1000 mr a1,pv /* pass PV */
1001 mr a2,r0 /* pass RA (correct for leafs) */
1003 std v0,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp) /* save return value */
1005 #if defined(__DARWIN__)
1006 lwz a0,LA_SIZE+(5+0)*8(r1)
1007 lwz a1,LA_SIZE+(5+1)*8(r1)
1008 lwz a2,LA_SIZE+(5+2)*8(r1)
1009 lwz a3,LA_SIZE+(5+3)*8(r1)
1010 lwz a4,LA_SIZE+(5+4)*8(r1)
1011 lwz a5,LA_SIZE+(5+5)*8(r1)
1012 lwz a6,LA_SIZE+(5+6)*8(r1)
1013 lwz a7,LA_SIZE+(5+7)*8(r1)
1015 lfd fa0,LA_SIZE+(5+8)*8(sp)
1016 lfd fa1,LA_SIZE+(5+10)*8(sp)
1017 lfd fa2,LA_SIZE+(5+12)*8(sp)
1018 lfd fa3,LA_SIZE+(5+14)*8(sp)
1019 lfd fa4,LA_SIZE+(5+16)*8(sp)
1020 lfd fa5,LA_SIZE+(5+18)*8(sp)
1021 lfd fa6,LA_SIZE+(5+20)*8(sp)
1022 lfd fa7,LA_SIZE+(5+22)*8(sp)
1023 lfd fa8,LA_SIZE+(5+24)*8(sp)
1024 lfd fa9,LA_SIZE+(5+26)*8(sp)
1025 lfd fa10,LA_SIZE+(5+28)*8(sp)
1026 lfd fa11,LA_SIZE+(5+30)*8(sp)
1027 lfd fa12,LA_SIZE+(5+32)*8(sp)
1029 lwz t0,LA_SIZE+(+5+33)*8(r1)
1030 lwz t1,LA_SIZE+(+5+34)*8(r1)
1031 lwz t2,LA_SIZE+(+5+35)*8(r1)
1032 lwz t3,LA_SIZE+(+5+36)*8(r1)
1033 lwz t4,LA_SIZE+(+5+37)*8(r1)
1034 lwz t5,LA_SIZE+(+5+38)*8(r1)
1035 lwz t6,LA_SIZE+(+5+39)*8(r1)
1036 lwz t7,LA_SIZE+(+5+40)*8(r1)
1038 lfd ft0,LA_SIZE+(+5+42)*8(r1)
1039 lfd ft1,LA_SIZE+(+5+44)*8(r1)
1040 lfd ft2,LA_SIZE+(+5+46)*8(r1)
1041 lfd ft3,LA_SIZE+(+5+48)*8(r1)
1042 lfd ft4,LA_SIZE+(+5+50)*8(r1)
1043 lfd ft5,LA_SIZE+(+5+52)*8(r1)
1045 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS) /* restore 8 int/8 float args */
1046 RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+PA_SIZE_IN_POINTERS+ARG_CNT)
1049 ld itmp1,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+1*8(sp)
1050 ld itmp2,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+2*8(sp)
1051 ld pv,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+3*8(sp)
1052 ld itmp3,LA_SIZE+PA_SIZE+(ARG_CNT+TMP_CNT)*8+4*8(sp)
1054 ld r0,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+6*8(sp) /* restore RA */
1057 mr. itmp3,itmp3 /* check for an exception */
1058 bne L_asm_patcher_wrapper_exception
1060 /* get return address (into JIT code) */
1061 ld itmp3,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1063 /* remove stack frame + patcher stub stack */
1064 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1067 bctr /* jump to new patched code */
1069 L_asm_patcher_wrapper_exception:
1070 mr xptr,itmp3 /* get exception */
1071 ld xpc,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+5*8(sp)
1072 addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
1073 b L_asm_handle_exception
1075 #if defined(ENABLE_REPLACEMENT)
1077 /* asm_replacement_out *********************************************************
1079 This code is jumped to from the replacement-out stubs that are executed
1080 when a thread reaches an activated replacement point.
1082 The purpose of asm_replacement_out is to read out the parts of the
1083 execution state that cannot be accessed from C code, store this state,
1084 and then call the C function replace_me.
1087 16 start of stack inside method to replace
1088 0 rplpoint * info on the replacement point that was reached
1090 NOTE: itmp3 has been clobbered by the replacement-out stub!
1092 *******************************************************************************/
1094 /* some room to accomodate changes of the stack frame size during replacement */
1095 /* XXX we should find a cleaner solution here */
1096 #define REPLACEMENT_ROOM 512
1098 asm_replacement_out:
1099 /* create stack frame */
1100 addi sp,sp,-(sizeexecutionstate + REPLACEMENT_ROOM) /* XXX align */
1102 /* save link register */
1105 /* save registers in execution state */
1106 stw r0 ,( 0*8+offes_intregs)(sp)
1107 stw r1 ,( 1*8+offes_intregs)(sp)
1108 stw r2 ,( 2*8+offes_intregs)(sp)
1109 stw r3 ,( 3*8+offes_intregs)(sp)
1110 stw r4 ,( 4*8+offes_intregs)(sp)
1111 stw r5 ,( 5*8+offes_intregs)(sp)
1112 stw r6 ,( 6*8+offes_intregs)(sp)
1113 stw r7 ,( 7*8+offes_intregs)(sp)
1114 stw r8 ,( 8*8+offes_intregs)(sp)
1115 stw r9 ,( 9*8+offes_intregs)(sp)
1116 stw r10,(10*8+offes_intregs)(sp)
1117 stw r11,(11*8+offes_intregs)(sp)
1118 stw r12,(12*8+offes_intregs)(sp)
1119 stw r13,(13*8+offes_intregs)(sp)
1120 stw r14,(14*8+offes_intregs)(sp)
1121 stw r15,(15*8+offes_intregs)(sp)
1122 stw r16,(16*8+offes_intregs)(sp) /* link register */
1123 stw r17,(17*8+offes_intregs)(sp)
1124 stw r18,(18*8+offes_intregs)(sp)
1125 stw r19,(19*8+offes_intregs)(sp)
1126 stw r20,(20*8+offes_intregs)(sp)
1127 stw r21,(21*8+offes_intregs)(sp)
1128 stw r22,(22*8+offes_intregs)(sp)
1129 stw r23,(23*8+offes_intregs)(sp)
1130 stw r24,(24*8+offes_intregs)(sp)
1131 stw r25,(25*8+offes_intregs)(sp)
1132 stw r26,(26*8+offes_intregs)(sp)
1133 stw r27,(27*8+offes_intregs)(sp)
1134 stw r28,(28*8+offes_intregs)(sp)
1135 stw r29,(29*8+offes_intregs)(sp)
1136 stw r30,(30*8+offes_intregs)(sp)
1137 stw r31,(31*8+offes_intregs)(sp)
1139 stfd fr0 ,( 0*8+offes_fltregs)(sp)
1140 stfd fr1 ,( 1*8+offes_fltregs)(sp)
1141 stfd fr2 ,( 2*8+offes_fltregs)(sp)
1142 stfd fr3 ,( 3*8+offes_fltregs)(sp)
1143 stfd fr4 ,( 4*8+offes_fltregs)(sp)
1144 stfd fr5 ,( 5*8+offes_fltregs)(sp)
1145 stfd fr6 ,( 6*8+offes_fltregs)(sp)
1146 stfd fr7 ,( 7*8+offes_fltregs)(sp)
1147 stfd fr8 ,( 8*8+offes_fltregs)(sp)
1148 stfd fr9 ,( 9*8+offes_fltregs)(sp)
1149 stfd fr10,(10*8+offes_fltregs)(sp)
1150 stfd fr11,(11*8+offes_fltregs)(sp)
1151 stfd fr12,(12*8+offes_fltregs)(sp)
1152 stfd fr13,(13*8+offes_fltregs)(sp)
1153 stfd fr14,(14*8+offes_fltregs)(sp)
1154 stfd fr15,(15*8+offes_fltregs)(sp)
1155 stfd fr16,(16*8+offes_fltregs)(sp)
1156 stfd fr17,(17*8+offes_fltregs)(sp)
1157 stfd fr18,(18*8+offes_fltregs)(sp)
1158 stfd fr19,(19*8+offes_fltregs)(sp)
1159 stfd fr20,(20*8+offes_fltregs)(sp)
1160 stfd fr21,(21*8+offes_fltregs)(sp)
1161 stfd fr22,(22*8+offes_fltregs)(sp)
1162 stfd fr23,(23*8+offes_fltregs)(sp)
1163 stfd fr24,(24*8+offes_fltregs)(sp)
1164 stfd fr25,(25*8+offes_fltregs)(sp)
1165 stfd fr26,(26*8+offes_fltregs)(sp)
1166 stfd fr27,(27*8+offes_fltregs)(sp)
1167 stfd fr28,(28*8+offes_fltregs)(sp)
1168 stfd fr29,(29*8+offes_fltregs)(sp)
1169 stfd fr30,(30*8+offes_fltregs)(sp)
1170 stfd fr31,(31*8+offes_fltregs)(sp)
1172 /* calculate sp of method */
1173 addi itmp1,sp,(sizeexecutionstate + REPLACEMENT_ROOM + 4*4)
1174 stw itmp1,(offes_sp)(sp)
1177 stw pv,(offes_pv)(sp)
1179 /* call replace_me */
1180 lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */
1181 mr a1,sp /* arg1: execution state */
1182 addi sp,sp,-(LA_SIZE_ALIGNED)
1183 b replace_me /* call C function replace_me */
1185 /* asm_replacement_in **********************************************************
1187 This code writes the given execution state and jumps to the replacement
1190 This function never returns!
1192 NOTE: itmp3 is not restored!
1195 void asm_replacement_in(executionstate *es);
1197 *******************************************************************************/
1199 .asm_replacement_in:
1200 /* a0 == executionstate *es */
1202 /* set new sp and pv */
1203 lwz sp,(offes_sp)(a0)
1204 lwz pv,(offes_pv)(a0)
1206 /* copy registers from execution state */
1207 lwz r0 ,( 0*8+offes_intregs)(a0)
1209 /* r2 is reserved */
1210 /* a0 is loaded below */
1211 lwz r4 ,( 4*8+offes_intregs)(a0)
1212 lwz r5 ,( 5*8+offes_intregs)(a0)
1213 lwz r6 ,( 6*8+offes_intregs)(a0)
1214 lwz r7 ,( 7*8+offes_intregs)(a0)
1215 lwz r8 ,( 8*8+offes_intregs)(a0)
1216 lwz r9 ,( 9*8+offes_intregs)(a0)
1217 lwz r10,(10*8+offes_intregs)(a0)
1218 lwz r11,(11*8+offes_intregs)(a0)
1219 lwz r12,(12*8+offes_intregs)(a0)
1221 lwz r14,(14*8+offes_intregs)(a0)
1222 lwz r15,(15*8+offes_intregs)(a0)
1223 lwz r16,(16*8+offes_intregs)(a0) /* link register */
1224 lwz r17,(17*8+offes_intregs)(a0)
1225 lwz r18,(18*8+offes_intregs)(a0)
1226 lwz r19,(19*8+offes_intregs)(a0)
1227 lwz r20,(20*8+offes_intregs)(a0)
1228 lwz r21,(21*8+offes_intregs)(a0)
1229 lwz r22,(22*8+offes_intregs)(a0)
1230 lwz r23,(23*8+offes_intregs)(a0)
1231 lwz r24,(24*8+offes_intregs)(a0)
1232 lwz r25,(25*8+offes_intregs)(a0)
1233 lwz r26,(26*8+offes_intregs)(a0)
1234 lwz r27,(27*8+offes_intregs)(a0)
1235 lwz r28,(28*8+offes_intregs)(a0)
1236 lwz r29,(29*8+offes_intregs)(a0)
1237 lwz r30,(30*8+offes_intregs)(a0)
1238 lwz r31,(31*8+offes_intregs)(a0)
1240 lfd fr0 ,( 0*8+offes_fltregs)(a0)
1241 lfd fr1 ,( 1*8+offes_fltregs)(a0)
1242 lfd fr2 ,( 2*8+offes_fltregs)(a0)
1243 lfd fr3 ,( 3*8+offes_fltregs)(a0)
1244 lfd fr4 ,( 4*8+offes_fltregs)(a0)
1245 lfd fr5 ,( 5*8+offes_fltregs)(a0)
1246 lfd fr6 ,( 6*8+offes_fltregs)(a0)
1247 lfd fr7 ,( 7*8+offes_fltregs)(a0)
1248 lfd fr8 ,( 8*8+offes_fltregs)(a0)
1249 lfd fr9 ,( 9*8+offes_fltregs)(a0)
1250 lfd fr10,(10*8+offes_fltregs)(a0)
1251 lfd fr11,(11*8+offes_fltregs)(a0)
1252 lfd fr12,(12*8+offes_fltregs)(a0)
1253 lfd fr13,(13*8+offes_fltregs)(a0)
1254 lfd fr14,(14*8+offes_fltregs)(a0)
1255 lfd fr15,(15*8+offes_fltregs)(a0)
1256 lfd fr16,(16*8+offes_fltregs)(a0)
1257 lfd fr17,(17*8+offes_fltregs)(a0)
1258 lfd fr18,(18*8+offes_fltregs)(a0)
1259 lfd fr19,(19*8+offes_fltregs)(a0)
1260 lfd fr20,(20*8+offes_fltregs)(a0)
1261 lfd fr21,(21*8+offes_fltregs)(a0)
1262 lfd fr22,(22*8+offes_fltregs)(a0)
1263 lfd fr23,(23*8+offes_fltregs)(a0)
1264 lfd fr24,(24*8+offes_fltregs)(a0)
1265 lfd fr25,(25*8+offes_fltregs)(a0)
1266 lfd fr26,(26*8+offes_fltregs)(a0)
1267 lfd fr27,(27*8+offes_fltregs)(a0)
1268 lfd fr28,(28*8+offes_fltregs)(a0)
1269 lfd fr29,(29*8+offes_fltregs)(a0)
1270 lfd fr30,(30*8+offes_fltregs)(a0)
1271 lfd fr31,(31*8+offes_fltregs)(a0)
1273 /* restore link register */
1279 lwz itmp3,offes_pc(a0)
1283 lwz a0,(3*8+offes_intregs)(a0)
1285 /* jump to new code */
1290 #endif /* defined(ENABLE_REPLACEMENT) */
1292 /* asm_cacheflush **************************************************************
1293 copied from linux/arch/ppc64/kernel/vdso64/cacheflush.S
1294 assumes 128 byte cache line size.
1295 All registers used may be trashed for fun and profit.
1296 *******************************************************************************/
1298 .section ".opd","aw"
1301 .quad .asm_cacheflush,.TOC.@tocbase,0
1303 .size asm_cacheflush, 24
1304 .type .asm_cacheflush,@function
1305 .globl .asm_cacheflush
1307 /* construct the AND mask */
1308 li r6, 0xffffffffffff8000
1309 ori r6,r6,0x000000000000ff80
1336 asm_getclassvalues_atomic
1338 .section ".opd","aw"
1340 asm_getclassvalues_atomic:
1341 .quad .asm_getclassvalues_atomic,.TOC.@tocbase,0
1343 .size asm_getclassvalues_atomic, 24
1344 .type .asm_getclassvalues_atomic,@function
1345 .globl .asm_getclassvalues_atomic
1346 .asm_getclassvalues_atomic:
1350 lwz r6,offbaseval(r3)
1351 lwz r7,offdiffval(r3)
1352 lwz r8,offbaseval(r4)
1354 stw r6,offcast_super_baseval(r5)
1355 stw r7,offcast_super_diffval(r5)
1356 stw r8,offcast_sub_baseval(r5)
1361 asm_criticalsections:
1362 #if defined(ENABLE_THREADS)
1370 #if defined(__DARWIN__)
1372 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1374 L_builtin_throw_exception$stub:
1375 .indirect_symbol _builtin_throw_exception
1377 bcl 20,31,L00$_builtin_throw_exception
1378 L00$_builtin_throw_exception:
1380 addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1382 lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1386 .lazy_symbol_pointer
1387 L_builtin_throw_exception$lazy_ptr:
1388 .indirect_symbol _builtin_throw_exception
1389 .long dyld_stub_binding_helper
1392 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1394 L_exceptions_handle_exception$stub:
1395 .indirect_symbol _exceptions_handle_exception
1397 bcl 20,31,L00$_exceptions_handle_exception
1398 L00$_exceptions_handle_exception:
1400 addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1402 lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1406 .lazy_symbol_pointer
1407 L_exceptions_handle_exception$lazy_ptr:
1408 .indirect_symbol _exceptions_handle_exception
1409 .long dyld_stub_binding_helper
1412 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1414 L_stacktrace_create_extern_stackframeinfo$stub:
1415 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1417 bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1418 L00$_stacktrace_create_extern_stackframeinfo:
1420 addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1422 lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1426 .lazy_symbol_pointer
1427 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1428 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1429 .long dyld_stub_binding_helper
1432 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1434 L_jit_asm_compile$stub:
1435 .indirect_symbol _jit_asm_compile
1437 bcl 20,31,L00$_jit_asm_compile
1438 L00$_jit_asm_compile:
1440 addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1442 lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1446 .lazy_symbol_pointer
1447 L_jit_asm_compile$lazy_ptr:
1448 .indirect_symbol _jit_asm_compile
1449 .long dyld_stub_binding_helper
1451 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1453 L_stacktrace_remove_stackframeinfo$stub:
1454 .indirect_symbol _stacktrace_remove_stackframeinfo
1456 bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1457 L00$_stacktrace_remove_stackframeinfo:
1459 addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1461 lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1465 .lazy_symbol_pointer
1466 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1467 .indirect_symbol _stacktrace_remove_stackframeinfo
1468 .long dyld_stub_binding_helper
1471 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1473 L_exceptions_get_and_clear_exception$stub:
1474 .indirect_symbol _exceptions_get_and_clear_exception
1476 bcl 20,31,L00$_exceptions_get_and_clear_exception
1477 L00$_exceptions_get_and_clear_exception:
1479 addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
1481 lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
1485 .lazy_symbol_pointer
1486 L_exceptions_get_and_clear_exception$lazy_ptr:
1487 .indirect_symbol _exceptions_get_and_clear_exception
1488 .long dyld_stub_binding_helper
1491 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1493 L_exceptions_asm_new_abstractmethoderror$stub:
1494 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1496 bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
1497 L00$_exceptions_asm_new_abstractmethoderror:
1499 addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
1501 lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
1505 .lazy_symbol_pointer
1506 L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
1507 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1508 .long dyld_stub_binding_helper
1511 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1513 L_patcher_wrapper$stub:
1514 .indirect_symbol _patcher_wrapper
1516 bcl 20,31,L00$_patcher_wrapper
1517 L00$_patcher_wrapper:
1519 addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
1521 lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
1525 .lazy_symbol_pointer
1526 L_patcher_wrapper$lazy_ptr:
1527 .indirect_symbol _patcher_wrapper
1528 .long dyld_stub_binding_helper
1531 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1534 .indirect_symbol _replace_me
1536 bcl 20,31,L00$_replace_me
1539 addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1541 lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1545 .lazy_symbol_pointer
1546 L_replace_me$lazy_ptr:
1547 .indirect_symbol _replace_me
1548 .long dyld_stub_binding_helper
1550 #endif /* defined(__DARWIN__) */
1553 /* disable exec-stacks ********************************************************/
1555 #if defined(__linux__) && defined(__ELF__)
1556 .section .note.GNU-stack,"",@progbits
1561 * These are local overrides for various environment variables in Emacs.
1562 * Please do not remove this and leave it at the end of the file, where
1563 * Emacs will automagically detect them.
1564 * ---------------------------------------------------------------------
1567 * indent-tabs-mode: t
1571 * vim:noexpandtab:sw=4:ts=4: