xref: /aosp_15_r20/external/libffi/src/m68k/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan
3*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2012 Alan Hourihane
4*1fd5a2e1SPrashanth Swaminathan	    Copyright (c) 1998, 2012 Andreas Schwab
5*1fd5a2e1SPrashanth Swaminathan	    Copyright (c) 2008 Red Hat, Inc.
6*1fd5a2e1SPrashanth Swaminathan	    Copyright (c) 2012, 2016 Thorsten Glaser
7*1fd5a2e1SPrashanth Swaminathan
8*1fd5a2e1SPrashanth Swaminathan   m68k Foreign Function Interface
9*1fd5a2e1SPrashanth Swaminathan
10*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
11*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
12*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
13*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
14*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
15*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
16*1fd5a2e1SPrashanth Swaminathan   the following conditions:
17*1fd5a2e1SPrashanth Swaminathan
18*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
19*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
20*1fd5a2e1SPrashanth Swaminathan
21*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
22*1fd5a2e1SPrashanth Swaminathan   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24*1fd5a2e1SPrashanth Swaminathan   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25*1fd5a2e1SPrashanth Swaminathan   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26*1fd5a2e1SPrashanth Swaminathan   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27*1fd5a2e1SPrashanth Swaminathan   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28*1fd5a2e1SPrashanth Swaminathan   DEALINGS IN THE SOFTWARE.
29*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
30*1fd5a2e1SPrashanth Swaminathan
31*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
32*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
33*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
34*1fd5a2e1SPrashanth Swaminathan
35*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_CFI_PSEUDO_OP
36*1fd5a2e1SPrashanth Swaminathan#define CFI_STARTPROC()		.cfi_startproc
37*1fd5a2e1SPrashanth Swaminathan#define CFI_OFFSET(reg,off)	.cfi_offset	reg,off
38*1fd5a2e1SPrashanth Swaminathan#define CFI_DEF_CFA(reg,off)	.cfi_def_cfa	reg,off
39*1fd5a2e1SPrashanth Swaminathan#define CFI_ENDPROC()		.cfi_endproc
40*1fd5a2e1SPrashanth Swaminathan#else
41*1fd5a2e1SPrashanth Swaminathan#define CFI_STARTPROC()
42*1fd5a2e1SPrashanth Swaminathan#define CFI_OFFSET(reg,off)
43*1fd5a2e1SPrashanth Swaminathan#define CFI_DEF_CFA(reg,off)
44*1fd5a2e1SPrashanth Swaminathan#define CFI_ENDPROC()
45*1fd5a2e1SPrashanth Swaminathan#endif
46*1fd5a2e1SPrashanth Swaminathan
47*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__
48*1fd5a2e1SPrashanth Swaminathan#define CALLFUNC(funcname) _ ## funcname
49*1fd5a2e1SPrashanth Swaminathan#else
50*1fd5a2e1SPrashanth Swaminathan#define CALLFUNC(funcname) funcname
51*1fd5a2e1SPrashanth Swaminathan#endif
52*1fd5a2e1SPrashanth Swaminathan
53*1fd5a2e1SPrashanth Swaminathan	.text
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan	.globl	CALLFUNC(ffi_call_SYSV)
56*1fd5a2e1SPrashanth Swaminathan	.type	CALLFUNC(ffi_call_SYSV),@function
57*1fd5a2e1SPrashanth Swaminathan	.align	4
58*1fd5a2e1SPrashanth Swaminathan
59*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_call_SYSV):
60*1fd5a2e1SPrashanth Swaminathan	CFI_STARTPROC()
61*1fd5a2e1SPrashanth Swaminathan	link	%fp,#0
62*1fd5a2e1SPrashanth Swaminathan	CFI_OFFSET(14,-8)
63*1fd5a2e1SPrashanth Swaminathan	CFI_DEF_CFA(14,8)
64*1fd5a2e1SPrashanth Swaminathan	move.l	%d2,-(%sp)
65*1fd5a2e1SPrashanth Swaminathan	CFI_OFFSET(2,-12)
66*1fd5a2e1SPrashanth Swaminathan
67*1fd5a2e1SPrashanth Swaminathan	| Make room for all of the new args.
68*1fd5a2e1SPrashanth Swaminathan	sub.l	12(%fp),%sp
69*1fd5a2e1SPrashanth Swaminathan
70*1fd5a2e1SPrashanth Swaminathan	| Call ffi_prep_args
71*1fd5a2e1SPrashanth Swaminathan	move.l	8(%fp),-(%sp)
72*1fd5a2e1SPrashanth Swaminathan	pea	4(%sp)
73*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__
74*1fd5a2e1SPrashanth Swaminathan	jsr	CALLFUNC(ffi_prep_args)
75*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
76*1fd5a2e1SPrashanth Swaminathan	move.l  _current_shared_library_a5_offset_(%a5),%a0
77*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
78*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
79*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
80*1fd5a2e1SPrashanth Swaminathan	move.l  #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
81*1fd5a2e1SPrashanth Swaminathan	lea     (-6,%pc,%a0),%a0
82*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
83*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
84*1fd5a2e1SPrashanth Swaminathan#else
85*1fd5a2e1SPrashanth Swaminathan	bsr.l	CALLFUNC(ffi_prep_args@PLTPC)
86*1fd5a2e1SPrashanth Swaminathan#endif
87*1fd5a2e1SPrashanth Swaminathan	addq.l	#8,%sp
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan	| Pass pointer to struct value, if any
90*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__
91*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,%a1
92*1fd5a2e1SPrashanth Swaminathan#else
93*1fd5a2e1SPrashanth Swaminathan	move.l	%a0,%a1
94*1fd5a2e1SPrashanth Swaminathan#endif
95*1fd5a2e1SPrashanth Swaminathan
96*1fd5a2e1SPrashanth Swaminathan	| Call the function
97*1fd5a2e1SPrashanth Swaminathan	move.l	24(%fp),%a0
98*1fd5a2e1SPrashanth Swaminathan	jsr	(%a0)
99*1fd5a2e1SPrashanth Swaminathan
100*1fd5a2e1SPrashanth Swaminathan	| Remove the space we pushed for the args
101*1fd5a2e1SPrashanth Swaminathan	add.l	12(%fp),%sp
102*1fd5a2e1SPrashanth Swaminathan
103*1fd5a2e1SPrashanth Swaminathan	| Load the pointer to storage for the return value
104*1fd5a2e1SPrashanth Swaminathan	move.l	20(%fp),%a1
105*1fd5a2e1SPrashanth Swaminathan
106*1fd5a2e1SPrashanth Swaminathan	| Load the return type code
107*1fd5a2e1SPrashanth Swaminathan	move.l	16(%fp),%d2
108*1fd5a2e1SPrashanth Swaminathan
109*1fd5a2e1SPrashanth Swaminathan	| If the return value pointer is NULL, assume no return value.
110*1fd5a2e1SPrashanth Swaminathan	| NOTE: On the mc68000, tst on an address register is not supported.
111*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
112*1fd5a2e1SPrashanth Swaminathan	cmp.w	#0, %a1
113*1fd5a2e1SPrashanth Swaminathan#else
114*1fd5a2e1SPrashanth Swaminathan	tst.l	%a1
115*1fd5a2e1SPrashanth Swaminathan#endif
116*1fd5a2e1SPrashanth Swaminathan	jbeq	noretval
117*1fd5a2e1SPrashanth Swaminathan
118*1fd5a2e1SPrashanth Swaminathan	btst	#0,%d2
119*1fd5a2e1SPrashanth Swaminathan	jbeq	retlongint
120*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
121*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
122*1fd5a2e1SPrashanth Swaminathan
123*1fd5a2e1SPrashanth Swaminathanretlongint:
124*1fd5a2e1SPrashanth Swaminathan	btst	#1,%d2
125*1fd5a2e1SPrashanth Swaminathan	jbeq	retfloat
126*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
127*1fd5a2e1SPrashanth Swaminathan	move.l	%d1,4(%a1)
128*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
129*1fd5a2e1SPrashanth Swaminathan
130*1fd5a2e1SPrashanth Swaminathanretfloat:
131*1fd5a2e1SPrashanth Swaminathan	btst	#2,%d2
132*1fd5a2e1SPrashanth Swaminathan	jbeq	retdouble
133*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
134*1fd5a2e1SPrashanth Swaminathan	fmove.s	%fp0,(%a1)
135*1fd5a2e1SPrashanth Swaminathan#else
136*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
137*1fd5a2e1SPrashanth Swaminathan#endif
138*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
139*1fd5a2e1SPrashanth Swaminathan
140*1fd5a2e1SPrashanth Swaminathanretdouble:
141*1fd5a2e1SPrashanth Swaminathan	btst	#3,%d2
142*1fd5a2e1SPrashanth Swaminathan	jbeq	retlongdouble
143*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
144*1fd5a2e1SPrashanth Swaminathan	fmove.d	%fp0,(%a1)
145*1fd5a2e1SPrashanth Swaminathan#else
146*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)+
147*1fd5a2e1SPrashanth Swaminathan	move.l	%d1,(%a1)
148*1fd5a2e1SPrashanth Swaminathan#endif
149*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
150*1fd5a2e1SPrashanth Swaminathan
151*1fd5a2e1SPrashanth Swaminathanretlongdouble:
152*1fd5a2e1SPrashanth Swaminathan	btst	#4,%d2
153*1fd5a2e1SPrashanth Swaminathan	jbeq	retpointer
154*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
155*1fd5a2e1SPrashanth Swaminathan	fmove.x	%fp0,(%a1)
156*1fd5a2e1SPrashanth Swaminathan#else
157*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)+
158*1fd5a2e1SPrashanth Swaminathan	move.l	%d1,(%a1)+
159*1fd5a2e1SPrashanth Swaminathan	move.l	%d2,(%a1)
160*1fd5a2e1SPrashanth Swaminathan#endif
161*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
162*1fd5a2e1SPrashanth Swaminathan
163*1fd5a2e1SPrashanth Swaminathanretpointer:
164*1fd5a2e1SPrashanth Swaminathan	btst	#5,%d2
165*1fd5a2e1SPrashanth Swaminathan	jbeq	retstruct1
166*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__
167*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
168*1fd5a2e1SPrashanth Swaminathan#else
169*1fd5a2e1SPrashanth Swaminathan	move.l	%a0,(%a1)
170*1fd5a2e1SPrashanth Swaminathan#endif
171*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
172*1fd5a2e1SPrashanth Swaminathan
173*1fd5a2e1SPrashanth Swaminathanretstruct1:
174*1fd5a2e1SPrashanth Swaminathan	btst	#6,%d2
175*1fd5a2e1SPrashanth Swaminathan	jbeq	retstruct2
176*1fd5a2e1SPrashanth Swaminathan	move.b	%d0,(%a1)
177*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
178*1fd5a2e1SPrashanth Swaminathan
179*1fd5a2e1SPrashanth Swaminathanretstruct2:
180*1fd5a2e1SPrashanth Swaminathan	btst	#7,%d2
181*1fd5a2e1SPrashanth Swaminathan	jbeq	retsint8
182*1fd5a2e1SPrashanth Swaminathan	move.w	%d0,(%a1)
183*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
184*1fd5a2e1SPrashanth Swaminathan
185*1fd5a2e1SPrashanth Swaminathanretsint8:
186*1fd5a2e1SPrashanth Swaminathan	btst	#8,%d2
187*1fd5a2e1SPrashanth Swaminathan	jbeq	retsint16
188*1fd5a2e1SPrashanth Swaminathan	| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
189*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
190*1fd5a2e1SPrashanth Swaminathan	ext.w	%d0
191*1fd5a2e1SPrashanth Swaminathan	ext.l	%d0
192*1fd5a2e1SPrashanth Swaminathan#else
193*1fd5a2e1SPrashanth Swaminathan	extb.l	%d0
194*1fd5a2e1SPrashanth Swaminathan#endif
195*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
196*1fd5a2e1SPrashanth Swaminathan	jbra	epilogue
197*1fd5a2e1SPrashanth Swaminathan
198*1fd5a2e1SPrashanth Swaminathanretsint16:
199*1fd5a2e1SPrashanth Swaminathan	btst	#9,%d2
200*1fd5a2e1SPrashanth Swaminathan	jbeq	noretval
201*1fd5a2e1SPrashanth Swaminathan	ext.l	%d0
202*1fd5a2e1SPrashanth Swaminathan	move.l	%d0,(%a1)
203*1fd5a2e1SPrashanth Swaminathan
204*1fd5a2e1SPrashanth Swaminathannoretval:
205*1fd5a2e1SPrashanth Swaminathanepilogue:
206*1fd5a2e1SPrashanth Swaminathan	move.l	(%sp)+,%d2
207*1fd5a2e1SPrashanth Swaminathan	unlk	%fp
208*1fd5a2e1SPrashanth Swaminathan	rts
209*1fd5a2e1SPrashanth Swaminathan	CFI_ENDPROC()
210*1fd5a2e1SPrashanth Swaminathan	.size	CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
211*1fd5a2e1SPrashanth Swaminathan
212*1fd5a2e1SPrashanth Swaminathan	.globl	CALLFUNC(ffi_closure_SYSV)
213*1fd5a2e1SPrashanth Swaminathan	.type	CALLFUNC(ffi_closure_SYSV), @function
214*1fd5a2e1SPrashanth Swaminathan	.align	4
215*1fd5a2e1SPrashanth Swaminathan
216*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_closure_SYSV):
217*1fd5a2e1SPrashanth Swaminathan	CFI_STARTPROC()
218*1fd5a2e1SPrashanth Swaminathan	link	%fp,#-12
219*1fd5a2e1SPrashanth Swaminathan	CFI_OFFSET(14,-8)
220*1fd5a2e1SPrashanth Swaminathan	CFI_DEF_CFA(14,8)
221*1fd5a2e1SPrashanth Swaminathan	move.l	%sp,-12(%fp)
222*1fd5a2e1SPrashanth Swaminathan	pea	8(%fp)
223*1fd5a2e1SPrashanth Swaminathan	pea	-12(%fp)
224*1fd5a2e1SPrashanth Swaminathan	move.l	%a0,-(%sp)
225*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__
226*1fd5a2e1SPrashanth Swaminathan	jsr	CALLFUNC(ffi_closure_SYSV_inner)
227*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
228*1fd5a2e1SPrashanth Swaminathan	move.l  _current_shared_library_a5_offset_(%a5),%a0
229*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
230*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
231*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
232*1fd5a2e1SPrashanth Swaminathan	move.l  #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
233*1fd5a2e1SPrashanth Swaminathan	lea     (-6,%pc,%a0),%a0
234*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
235*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
236*1fd5a2e1SPrashanth Swaminathan#else
237*1fd5a2e1SPrashanth Swaminathan	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
238*1fd5a2e1SPrashanth Swaminathan#endif
239*1fd5a2e1SPrashanth Swaminathan
240*1fd5a2e1SPrashanth Swaminathan	lsr.l	#1,%d0
241*1fd5a2e1SPrashanth Swaminathan	jne	1f
242*1fd5a2e1SPrashanth Swaminathan	jcc	.Lcls_epilogue
243*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_INT
244*1fd5a2e1SPrashanth Swaminathan	move.l	-12(%fp),%d0
245*1fd5a2e1SPrashanth Swaminathan.Lcls_epilogue:
246*1fd5a2e1SPrashanth Swaminathan	| no CIF_FLAGS_*
247*1fd5a2e1SPrashanth Swaminathan	unlk	%fp
248*1fd5a2e1SPrashanth Swaminathan	rts
249*1fd5a2e1SPrashanth Swaminathan1:
250*1fd5a2e1SPrashanth Swaminathan	lea	-12(%fp),%a0
251*1fd5a2e1SPrashanth Swaminathan	lsr.l	#2,%d0
252*1fd5a2e1SPrashanth Swaminathan	jne	1f
253*1fd5a2e1SPrashanth Swaminathan	jcs	.Lcls_ret_float
254*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_DINT
255*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0)+,%d0
256*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d1
257*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
258*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_float:
259*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
260*1fd5a2e1SPrashanth Swaminathan	fmove.s	(%a0),%fp0
261*1fd5a2e1SPrashanth Swaminathan#else
262*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d0
263*1fd5a2e1SPrashanth Swaminathan#endif
264*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
265*1fd5a2e1SPrashanth Swaminathan1:
266*1fd5a2e1SPrashanth Swaminathan	lsr.l	#2,%d0
267*1fd5a2e1SPrashanth Swaminathan	jne	1f
268*1fd5a2e1SPrashanth Swaminathan	jcs	.Lcls_ret_ldouble
269*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_DOUBLE
270*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
271*1fd5a2e1SPrashanth Swaminathan	fmove.d	(%a0),%fp0
272*1fd5a2e1SPrashanth Swaminathan#else
273*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0)+,%d0
274*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d1
275*1fd5a2e1SPrashanth Swaminathan#endif
276*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
277*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_ldouble:
278*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__)
279*1fd5a2e1SPrashanth Swaminathan	fmove.x	(%a0),%fp0
280*1fd5a2e1SPrashanth Swaminathan#else
281*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0)+,%d0
282*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0)+,%d1
283*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d2
284*1fd5a2e1SPrashanth Swaminathan#endif
285*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
286*1fd5a2e1SPrashanth Swaminathan1:
287*1fd5a2e1SPrashanth Swaminathan	lsr.l	#2,%d0
288*1fd5a2e1SPrashanth Swaminathan	jne	1f
289*1fd5a2e1SPrashanth Swaminathan	jcs	.Lcls_ret_struct1
290*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_POINTER
291*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%a0
292*1fd5a2e1SPrashanth Swaminathan	move.l	%a0,%d0
293*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
294*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_struct1:
295*1fd5a2e1SPrashanth Swaminathan	move.b	(%a0),%d0
296*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
297*1fd5a2e1SPrashanth Swaminathan1:
298*1fd5a2e1SPrashanth Swaminathan	lsr.l	#2,%d0
299*1fd5a2e1SPrashanth Swaminathan	jne	1f
300*1fd5a2e1SPrashanth Swaminathan	jcs	.Lcls_ret_sint8
301*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_STRUCT2
302*1fd5a2e1SPrashanth Swaminathan	move.w	(%a0),%d0
303*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
304*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_sint8:
305*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d0
306*1fd5a2e1SPrashanth Swaminathan	| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
307*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
308*1fd5a2e1SPrashanth Swaminathan	ext.w	%d0
309*1fd5a2e1SPrashanth Swaminathan	ext.l	%d0
310*1fd5a2e1SPrashanth Swaminathan#else
311*1fd5a2e1SPrashanth Swaminathan	extb.l	%d0
312*1fd5a2e1SPrashanth Swaminathan#endif
313*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
314*1fd5a2e1SPrashanth Swaminathan1:
315*1fd5a2e1SPrashanth Swaminathan	| CIF_FLAGS_SINT16
316*1fd5a2e1SPrashanth Swaminathan	move.l	(%a0),%d0
317*1fd5a2e1SPrashanth Swaminathan	ext.l	%d0
318*1fd5a2e1SPrashanth Swaminathan	jra	.Lcls_epilogue
319*1fd5a2e1SPrashanth Swaminathan	CFI_ENDPROC()
320*1fd5a2e1SPrashanth Swaminathan
321*1fd5a2e1SPrashanth Swaminathan	.size	CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
322*1fd5a2e1SPrashanth Swaminathan
323*1fd5a2e1SPrashanth Swaminathan	.globl	CALLFUNC(ffi_closure_struct_SYSV)
324*1fd5a2e1SPrashanth Swaminathan	.type	CALLFUNC(ffi_closure_struct_SYSV), @function
325*1fd5a2e1SPrashanth Swaminathan	.align	4
326*1fd5a2e1SPrashanth Swaminathan
327*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_closure_struct_SYSV):
328*1fd5a2e1SPrashanth Swaminathan	CFI_STARTPROC()
329*1fd5a2e1SPrashanth Swaminathan	link	%fp,#0
330*1fd5a2e1SPrashanth Swaminathan	CFI_OFFSET(14,-8)
331*1fd5a2e1SPrashanth Swaminathan	CFI_DEF_CFA(14,8)
332*1fd5a2e1SPrashanth Swaminathan	move.l	%sp,-12(%fp)
333*1fd5a2e1SPrashanth Swaminathan	pea	8(%fp)
334*1fd5a2e1SPrashanth Swaminathan	move.l	%a1,-(%sp)
335*1fd5a2e1SPrashanth Swaminathan	move.l	%a0,-(%sp)
336*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__
337*1fd5a2e1SPrashanth Swaminathan	jsr	CALLFUNC(ffi_closure_SYSV_inner)
338*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
339*1fd5a2e1SPrashanth Swaminathan	move.l  _current_shared_library_a5_offset_(%a5),%a0
340*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
341*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
342*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
343*1fd5a2e1SPrashanth Swaminathan	move.l  #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
344*1fd5a2e1SPrashanth Swaminathan	lea     (-6,%pc,%a0),%a0
345*1fd5a2e1SPrashanth Swaminathan	move.l  CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
346*1fd5a2e1SPrashanth Swaminathan	jsr     (%a0)
347*1fd5a2e1SPrashanth Swaminathan#else
348*1fd5a2e1SPrashanth Swaminathan	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
349*1fd5a2e1SPrashanth Swaminathan#endif
350*1fd5a2e1SPrashanth Swaminathan	unlk	%fp
351*1fd5a2e1SPrashanth Swaminathan	rts
352*1fd5a2e1SPrashanth Swaminathan	CFI_ENDPROC()
353*1fd5a2e1SPrashanth Swaminathan	.size	CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
354*1fd5a2e1SPrashanth Swaminathan
355*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
356*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
357*1fd5a2e1SPrashanth Swaminathan#endif
358