xref: /aosp_15_r20/external/libffi/src/sh64/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   SuperH SHmedia 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
18*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19*1fd5a2e1SPrashanth Swaminathan   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21*1fd5a2e1SPrashanth Swaminathan   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22*1fd5a2e1SPrashanth Swaminathan   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23*1fd5a2e1SPrashanth Swaminathan   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24*1fd5a2e1SPrashanth Swaminathan   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25*1fd5a2e1SPrashanth Swaminathan   DEALINGS IN THE SOFTWARE.
26*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
27*1fd5a2e1SPrashanth Swaminathan
28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
31*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_MACHINE_ASM_H
32*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h>
33*1fd5a2e1SPrashanth Swaminathan#else
34*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure. */
35*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x
36*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
37*1fd5a2e1SPrashanth Swaminathan#endif
38*1fd5a2e1SPrashanth Swaminathan
39*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
40*1fd5a2e1SPrashanth Swaminathan#define OFS_FLT	0
41*1fd5a2e1SPrashanth Swaminathan#else
42*1fd5a2e1SPrashanth Swaminathan#define OFS_FLT	4
43*1fd5a2e1SPrashanth Swaminathan#endif
44*1fd5a2e1SPrashanth Swaminathan
45*1fd5a2e1SPrashanth Swaminathan	.section	.text..SHmedia32,"ax"
46*1fd5a2e1SPrashanth Swaminathan
47*1fd5a2e1SPrashanth Swaminathan	# r2:	ffi_prep_args
48*1fd5a2e1SPrashanth Swaminathan	# r3:	&ecif
49*1fd5a2e1SPrashanth Swaminathan	# r4:	bytes
50*1fd5a2e1SPrashanth Swaminathan	# r5:	flags
51*1fd5a2e1SPrashanth Swaminathan	# r6:	flags2
52*1fd5a2e1SPrashanth Swaminathan	# r7:	rvalue
53*1fd5a2e1SPrashanth Swaminathan	# r8:	fn
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan	# This assumes we are using gas.
56*1fd5a2e1SPrashanth Swaminathan	.align	5
57*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV)
58*1fd5a2e1SPrashanth Swaminathan	# Save registers
59*1fd5a2e1SPrashanth Swaminathan.LFB1:
60*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, -48, r15
61*1fd5a2e1SPrashanth Swaminathan.LCFI0:
62*1fd5a2e1SPrashanth Swaminathan	st.q	r15, 40, r32
63*1fd5a2e1SPrashanth Swaminathan	st.q	r15, 32, r31
64*1fd5a2e1SPrashanth Swaminathan	st.q	r15, 24, r30
65*1fd5a2e1SPrashanth Swaminathan	st.q	r15, 16, r29
66*1fd5a2e1SPrashanth Swaminathan	st.q	r15, 8, r28
67*1fd5a2e1SPrashanth Swaminathan	st.l	r15, 4, r18
68*1fd5a2e1SPrashanth Swaminathan	st.l	r15, 0, r14
69*1fd5a2e1SPrashanth Swaminathan.LCFI1:
70*1fd5a2e1SPrashanth Swaminathan	add.l	r15, r63, r14
71*1fd5a2e1SPrashanth Swaminathan.LCFI2:
72*1fd5a2e1SPrashanth Swaminathan#	add	r4, r63, r28
73*1fd5a2e1SPrashanth Swaminathan	add	r5, r63, r29
74*1fd5a2e1SPrashanth Swaminathan	add	r6, r63, r30
75*1fd5a2e1SPrashanth Swaminathan	add	r7, r63, r31
76*1fd5a2e1SPrashanth Swaminathan	add	r8, r63, r32
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth Swaminathan	addi	r4, (64 + 7), r4
79*1fd5a2e1SPrashanth Swaminathan	andi	r4, ~7, r4
80*1fd5a2e1SPrashanth Swaminathan	sub.l	r15, r4, r15
81*1fd5a2e1SPrashanth Swaminathan
82*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r2, tr0
83*1fd5a2e1SPrashanth Swaminathan	add	r15, r63, r2
84*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r18
85*1fd5a2e1SPrashanth Swaminathan
86*1fd5a2e1SPrashanth Swaminathan	addi	r15, 64, r22
87*1fd5a2e1SPrashanth Swaminathan	movi	0, r0
88*1fd5a2e1SPrashanth Swaminathan	movi	0, r1
89*1fd5a2e1SPrashanth Swaminathan	movi	-1, r23
90*1fd5a2e1SPrashanth Swaminathan
91*1fd5a2e1SPrashanth Swaminathan	pt/l	1f, tr1
92*1fd5a2e1SPrashanth Swaminathan	bnei/l	r29, FFI_TYPE_STRUCT, tr1
93*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 0, r19
94*1fd5a2e1SPrashanth Swaminathan	addi	r15, 8, r15
95*1fd5a2e1SPrashanth Swaminathan	addi	r0, 1, r0
96*1fd5a2e1SPrashanth Swaminathan1:
97*1fd5a2e1SPrashanth Swaminathan
98*1fd5a2e1SPrashanth Swaminathan.L_pass:
99*1fd5a2e1SPrashanth Swaminathan	andi	r30, 3, r20
100*1fd5a2e1SPrashanth Swaminathan	shlri	r30, 2, r30
101*1fd5a2e1SPrashanth Swaminathan
102*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_call_it, tr0
103*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pass_i, tr1
104*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pass_f, tr2
105*1fd5a2e1SPrashanth Swaminathan
106*1fd5a2e1SPrashanth Swaminathan	beqi/l	r20, FFI_TYPE_VOID, tr0
107*1fd5a2e1SPrashanth Swaminathan	beqi/l	r20, FFI_TYPE_INT, tr1
108*1fd5a2e1SPrashanth Swaminathan	beqi/l	r20, FFI_TYPE_FLOAT, tr2
109*1fd5a2e1SPrashanth Swaminathan
110*1fd5a2e1SPrashanth Swaminathan.L_pass_d:
111*1fd5a2e1SPrashanth Swaminathan	addi	r0, 1, r0
112*1fd5a2e1SPrashanth Swaminathan	pt/l	3f, tr0
113*1fd5a2e1SPrashanth Swaminathan	movi	12, r20
114*1fd5a2e1SPrashanth Swaminathan	bge/l	r1, r20, tr0
115*1fd5a2e1SPrashanth Swaminathan
116*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_d, tr1
117*1fd5a2e1SPrashanth Swaminathan	pt/l	2f, tr0
118*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
119*1fd5a2e1SPrashanth Swaminathan2:
120*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, 8, r15
121*1fd5a2e1SPrashanth Swaminathan3:
122*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pass, tr0
123*1fd5a2e1SPrashanth Swaminathan	addi	r1, 2, r1
124*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
125*1fd5a2e1SPrashanth Swaminathan
126*1fd5a2e1SPrashanth Swaminathan.L_pop_d:
127*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_d_tbl, tr1
128*1fd5a2e1SPrashanth Swaminathan	gettr	tr1, r20
129*1fd5a2e1SPrashanth Swaminathan	shlli	r1, 2, r21
130*1fd5a2e1SPrashanth Swaminathan	add	r20, r21, r20
131*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r20, tr1
132*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
133*1fd5a2e1SPrashanth Swaminathan
134*1fd5a2e1SPrashanth Swaminathan.L_pop_d_tbl:
135*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr0
136*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
137*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr2
138*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
139*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr4
140*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
141*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr6
142*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
143*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr8
144*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
145*1fd5a2e1SPrashanth Swaminathan	fld.d	r15, 0, dr10
146*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
147*1fd5a2e1SPrashanth Swaminathan
148*1fd5a2e1SPrashanth Swaminathan.L_pass_f:
149*1fd5a2e1SPrashanth Swaminathan	addi	r0, 1, r0
150*1fd5a2e1SPrashanth Swaminathan	pt/l	3f, tr0
151*1fd5a2e1SPrashanth Swaminathan	movi	12, r20
152*1fd5a2e1SPrashanth Swaminathan	bge/l	r1, r20, tr0
153*1fd5a2e1SPrashanth Swaminathan
154*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_f, tr1
155*1fd5a2e1SPrashanth Swaminathan	pt/l	2f, tr0
156*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
157*1fd5a2e1SPrashanth Swaminathan2:
158*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, 8, r15
159*1fd5a2e1SPrashanth Swaminathan3:
160*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pass, tr0
161*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
162*1fd5a2e1SPrashanth Swaminathan
163*1fd5a2e1SPrashanth Swaminathan.L_pop_f:
164*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_f_tbl, tr1
165*1fd5a2e1SPrashanth Swaminathan	pt/l	5f, tr2
166*1fd5a2e1SPrashanth Swaminathan	gettr	tr1, r20
167*1fd5a2e1SPrashanth Swaminathan	bge/l	r23, r63, tr2
168*1fd5a2e1SPrashanth Swaminathan	add	r1, r63, r23
169*1fd5a2e1SPrashanth Swaminathan	shlli	r1, 3, r21
170*1fd5a2e1SPrashanth Swaminathan	addi	r1, 2, r1
171*1fd5a2e1SPrashanth Swaminathan	add	r20, r21, r20
172*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r20, tr1
173*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
174*1fd5a2e1SPrashanth Swaminathan5:
175*1fd5a2e1SPrashanth Swaminathan	addi	r23, 1, r21
176*1fd5a2e1SPrashanth Swaminathan	movi	-1, r23
177*1fd5a2e1SPrashanth Swaminathan	shlli	r21, 3, r21
178*1fd5a2e1SPrashanth Swaminathan	add	r20, r21, r20
179*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r20, tr1
180*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
181*1fd5a2e1SPrashanth Swaminathan
182*1fd5a2e1SPrashanth Swaminathan.L_pop_f_tbl:
183*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr0
184*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
185*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr1
186*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
187*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr2
188*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
189*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr3
190*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
191*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr4
192*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
193*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr5
194*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
195*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr6
196*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
197*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr7
198*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
199*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr8
200*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
201*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr9
202*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
203*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr10
204*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
205*1fd5a2e1SPrashanth Swaminathan	fld.s	r15, OFS_FLT, fr11
206*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
207*1fd5a2e1SPrashanth Swaminathan
208*1fd5a2e1SPrashanth Swaminathan.L_pass_i:
209*1fd5a2e1SPrashanth Swaminathan	pt/l	3f, tr0
210*1fd5a2e1SPrashanth Swaminathan	movi	8, r20
211*1fd5a2e1SPrashanth Swaminathan	bge/l	r0, r20, tr0
212*1fd5a2e1SPrashanth Swaminathan
213*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_i, tr1
214*1fd5a2e1SPrashanth Swaminathan	pt/l	2f, tr0
215*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
216*1fd5a2e1SPrashanth Swaminathan2:
217*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, 8, r15
218*1fd5a2e1SPrashanth Swaminathan3:
219*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pass, tr0
220*1fd5a2e1SPrashanth Swaminathan	addi	r0, 1, r0
221*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
222*1fd5a2e1SPrashanth Swaminathan
223*1fd5a2e1SPrashanth Swaminathan.L_pop_i:
224*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_pop_i_tbl, tr1
225*1fd5a2e1SPrashanth Swaminathan	gettr	tr1, r20
226*1fd5a2e1SPrashanth Swaminathan	shlli	r0, 3, r21
227*1fd5a2e1SPrashanth Swaminathan	add	r20, r21, r20
228*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r20, tr1
229*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
230*1fd5a2e1SPrashanth Swaminathan
231*1fd5a2e1SPrashanth Swaminathan.L_pop_i_tbl:
232*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r2
233*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
234*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r3
235*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
236*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r4
237*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
238*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r5
239*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
240*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r6
241*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
242*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r7
243*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
244*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r8
245*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
246*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 0, r9
247*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
248*1fd5a2e1SPrashanth Swaminathan
249*1fd5a2e1SPrashanth Swaminathan.L_call_it:
250*1fd5a2e1SPrashanth Swaminathan	# call function
251*1fd5a2e1SPrashanth Swaminathan	pt/l	1f, tr1
252*1fd5a2e1SPrashanth Swaminathan	bnei/l	r29, FFI_TYPE_STRUCT, tr1
253*1fd5a2e1SPrashanth Swaminathan	add	r19, r63, r2
254*1fd5a2e1SPrashanth Swaminathan1:
255*1fd5a2e1SPrashanth Swaminathan	add	r22, r63, r15
256*1fd5a2e1SPrashanth Swaminathan	ptabs/l	r32, tr0
257*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r18
258*1fd5a2e1SPrashanth Swaminathan
259*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_i, tr0
260*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_ll, tr1
261*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_d, tr2
262*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_f, tr3
263*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_epilogue, tr4
264*1fd5a2e1SPrashanth Swaminathan
265*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_INT, tr0
266*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_UINT32, tr0
267*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_SINT64, tr1
268*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_UINT64, tr1
269*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_DOUBLE, tr2
270*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_FLOAT, tr3
271*1fd5a2e1SPrashanth Swaminathan
272*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_q, tr0
273*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_ret_h, tr1
274*1fd5a2e1SPrashanth Swaminathan
275*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_UINT8, tr0
276*1fd5a2e1SPrashanth Swaminathan	beqi/l	r29, FFI_TYPE_UINT16, tr1
277*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
278*1fd5a2e1SPrashanth Swaminathan
279*1fd5a2e1SPrashanth Swaminathan.L_ret_d:
280*1fd5a2e1SPrashanth Swaminathan	fst.d	r31, 0, dr0
281*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
282*1fd5a2e1SPrashanth Swaminathan
283*1fd5a2e1SPrashanth Swaminathan.L_ret_ll:
284*1fd5a2e1SPrashanth Swaminathan	st.q	r31, 0, r2
285*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
286*1fd5a2e1SPrashanth Swaminathan
287*1fd5a2e1SPrashanth Swaminathan.L_ret_f:
288*1fd5a2e1SPrashanth Swaminathan	fst.s	r31, OFS_FLT, fr0
289*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
290*1fd5a2e1SPrashanth Swaminathan
291*1fd5a2e1SPrashanth Swaminathan.L_ret_q:
292*1fd5a2e1SPrashanth Swaminathan	st.b	r31, 0, r2
293*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
294*1fd5a2e1SPrashanth Swaminathan
295*1fd5a2e1SPrashanth Swaminathan.L_ret_h:
296*1fd5a2e1SPrashanth Swaminathan	st.w	r31, 0, r2
297*1fd5a2e1SPrashanth Swaminathan	blink	tr4, r63
298*1fd5a2e1SPrashanth Swaminathan
299*1fd5a2e1SPrashanth Swaminathan.L_ret_i:
300*1fd5a2e1SPrashanth Swaminathan	st.l	r31, 0, r2
301*1fd5a2e1SPrashanth Swaminathan	# Fall
302*1fd5a2e1SPrashanth Swaminathan
303*1fd5a2e1SPrashanth Swaminathan.L_epilogue:
304*1fd5a2e1SPrashanth Swaminathan	# Remove the space we pushed for the args
305*1fd5a2e1SPrashanth Swaminathan	add	r14, r63, r15
306*1fd5a2e1SPrashanth Swaminathan
307*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 0, r14
308*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 4, r18
309*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 8, r28
310*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 16, r29
311*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 24, r30
312*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 32, r31
313*1fd5a2e1SPrashanth Swaminathan	ld.q	r15, 40, r32
314*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, 48, r15
315*1fd5a2e1SPrashanth Swaminathan	ptabs	r18, tr0
316*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
317*1fd5a2e1SPrashanth Swaminathan
318*1fd5a2e1SPrashanth Swaminathan.LFE1:
319*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end:
320*1fd5a2e1SPrashanth Swaminathan	.size	 CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
321*1fd5a2e1SPrashanth Swaminathan
322*1fd5a2e1SPrashanth Swaminathan	.align	5
323*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV)
324*1fd5a2e1SPrashanth Swaminathan.LFB2:
325*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, -136, r15
326*1fd5a2e1SPrashanth Swaminathan.LCFI3:
327*1fd5a2e1SPrashanth Swaminathan	st.l	r15, 12, r18
328*1fd5a2e1SPrashanth Swaminathan	st.l	r15, 8, r14
329*1fd5a2e1SPrashanth Swaminathan	st.l	r15, 4, r12
330*1fd5a2e1SPrashanth Swaminathan.LCFI4:
331*1fd5a2e1SPrashanth Swaminathan	add	r15, r63, r14
332*1fd5a2e1SPrashanth Swaminathan.LCFI5:
333*1fd5a2e1SPrashanth Swaminathan	/* Stack layout:
334*1fd5a2e1SPrashanth Swaminathan	   ...
335*1fd5a2e1SPrashanth Swaminathan	   64 bytes (register parameters)
336*1fd5a2e1SPrashanth Swaminathan	   48 bytes (floating register parameters)
337*1fd5a2e1SPrashanth Swaminathan	    8 bytes (result)
338*1fd5a2e1SPrashanth Swaminathan	    4 bytes (r18)
339*1fd5a2e1SPrashanth Swaminathan	    4 bytes (r14)
340*1fd5a2e1SPrashanth Swaminathan	    4 bytes (r12)
341*1fd5a2e1SPrashanth Swaminathan	    4 bytes (for align)
342*1fd5a2e1SPrashanth Swaminathan	   <- new stack pointer
343*1fd5a2e1SPrashanth Swaminathan	*/
344*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 24, dr0
345*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 32, dr2
346*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 40, dr4
347*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 48, dr6
348*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 56, dr8
349*1fd5a2e1SPrashanth Swaminathan	fst.d	r14, 64, dr10
350*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 72, r2
351*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 80, r3
352*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 88, r4
353*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 96, r5
354*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 104, r6
355*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 112, r7
356*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 120, r8
357*1fd5a2e1SPrashanth Swaminathan	st.q	r14, 128, r9
358*1fd5a2e1SPrashanth Swaminathan
359*1fd5a2e1SPrashanth Swaminathan	add	r1, r63, r2
360*1fd5a2e1SPrashanth Swaminathan	addi	r14, 16, r3
361*1fd5a2e1SPrashanth Swaminathan	addi	r14, 72, r4
362*1fd5a2e1SPrashanth Swaminathan	addi	r14, 24, r5
363*1fd5a2e1SPrashanth Swaminathan	addi	r14, 136, r6
364*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
365*1fd5a2e1SPrashanth Swaminathan	movi	(((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12
366*1fd5a2e1SPrashanth Swaminathan        shori	((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12
367*1fd5a2e1SPrashanth Swaminathan.LPCS0:	ptrel/u r12, tr0
368*1fd5a2e1SPrashanth Swaminathan	movi	((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1
369*1fd5a2e1SPrashanth Swaminathan	gettr	tr0, r12
370*1fd5a2e1SPrashanth Swaminathan	ldx.l	r1, r12, r1
371*1fd5a2e1SPrashanth Swaminathan	ptabs	r1, tr0
372*1fd5a2e1SPrashanth Swaminathan#else
373*1fd5a2e1SPrashanth Swaminathan	pt/l	ffi_closure_helper_SYSV, tr0
374*1fd5a2e1SPrashanth Swaminathan#endif
375*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r18
376*1fd5a2e1SPrashanth Swaminathan
377*1fd5a2e1SPrashanth Swaminathan	shlli	r2, 1, r1
378*1fd5a2e1SPrashanth Swaminathan        movi    (((datalabel .L_table) >> 16) & 65535), r2
379*1fd5a2e1SPrashanth Swaminathan        shori   ((datalabel .L_table) & 65535), r2
380*1fd5a2e1SPrashanth Swaminathan        ldx.w   r2, r1, r1
381*1fd5a2e1SPrashanth Swaminathan        add     r1, r2, r1
382*1fd5a2e1SPrashanth Swaminathan	pt/l	.L_case_v, tr1
383*1fd5a2e1SPrashanth Swaminathan        ptabs   r1, tr0
384*1fd5a2e1SPrashanth Swaminathan        blink   tr0, r63
385*1fd5a2e1SPrashanth Swaminathan
386*1fd5a2e1SPrashanth Swaminathan        .align 2
387*1fd5a2e1SPrashanth Swaminathan.L_table:
388*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_VOID */
389*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_INT */
390*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_f - datalabel .L_table	/* FFI_TYPE_FLOAT */
391*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_DOUBLE */
392*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_LONGDOUBLE */
393*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_uq - datalabel .L_table	/* FFI_TYPE_UINT8 */
394*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_q - datalabel .L_table	/* FFI_TYPE_SINT8 */
395*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_uh - datalabel .L_table	/* FFI_TYPE_UINT16 */
396*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_h - datalabel .L_table	/* FFI_TYPE_SINT16 */
397*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_UINT32 */
398*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_SINT32 */
399*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_UINT64 */
400*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_SINT64 */
401*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_STRUCT */
402*1fd5a2e1SPrashanth Swaminathan	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_POINTER */
403*1fd5a2e1SPrashanth Swaminathan
404*1fd5a2e1SPrashanth Swaminathan        .align 2
405*1fd5a2e1SPrashanth Swaminathan.L_case_d:
406*1fd5a2e1SPrashanth Swaminathan	fld.d	r14, 16, dr0
407*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
408*1fd5a2e1SPrashanth Swaminathan.L_case_f:
409*1fd5a2e1SPrashanth Swaminathan	fld.s	r14, 16, fr0
410*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
411*1fd5a2e1SPrashanth Swaminathan.L_case_ll:
412*1fd5a2e1SPrashanth Swaminathan	ld.q	r14, 16, r2
413*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
414*1fd5a2e1SPrashanth Swaminathan.L_case_i:
415*1fd5a2e1SPrashanth Swaminathan	ld.l	r14, 16, r2
416*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
417*1fd5a2e1SPrashanth Swaminathan.L_case_q:
418*1fd5a2e1SPrashanth Swaminathan	ld.b	r14, 16, r2
419*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
420*1fd5a2e1SPrashanth Swaminathan.L_case_uq:
421*1fd5a2e1SPrashanth Swaminathan	ld.ub	r14, 16, r2
422*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
423*1fd5a2e1SPrashanth Swaminathan.L_case_h:
424*1fd5a2e1SPrashanth Swaminathan	ld.w	r14, 16, r2
425*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
426*1fd5a2e1SPrashanth Swaminathan.L_case_uh:
427*1fd5a2e1SPrashanth Swaminathan	ld.uw	r14, 16, r2
428*1fd5a2e1SPrashanth Swaminathan	blink	tr1, r63
429*1fd5a2e1SPrashanth Swaminathan.L_case_v:
430*1fd5a2e1SPrashanth Swaminathan	add.l	r14, r63, r15
431*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 4, r12
432*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 8, r14
433*1fd5a2e1SPrashanth Swaminathan	ld.l	r15, 12, r18
434*1fd5a2e1SPrashanth Swaminathan	addi.l	r15, 136, r15
435*1fd5a2e1SPrashanth Swaminathan	ptabs	r18, tr0
436*1fd5a2e1SPrashanth Swaminathan	blink	tr0, r63
437*1fd5a2e1SPrashanth Swaminathan
438*1fd5a2e1SPrashanth Swaminathan.LFE2:
439*1fd5a2e1SPrashanth Swaminathan.ffi_closure_SYSV_end:
440*1fd5a2e1SPrashanth Swaminathan	.size	 CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
441*1fd5a2e1SPrashanth Swaminathan
442*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
443*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
444*1fd5a2e1SPrashanth Swaminathan#endif
445*1fd5a2e1SPrashanth Swaminathan
446*1fd5a2e1SPrashanth Swaminathan	.section	".eh_frame","aw",@progbits
447*1fd5a2e1SPrashanth Swaminathan__FRAME_BEGIN__:
448*1fd5a2e1SPrashanth Swaminathan	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
449*1fd5a2e1SPrashanth Swaminathan.LSCIE1:
450*1fd5a2e1SPrashanth Swaminathan	.4byte	0x0	/* CIE Identifier Tag */
451*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* CIE Version */
452*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
453*1fd5a2e1SPrashanth Swaminathan	.ascii "zR\0"	/* CIE Augmentation */
454*1fd5a2e1SPrashanth Swaminathan#else
455*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* CIE Augmentation */
456*1fd5a2e1SPrashanth Swaminathan#endif
457*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x1	/* CIE Code Alignment Factor */
458*1fd5a2e1SPrashanth Swaminathan	.sleb128 -4	/* CIE Data Alignment Factor */
459*1fd5a2e1SPrashanth Swaminathan	.byte	0x12	/* CIE RA Column */
460*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
461*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x1	/* Augmentation size */
462*1fd5a2e1SPrashanth Swaminathan	.byte	0x10	/* FDE Encoding (pcrel) */
463*1fd5a2e1SPrashanth Swaminathan#endif
464*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	/* DW_CFA_def_cfa */
465*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xf
466*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x0
467*1fd5a2e1SPrashanth Swaminathan	.align	2
468*1fd5a2e1SPrashanth Swaminathan.LECIE1:
469*1fd5a2e1SPrashanth Swaminathan.LSFDE1:
470*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LEFDE1-datalabel .LASFDE1	/* FDE Length */
471*1fd5a2e1SPrashanth Swaminathan.LASFDE1:
472*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LASFDE1-datalabel __FRAME_BEGIN__
473*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
474*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB1-.	/* FDE initial location */
475*1fd5a2e1SPrashanth Swaminathan#else
476*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB1	/* FDE initial location */
477*1fd5a2e1SPrashanth Swaminathan#endif
478*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LFE1-datalabel .LFB1	/* FDE address range */
479*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
480*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x0	/* Augmentation size */
481*1fd5a2e1SPrashanth Swaminathan#endif
482*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
483*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI0-datalabel .LFB1
484*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
485*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x30
486*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
487*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI1-datalabel .LCFI0
488*1fd5a2e1SPrashanth Swaminathan	.byte   0x8e	/* DW_CFA_offset, column 0xe */
489*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xc
490*1fd5a2e1SPrashanth Swaminathan	.byte   0x92	/* DW_CFA_offset, column 0x12 */
491*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xb
492*1fd5a2e1SPrashanth Swaminathan	.byte   0x9c	/* DW_CFA_offset, column 0x1c */
493*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xa
494*1fd5a2e1SPrashanth Swaminathan	.byte   0x9d	/* DW_CFA_offset, column 0x1d */
495*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x8
496*1fd5a2e1SPrashanth Swaminathan	.byte   0x9e	/* DW_CFA_offset, column 0x1e */
497*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x6
498*1fd5a2e1SPrashanth Swaminathan	.byte   0x9f	/* DW_CFA_offset, column 0x1f */
499*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x4
500*1fd5a2e1SPrashanth Swaminathan	.byte   0xa0	/* DW_CFA_offset, column 0x20 */
501*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x2
502*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
503*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI2-datalabel .LCFI1
504*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
505*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xe
506*1fd5a2e1SPrashanth Swaminathan	.align	2
507*1fd5a2e1SPrashanth Swaminathan.LEFDE1:
508*1fd5a2e1SPrashanth Swaminathan
509*1fd5a2e1SPrashanth Swaminathan.LSFDE3:
510*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LEFDE3-datalabel .LASFDE3	/* FDE Length */
511*1fd5a2e1SPrashanth Swaminathan.LASFDE3:
512*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LASFDE3-datalabel __FRAME_BEGIN__
513*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
514*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB2-.	/* FDE initial location */
515*1fd5a2e1SPrashanth Swaminathan#else
516*1fd5a2e1SPrashanth Swaminathan	.4byte	.LFB2	/* FDE initial location */
517*1fd5a2e1SPrashanth Swaminathan#endif
518*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LFE2-datalabel .LFB2	/* FDE address range */
519*1fd5a2e1SPrashanth Swaminathan#ifdef PIC
520*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x0	/* Augmentation size */
521*1fd5a2e1SPrashanth Swaminathan#endif
522*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
523*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI3-datalabel .LFB2
524*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
525*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x88
526*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
527*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI4-datalabel .LCFI3
528*1fd5a2e1SPrashanth Swaminathan	.byte   0x8c	/* DW_CFA_offset, column 0xc */
529*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x21
530*1fd5a2e1SPrashanth Swaminathan	.byte   0x8e	/* DW_CFA_offset, column 0xe */
531*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x20
532*1fd5a2e1SPrashanth Swaminathan	.byte   0x92	/* DW_CFA_offset, column 0x12 */
533*1fd5a2e1SPrashanth Swaminathan	.uleb128 0x1f
534*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
535*1fd5a2e1SPrashanth Swaminathan	.4byte	datalabel .LCFI5-datalabel .LCFI4
536*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
537*1fd5a2e1SPrashanth Swaminathan	.uleb128 0xe
538*1fd5a2e1SPrashanth Swaminathan	.align	2
539*1fd5a2e1SPrashanth Swaminathan.LEFDE3:
540