1/* -----------------------------------------------------------------------
2   aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
3   based on darwin_closure.S
4
5   PowerPC Assembly glue.
6
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:
14
15   The above copyright notice and this permission notice shall be included
16   in all copies or substantial portions of the Software.
17
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   ----------------------------------------------------------------------- */
26
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
81
82	.extern .ffi_closure_helper_DARWIN
83	.extern .ffi_go_closure_helper_DARWIN
84
85#define LIBFFI_ASM
86#define JUMPTARGET(name) name
87#define L(x) x
88	.file "aix_closure.S"
89	.toc
90LC..60:
91	.tc L..60[TC],L..60
92	.csect .text[PR]
93	.align 2
94
95.csect .text[PR]
96	.align 2
97	.globl ffi_closure_ASM
98	.globl .ffi_closure_ASM
99.csect ffi_closure_ASM[DS]
100ffi_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
108LFB..0:
109/* we want to build up an area for the parameters passed */
110/* in registers (both floating point and integer) */
111
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
119
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 */
125LCFI..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 */
132
133	stdu  r1, -240(r1)	/* skip over caller save area
134				   keep stack aligned to 16  */
135LCFI..1:
136
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)
151
152	/* set up registers for the routine that actually does the work */
153	/* get the context pointer from the trampoline */
154	mr r3, r11
155
156	/* now load up the pointer to the result storage */
157	addi r4, r1, 112
158
159	/* now load up the pointer to the saved gpr registers */
160	addi r5, r1, 288
161
162	/* now load up the pointer to the saved fpr registers */
163	addi r6, r1, 128
164
165	/* make the call */
166	bl .ffi_closure_helper_DARWIN
167	nop
168
169.Ldoneclosure:
170
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 */
174
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 */
184
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
188
189L..60:
190/* case FFI_TYPE_VOID */
191	mtlr r0
192	addi r1, r1, 240
193	blr
194	nop
195
196/* case FFI_TYPE_INT */
197	lwa r3, 112+4(r1)
198	mtlr r0
199	addi r1, r1, 240
200	blr
201
202/* case FFI_TYPE_FLOAT */
203	lfs f1, 112+0(r1)
204	mtlr r0
205	addi r1, r1, 240
206	blr
207
208/* case FFI_TYPE_DOUBLE */
209	lfd f1, 112+0(r1)
210	mtlr r0
211	addi r1, r1, 240
212	blr
213
214/* case FFI_TYPE_LONGDOUBLE */
215	lfd f1, 112+0(r1)
216	mtlr r0
217	lfd f2, 112+8(r1)
218	b L..finish
219
220/* case FFI_TYPE_UINT8 */
221	lbz r3, 112+7(r1)
222	mtlr r0
223	addi r1, r1, 240
224	blr
225
226/* case FFI_TYPE_SINT8 */
227	lbz r3, 112+7(r1)
228	mtlr r0
229	extsb r3, r3
230	b L..finish
231
232/* case FFI_TYPE_UINT16 */
233	lhz r3, 112+6(r1)
234	mtlr r0
235L..finish:
236	addi r1, r1, 240
237	blr
238
239/* case FFI_TYPE_SINT16 */
240	lha r3, 112+6(r1)
241	mtlr r0
242	addi r1, r1, 240
243	blr
244
245/* case FFI_TYPE_UINT32 */
246	lwz r3, 112+4(r1)
247	mtlr r0
248	addi r1, r1, 240
249	blr
250
251/* case FFI_TYPE_SINT32 */
252	lwa r3, 112+4(r1)
253	mtlr r0
254	addi r1, r1, 240
255	blr
256
257/* case FFI_TYPE_UINT64 */
258	ld r3, 112+0(r1)
259	mtlr r0
260	addi r1, r1, 240
261	blr
262
263/* case FFI_TYPE_SINT64 */
264	ld r3, 112+0(r1)
265	mtlr r0
266	addi r1, r1, 240
267	blr
268
269/* case FFI_TYPE_STRUCT */
270	mtlr r0
271	addi r1, r1, 240
272	blr
273	nop
274
275/* case FFI_TYPE_POINTER */
276	ld r3, 112+0(r1)
277	mtlr r0
278	addi r1, r1, 240
279	blr
280LFE..0:
281
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
290LFB..0:
291/* we want to build up an area for the parameters passed */
292/* in registers (both floating point and integer) */
293
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
301
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)
307LCFI..0:
308	/* 24 Bytes (Linkage Area) */
309	/* 32 Bytes (params) */
310	/* 16  Bytes (result) */
311	/* 104 Bytes (13*8 from FPR) */
312	/* 176 Bytes */
313
314	stwu  r1, -176(r1)	/* skip over caller save area
315				   keep stack aligned to 16  */
316LCFI..1:
317
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)
332
333	/* set up registers for the routine that actually does the work */
334	/* get the context pointer from the trampoline */
335	mr r3, r11
336
337	/* now load up the pointer to the result storage */
338	addi r4, r1, 56
339
340	/* now load up the pointer to the saved gpr registers */
341	addi r5, r1, 200
342
343	/* now load up the pointer to the saved fpr registers */
344	addi r6, r1, 72
345
346	/* make the call */
347	bl .ffi_closure_helper_DARWIN
348	nop
349
350.Ldoneclosure:
351
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 */
355
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 */
365
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
369
370L..60:
371/* case FFI_TYPE_VOID */
372	mtlr r0
373	addi r1, r1, 176
374	blr
375	nop
376
377/* case FFI_TYPE_INT */
378	lwz r3, 56+0(r1)
379	mtlr r0
380	addi r1, r1, 176
381	blr
382
383/* case FFI_TYPE_FLOAT */
384	lfs f1, 56+0(r1)
385	mtlr r0
386	addi r1, r1, 176
387	blr
388
389/* case FFI_TYPE_DOUBLE */
390	lfd f1, 56+0(r1)
391	mtlr r0
392	addi r1, r1, 176
393	blr
394
395/* case FFI_TYPE_LONGDOUBLE */
396	lfd f1, 56+0(r1)
397	mtlr r0
398	lfd f2, 56+8(r1)
399	b L..finish
400
401/* case FFI_TYPE_UINT8 */
402	lbz r3, 56+3(r1)
403	mtlr r0
404	addi r1, r1, 176
405	blr
406
407/* case FFI_TYPE_SINT8 */
408	lbz r3, 56+3(r1)
409	mtlr r0
410	extsb r3, r3
411	b L..finish
412
413/* case FFI_TYPE_UINT16 */
414	lhz r3, 56+2(r1)
415	mtlr r0
416	addi r1, r1, 176
417	blr
418
419/* case FFI_TYPE_SINT16 */
420	lha r3, 56+2(r1)
421	mtlr r0
422	addi r1, r1, 176
423	blr
424
425/* case FFI_TYPE_UINT32 */
426	lwz r3, 56+0(r1)
427	mtlr r0
428	addi r1, r1, 176
429	blr
430
431/* case FFI_TYPE_SINT32 */
432	lwz r3, 56+0(r1)
433	mtlr r0
434	addi r1, r1, 176
435	blr
436
437/* case FFI_TYPE_UINT64 */
438	lwz r3, 56+0(r1)
439	mtlr r0
440	lwz r4, 56+4(r1)
441	b L..finish
442
443/* case FFI_TYPE_SINT64 */
444	lwz r3, 56+0(r1)
445	mtlr r0
446	lwz r4, 56+4(r1)
447	b L..finish
448
449/* case FFI_TYPE_STRUCT */
450	mtlr r0
451	addi r1, r1, 176
452	blr
453	nop
454
455/* case FFI_TYPE_POINTER */
456	lwz r3, 56+0(r1)
457	mtlr r0
458L..finish:
459	addi r1, r1, 176
460	blr
461LFE..0:
462#endif
463	.ef __LINE__
464/* END(ffi_closure_ASM) */
465
466
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]
472ffi_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
480LFB..1:
481/* we want to build up an area for the parameters passed */
482/* in registers (both floating point and integer) */
483
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
491
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 */
497LCFI..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 */
504
505	stdu  r1, -240(r1)	/* skip over caller save area
506				   keep stack aligned to 16  */
507LCFI..3:
508
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)
523
524	/* set up registers for the routine that actually does the work */
525	mr r3, r11	/* go closure */
526
527	/* now load up the pointer to the result storage */
528	addi r4, r1, 112
529
530	/* now load up the pointer to the saved gpr registers */
531	addi r5, r1, 288
532
533	/* now load up the pointer to the saved fpr registers */
534	addi r6, r1, 128
535
536	/* make the call */
537	bl .ffi_go_closure_helper_DARWIN
538	nop
539
540	b .Ldoneclosure
541LFE..1:
542
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
551LFB..1:
552/* we want to build up an area for the parameters passed */
553/* in registers (both floating point and integer) */
554
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
562
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)
568LCFI..2:
569	/* 24 Bytes (Linkage Area) */
570	/* 32 Bytes (params) */
571	/* 16  Bytes (result) */
572	/* 104 Bytes (13*8 from FPR) */
573	/* 176 Bytes */
574
575	stwu  r1, -176(r1)	/* skip over caller save area
576				   keep stack aligned to 16  */
577LCFI..3:
578
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)
593
594	/* set up registers for the routine that actually does the work */
595	mr   r3, 11	/* go closure */
596
597	/* now load up the pointer to the result storage */
598	addi r4, r1, 56
599
600	/* now load up the pointer to the saved gpr registers */
601	addi r5, r1, 200
602
603	/* now load up the pointer to the saved fpr registers */
604	addi r6, r1, 72
605
606	/* make the call */
607	bl .ffi_go_closure_helper_DARWIN
608	nop
609
610	b    .Ldoneclosure
611LFE..1:
612#endif
613	.ef __LINE__
614/* END(ffi_go_closure_ASM) */
615
616/* EH frame stuff.  */
617
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
632
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:
637Lframe..1:
638	.vbyte	4,LECIE..1-LSCIE..1	/* CIE Length */
639LSCIE..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
653LECIE..1:
654LSFDE..1:
655	.vbyte	4,LEFDE..1-LASFDE..1	/* FDE Length */
656LASFDE..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
671LEFDE..1:
672LSFDE..2:
673	.vbyte	4,LEFDE..2-LASFDE..2	/* FDE Length */
674LASFDE..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
689LEFDE..2:
690	.vbyte	4,0			/* End of FDEs */
691
692	.csect	.text[PR]
693	.ref	_GLOBAL__F_libffi_src_powerpc_aix_closure	/* Prevents garbage collection by AIX linker */
694
695