xref: /aosp_15_r20/external/libffi/src/sparc/v8.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   v8.S - Copyright (c) 2013  The Written Word, Inc.
3*1fd5a2e1SPrashanth Swaminathan	  Copyright (c) 1996, 1997, 2003, 2004, 2008  Red Hat, Inc.
4*1fd5a2e1SPrashanth Swaminathan
5*1fd5a2e1SPrashanth Swaminathan   SPARC Foreign Function Interface
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#define LIBFFI_ASM
29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
31*1fd5a2e1SPrashanth Swaminathan#include "internal.h"
32*1fd5a2e1SPrashanth Swaminathan
33*1fd5a2e1SPrashanth Swaminathan#ifndef SPARC64
34*1fd5a2e1SPrashanth Swaminathan
35*1fd5a2e1SPrashanth Swaminathan#define C2(X, Y)  X ## Y
36*1fd5a2e1SPrashanth Swaminathan#define C1(X, Y)  C2(X, Y)
37*1fd5a2e1SPrashanth Swaminathan
38*1fd5a2e1SPrashanth Swaminathan#ifdef __USER_LABEL_PREFIX__
39*1fd5a2e1SPrashanth Swaminathan# define C(Y)	C1(__USER_LABEL_PREFIX__, Y)
40*1fd5a2e1SPrashanth Swaminathan#else
41*1fd5a2e1SPrashanth Swaminathan# define C(Y)	Y
42*1fd5a2e1SPrashanth Swaminathan#endif
43*1fd5a2e1SPrashanth Swaminathan#define L(Y)	C1(.L, Y)
44*1fd5a2e1SPrashanth Swaminathan
45*1fd5a2e1SPrashanth Swaminathan	.text
46*1fd5a2e1SPrashanth Swaminathan
47*1fd5a2e1SPrashanth Swaminathan#ifndef __GNUC__
48*1fd5a2e1SPrashanth Swaminathan        .align 8
49*1fd5a2e1SPrashanth Swaminathan	.globl	C(ffi_flush_icache)
50*1fd5a2e1SPrashanth Swaminathan	.type	C(ffi_flush_icache),#function
51*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(C(ffi_flush_icache))
52*1fd5a2e1SPrashanth Swaminathan
53*1fd5a2e1SPrashanth SwaminathanC(ffi_flush_icache):
54*1fd5a2e1SPrashanth Swaminathan1:	iflush %o0
55*1fd5a2e1SPrashanth Swaminathan	iflush %o+8
56*1fd5a2e1SPrashanth Swaminathan	nop
57*1fd5a2e1SPrashanth Swaminathan	nop
58*1fd5a2e1SPrashanth Swaminathan	nop
59*1fd5a2e1SPrashanth Swaminathan	nop
60*1fd5a2e1SPrashanth Swaminathan	nop
61*1fd5a2e1SPrashanth Swaminathan	retl
62*1fd5a2e1SPrashanth Swaminathan	 nop
63*1fd5a2e1SPrashanth Swaminathan	.size	C(ffi_flush_icache), . - C(ffi_flush_icache)
64*1fd5a2e1SPrashanth Swaminathan#endif
65*1fd5a2e1SPrashanth Swaminathan
66*1fd5a2e1SPrashanth Swaminathan#if defined(__sun__) && defined(__svr4__)
67*1fd5a2e1SPrashanth Swaminathan# define E(INDEX)	.align 16
68*1fd5a2e1SPrashanth Swaminathan#else
69*1fd5a2e1SPrashanth Swaminathan# define E(INDEX)	.align 16; .org 2b + INDEX * 16
70*1fd5a2e1SPrashanth Swaminathan#endif
71*1fd5a2e1SPrashanth Swaminathan
72*1fd5a2e1SPrashanth Swaminathan        .align 8
73*1fd5a2e1SPrashanth Swaminathan	.globl	C(ffi_call_v8)
74*1fd5a2e1SPrashanth Swaminathan	.type	C(ffi_call_v8),#function
75*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(C(ffi_call_v8))
76*1fd5a2e1SPrashanth Swaminathan
77*1fd5a2e1SPrashanth SwaminathanC(ffi_call_v8):
78*1fd5a2e1SPrashanth Swaminathan.LUW0:
79*1fd5a2e1SPrashanth Swaminathan	! Allocate a stack frame sized by ffi_call.
80*1fd5a2e1SPrashanth Swaminathan	save	%sp, %o4, %sp
81*1fd5a2e1SPrashanth Swaminathan.LUW1:
82*1fd5a2e1SPrashanth Swaminathan	mov	%i0, %o0		! copy cif
83*1fd5a2e1SPrashanth Swaminathan	add	%sp, 64+32, %o1		! load args area
84*1fd5a2e1SPrashanth Swaminathan	mov	%i2, %o2		! copy rvalue
85*1fd5a2e1SPrashanth Swaminathan	call	C(ffi_prep_args_v8)
86*1fd5a2e1SPrashanth Swaminathan	 mov	%i3, %o3		! copy avalue
87*1fd5a2e1SPrashanth Swaminathan
88*1fd5a2e1SPrashanth Swaminathan	add	%sp, 32, %sp		! deallocate prep frame
89*1fd5a2e1SPrashanth Swaminathan	and	%o0, SPARC_FLAG_RET_MASK, %l0	! save return type
90*1fd5a2e1SPrashanth Swaminathan	srl	%o0, SPARC_SIZEMASK_SHIFT, %l1	! save return size
91*1fd5a2e1SPrashanth Swaminathan	ld	[%sp+64+4], %o0		! load all argument registers
92*1fd5a2e1SPrashanth Swaminathan	ld	[%sp+64+8], %o1
93*1fd5a2e1SPrashanth Swaminathan	ld	[%sp+64+12], %o2
94*1fd5a2e1SPrashanth Swaminathan	ld	[%sp+64+16], %o3
95*1fd5a2e1SPrashanth Swaminathan	cmp	%l0, SPARC_RET_STRUCT	! struct return needs an unimp 4
96*1fd5a2e1SPrashanth Swaminathan	ld	[%sp+64+20], %o4
97*1fd5a2e1SPrashanth Swaminathan	be	8f
98*1fd5a2e1SPrashanth Swaminathan	 ld	[%sp+64+24], %o5
99*1fd5a2e1SPrashanth Swaminathan
100*1fd5a2e1SPrashanth Swaminathan	! Call foreign function
101*1fd5a2e1SPrashanth Swaminathan	call	%i1
102*1fd5a2e1SPrashanth Swaminathan	 mov	%i5, %g2		! load static chain
103*1fd5a2e1SPrashanth Swaminathan
104*1fd5a2e1SPrashanth Swaminathan0:	call	1f		! load pc in %o7
105*1fd5a2e1SPrashanth Swaminathan	 sll	%l0, 4, %l0
106*1fd5a2e1SPrashanth Swaminathan1:	add	%o7, %l0, %o7	! o7 = 0b + ret_type*16
107*1fd5a2e1SPrashanth Swaminathan	jmp	%o7+(2f-0b)
108*1fd5a2e1SPrashanth Swaminathan	 nop
109*1fd5a2e1SPrashanth Swaminathan
110*1fd5a2e1SPrashanth Swaminathan	! Note that each entry is 4 insns, enforced by the E macro.
111*1fd5a2e1SPrashanth Swaminathan	.align	16
112*1fd5a2e1SPrashanth Swaminathan2:
113*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_VOID)
114*1fd5a2e1SPrashanth Swaminathan	ret
115*1fd5a2e1SPrashanth Swaminathan	 restore
116*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_STRUCT)
117*1fd5a2e1SPrashanth Swaminathan	unimp
118*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT8)
119*1fd5a2e1SPrashanth Swaminathan	and	%o0, 0xff, %o0
120*1fd5a2e1SPrashanth Swaminathan	st	%o0, [%i2]
121*1fd5a2e1SPrashanth Swaminathan	ret
122*1fd5a2e1SPrashanth Swaminathan	 restore
123*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT8)
124*1fd5a2e1SPrashanth Swaminathan	sll	%o0, 24, %o0
125*1fd5a2e1SPrashanth Swaminathan	b	7f
126*1fd5a2e1SPrashanth Swaminathan	 sra	%o0, 24, %o0
127*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT16)
128*1fd5a2e1SPrashanth Swaminathan	sll	%o0, 16, %o0
129*1fd5a2e1SPrashanth Swaminathan	b	7f
130*1fd5a2e1SPrashanth Swaminathan	 srl	%o0, 16, %o0
131*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT16)
132*1fd5a2e1SPrashanth Swaminathan	sll	%o0, 16, %o0
133*1fd5a2e1SPrashanth Swaminathan	b	7f
134*1fd5a2e1SPrashanth Swaminathan	 sra	%o0, 16, %o0
135*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT32)
136*1fd5a2e1SPrashanth Swaminathan7:	st	%o0, [%i2]
137*1fd5a2e1SPrashanth Swaminathan	ret
138*1fd5a2e1SPrashanth Swaminathan	 restore
139*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX16)
140*1fd5a2e1SPrashanth Swaminathan	sth	%o0, [%i2+2]
141*1fd5a2e1SPrashanth Swaminathan	b	9f
142*1fd5a2e1SPrashanth Swaminathan	 srl	%o0, 16, %o0
143*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT64)
144*1fd5a2e1SPrashanth Swaminathan	st	%o0, [%i2]
145*1fd5a2e1SPrashanth Swaminathan	st	%o1, [%i2+4]
146*1fd5a2e1SPrashanth Swaminathan	ret
147*1fd5a2e1SPrashanth Swaminathan	 restore
148*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT128)
149*1fd5a2e1SPrashanth Swaminathan	std	%o0, [%i2]
150*1fd5a2e1SPrashanth Swaminathan	std	%o2, [%i2+8]
151*1fd5a2e1SPrashanth Swaminathan	ret
152*1fd5a2e1SPrashanth Swaminathan	 restore
153*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_8)
154*1fd5a2e1SPrashanth Swaminathan	st	%f7, [%i2+7*4]
155*1fd5a2e1SPrashanth Swaminathan	nop
156*1fd5a2e1SPrashanth Swaminathan	st	%f6, [%i2+6*4]
157*1fd5a2e1SPrashanth Swaminathan	nop
158*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_6)
159*1fd5a2e1SPrashanth Swaminathan	st	%f5, [%i2+5*4]
160*1fd5a2e1SPrashanth Swaminathan	nop
161*1fd5a2e1SPrashanth Swaminathan	st	%f4, [%i2+4*4]
162*1fd5a2e1SPrashanth Swaminathan	nop
163*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_4)
164*1fd5a2e1SPrashanth Swaminathan	st	%f3, [%i2+3*4]
165*1fd5a2e1SPrashanth Swaminathan	nop
166*1fd5a2e1SPrashanth Swaminathan	st	%f2, [%i2+2*4]
167*1fd5a2e1SPrashanth Swaminathan	nop
168*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_2)
169*1fd5a2e1SPrashanth Swaminathan	st	%f1, [%i2+4]
170*1fd5a2e1SPrashanth Swaminathan	st	%f0, [%i2]
171*1fd5a2e1SPrashanth Swaminathan	ret
172*1fd5a2e1SPrashanth Swaminathan	 restore
173*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX8)
174*1fd5a2e1SPrashanth Swaminathan	stb	%o0, [%i2+1]
175*1fd5a2e1SPrashanth Swaminathan	b	0f
176*1fd5a2e1SPrashanth Swaminathan	 srl	%o0, 8, %o0
177*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_1)
178*1fd5a2e1SPrashanth Swaminathan	st	%f0, [%i2]
179*1fd5a2e1SPrashanth Swaminathan	ret
180*1fd5a2e1SPrashanth Swaminathan	 restore
181*1fd5a2e1SPrashanth Swaminathan
182*1fd5a2e1SPrashanth Swaminathan	.align	8
183*1fd5a2e1SPrashanth Swaminathan9:	sth	%o0, [%i2]
184*1fd5a2e1SPrashanth Swaminathan	ret
185*1fd5a2e1SPrashanth Swaminathan	 restore
186*1fd5a2e1SPrashanth Swaminathan	.align	8
187*1fd5a2e1SPrashanth Swaminathan0:	stb	%o0, [%i2]
188*1fd5a2e1SPrashanth Swaminathan	ret
189*1fd5a2e1SPrashanth Swaminathan	 restore
190*1fd5a2e1SPrashanth Swaminathan
191*1fd5a2e1SPrashanth Swaminathan	! Struct returning functions expect and skip the unimp here.
192*1fd5a2e1SPrashanth Swaminathan	! To make it worse, conforming callees examine the unimp and
193*1fd5a2e1SPrashanth Swaminathan	! make sure the low 12 bits of the unimp match the size of
194*1fd5a2e1SPrashanth Swaminathan	! the struct being returned.
195*1fd5a2e1SPrashanth Swaminathan	.align	8
196*1fd5a2e1SPrashanth Swaminathan8:	call	1f				! load pc in %o7
197*1fd5a2e1SPrashanth Swaminathan	 sll	%l1, 2, %l0			! size * 4
198*1fd5a2e1SPrashanth Swaminathan1:	sll	%l1, 4, %l1			! size * 16
199*1fd5a2e1SPrashanth Swaminathan	add	%l0, %l1, %l0			! size * 20
200*1fd5a2e1SPrashanth Swaminathan	add	%o7, %l0, %o7			! o7 = 8b + size*20
201*1fd5a2e1SPrashanth Swaminathan	jmp	%o7+(2f-8b)
202*1fd5a2e1SPrashanth Swaminathan	 mov	%i5, %g2			! load static chain
203*1fd5a2e1SPrashanth Swaminathan2:
204*1fd5a2e1SPrashanth Swaminathan
205*1fd5a2e1SPrashanth Swaminathan/* The Sun assembler doesn't understand .rept 0x1000.  */
206*1fd5a2e1SPrashanth Swaminathan#define rept1			\
207*1fd5a2e1SPrashanth Swaminathan	call	%i1;		\
208*1fd5a2e1SPrashanth Swaminathan	 nop;			\
209*1fd5a2e1SPrashanth Swaminathan	unimp	(. - 2b) / 20;	\
210*1fd5a2e1SPrashanth Swaminathan	ret;			\
211*1fd5a2e1SPrashanth Swaminathan	 restore
212*1fd5a2e1SPrashanth Swaminathan
213*1fd5a2e1SPrashanth Swaminathan#define rept16				\
214*1fd5a2e1SPrashanth Swaminathan	rept1; rept1; rept1; rept1;	\
215*1fd5a2e1SPrashanth Swaminathan	rept1; rept1; rept1; rept1;	\
216*1fd5a2e1SPrashanth Swaminathan	rept1; rept1; rept1; rept1;	\
217*1fd5a2e1SPrashanth Swaminathan	rept1; rept1; rept1; rept1
218*1fd5a2e1SPrashanth Swaminathan
219*1fd5a2e1SPrashanth Swaminathan#define rept256				\
220*1fd5a2e1SPrashanth Swaminathan	rept16; rept16; rept16; rept16;	\
221*1fd5a2e1SPrashanth Swaminathan	rept16; rept16; rept16; rept16;	\
222*1fd5a2e1SPrashanth Swaminathan	rept16; rept16; rept16; rept16;	\
223*1fd5a2e1SPrashanth Swaminathan	rept16; rept16; rept16; rept16
224*1fd5a2e1SPrashanth Swaminathan
225*1fd5a2e1SPrashanth Swaminathan	rept256; rept256; rept256; rept256
226*1fd5a2e1SPrashanth Swaminathan	rept256; rept256; rept256; rept256
227*1fd5a2e1SPrashanth Swaminathan	rept256; rept256; rept256; rept256
228*1fd5a2e1SPrashanth Swaminathan	rept256; rept256; rept256; rept256
229*1fd5a2e1SPrashanth Swaminathan
230*1fd5a2e1SPrashanth Swaminathan.LUW2:
231*1fd5a2e1SPrashanth Swaminathan	.size	C(ffi_call_v8),. - C(ffi_call_v8)
232*1fd5a2e1SPrashanth Swaminathan
233*1fd5a2e1SPrashanth Swaminathan
234*1fd5a2e1SPrashanth Swaminathan/* 16*4 register window + 1*4 struct return + 6*4 args backing store
235*1fd5a2e1SPrashanth Swaminathan   + 8*4 return storage + 1*4 alignment.  */
236*1fd5a2e1SPrashanth Swaminathan#define	STACKFRAME	(16*4 + 4 + 6*4 + 8*4 + 4)
237*1fd5a2e1SPrashanth Swaminathan
238*1fd5a2e1SPrashanth Swaminathan/* ffi_closure_v8(...)
239*1fd5a2e1SPrashanth Swaminathan
240*1fd5a2e1SPrashanth Swaminathan   Receives the closure argument in %g2.   */
241*1fd5a2e1SPrashanth Swaminathan
242*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_REGISTER_PSEUDO_OP
243*1fd5a2e1SPrashanth Swaminathan	.register	%g2, #scratch
244*1fd5a2e1SPrashanth Swaminathan#endif
245*1fd5a2e1SPrashanth Swaminathan
246*1fd5a2e1SPrashanth Swaminathan	.align 8
247*1fd5a2e1SPrashanth Swaminathan	.globl	C(ffi_go_closure_v8)
248*1fd5a2e1SPrashanth Swaminathan	.type	C(ffi_go_closure_v8),#function
249*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(C(ffi_go_closure_v8))
250*1fd5a2e1SPrashanth Swaminathan
251*1fd5a2e1SPrashanth SwaminathanC(ffi_go_closure_v8):
252*1fd5a2e1SPrashanth Swaminathan.LUW3:
253*1fd5a2e1SPrashanth Swaminathan	save	%sp, -STACKFRAME, %sp
254*1fd5a2e1SPrashanth Swaminathan.LUW4:
255*1fd5a2e1SPrashanth Swaminathan	ld	[%g2+4], %o0			! load cif
256*1fd5a2e1SPrashanth Swaminathan	ld	[%g2+8], %o1			! load fun
257*1fd5a2e1SPrashanth Swaminathan	b	0f
258*1fd5a2e1SPrashanth Swaminathan	 mov	%g2, %o2			! load user_data
259*1fd5a2e1SPrashanth Swaminathan.LUW5:
260*1fd5a2e1SPrashanth Swaminathan	.size	C(ffi_go_closure_v8), . - C(ffi_go_closure_v8)
261*1fd5a2e1SPrashanth Swaminathan
262*1fd5a2e1SPrashanth Swaminathan	.align 8
263*1fd5a2e1SPrashanth Swaminathan	.globl	C(ffi_closure_v8)
264*1fd5a2e1SPrashanth Swaminathan	.type	C(ffi_closure_v8),#function
265*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(C(ffi_closure_v8))
266*1fd5a2e1SPrashanth Swaminathan
267*1fd5a2e1SPrashanth SwaminathanC(ffi_closure_v8):
268*1fd5a2e1SPrashanth Swaminathan.LUW6:
269*1fd5a2e1SPrashanth Swaminathan	save	%sp, -STACKFRAME, %sp
270*1fd5a2e1SPrashanth Swaminathan.LUW7:
271*1fd5a2e1SPrashanth Swaminathan	ld	[%g2+FFI_TRAMPOLINE_SIZE], %o0		! load cif
272*1fd5a2e1SPrashanth Swaminathan	ld	[%g2+FFI_TRAMPOLINE_SIZE+4], %o1	! load fun
273*1fd5a2e1SPrashanth Swaminathan	ld	[%g2+FFI_TRAMPOLINE_SIZE+8], %o2	! load user_data
274*1fd5a2e1SPrashanth Swaminathan0:
275*1fd5a2e1SPrashanth Swaminathan	! Store all of the potential argument registers in va_list format.
276*1fd5a2e1SPrashanth Swaminathan	st	%i0, [%fp+68+0]
277*1fd5a2e1SPrashanth Swaminathan	st	%i1, [%fp+68+4]
278*1fd5a2e1SPrashanth Swaminathan	st	%i2, [%fp+68+8]
279*1fd5a2e1SPrashanth Swaminathan	st	%i3, [%fp+68+12]
280*1fd5a2e1SPrashanth Swaminathan	st	%i4, [%fp+68+16]
281*1fd5a2e1SPrashanth Swaminathan	st	%i5, [%fp+68+20]
282*1fd5a2e1SPrashanth Swaminathan
283*1fd5a2e1SPrashanth Swaminathan	! Call ffi_closure_sparc_inner to do the bulk of the work.
284*1fd5a2e1SPrashanth Swaminathan	add	%fp, -8*4, %o3
285*1fd5a2e1SPrashanth Swaminathan	call	ffi_closure_sparc_inner_v8
286*1fd5a2e1SPrashanth Swaminathan	 add	%fp,  64, %o4
287*1fd5a2e1SPrashanth Swaminathan
288*1fd5a2e1SPrashanth Swaminathan0:	call	1f
289*1fd5a2e1SPrashanth Swaminathan	 and	%o0, SPARC_FLAG_RET_MASK, %o0
290*1fd5a2e1SPrashanth Swaminathan1:	sll	%o0, 4, %o0	! o0 = o0 * 16
291*1fd5a2e1SPrashanth Swaminathan	add	%o7, %o0, %o7	! o7 = 0b + o0*16
292*1fd5a2e1SPrashanth Swaminathan	jmp	%o7+(2f-0b)
293*1fd5a2e1SPrashanth Swaminathan	 add	%fp, -8*4, %i2
294*1fd5a2e1SPrashanth Swaminathan
295*1fd5a2e1SPrashanth Swaminathan	! Note that each entry is 4 insns, enforced by the E macro.
296*1fd5a2e1SPrashanth Swaminathan	.align	16
297*1fd5a2e1SPrashanth Swaminathan2:
298*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_VOID)
299*1fd5a2e1SPrashanth Swaminathan	ret
300*1fd5a2e1SPrashanth Swaminathan	 restore
301*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_STRUCT)
302*1fd5a2e1SPrashanth Swaminathan	ld	[%i2], %i0
303*1fd5a2e1SPrashanth Swaminathan	jmp	%i7+12
304*1fd5a2e1SPrashanth Swaminathan	 restore
305*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT8)
306*1fd5a2e1SPrashanth Swaminathan	ldub	[%i2+3], %i0
307*1fd5a2e1SPrashanth Swaminathan	ret
308*1fd5a2e1SPrashanth Swaminathan	 restore
309*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT8)
310*1fd5a2e1SPrashanth Swaminathan	ldsb	[%i2+3], %i0
311*1fd5a2e1SPrashanth Swaminathan	ret
312*1fd5a2e1SPrashanth Swaminathan	 restore
313*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT16)
314*1fd5a2e1SPrashanth Swaminathan	lduh	[%i2+2], %i0
315*1fd5a2e1SPrashanth Swaminathan	ret
316*1fd5a2e1SPrashanth Swaminathan	 restore
317*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT16)
318*1fd5a2e1SPrashanth Swaminathan	ldsh	[%i2+2], %i0
319*1fd5a2e1SPrashanth Swaminathan	ret
320*1fd5a2e1SPrashanth Swaminathan	 restore
321*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT32)
322*1fd5a2e1SPrashanth Swaminathan	ld	[%i2], %i0
323*1fd5a2e1SPrashanth Swaminathan	ret
324*1fd5a2e1SPrashanth Swaminathan	 restore
325*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX16)
326*1fd5a2e1SPrashanth Swaminathan	ld	[%i2], %i0
327*1fd5a2e1SPrashanth Swaminathan	ret
328*1fd5a2e1SPrashanth Swaminathan	 restore
329*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT64)
330*1fd5a2e1SPrashanth Swaminathan	ldd	[%i2], %i0
331*1fd5a2e1SPrashanth Swaminathan	ret
332*1fd5a2e1SPrashanth Swaminathan	 restore
333*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT128)
334*1fd5a2e1SPrashanth Swaminathan	ldd	[%i2], %i0
335*1fd5a2e1SPrashanth Swaminathan	ldd	[%i2+8], %i2
336*1fd5a2e1SPrashanth Swaminathan	ret
337*1fd5a2e1SPrashanth Swaminathan	 restore
338*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_8)
339*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+7*4], %f7
340*1fd5a2e1SPrashanth Swaminathan	nop
341*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+6*4], %f6
342*1fd5a2e1SPrashanth Swaminathan	nop
343*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_6)
344*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+5*4], %f5
345*1fd5a2e1SPrashanth Swaminathan	nop
346*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+4*4], %f4
347*1fd5a2e1SPrashanth Swaminathan	nop
348*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_4)
349*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+3*4], %f3
350*1fd5a2e1SPrashanth Swaminathan	nop
351*1fd5a2e1SPrashanth Swaminathan	ld	[%i2+2*4], %f2
352*1fd5a2e1SPrashanth Swaminathan	nop
353*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_2)
354*1fd5a2e1SPrashanth Swaminathan	ldd	[%i2], %f0
355*1fd5a2e1SPrashanth Swaminathan	ret
356*1fd5a2e1SPrashanth Swaminathan	 restore
357*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX8)
358*1fd5a2e1SPrashanth Swaminathan	lduh	[%i2], %i0
359*1fd5a2e1SPrashanth Swaminathan	ret
360*1fd5a2e1SPrashanth Swaminathan	 restore
361*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_1)
362*1fd5a2e1SPrashanth Swaminathan	ld	[%i2], %f0
363*1fd5a2e1SPrashanth Swaminathan	ret
364*1fd5a2e1SPrashanth Swaminathan	 restore
365*1fd5a2e1SPrashanth Swaminathan
366*1fd5a2e1SPrashanth Swaminathan.LUW8:
367*1fd5a2e1SPrashanth Swaminathan	.size	C(ffi_closure_v8), . - C(ffi_closure_v8)
368*1fd5a2e1SPrashanth Swaminathan
369*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_RO_EH_FRAME
370*1fd5a2e1SPrashanth Swaminathan        .section        ".eh_frame",#alloc
371*1fd5a2e1SPrashanth Swaminathan#else
372*1fd5a2e1SPrashanth Swaminathan        .section        ".eh_frame",#alloc,#write
373*1fd5a2e1SPrashanth Swaminathan#endif
374*1fd5a2e1SPrashanth Swaminathan
375*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_SPARC_UA_PCREL
376*1fd5a2e1SPrashanth Swaminathan# define FDE_ADDR(X)	%r_disp32(X)
377*1fd5a2e1SPrashanth Swaminathan#else
378*1fd5a2e1SPrashanth Swaminathan# define FDE_ADDR(X)	X
379*1fd5a2e1SPrashanth Swaminathan#endif
380*1fd5a2e1SPrashanth Swaminathan
381*1fd5a2e1SPrashanth Swaminathan	.align 4
382*1fd5a2e1SPrashanth Swaminathan.LCIE:
383*1fd5a2e1SPrashanth Swaminathan	.long	.LECIE - .LSCIE		! CIE Length
384*1fd5a2e1SPrashanth Swaminathan.LSCIE:
385*1fd5a2e1SPrashanth Swaminathan	.long	0			! CIE Identifier Tag
386*1fd5a2e1SPrashanth Swaminathan	.byte	1			! CIE Version
387*1fd5a2e1SPrashanth Swaminathan	.ascii	"zR\0"			! CIE Augmentation
388*1fd5a2e1SPrashanth Swaminathan	.byte	4			! CIE Code Alignment Factor
389*1fd5a2e1SPrashanth Swaminathan	.byte	0x7c			! CIE Data Alignment Factor
390*1fd5a2e1SPrashanth Swaminathan	.byte	15			! CIE RA Column
391*1fd5a2e1SPrashanth Swaminathan	.byte	1			! Augmentation size
392*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_SPARC_UA_PCREL
393*1fd5a2e1SPrashanth Swaminathan	.byte	0x1b			! FDE Encoding (pcrel sdata4)
394*1fd5a2e1SPrashanth Swaminathan#else
395*1fd5a2e1SPrashanth Swaminathan	.byte	0x50			! FDE Encoding (aligned absolute)
396*1fd5a2e1SPrashanth Swaminathan#endif
397*1fd5a2e1SPrashanth Swaminathan	.byte	0xc, 14, 0		! DW_CFA_def_cfa, %o6, offset 0
398*1fd5a2e1SPrashanth Swaminathan	.align	4
399*1fd5a2e1SPrashanth Swaminathan.LECIE:
400*1fd5a2e1SPrashanth Swaminathan
401*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE1 - .LSFDE1	! FDE Length
402*1fd5a2e1SPrashanth Swaminathan.LSFDE1:
403*1fd5a2e1SPrashanth Swaminathan	.long	.LSFDE1 - .LCIE		! FDE CIE offset
404*1fd5a2e1SPrashanth Swaminathan	.long	FDE_ADDR(.LUW0)		! Initial location
405*1fd5a2e1SPrashanth Swaminathan	.long	.LUW2 - .LUW0		! Address range
406*1fd5a2e1SPrashanth Swaminathan	.byte	0			! Augmentation size
407*1fd5a2e1SPrashanth Swaminathan	.byte	0x40+1			! DW_CFA_advance_loc 4
408*1fd5a2e1SPrashanth Swaminathan	.byte	0xd, 30			! DW_CFA_def_cfa_register, %i6
409*1fd5a2e1SPrashanth Swaminathan	.byte	0x2d			! DW_CFA_GNU_window_save
410*1fd5a2e1SPrashanth Swaminathan	.byte	0x9, 15, 31		! DW_CFA_register, %o7, %i7
411*1fd5a2e1SPrashanth Swaminathan	.align	4
412*1fd5a2e1SPrashanth Swaminathan.LEFDE1:
413*1fd5a2e1SPrashanth Swaminathan
414*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE2 - .LSFDE2	! FDE Length
415*1fd5a2e1SPrashanth Swaminathan.LSFDE2:
416*1fd5a2e1SPrashanth Swaminathan	.long	.LSFDE2 - .LCIE		! FDE CIE offset
417*1fd5a2e1SPrashanth Swaminathan	.long	FDE_ADDR(.LUW3)		! Initial location
418*1fd5a2e1SPrashanth Swaminathan	.long	.LUW5 - .LUW3		! Address range
419*1fd5a2e1SPrashanth Swaminathan	.byte	0			! Augmentation size
420*1fd5a2e1SPrashanth Swaminathan	.byte	0x40+1			! DW_CFA_advance_loc 4
421*1fd5a2e1SPrashanth Swaminathan	.byte	0xd, 30			! DW_CFA_def_cfa_register, %i6
422*1fd5a2e1SPrashanth Swaminathan	.byte	0x2d			! DW_CFA_GNU_window_save
423*1fd5a2e1SPrashanth Swaminathan	.byte	0x9, 15, 31		! DW_CFA_register, %o7, %i7
424*1fd5a2e1SPrashanth Swaminathan	.align	4
425*1fd5a2e1SPrashanth Swaminathan.LEFDE2:
426*1fd5a2e1SPrashanth Swaminathan
427*1fd5a2e1SPrashanth Swaminathan	.long	.LEFDE3 - .LSFDE3	! FDE Length
428*1fd5a2e1SPrashanth Swaminathan.LSFDE3:
429*1fd5a2e1SPrashanth Swaminathan	.long	.LSFDE3 - .LCIE		! FDE CIE offset
430*1fd5a2e1SPrashanth Swaminathan	.long	FDE_ADDR(.LUW6)		! Initial location
431*1fd5a2e1SPrashanth Swaminathan	.long	.LUW8 - .LUW6		! Address range
432*1fd5a2e1SPrashanth Swaminathan	.byte	0			! Augmentation size
433*1fd5a2e1SPrashanth Swaminathan	.byte	0x40+1			! DW_CFA_advance_loc 4
434*1fd5a2e1SPrashanth Swaminathan	.byte	0xd, 30			! DW_CFA_def_cfa_register, %i6
435*1fd5a2e1SPrashanth Swaminathan	.byte	0x2d			! DW_CFA_GNU_window_save
436*1fd5a2e1SPrashanth Swaminathan	.byte	0x9, 15, 31		! DW_CFA_register, %o7, %i7
437*1fd5a2e1SPrashanth Swaminathan	.align	4
438*1fd5a2e1SPrashanth Swaminathan.LEFDE3:
439*1fd5a2e1SPrashanth Swaminathan
440*1fd5a2e1SPrashanth Swaminathan#endif /* !SPARC64 */
441*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
442*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
443*1fd5a2e1SPrashanth Swaminathan#endif
444