xref: /aosp_15_r20/external/libffi/src/powerpc/darwin_closure.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010,
3*1fd5a2e1SPrashanth Swaminathan   Free Software Foundation, Inc.
4*1fd5a2e1SPrashanth Swaminathan   based on ppc_closure.S
5*1fd5a2e1SPrashanth Swaminathan
6*1fd5a2e1SPrashanth Swaminathan   PowerPC Assembly glue.
7*1fd5a2e1SPrashanth Swaminathan
8*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
9*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
10*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
11*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
12*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
13*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
14*1fd5a2e1SPrashanth Swaminathan   the following conditions:
15*1fd5a2e1SPrashanth Swaminathan
16*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
17*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
18*1fd5a2e1SPrashanth Swaminathan
19*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
20*1fd5a2e1SPrashanth Swaminathan   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22*1fd5a2e1SPrashanth Swaminathan   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
23*1fd5a2e1SPrashanth Swaminathan   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24*1fd5a2e1SPrashanth Swaminathan   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25*1fd5a2e1SPrashanth Swaminathan   OTHER DEALINGS IN THE SOFTWARE.
26*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
27*1fd5a2e1SPrashanth Swaminathan
28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
29*1fd5a2e1SPrashanth Swaminathan#define L(x) x
30*1fd5a2e1SPrashanth Swaminathan
31*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
32*1fd5a2e1SPrashanth Swaminathan#define MODE_CHOICE(x, y) y
33*1fd5a2e1SPrashanth Swaminathan#else
34*1fd5a2e1SPrashanth Swaminathan#define MODE_CHOICE(x, y) x
35*1fd5a2e1SPrashanth Swaminathan#endif
36*1fd5a2e1SPrashanth Swaminathan
37*1fd5a2e1SPrashanth Swaminathan#define machine_choice	MODE_CHOICE(ppc7400,ppc64)
38*1fd5a2e1SPrashanth Swaminathan
39*1fd5a2e1SPrashanth Swaminathan; Define some pseudo-opcodes for size-independent load & store of GPRs ...
40*1fd5a2e1SPrashanth Swaminathan#define lgu		MODE_CHOICE(lwzu, ldu)
41*1fd5a2e1SPrashanth Swaminathan#define lg		MODE_CHOICE(lwz,ld)
42*1fd5a2e1SPrashanth Swaminathan#define sg		MODE_CHOICE(stw,std)
43*1fd5a2e1SPrashanth Swaminathan#define sgu		MODE_CHOICE(stwu,stdu)
44*1fd5a2e1SPrashanth Swaminathan
45*1fd5a2e1SPrashanth Swaminathan; ... and the size of GPRs and their storage indicator.
46*1fd5a2e1SPrashanth Swaminathan#define GPR_BYTES	MODE_CHOICE(4,8)
47*1fd5a2e1SPrashanth Swaminathan#define LOG2_GPR_BYTES	MODE_CHOICE(2,3)	/* log2(GPR_BYTES) */
48*1fd5a2e1SPrashanth Swaminathan#define g_long		MODE_CHOICE(long, quad)	/* usage is ".g_long" */
49*1fd5a2e1SPrashanth Swaminathan
50*1fd5a2e1SPrashanth Swaminathan; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
51*1fd5a2e1SPrashanth Swaminathan#define LINKAGE_SIZE	MODE_CHOICE(24,48)
52*1fd5a2e1SPrashanth Swaminathan#define PARAM_AREA	MODE_CHOICE(32,64)
53*1fd5a2e1SPrashanth Swaminathan
54*1fd5a2e1SPrashanth Swaminathan#define SAVED_CR_OFFSET	MODE_CHOICE(4,8)	/* save position for CR */
55*1fd5a2e1SPrashanth Swaminathan#define SAVED_LR_OFFSET	MODE_CHOICE(8,16)	/* save position for lr */
56*1fd5a2e1SPrashanth Swaminathan
57*1fd5a2e1SPrashanth Swaminathan/* WARNING: if ffi_type is changed... here be monsters.
58*1fd5a2e1SPrashanth Swaminathan   Offsets of items within the result type.  */
59*1fd5a2e1SPrashanth Swaminathan#define FFI_TYPE_TYPE	MODE_CHOICE(6,10)
60*1fd5a2e1SPrashanth Swaminathan#define FFI_TYPE_ELEM	MODE_CHOICE(8,16)
61*1fd5a2e1SPrashanth Swaminathan
62*1fd5a2e1SPrashanth Swaminathan#define SAVED_FPR_COUNT 13
63*1fd5a2e1SPrashanth Swaminathan#define FPR_SIZE	8
64*1fd5a2e1SPrashanth Swaminathan/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */
65*1fd5a2e1SPrashanth Swaminathan#define RESULT_BYTES	MODE_CHOICE(16,176)
66*1fd5a2e1SPrashanth Swaminathan
67*1fd5a2e1SPrashanth Swaminathan; The whole stack frame **MUST** be 16byte-aligned.
68*1fd5a2e1SPrashanth Swaminathan#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL)
69*1fd5a2e1SPrashanth Swaminathan#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES))
70*1fd5a2e1SPrashanth Swaminathan
71*1fd5a2e1SPrashanth Swaminathan#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE)
72*1fd5a2e1SPrashanth Swaminathan#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA)
73*1fd5a2e1SPrashanth Swaminathan
74*1fd5a2e1SPrashanth Swaminathan#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
75*1fd5a2e1SPrashanth Swaminathan; We no longer need the pic symbol stub for Darwin >= 9.
76*1fd5a2e1SPrashanth Swaminathan#define BLCLS_HELP _ffi_closure_helper_DARWIN
77*1fd5a2e1SPrashanth Swaminathan#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p
78*1fd5a2e1SPrashanth Swaminathan#define PASS_STR_FLOATS _darwin64_pass_struct_floats
79*1fd5a2e1SPrashanth Swaminathan#undef WANT_STUB
80*1fd5a2e1SPrashanth Swaminathan#else
81*1fd5a2e1SPrashanth Swaminathan#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub
82*1fd5a2e1SPrashanth Swaminathan#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub
83*1fd5a2e1SPrashanth Swaminathan#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub
84*1fd5a2e1SPrashanth Swaminathan#define WANT_STUB
85*1fd5a2e1SPrashanth Swaminathan#endif
86*1fd5a2e1SPrashanth Swaminathan
87*1fd5a2e1SPrashanth Swaminathan/* m32/m64
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan   The stack layout looks like this:
90*1fd5a2e1SPrashanth Swaminathan
91*1fd5a2e1SPrashanth Swaminathan   |   Additional params...			| |     Higher address
92*1fd5a2e1SPrashanth Swaminathan   ~						~ ~
93*1fd5a2e1SPrashanth Swaminathan   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
94*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
95*1fd5a2e1SPrashanth Swaminathan   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
96*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
97*1fd5a2e1SPrashanth Swaminathan   |   Reserved                       2*4/8	| |
98*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
99*1fd5a2e1SPrashanth Swaminathan   |   Space for callee`s LR		4/8	| |
100*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
101*1fd5a2e1SPrashanth Swaminathan   |   Saved CR [low word for m64]      4/8	| |
102*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
103*1fd5a2e1SPrashanth Swaminathan   |   Current backchain pointer	4/8	|-/ Parent`s frame.
104*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| <+ <<< on entry to
105*1fd5a2e1SPrashanth Swaminathan   |   Result Bytes		       16/176	| |
106*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
107*1fd5a2e1SPrashanth Swaminathan   ~   padding to 16-byte alignment		~ ~
108*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
109*1fd5a2e1SPrashanth Swaminathan   |   NUM_FPR_ARG_REGISTERS slots		| |
110*1fd5a2e1SPrashanth Swaminathan   |   here fp13 .. fp1		       13*8	| |
111*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
112*1fd5a2e1SPrashanth Swaminathan   |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
113*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |
114*1fd5a2e1SPrashanth Swaminathan   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
115*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |	stack	|
116*1fd5a2e1SPrashanth Swaminathan   |   Reserved [compiler,binder]     2*4/8	| |	grows	|
117*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |	down	V
118*1fd5a2e1SPrashanth Swaminathan   |   Space for callees LR		4/8	| |
119*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |	lower addresses
120*1fd5a2e1SPrashanth Swaminathan   |   Saved CR [low word for m64]      4/8	| |
121*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------| |     stack pointer here
122*1fd5a2e1SPrashanth Swaminathan   |   Current backchain pointer	4/8	|-/	during
123*1fd5a2e1SPrashanth Swaminathan   |--------------------------------------------|   <<<	call.
124*1fd5a2e1SPrashanth Swaminathan
125*1fd5a2e1SPrashanth Swaminathan*/
126*1fd5a2e1SPrashanth Swaminathan
127*1fd5a2e1SPrashanth Swaminathan	.file	"darwin_closure.S"
128*1fd5a2e1SPrashanth Swaminathan
129*1fd5a2e1SPrashanth Swaminathan	.machine machine_choice
130*1fd5a2e1SPrashanth Swaminathan
131*1fd5a2e1SPrashanth Swaminathan	.text
132*1fd5a2e1SPrashanth Swaminathan	.globl _ffi_closure_ASM
133*1fd5a2e1SPrashanth Swaminathan	.align LOG2_GPR_BYTES
134*1fd5a2e1SPrashanth Swaminathan_ffi_closure_ASM:
135*1fd5a2e1SPrashanth SwaminathanLFB1:
136*1fd5a2e1SPrashanth SwaminathanLstartcode:
137*1fd5a2e1SPrashanth Swaminathan	mflr	r0			/* extract return address  */
138*1fd5a2e1SPrashanth Swaminathan	sg	r0,SAVED_LR_OFFSET(r1)	/* save the return address  */
139*1fd5a2e1SPrashanth SwaminathanLCFI0:
140*1fd5a2e1SPrashanth Swaminathan	sgu	r1,-SAVE_SIZE(r1)	/* skip over caller save area
141*1fd5a2e1SPrashanth Swaminathan					keep stack aligned to 16.  */
142*1fd5a2e1SPrashanth SwaminathanLCFI1:
143*1fd5a2e1SPrashanth Swaminathan	/* We want to build up an area for the parameters passed
144*1fd5a2e1SPrashanth Swaminathan	   in registers. (both floating point and integer)  */
145*1fd5a2e1SPrashanth Swaminathan
146*1fd5a2e1SPrashanth Swaminathan	/* Put gpr 3 to gpr 10 in the parents outgoing area...
147*1fd5a2e1SPrashanth Swaminathan	   ... the remainder of any params that overflowed the regs will
148*1fd5a2e1SPrashanth Swaminathan	   follow here.  */
149*1fd5a2e1SPrashanth Swaminathan	sg	r3, (PARENT_PARM_BASE                )(r1)
150*1fd5a2e1SPrashanth Swaminathan	sg	r4, (PARENT_PARM_BASE + GPR_BYTES    )(r1)
151*1fd5a2e1SPrashanth Swaminathan	sg	r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1)
152*1fd5a2e1SPrashanth Swaminathan	sg	r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1)
153*1fd5a2e1SPrashanth Swaminathan	sg	r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1)
154*1fd5a2e1SPrashanth Swaminathan	sg	r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1)
155*1fd5a2e1SPrashanth Swaminathan	sg	r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1)
156*1fd5a2e1SPrashanth Swaminathan	sg	r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1)
157*1fd5a2e1SPrashanth Swaminathan
158*1fd5a2e1SPrashanth Swaminathan	/* We save fpr 1 to fpr 14 in our own save frame.  */
159*1fd5a2e1SPrashanth Swaminathan	stfd	f1, (FP_SAVE_BASE                 )(r1)
160*1fd5a2e1SPrashanth Swaminathan	stfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
161*1fd5a2e1SPrashanth Swaminathan	stfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
162*1fd5a2e1SPrashanth Swaminathan	stfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
163*1fd5a2e1SPrashanth Swaminathan	stfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
164*1fd5a2e1SPrashanth Swaminathan	stfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
165*1fd5a2e1SPrashanth Swaminathan	stfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
166*1fd5a2e1SPrashanth Swaminathan	stfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
167*1fd5a2e1SPrashanth Swaminathan	stfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
168*1fd5a2e1SPrashanth Swaminathan	stfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
169*1fd5a2e1SPrashanth Swaminathan	stfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
170*1fd5a2e1SPrashanth Swaminathan	stfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
171*1fd5a2e1SPrashanth Swaminathan	stfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
172*1fd5a2e1SPrashanth Swaminathan
173*1fd5a2e1SPrashanth Swaminathan	/* Set up registers for the routine that actually does the work
174*1fd5a2e1SPrashanth Swaminathan	   get the context pointer from the trampoline.  */
175*1fd5a2e1SPrashanth Swaminathan	mr	r3,r11
176*1fd5a2e1SPrashanth Swaminathan
177*1fd5a2e1SPrashanth Swaminathan	/* Now load up the pointer to the result storage.  */
178*1fd5a2e1SPrashanth Swaminathan	addi	r4,r1,(SAVE_SIZE-RESULT_BYTES)
179*1fd5a2e1SPrashanth Swaminathan
180*1fd5a2e1SPrashanth Swaminathan	/* Now load up the pointer to the saved gpr registers.  */
181*1fd5a2e1SPrashanth Swaminathan	addi	r5,r1,PARENT_PARM_BASE
182*1fd5a2e1SPrashanth Swaminathan
183*1fd5a2e1SPrashanth Swaminathan	/* Now load up the pointer to the saved fpr registers.  */
184*1fd5a2e1SPrashanth Swaminathan	addi	r6,r1,FP_SAVE_BASE
185*1fd5a2e1SPrashanth Swaminathan
186*1fd5a2e1SPrashanth Swaminathan	/* Make the call.  */
187*1fd5a2e1SPrashanth Swaminathan	bl	BLCLS_HELP
188*1fd5a2e1SPrashanth Swaminathan
189*1fd5a2e1SPrashanth Swaminathan	/* r3 contains the rtype pointer... save it since we will need
190*1fd5a2e1SPrashanth Swaminathan	   it later.  */
191*1fd5a2e1SPrashanth Swaminathan	sg	r3,LINKAGE_SIZE(r1)	; ffi_type * result_type
192*1fd5a2e1SPrashanth Swaminathan	lg	r0,0(r3)		; size => r0
193*1fd5a2e1SPrashanth Swaminathan	lhz	r3,FFI_TYPE_TYPE(r3)	; type => r3
194*1fd5a2e1SPrashanth Swaminathan
195*1fd5a2e1SPrashanth Swaminathan	/* The helper will have intercepted structure returns and inserted
196*1fd5a2e1SPrashanth Swaminathan	   the caller`s destination address for structs returned by ref.  */
197*1fd5a2e1SPrashanth Swaminathan
198*1fd5a2e1SPrashanth Swaminathan	/* r3 contains the return type  so use it to look up in a table
199*1fd5a2e1SPrashanth Swaminathan	   so we know how to deal with each type.  */
200*1fd5a2e1SPrashanth Swaminathan
201*1fd5a2e1SPrashanth Swaminathan	addi	r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here.  */
202*1fd5a2e1SPrashanth Swaminathan	bl	Lget_ret_type0_addr	/* Get pointer to Lret_type0 into LR.  */
203*1fd5a2e1SPrashanth Swaminathan	mflr	r4			/* Move to r4.  */
204*1fd5a2e1SPrashanth Swaminathan	slwi	r3,r3,4			/* Now multiply return type by 16.  */
205*1fd5a2e1SPrashanth Swaminathan	add	r3,r3,r4		/* Add contents of table to table address.  */
206*1fd5a2e1SPrashanth Swaminathan	mtctr	r3
207*1fd5a2e1SPrashanth Swaminathan	bctr			 	 /* Jump to it.  */
208*1fd5a2e1SPrashanth SwaminathanLFE1:
209*1fd5a2e1SPrashanth Swaminathan/* Each of the ret_typeX code fragments has to be exactly 16 bytes long
210*1fd5a2e1SPrashanth Swaminathan   (4 instructions). For cache effectiveness we align to a 16 byte boundary
211*1fd5a2e1SPrashanth Swaminathan   first.  */
212*1fd5a2e1SPrashanth Swaminathan
213*1fd5a2e1SPrashanth Swaminathan	.align 4
214*1fd5a2e1SPrashanth Swaminathan
215*1fd5a2e1SPrashanth Swaminathan	nop
216*1fd5a2e1SPrashanth Swaminathan	nop
217*1fd5a2e1SPrashanth Swaminathan	nop
218*1fd5a2e1SPrashanth SwaminathanLget_ret_type0_addr:
219*1fd5a2e1SPrashanth Swaminathan	blrl
220*1fd5a2e1SPrashanth Swaminathan
221*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_VOID  */
222*1fd5a2e1SPrashanth SwaminathanLret_type0:
223*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
224*1fd5a2e1SPrashanth Swaminathan	nop
225*1fd5a2e1SPrashanth Swaminathan	nop
226*1fd5a2e1SPrashanth Swaminathan	nop
227*1fd5a2e1SPrashanth Swaminathan
228*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_INT  */
229*1fd5a2e1SPrashanth SwaminathanLret_type1:
230*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)
231*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
232*1fd5a2e1SPrashanth Swaminathan	nop
233*1fd5a2e1SPrashanth Swaminathan	nop
234*1fd5a2e1SPrashanth Swaminathan
235*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_FLOAT  */
236*1fd5a2e1SPrashanth SwaminathanLret_type2:
237*1fd5a2e1SPrashanth Swaminathan	lfs	f1,0(r5)
238*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
239*1fd5a2e1SPrashanth Swaminathan	nop
240*1fd5a2e1SPrashanth Swaminathan	nop
241*1fd5a2e1SPrashanth Swaminathan
242*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_DOUBLE  */
243*1fd5a2e1SPrashanth SwaminathanLret_type3:
244*1fd5a2e1SPrashanth Swaminathan	lfd	f1,0(r5)
245*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
246*1fd5a2e1SPrashanth Swaminathan	nop
247*1fd5a2e1SPrashanth Swaminathan	nop
248*1fd5a2e1SPrashanth Swaminathan
249*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_LONGDOUBLE  */
250*1fd5a2e1SPrashanth SwaminathanLret_type4:
251*1fd5a2e1SPrashanth Swaminathan	lfd	f1,0(r5)
252*1fd5a2e1SPrashanth Swaminathan	lfd	f2,8(r5)
253*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
254*1fd5a2e1SPrashanth Swaminathan	nop
255*1fd5a2e1SPrashanth Swaminathan
256*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT8  */
257*1fd5a2e1SPrashanth SwaminathanLret_type5:
258*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
259*1fd5a2e1SPrashanth Swaminathan	lbz	r3,7(r5)
260*1fd5a2e1SPrashanth Swaminathan#else
261*1fd5a2e1SPrashanth Swaminathan	lbz	r3,3(r5)
262*1fd5a2e1SPrashanth Swaminathan#endif
263*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
264*1fd5a2e1SPrashanth Swaminathan	nop
265*1fd5a2e1SPrashanth Swaminathan	nop
266*1fd5a2e1SPrashanth Swaminathan
267*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT8  */
268*1fd5a2e1SPrashanth SwaminathanLret_type6:
269*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
270*1fd5a2e1SPrashanth Swaminathan	lbz	r3,7(r5)
271*1fd5a2e1SPrashanth Swaminathan#else
272*1fd5a2e1SPrashanth Swaminathan	lbz	r3,3(r5)
273*1fd5a2e1SPrashanth Swaminathan#endif
274*1fd5a2e1SPrashanth Swaminathan	extsb	r3,r3
275*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
276*1fd5a2e1SPrashanth Swaminathan	nop
277*1fd5a2e1SPrashanth Swaminathan
278*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT16  */
279*1fd5a2e1SPrashanth SwaminathanLret_type7:
280*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
281*1fd5a2e1SPrashanth Swaminathan	lhz	r3,6(r5)
282*1fd5a2e1SPrashanth Swaminathan#else
283*1fd5a2e1SPrashanth Swaminathan	lhz	r3,2(r5)
284*1fd5a2e1SPrashanth Swaminathan#endif
285*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
286*1fd5a2e1SPrashanth Swaminathan	nop
287*1fd5a2e1SPrashanth Swaminathan	nop
288*1fd5a2e1SPrashanth Swaminathan
289*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT16  */
290*1fd5a2e1SPrashanth SwaminathanLret_type8:
291*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
292*1fd5a2e1SPrashanth Swaminathan	lha	r3,6(r5)
293*1fd5a2e1SPrashanth Swaminathan#else
294*1fd5a2e1SPrashanth Swaminathan	lha	r3,2(r5)
295*1fd5a2e1SPrashanth Swaminathan#endif
296*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
297*1fd5a2e1SPrashanth Swaminathan	nop
298*1fd5a2e1SPrashanth Swaminathan	nop
299*1fd5a2e1SPrashanth Swaminathan
300*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT32  */
301*1fd5a2e1SPrashanth SwaminathanLret_type9:
302*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
303*1fd5a2e1SPrashanth Swaminathan	lwz	r3,4(r5)
304*1fd5a2e1SPrashanth Swaminathan#else
305*1fd5a2e1SPrashanth Swaminathan	lwz	r3,0(r5)
306*1fd5a2e1SPrashanth Swaminathan#endif
307*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
308*1fd5a2e1SPrashanth Swaminathan	nop
309*1fd5a2e1SPrashanth Swaminathan	nop
310*1fd5a2e1SPrashanth Swaminathan
311*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT32  */
312*1fd5a2e1SPrashanth SwaminathanLret_type10:
313*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
314*1fd5a2e1SPrashanth Swaminathan	lwz	r3,4(r5)
315*1fd5a2e1SPrashanth Swaminathan#else
316*1fd5a2e1SPrashanth Swaminathan	lwz	r3,0(r5)
317*1fd5a2e1SPrashanth Swaminathan#endif
318*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
319*1fd5a2e1SPrashanth Swaminathan	nop
320*1fd5a2e1SPrashanth Swaminathan	nop
321*1fd5a2e1SPrashanth Swaminathan
322*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT64  */
323*1fd5a2e1SPrashanth SwaminathanLret_type11:
324*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
325*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)
326*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
327*1fd5a2e1SPrashanth Swaminathan	nop
328*1fd5a2e1SPrashanth Swaminathan#else
329*1fd5a2e1SPrashanth Swaminathan	lwz	r3,0(r5)
330*1fd5a2e1SPrashanth Swaminathan	lwz	r4,4(r5)
331*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
332*1fd5a2e1SPrashanth Swaminathan#endif
333*1fd5a2e1SPrashanth Swaminathan	nop
334*1fd5a2e1SPrashanth Swaminathan
335*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT64  */
336*1fd5a2e1SPrashanth SwaminathanLret_type12:
337*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
338*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)
339*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
340*1fd5a2e1SPrashanth Swaminathan	nop
341*1fd5a2e1SPrashanth Swaminathan#else
342*1fd5a2e1SPrashanth Swaminathan	lwz	r3,0(r5)
343*1fd5a2e1SPrashanth Swaminathan	lwz	r4,4(r5)
344*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
345*1fd5a2e1SPrashanth Swaminathan#endif
346*1fd5a2e1SPrashanth Swaminathan	nop
347*1fd5a2e1SPrashanth Swaminathan
348*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_STRUCT  */
349*1fd5a2e1SPrashanth SwaminathanLret_type13:
350*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
351*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)		; we need at least this...
352*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,4
353*1fd5a2e1SPrashanth Swaminathan	bgt	Lstructend		; not a special small case
354*1fd5a2e1SPrashanth Swaminathan	b	Lsmallstruct		; see if we need more.
355*1fd5a2e1SPrashanth Swaminathan#else
356*1fd5a2e1SPrashanth Swaminathan	cmpwi	0,r0,4
357*1fd5a2e1SPrashanth Swaminathan	bgt	Lfinish		; not by value
358*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)
359*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
360*1fd5a2e1SPrashanth Swaminathan#endif
361*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_POINTER  */
362*1fd5a2e1SPrashanth SwaminathanLret_type14:
363*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r5)
364*1fd5a2e1SPrashanth Swaminathan	b	Lfinish
365*1fd5a2e1SPrashanth Swaminathan	nop
366*1fd5a2e1SPrashanth Swaminathan	nop
367*1fd5a2e1SPrashanth Swaminathan
368*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
369*1fd5a2e1SPrashanth SwaminathanLsmallstruct:
370*1fd5a2e1SPrashanth Swaminathan	beq	Lfour			; continuation of Lret13.
371*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,3
372*1fd5a2e1SPrashanth Swaminathan	beq	Lfinish			; don`t adjust this - can`t be any floats here...
373*1fd5a2e1SPrashanth Swaminathan	srdi	r3,r3,48
374*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,2
375*1fd5a2e1SPrashanth Swaminathan	beq	Lfinish			; .. or here ..
376*1fd5a2e1SPrashanth Swaminathan	srdi	r3,r3,8
377*1fd5a2e1SPrashanth Swaminathan	b 	Lfinish			; .. or here.
378*1fd5a2e1SPrashanth Swaminathan
379*1fd5a2e1SPrashanth SwaminathanLfour:
380*1fd5a2e1SPrashanth Swaminathan	lg	r6,LINKAGE_SIZE(r1)	; get the result type
381*1fd5a2e1SPrashanth Swaminathan	lg	r6,FFI_TYPE_ELEM(r6)	; elements array pointer
382*1fd5a2e1SPrashanth Swaminathan	lg	r6,0(r6)		; first element
383*1fd5a2e1SPrashanth Swaminathan	lhz	r0,FFI_TYPE_TYPE(r6)	; OK go the type
384*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,2			; FFI_TYPE_FLOAT
385*1fd5a2e1SPrashanth Swaminathan	bne	Lfourint
386*1fd5a2e1SPrashanth Swaminathan	lfs	f1,0(r5)		; just one float in the struct.
387*1fd5a2e1SPrashanth Swaminathan	b 	Lfinish
388*1fd5a2e1SPrashanth Swaminathan
389*1fd5a2e1SPrashanth SwaminathanLfourint:
390*1fd5a2e1SPrashanth Swaminathan	srdi	r3,r3,32		; four bytes.
391*1fd5a2e1SPrashanth Swaminathan	b 	Lfinish
392*1fd5a2e1SPrashanth Swaminathan
393*1fd5a2e1SPrashanth SwaminathanLstructend:
394*1fd5a2e1SPrashanth Swaminathan	lg	r3,LINKAGE_SIZE(r1)	; get the result type
395*1fd5a2e1SPrashanth Swaminathan	bl	STRUCT_RETVALUE_P
396*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r3,0
397*1fd5a2e1SPrashanth Swaminathan	beq	Lfinish			; nope.
398*1fd5a2e1SPrashanth Swaminathan	/* Recover a pointer to the results.  */
399*1fd5a2e1SPrashanth Swaminathan	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
400*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r11)		; we need at least this...
401*1fd5a2e1SPrashanth Swaminathan	lg	r4,8(r11)
402*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,16
403*1fd5a2e1SPrashanth Swaminathan	beq	Lfinish		; special case 16 bytes we don't consider floats.
404*1fd5a2e1SPrashanth Swaminathan
405*1fd5a2e1SPrashanth Swaminathan	/* OK, frustratingly, the process of saving the struct to mem might have
406*1fd5a2e1SPrashanth Swaminathan	   messed with the FPRs, so we have to re-load them :(.
407*1fd5a2e1SPrashanth Swaminathan	   We`ll use our FPRs space again - calling:
408*1fd5a2e1SPrashanth Swaminathan	   void darwin64_pass_struct_floats (ffi_type *s, char *src,
409*1fd5a2e1SPrashanth Swaminathan					     unsigned *nfpr, double **fprs)
410*1fd5a2e1SPrashanth Swaminathan	   We`ll temporarily pinch the first two slots of the param area for local
411*1fd5a2e1SPrashanth Swaminathan	   vars used by the routine.  */
412*1fd5a2e1SPrashanth Swaminathan	xor	r6,r6,r6
413*1fd5a2e1SPrashanth Swaminathan	addi	r5,r1,PARENT_PARM_BASE		; some space
414*1fd5a2e1SPrashanth Swaminathan	sg	r6,0(r5)			; *nfpr zeroed.
415*1fd5a2e1SPrashanth Swaminathan	addi	r6,r5,8				; **fprs
416*1fd5a2e1SPrashanth Swaminathan	addi	r3,r1,FP_SAVE_BASE		; pointer to FPRs space
417*1fd5a2e1SPrashanth Swaminathan	sg	r3,0(r6)
418*1fd5a2e1SPrashanth Swaminathan	mr	r4,r11				; the struct is here...
419*1fd5a2e1SPrashanth Swaminathan	lg	r3,LINKAGE_SIZE(r1)		; ffi_type * result_type.
420*1fd5a2e1SPrashanth Swaminathan	bl	PASS_STR_FLOATS			; get struct floats into FPR save space.
421*1fd5a2e1SPrashanth Swaminathan	/* See if we used any floats  */
422*1fd5a2e1SPrashanth Swaminathan	lwz	r0,(SAVE_SIZE-RESULT_BYTES)(r1)
423*1fd5a2e1SPrashanth Swaminathan	cmpi	0,r0,0
424*1fd5a2e1SPrashanth Swaminathan	beq	Lstructints			; nope.
425*1fd5a2e1SPrashanth Swaminathan	/* OK load `em up... */
426*1fd5a2e1SPrashanth Swaminathan	lfd	f1, (FP_SAVE_BASE                 )(r1)
427*1fd5a2e1SPrashanth Swaminathan	lfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
428*1fd5a2e1SPrashanth Swaminathan	lfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
429*1fd5a2e1SPrashanth Swaminathan	lfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
430*1fd5a2e1SPrashanth Swaminathan	lfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
431*1fd5a2e1SPrashanth Swaminathan	lfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
432*1fd5a2e1SPrashanth Swaminathan	lfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
433*1fd5a2e1SPrashanth Swaminathan	lfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
434*1fd5a2e1SPrashanth Swaminathan	lfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
435*1fd5a2e1SPrashanth Swaminathan	lfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
436*1fd5a2e1SPrashanth Swaminathan	lfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
437*1fd5a2e1SPrashanth Swaminathan	lfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
438*1fd5a2e1SPrashanth Swaminathan	lfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
439*1fd5a2e1SPrashanth Swaminathan
440*1fd5a2e1SPrashanth Swaminathan	/* point back at our saved struct.  */
441*1fd5a2e1SPrashanth SwaminathanLstructints:
442*1fd5a2e1SPrashanth Swaminathan	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
443*1fd5a2e1SPrashanth Swaminathan	lg	r3,0(r11)			; we end up picking the
444*1fd5a2e1SPrashanth Swaminathan	lg	r4,8(r11)			; first two again.
445*1fd5a2e1SPrashanth Swaminathan	lg	r5,16(r11)
446*1fd5a2e1SPrashanth Swaminathan	lg	r6,24(r11)
447*1fd5a2e1SPrashanth Swaminathan	lg	r7,32(r11)
448*1fd5a2e1SPrashanth Swaminathan	lg	r8,40(r11)
449*1fd5a2e1SPrashanth Swaminathan	lg	r9,48(r11)
450*1fd5a2e1SPrashanth Swaminathan	lg	r10,56(r11)
451*1fd5a2e1SPrashanth Swaminathan#endif
452*1fd5a2e1SPrashanth Swaminathan
453*1fd5a2e1SPrashanth Swaminathan/* case done  */
454*1fd5a2e1SPrashanth SwaminathanLfinish:
455*1fd5a2e1SPrashanth Swaminathan	addi	r1,r1,SAVE_SIZE		/* Restore stack pointer.  */
456*1fd5a2e1SPrashanth Swaminathan	lg	r0,SAVED_LR_OFFSET(r1)	/* Get return address.  */
457*1fd5a2e1SPrashanth Swaminathan	mtlr	r0			/* Reset link register.  */
458*1fd5a2e1SPrashanth Swaminathan	blr
459*1fd5a2e1SPrashanth SwaminathanLendcode:
460*1fd5a2e1SPrashanth Swaminathan	.align 1
461*1fd5a2e1SPrashanth Swaminathan
462*1fd5a2e1SPrashanth Swaminathan/* END(ffi_closure_ASM)  */
463*1fd5a2e1SPrashanth Swaminathan
464*1fd5a2e1SPrashanth Swaminathan/* EH frame stuff.  */
465*1fd5a2e1SPrashanth Swaminathan#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
466*1fd5a2e1SPrashanth Swaminathan/* 176, 400 */
467*1fd5a2e1SPrashanth Swaminathan#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90)
468*1fd5a2e1SPrashanth Swaminathan#define EH_FRAME_OFFSETB MODE_CHOICE(1,3)
469*1fd5a2e1SPrashanth Swaminathan
470*1fd5a2e1SPrashanth Swaminathan	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
471*1fd5a2e1SPrashanth SwaminathanEH_frame1:
472*1fd5a2e1SPrashanth Swaminathan	.set	L$set$0,LECIE1-LSCIE1
473*1fd5a2e1SPrashanth Swaminathan	.long	L$set$0	; Length of Common Information Entry
474*1fd5a2e1SPrashanth SwaminathanLSCIE1:
475*1fd5a2e1SPrashanth Swaminathan	.long	0x0	; CIE Identifier Tag
476*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	; CIE Version
477*1fd5a2e1SPrashanth Swaminathan	.ascii	"zR\0"	; CIE Augmentation
478*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
479*1fd5a2e1SPrashanth Swaminathan	.byte	EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
480*1fd5a2e1SPrashanth Swaminathan	.byte	0x41	; CIE RA Column
481*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	; uleb128 0x1; Augmentation size
482*1fd5a2e1SPrashanth Swaminathan	.byte	0x10	; FDE Encoding (pcrel)
483*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	; DW_CFA_def_cfa
484*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	; uleb128 0x1
485*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	; uleb128 0x0
486*1fd5a2e1SPrashanth Swaminathan	.align	LOG2_GPR_BYTES
487*1fd5a2e1SPrashanth SwaminathanLECIE1:
488*1fd5a2e1SPrashanth Swaminathan	.globl _ffi_closure_ASM.eh
489*1fd5a2e1SPrashanth Swaminathan_ffi_closure_ASM.eh:
490*1fd5a2e1SPrashanth SwaminathanLSFDE1:
491*1fd5a2e1SPrashanth Swaminathan	.set	L$set$1,LEFDE1-LASFDE1
492*1fd5a2e1SPrashanth Swaminathan	.long	L$set$1	; FDE Length
493*1fd5a2e1SPrashanth Swaminathan
494*1fd5a2e1SPrashanth SwaminathanLASFDE1:
495*1fd5a2e1SPrashanth Swaminathan	.long	LASFDE1-EH_frame1	; FDE CIE offset
496*1fd5a2e1SPrashanth Swaminathan	.g_long	Lstartcode-.	; FDE initial location
497*1fd5a2e1SPrashanth Swaminathan	.set	L$set$2,LFE1-Lstartcode
498*1fd5a2e1SPrashanth Swaminathan	.g_long	L$set$2	; FDE address range
499*1fd5a2e1SPrashanth Swaminathan	.byte   0x0     ; uleb128 0x0; Augmentation size
500*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	; DW_CFA_advance_loc4
501*1fd5a2e1SPrashanth Swaminathan	.set	L$set$3,LCFI1-LCFI0
502*1fd5a2e1SPrashanth Swaminathan	.long	L$set$3
503*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	; DW_CFA_def_cfa_offset
504*1fd5a2e1SPrashanth Swaminathan	.byte	EH_FRAME_OFFSETA,EH_FRAME_OFFSETB	; uleb128 176,1/190,3
505*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	; DW_CFA_advance_loc4
506*1fd5a2e1SPrashanth Swaminathan	.set	L$set$4,LCFI0-Lstartcode
507*1fd5a2e1SPrashanth Swaminathan	.long	L$set$4
508*1fd5a2e1SPrashanth Swaminathan	.byte   0x11    ; DW_CFA_offset_extended_sf
509*1fd5a2e1SPrashanth Swaminathan	.byte	0x41	; uleb128 0x41
510*1fd5a2e1SPrashanth Swaminathan	.byte   0x7e    ; sleb128 -2
511*1fd5a2e1SPrashanth Swaminathan	.align	LOG2_GPR_BYTES
512*1fd5a2e1SPrashanth SwaminathanLEFDE1:
513*1fd5a2e1SPrashanth Swaminathan	.align 	1
514*1fd5a2e1SPrashanth Swaminathan
515*1fd5a2e1SPrashanth Swaminathan#ifdef WANT_STUB
516*1fd5a2e1SPrashanth Swaminathan	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
517*1fd5a2e1SPrashanth Swaminathan	.align 5
518*1fd5a2e1SPrashanth SwaminathanL_ffi_closure_helper_DARWIN$stub:
519*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _ffi_closure_helper_DARWIN
520*1fd5a2e1SPrashanth Swaminathan	mflr r0
521*1fd5a2e1SPrashanth Swaminathan	bcl 20,31,"L1$spb"
522*1fd5a2e1SPrashanth Swaminathan"L1$spb":
523*1fd5a2e1SPrashanth Swaminathan	mflr r11
524*1fd5a2e1SPrashanth Swaminathan	addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")
525*1fd5a2e1SPrashanth Swaminathan	mtlr r0
526*1fd5a2e1SPrashanth Swaminathan	lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11)
527*1fd5a2e1SPrashanth Swaminathan	mtctr r12
528*1fd5a2e1SPrashanth Swaminathan	bctr
529*1fd5a2e1SPrashanth Swaminathan	.lazy_symbol_pointer
530*1fd5a2e1SPrashanth SwaminathanL_ffi_closure_helper_DARWIN$lazy_ptr:
531*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _ffi_closure_helper_DARWIN
532*1fd5a2e1SPrashanth Swaminathan	.g_long	dyld_stub_binding_helper
533*1fd5a2e1SPrashanth Swaminathan
534*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__)
535*1fd5a2e1SPrashanth Swaminathan	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
536*1fd5a2e1SPrashanth Swaminathan	.align 5
537*1fd5a2e1SPrashanth SwaminathanL_darwin64_struct_ret_by_value_p$stub:
538*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _darwin64_struct_ret_by_value_p
539*1fd5a2e1SPrashanth Swaminathan	mflr r0
540*1fd5a2e1SPrashanth Swaminathan	bcl 20,31,"L2$spb"
541*1fd5a2e1SPrashanth Swaminathan"L2$spb":
542*1fd5a2e1SPrashanth Swaminathan	mflr r11
543*1fd5a2e1SPrashanth Swaminathan	addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")
544*1fd5a2e1SPrashanth Swaminathan	mtlr r0
545*1fd5a2e1SPrashanth Swaminathan	lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11)
546*1fd5a2e1SPrashanth Swaminathan	mtctr r12
547*1fd5a2e1SPrashanth Swaminathan	bctr
548*1fd5a2e1SPrashanth Swaminathan	.lazy_symbol_pointer
549*1fd5a2e1SPrashanth SwaminathanL_darwin64_struct_ret_by_value_p$lazy_ptr:
550*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _darwin64_struct_ret_by_value_p
551*1fd5a2e1SPrashanth Swaminathan	.g_long	dyld_stub_binding_helper
552*1fd5a2e1SPrashanth Swaminathan
553*1fd5a2e1SPrashanth Swaminathan	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
554*1fd5a2e1SPrashanth Swaminathan	.align 5
555*1fd5a2e1SPrashanth SwaminathanL_darwin64_pass_struct_floats$stub:
556*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _darwin64_pass_struct_floats
557*1fd5a2e1SPrashanth Swaminathan	mflr r0
558*1fd5a2e1SPrashanth Swaminathan	bcl 20,31,"L3$spb"
559*1fd5a2e1SPrashanth Swaminathan"L3$spb":
560*1fd5a2e1SPrashanth Swaminathan	mflr r11
561*1fd5a2e1SPrashanth Swaminathan	addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")
562*1fd5a2e1SPrashanth Swaminathan	mtlr r0
563*1fd5a2e1SPrashanth Swaminathan	lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11)
564*1fd5a2e1SPrashanth Swaminathan	mtctr r12
565*1fd5a2e1SPrashanth Swaminathan	bctr
566*1fd5a2e1SPrashanth Swaminathan	.lazy_symbol_pointer
567*1fd5a2e1SPrashanth SwaminathanL_darwin64_pass_struct_floats$lazy_ptr:
568*1fd5a2e1SPrashanth Swaminathan	.indirect_symbol _darwin64_pass_struct_floats
569*1fd5a2e1SPrashanth Swaminathan	.g_long	dyld_stub_binding_helper
570*1fd5a2e1SPrashanth Swaminathan#  endif
571*1fd5a2e1SPrashanth Swaminathan#endif
572