1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* -----------------------------------------------------------------------
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc.
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   SPARC 64-bit Foreign Function Interface
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Permission is hereby granted, free of charge, to any person obtaining
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   a copy of this software and associated documentation files (the
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ``Software''), to deal in the Software without restriction, including
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   without limitation the rights to use, copy, modify, merge, publish,
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   distribute, sublicense, and/or sell copies of the Software, and to
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   permit persons to whom the Software is furnished to do so, subject to
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   the following conditions:
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   The above copyright notice and this permission notice shall be included
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   in all copies or substantial portions of the Software.
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   DEALINGS IN THE SOFTWARE.
25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ----------------------------------------------------------------------- */
26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define LIBFFI_ASM
28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include <fficonfig.h>
29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include <ffi.h>
30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef SPARC64
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Only compile this in for 64bit builds, because otherwise the object file
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   will have inproper architecture due to used instructions.  */
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define STACKFRAME 128		/* Minimum stack framesize for SPARC */
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define STACK_BIAS 2047
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ARGS (128)		/* Offset of register area in frame */
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.text
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project        .align 8
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.globl ffi_call_v9
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.globl _ffi_call_v9
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectffi_call_v9:
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project_ffi_call_v9:
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLFB1:
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	save	%sp, -STACKFRAME, %sp
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLCFI0:
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	sub	%sp, %i2, %sp	! alloca() space in stack for frame to set up
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	add	%sp, STACKFRAME+STACK_BIAS, %l0	! %l0 has start of
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project						! frame to set up
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	mov	%l0, %o0	! call routine to set up frame
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	call	%i0
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 mov	%i1, %o1	! (delay)
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	brz,pt	%o0, 1f
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 ldx	[%l0+ARGS], %o0	! call foreign function
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS], %f0
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+8], %f2
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+16], %f4
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+24], %f6
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+32], %f8
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+40], %f10
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+48], %f12
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+56], %f14
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+64], %f16
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+72], %f18
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+80], %f20
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+88], %f22
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+96], %f24
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+104], %f26
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+112], %f28
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[%l0+ARGS+120], %f30
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project1:	ldx	[%l0+ARGS+8], %o1
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[%l0+ARGS+16], %o2
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[%l0+ARGS+24], %o3
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[%l0+ARGS+32], %o4
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[%l0+ARGS+40], %o5
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	call	%i5
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 sub	%l0, STACK_BIAS, %sp	! (delay) switch to frame
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! If the return value pointer is NULL, assume no return value.
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	brz,pn	%i4, done
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 nop
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%i3, FFI_TYPE_INT
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pt	%icc, done
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 stx	%o0, [%i4+0]	! (delay)
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%i3, FFI_TYPE_FLOAT
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pn	%icc, done
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 st	%f0, [%i4+0]	! (delay)
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%i3, FFI_TYPE_DOUBLE
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pn	%icc, done
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 std	%f0, [%i4+0]	! (delay)
100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%i3, FFI_TYPE_STRUCT
102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,pn	%icc, dostruct
103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%i3, FFI_TYPE_LONGDOUBLE
105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bne,pt	%icc, done
106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 nop
107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f0, [%i4+0]
108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f2, [%i4+8]
109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectdone:	ret
111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 restore
112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectdostruct:
114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* This will not work correctly for unions. */
115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%o0, [%i4+0]
116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%o1, [%i4+8]
117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%o2, [%i4+16]
118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%o3, [%i4+24]
119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f0, [%i4+32]
120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f2, [%i4+40]
121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f4, [%i4+48]
122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f6, [%i4+56]
123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ret
124a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 restore
125a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLFE1:
126a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
127a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.ffi_call_v9_end:
128a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.size	ffi_call_v9,.ffi_call_v9_end-ffi_call_v9
129a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
130a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
131a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#undef STACKFRAME
132a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define	STACKFRAME	 336	/* 16*8 register window +
133a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project				   6*8 args backing store +
134a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project				   20*8 locals */
135a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define	FP		%fp+STACK_BIAS
136a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
137a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* ffi_closure_v9(...)
138a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
139a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Receives the closure argument in %g1.   */
140a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
141a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.text
142a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
143a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.globl ffi_closure_v9
144a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
145a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectffi_closure_v9:
146a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLFB2:
147a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	save	%sp, -STACKFRAME, %sp
148a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLCFI1:
149a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
150a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! Store all of the potential argument registers in va_list format.
151a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i0, [FP+128+0]
152a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i1, [FP+128+8]
153a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i2, [FP+128+16]
154a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i3, [FP+128+24]
155a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i4, [FP+128+32]
156a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stx	%i5, [FP+128+40]
157a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
158a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! Store possible floating point argument registers too.
159a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f0,  [FP-128]
160a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f2,  [FP-120]
161a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f4,  [FP-112]
162a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f6,  [FP-104]
163a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f8,  [FP-96]
164a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std	%f10, [FP-88]
165a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f12, [FP-80]
166a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f14, [FP-72]
167a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f16, [FP-64]
168a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f18, [FP-56]
169a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f20, [FP-48]
170a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f22, [FP-40]
171a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f24, [FP-32]
172a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f26, [FP-24]
173a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f28, [FP-16]
174a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	std     %f30, [FP-8]
175a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
176a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! Call ffi_closure_sparc_inner to do the bulk of the work.
177a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	mov	%g1, %o0
178a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	add	%fp, STACK_BIAS-160, %o1
179a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	add	%fp, STACK_BIAS+128, %o2
180a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	call	ffi_closure_sparc_inner_v9
181a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 add	%fp, STACK_BIAS-128, %o3
182a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
183a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! Load up the return value in the proper type.
184a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! See ffi_prep_cif_machdep for the list of cases.
185a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%o0, FFI_TYPE_VOID
186a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,pn	%icc, done1
187a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
188a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%o0, FFI_TYPE_INT
189a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,pn	%icc, integer
190a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
191a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%o0, FFI_TYPE_FLOAT
192a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pn	%icc, done1
193a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 ld	[FP-160], %f0
194a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
195a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%o0, FFI_TYPE_DOUBLE
196a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pn	%icc, done1
197a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 ldd	[FP-160], %f0
198a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
199a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
200a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	cmp	%o0, FFI_TYPE_LONGDOUBLE
201a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	be,a,pn	%icc, longdouble1
202a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 ldd	[FP-160], %f0
203a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
204a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
205a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	! FFI_TYPE_STRUCT
206a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[FP-152], %i1
207a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[FP-144], %i2
208a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[FP-136], %i3
209a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[FP-160], %f0
210a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[FP-152], %f2
211a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[FP-144], %f4
212a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[FP-136], %f6
213a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
214a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectinteger:
215a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldx	[FP-160], %i0
216a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
217a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectdone1:
218a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ret
219a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 restore
220a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
221a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
222a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectlongdouble1:
223a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldd	[FP-152], %f2
224a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ret
225a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 restore
226a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
227a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLFE2:
228a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
229a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.ffi_closure_v9_end:
230a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
231a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
232a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef HAVE_RO_EH_FRAME
233a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.section	".eh_frame",#alloc
234a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
235a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.section	".eh_frame",#alloc,#write
236a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
237a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLframe1:
238a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
239a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLSCIE1:
240a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	0x0	! CIE Identifier Tag
241a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1	! CIE Version
242a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.ascii "zR\0"	! CIE Augmentation
243a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1	! uleb128 0x1; CIE Code Alignment Factor
244a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x78	! sleb128 -8; CIE Data Alignment Factor
245a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xf	! CIE RA Column
246a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1	! uleb128 0x1; Augmentation size
247a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef HAVE_AS_SPARC_UA_PCREL
248a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1b	! FDE Encoding (pcrel sdata4)
249a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
250a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x50	! FDE Encoding (aligned absolute)
251a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
252a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xc	! DW_CFA_def_cfa
253a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xe	! uleb128 0xe
254a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xff,0xf	! uleb128 0x7ff
255a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
256a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLECIE1:
257a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLSFDE1:
258a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLEFDE1-.LLASFDE1	! FDE Length
259a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLASFDE1:
260a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLASFDE1-.LLframe1	! FDE CIE offset
261a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef HAVE_AS_SPARC_UA_PCREL
262a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	%r_disp32(.LLFB1)
263a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLFE1-.LLFB1		! FDE address range
264a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
265a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
266a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.xword	.LLFB1
267a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaxword	.LLFE1-.LLFB1	! FDE address range
268a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
269a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x0	! uleb128 0x0; Augmentation size
270a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x4	! DW_CFA_advance_loc4
271a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLCFI0-.LLFB1
272a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xd	! DW_CFA_def_cfa_register
273a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1e	! uleb128 0x1e
274a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x2d	! DW_CFA_GNU_window_save
275a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x9	! DW_CFA_register
276a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xf	! uleb128 0xf
277a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1f	! uleb128 0x1f
278a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
279a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLEFDE1:
280a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLSFDE2:
281a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
282a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLASFDE2:
283a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
284a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef HAVE_AS_SPARC_UA_PCREL
285a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	%r_disp32(.LLFB2)
286a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLFE2-.LLFB2		! FDE address range
287a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
288a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
289a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.xword	.LLFB2
290a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaxword	.LLFE2-.LLFB2	! FDE address range
291a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
292a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x0	! uleb128 0x0; Augmentation size
293a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x4	! DW_CFA_advance_loc4
294a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uaword	.LLCFI1-.LLFB2
295a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xd	! DW_CFA_def_cfa_register
296a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1e	! uleb128 0x1e
297a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x2d	! DW_CFA_GNU_window_save
298a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x9	! DW_CFA_register
299a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0xf	! uleb128 0xf
300a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x1f	! uleb128 0x1f
301a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 8
302a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LLEFDE2:
303a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
304a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
305a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef __linux__
306a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.section	.note.GNU-stack,"",@progbits
307a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
308