1 /* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software.text; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY ; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: asmpart.S 8216 2007-07-19 13:51:21Z michi $
35 #include "vm/jit/abi-asm.h"
36 #include "vm/jit/methodheader.h"
37 #include "vm/jit/powerpc/offsets.h"
45 /* export functions ***********************************************************/
47 .globl asm_vm_call_method
48 .globl asm_vm_call_method_int
49 .globl asm_vm_call_method_long
50 .globl asm_vm_call_method_float
51 .globl asm_vm_call_method_double
53 .globl asm_vm_call_method_exception_handler
54 .globl asm_vm_call_method_end
56 .globl asm_call_jit_compiler
58 .globl asm_handle_nat_exception
59 .globl asm_handle_exception
61 .globl asm_abstractmethoderror
63 #if defined(ENABLE_REPLACEMENT)
64 .globl asm_replacement_out
65 .globl asm_replacement_in
70 .globl asm_compare_and_swap
71 .globl asm_memory_barrier
73 .globl asm_criticalsections
74 .globl asm_getclassvalues_atomic
77 /* asm_vm_call_method **********************************************************
79 * This function calls a Java-method (which possibly needs compilation) *
80 * with up to 4 address parameters. *
82 * This functions calls the JIT-compiler which eventually translates the *
83 * method into machine code. *
86 * javaobject_header *asm_calljavamethod (methodinfo *m, *
87 * void *arg1, void *arg2, void *arg3, void *arg4); *
89 *******************************************************************************/
93 .long 0 /* catch type all */
94 .long 0 /* exception handler pc */
96 .long 0 /* start pc */
97 .long 1 /* extable size */
98 .long 0 /* line number table start */
99 .long 0 /* line number table size */
100 .long 0 /* fltsave */
101 .long 0 /* intsave */
104 .long 0 /* frame size */
105 .long 0 /* codeinfo pointer */
108 asm_vm_call_method_int:
109 asm_vm_call_method_long:
110 asm_vm_call_method_float:
111 asm_vm_call_method_double:
113 stw r0,LA_LR_OFFSET(sp)
114 stwu sp,-40*4(sp) /* keep stack 16-byte aligned */
116 stw s0,8*4(sp) /* save used callee saved registers */
117 stw a0,9*4(sp) /* save method pointer for compiler */
119 #if defined(__DARWIN__)
120 stw itmp1,10*4(sp) /* register r11 is callee saved */
122 stw pv,11*4(sp) /* save PV register */
124 stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
125 stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
128 #if defined(__DARWIN__)
144 SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
147 mr itmp2,a1 /* arg count */
148 mr itmp1,a2 /* pointer to arg block */
150 mr t4,itmp2 /* save argument count */
151 mr t5,itmp1 /* save argument block pointer */
153 mr s0,sp /* save current sp to s0 */
155 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
156 addi itmp2,itmp2,1 /* initialize argument count */
157 li t0,0 /* initialize integer argument counter */
158 li t1,0 /* initialize float argument counter */
159 li t6,0 /* initialize integer register counter */
160 #if defined(__DARWIN__)
161 li t7,0 /* initialize stack slot counter */
164 mflr r0 /* save link register (PIC code) */
165 bl L_asm_vm_call_method_get_pc
166 L_asm_vm_call_method_get_pc:
167 mflr t3 /* t3 contains the current pc */
171 addi itmp1,itmp1,sizevmarg /* goto next argument block */
172 addi itmp2,itmp2,-1 /* argument count - 1 */
174 beq L_register_copy_done
176 lwz itmp3,offvmargtype+4(itmp1)
177 andi. r0,itmp3,0x0002 /* is this a float/double type? */
178 bne L_register_handle_float
180 L_register_handle_int:
181 cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
182 beq L_register_copy /* registers? yes, next loop */
184 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
185 bne L_register_handle_long
187 #if defined(__DARWIN__)
188 addis itmp3,t3,ha16(L_jumptable_int - L_asm_vm_call_method_get_pc)
189 la itmp3,lo16(L_jumptable_int - L_asm_vm_call_method_get_pc)(itmp3)
191 lis itmp3,L_jumptable_int@ha
192 addi itmp3,itmp3,L_jumptable_int@l
195 slwi t2,t6,2 /* multiple of 4-bytes */
196 add itmp3,itmp3,t2 /* calculate address of jumptable */
197 lwz itmp3,0(itmp3) /* load function address */
199 addi t0,t0,1 /* integer argument counter */
200 addi t6,t6,1 /* integer argument register counter */
201 #if defined(__DARWIN__)
202 addi t7,t7,1 /* stack slot counter */
206 L_register_handle_long:
207 #if defined(__DARWIN__)
208 addis itmp3,t3,ha16(L_jumptable_long - L_asm_vm_call_method_get_pc)
209 la itmp3,lo16(L_jumptable_long - L_asm_vm_call_method_get_pc)(itmp3)
211 lis itmp3,L_jumptable_long@ha
212 addi itmp3,itmp3,L_jumptable_long@l
214 #if !defined(__DARWIN__)
215 addi t6,t6,1 /* align to even numbers */
219 cmpwi t6,(INT_ARG_CNT - 1) /* are we out of integer argument */
220 blt L_register_handle_long_continue /* registers? */
222 li t6,INT_ARG_CNT /* yes, set integer argument register */
223 b L_register_copy /* count to max and next loop */
225 L_register_handle_long_continue:
226 slwi t2,t6,2 /* multiple of 4-bytes */
227 add itmp3,itmp3,t2 /* calculate address of jumptable */
228 lwz itmp3,0(itmp3) /* load function address */
230 addi t0,t0,1 /* integer argument counter */
231 addi t6,t6,2 /* integer argument register counter */
232 #if defined(__DARWIN__)
233 addi t7,t7,2 /* stack slot counter */
237 L_register_handle_float:
238 cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
239 beq L_register_copy /* registers? yes, next loop */
241 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
242 bne L_register_handle_double
244 #if defined(__DARWIN__)
245 addis itmp3,t3,ha16(L_jumptable_float - L_asm_vm_call_method_get_pc)
246 la itmp3,lo16(L_jumptable_float - L_asm_vm_call_method_get_pc)(itmp3)
248 lis itmp3,L_jumptable_float@ha
249 addi itmp3,itmp3,L_jumptable_float@l
252 slwi t2,t1,2 /* multiple of 4-bytes */
253 add itmp3,itmp3,t2 /* calculate address of jumptable */
254 lwz itmp3,0(itmp3) /* load function address */
256 addi t1,t1,1 /* float argument counter */
257 #if defined(__DARWIN__)
258 addi t7,t7,1 /* stack slot counter */
259 addi t6,t6,1 /* skip 1 integer argument register */
263 L_register_handle_double:
264 #if defined(__DARWIN__)
265 addis itmp3,t3,ha16(L_jumptable_double - L_asm_vm_call_method_get_pc)
266 la itmp3,lo16(L_jumptable_double - L_asm_vm_call_method_get_pc)(itmp3)
268 lis itmp3,L_jumptable_double@ha
269 addi itmp3,itmp3,L_jumptable_double@l
272 slwi t2,t1,2 /* multiple of 4-bytes */
273 add itmp3,itmp3,t2 /* calculate address of jumptable */
274 lwz itmp3,0(itmp3) /* load function address */
276 addi t1,t1,1 /* float argument counter */
277 #if defined(__DARWIN__)
278 addi t7,t7,2 /* stack slot counter */
279 addi t6,t6,2 /* skip 2 integer argument registers */
283 L_register_copy_done:
284 /* calculate remaining arguments */
285 sub itmp3,t4,t0 /* - integer arguments in registers */
286 sub itmp3,itmp3,t1 /* - float arguments in registers */
288 beq L_stack_copy_done
290 mr itmp2,t4 /* restore argument count */
291 mr itmp1,t5 /* restore argument block pointer */
293 slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
294 addi t4,t4,LA_SIZE /* add size of linkage area */
296 #if defined(__DARWIN__)
297 slwi t5,t7,2 /* add stack space for arguments */
303 mr t6,sp /* use t6 as temporary sp */
304 addi t6,t6,LA_SIZE /* skip linkage area */
305 #if defined(__DARWIN__)
306 add t6,t6,t5 /* skip stack space for arguments */
309 addi itmp1,itmp1,-sizevmarg /* initialize pointer (smaller code) */
310 addi itmp2,itmp2,1 /* initialize argument count */
313 addi itmp1,itmp1,sizevmarg /* goto next argument block */
314 addi itmp2,itmp2,-1 /* argument count - 1 */
316 beq L_stack_copy_done
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 lwz itmp3,offvmargdata+4(itmp1) /* get integer argument */
331 stw itmp3,0(t6) /* and store it on the stack */
332 addi t6,t6,4 /* increase temporary sp by 1 slot */
336 #if !defined(__DARWIN__)
337 addi t6,t6,4 /* align stack to 8-bytes */
338 rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
341 lwz itmp3,offvmargdata+0(itmp1) /* get long argument */
342 stw itmp3,0(t6) /* and store it on the stack */
343 lwz itmp3,offvmargdata+4(itmp1)
345 addi t6,t6,8 /* increase temporary sp by 2 slots */
348 L_stack_handle_float:
349 addi t1,t1,-1 /* arguments assigned to registers */
351 bge L_stack_copy_loop
353 andi. r0,itmp3,0x0001 /* is this a 2-word type? */
354 bne L_stack_handle_double
356 lfs ftmp3,offvmargdata(itmp1) /* get float argument */
357 stfs ftmp3,0(t6) /* and store it on the stack */
358 addi t6,t6,4 /* increase temporary sp by 1 slot */
361 L_stack_handle_double:
362 #if !defined(__DARWIN__)
363 addi t6,t6,4 /* align stack to 8-bytes */
364 rlwinm t6,t6,0,30,28 /* clear lower 4-bits */
367 lfd ftmp3,offvmargdata(itmp1) /* get double argument */
368 stfd ftmp3,0(t6) /* and store it on the stack */
369 addi t6,t6,8 /* increase temporary sp by 2 slots */
373 lwz itmp1,9*4(s0) /* pass method pointer via tmp1 */
375 #if defined(__DARWIN__)
376 addis mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
377 la mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
379 lis mptr,L_asm_call_jit_compiler@ha
380 addi mptr,mptr,L_asm_call_jit_compiler@l
390 #if defined(__DARWIN__)
391 addi pv,itmp1,lo16(asm_vm_call_method - 1b)
393 addi pv,itmp1,(asm_vm_call_method - 1b)@l
396 L_asm_vm_call_method_return:
397 mr sp,s0 /* restore the function's sp */
399 lwz s0,8*4(sp) /* restore used callee saved registers */
401 #if defined(__DARWIN__)
402 lwz itmp1,10*4(sp) /* register r11 is callee saved */
404 lwz pv,11*4(sp) /* save PV register */
407 lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
410 #if defined(__DARWIN__)
426 RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
429 lwz r0,40*4+LA_LR_OFFSET(sp)
434 asm_vm_call_method_exception_handler:
436 bl builtin_throw_exception
437 b L_asm_vm_call_method_return
457 lwz a0,offvmargdata+4(itmp1)
460 lwz a1,offvmargdata+4(itmp1)
463 lwz a2,offvmargdata+4(itmp1)
466 lwz a3,offvmargdata+4(itmp1)
469 lwz a4,offvmargdata+4(itmp1)
472 lwz a5,offvmargdata+4(itmp1)
475 lwz a6,offvmargdata+4(itmp1)
478 lwz a7,offvmargdata+4(itmp1)
486 #if defined(__DARWIN__)
495 /* we have two entries here, so we get the even argument register
496 alignment for linux */
511 lwz a0,offvmargdata+0(itmp1)
512 lwz a1,offvmargdata+4(itmp1)
514 #if defined(__DARWIN__)
516 lwz a1,offvmargdata+0(itmp1)
517 lwz a2,offvmargdata+4(itmp1)
521 lwz a2,offvmargdata+0(itmp1)
522 lwz a3,offvmargdata+4(itmp1)
524 #if defined(__DARWIN__)
526 lwz a3,offvmargdata+0(itmp1)
527 lwz a4,offvmargdata+4(itmp1)
531 lwz a4,offvmargdata+0(itmp1)
532 lwz a5,offvmargdata+4(itmp1)
534 #if defined(__DARWIN__)
536 lwz a5,offvmargdata+0(itmp1)
537 lwz a6,offvmargdata+4(itmp1)
541 lwz a6,offvmargdata+0(itmp1)
542 lwz a7,offvmargdata+4(itmp1)
559 #if defined(__DARWIN__)
571 lfs fa0,offvmargdata(itmp1)
574 lfs fa1,offvmargdata(itmp1)
577 lfs fa2,offvmargdata(itmp1)
580 lfs fa3,offvmargdata(itmp1)
583 lfs fa4,offvmargdata(itmp1)
586 lfs fa5,offvmargdata(itmp1)
589 lfs fa6,offvmargdata(itmp1)
592 lfs fa7,offvmargdata(itmp1)
595 #if defined(__DARWIN__)
597 lfs fa8,offvmargdata(itmp1)
600 lfs fa9,offvmargdata(itmp1)
603 lfs fa10,offvmargdata(itmp1)
606 lfs fa11,offvmargdata(itmp1)
609 lfs fa12,offvmargdata(itmp1)
627 #if defined(__DARWIN__)
639 lfd fa0,offvmargdata(itmp1)
642 lfd fa1,offvmargdata(itmp1)
645 lfd fa2,offvmargdata(itmp1)
648 lfd fa3,offvmargdata(itmp1)
651 lfd fa4,offvmargdata(itmp1)
654 lfd fa5,offvmargdata(itmp1)
657 lfd fa6,offvmargdata(itmp1)
660 lfd fa7,offvmargdata(itmp1)
663 #if defined(__DARWIN__)
665 lfd fa8,offvmargdata(itmp1)
668 lfd fa9,offvmargdata(itmp1)
671 lfd fa10,offvmargdata(itmp1)
674 lfd fa11,offvmargdata(itmp1)
677 lfd fa12,offvmargdata(itmp1)
681 asm_vm_call_method_end:
684 /* asm_call_jit_compiler *******************************************************
686 Invokes the compiler for untranslated JavaVM methods.
688 *******************************************************************************/
690 asm_call_jit_compiler:
691 L_asm_call_jit_compiler: /* required for PIC code */
693 stw r0,LA_LR_OFFSET(sp) /* save return address */
694 stwu sp,-(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(sp)
696 #if defined(__DARWIN__)
697 stw a0,LA_SIZE+(4+0)*4(sp)
698 stw a1,LA_SIZE+(4+1)*4(sp)
699 stw a2,LA_SIZE+(4+2)*4(sp)
700 stw a3,LA_SIZE+(4+3)*4(sp)
701 stw a4,LA_SIZE+(4+4)*4(sp)
702 stw a5,LA_SIZE+(4+5)*4(sp)
703 stw a6,LA_SIZE+(4+6)*4(sp)
704 stw a7,LA_SIZE+(4+7)*4(sp)
706 stfd fa0,LA_SIZE+(4+8)*4(sp)
707 stfd fa1,LA_SIZE+(4+10)*4(sp)
708 stfd fa2,LA_SIZE+(4+12)*4(sp)
709 stfd fa3,LA_SIZE+(4+14)*4(sp)
710 stfd fa4,LA_SIZE+(4+16)*4(sp)
711 stfd fa5,LA_SIZE+(4+18)*4(sp)
712 stfd fa6,LA_SIZE+(4+20)*4(sp)
713 stfd fa7,LA_SIZE+(4+22)*4(sp)
714 stfd fa8,LA_SIZE+(4+24)*4(sp)
715 stfd fa9,LA_SIZE+(4+26)*4(sp)
716 stfd fa10,LA_SIZE+(4+28)*4(sp)
717 stfd fa11,LA_SIZE+(4+30)*4(sp)
718 stfd fa12,LA_SIZE+(4+32)*4(sp)
720 SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
725 addi a2,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
726 lwz a3,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
728 mr pv,v0 /* move address to pv register */
730 #if defined(__DARWIN__)
731 lwz a0,LA_SIZE+(4+0)*4(sp)
732 lwz a1,LA_SIZE+(4+1)*4(sp)
733 lwz a2,LA_SIZE+(4+2)*4(sp)
734 lwz a3,LA_SIZE+(4+3)*4(sp)
735 lwz a4,LA_SIZE+(4+4)*4(sp)
736 lwz a5,LA_SIZE+(4+5)*4(sp)
737 lwz a6,LA_SIZE+(4+6)*4(sp)
738 lwz a7,LA_SIZE+(4+7)*4(sp)
740 lfd fa0,LA_SIZE+(4+8)*4(sp)
741 lfd fa1,LA_SIZE+(4+10)*4(sp)
742 lfd fa2,LA_SIZE+(4+12)*4(sp)
743 lfd fa3,LA_SIZE+(4+14)*4(sp)
744 lfd fa4,LA_SIZE+(4+16)*4(sp)
745 lfd fa5,LA_SIZE+(4+18)*4(sp)
746 lfd fa6,LA_SIZE+(4+20)*4(sp)
747 lfd fa7,LA_SIZE+(4+22)*4(sp)
748 lfd fa8,LA_SIZE+(4+24)*4(sp)
749 lfd fa9,LA_SIZE+(4+26)*4(sp)
750 lfd fa10,LA_SIZE+(4+28)*4(sp)
751 lfd fa11,LA_SIZE+(4+30)*4(sp)
752 lfd fa12,LA_SIZE+(4+32)*4(sp)
754 RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS)
757 lwz itmp1,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
760 addi sp,sp,(LA_SIZE + 4*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
762 mr. pv,pv /* test for exception */
763 beq L_asm_call_jit_compiler_exception
765 mtctr pv /* move method address to control reg */
766 bctr /* and call the Java method */
768 L_asm_call_jit_compiler_exception:
770 stw r0,LA_LR_OFFSET(sp)
771 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
772 bl exceptions_get_and_clear_exception
773 lwz xpc,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
775 addi sp,sp,LA_SIZE_ALIGNED
777 mr xptr,v0 /* get exception */
778 addi xpc,xpc,-4 /* exception address is ra - 4 */
779 b L_asm_handle_nat_exception
782 /********************* function asm_handle_exception ***************************
784 * This function handles an exception. It does not use the usual calling *
785 * conventions. The exception pointer is passed in REG_ITMP1 and the *
786 * pc from the exception raising position is passed in REG_ITMP2. It searches *
787 * the local exception table for a handler. If no one is found, it unwinds *
788 * stacks and continues searching the callers. *
790 * void asm_handle_exception (exceptionptr, exceptionpc); *
792 *******************************************************************************/
794 asm_handle_nat_exception:
795 L_asm_handle_nat_exception: /* required for PIC code */
796 L_asm_handle_exception_stack_loop:
798 addi sp,sp,-(LA_SIZE+((4+6)*4)) /* allocate stack (+4 for darwin) */
799 stw xptr,LA_SIZE+(4+0)*4(sp) /* save exception pointer */
800 stw xpc,LA_SIZE+(4+1)*4(sp) /* save exception pc */
801 stw r0,LA_SIZE+(4+3)*4(sp) /* save return address */
803 stw itmp3,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag (cleared) */
805 mr a0,r0 /* pass return address */
806 bl md_codegen_get_pv_from_pc /* get PV from RA */
807 stw v0,LA_SIZE+(4+2)*4(sp) /* save data segment pointer */
809 lwz a0,LA_SIZE+(4+0)*4(sp) /* pass xptr */
810 lwz a1,LA_SIZE+(4+1)*4(sp) /* pass xpc */
811 lwz a2,LA_SIZE+(4+2)*4(sp) /* pass PV (v0 == a0) */
812 addi a3,sp,LA_SIZE+((4+6)*4) /* pass Java SP */
814 b L_asm_handle_exception_continue
816 asm_handle_exception:
817 L_asm_handle_exception: /* required for PIC code */
818 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
820 #if defined(__DARWIN__)
822 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
823 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
826 addi sp,sp,-(LA_SIZE+(4+6)*4) /* allocate stack */
827 stw xptr,LA_SIZE+(4+0)*4(sp) /* save xptr */
828 stw pv,LA_SIZE+(4+2)*4(sp) /* save PV */
829 mflr r0 /* save RA */
830 stw r0,LA_SIZE+(4+3)*4(sp)
831 li t0,1 /* set maybe-leaf flag */
832 stw t0,LA_SIZE+(4+4)*4(sp) /* save maybe-leaf flag */
834 mr a0,xptr /* pass exception pointer */
835 mr a1,xpc /* pass exception pc */
836 mr a2,pv /* pass data segment pointer */
837 addi a3,sp,LA_SIZE+(ARG_CNT+TMP_CNT)*8+(4+6)*4
839 L_asm_handle_exception_continue:
840 bl exceptions_handle_exception
843 beq L_asm_handle_exception_not_catched
845 mr xpc,v0 /* move handlerpc into xpc */
846 lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */
847 lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */
848 lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */
850 lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */
851 addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */
854 beq L_asm_handle_exception_no_leaf
856 #if defined(__DARWIN__)
858 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
859 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
862 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
864 L_asm_handle_exception_no_leaf:
865 mtctr xpc /* jump to the handler */
868 L_asm_handle_exception_not_catched:
869 lwz xptr,LA_SIZE+(4+0)*4(sp) /* restore xptr */
870 lwz pv,LA_SIZE+(4+2)*4(sp) /* restore PV */
871 lwz r0,LA_SIZE+(4+3)*4(sp) /* restore RA */
873 lwz t0,LA_SIZE+(4+4)*4(sp) /* get maybe-leaf flag */
874 addi sp,sp,LA_SIZE+(4+6)*4 /* free stack frame */
877 beq L_asm_handle_exception_no_leaf_stack
879 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
880 li t0,0 /* clear the maybe-leaf flag */
882 L_asm_handle_exception_no_leaf_stack:
883 lwz t1,FrameSize(pv) /* get frame size */
884 add t1,sp,t1 /* pointer to save area */
886 lwz t2,IsLeaf(pv) /* is leaf procedure */
888 bne L_asm_handle_exception_no_ra_restore
890 lwz r0,LA_LR_OFFSET(t1) /* restore ra */
893 L_asm_handle_exception_no_ra_restore:
894 mflr xpc /* the new xpc is ra */
895 mr t4,xpc /* save RA */
896 lwz t2,IntSave(pv) /* t2 = saved int register count */
899 mflr t3 /* t3 = current pc */
900 #if defined(__DARWIN__)
901 addi t3,t3,lo16(ex_int2-ex_int1)
903 addi t3,t3,(ex_int2-ex_int1)@l
905 slwi t2,t2,2 /* t2 = register count * 4 */
906 subf t3,t2,t3 /* t3 = IntSave - t2 */
922 subf t1,t2,t1 /* t1 = t1 - register count * 4 */
928 #if defined(__DARWIN__)
929 addi t3,t3,lo16(ex_flt2-ex_flt1)
931 addi t3,t3,(ex_flt2-ex_flt1)@l
933 slwi t2,t2,2 /* t2 = register count * 4 */
934 subf t3,t2,t3 /* t3 = FltSave - t2 */
950 mtlr t4 /* restore RA */
951 lwz t1,FrameSize(pv) /* get frame size */
952 add sp,sp,t1 /* unwind stack */
953 b L_asm_handle_exception_stack_loop
956 /* asm_abstractmethoderror *****************************************************
958 Creates and throws an AbstractMethodError.
960 *******************************************************************************/
962 asm_abstractmethoderror:
964 stw r0,LA_LR_OFFSET(sp)
965 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
966 addi a0,sp,LA_SIZE_ALIGNED /* pass java sp */
967 mr a1,r0 /* pass exception address */
968 bl exceptions_asm_new_abstractmethoderror
969 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
970 mtlr r0 /* restore return address */
971 addi sp,sp,LA_SIZE_ALIGNED
973 mr xptr,v0 /* get exception pointer */
974 mr xpc,r0 /* we can't use r0 directly in addi */
975 addi xpc,xpc,-4 /* exception address is ra - 4 */
976 b L_asm_handle_nat_exception
979 #if defined(ENABLE_REPLACEMENT)
981 /* asm_replacement_out *********************************************************
983 This code is jumped to from the replacement-out stubs that are executed
984 when a thread reaches an activated replacement point.
986 The purpose of asm_replacement_out is to read out the parts of the
987 execution state that cannot be accessed from C code, store this state,
988 and then call the C function replace_me.
991 16 start of stack inside method to replace
992 0 rplpoint * info on the replacement point that was reached
994 NOTE: itmp3 has been clobbered by the replacement-out stub!
996 *******************************************************************************/
998 /* some room to accomodate changes of the stack frame size during replacement */
999 /* XXX we should find a cleaner solution here */
1000 #define REPLACEMENT_ROOM 512
1002 #define sizeexecutionstate_ALIGNED ((sizeexecutionstate + 15) & ~15)
1004 asm_replacement_out:
1005 /* create stack frame */
1006 addi sp,sp,-(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM)
1008 /* save link register */
1011 /* save registers in execution state */
1012 stw r0 ,( 0*4+offes_intregs)(sp)
1013 stw r1 ,( 1*4+offes_intregs)(sp)
1014 stw r2 ,( 2*4+offes_intregs)(sp)
1015 stw r3 ,( 3*4+offes_intregs)(sp)
1016 stw r4 ,( 4*4+offes_intregs)(sp)
1017 stw r5 ,( 5*4+offes_intregs)(sp)
1018 stw r6 ,( 6*4+offes_intregs)(sp)
1019 stw r7 ,( 7*4+offes_intregs)(sp)
1020 stw r8 ,( 8*4+offes_intregs)(sp)
1021 stw r9 ,( 9*4+offes_intregs)(sp)
1022 stw r10,(10*4+offes_intregs)(sp)
1023 stw r11,(11*4+offes_intregs)(sp)
1024 stw r12,(12*4+offes_intregs)(sp)
1025 stw r13,(13*4+offes_intregs)(sp)
1026 stw r14,(14*4+offes_intregs)(sp)
1027 stw r15,(15*4+offes_intregs)(sp)
1028 stw r16,(16*4+offes_intregs)(sp) /* link register stored as itmp3 */
1029 stw r17,(17*4+offes_intregs)(sp)
1030 stw r18,(18*4+offes_intregs)(sp)
1031 stw r19,(19*4+offes_intregs)(sp)
1032 stw r20,(20*4+offes_intregs)(sp)
1033 stw r21,(21*4+offes_intregs)(sp)
1034 stw r22,(22*4+offes_intregs)(sp)
1035 stw r23,(23*4+offes_intregs)(sp)
1036 stw r24,(24*4+offes_intregs)(sp)
1037 stw r25,(25*4+offes_intregs)(sp)
1038 stw r26,(26*4+offes_intregs)(sp)
1039 stw r27,(27*4+offes_intregs)(sp)
1040 stw r28,(28*4+offes_intregs)(sp)
1041 stw r29,(29*4+offes_intregs)(sp)
1042 stw r30,(30*4+offes_intregs)(sp)
1043 stw r31,(31*4+offes_intregs)(sp)
1045 stfd fr0 ,( 0*8+offes_fltregs)(sp)
1046 stfd fr1 ,( 1*8+offes_fltregs)(sp)
1047 stfd fr2 ,( 2*8+offes_fltregs)(sp)
1048 stfd fr3 ,( 3*8+offes_fltregs)(sp)
1049 stfd fr4 ,( 4*8+offes_fltregs)(sp)
1050 stfd fr5 ,( 5*8+offes_fltregs)(sp)
1051 stfd fr6 ,( 6*8+offes_fltregs)(sp)
1052 stfd fr7 ,( 7*8+offes_fltregs)(sp)
1053 stfd fr8 ,( 8*8+offes_fltregs)(sp)
1054 stfd fr9 ,( 9*8+offes_fltregs)(sp)
1055 stfd fr10,(10*8+offes_fltregs)(sp)
1056 stfd fr11,(11*8+offes_fltregs)(sp)
1057 stfd fr12,(12*8+offes_fltregs)(sp)
1058 stfd fr13,(13*8+offes_fltregs)(sp)
1059 stfd fr14,(14*8+offes_fltregs)(sp)
1060 stfd fr15,(15*8+offes_fltregs)(sp)
1061 stfd fr16,(16*8+offes_fltregs)(sp)
1062 stfd fr17,(17*8+offes_fltregs)(sp)
1063 stfd fr18,(18*8+offes_fltregs)(sp)
1064 stfd fr19,(19*8+offes_fltregs)(sp)
1065 stfd fr20,(20*8+offes_fltregs)(sp)
1066 stfd fr21,(21*8+offes_fltregs)(sp)
1067 stfd fr22,(22*8+offes_fltregs)(sp)
1068 stfd fr23,(23*8+offes_fltregs)(sp)
1069 stfd fr24,(24*8+offes_fltregs)(sp)
1070 stfd fr25,(25*8+offes_fltregs)(sp)
1071 stfd fr26,(26*8+offes_fltregs)(sp)
1072 stfd fr27,(27*8+offes_fltregs)(sp)
1073 stfd fr28,(28*8+offes_fltregs)(sp)
1074 stfd fr29,(29*8+offes_fltregs)(sp)
1075 stfd fr30,(30*8+offes_fltregs)(sp)
1076 stfd fr31,(31*8+offes_fltregs)(sp)
1078 /* calculate sp of method */
1079 addi itmp1,sp,(sizeexecutionstate_ALIGNED + REPLACEMENT_ROOM + 4*4)
1080 stw itmp1,(offes_sp)(sp)
1083 stw pv,(offes_pv)(sp)
1085 /* call replace_me */
1086 lwz a0,-(4*4)(itmp1) /* arg0: rplpoint * */
1087 mr a1,sp /* arg1: execution state */
1088 addi sp,sp,-(LA_SIZE_ALIGNED)
1089 b replace_me /* call C function replace_me */
1091 /* asm_replacement_in **********************************************************
1093 This code writes the given execution state and jumps to the replacement
1096 This function never returns!
1098 NOTE: itmp3 is not restored!
1101 void asm_replacement_in(executionstate *es, replace_safestack_t *st);
1103 *******************************************************************************/
1106 /* a0 == executionstate *es */
1107 /* a1 == replace_safestack_t *st */
1110 mr s1,a1 /* replace_safestack_t *st */
1111 mr s2,a0 /* executionstate *es == safe stack */
1113 /* switch to the safe stack */
1116 /* reserve linkage area */
1117 addi sp,sp,-(LA_SIZE_ALIGNED)
1119 /* call replace_build_execution_state(st) */
1121 bl replace_build_execution_state
1124 lwz sp,(offes_sp)(s2)
1126 /* build stack frame */
1127 addi sp,sp,-(sizeexecutionstate_ALIGNED)
1129 /* call replace_free_safestack(st,& of allocated executionstate_t) */
1130 mr a1,sp /* tmpes */
1132 addi sp,sp,-(LA_SIZE_ALIGNED) /* reserve linkage area */
1133 bl replace_free_safestack
1134 addi sp,sp,+(LA_SIZE_ALIGNED) /* tear down linkage area */
1137 lwz pv,(offes_pv)(sp)
1139 /* copy registers from execution state */
1140 lwz r0 ,( 0*4+offes_intregs)(sp)
1142 /* r2 is reserved */
1143 lwz a0 ,( 3*4+offes_intregs)(sp)
1144 lwz r4 ,( 4*4+offes_intregs)(sp)
1145 lwz r5 ,( 5*4+offes_intregs)(sp)
1146 lwz r6 ,( 6*4+offes_intregs)(sp)
1147 lwz r7 ,( 7*4+offes_intregs)(sp)
1148 lwz r8 ,( 8*4+offes_intregs)(sp)
1149 lwz r9 ,( 9*4+offes_intregs)(sp)
1150 lwz r10,(10*4+offes_intregs)(sp)
1151 lwz r11,(11*4+offes_intregs)(sp)
1152 lwz r12,(12*4+offes_intregs)(sp)
1154 lwz r14,(14*4+offes_intregs)(sp)
1155 lwz r15,(15*4+offes_intregs)(sp)
1156 lwz r16,(16*4+offes_intregs)(sp) /* itmp3, later to link register */
1157 lwz r17,(17*4+offes_intregs)(sp)
1158 lwz r18,(18*4+offes_intregs)(sp)
1159 lwz r19,(19*4+offes_intregs)(sp)
1160 lwz r20,(20*4+offes_intregs)(sp)
1161 lwz r21,(21*4+offes_intregs)(sp)
1162 lwz r22,(22*4+offes_intregs)(sp)
1163 lwz r23,(23*4+offes_intregs)(sp)
1164 lwz r24,(24*4+offes_intregs)(sp)
1165 lwz r25,(25*4+offes_intregs)(sp)
1166 lwz r26,(26*4+offes_intregs)(sp)
1167 lwz r27,(27*4+offes_intregs)(sp)
1168 lwz r28,(28*4+offes_intregs)(sp)
1169 lwz r29,(29*4+offes_intregs)(sp)
1170 lwz r30,(30*4+offes_intregs)(sp)
1171 lwz r31,(31*4+offes_intregs)(sp)
1173 lfd fr0 ,( 0*8+offes_fltregs)(sp)
1174 lfd fr1 ,( 1*8+offes_fltregs)(sp)
1175 lfd fr2 ,( 2*8+offes_fltregs)(sp)
1176 lfd fr3 ,( 3*8+offes_fltregs)(sp)
1177 lfd fr4 ,( 4*8+offes_fltregs)(sp)
1178 lfd fr5 ,( 5*8+offes_fltregs)(sp)
1179 lfd fr6 ,( 6*8+offes_fltregs)(sp)
1180 lfd fr7 ,( 7*8+offes_fltregs)(sp)
1181 lfd fr8 ,( 8*8+offes_fltregs)(sp)
1182 lfd fr9 ,( 9*8+offes_fltregs)(sp)
1183 lfd fr10,(10*8+offes_fltregs)(sp)
1184 lfd fr11,(11*8+offes_fltregs)(sp)
1185 lfd fr12,(12*8+offes_fltregs)(sp)
1186 lfd fr13,(13*8+offes_fltregs)(sp)
1187 lfd fr14,(14*8+offes_fltregs)(sp)
1188 lfd fr15,(15*8+offes_fltregs)(sp)
1189 lfd fr16,(16*8+offes_fltregs)(sp)
1190 lfd fr17,(17*8+offes_fltregs)(sp)
1191 lfd fr18,(18*8+offes_fltregs)(sp)
1192 lfd fr19,(19*8+offes_fltregs)(sp)
1193 lfd fr20,(20*8+offes_fltregs)(sp)
1194 lfd fr21,(21*8+offes_fltregs)(sp)
1195 lfd fr22,(22*8+offes_fltregs)(sp)
1196 lfd fr23,(23*8+offes_fltregs)(sp)
1197 lfd fr24,(24*8+offes_fltregs)(sp)
1198 lfd fr25,(25*8+offes_fltregs)(sp)
1199 lfd fr26,(26*8+offes_fltregs)(sp)
1200 lfd fr27,(27*8+offes_fltregs)(sp)
1201 lfd fr28,(28*8+offes_fltregs)(sp)
1202 lfd fr29,(29*8+offes_fltregs)(sp)
1203 lfd fr30,(30*8+offes_fltregs)(sp)
1204 lfd fr31,(31*8+offes_fltregs)(sp)
1206 /* restore link register */
1212 lwz itmp3,offes_pc(sp)
1214 /* remove stack frame */
1216 addi sp,sp,+(sizeexecutionstate_ALIGNED)
1218 /* jump to new code */
1223 #endif /* defined(ENABLE_REPLACEMENT) */
1225 /*********************************************************************/
1253 /* asm_compare_and_swap ********************************************************
1257 *******************************************************************************/
1259 asm_compare_and_swap:
1272 /* asm_memory_barrier **********************************************************
1276 *******************************************************************************/
1283 asm_getclassvalues_atomic:
1286 lwz a3,offbaseval(a0)
1287 lwz a4,offdiffval(a0)
1288 lwz a5,offbaseval(a1)
1290 stw a3,offcast_super_baseval(a2)
1291 stw a4,offcast_super_diffval(a2)
1292 stw a5,offcast_sub_baseval(a2)
1297 asm_criticalsections:
1298 #if defined(ENABLE_THREADS)
1306 #if defined(__DARWIN__)
1308 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1310 L_builtin_throw_exception$stub:
1311 .indirect_symbol _builtin_throw_exception
1313 bcl 20,31,L00$_builtin_throw_exception
1314 L00$_builtin_throw_exception:
1316 addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1318 lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1322 .lazy_symbol_pointer
1323 L_builtin_throw_exception$lazy_ptr:
1324 .indirect_symbol _builtin_throw_exception
1325 .long dyld_stub_binding_helper
1328 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1330 L_md_codegen_get_pv_from_pc$stub:
1331 .indirect_symbol _md_codegen_get_pv_from_pc
1333 bcl 20,31,L00$_md_codegen_get_pv_from_pc
1334 L00$_md_codegen_get_pv_from_pc:
1336 addis r11,r11,ha16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)
1338 lwzu r12,lo16(L_md_codegen_get_pv_from_pc$lazy_ptr - L00$_md_codegen_get_pv_from_pc)(r11)
1342 .lazy_symbol_pointer
1343 L_md_codegen_get_pv_from_pc$lazy_ptr:
1344 .indirect_symbol _md_codegen_get_pv_from_pc
1345 .long dyld_stub_binding_helper
1348 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1350 L_exceptions_handle_exception$stub:
1351 .indirect_symbol _exceptions_handle_exception
1353 bcl 20,31,L00$_exceptions_handle_exception
1354 L00$_exceptions_handle_exception:
1356 addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1358 lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1362 .lazy_symbol_pointer
1363 L_exceptions_handle_exception$lazy_ptr:
1364 .indirect_symbol _exceptions_handle_exception
1365 .long dyld_stub_binding_helper
1368 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1370 L_stacktrace_create_extern_stackframeinfo$stub:
1371 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1373 bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1374 L00$_stacktrace_create_extern_stackframeinfo:
1376 addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1378 lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1382 .lazy_symbol_pointer
1383 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1384 .indirect_symbol _stacktrace_create_extern_stackframeinfo
1385 .long dyld_stub_binding_helper
1388 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1390 L_jit_asm_compile$stub:
1391 .indirect_symbol _jit_asm_compile
1393 bcl 20,31,L00$_jit_asm_compile
1394 L00$_jit_asm_compile:
1396 addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1398 lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1402 .lazy_symbol_pointer
1403 L_jit_asm_compile$lazy_ptr:
1404 .indirect_symbol _jit_asm_compile
1405 .long dyld_stub_binding_helper
1408 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1410 L_stacktrace_remove_stackframeinfo$stub:
1411 .indirect_symbol _stacktrace_remove_stackframeinfo
1413 bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1414 L00$_stacktrace_remove_stackframeinfo:
1416 addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1418 lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1422 .lazy_symbol_pointer
1423 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1424 .indirect_symbol _stacktrace_remove_stackframeinfo
1425 .long dyld_stub_binding_helper
1428 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1430 L_exceptions_get_and_clear_exception$stub:
1431 .indirect_symbol _exceptions_get_and_clear_exception
1433 bcl 20,31,L00$_exceptions_get_and_clear_exception
1434 L00$_exceptions_get_and_clear_exception:
1436 addis r11,r11,ha16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)
1438 lwzu r12,lo16(L_exceptions_get_and_clear_exception$lazy_ptr - L00$_exceptions_get_and_clear_exception)(r11)
1442 .lazy_symbol_pointer
1443 L_exceptions_get_and_clear_exception$lazy_ptr:
1444 .indirect_symbol _exceptions_get_and_clear_exception
1445 .long dyld_stub_binding_helper
1448 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1450 L_exceptions_asm_new_abstractmethoderror$stub:
1451 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1453 bcl 20,31,L00$_exceptions_asm_new_abstractmethoderror
1454 L00$_exceptions_asm_new_abstractmethoderror:
1456 addis r11,r11,ha16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)
1458 lwzu r12,lo16(L_exceptions_asm_new_abstractmethoderror$lazy_ptr - L00$_exceptions_asm_new_abstractmethoderror)(r11)
1462 .lazy_symbol_pointer
1463 L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
1464 .indirect_symbol _exceptions_asm_new_abstractmethoderror
1465 .long dyld_stub_binding_helper
1468 # if defined(ENABLE_REPLACEMENT)
1470 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1473 .indirect_symbol _replace_me
1475 bcl 20,31,L00$_replace_me
1478 addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1480 lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1484 .lazy_symbol_pointer
1485 L_replace_me$lazy_ptr:
1486 .indirect_symbol _replace_me
1487 .long dyld_stub_binding_helper
1490 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1492 L_replace_build_execution_state$stub:
1493 .indirect_symbol _replace_build_execution_state
1495 bcl 20,31,L00$_replace_build_execution_state
1496 L00$_replace_build_execution_state:
1498 addis r11,r11,ha16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)
1500 lwzu r12,lo16(L_replace_build_execution_state$lazy_ptr - L00$_replace_build_execution_state)(r11)
1504 .lazy_symbol_pointer
1505 L_replace_build_execution_state$lazy_ptr:
1506 .indirect_symbol _replace_build_execution_state
1507 .long dyld_stub_binding_helper
1510 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1512 L_replace_free_safestack$stub:
1513 .indirect_symbol _replace_free_safestack
1515 bcl 20,31,L00$_replace_free_safestack
1516 L00$_replace_free_safestack:
1518 addis r11,r11,ha16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)
1520 lwzu r12,lo16(L_replace_free_safestack$lazy_ptr - L00$_replace_free_safestack)(r11)
1524 .lazy_symbol_pointer
1525 L_replace_free_safestack$lazy_ptr:
1526 .indirect_symbol _replace_free_safestack
1527 .long dyld_stub_binding_helper
1529 # endif /* ENABLE_REPLACEMENT */
1531 #endif /* defined(__DARWIN__) */
1534 /* disable exec-stacks ********************************************************/
1536 #if defined(__linux__) && defined(__ELF__)
1537 .section .note.GNU-stack,"",%progbits
1542 * These are local overrides for various environment variables in Emacs.
1543 * Please do not remove this and leave it at the end of the file, where
1544 * Emacs will automagically detect them.
1545 * ---------------------------------------------------------------------
1548 * indent-tabs-mode: t
1552 * vim:noexpandtab:sw=4:ts=4: