xref: /aosp_15_r20/external/libffi/src/x86/freebsd.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
3*1fd5a2e1SPrashanth Swaminathan	       Copyright (c) 2008  Björn König
4*1fd5a2e1SPrashanth Swaminathan
5*1fd5a2e1SPrashanth Swaminathan   X86 Foreign Function Interface for FreeBSD
6*1fd5a2e1SPrashanth Swaminathan
7*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
8*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
9*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
10*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
11*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
12*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
13*1fd5a2e1SPrashanth Swaminathan   the following conditions:
14*1fd5a2e1SPrashanth Swaminathan
15*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
16*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
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#ifndef __x86_64__
29*1fd5a2e1SPrashanth Swaminathan
30*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
31*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
32*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
33*1fd5a2e1SPrashanth Swaminathan
34*1fd5a2e1SPrashanth Swaminathan.text
35*1fd5a2e1SPrashanth Swaminathan
36*1fd5a2e1SPrashanth Swaminathan.globl ffi_prep_args
37*1fd5a2e1SPrashanth Swaminathan
38*1fd5a2e1SPrashanth Swaminathan	.align 4
39*1fd5a2e1SPrashanth Swaminathan.globl ffi_call_SYSV
40*1fd5a2e1SPrashanth Swaminathan        .type    ffi_call_SYSV,@function
41*1fd5a2e1SPrashanth Swaminathan
42*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV:
43*1fd5a2e1SPrashanth Swaminathan.LFB1:
44*1fd5a2e1SPrashanth Swaminathan        pushl %ebp
45*1fd5a2e1SPrashanth Swaminathan.LCFI0:
46*1fd5a2e1SPrashanth Swaminathan        movl  %esp,%ebp
47*1fd5a2e1SPrashanth Swaminathan.LCFI1:
48*1fd5a2e1SPrashanth Swaminathan	/* Make room for all of the new args.  */
49*1fd5a2e1SPrashanth Swaminathan	movl  16(%ebp),%ecx
50*1fd5a2e1SPrashanth Swaminathan	subl  %ecx,%esp
51*1fd5a2e1SPrashanth Swaminathan
52*1fd5a2e1SPrashanth Swaminathan	/* Align the stack pointer to 16-bytes */
53*1fd5a2e1SPrashanth Swaminathan	andl  $0xfffffff0, %esp
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan	movl  %esp,%eax
56*1fd5a2e1SPrashanth Swaminathan
57*1fd5a2e1SPrashanth Swaminathan	/* Place all of the ffi_prep_args in position  */
58*1fd5a2e1SPrashanth Swaminathan	pushl 12(%ebp)
59*1fd5a2e1SPrashanth Swaminathan	pushl %eax
60*1fd5a2e1SPrashanth Swaminathan	call  *8(%ebp)
61*1fd5a2e1SPrashanth Swaminathan
62*1fd5a2e1SPrashanth Swaminathan	/* Return stack to previous state and call the function  */
63*1fd5a2e1SPrashanth Swaminathan	addl  $8,%esp
64*1fd5a2e1SPrashanth Swaminathan
65*1fd5a2e1SPrashanth Swaminathan	call  *28(%ebp)
66*1fd5a2e1SPrashanth Swaminathan
67*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the return type code  */
68*1fd5a2e1SPrashanth Swaminathan	movl  20(%ebp),%ecx
69*1fd5a2e1SPrashanth Swaminathan
70*1fd5a2e1SPrashanth Swaminathan	/* Protect %esi.  We're going to pop it in the epilogue.  */
71*1fd5a2e1SPrashanth Swaminathan	pushl %esi
72*1fd5a2e1SPrashanth Swaminathan
73*1fd5a2e1SPrashanth Swaminathan	/* If the return value pointer is NULL, assume no return value.  */
74*1fd5a2e1SPrashanth Swaminathan	cmpl  $0,24(%ebp)
75*1fd5a2e1SPrashanth Swaminathan	jne  0f
76*1fd5a2e1SPrashanth Swaminathan
77*1fd5a2e1SPrashanth Swaminathan	/* Even if there is no space for the return value, we are
78*1fd5a2e1SPrashanth Swaminathan	   obliged to handle floating-point values.  */
79*1fd5a2e1SPrashanth Swaminathan	cmpl  $FFI_TYPE_FLOAT,%ecx
80*1fd5a2e1SPrashanth Swaminathan	jne   noretval
81*1fd5a2e1SPrashanth Swaminathan	fstp  %st(0)
82*1fd5a2e1SPrashanth Swaminathan
83*1fd5a2e1SPrashanth Swaminathan        jmp   epilogue
84*1fd5a2e1SPrashanth Swaminathan
85*1fd5a2e1SPrashanth Swaminathan0:
86*1fd5a2e1SPrashanth Swaminathan	call  1f
87*1fd5a2e1SPrashanth Swaminathan
88*1fd5a2e1SPrashanth Swaminathan.Lstore_table:
89*1fd5a2e1SPrashanth Swaminathan	.long	noretval-.Lstore_table	/* FFI_TYPE_VOID */
90*1fd5a2e1SPrashanth Swaminathan	.long	retint-.Lstore_table	/* FFI_TYPE_INT */
91*1fd5a2e1SPrashanth Swaminathan	.long	retfloat-.Lstore_table	/* FFI_TYPE_FLOAT */
92*1fd5a2e1SPrashanth Swaminathan	.long	retdouble-.Lstore_table	/* FFI_TYPE_DOUBLE */
93*1fd5a2e1SPrashanth Swaminathan	.long	retlongdouble-.Lstore_table	/* FFI_TYPE_LONGDOUBLE */
94*1fd5a2e1SPrashanth Swaminathan	.long	retuint8-.Lstore_table	/* FFI_TYPE_UINT8 */
95*1fd5a2e1SPrashanth Swaminathan	.long	retsint8-.Lstore_table	/* FFI_TYPE_SINT8 */
96*1fd5a2e1SPrashanth Swaminathan	.long	retuint16-.Lstore_table	/* FFI_TYPE_UINT16 */
97*1fd5a2e1SPrashanth Swaminathan	.long	retsint16-.Lstore_table	/* FFI_TYPE_SINT16 */
98*1fd5a2e1SPrashanth Swaminathan	.long	retint-.Lstore_table	/* FFI_TYPE_UINT32 */
99*1fd5a2e1SPrashanth Swaminathan	.long	retint-.Lstore_table	/* FFI_TYPE_SINT32 */
100*1fd5a2e1SPrashanth Swaminathan	.long	retint64-.Lstore_table	/* FFI_TYPE_UINT64 */
101*1fd5a2e1SPrashanth Swaminathan	.long	retint64-.Lstore_table	/* FFI_TYPE_SINT64 */
102*1fd5a2e1SPrashanth Swaminathan	.long	retstruct-.Lstore_table	/* FFI_TYPE_STRUCT */
103*1fd5a2e1SPrashanth Swaminathan	.long	retint-.Lstore_table	/* FFI_TYPE_POINTER */
104*1fd5a2e1SPrashanth Swaminathan	.long   retstruct1b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_1B */
105*1fd5a2e1SPrashanth Swaminathan	.long   retstruct2b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_2B */
106*1fd5a2e1SPrashanth Swaminathan
107*1fd5a2e1SPrashanth Swaminathan1:
108*1fd5a2e1SPrashanth Swaminathan	pop  %esi
109*1fd5a2e1SPrashanth Swaminathan	add  (%esi, %ecx, 4), %esi
110*1fd5a2e1SPrashanth Swaminathan	jmp  *%esi
111*1fd5a2e1SPrashanth Swaminathan
112*1fd5a2e1SPrashanth Swaminathan	/* Sign/zero extend as appropriate.  */
113*1fd5a2e1SPrashanth Swaminathanretsint8:
114*1fd5a2e1SPrashanth Swaminathan	movsbl  %al, %eax
115*1fd5a2e1SPrashanth Swaminathan	jmp  retint
116*1fd5a2e1SPrashanth Swaminathan
117*1fd5a2e1SPrashanth Swaminathanretsint16:
118*1fd5a2e1SPrashanth Swaminathan	movswl  %ax, %eax
119*1fd5a2e1SPrashanth Swaminathan	jmp  retint
120*1fd5a2e1SPrashanth Swaminathan
121*1fd5a2e1SPrashanth Swaminathanretuint8:
122*1fd5a2e1SPrashanth Swaminathan	movzbl  %al, %eax
123*1fd5a2e1SPrashanth Swaminathan	jmp  retint
124*1fd5a2e1SPrashanth Swaminathan
125*1fd5a2e1SPrashanth Swaminathanretuint16:
126*1fd5a2e1SPrashanth Swaminathan	movzwl  %ax, %eax
127*1fd5a2e1SPrashanth Swaminathan	jmp  retint
128*1fd5a2e1SPrashanth Swaminathan
129*1fd5a2e1SPrashanth Swaminathanretfloat:
130*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
131*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
132*1fd5a2e1SPrashanth Swaminathan	fstps (%ecx)
133*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
134*1fd5a2e1SPrashanth Swaminathan
135*1fd5a2e1SPrashanth Swaminathanretdouble:
136*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
137*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
138*1fd5a2e1SPrashanth Swaminathan	fstpl (%ecx)
139*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
140*1fd5a2e1SPrashanth Swaminathan
141*1fd5a2e1SPrashanth Swaminathanretlongdouble:
142*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
143*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
144*1fd5a2e1SPrashanth Swaminathan	fstpt (%ecx)
145*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
146*1fd5a2e1SPrashanth Swaminathan
147*1fd5a2e1SPrashanth Swaminathanretint64:
148*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
149*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
150*1fd5a2e1SPrashanth Swaminathan	movl  %eax,0(%ecx)
151*1fd5a2e1SPrashanth Swaminathan	movl  %edx,4(%ecx)
152*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
153*1fd5a2e1SPrashanth Swaminathan
154*1fd5a2e1SPrashanth Swaminathanretstruct1b:
155*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
156*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
157*1fd5a2e1SPrashanth Swaminathan	movb  %al,0(%ecx)
158*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
159*1fd5a2e1SPrashanth Swaminathan
160*1fd5a2e1SPrashanth Swaminathanretstruct2b:
161*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
162*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
163*1fd5a2e1SPrashanth Swaminathan	movw  %ax,0(%ecx)
164*1fd5a2e1SPrashanth Swaminathan	jmp   epilogue
165*1fd5a2e1SPrashanth Swaminathan
166*1fd5a2e1SPrashanth Swaminathanretint:
167*1fd5a2e1SPrashanth Swaminathan	/* Load %ecx with the pointer to storage for the return value  */
168*1fd5a2e1SPrashanth Swaminathan	movl  24(%ebp),%ecx
169*1fd5a2e1SPrashanth Swaminathan	movl  %eax,0(%ecx)
170*1fd5a2e1SPrashanth Swaminathan
171*1fd5a2e1SPrashanth Swaminathanretstruct:
172*1fd5a2e1SPrashanth Swaminathan	/* Nothing to do!  */
173*1fd5a2e1SPrashanth Swaminathan
174*1fd5a2e1SPrashanth Swaminathannoretval:
175*1fd5a2e1SPrashanth Swaminathanepilogue:
176*1fd5a2e1SPrashanth Swaminathan        popl %esi
177*1fd5a2e1SPrashanth Swaminathan        movl %ebp,%esp
178*1fd5a2e1SPrashanth Swaminathan        popl %ebp
179*1fd5a2e1SPrashanth Swaminathan        ret
180*1fd5a2e1SPrashanth Swaminathan.LFE1:
181*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end:
182*1fd5a2e1SPrashanth Swaminathan        .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
183*1fd5a2e1SPrashanth Swaminathan
184*1fd5a2e1SPrashanth Swaminathan	.align	4
185*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN (ffi_closure_SYSV)
186*1fd5a2e1SPrashanth Swaminathan.globl ffi_closure_SYSV
187*1fd5a2e1SPrashanth Swaminathan	.type	ffi_closure_SYSV, @function
188*1fd5a2e1SPrashanth Swaminathan
189*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV:
190*1fd5a2e1SPrashanth Swaminathan.LFB2:
191*1fd5a2e1SPrashanth Swaminathan	pushl	%ebp
192*1fd5a2e1SPrashanth Swaminathan.LCFI2:
193*1fd5a2e1SPrashanth Swaminathan	movl	%esp, %ebp
194*1fd5a2e1SPrashanth Swaminathan.LCFI3:
195*1fd5a2e1SPrashanth Swaminathan	subl	$40, %esp
196*1fd5a2e1SPrashanth Swaminathan	leal	-24(%ebp), %edx
197*1fd5a2e1SPrashanth Swaminathan	movl	%edx, -12(%ebp)	/* resp */
198*1fd5a2e1SPrashanth Swaminathan	leal	8(%ebp), %edx
199*1fd5a2e1SPrashanth Swaminathan	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
200*1fd5a2e1SPrashanth Swaminathan	leal	-12(%ebp), %edx
201*1fd5a2e1SPrashanth Swaminathan	movl	%edx, (%esp)	/* &resp */
202*1fd5a2e1SPrashanth Swaminathan#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
203*1fd5a2e1SPrashanth Swaminathan	call	ffi_closure_SYSV_inner
204*1fd5a2e1SPrashanth Swaminathan#else
205*1fd5a2e1SPrashanth Swaminathan	movl	%ebx, 8(%esp)
206*1fd5a2e1SPrashanth Swaminathan.LCFI7:
207*1fd5a2e1SPrashanth Swaminathan	call	1f
208*1fd5a2e1SPrashanth Swaminathan1:	popl	%ebx
209*1fd5a2e1SPrashanth Swaminathan	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
210*1fd5a2e1SPrashanth Swaminathan	call	ffi_closure_SYSV_inner@PLT
211*1fd5a2e1SPrashanth Swaminathan	movl	8(%esp), %ebx
212*1fd5a2e1SPrashanth Swaminathan#endif
213*1fd5a2e1SPrashanth Swaminathan	movl	-12(%ebp), %ecx
214*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_INT, %eax
215*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retint
216*1fd5a2e1SPrashanth Swaminathan
217*1fd5a2e1SPrashanth Swaminathan	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
218*1fd5a2e1SPrashanth Swaminathan	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
219*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_UINT64, %eax
220*1fd5a2e1SPrashanth Swaminathan	jge	0f
221*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_UINT8, %eax
222*1fd5a2e1SPrashanth Swaminathan	jge	.Lcls_retint
223*1fd5a2e1SPrashanth Swaminathan
224*1fd5a2e1SPrashanth Swaminathan0:	cmpl	$FFI_TYPE_FLOAT, %eax
225*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retfloat
226*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_DOUBLE, %eax
227*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retdouble
228*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
229*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retldouble
230*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_SINT64, %eax
231*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retllong
232*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_SMALL_STRUCT_1B, %eax
233*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retstruct1b
234*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_SMALL_STRUCT_2B, %eax
235*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retstruct2b
236*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_STRUCT, %eax
237*1fd5a2e1SPrashanth Swaminathan	je	.Lcls_retstruct
238*1fd5a2e1SPrashanth Swaminathan.Lcls_epilogue:
239*1fd5a2e1SPrashanth Swaminathan	movl	%ebp, %esp
240*1fd5a2e1SPrashanth Swaminathan	popl	%ebp
241*1fd5a2e1SPrashanth Swaminathan	ret
242*1fd5a2e1SPrashanth Swaminathan.Lcls_retint:
243*1fd5a2e1SPrashanth Swaminathan	movl	(%ecx), %eax
244*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
245*1fd5a2e1SPrashanth Swaminathan.Lcls_retfloat:
246*1fd5a2e1SPrashanth Swaminathan	flds	(%ecx)
247*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
248*1fd5a2e1SPrashanth Swaminathan.Lcls_retdouble:
249*1fd5a2e1SPrashanth Swaminathan	fldl	(%ecx)
250*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
251*1fd5a2e1SPrashanth Swaminathan.Lcls_retldouble:
252*1fd5a2e1SPrashanth Swaminathan	fldt	(%ecx)
253*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
254*1fd5a2e1SPrashanth Swaminathan.Lcls_retllong:
255*1fd5a2e1SPrashanth Swaminathan	movl	(%ecx), %eax
256*1fd5a2e1SPrashanth Swaminathan	movl	4(%ecx), %edx
257*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
258*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct1b:
259*1fd5a2e1SPrashanth Swaminathan	movsbl	(%ecx), %eax
260*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
261*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct2b:
262*1fd5a2e1SPrashanth Swaminathan	movswl	(%ecx), %eax
263*1fd5a2e1SPrashanth Swaminathan	jmp	.Lcls_epilogue
264*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct:
265*1fd5a2e1SPrashanth Swaminathan	movl	%ebp, %esp
266*1fd5a2e1SPrashanth Swaminathan	popl	%ebp
267*1fd5a2e1SPrashanth Swaminathan	ret	$4
268*1fd5a2e1SPrashanth Swaminathan.LFE2:
269*1fd5a2e1SPrashanth Swaminathan	.size	ffi_closure_SYSV, .-ffi_closure_SYSV
270*1fd5a2e1SPrashanth Swaminathan
271*1fd5a2e1SPrashanth Swaminathan#if !FFI_NO_RAW_API
272*1fd5a2e1SPrashanth Swaminathan
273*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
274*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
275*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
276*1fd5a2e1SPrashanth Swaminathan#define CIF_FLAGS_OFFSET 20
277*1fd5a2e1SPrashanth Swaminathan
278*1fd5a2e1SPrashanth Swaminathan	.align	4
279*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN (ffi_closure_raw_SYSV)
280*1fd5a2e1SPrashanth Swaminathan.globl ffi_closure_raw_SYSV
281*1fd5a2e1SPrashanth Swaminathan	.type	ffi_closure_raw_SYSV, @function
282*1fd5a2e1SPrashanth Swaminathan
283*1fd5a2e1SPrashanth Swaminathanffi_closure_raw_SYSV:
284*1fd5a2e1SPrashanth Swaminathan.LFB3:
285*1fd5a2e1SPrashanth Swaminathan	pushl	%ebp
286*1fd5a2e1SPrashanth Swaminathan.LCFI4:
287*1fd5a2e1SPrashanth Swaminathan	movl	%esp, %ebp
288*1fd5a2e1SPrashanth Swaminathan.LCFI5:
289*1fd5a2e1SPrashanth Swaminathan	pushl	%esi
290*1fd5a2e1SPrashanth Swaminathan.LCFI6:
291*1fd5a2e1SPrashanth Swaminathan	subl	$36, %esp
292*1fd5a2e1SPrashanth Swaminathan	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
293*1fd5a2e1SPrashanth Swaminathan	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
294*1fd5a2e1SPrashanth Swaminathan	movl	%edx, 12(%esp)	/* user_data */
295*1fd5a2e1SPrashanth Swaminathan	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
296*1fd5a2e1SPrashanth Swaminathan	movl	%edx, 8(%esp)	/* raw_args */
297*1fd5a2e1SPrashanth Swaminathan	leal	-24(%ebp), %edx
298*1fd5a2e1SPrashanth Swaminathan	movl	%edx, 4(%esp)	/* &res */
299*1fd5a2e1SPrashanth Swaminathan	movl	%esi, (%esp)	/* cif */
300*1fd5a2e1SPrashanth Swaminathan	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
301*1fd5a2e1SPrashanth Swaminathan	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
302*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_INT, %eax
303*1fd5a2e1SPrashanth Swaminathan	je	.Lrcls_retint
304*1fd5a2e1SPrashanth Swaminathan
305*1fd5a2e1SPrashanth Swaminathan	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
306*1fd5a2e1SPrashanth Swaminathan	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
307*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_UINT64, %eax
308*1fd5a2e1SPrashanth Swaminathan	jge	0f
309*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_UINT8, %eax
310*1fd5a2e1SPrashanth Swaminathan	jge	.Lrcls_retint
311*1fd5a2e1SPrashanth Swaminathan0:
312*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_FLOAT, %eax
313*1fd5a2e1SPrashanth Swaminathan	je	.Lrcls_retfloat
314*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_DOUBLE, %eax
315*1fd5a2e1SPrashanth Swaminathan	je	.Lrcls_retdouble
316*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
317*1fd5a2e1SPrashanth Swaminathan	je	.Lrcls_retldouble
318*1fd5a2e1SPrashanth Swaminathan	cmpl	$FFI_TYPE_SINT64, %eax
319*1fd5a2e1SPrashanth Swaminathan	je	.Lrcls_retllong
320*1fd5a2e1SPrashanth Swaminathan.Lrcls_epilogue:
321*1fd5a2e1SPrashanth Swaminathan	addl	$36, %esp
322*1fd5a2e1SPrashanth Swaminathan	popl	%esi
323*1fd5a2e1SPrashanth Swaminathan	popl	%ebp
324*1fd5a2e1SPrashanth Swaminathan	ret
325*1fd5a2e1SPrashanth Swaminathan.Lrcls_retint:
326*1fd5a2e1SPrashanth Swaminathan	movl	-24(%ebp), %eax
327*1fd5a2e1SPrashanth Swaminathan	jmp	.Lrcls_epilogue
328*1fd5a2e1SPrashanth Swaminathan.Lrcls_retfloat:
329*1fd5a2e1SPrashanth Swaminathan	flds	-24(%ebp)
330*1fd5a2e1SPrashanth Swaminathan	jmp	.Lrcls_epilogue
331*1fd5a2e1SPrashanth Swaminathan.Lrcls_retdouble:
332*1fd5a2e1SPrashanth Swaminathan	fldl	-24(%ebp)
333*1fd5a2e1SPrashanth Swaminathan	jmp	.Lrcls_epilogue
334*1fd5a2e1SPrashanth Swaminathan.Lrcls_retldouble:
335*1fd5a2e1SPrashanth Swaminathan	fldt	-24(%ebp)
336*1fd5a2e1SPrashanth Swaminathan	jmp	.Lrcls_epilogue
337*1fd5a2e1SPrashanth Swaminathan.Lrcls_retllong:
338*1fd5a2e1SPrashanth Swaminathan	movl	-24(%ebp), %eax
339*1fd5a2e1SPrashanth Swaminathan	movl	-20(%ebp), %edx
340*1fd5a2e1SPrashanth Swaminathan	jmp	.Lrcls_epilogue
341*1fd5a2e1SPrashanth Swaminathan.LFE3:
342*1fd5a2e1SPrashanth Swaminathan	.size	ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
343*1fd5a2e1SPrashanth Swaminathan#endif
344*1fd5a2e1SPrashanth Swaminathan
345*1fd5a2e1SPrashanth Swaminathan	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
346*1fd5a2e1SPrashanth Swaminathan.Lframe1:
347*1fd5a2e1SPrashanth Swaminathan	.long	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
348*1fd5a2e1SPrashanth Swaminathan.LSCIE1:
349*1fd5a2e1SPrashanth Swaminathan	.long	0x0	/* CIE Identifier Tag */
350*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* CIE Version */
351*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
352*1fd5a2e1SPrashanth Swaminathan	.ascii "zR\0"	/* CIE Augmentation */
353*1fd5a2e1SPrashanth Swaminathan#else
354*1fd5a2e1SPrashanth Swaminathan	.ascii "\0"	/* CIE Augmentation */
355*1fd5a2e1SPrashanth Swaminathan#endif
356*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* .uleb128 0x1; CIE Code Alignment Factor */
357*1fd5a2e1SPrashanth Swaminathan	.byte	0x7c	/* .sleb128 -4; CIE Data Alignment Factor */
358*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* CIE RA Column */
359*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
360*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* .uleb128 0x1; Augmentation size */
361*1fd5a2e1SPrashanth Swaminathan	.byte	0x1b	/* FDE Encoding (pcrel sdata4) */
362*1fd5a2e1SPrashanth Swaminathan#endif
363*1fd5a2e1SPrashanth Swaminathan	.byte	0xc	/* DW_CFA_def_cfa */
364*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* .uleb128 0x4 */
365*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* .uleb128 0x4 */
366*1fd5a2e1SPrashanth Swaminathan	.byte	0x88	/* DW_CFA_offset, column 0x8 */
367*1fd5a2e1SPrashanth Swaminathan	.byte	0x1	/* .uleb128 0x1 */
368*1fd5a2e1SPrashanth Swaminathan	.align 4
369*1fd5a2e1SPrashanth Swaminathan.LECIE1:
370*1fd5a2e1SPrashanth Swaminathan.LSFDE1:
371*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE1-.LASFDE1	/* FDE Length */
372*1fd5a2e1SPrashanth Swaminathan.LASFDE1:
373*1fd5a2e1SPrashanth Swaminathan	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
374*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
375*1fd5a2e1SPrashanth Swaminathan	.long	.LFB1-.	/* FDE initial location */
376*1fd5a2e1SPrashanth Swaminathan#else
377*1fd5a2e1SPrashanth Swaminathan	.long	.LFB1	/* FDE initial location */
378*1fd5a2e1SPrashanth Swaminathan#endif
379*1fd5a2e1SPrashanth Swaminathan	.long	.LFE1-.LFB1	/* FDE address range */
380*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
381*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* .uleb128 0x0; Augmentation size */
382*1fd5a2e1SPrashanth Swaminathan#endif
383*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
384*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI0-.LFB1
385*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
386*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* .uleb128 0x8 */
387*1fd5a2e1SPrashanth Swaminathan	.byte	0x85	/* DW_CFA_offset, column 0x5 */
388*1fd5a2e1SPrashanth Swaminathan	.byte	0x2	/* .uleb128 0x2 */
389*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
390*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI1-.LCFI0
391*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
392*1fd5a2e1SPrashanth Swaminathan	.byte	0x5	/* .uleb128 0x5 */
393*1fd5a2e1SPrashanth Swaminathan	.align 4
394*1fd5a2e1SPrashanth Swaminathan.LEFDE1:
395*1fd5a2e1SPrashanth Swaminathan.LSFDE2:
396*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE2-.LASFDE2	/* FDE Length */
397*1fd5a2e1SPrashanth Swaminathan.LASFDE2:
398*1fd5a2e1SPrashanth Swaminathan	.long	.LASFDE2-.Lframe1	/* FDE CIE offset */
399*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
400*1fd5a2e1SPrashanth Swaminathan	.long	.LFB2-.	/* FDE initial location */
401*1fd5a2e1SPrashanth Swaminathan#else
402*1fd5a2e1SPrashanth Swaminathan	.long	.LFB2
403*1fd5a2e1SPrashanth Swaminathan#endif
404*1fd5a2e1SPrashanth Swaminathan	.long	.LFE2-.LFB2	/* FDE address range */
405*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
406*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* .uleb128 0x0; Augmentation size */
407*1fd5a2e1SPrashanth Swaminathan#endif
408*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
409*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI2-.LFB2
410*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
411*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* .uleb128 0x8 */
412*1fd5a2e1SPrashanth Swaminathan	.byte	0x85	/* DW_CFA_offset, column 0x5 */
413*1fd5a2e1SPrashanth Swaminathan	.byte	0x2	/* .uleb128 0x2 */
414*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
415*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI3-.LCFI2
416*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
417*1fd5a2e1SPrashanth Swaminathan	.byte	0x5	/* .uleb128 0x5 */
418*1fd5a2e1SPrashanth Swaminathan#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
419*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
420*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI7-.LCFI3
421*1fd5a2e1SPrashanth Swaminathan	.byte	0x83	/* DW_CFA_offset, column 0x3 */
422*1fd5a2e1SPrashanth Swaminathan	.byte	0xa	/* .uleb128 0xa */
423*1fd5a2e1SPrashanth Swaminathan#endif
424*1fd5a2e1SPrashanth Swaminathan	.align 4
425*1fd5a2e1SPrashanth Swaminathan.LEFDE2:
426*1fd5a2e1SPrashanth Swaminathan
427*1fd5a2e1SPrashanth Swaminathan#if !FFI_NO_RAW_API
428*1fd5a2e1SPrashanth Swaminathan
429*1fd5a2e1SPrashanth Swaminathan.LSFDE3:
430*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE3-.LASFDE3	/* FDE Length */
431*1fd5a2e1SPrashanth Swaminathan.LASFDE3:
432*1fd5a2e1SPrashanth Swaminathan	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
433*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
434*1fd5a2e1SPrashanth Swaminathan	.long	.LFB3-.	/* FDE initial location */
435*1fd5a2e1SPrashanth Swaminathan#else
436*1fd5a2e1SPrashanth Swaminathan	.long	.LFB3
437*1fd5a2e1SPrashanth Swaminathan#endif
438*1fd5a2e1SPrashanth Swaminathan	.long	.LFE3-.LFB3	/* FDE address range */
439*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__
440*1fd5a2e1SPrashanth Swaminathan	.byte	0x0	/* .uleb128 0x0; Augmentation size */
441*1fd5a2e1SPrashanth Swaminathan#endif
442*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
443*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI4-.LFB3
444*1fd5a2e1SPrashanth Swaminathan	.byte	0xe	/* DW_CFA_def_cfa_offset */
445*1fd5a2e1SPrashanth Swaminathan	.byte	0x8	/* .uleb128 0x8 */
446*1fd5a2e1SPrashanth Swaminathan	.byte	0x85	/* DW_CFA_offset, column 0x5 */
447*1fd5a2e1SPrashanth Swaminathan	.byte	0x2	/* .uleb128 0x2 */
448*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
449*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI5-.LCFI4
450*1fd5a2e1SPrashanth Swaminathan	.byte	0xd	/* DW_CFA_def_cfa_register */
451*1fd5a2e1SPrashanth Swaminathan	.byte	0x5	/* .uleb128 0x5 */
452*1fd5a2e1SPrashanth Swaminathan	.byte	0x4	/* DW_CFA_advance_loc4 */
453*1fd5a2e1SPrashanth Swaminathan	.long	.LCFI6-.LCFI5
454*1fd5a2e1SPrashanth Swaminathan	.byte	0x86	/* DW_CFA_offset, column 0x6 */
455*1fd5a2e1SPrashanth Swaminathan	.byte	0x3	/* .uleb128 0x3 */
456*1fd5a2e1SPrashanth Swaminathan	.align 4
457*1fd5a2e1SPrashanth Swaminathan.LEFDE3:
458*1fd5a2e1SPrashanth Swaminathan
459*1fd5a2e1SPrashanth Swaminathan#endif
460*1fd5a2e1SPrashanth Swaminathan
461*1fd5a2e1SPrashanth Swaminathan#endif /* ifndef __x86_64__ */
462*1fd5a2e1SPrashanth Swaminathan
463*1fd5a2e1SPrashanth Swaminathan	.section .note.GNU-stack,"",%progbits
464