xref: /aosp_15_r20/external/libffi/src/sh/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   SuperH Foreign Function Interface
5*1fd5a2e1SPrashanth Swaminathan
6*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
7*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
8*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
9*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
10*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
11*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
12*1fd5a2e1SPrashanth Swaminathan   the following conditions:
13*1fd5a2e1SPrashanth Swaminathan
14*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
15*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
16*1fd5a2e1SPrashanth Swaminathan
17*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18*1fd5a2e1SPrashanth Swaminathan   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20*1fd5a2e1SPrashanth Swaminathan   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21*1fd5a2e1SPrashanth Swaminathan   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22*1fd5a2e1SPrashanth Swaminathan   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*1fd5a2e1SPrashanth Swaminathan   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24*1fd5a2e1SPrashanth Swaminathan   DEALINGS IN THE SOFTWARE.
25*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
26*1fd5a2e1SPrashanth Swaminathan
27*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
28*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
29*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
30*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_MACHINE_ASM_H
31*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h>
32*1fd5a2e1SPrashanth Swaminathan#else
33*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure. */
34*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x
35*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
36*1fd5a2e1SPrashanth Swaminathan#endif
37*1fd5a2e1SPrashanth Swaminathan
38*1fd5a2e1SPrashanth Swaminathan#if defined(__HITACHI__)
39*1fd5a2e1SPrashanth Swaminathan#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
40*1fd5a2e1SPrashanth Swaminathan#else
41*1fd5a2e1SPrashanth Swaminathan#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
42*1fd5a2e1SPrashanth Swaminathan#endif
43*1fd5a2e1SPrashanth Swaminathan
44*1fd5a2e1SPrashanth Swaminathan.text
45*1fd5a2e1SPrashanth Swaminathan
46*1fd5a2e1SPrashanth Swaminathan	# r4:	ffi_prep_args
47*1fd5a2e1SPrashanth Swaminathan	# r5:	&ecif
48*1fd5a2e1SPrashanth Swaminathan	# r6:	bytes
49*1fd5a2e1SPrashanth Swaminathan	# r7:	flags
50*1fd5a2e1SPrashanth Swaminathan	# sp+0: rvalue
51*1fd5a2e1SPrashanth Swaminathan	# sp+4: fn
52*1fd5a2e1SPrashanth Swaminathan
53*1fd5a2e1SPrashanth Swaminathan	# This assumes we are using gas.
54*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV)
55*1fd5a2e1SPrashanth Swaminathan	# Save registers
56*1fd5a2e1SPrashanth Swaminathan.LFB1:
57*1fd5a2e1SPrashanth Swaminathan	mov.l	r8,@-r15
58*1fd5a2e1SPrashanth Swaminathan.LCFI0:
59*1fd5a2e1SPrashanth Swaminathan	mov.l	r9,@-r15
60*1fd5a2e1SPrashanth Swaminathan.LCFI1:
61*1fd5a2e1SPrashanth Swaminathan	mov.l	r10,@-r15
62*1fd5a2e1SPrashanth Swaminathan.LCFI2:
63*1fd5a2e1SPrashanth Swaminathan	mov.l	r12,@-r15
64*1fd5a2e1SPrashanth Swaminathan.LCFI3:
65*1fd5a2e1SPrashanth Swaminathan	mov.l	r14,@-r15
66*1fd5a2e1SPrashanth Swaminathan.LCFI4:
67*1fd5a2e1SPrashanth Swaminathan	sts.l	pr,@-r15
68*1fd5a2e1SPrashanth Swaminathan.LCFI5:
69*1fd5a2e1SPrashanth Swaminathan	mov	r15,r14
70*1fd5a2e1SPrashanth Swaminathan.LCFI6:
71*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
72*1fd5a2e1SPrashanth Swaminathan	mov	r6,r8
73*1fd5a2e1SPrashanth Swaminathan	mov	r7,r9
74*1fd5a2e1SPrashanth Swaminathan
75*1fd5a2e1SPrashanth Swaminathan	sub	r6,r15
76*1fd5a2e1SPrashanth Swaminathan	add	#-16,r15
77*1fd5a2e1SPrashanth Swaminathan	mov	#~7,r0
78*1fd5a2e1SPrashanth Swaminathan	and	r0,r15
79*1fd5a2e1SPrashanth Swaminathan
80*1fd5a2e1SPrashanth Swaminathan	mov	r4,r0
81*1fd5a2e1SPrashanth Swaminathan	jsr	@r0
82*1fd5a2e1SPrashanth Swaminathan	 mov	r15,r4
83*1fd5a2e1SPrashanth Swaminathan
84*1fd5a2e1SPrashanth Swaminathan	mov	r9,r1
85*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
86*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
87*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_STRUCT,r2
90*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
91*1fd5a2e1SPrashanth Swaminathan	bf	1f
92*1fd5a2e1SPrashanth Swaminathan#if STRUCT_VALUE_ADDRESS_WITH_ARG
93*1fd5a2e1SPrashanth Swaminathan 	mov.l	@r15+,r4
94*1fd5a2e1SPrashanth Swaminathan	bra	2f
95*1fd5a2e1SPrashanth Swaminathan	 mov	#5,r2
96*1fd5a2e1SPrashanth Swaminathan#else
97*1fd5a2e1SPrashanth Swaminathan 	mov.l	@r15+,r10
98*1fd5a2e1SPrashanth Swaminathan#endif
99*1fd5a2e1SPrashanth Swaminathan1:
100*1fd5a2e1SPrashanth Swaminathan	mov	#4,r2
101*1fd5a2e1SPrashanth Swaminathan2:
102*1fd5a2e1SPrashanth Swaminathan	mov	#4,r3
103*1fd5a2e1SPrashanth Swaminathan
104*1fd5a2e1SPrashanth SwaminathanL_pass:
105*1fd5a2e1SPrashanth Swaminathan	cmp/pl	r8
106*1fd5a2e1SPrashanth Swaminathan	bf	L_call_it
107*1fd5a2e1SPrashanth Swaminathan
108*1fd5a2e1SPrashanth Swaminathan	mov	r1,r0
109*1fd5a2e1SPrashanth Swaminathan	and	#3,r0
110*1fd5a2e1SPrashanth Swaminathan
111*1fd5a2e1SPrashanth SwaminathanL_pass_d:
112*1fd5a2e1SPrashanth Swaminathan	cmp/eq	#FFI_TYPE_DOUBLE,r0
113*1fd5a2e1SPrashanth Swaminathan	bf	L_pass_f
114*1fd5a2e1SPrashanth Swaminathan
115*1fd5a2e1SPrashanth Swaminathan	mov	r3,r0
116*1fd5a2e1SPrashanth Swaminathan	and	#1,r0
117*1fd5a2e1SPrashanth Swaminathan	tst	r0,r0
118*1fd5a2e1SPrashanth Swaminathan	bt	1f
119*1fd5a2e1SPrashanth Swaminathan	add	#1,r3
120*1fd5a2e1SPrashanth Swaminathan1:
121*1fd5a2e1SPrashanth Swaminathan	mov	#12,r0
122*1fd5a2e1SPrashanth Swaminathan	cmp/hs	r0,r3
123*1fd5a2e1SPrashanth Swaminathan	bt/s	3f
124*1fd5a2e1SPrashanth Swaminathan	 shlr2	r1
125*1fd5a2e1SPrashanth Swaminathan	bsr	L_pop_d
126*1fd5a2e1SPrashanth Swaminathan	 nop
127*1fd5a2e1SPrashanth Swaminathan3:
128*1fd5a2e1SPrashanth Swaminathan	add	#2,r3
129*1fd5a2e1SPrashanth Swaminathan	bra	L_pass
130*1fd5a2e1SPrashanth Swaminathan	 add	#-8,r8
131*1fd5a2e1SPrashanth Swaminathan
132*1fd5a2e1SPrashanth SwaminathanL_pop_d:
133*1fd5a2e1SPrashanth Swaminathan	mov	r3,r0
134*1fd5a2e1SPrashanth Swaminathan	add	r0,r0
135*1fd5a2e1SPrashanth Swaminathan	add	r3,r0
136*1fd5a2e1SPrashanth Swaminathan	add	#-12,r0
137*1fd5a2e1SPrashanth Swaminathan	braf	r0
138*1fd5a2e1SPrashanth Swaminathan	 nop
139*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
140*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr5
141*1fd5a2e1SPrashanth Swaminathan	rts
142*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr4
143*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr7
144*1fd5a2e1SPrashanth Swaminathan	rts
145*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr6
146*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr9
147*1fd5a2e1SPrashanth Swaminathan	rts
148*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr8
149*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr11
150*1fd5a2e1SPrashanth Swaminathan	rts
151*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr10
152*1fd5a2e1SPrashanth Swaminathan#else
153*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr4
154*1fd5a2e1SPrashanth Swaminathan	rts
155*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr5
156*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr6
157*1fd5a2e1SPrashanth Swaminathan	rts
158*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr7
159*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr8
160*1fd5a2e1SPrashanth Swaminathan	rts
161*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr9
162*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r15+,fr10
163*1fd5a2e1SPrashanth Swaminathan	rts
164*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr11
165*1fd5a2e1SPrashanth Swaminathan#endif
166*1fd5a2e1SPrashanth Swaminathan
167*1fd5a2e1SPrashanth SwaminathanL_pass_f:
168*1fd5a2e1SPrashanth Swaminathan	cmp/eq	#FFI_TYPE_FLOAT,r0
169*1fd5a2e1SPrashanth Swaminathan	bf	L_pass_i
170*1fd5a2e1SPrashanth Swaminathan
171*1fd5a2e1SPrashanth Swaminathan	mov	#12,r0
172*1fd5a2e1SPrashanth Swaminathan	cmp/hs	r0,r3
173*1fd5a2e1SPrashanth Swaminathan	bt/s	2f
174*1fd5a2e1SPrashanth Swaminathan	 shlr2	r1
175*1fd5a2e1SPrashanth Swaminathan	bsr	L_pop_f
176*1fd5a2e1SPrashanth Swaminathan	 nop
177*1fd5a2e1SPrashanth Swaminathan2:
178*1fd5a2e1SPrashanth Swaminathan	add	#1,r3
179*1fd5a2e1SPrashanth Swaminathan	bra	L_pass
180*1fd5a2e1SPrashanth Swaminathan	 add	#-4,r8
181*1fd5a2e1SPrashanth Swaminathan
182*1fd5a2e1SPrashanth SwaminathanL_pop_f:
183*1fd5a2e1SPrashanth Swaminathan	mov	r3,r0
184*1fd5a2e1SPrashanth Swaminathan	shll2	r0
185*1fd5a2e1SPrashanth Swaminathan	add	#-16,r0
186*1fd5a2e1SPrashanth Swaminathan	braf	r0
187*1fd5a2e1SPrashanth Swaminathan	 nop
188*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
189*1fd5a2e1SPrashanth Swaminathan	rts
190*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr5
191*1fd5a2e1SPrashanth Swaminathan	rts
192*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr4
193*1fd5a2e1SPrashanth Swaminathan	rts
194*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr7
195*1fd5a2e1SPrashanth Swaminathan	rts
196*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr6
197*1fd5a2e1SPrashanth Swaminathan	rts
198*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr9
199*1fd5a2e1SPrashanth Swaminathan	rts
200*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr8
201*1fd5a2e1SPrashanth Swaminathan	rts
202*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr11
203*1fd5a2e1SPrashanth Swaminathan	rts
204*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr10
205*1fd5a2e1SPrashanth Swaminathan#else
206*1fd5a2e1SPrashanth Swaminathan	rts
207*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr4
208*1fd5a2e1SPrashanth Swaminathan	rts
209*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr5
210*1fd5a2e1SPrashanth Swaminathan	rts
211*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr6
212*1fd5a2e1SPrashanth Swaminathan	rts
213*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr7
214*1fd5a2e1SPrashanth Swaminathan	rts
215*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr8
216*1fd5a2e1SPrashanth Swaminathan	rts
217*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr9
218*1fd5a2e1SPrashanth Swaminathan	rts
219*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr10
220*1fd5a2e1SPrashanth Swaminathan	rts
221*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r15+,fr11
222*1fd5a2e1SPrashanth Swaminathan#endif
223*1fd5a2e1SPrashanth Swaminathan
224*1fd5a2e1SPrashanth SwaminathanL_pass_i:
225*1fd5a2e1SPrashanth Swaminathan	cmp/eq	#FFI_TYPE_INT,r0
226*1fd5a2e1SPrashanth Swaminathan	bf	L_call_it
227*1fd5a2e1SPrashanth Swaminathan
228*1fd5a2e1SPrashanth Swaminathan	mov	#8,r0
229*1fd5a2e1SPrashanth Swaminathan	cmp/hs	r0,r2
230*1fd5a2e1SPrashanth Swaminathan	bt/s	2f
231*1fd5a2e1SPrashanth Swaminathan	 shlr2	r1
232*1fd5a2e1SPrashanth Swaminathan	bsr	L_pop_i
233*1fd5a2e1SPrashanth Swaminathan	 nop
234*1fd5a2e1SPrashanth Swaminathan2:
235*1fd5a2e1SPrashanth Swaminathan	add	#1,r2
236*1fd5a2e1SPrashanth Swaminathan	bra	L_pass
237*1fd5a2e1SPrashanth Swaminathan	 add	#-4,r8
238*1fd5a2e1SPrashanth Swaminathan
239*1fd5a2e1SPrashanth SwaminathanL_pop_i:
240*1fd5a2e1SPrashanth Swaminathan	mov	r2,r0
241*1fd5a2e1SPrashanth Swaminathan	shll2	r0
242*1fd5a2e1SPrashanth Swaminathan	add	#-16,r0
243*1fd5a2e1SPrashanth Swaminathan	braf	r0
244*1fd5a2e1SPrashanth Swaminathan	 nop
245*1fd5a2e1SPrashanth Swaminathan	rts
246*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r4
247*1fd5a2e1SPrashanth Swaminathan	rts
248*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r5
249*1fd5a2e1SPrashanth Swaminathan	rts
250*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r6
251*1fd5a2e1SPrashanth Swaminathan	rts
252*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r7
253*1fd5a2e1SPrashanth Swaminathan
254*1fd5a2e1SPrashanth SwaminathanL_call_it:
255*1fd5a2e1SPrashanth Swaminathan	# call function
256*1fd5a2e1SPrashanth Swaminathan#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
257*1fd5a2e1SPrashanth Swaminathan	mov	r10, r2
258*1fd5a2e1SPrashanth Swaminathan#endif
259*1fd5a2e1SPrashanth Swaminathan	mov.l  @(28,r14),r1
260*1fd5a2e1SPrashanth Swaminathan	jsr    @r1
261*1fd5a2e1SPrashanth Swaminathan	 nop
262*1fd5a2e1SPrashanth Swaminathan
263*1fd5a2e1SPrashanth SwaminathanL_ret_d:
264*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_DOUBLE,r2
265*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
266*1fd5a2e1SPrashanth Swaminathan	bf	L_ret_ll
267*1fd5a2e1SPrashanth Swaminathan
268*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r1
269*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
270*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr1,@r1
271*1fd5a2e1SPrashanth Swaminathan	add	#4,r1
272*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
273*1fd5a2e1SPrashanth Swaminathan	 fmov.s	fr0,@r1
274*1fd5a2e1SPrashanth Swaminathan#else
275*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr0,@r1
276*1fd5a2e1SPrashanth Swaminathan	add	#4,r1
277*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
278*1fd5a2e1SPrashanth Swaminathan	 fmov.s	fr1,@r1
279*1fd5a2e1SPrashanth Swaminathan#endif
280*1fd5a2e1SPrashanth Swaminathan
281*1fd5a2e1SPrashanth SwaminathanL_ret_ll:
282*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_SINT64,r2
283*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
284*1fd5a2e1SPrashanth Swaminathan	bt/s	1f
285*1fd5a2e1SPrashanth Swaminathan	 mov	#FFI_TYPE_UINT64,r2
286*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
287*1fd5a2e1SPrashanth Swaminathan	bf	L_ret_f
288*1fd5a2e1SPrashanth Swaminathan
289*1fd5a2e1SPrashanth Swaminathan1:
290*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r2
291*1fd5a2e1SPrashanth Swaminathan	mov.l	r0,@r2
292*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
293*1fd5a2e1SPrashanth Swaminathan	 mov.l	r1,@(4,r2)
294*1fd5a2e1SPrashanth Swaminathan
295*1fd5a2e1SPrashanth SwaminathanL_ret_f:
296*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_FLOAT,r2
297*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
298*1fd5a2e1SPrashanth Swaminathan	bf	L_ret_i
299*1fd5a2e1SPrashanth Swaminathan
300*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r1
301*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
302*1fd5a2e1SPrashanth Swaminathan	 fmov.s	fr0,@r1
303*1fd5a2e1SPrashanth Swaminathan
304*1fd5a2e1SPrashanth SwaminathanL_ret_i:
305*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_INT,r2
306*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
307*1fd5a2e1SPrashanth Swaminathan	bf	L_epilogue
308*1fd5a2e1SPrashanth Swaminathan
309*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r1
310*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
311*1fd5a2e1SPrashanth Swaminathan	 mov.l	r0,@r1
312*1fd5a2e1SPrashanth Swaminathan
313*1fd5a2e1SPrashanth SwaminathanL_epilogue:
314*1fd5a2e1SPrashanth Swaminathan	# Remove the space we pushed for the args
315*1fd5a2e1SPrashanth Swaminathan	mov   r14,r15
316*1fd5a2e1SPrashanth Swaminathan
317*1fd5a2e1SPrashanth Swaminathan	lds.l  @r15+,pr
318*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r14
319*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r12
320*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r10
321*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r9
322*1fd5a2e1SPrashanth Swaminathan	rts
323*1fd5a2e1SPrashanth Swaminathan	 mov.l  @r15+,r8
324*1fd5a2e1SPrashanth Swaminathan#else
325*1fd5a2e1SPrashanth Swaminathan	mov	r6,r8
326*1fd5a2e1SPrashanth Swaminathan	mov	r7,r9
327*1fd5a2e1SPrashanth Swaminathan
328*1fd5a2e1SPrashanth Swaminathan	sub	r6,r15
329*1fd5a2e1SPrashanth Swaminathan	add	#-16,r15
330*1fd5a2e1SPrashanth Swaminathan	mov	#~7,r0
331*1fd5a2e1SPrashanth Swaminathan	and	r0,r15
332*1fd5a2e1SPrashanth Swaminathan
333*1fd5a2e1SPrashanth Swaminathan	mov	r4,r0
334*1fd5a2e1SPrashanth Swaminathan	jsr	@r0
335*1fd5a2e1SPrashanth Swaminathan	 mov	r15,r4
336*1fd5a2e1SPrashanth Swaminathan
337*1fd5a2e1SPrashanth Swaminathan	mov	r9,r3
338*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
339*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
340*1fd5a2e1SPrashanth Swaminathan	shlr8	r9
341*1fd5a2e1SPrashanth Swaminathan
342*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_STRUCT,r2
343*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
344*1fd5a2e1SPrashanth Swaminathan	bf	1f
345*1fd5a2e1SPrashanth Swaminathan#if STRUCT_VALUE_ADDRESS_WITH_ARG
346*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r4
347*1fd5a2e1SPrashanth Swaminathan	bra	2f
348*1fd5a2e1SPrashanth Swaminathan	 mov	#5,r2
349*1fd5a2e1SPrashanth Swaminathan#else
350*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r10
351*1fd5a2e1SPrashanth Swaminathan#endif
352*1fd5a2e1SPrashanth Swaminathan1:
353*1fd5a2e1SPrashanth Swaminathan	mov	#4,r2
354*1fd5a2e1SPrashanth Swaminathan2:
355*1fd5a2e1SPrashanth Swaminathan
356*1fd5a2e1SPrashanth SwaminathanL_pass:
357*1fd5a2e1SPrashanth Swaminathan	cmp/pl	r8
358*1fd5a2e1SPrashanth Swaminathan	bf	L_call_it
359*1fd5a2e1SPrashanth Swaminathan
360*1fd5a2e1SPrashanth Swaminathan	mov	r3,r0
361*1fd5a2e1SPrashanth Swaminathan	and	#3,r0
362*1fd5a2e1SPrashanth Swaminathan
363*1fd5a2e1SPrashanth SwaminathanL_pass_d:
364*1fd5a2e1SPrashanth Swaminathan	cmp/eq	#FFI_TYPE_DOUBLE,r0
365*1fd5a2e1SPrashanth Swaminathan	bf	L_pass_i
366*1fd5a2e1SPrashanth Swaminathan
367*1fd5a2e1SPrashanth Swaminathan	mov	r15,r0
368*1fd5a2e1SPrashanth Swaminathan	and	#7,r0
369*1fd5a2e1SPrashanth Swaminathan	tst	r0,r0
370*1fd5a2e1SPrashanth Swaminathan	bt	1f
371*1fd5a2e1SPrashanth Swaminathan	add	#4,r15
372*1fd5a2e1SPrashanth Swaminathan1:
373*1fd5a2e1SPrashanth Swaminathan	mov	#8,r0
374*1fd5a2e1SPrashanth Swaminathan	cmp/hs	r0,r2
375*1fd5a2e1SPrashanth Swaminathan	bt/s	2f
376*1fd5a2e1SPrashanth Swaminathan	 shlr2	r3
377*1fd5a2e1SPrashanth Swaminathan	bsr	L_pop_d
378*1fd5a2e1SPrashanth Swaminathan	 nop
379*1fd5a2e1SPrashanth Swaminathan2:
380*1fd5a2e1SPrashanth Swaminathan	add	#2,r2
381*1fd5a2e1SPrashanth Swaminathan	bra	L_pass
382*1fd5a2e1SPrashanth Swaminathan	 add	#-8,r8
383*1fd5a2e1SPrashanth Swaminathan
384*1fd5a2e1SPrashanth SwaminathanL_pop_d:
385*1fd5a2e1SPrashanth Swaminathan	mov	r2,r0
386*1fd5a2e1SPrashanth Swaminathan	add	r0,r0
387*1fd5a2e1SPrashanth Swaminathan	add	r2,r0
388*1fd5a2e1SPrashanth Swaminathan	add	#-12,r0
389*1fd5a2e1SPrashanth Swaminathan	add	r0,r0
390*1fd5a2e1SPrashanth Swaminathan	braf	r0
391*1fd5a2e1SPrashanth Swaminathan	 nop
392*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r4
393*1fd5a2e1SPrashanth Swaminathan	rts
394*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r5
395*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r5
396*1fd5a2e1SPrashanth Swaminathan	rts
397*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r6
398*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r6
399*1fd5a2e1SPrashanth Swaminathan	rts
400*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r7
401*1fd5a2e1SPrashanth Swaminathan	rts
402*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r7
403*1fd5a2e1SPrashanth Swaminathan
404*1fd5a2e1SPrashanth SwaminathanL_pass_i:
405*1fd5a2e1SPrashanth Swaminathan	cmp/eq	#FFI_TYPE_INT,r0
406*1fd5a2e1SPrashanth Swaminathan	bf	L_call_it
407*1fd5a2e1SPrashanth Swaminathan
408*1fd5a2e1SPrashanth Swaminathan	mov	#8,r0
409*1fd5a2e1SPrashanth Swaminathan	cmp/hs	r0,r2
410*1fd5a2e1SPrashanth Swaminathan	bt/s	2f
411*1fd5a2e1SPrashanth Swaminathan	 shlr2	r3
412*1fd5a2e1SPrashanth Swaminathan	bsr	L_pop_i
413*1fd5a2e1SPrashanth Swaminathan	 nop
414*1fd5a2e1SPrashanth Swaminathan2:
415*1fd5a2e1SPrashanth Swaminathan	add	#1,r2
416*1fd5a2e1SPrashanth Swaminathan	bra	L_pass
417*1fd5a2e1SPrashanth Swaminathan	 add	#-4,r8
418*1fd5a2e1SPrashanth Swaminathan
419*1fd5a2e1SPrashanth SwaminathanL_pop_i:
420*1fd5a2e1SPrashanth Swaminathan	mov	r2,r0
421*1fd5a2e1SPrashanth Swaminathan	shll2	r0
422*1fd5a2e1SPrashanth Swaminathan	add	#-16,r0
423*1fd5a2e1SPrashanth Swaminathan	braf	r0
424*1fd5a2e1SPrashanth Swaminathan	 nop
425*1fd5a2e1SPrashanth Swaminathan	rts
426*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r4
427*1fd5a2e1SPrashanth Swaminathan	rts
428*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r5
429*1fd5a2e1SPrashanth Swaminathan	rts
430*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r6
431*1fd5a2e1SPrashanth Swaminathan	rts
432*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r15+,r7
433*1fd5a2e1SPrashanth Swaminathan
434*1fd5a2e1SPrashanth SwaminathanL_call_it:
435*1fd5a2e1SPrashanth Swaminathan	# call function
436*1fd5a2e1SPrashanth Swaminathan#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
437*1fd5a2e1SPrashanth Swaminathan	mov	r10, r2
438*1fd5a2e1SPrashanth Swaminathan#endif
439*1fd5a2e1SPrashanth Swaminathan	mov.l  @(28,r14),r1
440*1fd5a2e1SPrashanth Swaminathan	jsr    @r1
441*1fd5a2e1SPrashanth Swaminathan	 nop
442*1fd5a2e1SPrashanth Swaminathan
443*1fd5a2e1SPrashanth SwaminathanL_ret_d:
444*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_DOUBLE,r2
445*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
446*1fd5a2e1SPrashanth Swaminathan	bf	L_ret_ll
447*1fd5a2e1SPrashanth Swaminathan
448*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r2
449*1fd5a2e1SPrashanth Swaminathan	mov.l	r0,@r2
450*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
451*1fd5a2e1SPrashanth Swaminathan	 mov.l	r1,@(4,r2)
452*1fd5a2e1SPrashanth Swaminathan
453*1fd5a2e1SPrashanth SwaminathanL_ret_ll:
454*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_SINT64,r2
455*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
456*1fd5a2e1SPrashanth Swaminathan	bt/s	1f
457*1fd5a2e1SPrashanth Swaminathan	 mov	#FFI_TYPE_UINT64,r2
458*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
459*1fd5a2e1SPrashanth Swaminathan	bf	L_ret_i
460*1fd5a2e1SPrashanth Swaminathan
461*1fd5a2e1SPrashanth Swaminathan1:
462*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r2
463*1fd5a2e1SPrashanth Swaminathan	mov.l	r0,@r2
464*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
465*1fd5a2e1SPrashanth Swaminathan	 mov.l	r1,@(4,r2)
466*1fd5a2e1SPrashanth Swaminathan
467*1fd5a2e1SPrashanth SwaminathanL_ret_i:
468*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_FLOAT,r2
469*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
470*1fd5a2e1SPrashanth Swaminathan	bt	1f
471*1fd5a2e1SPrashanth Swaminathan	mov	#FFI_TYPE_INT,r2
472*1fd5a2e1SPrashanth Swaminathan	cmp/eq	r2,r9
473*1fd5a2e1SPrashanth Swaminathan	bf	L_epilogue
474*1fd5a2e1SPrashanth Swaminathan1:
475*1fd5a2e1SPrashanth Swaminathan	mov.l	@(24,r14),r1
476*1fd5a2e1SPrashanth Swaminathan	bra	L_epilogue
477*1fd5a2e1SPrashanth Swaminathan	 mov.l	r0,@r1
478*1fd5a2e1SPrashanth Swaminathan
479*1fd5a2e1SPrashanth SwaminathanL_epilogue:
480*1fd5a2e1SPrashanth Swaminathan	# Remove the space we pushed for the args
481*1fd5a2e1SPrashanth Swaminathan	mov   r14,r15
482*1fd5a2e1SPrashanth Swaminathan
483*1fd5a2e1SPrashanth Swaminathan	lds.l  @r15+,pr
484*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r14
485*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r12
486*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r10
487*1fd5a2e1SPrashanth Swaminathan	mov.l  @r15+,r9
488*1fd5a2e1SPrashanth Swaminathan	rts
489*1fd5a2e1SPrashanth Swaminathan	 mov.l  @r15+,r8
490*1fd5a2e1SPrashanth Swaminathan#endif
491*1fd5a2e1SPrashanth Swaminathan.LFE1:
492*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end:
493*1fd5a2e1SPrashanth Swaminathan        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
494*1fd5a2e1SPrashanth Swaminathan
495*1fd5a2e1SPrashanth Swaminathan.globl	ffi_closure_helper_SYSV
496*1fd5a2e1SPrashanth Swaminathan
497*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV)
498*1fd5a2e1SPrashanth Swaminathan.LFB2:
499*1fd5a2e1SPrashanth Swaminathan	mov.l	r7,@-r15
500*1fd5a2e1SPrashanth Swaminathan.LCFI7:
501*1fd5a2e1SPrashanth Swaminathan	mov.l	r6,@-r15
502*1fd5a2e1SPrashanth Swaminathan.LCFI8:
503*1fd5a2e1SPrashanth Swaminathan	mov.l	r5,@-r15
504*1fd5a2e1SPrashanth Swaminathan.LCFI9:
505*1fd5a2e1SPrashanth Swaminathan	mov.l	r4,@-r15
506*1fd5a2e1SPrashanth Swaminathan.LCFIA:
507*1fd5a2e1SPrashanth Swaminathan	mov.l	r14,@-r15
508*1fd5a2e1SPrashanth Swaminathan.LCFIB:
509*1fd5a2e1SPrashanth Swaminathan	sts.l	pr,@-r15
510*1fd5a2e1SPrashanth Swaminathan
511*1fd5a2e1SPrashanth Swaminathan	/* Stack layout:
512*1fd5a2e1SPrashanth Swaminathan	   xx bytes (on stack parameters)
513*1fd5a2e1SPrashanth Swaminathan	   16 bytes (register parameters)
514*1fd5a2e1SPrashanth Swaminathan	    4 bytes (saved frame pointer)
515*1fd5a2e1SPrashanth Swaminathan	    4 bytes (saved return address)
516*1fd5a2e1SPrashanth Swaminathan	   32 bytes (floating register parameters, SH-4 only)
517*1fd5a2e1SPrashanth Swaminathan	    8 bytes (result)
518*1fd5a2e1SPrashanth Swaminathan	    4 bytes (pad)
519*1fd5a2e1SPrashanth Swaminathan	    4 bytes (5th arg)
520*1fd5a2e1SPrashanth Swaminathan	   <- new stack pointer
521*1fd5a2e1SPrashanth Swaminathan	*/
522*1fd5a2e1SPrashanth Swaminathan.LCFIC:
523*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
524*1fd5a2e1SPrashanth Swaminathan	add	#-48,r15
525*1fd5a2e1SPrashanth Swaminathan#else
526*1fd5a2e1SPrashanth Swaminathan	add	#-16,r15
527*1fd5a2e1SPrashanth Swaminathan#endif
528*1fd5a2e1SPrashanth Swaminathan.LCFID:
529*1fd5a2e1SPrashanth Swaminathan	mov	r15,r14
530*1fd5a2e1SPrashanth Swaminathan.LCFIE:
531*1fd5a2e1SPrashanth Swaminathan
532*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
533*1fd5a2e1SPrashanth Swaminathan	mov	r14,r1
534*1fd5a2e1SPrashanth Swaminathan	add	#48,r1
535*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
536*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr10,@-r1
537*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr11,@-r1
538*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr8,@-r1
539*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr9,@-r1
540*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr6,@-r1
541*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr7,@-r1
542*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr4,@-r1
543*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr5,@-r1
544*1fd5a2e1SPrashanth Swaminathan#else
545*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr11,@-r1
546*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr10,@-r1
547*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr9,@-r1
548*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr8,@-r1
549*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr7,@-r1
550*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr6,@-r1
551*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr5,@-r1
552*1fd5a2e1SPrashanth Swaminathan	fmov.s	fr4,@-r1
553*1fd5a2e1SPrashanth Swaminathan#endif
554*1fd5a2e1SPrashanth Swaminathan	mov	r1,r7
555*1fd5a2e1SPrashanth Swaminathan	mov	r14,r6
556*1fd5a2e1SPrashanth Swaminathan	add	#56,r6
557*1fd5a2e1SPrashanth Swaminathan#else
558*1fd5a2e1SPrashanth Swaminathan	mov	r14,r6
559*1fd5a2e1SPrashanth Swaminathan	add	#24,r6
560*1fd5a2e1SPrashanth Swaminathan#endif
561*1fd5a2e1SPrashanth Swaminathan
562*1fd5a2e1SPrashanth Swaminathan	bt/s	10f
563*1fd5a2e1SPrashanth Swaminathan	 mov	r2, r5
564*1fd5a2e1SPrashanth Swaminathan	mov	r14,r1
565*1fd5a2e1SPrashanth Swaminathan	add	#8,r1
566*1fd5a2e1SPrashanth Swaminathan	mov	r1,r5
567*1fd5a2e1SPrashanth Swaminathan10:
568*1fd5a2e1SPrashanth Swaminathan
569*1fd5a2e1SPrashanth Swaminathan	mov	r14,r1
570*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
571*1fd5a2e1SPrashanth Swaminathan	add	#72,r1
572*1fd5a2e1SPrashanth Swaminathan#else
573*1fd5a2e1SPrashanth Swaminathan	add	#40,r1
574*1fd5a2e1SPrashanth Swaminathan#endif
575*1fd5a2e1SPrashanth Swaminathan	mov.l	r1,@r14
576*1fd5a2e1SPrashanth Swaminathan
577*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
578*1fd5a2e1SPrashanth Swaminathan	mov.l	L_got,r1
579*1fd5a2e1SPrashanth Swaminathan	mova	L_got,r0
580*1fd5a2e1SPrashanth Swaminathan	add	r0,r1
581*1fd5a2e1SPrashanth Swaminathan	mov.l	L_helper,r0
582*1fd5a2e1SPrashanth Swaminathan	add	r1,r0
583*1fd5a2e1SPrashanth Swaminathan#else
584*1fd5a2e1SPrashanth Swaminathan	mov.l	L_helper,r0
585*1fd5a2e1SPrashanth Swaminathan#endif
586*1fd5a2e1SPrashanth Swaminathan	jsr	@r0
587*1fd5a2e1SPrashanth Swaminathan	 mov	r3,r4
588*1fd5a2e1SPrashanth Swaminathan
589*1fd5a2e1SPrashanth Swaminathan	shll	r0
590*1fd5a2e1SPrashanth Swaminathan	mov	r0,r1
591*1fd5a2e1SPrashanth Swaminathan	mova	L_table,r0
592*1fd5a2e1SPrashanth Swaminathan	add	r1,r0
593*1fd5a2e1SPrashanth Swaminathan	mov.w	@r0,r0
594*1fd5a2e1SPrashanth Swaminathan	mov	r14,r2
595*1fd5a2e1SPrashanth Swaminathan	braf	r0
596*1fd5a2e1SPrashanth Swaminathan	 add	#8,r2
597*1fd5a2e1SPrashanth Swaminathan0:
598*1fd5a2e1SPrashanth Swaminathan	.align 2
599*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
600*1fd5a2e1SPrashanth SwaminathanL_got:
601*1fd5a2e1SPrashanth Swaminathan	.long	_GLOBAL_OFFSET_TABLE_
602*1fd5a2e1SPrashanth SwaminathanL_helper:
603*1fd5a2e1SPrashanth Swaminathan	.long	ffi_closure_helper_SYSV@GOTOFF
604*1fd5a2e1SPrashanth Swaminathan#else
605*1fd5a2e1SPrashanth SwaminathanL_helper:
606*1fd5a2e1SPrashanth Swaminathan	.long	ffi_closure_helper_SYSV
607*1fd5a2e1SPrashanth Swaminathan#endif
608*1fd5a2e1SPrashanth SwaminathanL_table:
609*1fd5a2e1SPrashanth Swaminathan	.short L_case_v - 0b	/* FFI_TYPE_VOID */
610*1fd5a2e1SPrashanth Swaminathan	.short L_case_i - 0b	/* FFI_TYPE_INT */
611*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
612*1fd5a2e1SPrashanth Swaminathan	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
613*1fd5a2e1SPrashanth Swaminathan	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
614*1fd5a2e1SPrashanth Swaminathan	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
615*1fd5a2e1SPrashanth Swaminathan#else
616*1fd5a2e1SPrashanth Swaminathan	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
617*1fd5a2e1SPrashanth Swaminathan	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
618*1fd5a2e1SPrashanth Swaminathan	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
619*1fd5a2e1SPrashanth Swaminathan#endif
620*1fd5a2e1SPrashanth Swaminathan	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
621*1fd5a2e1SPrashanth Swaminathan	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
622*1fd5a2e1SPrashanth Swaminathan	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
623*1fd5a2e1SPrashanth Swaminathan	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
624*1fd5a2e1SPrashanth Swaminathan	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
625*1fd5a2e1SPrashanth Swaminathan	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
626*1fd5a2e1SPrashanth Swaminathan	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
627*1fd5a2e1SPrashanth Swaminathan	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
628*1fd5a2e1SPrashanth Swaminathan	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
629*1fd5a2e1SPrashanth Swaminathan	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
630*1fd5a2e1SPrashanth Swaminathan
631*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
632*1fd5a2e1SPrashanth SwaminathanL_case_d:
633*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
634*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r2+,fr1
635*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
636*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r2,fr0
637*1fd5a2e1SPrashanth Swaminathan#else
638*1fd5a2e1SPrashanth Swaminathan	fmov.s	@r2+,fr0
639*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
640*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r2,fr1
641*1fd5a2e1SPrashanth Swaminathan#endif
642*1fd5a2e1SPrashanth Swaminathan
643*1fd5a2e1SPrashanth SwaminathanL_case_f:
644*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
645*1fd5a2e1SPrashanth Swaminathan	 fmov.s	@r2,fr0
646*1fd5a2e1SPrashanth Swaminathan#endif
647*1fd5a2e1SPrashanth Swaminathan
648*1fd5a2e1SPrashanth SwaminathanL_case_ll:
649*1fd5a2e1SPrashanth Swaminathan	mov.l	@r2+,r0
650*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
651*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r2,r1
652*1fd5a2e1SPrashanth Swaminathan
653*1fd5a2e1SPrashanth SwaminathanL_case_i:
654*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
655*1fd5a2e1SPrashanth Swaminathan	 mov.l	@r2,r0
656*1fd5a2e1SPrashanth Swaminathan
657*1fd5a2e1SPrashanth SwaminathanL_case_q:
658*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
659*1fd5a2e1SPrashanth Swaminathan#else
660*1fd5a2e1SPrashanth Swaminathan	add	#3,r2
661*1fd5a2e1SPrashanth Swaminathan#endif
662*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
663*1fd5a2e1SPrashanth Swaminathan	 mov.b	@r2,r0
664*1fd5a2e1SPrashanth Swaminathan
665*1fd5a2e1SPrashanth SwaminathanL_case_uq:
666*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
667*1fd5a2e1SPrashanth Swaminathan#else
668*1fd5a2e1SPrashanth Swaminathan	add	#3,r2
669*1fd5a2e1SPrashanth Swaminathan#endif
670*1fd5a2e1SPrashanth Swaminathan	mov.b	@r2,r0
671*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
672*1fd5a2e1SPrashanth Swaminathan	 extu.b r0,r0
673*1fd5a2e1SPrashanth Swaminathan
674*1fd5a2e1SPrashanth SwaminathanL_case_h:
675*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
676*1fd5a2e1SPrashanth Swaminathan#else
677*1fd5a2e1SPrashanth Swaminathan	add	#2,r2
678*1fd5a2e1SPrashanth Swaminathan#endif
679*1fd5a2e1SPrashanth Swaminathan	bra	L_case_v
680*1fd5a2e1SPrashanth Swaminathan	 mov.w	@r2,r0
681*1fd5a2e1SPrashanth Swaminathan
682*1fd5a2e1SPrashanth SwaminathanL_case_uh:
683*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
684*1fd5a2e1SPrashanth Swaminathan#else
685*1fd5a2e1SPrashanth Swaminathan	add	#2,r2
686*1fd5a2e1SPrashanth Swaminathan#endif
687*1fd5a2e1SPrashanth Swaminathan	mov.w	@r2,r0
688*1fd5a2e1SPrashanth Swaminathan	extu.w	r0,r0
689*1fd5a2e1SPrashanth Swaminathan	/* fall through */
690*1fd5a2e1SPrashanth Swaminathan
691*1fd5a2e1SPrashanth SwaminathanL_case_v:
692*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
693*1fd5a2e1SPrashanth Swaminathan	add	#48,r15
694*1fd5a2e1SPrashanth Swaminathan#else
695*1fd5a2e1SPrashanth Swaminathan	add	#16,r15
696*1fd5a2e1SPrashanth Swaminathan#endif
697*1fd5a2e1SPrashanth Swaminathan	lds.l	@r15+,pr
698*1fd5a2e1SPrashanth Swaminathan	mov.l	@r15+,r14
699*1fd5a2e1SPrashanth Swaminathan	rts
700*1fd5a2e1SPrashanth Swaminathan	 add	#16,r15
701*1fd5a2e1SPrashanth Swaminathan.LFE2:
702*1fd5a2e1SPrashanth Swaminathan.ffi_closure_SYSV_end:
703*1fd5a2e1SPrashanth Swaminathan        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
704*1fd5a2e1SPrashanth Swaminathan
705*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
706*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
707*1fd5a2e1SPrashanth Swaminathan#endif
708*1fd5a2e1SPrashanth Swaminathan
709*1fd5a2e1SPrashanth Swaminathan	.section	".eh_frame","aw",@progbits
710*1fd5a2e1SPrashanth Swaminathan__FRAME_BEGIN__:
711*1fd5a2e1SPrashanth Swaminathan	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
712*1fd5a2e1SPrashanth Swaminathan.LSCIE1:
713*1fd5a2e1SPrashanth Swaminathan	.4byte	0x0	/* CIE Identifier Tag */
714*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* CIE Version */
715*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
716*1fd5a2e1SPrashanth Swaminathan	.ascii "zR\0"	/* CIE Augmentation */
717*1fd5a2e1SPrashanth Swaminathan#else
718*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* CIE Augmentation */
719*1fd5a2e1SPrashanth Swaminathan#endif
720*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
721*1fd5a2e1SPrashanth Swaminathan	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
722*1fd5a2e1SPrashanth Swaminathan	.byte	0x11	/* CIE RA Column */
723*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
724*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x1	/* Augmentation size */
725*1fd5a2e1SPrashanth Swaminathan	.byte	0x10	/* FDE Encoding (pcrel) */
726*1fd5a2e1SPrashanth Swaminathan#endif
727*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	/* DW_CFA_def_cfa */
728*1fd5a2e1SPrashanth Swaminathan	.byte	0xf	/* uleb128 0xf */
729*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* uleb128 0x0 */
730*1fd5a2e1SPrashanth Swaminathan	.align	2
731*1fd5a2e1SPrashanth Swaminathan.LECIE1:
732*1fd5a2e1SPrashanth Swaminathan.LSFDE1:
733*1fd5a2e1SPrashanth Swaminathan	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
734*1fd5a2e1SPrashanth Swaminathan.LASFDE1:
735*1fd5a2e1SPrashanth Swaminathan	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
736*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
737*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB1-.	/* FDE initial location */
738*1fd5a2e1SPrashanth Swaminathan#else
739*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB1	/* FDE initial location */
740*1fd5a2e1SPrashanth Swaminathan#endif
741*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFE1-.LFB1	 /* FDE address range */
742*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
743*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x0	/* Augmentation size */
744*1fd5a2e1SPrashanth Swaminathan#endif
745*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
746*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI0-.LFB1
747*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
748*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* uleb128 0x4 */
749*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
750*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI1-.LCFI0
751*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
752*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* uleb128 0x4 */
753*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
754*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI2-.LCFI1
755*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
756*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	/* uleb128 0x4 */
757*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
758*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI3-.LCFI2
759*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
760*1fd5a2e1SPrashanth Swaminathan	.byte	0x10	/* uleb128 0x4 */
761*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
762*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI4-.LCFI3
763*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
764*1fd5a2e1SPrashanth Swaminathan	.byte	0x14	/* uleb128 0x4 */
765*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
766*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI5-.LCFI4
767*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
768*1fd5a2e1SPrashanth Swaminathan	.byte	0x18	/* uleb128 0x4 */
769*1fd5a2e1SPrashanth Swaminathan	.byte	0x91	/* DW_CFA_offset, column 0x11 */
770*1fd5a2e1SPrashanth Swaminathan	.byte	0x6	/* uleb128 0x6 */
771*1fd5a2e1SPrashanth Swaminathan	.byte	0x8e	/* DW_CFA_offset, column 0xe */
772*1fd5a2e1SPrashanth Swaminathan	.byte	0x5	/* uleb128 0x5 */
773*1fd5a2e1SPrashanth Swaminathan	.byte	0x8c	/* DW_CFA_offset, column 0xc */
774*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* uleb128 0x4 */
775*1fd5a2e1SPrashanth Swaminathan	.byte	0x8a	/* DW_CFA_offset, column 0xa */
776*1fd5a2e1SPrashanth Swaminathan	.byte	0x3	/* uleb128 0x3 */
777*1fd5a2e1SPrashanth Swaminathan	.byte	0x89	/* DW_CFA_offset, column 0x9 */
778*1fd5a2e1SPrashanth Swaminathan	.byte	0x2	/* uleb128 0x2 */
779*1fd5a2e1SPrashanth Swaminathan	.byte	0x88	/* DW_CFA_offset, column 0x8 */
780*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* uleb128 0x1 */
781*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
782*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI6-.LCFI5
783*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
784*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* uleb128 0xe */
785*1fd5a2e1SPrashanth Swaminathan	.align	2
786*1fd5a2e1SPrashanth Swaminathan.LEFDE1:
787*1fd5a2e1SPrashanth Swaminathan
788*1fd5a2e1SPrashanth Swaminathan.LSFDE3:
789*1fd5a2e1SPrashanth Swaminathan	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
790*1fd5a2e1SPrashanth Swaminathan.LASFDE3:
791*1fd5a2e1SPrashanth Swaminathan	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
792*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
793*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB2-.	/* FDE initial location */
794*1fd5a2e1SPrashanth Swaminathan#else
795*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB2	/* FDE initial location */
796*1fd5a2e1SPrashanth Swaminathan#endif
797*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFE2-.LFB2	 /* FDE address range */
798*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
799*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x0	/* Augmentation size */
800*1fd5a2e1SPrashanth Swaminathan#endif
801*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
802*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI7-.LFB2
803*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
804*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* uleb128 0x4 */
805*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
806*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI8-.LCFI7
807*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
808*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* uleb128 0x4 */
809*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
810*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFI9-.LCFI8
811*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
812*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	/* uleb128 0x4 */
813*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
814*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFIA-.LCFI9
815*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
816*1fd5a2e1SPrashanth Swaminathan	.byte	0x10	/* uleb128 0x4 */
817*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
818*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFIB-.LCFIA
819*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
820*1fd5a2e1SPrashanth Swaminathan	.byte	0x14	/* uleb128 0x4 */
821*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
822*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFIC-.LCFIB
823*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
824*1fd5a2e1SPrashanth Swaminathan	.byte	0x18	/* uleb128 0x4 */
825*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
826*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFID-.LCFIC
827*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
828*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__)
829*1fd5a2e1SPrashanth Swaminathan	.byte	24+48	/* uleb128 24+48 */
830*1fd5a2e1SPrashanth Swaminathan#else
831*1fd5a2e1SPrashanth Swaminathan	.byte	24+16	/* uleb128 24+16 */
832*1fd5a2e1SPrashanth Swaminathan#endif
833*1fd5a2e1SPrashanth Swaminathan	.byte	0x91	/* DW_CFA_offset, column 0x11 */
834*1fd5a2e1SPrashanth Swaminathan	.byte	0x6	/* uleb128 0x6 */
835*1fd5a2e1SPrashanth Swaminathan	.byte	0x8e	/* DW_CFA_offset, column 0xe */
836*1fd5a2e1SPrashanth Swaminathan	.byte	0x5	/* uleb128 0x5 */
837*1fd5a2e1SPrashanth Swaminathan	.byte	0x84	/* DW_CFA_offset, column 0x4 */
838*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* uleb128 0x4 */
839*1fd5a2e1SPrashanth Swaminathan	.byte	0x85	/* DW_CFA_offset, column 0x5 */
840*1fd5a2e1SPrashanth Swaminathan	.byte	0x3	/* uleb128 0x3 */
841*1fd5a2e1SPrashanth Swaminathan	.byte	0x86	/* DW_CFA_offset, column 0x6 */
842*1fd5a2e1SPrashanth Swaminathan	.byte	0x2	/* uleb128 0x2 */
843*1fd5a2e1SPrashanth Swaminathan	.byte	0x87	/* DW_CFA_offset, column 0x7 */
844*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* uleb128 0x1 */
845*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
846*1fd5a2e1SPrashanth Swaminathan	.4byte	.LCFIE-.LCFID
847*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
848*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* uleb128 0xe */
849*1fd5a2e1SPrashanth Swaminathan	.align	2
850*1fd5a2e1SPrashanth Swaminathan.LEFDE3:
851