6998b7e905e33aacd0d269cb70fcdd470dde39fe
[cacao.git] / src / vm / jit / powerpc / asmpart.S
1 /* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
2                 
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
7
8    This file is part of CACAO.
9
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.
14
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.
19
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
23    02110-1301, USA.
24
25    Contact: cacao@cacaojvm.org
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29             Stefan Ring
30
31    Changes: Christian Thalinger
32             Edwin Steiner
33
34    $Id: asmpart.S 4894 2006-05-08 11:05:48Z twisti $
35
36 */
37
38
39 #include "config.h"
40
41 #include "md-abi.h"
42 #include "md-asm.h"
43
44 #include "vm/jit/abi-asm.h"
45 #include "vm/jit/methodheader.h"
46 #include "vm/jit/powerpc/offsets.h"
47
48
49         .text
50
51         .align 2
52
53
54 /* export functions ***********************************************************/
55
56         .globl asm_vm_call_method
57         .globl asm_vm_call_method_int
58         .globl asm_vm_call_method_long
59         .globl asm_vm_call_method_float
60         .globl asm_vm_call_method_double
61
62         .globl asm_vm_call_method_exception_handler
63
64         .globl asm_call_jit_compiler
65
66         .globl asm_handle_nat_exception
67         .globl asm_handle_exception
68
69         .globl asm_wrapper_patcher
70
71         .globl asm_replacement_out
72         .globl asm_replacement_in
73
74         .globl asm_cacheflush
75         .globl asm_initialize_thread_stack
76         .globl asm_perform_threadswitch
77         .globl asm_switchstackandcall
78         .globl asm_criticalsections
79         .globl asm_getclassvalues_atomic
80
81
82 /* asm_vm_call_method **********************************************************
83 *                                                                              *
84 *   This function calls a Java-method (which possibly needs compilation)       *
85 *   with up to 4 address parameters.                                           *
86 *                                                                              *
87 *   This functions calls the JIT-compiler which eventually translates the      *
88 *   method into machine code.                                                  *
89 *                                                                              *
90 *   C-prototype:                                                               *
91 *    javaobject_header *asm_calljavamethod (methodinfo *m,                     *
92 *         void *arg1, void *arg2, void *arg3, void *arg4);                     *
93 *                                                                              *
94 *******************************************************************************/
95
96         .align 2
97
98         .long   0                         /* catch type all                       */
99         .long   0                         /* exception handler pc                 */
100         .long   0                         /* end pc                               */
101         .long   0                         /* start pc                             */
102         .long   1                         /* extable size                         */
103         .long   0                         /* line number table start              */
104         .long   0                         /* line number table size               */
105         .long   0                         /* fltsave                              */
106         .long   0                         /* intsave                              */
107         .long   0                         /* isleaf                               */
108         .long   0                         /* IsSync                               */
109         .long   0                         /* frame size                           */
110         .long   0                         /* method pointer (pointer to name)     */
111
112 asm_vm_call_method:
113 asm_vm_call_method_int:
114 asm_vm_call_method_long:
115 asm_vm_call_method_float:
116 asm_vm_call_method_double:
117         mflr    r0
118         stw     r0,LA_LR_OFFSET(r1)
119         stwu    r1,-40*4(r1)
120
121         stw     s0,8*4(sp)                /* save used callee saved registers     */
122         stw     a0,9*4(sp)                /* save method pointer for compiler     */
123
124 #if defined(__DARWIN__)
125         stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
126 #endif
127         stw     pv,11*4(sp)               /* save PV register                     */
128
129         stw     itmp3,12*4(sp)            /* registers r14-r31 are callee saved   */
130         stfd    ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
131         stfd    ftmp2,16*4(sp)
132
133 #if defined(__DARWIN__)
134         stw     t1,18*4(r1)
135         stw     t2,19*4(r1)
136         stw     t3,20*4(r1)
137         stw     t4,21*4(r1)
138         stw     t5,22*4(r1)
139         stw     t6,23*4(r1)
140         stw     t7,24*4(r1)
141
142         stfd    ft0,26*4(r1)
143         stfd    ft1,28*4(r1)
144         stfd    ft2,30*4(r1)
145         stfd    ft3,32*4(r1)
146         stfd    ft4,34*4(r1)
147         stfd    ft5,36*4(r1)
148 #else
149         SAVE_TEMPORARY_REGISTERS(18)      /* the offset has to be even            */
150 #endif
151
152         mr      itmp2,a1                  /* arg count                            */
153         mr      itmp1,a2                  /* pointer to arg block                 */
154
155         mr      t4,itmp2                  /* save argument count                  */
156         mr      t5,itmp1                  /* save argument block pointer          */
157
158         mr      s0,sp                     /* save current sp to s0                */
159
160         addi    itmp1,itmp1,-sizevmarg    /* initialize pointer (smaller code)    */
161         addi    itmp2,itmp2,1             /* initialize argument count            */
162         li      t0,0                      /* initialize integer argument counter  */
163         li      t1,0                      /* initialize float argument counter    */
164         li      t6,0                      /* initialize integer register counter  */
165
166         mflr    r0                        /* save link register (PIC code)        */
167         bl      L_asm_vm_call_method_get_pc
168 L_asm_vm_call_method_get_pc:
169         mflr    t3                        /* t3 contains the current pc           */
170         mtlr    r0
171
172 L_register_copy:
173         addi    itmp1,itmp1,sizevmarg     /* goto next argument block             */
174         addi    itmp2,itmp2,-1            /* argument count - 1                   */
175         mr.     itmp2,itmp2
176         beq     L_register_copy_done
177
178 #if WORDS_BIGENDIAN == 1
179         lwz     itmp3,offvmargtype+4(itmp1)
180 #else
181 #error XXX
182 #endif
183         andi.   r0,itmp3,0x0002           /* is this a float/double type?         */
184         bne     L_register_handle_float
185         
186 L_register_handle_int:
187         cmpwi   t6,INT_ARG_CNT            /* are we out of integer argument       */
188         beq     L_register_copy           /* registers? yes, next loop            */
189
190         andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
191         bne     L_register_handle_long
192
193 #if defined(__DARWIN__)
194         addis   itmp3,t3,ha16(L_jumptable_int - L_asm_vm_call_method_get_pc)
195         la      itmp3,lo16(L_jumptable_int - L_asm_vm_call_method_get_pc)(itmp3)
196 #else
197         lis     itmp3,L_jumptable_int@ha
198         addi    itmp3,itmp3,L_jumptable_int@l
199 #endif
200         slwi    t2,t6,2                   /* multiple of 4-bytes                  */
201         add     itmp3,itmp3,t2            /* calculate address of jumptable       */
202         lwz     itmp3,0(itmp3)            /* load function address                */
203         mtctr   itmp3
204         addi    t0,t0,1                   /* integer argument counter             */
205         addi    t6,t6,1                   /* integer argument register counter    */
206         bctr
207
208 L_register_handle_long:
209 #if defined(__DARWIN__)
210         addis   itmp3,t3,ha16(L_jumptable_long - L_asm_vm_call_method_get_pc)
211         la      itmp3,lo16(L_jumptable_long - L_asm_vm_call_method_get_pc)(itmp3)
212 #else
213         lis     itmp3,L_jumptable_long@ha
214         addi    itmp3,itmp3,L_jumptable_long@l
215 #endif
216         addi    t6,t6,1                   /* align to even numbers                */
217         andi.   t6,t6,0xfffe
218
219         cmpwi   t6,(INT_ARG_CNT - 1)      /* are we out of integer argument       */
220         bge     L_register_copy           /* registers? yes, next loop            */
221
222         slwi    t2,t6,2                   /* multiple of 4-bytes                  */
223         add     itmp3,itmp3,t2            /* calculate address of jumptable       */
224         lwz     itmp3,0(itmp3)            /* load function address                */
225         mtctr   itmp3
226         addi    t0,t0,1                   /* integer argument counter             */
227         addi    t6,t6,2                   /* integer argument register counter    */
228         bctr
229
230 L_register_handle_float:
231         cmpwi   t1,FLT_ARG_CNT            /* are we out of float argument         */
232         beq     L_register_copy           /* registers? yes, next loop            */
233
234         andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
235         bne     L_register_handle_double
236
237 #if defined(__DARWIN__)
238         addis   itmp3,t3,ha16(L_jumptable_float - L_asm_vm_call_method_get_pc)
239         la      itmp3,lo16(L_jumptable_float - L_asm_vm_call_method_get_pc)(itmp3)
240 #else
241         lis     itmp3,L_jumptable_float@ha
242         addi    itmp3,itmp3,L_jumptable_float@l
243 #endif
244         slwi    t2,t1,2                   /* multiple of 4-bytes                  */
245         add     itmp3,itmp3,t2            /* calculate address of jumptable       */
246         lwz     itmp3,0(itmp3)            /* load function address                */
247         mtctr   itmp3
248         addi    t1,t1,1                   /* float argument counter               */
249         bctr
250
251 L_register_handle_double:
252 #if defined(__DARWIN__)
253         addis   itmp3,t3,ha16(L_jumptable_double - L_asm_vm_call_method_get_pc)
254         la      itmp3,lo16(L_jumptable_double - L_asm_vm_call_method_get_pc)(itmp3)
255 #else
256         lis     itmp3,L_jumptable_double@ha
257         addi    itmp3,itmp3,L_jumptable_double@l
258 #endif
259         slwi    t2,t1,2                   /* multiple of 4-bytes                  */
260         add     itmp3,itmp3,t2            /* calculate address of jumptable       */
261         lwz     itmp3,0(itmp3)            /* load function address                */
262         mtctr   itmp3
263         addi    t1,t1,1                   /* float argument counter               */
264         bctr
265
266 L_register_copy_done:
267                                           /* calculate remaining arguments        */
268         sub     t6,t4,t0                  /* - integer arguments in registers     */
269         sub     t6,t6,t1                  /* - float arguments in registers       */
270         mr.     t6,t6
271         beq     L_stack_copy_done
272
273         mr      itmp2,t4                  /* restore argument count               */
274         mr      itmp1,t5                  /* restore argument block pointer       */
275
276         slwi    t6,t6,3                   /* XXX use 8-bytes slots for now        */
277         addi    t6,t6,LA_SIZE             /* add size of linkage area             */
278         sub     sp,sp,t6
279
280         mr      t6,sp                     /* use t6 as temporary sp               */
281         addi    t6,t6,LA_SIZE             /* skip linkage area                    */
282
283         addi    itmp1,itmp1,-sizevmarg    /* initialize pointer (smaller code)    */
284         addi    itmp2,itmp2,1             /* initialize argument count            */
285         
286 L_stack_copy_loop:
287         addi    itmp1,itmp1,sizevmarg     /* goto next argument block             */
288         addi    itmp2,itmp2,-1            /* argument count - 1                   */
289         mr.     itmp2,itmp2
290         beq     L_stack_copy_done
291         
292 #if WORDS_BIGENDIAN == 1
293         lwz     itmp3,offvmargtype+4(itmp1)
294 #else
295 #error XXX
296 #endif
297         andi.   r0,itmp3,0x0002           /* is this a float/double type?         */
298         bne     L_stack_handle_float
299
300 L_stack_handle_int:
301         addi    t0,t0,-1                  /* arguments assigned to registers      */
302         mr.     t0,t0
303         bge     L_stack_copy_loop
304
305         andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
306         bne     L_stack_handle_long
307
308         lwz     itmp3,offvmargdata+4(itmp1) /* get integer argument               */
309         stw     itmp3,0(t6)               /* and store it on the stack            */
310         addi    t6,t6,4                   /* increase temporary sp by 1 slot      */
311         b       L_stack_copy_loop
312
313 L_stack_handle_long:
314         addi    t6,t6,4                   /* align stack to 8-bytes               */
315         rlwinm  t6,t6,0,30,28             /* clear lower 4-bits                   */
316
317         lwz     itmp3,offvmargdata+0(itmp1) /* get long argument                  */
318         stw     itmp3,0(t6)               /* and store it on the stack            */
319         lwz     itmp3,offvmargdata+4(itmp1)
320         stw     itmp3,4(t6)
321         addi    t6,t6,8                   /* increase temporary sp by 2 slots     */
322         b       L_stack_copy_loop
323                 
324 L_stack_handle_float:
325         addi    t1,t1,-1                  /* arguments assigned to registers      */
326         mr.     t1,t1
327         bge     L_stack_copy_loop
328
329         andi.   r0,itmp3,0x0001           /* is this a 2-word type?               */
330         bne     L_stack_handle_double
331
332         lfs     ftmp3,offvmargdata(itmp1) /* get float argument                   */
333         stfs    ftmp3,0(t6)               /* and store it on the stack            */
334         addi    t6,t6,4                   /* increase temporary sp by 1 slot      */
335         b       L_stack_copy_loop
336
337 L_stack_handle_double:
338         addi    t6,t6,4                   /* align stack to 8-bytes               */
339         rlwinm  t6,t6,0,30,28             /* clear lower 4-bits                   */
340
341         lfd     ftmp3,offvmargdata(itmp1) /* get double argument                  */
342         stfd    ftmp3,0(t6)               /* and store it on the stack            */
343         addi    t6,t6,8                   /* increase temporary sp by 2 slots     */
344         b       L_stack_copy_loop
345
346 L_stack_copy_done:
347         lwz     itmp1,9*4(s0)             /* pass method pointer via tmp1         */
348
349 #if defined(__DARWIN__)
350         addis   mptr,t3,ha16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)
351         la      mptr,lo16(L_asm_call_jit_compiler - L_asm_vm_call_method_get_pc)(mptr)
352 #else
353         lis     mptr,L_asm_call_jit_compiler@ha
354         addi    mptr,mptr,L_asm_call_jit_compiler@l
355 #endif
356         stw     mptr,7*4(s0)
357         addi    mptr,s0,7*4
358
359         lwz     pv,0*4(mptr)
360         mtctr   pv
361         bctrl
362 1:
363         mflr    itmp1
364 #if defined(__DARWIN__)
365         addi    pv,itmp1,lo16(asm_vm_call_method - 1b)
366 #else
367         addi    pv,itmp1,(asm_vm_call_method - 1b)@l
368 #endif
369
370 L_asm_vm_call_method_return:
371         mr      sp,s0                     /* restore the function's sp            */
372
373         lwz     s0,8*4(sp)                /* restore used callee saved registers  */
374
375 #if defined(__DARWIN__)
376         lwz     itmp1,10*4(sp)            /* register r11 is callee saved         */
377 #endif
378         lwz     pv,11*4(sp)               /* save PV register                     */
379
380         lwz     itmp3,12*4(sp)
381         lfd     ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
382         lfd     ftmp2,16*4(sp)
383
384 #if defined(__DARWIN__)
385         lwz     t1,18*4(r1)
386         lwz     t2,19*4(r1)
387         lwz     t3,20*4(r1)
388         lwz     t4,21*4(r1)
389         lwz     t5,22*4(r1)
390         lwz     t6,23*4(r1)
391         lwz     t7,24*4(r1)
392
393         lfd     ft0,26*4(r1)
394         lfd     ft1,28*4(r1)
395         lfd     ft2,30*4(r1)
396         lfd     ft3,32*4(r1)
397         lfd     ft4,34*4(r1)
398         lfd     ft5,36*4(r1)
399 #else
400         RESTORE_TEMPORARY_REGISTERS(18)   /* the offset has to be even            */
401 #endif
402
403         lwz     r0,40*4+LA_LR_OFFSET(r1)
404         mtlr    r0
405         addi    r1,r1,40*4
406         blr
407
408 asm_vm_call_method_exception_handler:
409         mr      r3,itmp1
410         bl      builtin_throw_exception
411         b       L_asm_vm_call_method_return
412
413
414         .data
415         .align  2
416
417 L_jumptable_int:
418         .long   L_handle_a0
419         .long   L_handle_a1
420         .long   L_handle_a2
421         .long   L_handle_a3
422         .long   L_handle_a4
423         .long   L_handle_a5
424         .long   L_handle_a6
425         .long   L_handle_a7
426
427         .text
428         .align  2
429
430 L_handle_a0:
431         lwz     a0,offvmargdata+4(itmp1)
432         b       L_register_copy
433 L_handle_a1:
434         lwz     a1,offvmargdata+4(itmp1)
435         b       L_register_copy
436 L_handle_a2:
437         lwz     a2,offvmargdata+4(itmp1)
438         b       L_register_copy
439 L_handle_a3:
440         lwz     a3,offvmargdata+4(itmp1)
441         b       L_register_copy
442 L_handle_a4:
443         lwz     a4,offvmargdata+4(itmp1)
444         b       L_register_copy
445 L_handle_a5:
446         lwz     a5,offvmargdata+4(itmp1)
447         b       L_register_copy
448 L_handle_a6:
449         lwz     a6,offvmargdata+4(itmp1)
450         b       L_register_copy
451 L_handle_a7:
452         lwz     a7,offvmargdata+4(itmp1)
453         b       L_register_copy
454
455
456         .data
457         .align  2
458
459 L_jumptable_long:
460 #if defined(__DARWIN__)
461 #else
462         /* we have two entries here, so we get the even argument register
463         alignment for linux */
464
465         .long   L_handle_a0_a1
466         .long   0
467         .long   L_handle_a2_a3
468         .long   0
469         .long   L_handle_a4_a5
470         .long   0
471         .long   L_handle_a6_a7
472         .long   0
473 #endif
474
475         .text
476         .align  2
477
478 L_handle_a0_a1:
479         lwz     a0,offvmargdata+0(itmp1)
480         lwz     a1,offvmargdata+4(itmp1)
481         b       L_register_copy
482 L_handle_a2_a3:
483         lwz     a2,offvmargdata+0(itmp1)
484         lwz     a3,offvmargdata+4(itmp1)
485         b       L_register_copy
486 L_handle_a4_a5:
487         lwz     a4,offvmargdata+0(itmp1)
488         lwz     a5,offvmargdata+4(itmp1)
489         b       L_register_copy
490 L_handle_a6_a7:
491         lwz     a6,offvmargdata+0(itmp1)
492         lwz     a7,offvmargdata+4(itmp1)
493         b       L_register_copy
494
495
496         .data
497         .align  2
498
499 L_jumptable_float:
500         .long   L_handle_fa0
501         .long   L_handle_fa1
502         .long   L_handle_fa2
503         .long   L_handle_fa3
504         .long   L_handle_fa4
505         .long   L_handle_fa5
506         .long   L_handle_fa6
507         .long   L_handle_fa7
508
509 #if defined(__DARWIN__)
510         .long   L_handle_fa8
511         .long   L_handle_fa9
512         .long   L_handle_fa10
513         .long   L_handle_fa11
514         .long   L_handle_fa12
515 #endif
516
517         .text
518         .align  2
519
520 L_handle_fa0:
521         lfs     fa0,offvmargdata(itmp1)
522         b       L_register_copy
523 L_handle_fa1:
524         lfs     fa1,offvmargdata(itmp1)
525         b       L_register_copy
526 L_handle_fa2:
527         lfs     fa2,offvmargdata(itmp1)
528         b       L_register_copy
529 L_handle_fa3:
530         lfs     fa3,offvmargdata(itmp1)
531         b       L_register_copy
532 L_handle_fa4:
533         lfs     fa4,offvmargdata(itmp1)
534         b       L_register_copy
535 L_handle_fa5:
536         lfs     fa5,offvmargdata(itmp1)
537         b       L_register_copy
538 L_handle_fa6:
539         lfs     fa6,offvmargdata(itmp1)
540         b       L_register_copy
541 L_handle_fa7:
542         lfs     fa7,offvmargdata(itmp1)
543         b       L_register_copy
544
545 #if defined(__DARWIN__)
546 L_handle_fa8:
547         lfs     fa8,offvmargdata(itmp1)
548         b       L_register_copy
549 L_handle_fa9:
550         lfs     fa9,offvmargdata(itmp1)
551         b       L_register_copy
552 L_handle_fa10:
553         lfs     fa10,offvmargdata(itmp1)
554         b       L_register_copy
555 L_handle_fa11:
556         lfs     fa11,offvmargdata(itmp1)
557         b       L_register_copy
558 L_handle_fa12:
559         lfs     fa12,offvmargdata(itmp1)
560         b       L_register_copy
561 #endif
562
563
564         .data
565         .align  2
566
567 L_jumptable_double:
568         .long   L_handle_fda0
569         .long   L_handle_fda1
570         .long   L_handle_fda2
571         .long   L_handle_fda3
572         .long   L_handle_fda4
573         .long   L_handle_fda5
574         .long   L_handle_fda6
575         .long   L_handle_fda7
576
577 #if defined(__DARWIN__)
578         .long   L_handle_fda8
579         .long   L_handle_fda9
580         .long   L_handle_fda10
581         .long   L_handle_fda11
582         .long   L_handle_fda12
583 #endif
584
585         .text
586         .align  2
587
588 L_handle_fda0:
589         lfd     fa0,offvmargdata(itmp1)
590         b       L_register_copy
591 L_handle_fda1:
592         lfd     fa1,offvmargdata(itmp1)
593         b       L_register_copy
594 L_handle_fda2:
595         lfd     fa2,offvmargdata(itmp1)
596         b       L_register_copy
597 L_handle_fda3:
598         lfd     fa3,offvmargdata(itmp1)
599         b       L_register_copy
600 L_handle_fda4:
601         lfd     fa4,offvmargdata(itmp1)
602         b       L_register_copy
603 L_handle_fda5:
604         lfd     fa5,offvmargdata(itmp1)
605         b       L_register_copy
606 L_handle_fda6:
607         lfd     fa6,offvmargdata(itmp1)
608         b       L_register_copy
609 L_handle_fda7:
610         lfd     fa7,offvmargdata(itmp1)
611         b       L_register_copy
612
613 #if defined(__DARWIN__)
614 L_handle_fda8:
615         lfd     fa8,offvmargdata(itmp1)
616         b       L_register_copy
617 L_handle_fda9:
618         lfd     fa9,offvmargdata(itmp1)
619         b       L_register_copy
620 L_handle_fda10:
621         lfd     fa10,offvmargdata(itmp1)
622         b       L_register_copy
623 L_handle_fda11:
624         lfd     fa11,offvmargdata(itmp1)
625         b       L_register_copy
626 L_handle_fda12:
627         lfd     fa12,offvmargdata(itmp1)
628         b       L_register_copy
629 #endif
630
631
632 /* asm_call_jit_compiler *******************************************************
633
634    Invokes the compiler for untranslated JavaVM methods.
635
636 *******************************************************************************/
637
638 asm_call_jit_compiler:
639 L_asm_call_jit_compiler:                /* required for PIC code              */
640         mflr    r0
641         stw     r0,LA_LR_OFFSET(r1)         /* save return address                */
642         stwu    r1,-(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)(r1)
643
644 #if defined(__DARWIN__)
645         stw     a0,(LA_WORD_SIZE+5+0)*4(r1)
646         stw     a1,(LA_WORD_SIZE+5+1)*4(r1)
647         stw     a2,(LA_WORD_SIZE+5+2)*4(r1)
648         stw     a3,(LA_WORD_SIZE+5+3)*4(r1)
649         stw     a4,(LA_WORD_SIZE+5+4)*4(r1)
650         stw     a5,(LA_WORD_SIZE+5+5)*4(r1)
651         stw     a6,(LA_WORD_SIZE+5+6)*4(r1)
652         stw     a7,(LA_WORD_SIZE+5+7)*4(r1)
653
654         stfd    fa0,(LA_WORD_SIZE+5+8)*4(r1)
655         stfd    fa1,(LA_WORD_SIZE+5+10)*4(r1)
656         stfd    fa2,(LA_WORD_SIZE+5+12)*4(r1)
657         stfd    fa3,(LA_WORD_SIZE+5+14)*4(r1)
658         stfd    fa4,(LA_WORD_SIZE+5+16)*4(r1)
659         stfd    fa5,(LA_WORD_SIZE+5+18)*4(r1)
660         stfd    fa6,(LA_WORD_SIZE+5+20)*4(r1)
661         stfd    fa7,(LA_WORD_SIZE+5+22)*4(r1)
662         stfd    fa8,(LA_WORD_SIZE+5+24)*4(r1)
663         stfd    fa9,(LA_WORD_SIZE+5+26)*4(r1)
664         stfd    fa10,(LA_WORD_SIZE+5+28)*4(r1)
665         stfd    fa11,(LA_WORD_SIZE+5+30)*4(r1)
666         stfd    fa12,(LA_WORD_SIZE+5+32)*4(r1)
667 #else
668         SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
669 #endif
670
671         mr      a0,itmp1
672         mr      a1,mptr
673         addi    a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
674         lwz     a3,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(sp)
675         bl      jit_asm_compile
676         mr      pv,v0                       /* move address to pv register        */
677
678 #if defined(__DARWIN__)
679         lwz     a0,(LA_WORD_SIZE+5+0)*4(r1)
680         lwz     a1,(LA_WORD_SIZE+5+1)*4(r1)
681         lwz     a2,(LA_WORD_SIZE+5+2)*4(r1)
682         lwz     a3,(LA_WORD_SIZE+5+3)*4(r1)
683         lwz     a4,(LA_WORD_SIZE+5+4)*4(r1)
684         lwz     a5,(LA_WORD_SIZE+5+5)*4(r1)
685         lwz     a6,(LA_WORD_SIZE+5+6)*4(r1)
686         lwz     a7,(LA_WORD_SIZE+5+7)*4(r1)
687
688         lfd     fa0,(LA_WORD_SIZE+5+8)*4(r1)
689         lfd     fa1,(LA_WORD_SIZE+5+10)*4(r1)
690         lfd     fa2,(LA_WORD_SIZE+5+12)*4(r1)
691         lfd     fa3,(LA_WORD_SIZE+5+14)*4(r1)
692         lfd     fa4,(LA_WORD_SIZE+5+16)*4(r1)
693         lfd     fa5,(LA_WORD_SIZE+5+18)*4(r1)
694         lfd     fa6,(LA_WORD_SIZE+5+20)*4(r1)
695         lfd     fa7,(LA_WORD_SIZE+5+22)*4(r1)
696         lfd     fa8,(LA_WORD_SIZE+5+24)*4(r1)
697         lfd     fa9,(LA_WORD_SIZE+5+26)*4(r1)
698         lfd     fa10,(LA_WORD_SIZE+5+28)*4(r1)
699         lfd     fa11,(LA_WORD_SIZE+5+30)*4(r1)
700         lfd     fa12,(LA_WORD_SIZE+5+32)*4(r1)
701 #else
702         RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
703 #endif
704
705         lwz     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)+LA_LR_OFFSET(r1)
706         mtlr    itmp1
707
708         addi    sp,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8)
709
710         mr.     pv,pv                       /* test for exception                 */
711         beq     L_asm_call_jit_compiler_exception
712
713         mtctr   pv                          /* move method address to control reg */
714         bctr                                /* and call the Java method           */
715
716 L_asm_call_jit_compiler_exception:
717 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
718         mflr    r0
719         stw     r0,LA_LR_OFFSET(sp)
720         stwu    sp,-LA_SIZE_ALIGNED(sp)     /* preserve linkage area              */
721         bl      builtin_asm_get_exceptionptrptr
722         lwz     r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
723         mtlr    r0      
724         addi    sp,sp,LA_SIZE_ALIGNED
725 #else
726 # if defined(__DARWIN__)
727         lis     v0,ha16(_no_threads_exceptionptr)
728         addi    v0,v0,lo16(_no_threads_exceptionptr)
729 # else
730         lis     v0,_no_threads_exceptionptr@ha
731         addi    v0,v0,_no_threads_exceptionptr@l
732 # endif
733 #endif
734         lwz     xptr,0(v0)                  /* get the exception pointer          */
735         li      itmp3,0
736         stw     itmp3,0(v0)                 /* clear the exception pointer        */
737
738         mflr    xpc
739         addi    xpc,xpc,-4
740         b       L_asm_handle_nat_exception
741
742
743 /********************* function asm_handle_exception ***************************
744 *                                                                              *
745 *   This function handles an exception. It does not use the usual calling      *
746 *   conventions. The exception pointer is passed in REG_ITMP1 and the          *
747 *   pc from the exception raising position is passed in REG_ITMP2. It searches *
748 *   the local exception table for a handler. If no one is found, it unwinds    *
749 *   stacks and continues searching the callers.                                *
750 *                                                                              *
751 *   void asm_handle_exception (exceptionptr, exceptionpc);                     *
752 *                                                                              *
753 *******************************************************************************/
754                 
755 asm_handle_nat_exception:
756 L_asm_handle_nat_exception:             /* required for PIC code              */
757         mflr    r9
758         lwz     itmp3,4(r9)
759         extsh   itmp3,itmp3
760         add     pv,itmp3,r9
761         lwz     itmp3,8(r9)
762         srwi    itmp3,itmp3,16
763         cmpwi   itmp3,0x3dad
764         bne     L_asm_handle_exception
765         lwz     itmp3,8(r9)
766         slwi    itmp3,itmp3,16
767         add     pv,pv,itmp3
768
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       */
772
773 #if defined(__DARWIN__)
774 #else
775         SAVE_ARGUMENT_REGISTERS(0)          /* we save arg and temp registers in  */
776         SAVE_TEMPORARY_REGISTERS(ARG_CNT)   /* case this is a leaf method         */
777 #endif
778
779         li      a3,(ARG_CNT+TMP_CNT)*8      /* prepare a3 for handle_exception    */
780         li      a4,1                        /* set maybe-leaf flag                */
781
782 L_asm_handle_exception_stack_loop:
783         addi    sp,sp,-(LA_WORD_SIZE+4+5)*4 /* allocate stack                     */
784         stw     xptr,LA_SIZE+4*4(sp)        /* save exception pointer             */
785         stw     xpc,LA_SIZE+5*4(sp)         /* save exception pc                  */
786         stw     pv,LA_SIZE+6*4(sp)          /* save data segment pointer          */
787         mflr    r0                          /* save return address                */
788         stw     r0,LA_SIZE+5*4(sp)
789         add     a3,a3,sp                    /* calculate Java sp into a3...       */
790         addi    a3,a3,(LA_WORD_SIZE+4+5)*4
791         stw     a4,LA_SIZE+8*4(sp)          /* save maybe-leaf flag               */
792
793         mr      a0,xptr                     /* pass exception pointer             */
794         mr      a1,xpc                      /* pass exception pc                  */
795         mr      a2,pv                       /* pass data segment pointer          */
796                                             /* a3 is still set                    */
797         bl      exceptions_handle_exception
798
799         mr.     v0,v0
800         beq     L_asm_handle_exception_not_catched
801
802         mr      xpc,v0                      /* move handlerpc into xpc            */
803         lwz     xptr,LA_SIZE+4*4(sp)        /* restore exception pointer          */
804         lwz     pv,LA_SIZE+6*4(sp)          /* restore data segment pointer       */
805         lwz     r0,LA_SIZE+5*4(sp)          /* restore return address             */
806         mtlr    r0
807         lwz     a4,LA_SIZE+8*4(sp)          /* get maybe-leaf flag                */
808         addi    sp,sp,(LA_WORD_SIZE+4+5)*4  /* free stack frame                   */
809
810         mr.     a4,a4
811         beq     L_asm_handle_exception_no_leaf
812
813 #if defined(__DARWIN__)
814 #else
815         RESTORE_ARGUMENT_REGISTERS(0)       /* if this is a leaf method, we have  */
816         RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers  */
817 #endif
818
819         addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
820
821 L_asm_handle_exception_no_leaf:
822         mtctr   xpc                         /* jump to the handler                */
823         bctr
824
825 L_asm_handle_exception_not_catched:
826         lwz     xptr,LA_SIZE+4*4(sp)        /* restore exception pointer          */
827         lwz     pv,LA_SIZE+6*4(sp)          /* restore data segment pointer       */
828         lwz     r0,LA_SIZE+5*4(sp)          /* restore return address             */
829         mtlr    r0
830         lwz     a4,LA_SIZE+8*4(sp)          /* get maybe-leaf flag                */
831         addi    sp,sp,(LA_WORD_SIZE+4+5)*4  /* free stack frame                   */
832
833         mr.     a4,a4
834         beq     L_asm_handle_exception_no_leaf_stack
835
836         addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
837         li      a4,0                        /* clear the maybe-leaf flag          */
838
839 L_asm_handle_exception_no_leaf_stack:
840         lwz     t0,FrameSize(pv)            /* get frame size                     */
841         add     t0,sp,t0                    /* pointer to save area               */
842
843         lwz     t1,IsLeaf(pv)               /* is leaf procedure                  */
844         mr.     t1,t1
845         bne     L_asm_handle_exception_no_ra_restore
846
847         lwz     r0,LA_LR_OFFSET(t0)         /* restore ra                         */
848         mtlr    r0
849
850 L_asm_handle_exception_no_ra_restore:
851         mflr    xpc                         /* the new xpc is ra                  */
852         lwz     t1,IntSave(pv)              /* t1 = saved int register count      */
853         bl      ex_int1
854 ex_int1:
855         mflr    t2                          /* t2 = current pc                    */
856 #if defined(__DARWIN__)
857         addi    t2,t2,lo16(ex_int2-ex_int1)
858 #else
859         addi    t2,t2,(ex_int2-ex_int1)@l
860 #endif
861         slwi    t1,t1,2                     /* t1 = register count * 4            */
862         subf    t2,t1,t2                    /* t2 = IntSave - t1                  */
863         mtctr   t2
864         bctr
865
866         lwz     s0,-10*4(t0)
867         lwz     s1,-9*4(t0)
868         lwz     s2,-8*4(t0)
869         lwz     s3,-7*4(t0)
870         lwz     s4,-6*4(t0)
871         lwz     s5,-5*4(t0)
872         lwz     s6,-4*4(t0)
873         lwz     s7,-3*4(t0)
874         lwz     s8,-2*4(t0)
875         lwz     s9,-1*4(t0)
876
877 ex_int2:
878         subf    t0,t1,t0                    /* t0 = t0 - register count * 4       */
879
880         lwz     t1,FltSave(pv)
881         bl      ex_flt1
882 ex_flt1:
883         mflr    t2
884 #if defined(__DARWIN__)
885         addi    t2,t2,lo16(ex_flt2-ex_flt1)
886 #else
887         addi    t2,t2,(ex_flt2-ex_flt1)@l
888 #endif
889         slwi    t1,t1,2                     /* t1 = register count * 4            */
890         subf    t2,t1,t2                    /* t2 = FltSave - t1                  */
891         mtctr   t2
892         bctr
893
894         lfd     fs0,-10*8(t0)
895         lfd     fs1,-9*8(t0)
896         lfd     fs2,-8*8(t0)
897         lfd     fs3,-7*8(t0)
898         lfd     fs4,-6*8(t0)
899         lfd     fs5,-5*8(t0)
900         lfd     fs6,-4*8(t0)
901         lfd     fs7,-3*8(t0)
902         lfd     fs8,-2*8(t0)
903         lfd     fs9,-1*8(t0)
904
905 ex_flt2:
906         lwz     t0,FrameSize(pv)            /* get frame size                     */
907         add     sp,sp,t0                    /* unwind stack                       */
908         li      a3,0                        /* prepare a3 for handle_exception    */
909
910         mtlr    xpc
911         lwz     itmp3,4(xpc)
912         extsh   itmp3,itmp3
913         add     pv,itmp3,xpc
914         lwz     itmp3,8(xpc)
915         srwi    itmp3,itmp3,16
916         cmpwi   itmp3,0x3dad
917         bne     L_asm_handle_exception_stack_loop
918         lwz     itmp3,8(xpc)
919         slwi    itmp3,itmp3,16
920         add     pv,pv,itmp3
921
922         b       L_asm_handle_exception_stack_loop
923
924
925 /* asm_wrapper_patcher *********************************************************
926
927    XXX
928
929    Stack layout:
930      20   return address into JIT code (patch position)
931      16   pointer to virtual java_objectheader
932      12   machine code (which is patched back later)
933       8   unresolved class/method/field reference
934       4   data segment displacement from load instructions
935       0   patcher function pointer to call (pv is saved here afterwards)
936
937 *******************************************************************************/
938
939 asm_wrapper_patcher:
940         mflr    r0                    /* get Java return address (leaf)           */
941         stw     r0,6*4(sp)            /* store it in the stub stackframe          */
942                                       /* keep stack 16-bytes aligned: 6+1+37 = 44 */
943         stwu    sp,-(LA_SIZE+(5+58)*4+sizestackframeinfo)(sp)
944
945 #if defined(__DARWIN__)
946         stw     a0,LA_SIZE+(5+0)*4(r1)      /* save argument registers            */
947         stw     a1,LA_SIZE+(5+1)*4(r1)      /* preserve linkage area (24 bytes)   */
948         stw     a2,LA_SIZE+(5+2)*4(r1)      /* and 4 bytes for 4 argument         */
949         stw     a3,LA_SIZE+(5+3)*4(r1)
950         stw     a4,LA_SIZE+(5+4)*4(r1)
951         stw     a5,LA_SIZE+(5+5)*4(r1)
952         stw     a6,LA_SIZE+(5+6)*4(r1)
953         stw     a7,LA_SIZE+(5+7)*4(r1)
954
955         stfd    fa0,LA_SIZE+(5+8)*4(sp)
956         stfd    fa1,LA_SIZE+(5+10)*4(sp)
957         stfd    fa2,LA_SIZE+(5+12)*4(sp)
958         stfd    fa3,LA_SIZE+(5+14)*4(sp)
959         stfd    fa4,LA_SIZE+(5+16)*4(sp)
960         stfd    fa5,LA_SIZE+(5+18)*4(sp)
961         stfd    fa6,LA_SIZE+(5+20)*4(sp)
962         stfd    fa7,LA_SIZE+(5+22)*4(sp)
963         stfd    fa8,LA_SIZE+(5+24)*4(sp)
964         stfd    fa9,LA_SIZE+(5+26)*4(sp)
965         stfd    fa10,LA_SIZE+(5+28)*4(sp)
966         stfd    fa11,LA_SIZE+(5+30)*4(sp)
967         stfd    fa12,LA_SIZE+(5+32)*4(sp)
968
969         stw     t0,(LA_WORD_SIZE+5+33)*4(r1)
970         stw     t1,(LA_WORD_SIZE+5+34)*4(r1)
971         stw     t2,(LA_WORD_SIZE+5+35)*4(r1)
972         stw     t3,(LA_WORD_SIZE+5+36)*4(r1)
973         stw     t4,(LA_WORD_SIZE+5+37)*4(r1)
974         stw     t5,(LA_WORD_SIZE+5+38)*4(r1)
975         stw     t6,(LA_WORD_SIZE+5+39)*4(r1)
976         stw     t7,(LA_WORD_SIZE+5+40)*4(r1)
977
978         stfd    ft0,(LA_WORD_SIZE+5+42)*4(r1)
979         stfd    ft1,(LA_WORD_SIZE+5+44)*4(r1)
980         stfd    ft2,(LA_WORD_SIZE+5+46)*4(r1)
981         stfd    ft3,(LA_WORD_SIZE+5+48)*4(r1)
982         stfd    ft4,(LA_WORD_SIZE+5+50)*4(r1)
983         stfd    ft5,(LA_WORD_SIZE+5+52)*4(r1)
984 #else
985         SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* save 8 int/8 float arguments   */
986         SAVE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
987 #endif
988
989         stw     itmp1,LA_SIZE+(5+54)*4(sp)
990         stw     itmp2,LA_SIZE+(5+55)*4(sp)
991         stw     pv,LA_SIZE+(5+56)*4(sp)
992
993         addi    a0,sp,LA_SIZE+(5+58)*4      /* create stackframe info             */
994         mr      a1,pv
995         addi    a2,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
996         mr      a3,r0                       /* this is correct for leafs          */
997         lwz     a4,((5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo)(sp) /* pass xpc   */
998         bl      stacktrace_create_extern_stackframeinfo
999
1000         addi    a0,sp,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo  /* pass sp      */
1001         lwz     pv,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* get function */
1002         lwz     itmp1,LA_SIZE+(5+56)*4(sp)  /* move pv to position of fp          */
1003         stw     itmp1,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
1004         mtctr   pv                          /* call the patcher function          */
1005         bctrl
1006         stw     v0,LA_SIZE+(5+57)*4(sp)     /* save return value                  */
1007
1008         addi    a0,sp,LA_SIZE+(5+58)*4
1009         bl      stacktrace_remove_stackframeinfo /* remove stackframe info        */
1010
1011 #if defined(__DARWIN__)
1012         lwz     a0,LA_SIZE+(5+0)*4(r1)
1013         lwz     a1,LA_SIZE+(5+1)*4(r1)
1014         lwz     a2,LA_SIZE+(5+2)*4(r1)
1015         lwz     a3,LA_SIZE+(5+3)*4(r1)
1016         lwz     a4,LA_SIZE+(5+4)*4(r1)
1017         lwz     a5,LA_SIZE+(5+5)*4(r1)
1018         lwz     a6,LA_SIZE+(5+6)*4(r1)
1019         lwz     a7,LA_SIZE+(5+7)*4(r1)
1020
1021         lfd     fa0,LA_SIZE+(5+8)*4(sp)
1022         lfd     fa1,LA_SIZE+(5+10)*4(sp)
1023         lfd     fa2,LA_SIZE+(5+12)*4(sp)
1024         lfd     fa3,LA_SIZE+(5+14)*4(sp)
1025         lfd     fa4,LA_SIZE+(5+16)*4(sp)
1026         lfd     fa5,LA_SIZE+(5+18)*4(sp)
1027         lfd     fa6,LA_SIZE+(5+20)*4(sp)
1028         lfd     fa7,LA_SIZE+(5+22)*4(sp)
1029         lfd     fa8,LA_SIZE+(5+24)*4(sp)
1030         lfd     fa9,LA_SIZE+(5+26)*4(sp)
1031         lfd     fa10,LA_SIZE+(5+28)*4(sp)
1032         lfd     fa11,LA_SIZE+(5+30)*4(sp)
1033         lfd     fa12,LA_SIZE+(5+32)*4(sp)
1034
1035         lwz     t0,(LA_WORD_SIZE+5+33)*4(r1)
1036         lwz     t1,(LA_WORD_SIZE+5+34)*4(r1)
1037         lwz     t2,(LA_WORD_SIZE+5+35)*4(r1)
1038         lwz     t3,(LA_WORD_SIZE+5+36)*4(r1)
1039         lwz     t4,(LA_WORD_SIZE+5+37)*4(r1)
1040         lwz     t5,(LA_WORD_SIZE+5+38)*4(r1)
1041         lwz     t6,(LA_WORD_SIZE+5+39)*4(r1)
1042         lwz     t7,(LA_WORD_SIZE+5+40)*4(r1)
1043
1044         lfd     ft0,(LA_WORD_SIZE+5+42)*4(r1)
1045         lfd     ft1,(LA_WORD_SIZE+5+44)*4(r1)
1046         lfd     ft2,(LA_WORD_SIZE+5+46)*4(r1)
1047         lfd     ft3,(LA_WORD_SIZE+5+48)*4(r1)
1048         lfd     ft4,(LA_WORD_SIZE+5+50)*4(r1)
1049         lfd     ft5,(LA_WORD_SIZE+5+52)*4(r1)
1050 #else
1051         RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* restore 8 int/8 float args  */
1052         RESTORE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
1053 #endif
1054
1055         lwz     itmp1,LA_SIZE+(5+54)*4(sp)
1056         lwz     itmp2,LA_SIZE+(5+55)*4(sp)
1057         lwz     pv,LA_SIZE+(5+56)*4(sp)
1058         lwz     itmp3,LA_SIZE+(5+57)*4(sp)  /* restore return value into temp reg.*/
1059
1060         lwz     r0,(6+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* restore RA   */
1061         mtlr    r0
1062
1063         mr.     itmp3,itmp3           /* check for an exception                   */
1064         beq     L_asm_wrapper_patcher_exception
1065
1066                                       /* get return address (into JIT code)       */
1067         lwz     itmp3,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
1068
1069                                       /* remove stack frame + patcher stub stack  */
1070         addi    sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
1071
1072         mtctr   itmp3
1073         bctr                          /* jump to new patched code                 */
1074
1075 L_asm_wrapper_patcher_exception:
1076         lwz     xpc,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
1077         addi    sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
1078
1079 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1080         mflr    r0
1081         stw     r0,LA_LR_OFFSET(sp)
1082         stwu    sp,-(LA_SIZE+1*4)(sp) /* preserve linkage area                    */
1083         stw     xpc,LA_SIZE+0*4(sp)
1084         bl      builtin_asm_get_exceptionptrptr
1085         lwz     xpc,LA_SIZE+0*4(sp)
1086         lwz     r0,LA_SIZE+1*4+LA_LR_OFFSET(sp)
1087         mtlr    r0
1088         addi    sp,sp,LA_SIZE+1*4
1089 #else
1090 # if defined(__DARWIN__)
1091         lis     v0,ha16(_no_threads_exceptionptr)
1092         addi    v0,v0,lo16(_no_threads_exceptionptr)
1093 # else
1094         lis     v0,_no_threads_exceptionptr@ha
1095         addi    v0,v0,_no_threads_exceptionptr@l
1096 # endif
1097 #endif
1098
1099         lwz     xptr,0(v0)            /* get the exception pointer                */
1100         li      itmp3,0
1101         stw     itmp3,0(v0)           /* clear the exception pointer              */
1102         b       L_asm_handle_exception
1103
1104
1105 /* asm_replacement_out *********************************************************
1106
1107    This code is jumped to from the replacement-out stubs that are executed
1108    when a thread reaches an activated replacement point.
1109
1110    The purpose of asm_replacement_out is to read out the parts of the
1111    execution state that cannot be accessed from C code, store this state,
1112    and then call the C function replace_me.
1113
1114    Stack layout:
1115       16                start of stack inside method to replace
1116       0   rplpoint *    info on the replacement point that was reached
1117
1118    NOTE: itmp3 has been clobbered by the replacement-out stub!
1119
1120 *******************************************************************************/
1121
1122 /* some room to accomodate changes of the stack frame size during replacement */
1123         /* XXX we should find a cleaner solution here */
1124 #define REPLACEMENT_ROOM  512
1125
1126 asm_replacement_out:
1127     /* create stack frame */
1128         addi    sp,sp,-(sizeexecutionstate + REPLACEMENT_ROOM) /* XXX align */
1129
1130         /* save link register */
1131         mflr    r16
1132
1133         /* save registers in execution state */
1134         stw     r0 ,( 0*8+offes_intregs)(sp)
1135         stw     r1 ,( 1*8+offes_intregs)(sp)
1136         stw     r2 ,( 2*8+offes_intregs)(sp)
1137         stw     r3 ,( 3*8+offes_intregs)(sp)
1138         stw     r4 ,( 4*8+offes_intregs)(sp)
1139         stw     r5 ,( 5*8+offes_intregs)(sp)
1140         stw     r6 ,( 6*8+offes_intregs)(sp)
1141         stw     r7 ,( 7*8+offes_intregs)(sp)
1142         stw     r8 ,( 8*8+offes_intregs)(sp)
1143         stw     r9 ,( 9*8+offes_intregs)(sp)
1144         stw     r10,(10*8+offes_intregs)(sp)
1145         stw     r11,(11*8+offes_intregs)(sp)
1146         stw     r12,(12*8+offes_intregs)(sp)
1147         stw     r13,(13*8+offes_intregs)(sp)
1148         stw     r14,(14*8+offes_intregs)(sp)
1149         stw     r15,(15*8+offes_intregs)(sp)
1150         stw     r16,(16*8+offes_intregs)(sp) /* link register */
1151         stw     r17,(17*8+offes_intregs)(sp)
1152         stw     r18,(18*8+offes_intregs)(sp)
1153         stw     r19,(19*8+offes_intregs)(sp)
1154         stw     r20,(20*8+offes_intregs)(sp)
1155         stw     r21,(21*8+offes_intregs)(sp)
1156         stw     r22,(22*8+offes_intregs)(sp)
1157         stw     r23,(23*8+offes_intregs)(sp)
1158         stw     r24,(24*8+offes_intregs)(sp)
1159         stw     r25,(25*8+offes_intregs)(sp)
1160         stw     r26,(26*8+offes_intregs)(sp)
1161         stw     r27,(27*8+offes_intregs)(sp)
1162         stw     r28,(28*8+offes_intregs)(sp)
1163         stw     r29,(29*8+offes_intregs)(sp)
1164         stw     r30,(30*8+offes_intregs)(sp)
1165         stw     r31,(31*8+offes_intregs)(sp)
1166         
1167         stfd    fr0 ,( 0*8+offes_fltregs)(sp)
1168         stfd    fr1 ,( 1*8+offes_fltregs)(sp)
1169         stfd    fr2 ,( 2*8+offes_fltregs)(sp)
1170         stfd    fr3 ,( 3*8+offes_fltregs)(sp)
1171         stfd    fr4 ,( 4*8+offes_fltregs)(sp)
1172         stfd    fr5 ,( 5*8+offes_fltregs)(sp)
1173         stfd    fr6 ,( 6*8+offes_fltregs)(sp)
1174         stfd    fr7 ,( 7*8+offes_fltregs)(sp)
1175         stfd    fr8 ,( 8*8+offes_fltregs)(sp)
1176         stfd    fr9 ,( 9*8+offes_fltregs)(sp)
1177         stfd    fr10,(10*8+offes_fltregs)(sp)
1178         stfd    fr11,(11*8+offes_fltregs)(sp)
1179         stfd    fr12,(12*8+offes_fltregs)(sp)
1180         stfd    fr13,(13*8+offes_fltregs)(sp)
1181         stfd    fr14,(14*8+offes_fltregs)(sp)
1182         stfd    fr15,(15*8+offes_fltregs)(sp)
1183         stfd    fr16,(16*8+offes_fltregs)(sp)
1184         stfd    fr17,(17*8+offes_fltregs)(sp)
1185         stfd    fr18,(18*8+offes_fltregs)(sp)
1186         stfd    fr19,(19*8+offes_fltregs)(sp)
1187         stfd    fr20,(20*8+offes_fltregs)(sp)
1188         stfd    fr21,(21*8+offes_fltregs)(sp)
1189         stfd    fr22,(22*8+offes_fltregs)(sp)
1190         stfd    fr23,(23*8+offes_fltregs)(sp)
1191         stfd    fr24,(24*8+offes_fltregs)(sp)
1192         stfd    fr25,(25*8+offes_fltregs)(sp)
1193         stfd    fr26,(26*8+offes_fltregs)(sp)
1194         stfd    fr27,(27*8+offes_fltregs)(sp)
1195         stfd    fr28,(28*8+offes_fltregs)(sp)
1196         stfd    fr29,(29*8+offes_fltregs)(sp)
1197         stfd    fr30,(30*8+offes_fltregs)(sp)
1198         stfd    fr31,(31*8+offes_fltregs)(sp)
1199         
1200         /* calculate sp of method */
1201         addi    itmp1,sp,(sizeexecutionstate + REPLACEMENT_ROOM + 4*4)
1202         stw     itmp1,(offes_sp)(sp)
1203
1204         /* store pv */
1205         stw     pv,(offes_pv)(sp)
1206
1207         /* call replace_me */
1208         lwz     a0,-(4*4)(itmp1)            /* arg0: rplpoint *                   */
1209         mr      a1,sp                       /* arg1: execution state              */
1210         addi    sp,sp,-(LA_SIZE_ALIGNED)
1211         b       replace_me                  /* call C function replace_me         */
1212
1213 /* asm_replacement_in **********************************************************
1214
1215    This code writes the given execution state and jumps to the replacement
1216    code.
1217
1218    This function never returns!
1219
1220    NOTE: itmp3 is not restored!
1221
1222    C prototype:
1223       void asm_replacement_in(executionstate *es);
1224
1225 *******************************************************************************/
1226
1227 asm_replacement_in:
1228         /* a0 == executionstate *es */
1229
1230         /* set new sp and pv */
1231         lwz     sp,(offes_sp)(a0)
1232         lwz     pv,(offes_pv)(a0)
1233         
1234         /* copy registers from execution state */
1235         lwz     r0 ,( 0*8+offes_intregs)(a0)
1236         /* r1 is sp                       */
1237         /* r2 is reserved                 */
1238         /* a0 is loaded below             */
1239         lwz     r4 ,( 4*8+offes_intregs)(a0)
1240         lwz     r5 ,( 5*8+offes_intregs)(a0)
1241         lwz     r6 ,( 6*8+offes_intregs)(a0)
1242         lwz     r7 ,( 7*8+offes_intregs)(a0)
1243         lwz     r8 ,( 8*8+offes_intregs)(a0)
1244         lwz     r9 ,( 9*8+offes_intregs)(a0)
1245         lwz     r10,(10*8+offes_intregs)(a0)
1246         lwz     r11,(11*8+offes_intregs)(a0)
1247         lwz     r12,(12*8+offes_intregs)(a0)
1248         /* r13 is pv                      */
1249         lwz     r14,(14*8+offes_intregs)(a0)
1250         lwz     r15,(15*8+offes_intregs)(a0)
1251         lwz     r16,(16*8+offes_intregs)(a0) /* link register */
1252         lwz     r17,(17*8+offes_intregs)(a0)
1253         lwz     r18,(18*8+offes_intregs)(a0)
1254         lwz     r19,(19*8+offes_intregs)(a0)
1255         lwz     r20,(20*8+offes_intregs)(a0)
1256         lwz     r21,(21*8+offes_intregs)(a0)
1257         lwz     r22,(22*8+offes_intregs)(a0)
1258         lwz     r23,(23*8+offes_intregs)(a0)
1259         lwz     r24,(24*8+offes_intregs)(a0)
1260         lwz     r25,(25*8+offes_intregs)(a0)
1261         lwz     r26,(26*8+offes_intregs)(a0)
1262         lwz     r27,(27*8+offes_intregs)(a0)
1263         lwz     r28,(28*8+offes_intregs)(a0)
1264         lwz     r29,(29*8+offes_intregs)(a0)
1265         lwz     r30,(30*8+offes_intregs)(a0)
1266         lwz     r31,(31*8+offes_intregs)(a0)
1267         
1268         lfd     fr0 ,( 0*8+offes_fltregs)(a0)
1269         lfd     fr1 ,( 1*8+offes_fltregs)(a0)
1270         lfd     fr2 ,( 2*8+offes_fltregs)(a0)
1271         lfd     fr3 ,( 3*8+offes_fltregs)(a0)
1272         lfd     fr4 ,( 4*8+offes_fltregs)(a0)
1273         lfd     fr5 ,( 5*8+offes_fltregs)(a0)
1274         lfd     fr6 ,( 6*8+offes_fltregs)(a0)
1275         lfd     fr7 ,( 7*8+offes_fltregs)(a0)
1276         lfd     fr8 ,( 8*8+offes_fltregs)(a0)
1277         lfd     fr9 ,( 9*8+offes_fltregs)(a0)
1278         lfd     fr10,(10*8+offes_fltregs)(a0)
1279         lfd     fr11,(11*8+offes_fltregs)(a0)
1280         lfd     fr12,(12*8+offes_fltregs)(a0)
1281         lfd     fr13,(13*8+offes_fltregs)(a0)
1282         lfd     fr14,(14*8+offes_fltregs)(a0)
1283         lfd     fr15,(15*8+offes_fltregs)(a0)
1284         lfd     fr16,(16*8+offes_fltregs)(a0)
1285         lfd     fr17,(17*8+offes_fltregs)(a0)
1286         lfd     fr18,(18*8+offes_fltregs)(a0)
1287         lfd     fr19,(19*8+offes_fltregs)(a0)
1288         lfd     fr20,(20*8+offes_fltregs)(a0)
1289         lfd     fr21,(21*8+offes_fltregs)(a0)
1290         lfd     fr22,(22*8+offes_fltregs)(a0)
1291         lfd     fr23,(23*8+offes_fltregs)(a0)
1292         lfd     fr24,(24*8+offes_fltregs)(a0)
1293         lfd     fr25,(25*8+offes_fltregs)(a0)
1294         lfd     fr26,(26*8+offes_fltregs)(a0)
1295         lfd     fr27,(27*8+offes_fltregs)(a0)
1296         lfd     fr28,(28*8+offes_fltregs)(a0)
1297         lfd     fr29,(29*8+offes_fltregs)(a0)
1298         lfd     fr30,(30*8+offes_fltregs)(a0)
1299         lfd     fr31,(31*8+offes_fltregs)(a0)
1300
1301         /* restore link register */
1302
1303         mtlr    r16
1304         
1305         /* load new pc */
1306
1307         lwz     itmp3,offes_pc(a0)
1308
1309         /* load a0 */
1310         
1311         lwz     a0,(3*8+offes_intregs)(a0)
1312
1313         /* jump to new code */
1314
1315         mtctr   itmp3
1316         bctr
1317
1318 /*********************************************************************/
1319
1320 asm_cacheflush:
1321         add     r4,r3,r4
1322         rlwinm  r3,r3,0,0,26
1323         addi    r4,r4,31
1324         rlwinm  r4,r4,0,0,26
1325         mr      r5,r3
1326 1:
1327         cmplw   r3,r4
1328         bge     0f
1329         dcbst   0,r3
1330         addi    r3,r3,32
1331         b       1b
1332 0:
1333         sync
1334 1:
1335         cmplw   r5,r4
1336         bge     0f
1337         icbi    0,r5
1338         addi    r5,r5,32
1339         b       1b
1340 0:
1341         sync
1342         isync
1343         blr
1344
1345
1346         .align 3
1347 doublezero:
1348         .double 0.0
1349
1350 asm_initialize_thread_stack:
1351         addi r4,r4,-256
1352         stw r3,120(r4)
1353         li r3,0
1354         stw r3,124(r4)
1355         stw r3,0(r4)
1356         stw r3,4(r4)
1357         stw r3,8(r4)
1358         stw r3,12(r4)
1359         stw r3,16(r4)
1360         stw r3,20(r4)
1361         stw r3,24(r4)
1362         stw r3,28(r4)
1363         stw r3,32(r4)
1364         stw r3,36(r4)
1365
1366         stw r3,128(r4)
1367         stw r3,132(r4)
1368         stw r3,136(r4)
1369         stw r3,140(r4)
1370         stw r3,144(r4)
1371         stw r3,148(r4)
1372         stw r3,152(r4)
1373         stw r3,156(r4)
1374
1375         mflr r0
1376         bl 0f
1377 0:
1378         mflr r3
1379         mtlr r0
1380 #if defined(__DARWIN__)
1381         lfd fr0,lo16(doublezero-0b)(r3)
1382 #else
1383         lfd fr0,(doublezero-0b)@l(r3)
1384 #endif
1385
1386         stfd fr0,40(r4)
1387         stfd fr0,48(r4)
1388         stfd fr0,56(r4)
1389         stfd fr0,64(r4)
1390         stfd fr0,72(r4)
1391         stfd fr0,80(r4)
1392         stfd fr0,88(r4)
1393         stfd fr0,96(r4)
1394         stfd fr0,104(r4)
1395         stfd fr0,112(r4)
1396
1397         stfd fr0,160(r4)
1398         stfd fr0,168(r4)
1399         stfd fr0,176(r4)
1400         stfd fr0,184(r4)
1401         stfd fr0,192(r4)
1402         stfd fr0,200(r4)
1403         stfd fr0,208(r4)
1404         stfd fr0,216(r4)
1405
1406         mr r3,r4
1407         blr
1408
1409
1410 asm_perform_threadswitch:
1411         mflr r0
1412         addi r1,r1,-224
1413         stw r0,120(r1)
1414         stw pv,124(r1)
1415         stw r14,0(r1)
1416         stw r15,4(r1)
1417         stw r24,8(r1)
1418         stw r25,12(r1)
1419         stw r26,16(r1)
1420         stw r27,20(r1)
1421         stw r28,24(r1)
1422         stw r29,28(r1)
1423         stw r30,32(r1)
1424         stw r31,36(r1)
1425         stfd fr14,40(r1)
1426         stfd fr15,48(r1)
1427         stfd fr24,56(r1)
1428         stfd fr25,64(r1)
1429         stfd fr26,72(r1)
1430         stfd fr27,80(r1)
1431         stfd fr28,88(r1)
1432         stfd fr29,96(r1)
1433         stfd fr30,104(r1)
1434         stfd fr31,112(r1)
1435
1436         stw r16,128(r1)
1437         stw r17,132(r1)
1438         stw r18,136(r1)
1439         stw r19,140(r1)
1440         stw r20,144(r1)
1441         stw r21,148(r1)
1442         stw r22,152(r1)
1443         stw r23,156(r1)
1444         stfd fr16,160(r1)
1445         stfd fr17,168(r1)
1446         stfd fr18,176(r1)
1447         stfd fr19,184(r1)
1448         stfd fr20,192(r1)
1449         stfd fr21,200(r1)
1450         stfd fr22,208(r1)
1451         stfd fr23,216(r1)
1452
1453         stw r1,0(r3)
1454         stw r1,0(r5)
1455         lwz r1,0(r4)
1456
1457         lwz r0,120(r1)
1458         lwz pv,124(r1)
1459         lwz r14,0(r1)
1460         lwz r15,4(r1)
1461         lwz r24,8(r1)
1462         lwz r25,12(r1)
1463         lwz r26,16(r1)
1464         lwz r27,20(r1)
1465         lwz r28,24(r1)
1466         lwz r29,28(r1)
1467         lwz r30,32(r1)
1468         lwz r31,36(r1)
1469         lfd fr14,40(r1)
1470         lfd fr15,48(r1)
1471         lfd fr24,56(r1)
1472         lfd fr25,64(r1)
1473         lfd fr26,72(r1)
1474         lfd fr27,80(r1)
1475         lfd fr28,88(r1)
1476         lfd fr29,96(r1)
1477         lfd fr30,104(r1)
1478         lfd fr31,112(r1)
1479
1480         lwz r16,128(r1)
1481         lwz r17,132(r1)
1482         lwz r18,136(r1)
1483         lwz r19,140(r1)
1484         lwz r20,144(r1)
1485         lwz r21,148(r1)
1486         lwz r22,152(r1)
1487         lwz r23,156(r1)
1488         lfd fr16,160(r1)
1489         lfd fr17,168(r1)
1490         lfd fr18,176(r1)
1491         lfd fr19,184(r1)
1492         lfd fr20,192(r1)
1493         lfd fr21,200(r1)
1494         lfd fr22,208(r1)
1495         lfd fr23,216(r1)
1496
1497         mtlr r0
1498         addi r1,r1,224
1499         blr
1500
1501
1502 asm_switchstackandcall:
1503         mflr r0
1504         stwu r3,-48(r3)
1505         stw r0,40(r3)
1506         stw r1,44(r3)
1507         stw r1,0(r5)
1508         mr r1,r3
1509
1510         mtctr r4
1511         mr r3,r6
1512         bctrl
1513
1514         lwz r0,40(r1)
1515         mtlr r0
1516         lwz r1,44(r1)
1517         blr
1518
1519
1520 asm_getclassvalues_atomic:
1521 _crit_restart:
1522 _crit_begin:
1523         lwz     r6,offbaseval(r3)
1524         lwz     r7,offdiffval(r3)
1525         lwz     r8,offbaseval(r4)
1526 _crit_end:
1527         stw     r6,offcast_super_baseval(r5)
1528         stw     r7,offcast_super_diffval(r5)
1529         stw     r8,offcast_sub_baseval(r5)
1530         blr
1531
1532         .data
1533
1534 asm_criticalsections:
1535 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1536         .long   _crit_begin
1537         .long   _crit_end
1538         .long   _crit_restart
1539 #endif
1540         .long 0
1541
1542
1543 #if defined(__DARWIN__)
1544
1545 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1546         .align 2
1547 L_builtin_throw_exception$stub:
1548         .indirect_symbol _builtin_throw_exception
1549         mflr r0
1550         bcl 20,31,L00$_builtin_throw_exception
1551 L00$_builtin_throw_exception:
1552         mflr r11
1553         addis r11,r11,ha16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)
1554         mtlr r0
1555         lwzu r12,lo16(L_builtin_throw_exception$lazy_ptr - L00$_builtin_throw_exception)(r11)
1556         mtctr r12
1557         bctr
1558 .data
1559 .lazy_symbol_pointer
1560 L_builtin_throw_exception$lazy_ptr:
1561         .indirect_symbol _builtin_throw_exception
1562         .long dyld_stub_binding_helper
1563
1564
1565 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1566         .align 2
1567 L_exceptions_handle_exception$stub:
1568         .indirect_symbol _exceptions_handle_exception
1569         mflr r0
1570         bcl 20,31,L00$_exceptions_handle_exception
1571 L00$_exceptions_handle_exception:
1572         mflr r11
1573         addis r11,r11,ha16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)
1574         mtlr r0
1575         lwzu r12,lo16(L_exceptions_handle_exception$lazy_ptr - L00$_exceptions_handle_exception)(r11)
1576         mtctr r12
1577         bctr
1578 .data
1579 .lazy_symbol_pointer
1580 L_exceptions_handle_exception$lazy_ptr:
1581         .indirect_symbol _exceptions_handle_exception
1582         .long dyld_stub_binding_helper
1583
1584
1585 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1586         .align 2
1587 L_stacktrace_create_extern_stackframeinfo$stub:
1588         .indirect_symbol _stacktrace_create_extern_stackframeinfo
1589         mflr r0
1590         bcl 20,31,L00$_stacktrace_create_extern_stackframeinfo
1591 L00$_stacktrace_create_extern_stackframeinfo:
1592         mflr r11
1593         addis r11,r11,ha16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)
1594         mtlr r0
1595         lwzu r12,lo16(L_stacktrace_create_extern_stackframeinfo$lazy_ptr - L00$_stacktrace_create_extern_stackframeinfo)(r11)
1596         mtctr r12
1597         bctr
1598 .data
1599 .lazy_symbol_pointer
1600 L_stacktrace_create_extern_stackframeinfo$lazy_ptr:
1601         .indirect_symbol _stacktrace_create_extern_stackframeinfo
1602         .long dyld_stub_binding_helper
1603
1604
1605 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1606         .align 2
1607 L_jit_asm_compile$stub:
1608         .indirect_symbol _jit_asm_compile
1609         mflr r0
1610         bcl 20,31,L00$_jit_asm_compile
1611 L00$_jit_asm_compile:
1612         mflr r11
1613         addis r11,r11,ha16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)
1614         mtlr r0
1615         lwzu r12,lo16(L_jit_asm_compile$lazy_ptr - L00$_jit_asm_compile)(r11)
1616         mtctr r12
1617         bctr
1618 .data
1619 .lazy_symbol_pointer
1620 L_jit_asm_compile$lazy_ptr:
1621         .indirect_symbol _jit_asm_compile
1622         .long dyld_stub_binding_helper
1623
1624
1625 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1626         .align 2
1627 L_stacktrace_remove_stackframeinfo$stub:
1628         .indirect_symbol _stacktrace_remove_stackframeinfo
1629         mflr r0
1630         bcl 20,31,L00$_stacktrace_remove_stackframeinfo
1631 L00$_stacktrace_remove_stackframeinfo:
1632         mflr r11
1633         addis r11,r11,ha16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)
1634         mtlr r0
1635         lwzu r12,lo16(L_stacktrace_remove_stackframeinfo$lazy_ptr - L00$_stacktrace_remove_stackframeinfo)(r11)
1636         mtctr r12
1637         bctr
1638 .data
1639 .lazy_symbol_pointer
1640 L_stacktrace_remove_stackframeinfo$lazy_ptr:
1641         .indirect_symbol _stacktrace_remove_stackframeinfo
1642         .long dyld_stub_binding_helper
1643
1644
1645 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1646         .align 2
1647 L_builtin_asm_get_exceptionptrptr$stub:
1648         .indirect_symbol _builtin_asm_get_exceptionptrptr
1649         mflr r0
1650         bcl 20,31,L00$_builtin_asm_get_exceptionptrptr
1651 L00$_builtin_asm_get_exceptionptrptr:
1652         mflr r11
1653         addis r11,r11,ha16(L_builtin_asm_get_exceptionptrptr$lazy_ptr - L00$_builtin_asm_get_exceptionptrptr)
1654         mtlr r0
1655         lwzu r12,lo16(L_builtin_asm_get_exceptionptrptr$lazy_ptr - L00$_builtin_asm_get_exceptionptrptr)(r11)
1656         mtctr r12
1657         bctr
1658 .data
1659 .lazy_symbol_pointer
1660 L_builtin_asm_get_exceptionptrptr$lazy_ptr:
1661         .indirect_symbol _builtin_asm_get_exceptionptrptr
1662         .long dyld_stub_binding_helper
1663
1664
1665 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
1666         .align 2
1667 L_replace_me$stub:
1668         .indirect_symbol _replace_me
1669         mflr r0
1670         bcl 20,31,L00$_replace_me
1671 L00$_replace_me:
1672         mflr r11
1673         addis r11,r11,ha16(L_replace_me$lazy_ptr - L00$_replace_me)
1674         mtlr r0
1675         lwzu r12,lo16(L_replace_me$lazy_ptr - L00$_replace_me)(r11)
1676         mtctr r12
1677         bctr
1678 .data
1679 .lazy_symbol_pointer
1680 L_replace_me$lazy_ptr:
1681         .indirect_symbol _replace_me
1682         .long dyld_stub_binding_helper
1683
1684 #endif /* defined(__DARWIN__) */
1685
1686
1687 /* Disable exec-stacks, required for Gentoo ***********************************/
1688
1689 #if defined(__GCC__) && defined(__ELF__)
1690         .section .note.GNU-stack,"",@progbits
1691 #endif
1692
1693
1694 /*
1695  * These are local overrides for various environment variables in Emacs.
1696  * Please do not remove this and leave it at the end of the file, where
1697  * Emacs will automagically detect them.
1698  * ---------------------------------------------------------------------
1699  * Local variables:
1700  * mode: asm
1701  * indent-tabs-mode: t
1702  * c-basic-offset: 4
1703  * tab-width: 4
1704  * End:
1705  * vim:noexpandtab:sw=4:ts=4:
1706  */