[PATCH 03/11] Handle typedefs for CodeView
[official-gcc.git] / libffi / src / powerpc / aix_closure.S
blob132c785eddc8551afc3f9f34f376d65db65b9ed6
1 /* -----------------------------------------------------------------------
2    aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
3    based on darwin_closure.S
5    PowerPC Assembly glue.
7    Permission is hereby granted, free of charge, to any person obtaining
8    a copy of this software and associated documentation files (the
9    ``Software''), to deal in the Software without restriction, including
10    without limitation the rights to use, copy, modify, merge, publish,
11    distribute, sublicense, and/or sell copies of the Software, and to
12    permit persons to whom the Software is furnished to do so, subject to
13    the following conditions:
15    The above copyright notice and this permission notice shall be included
16    in all copies or substantial portions of the Software.
18    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
19    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
22    OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23    ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24    OTHER DEALINGS IN THE SOFTWARE.
25    ----------------------------------------------------------------------- */
27         .set r0,0
28         .set r1,1
29         .set r2,2
30         .set r3,3
31         .set r4,4
32         .set r5,5
33         .set r6,6
34         .set r7,7
35         .set r8,8
36         .set r9,9
37         .set r10,10
38         .set r11,11
39         .set r12,12
40         .set r13,13
41         .set r14,14
42         .set r15,15
43         .set r16,16
44         .set r17,17
45         .set r18,18
46         .set r19,19
47         .set r20,20
48         .set r21,21
49         .set r22,22
50         .set r23,23
51         .set r24,24
52         .set r25,25
53         .set r26,26
54         .set r27,27
55         .set r28,28
56         .set r29,29
57         .set r30,30
58         .set r31,31
59         .set f0,0
60         .set f1,1
61         .set f2,2
62         .set f3,3
63         .set f4,4
64         .set f5,5
65         .set f6,6
66         .set f7,7
67         .set f8,8
68         .set f9,9
69         .set f10,10
70         .set f11,11
71         .set f12,12
72         .set f13,13
73         .set f14,14
74         .set f15,15
75         .set f16,16
76         .set f17,17
77         .set f18,18
78         .set f19,19
79         .set f20,20
80         .set f21,21
82         .extern .ffi_closure_helper_DARWIN
83         .extern .ffi_go_closure_helper_DARWIN
85 #define LIBFFI_ASM
86 #define JUMPTARGET(name) name
87 #define L(x) x
88         .file "aix_closure.S"
89         .toc
90 LC..60:
91         .tc L..60[TC],L..60
92         .csect .text[PR]
93         .align 2
95 .csect .text[PR]
96         .align 2
97         .globl ffi_closure_ASM
98         .globl .ffi_closure_ASM
99 .csect ffi_closure_ASM[DS]
100 ffi_closure_ASM:
101 #ifdef __64BIT__
102         .llong .ffi_closure_ASM, TOC[tc0], 0
103         .csect .text[PR]
104 .ffi_closure_ASM:
105         .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0
106         .bf __LINE__
107         .line 1
108 LFB..0:
109 /* we want to build up an area for the parameters passed */
110 /* in registers (both floating point and integer) */
112         /* we store gpr 3 to gpr 10 (aligned to 4)
113         in the parents outgoing area  */
114         std   r3, 48+(0*8)(r1)
115         std   r4, 48+(1*8)(r1)
116         std   r5, 48+(2*8)(r1)
117         std   r6, 48+(3*8)(r1)
118         mflr  r0
120         std   r7, 48+(4*8)(r1)
121         std   r8, 48+(5*8)(r1)
122         std   r9, 48+(6*8)(r1)
123         std   r10, 48+(7*8)(r1)
124         std   r0, 16(r1)        /* save the return address */
125 LCFI..0:
126         /* 48  Bytes (Linkage Area) */
127         /* 64  Bytes (params) */
128         /* 16  Bytes (result) */
129         /* 104 Bytes (13*8 from FPR) */
130         /* 8   Bytes (alignment) */
131         /* 240 Bytes */
133         stdu  r1, -240(r1)      /* skip over caller save area
134                                    keep stack aligned to 16  */
135 LCFI..1:
137         /* next save fpr 1 to fpr 13 (aligned to 8) */
138         stfd  f1, 128+(0*8)(r1)
139         stfd  f2, 128+(1*8)(r1)
140         stfd  f3, 128+(2*8)(r1)
141         stfd  f4, 128+(3*8)(r1)
142         stfd  f5, 128+(4*8)(r1)
143         stfd  f6, 128+(5*8)(r1)
144         stfd  f7, 128+(6*8)(r1)
145         stfd  f8, 128+(7*8)(r1)
146         stfd  f9, 128+(8*8)(r1)
147         stfd  f10, 128+(9*8)(r1)
148         stfd  f11, 128+(10*8)(r1)
149         stfd  f12, 128+(11*8)(r1)
150         stfd  f13, 128+(12*8)(r1)
152         /* set up registers for the routine that actually does the work */
153         /* get the context pointer from the trampoline */
154         mr r3, r11
156         /* now load up the pointer to the result storage */
157         addi r4, r1, 112
159         /* now load up the pointer to the saved gpr registers */
160         addi r5, r1, 288
162         /* now load up the pointer to the saved fpr registers */
163         addi r6, r1, 128
165         /* make the call */
166         bl .ffi_closure_helper_DARWIN
167         nop
169 .Ldoneclosure:
171         /* now r3 contains the return type */
172         /* so use it to look up in a table */
173         /* so we know how to deal with each type */
175         /* look up the proper starting point in table  */
176         /* by using return type as offset */
177         lhz     r3, 10(r3)      /* load type from return type */
178         ld      r4, LC..60(2)   /* get address of jump table */
179         sldi    r3, r3, 4       /* now multiply return type by 16 */
180         ld      r0, 240+16(r1)  /* load return address */
181         add     r3, r3, r4      /* add contents of table to table address */
182         mtctr   r3
183         bctr                    /* jump to it */
185 /* Each fragment must be exactly 16 bytes long (4 instructions).
186    Align to 16 byte boundary for cache and dispatch efficiency.  */
187         .align 4
189 L..60:
190 /* case FFI_TYPE_VOID */
191         mtlr r0
192         addi r1, r1, 240
193         blr
194         nop
196 /* case FFI_TYPE_INT */
197         lwa r3, 112+4(r1)
198         mtlr r0
199         addi r1, r1, 240
200         blr
202 /* case FFI_TYPE_FLOAT */
203         lfs f1, 112+0(r1)
204         mtlr r0
205         addi r1, r1, 240
206         blr
208 /* case FFI_TYPE_DOUBLE */
209         lfd f1, 112+0(r1)
210         mtlr r0
211         addi r1, r1, 240
212         blr
214 /* case FFI_TYPE_LONGDOUBLE */
215         lfd f1, 112+0(r1)
216         mtlr r0
217         lfd f2, 112+8(r1)
218         b L..finish
220 /* case FFI_TYPE_UINT8 */
221         lbz r3, 112+7(r1)
222         mtlr r0
223         addi r1, r1, 240
224         blr
226 /* case FFI_TYPE_SINT8 */
227         lbz r3, 112+7(r1)
228         mtlr r0
229         extsb r3, r3
230         b L..finish
232 /* case FFI_TYPE_UINT16 */
233         lhz r3, 112+6(r1)
234         mtlr r0
235 L..finish:
236         addi r1, r1, 240
237         blr
239 /* case FFI_TYPE_SINT16 */
240         lha r3, 112+6(r1)
241         mtlr r0
242         addi r1, r1, 240
243         blr
245 /* case FFI_TYPE_UINT32 */
246         lwz r3, 112+4(r1)
247         mtlr r0
248         addi r1, r1, 240
249         blr
251 /* case FFI_TYPE_SINT32 */
252         lwa r3, 112+4(r1)
253         mtlr r0
254         addi r1, r1, 240
255         blr
257 /* case FFI_TYPE_UINT64 */
258         ld r3, 112+0(r1)
259         mtlr r0
260         addi r1, r1, 240
261         blr
263 /* case FFI_TYPE_SINT64 */
264         ld r3, 112+0(r1)
265         mtlr r0
266         addi r1, r1, 240
267         blr
269 /* case FFI_TYPE_STRUCT */
270         mtlr r0
271         addi r1, r1, 240
272         blr
273         nop
275 /* case FFI_TYPE_POINTER */
276         ld r3, 112+0(r1)
277         mtlr r0
278         addi r1, r1, 240
279         blr
280 LFE..0:
282 #else /* ! __64BIT__ */
283         
284         .long .ffi_closure_ASM, TOC[tc0], 0
285         .csect .text[PR]
286 .ffi_closure_ASM:
287         .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0
288         .bf __LINE__
289         .line 1
290 LFB..0:
291 /* we want to build up an area for the parameters passed */
292 /* in registers (both floating point and integer) */
294         /* we store gpr 3 to gpr 10 (aligned to 4)
295         in the parents outgoing area  */
296         stw   r3, 24+(0*4)(r1)
297         stw   r4, 24+(1*4)(r1)
298         stw   r5, 24+(2*4)(r1)
299         stw   r6, 24+(3*4)(r1)
300         mflr  r0
302         stw   r7, 24+(4*4)(r1)
303         stw   r8, 24+(5*4)(r1)
304         stw   r9, 24+(6*4)(r1)
305         stw   r10, 24+(7*4)(r1)
306         stw   r0, 8(r1)
307 LCFI..0:
308         /* 24 Bytes (Linkage Area) */
309         /* 32 Bytes (params) */
310         /* 16  Bytes (result) */
311         /* 104 Bytes (13*8 from FPR) */
312         /* 176 Bytes */
314         stwu  r1, -176(r1)      /* skip over caller save area
315                                    keep stack aligned to 16  */
316 LCFI..1:
318         /* next save fpr 1 to fpr 13 (aligned to 8) */
319         stfd  f1, 72+(0*8)(r1)
320         stfd  f2, 72+(1*8)(r1)
321         stfd  f3, 72+(2*8)(r1)
322         stfd  f4, 72+(3*8)(r1)
323         stfd  f5, 72+(4*8)(r1)
324         stfd  f6, 72+(5*8)(r1)
325         stfd  f7, 72+(6*8)(r1)
326         stfd  f8, 72+(7*8)(r1)
327         stfd  f9, 72+(8*8)(r1)
328         stfd  f10, 72+(9*8)(r1)
329         stfd  f11, 72+(10*8)(r1)
330         stfd  f12, 72+(11*8)(r1)
331         stfd  f13, 72+(12*8)(r1)
333         /* set up registers for the routine that actually does the work */
334         /* get the context pointer from the trampoline */
335         mr r3, r11
337         /* now load up the pointer to the result storage */
338         addi r4, r1, 56
340         /* now load up the pointer to the saved gpr registers */
341         addi r5, r1, 200
343         /* now load up the pointer to the saved fpr registers */
344         addi r6, r1, 72
346         /* make the call */
347         bl .ffi_closure_helper_DARWIN
348         nop
350 .Ldoneclosure:
352         /* now r3 contains the return type */
353         /* so use it to look up in a table */
354         /* so we know how to deal with each type */
356         /* look up the proper starting point in table  */
357         /* by using return type as offset */
358         lhz     r3, 6(r3)       /* load type from return type */
359         lwz     r4, LC..60(2)   /* get address of jump table */
360         slwi    r3, r3, 4       /* now multiply return type by 16 */
361         lwz     r0, 176+8(r1)   /* load return address */
362         add     r3, r3, r4      /* add contents of table to table address */
363         mtctr   r3
364         bctr                    /* jump to it */
366 /* Each fragment must be exactly 16 bytes long (4 instructions).
367    Align to 16 byte boundary for cache and dispatch efficiency.  */
368         .align 4
370 L..60:
371 /* case FFI_TYPE_VOID */
372         mtlr r0
373         addi r1, r1, 176
374         blr
375         nop
377 /* case FFI_TYPE_INT */
378         lwz r3, 56+0(r1)
379         mtlr r0
380         addi r1, r1, 176
381         blr
383 /* case FFI_TYPE_FLOAT */
384         lfs f1, 56+0(r1)
385         mtlr r0
386         addi r1, r1, 176
387         blr
389 /* case FFI_TYPE_DOUBLE */
390         lfd f1, 56+0(r1)
391         mtlr r0
392         addi r1, r1, 176
393         blr
395 /* case FFI_TYPE_LONGDOUBLE */
396         lfd f1, 56+0(r1)
397         mtlr r0
398         lfd f2, 56+8(r1)
399         b L..finish
401 /* case FFI_TYPE_UINT8 */
402         lbz r3, 56+3(r1)
403         mtlr r0
404         addi r1, r1, 176
405         blr
407 /* case FFI_TYPE_SINT8 */
408         lbz r3, 56+3(r1)
409         mtlr r0
410         extsb r3, r3
411         b L..finish
413 /* case FFI_TYPE_UINT16 */
414         lhz r3, 56+2(r1)
415         mtlr r0
416         addi r1, r1, 176
417         blr
419 /* case FFI_TYPE_SINT16 */
420         lha r3, 56+2(r1)
421         mtlr r0
422         addi r1, r1, 176
423         blr
425 /* case FFI_TYPE_UINT32 */
426         lwz r3, 56+0(r1)
427         mtlr r0
428         addi r1, r1, 176
429         blr
431 /* case FFI_TYPE_SINT32 */
432         lwz r3, 56+0(r1)
433         mtlr r0
434         addi r1, r1, 176
435         blr
437 /* case FFI_TYPE_UINT64 */
438         lwz r3, 56+0(r1)
439         mtlr r0
440         lwz r4, 56+4(r1)
441         b L..finish
443 /* case FFI_TYPE_SINT64 */
444         lwz r3, 56+0(r1)
445         mtlr r0
446         lwz r4, 56+4(r1)
447         b L..finish
449 /* case FFI_TYPE_STRUCT */
450         mtlr r0
451         addi r1, r1, 176
452         blr
453         nop
455 /* case FFI_TYPE_POINTER */
456         lwz r3, 56+0(r1)
457         mtlr r0
458 L..finish:
459         addi r1, r1, 176
460         blr
461 LFE..0:
462 #endif
463         .ef __LINE__
464 /* END(ffi_closure_ASM) */
467 .csect .text[PR]
468         .align 2
469         .globl ffi_go_closure_ASM
470         .globl .ffi_go_closure_ASM
471 .csect ffi_go_closure_ASM[DS]
472 ffi_go_closure_ASM:
473 #ifdef __64BIT__
474         .llong .ffi_go_closure_ASM, TOC[tc0], 0
475         .csect .text[PR]
476 .ffi_go_closure_ASM:
477         .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1
478         .bf __LINE__
479         .line 1
480 LFB..1:
481 /* we want to build up an area for the parameters passed */
482 /* in registers (both floating point and integer) */
484         /* we store gpr 3 to gpr 10 (aligned to 4)
485         in the parents outgoing area  */
486         std   r3, 48+(0*8)(r1)
487         std   r4, 48+(1*8)(r1)
488         std   r5, 48+(2*8)(r1)
489         std   r6, 48+(3*8)(r1)
490         mflr  r0
492         std   r7, 48+(4*8)(r1)
493         std   r8, 48+(5*8)(r1)
494         std   r9, 48+(6*8)(r1)
495         std   r10, 48+(7*8)(r1)
496         std   r0, 16(r1)        /* save the return address */
497 LCFI..2:
498         /* 48  Bytes (Linkage Area) */
499         /* 64  Bytes (params) */
500         /* 16  Bytes (result) */
501         /* 104 Bytes (13*8 from FPR) */
502         /* 8   Bytes (alignment) */
503         /* 240 Bytes */
505         stdu  r1, -240(r1)      /* skip over caller save area
506                                    keep stack aligned to 16  */
507 LCFI..3:
509         /* next save fpr 1 to fpr 13 (aligned to 8) */
510         stfd  f1, 128+(0*8)(r1)
511         stfd  f2, 128+(1*8)(r1)
512         stfd  f3, 128+(2*8)(r1)
513         stfd  f4, 128+(3*8)(r1)
514         stfd  f5, 128+(4*8)(r1)
515         stfd  f6, 128+(5*8)(r1)
516         stfd  f7, 128+(6*8)(r1)
517         stfd  f8, 128+(7*8)(r1)
518         stfd  f9, 128+(8*8)(r1)
519         stfd  f10, 128+(9*8)(r1)
520         stfd  f11, 128+(10*8)(r1)
521         stfd  f12, 128+(11*8)(r1)
522         stfd  f13, 128+(12*8)(r1)
524         /* set up registers for the routine that actually does the work */
525         mr r3, r11      /* go closure */
527         /* now load up the pointer to the result storage */
528         addi r4, r1, 112
530         /* now load up the pointer to the saved gpr registers */
531         addi r5, r1, 288
533         /* now load up the pointer to the saved fpr registers */
534         addi r6, r1, 128
536         /* make the call */
537         bl .ffi_go_closure_helper_DARWIN
538         nop
540         b .Ldoneclosure
541 LFE..1:
543 #else /* ! __64BIT__ */
544         
545         .long .ffi_go_closure_ASM, TOC[tc0], 0
546         .csect .text[PR]
547 .ffi_go_closure_ASM:
548         .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1
549         .bf __LINE__
550         .line 1
551 LFB..1:
552 /* we want to build up an area for the parameters passed */
553 /* in registers (both floating point and integer) */
555         /* we store gpr 3 to gpr 10 (aligned to 4)
556         in the parents outgoing area  */
557         stw   r3, 24+(0*4)(r1)
558         stw   r4, 24+(1*4)(r1)
559         stw   r5, 24+(2*4)(r1)
560         stw   r6, 24+(3*4)(r1)
561         mflr  r0
563         stw   r7, 24+(4*4)(r1)
564         stw   r8, 24+(5*4)(r1)
565         stw   r9, 24+(6*4)(r1)
566         stw   r10, 24+(7*4)(r1)
567         stw   r0, 8(r1)
568 LCFI..2:
569         /* 24 Bytes (Linkage Area) */
570         /* 32 Bytes (params) */
571         /* 16  Bytes (result) */
572         /* 104 Bytes (13*8 from FPR) */
573         /* 176 Bytes */
575         stwu  r1, -176(r1)      /* skip over caller save area
576                                    keep stack aligned to 16  */
577 LCFI..3:
579         /* next save fpr 1 to fpr 13 (aligned to 8) */
580         stfd  f1, 72+(0*8)(r1)
581         stfd  f2, 72+(1*8)(r1)
582         stfd  f3, 72+(2*8)(r1)
583         stfd  f4, 72+(3*8)(r1)
584         stfd  f5, 72+(4*8)(r1)
585         stfd  f6, 72+(5*8)(r1)
586         stfd  f7, 72+(6*8)(r1)
587         stfd  f8, 72+(7*8)(r1)
588         stfd  f9, 72+(8*8)(r1)
589         stfd  f10, 72+(9*8)(r1)
590         stfd  f11, 72+(10*8)(r1)
591         stfd  f12, 72+(11*8)(r1)
592         stfd  f13, 72+(12*8)(r1)
594         /* set up registers for the routine that actually does the work */
595         mr   r3, 11     /* go closure */
597         /* now load up the pointer to the result storage */
598         addi r4, r1, 56
600         /* now load up the pointer to the saved gpr registers */
601         addi r5, r1, 200
603         /* now load up the pointer to the saved fpr registers */
604         addi r6, r1, 72
606         /* make the call */
607         bl .ffi_go_closure_helper_DARWIN
608         nop
610         b    .Ldoneclosure
611 LFE..1:
612 #endif
613         .ef __LINE__
614 /* END(ffi_go_closure_ASM) */
616 /* EH frame stuff.  */
618 #define LR_REGNO                0x41            /* Link Register (65), see rs6000.md */
619 #ifdef __64BIT__
620 #define PTRSIZE                 8
621 #define LOG2_PTRSIZE            3
622 #define CFA_OFFSET              0xf0,0x01       /* LEB128 240 */
623 #define FDE_ENCODING            0x1c            /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */
624 #define EH_DATA_ALIGN_FACT      0x78            /* LEB128 -8 */
625 #else
626 #define PTRSIZE                 4
627 #define LOG2_PTRSIZE            2
628 #define CFA_OFFSET              0xb0,0x01       /* LEB128 176 */
629 #define FDE_ENCODING            0x1b            /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */
630 #define EH_DATA_ALIGN_FACT      0x7c            /* LEB128 -4 */
631 #endif
633         .csect  _unwind.ro_[RO],4
634         .align  LOG2_PTRSIZE
635         .globl  _GLOBAL__F_libffi_src_powerpc_aix_closure
636 _GLOBAL__F_libffi_src_powerpc_aix_closure:
637 Lframe..1:
638         .vbyte  4,LECIE..1-LSCIE..1     /* CIE Length */
639 LSCIE..1:
640         .vbyte  4,0                     /* CIE Identifier Tag */
641         .byte   0x3                     /* CIE Version */
642         .byte   "zR"                    /* CIE Augmentation */
643         .byte   0
644         .byte   0x1                     /* uleb128 0x1; CIE Code Alignment Factor */
645         .byte   EH_DATA_ALIGN_FACT      /* leb128 -4/-8; CIE Data Alignment Factor */
646         .byte   LR_REGNO                /* CIE RA Column */
647         .byte   0x1                     /* uleb128 0x1; Augmentation size */
648         .byte   FDE_ENCODING            /* FDE Encoding (pcrel|sdata4/8) */
649         .byte   0xc                     /* DW_CFA_def_cfa */
650         .byte   0x1                     /*     uleb128 0x1; Register r1 */
651         .byte   0                       /*     uleb128 0x0; Offset 0 */
652         .align  LOG2_PTRSIZE
653 LECIE..1:
654 LSFDE..1:
655         .vbyte  4,LEFDE..1-LASFDE..1    /* FDE Length */
656 LASFDE..1:
657         .vbyte  4,LASFDE..1-Lframe..1   /* FDE CIE offset */
658         .vbyte  PTRSIZE,LFB..0-$        /* FDE initial location */
659         .vbyte  PTRSIZE,LFE..0-LFB..0   /* FDE address range */
660         .byte   0                       /* uleb128 0x0; Augmentation size */
661         .byte   0x4                     /* DW_CFA_advance_loc4 */
662         .vbyte  4,LCFI..1-LCFI..0
663         .byte   0xe                     /* DW_CFA_def_cfa_offset */
664         .byte   CFA_OFFSET              /*     uleb128 176/240 */
665         .byte   0x4                     /* DW_CFA_advance_loc4 */
666         .vbyte  4,LCFI..0-LFB..0
667         .byte   0x11                    /* DW_CFA_offset_extended_sf */
668         .byte   LR_REGNO                /*     uleb128 LR_REGNO; Register LR */
669         .byte   0x7e                    /*     leb128 -2; Offset -2 (8/16) */
670         .align  LOG2_PTRSIZE
671 LEFDE..1:
672 LSFDE..2:
673         .vbyte  4,LEFDE..2-LASFDE..2    /* FDE Length */
674 LASFDE..2:
675         .vbyte  4,LASFDE..2-Lframe..1   /* FDE CIE offset */
676         .vbyte  PTRSIZE,LFB..1-$        /* FDE initial location */
677         .vbyte  PTRSIZE,LFE..1-LFB..1   /* FDE address range */
678         .byte   0                       /* uleb128 0x0; Augmentation size */
679         .byte   0x4                     /* DW_CFA_advance_loc4 */
680         .vbyte  4,LCFI..3-LCFI..2
681         .byte   0xe                     /* DW_CFA_def_cfa_offset */
682         .byte   CFA_OFFSET              /*     uleb128 176/240 */
683         .byte   0x4                     /* DW_CFA_advance_loc4 */
684         .vbyte  4,LCFI..2-LFB..1
685         .byte   0x11                    /* DW_CFA_offset_extended_sf */
686         .byte   LR_REGNO                /*     uleb128 LR_REGNO; Register LR */
687         .byte   0x7e                    /*     leb128 -2; Offset -2 (8/16) */
688         .align  LOG2_PTRSIZE
689 LEFDE..2:
690         .vbyte  4,0                     /* End of FDEs */
692         .csect  .text[PR]
693         .ref    _GLOBAL__F_libffi_src_powerpc_aix_closure       /* Prevents garbage collection by AIX linker */