1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* -----------------------------------------------------------------------
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org>
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	     (c) 2008 Red Hat, Inc.
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   HPPA Foreign Function Interface
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Permission is hereby granted, free of charge, to any person obtaining
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   a copy of this software and associated documentation files (the
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ``Software''), to deal in the Software without restriction, including
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   without limitation the rights to use, copy, modify, merge, publish,
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   distribute, sublicense, and/or sell copies of the Software, and to
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   permit persons to whom the Software is furnished to do so, subject to
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   the following conditions:
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   The above copyright notice and this permission notice shall be included
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   in all copies or substantial portions of the Software.
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OTHER 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	.text
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.level 1.1
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 4
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* void ffi_call_pa32(void (*)(char *, extended_cif *),
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			       extended_cif *ecif,
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			       unsigned bytes,
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			       unsigned flags,
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			       unsigned *rvalue,
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			       void (*fn)(void));
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 */
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.export ffi_call_pa32,code
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.import ffi_prep_args_pa32,code
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.type ffi_call_pa32, @function
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LFB1:
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectffi_call_pa32:
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.proc
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.entry
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %rp, -20(%sp)
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r3, %r1
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI11:
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %sp, %r3
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI12:
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Setup the stack for calling prep_args...
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   We want the stack to look like this:
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   [ Previous stack                            ] <- %r3
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   [ 64-bytes register save area               ] <- %r4
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   [ Stack space for actual call, passed as    ] <- %arg0
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   [     arg0 to ffi_prep_args_pa32           ]
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   [ Stack for calling prep_args               ] <- %sp
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 */
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stwm %r1, 64(%sp)
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %r4, 12(%r3)
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI13:
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %sp, %r4
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	addl %arg2, %r4, %arg0      /* arg stack */
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %arg3, -48(%r3)         /* save flags; we need it later */
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Call prep_args:
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   %arg0(stack) -- set up above
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   %arg1(ecif) -- same as incoming param
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   %arg2(bytes) -- same as incoming param */
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bl ffi_prep_args_pa32,%r2
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldo 64(%arg0), %sp
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldo -64(%sp), %sp
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* now %sp should point where %arg0 was pointing.  */
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Load the arguments that should be passed in registers
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   The fp args were loaded by the prep_args function.  */
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -36(%sp), %arg0
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -40(%sp), %arg1
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -44(%sp), %arg2
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -48(%sp), %arg3
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* in case the function is going to return a structure
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   we need to give it a place to put the result.  */
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -52(%r3), %ret0                     /* %ret0 <- rvalue */
100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -56(%r3), %r22                      /* %r22 <- function to call */
101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bl $$dyncall, %r31                      /* Call the user function */
102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r31, %rp
103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Prepare to store the result; we need to recover flags and rvalue.  */
105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -48(%r3), %r21                      /* r21 <- flags */
106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -52(%r3), %r20                      /* r20 <- rvalue */
107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Store the result according to the return type.  */
109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckint:
111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw	%ret0, 0(%r20)
114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckint8:
116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret0, 0(%r20)
119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckint16:
121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	sth	%ret0, 0(%r20)
124a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
125a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckdbl:
126a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
127a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
128a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	fstd	%fr4,0(%r20)
129a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
130a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckfloat:
131a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
132a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
133a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	fstw	%fr4L,0(%r20)
134a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
135a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lcheckll:
136a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
137a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw	%ret0, 0(%r20)
138a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
139a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw	%ret1, 4(%r20)
140a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
141a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst2:
142a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
143a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 2-byte structs are returned in ret0 as ????xxyy.  */
144a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
145a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
146a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
147a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret0, 0(%r20)
148a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
149a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst3:
150a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
151a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
152a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 15, 8, %r22
153a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
154a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
155a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
156a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
157a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret0, 0(%r20)
158a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
159a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst4:
160a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
161a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
162a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 7, 8, %r22
163a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
164a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 15, 8, %r22
165a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
166a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
167a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
168a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
169a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret0, 0(%r20)
170a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
171a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst5:
172a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
173a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 5 byte values are returned right justified:
174a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	      ret0     ret1
175a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   5: ??????aa bbccddee */
176a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%ret0, 1(%r20)
177a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 7, 8, %r22
178a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
179a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 15, 8, %r22
180a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
181a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 23, 8, %r22
182a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
183a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
184a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret1, 0(%r20)
185a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
186a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst6:
187a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
188a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 6 byte values are returned right justified:
189a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	      ret0     ret1
190a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   6: ????aabb ccddeeff */
191a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
192a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
193a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%ret0, 1(%r20)
194a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 7, 8, %r22
195a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
196a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 15, 8, %r22
197a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
198a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 23, 8, %r22
199a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
200a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
201a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret1, 0(%r20)
202a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
203a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst7:
204a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
205a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 7 byte values are returned right justified:
206a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	      ret0     ret1
207a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   7: ??aabbcc ddeeffgg */
208a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 15, 8, %r22
209a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
210a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
211a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
212a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%ret0, 1(%r20)
213a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 7, 8, %r22
214a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
215a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 15, 8, %r22
216a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
217a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 23, 8, %r22
218a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
219a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	b	.Ldone
220a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret1, 0(%r20)
221a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
222a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lchecksmst8:
223a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
224a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* 8 byte values are returned right justified:
225a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	      ret0     ret1
226a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   8: aabbccdd eeffgghh */
227a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 7, 8, %r22
228a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
229a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 15, 8, %r22
230a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
231a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret0, 23, 8, %r22
232a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
233a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%ret0, 1(%r20)
234a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 7, 8, %r22
235a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
236a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 15, 8, %r22
237a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
238a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	extru	%ret1, 23, 8, %r22
239a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stbs,ma	%r22, 1(%r20)
240a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stb	%ret1, 0(%r20)
241a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
242a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Ldone:
243a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* all done, return */
244a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r4, %sp                           /* pop arg stack */
245a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw 12(%r3), %r4
246a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldwm -64(%sp), %r3                      /* .. and pop stack */
247a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -20(%sp), %rp
248a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bv %r0(%rp)
249a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	nop
250a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.exit
251a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.procend
252a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LFE1:
253a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
254a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* void ffi_closure_pa32(void);
255a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   Called with closure argument in %r21 */
256a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.export ffi_closure_pa32,code
257a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.import ffi_closure_inner_pa32,code
258a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
259a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.type ffi_closure_pa32, @function
260a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LFB2:
261a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectffi_closure_pa32:
262a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.proc
263a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
264a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.entry
265a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
266a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %rp, -20(%sp)
267a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI20:
268a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r3, %r1
269a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI21:
270a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %sp, %r3
271a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LCFI22:
272a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stwm %r1, 64(%sp)
273a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
274a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	/* Put arguments onto the stack and call ffi_closure_inner.  */
275a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %arg0, -36(%r3)
276a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %arg1, -40(%r3)
277a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %arg2, -44(%r3)
278a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	stw %arg3, -48(%r3)
279a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
280a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r21, %arg0
281a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bl ffi_closure_inner_pa32, %r2
282a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	copy %r3, %arg1
283a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
284a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldwm -64(%sp), %r3
285a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -20(%sp), %rp
286a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -36(%sp), %ret0
287a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	bv %r0(%r2)
288a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	ldw -40(%sp), %ret1
289a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
290a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.exit
291a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.procend
292a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LFE2:
293a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
294a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.section        ".eh_frame",EH_FRAME_FLAGS,@progbits
295a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.Lframe1:
296a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LECIE1-.LSCIE1 ;# Length of Common Information Entry
297a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LSCIE1:
298a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   0x0     ;# CIE Identifier Tag
299a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x1     ;# CIE Version
300a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.ascii "\0"     ;# CIE Augmentation
301a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x1    ;# CIE Code Alignment Factor
302a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.sleb128 4      ;# CIE Data Alignment Factor
303a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x2     ;# CIE RA Column
304a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0xc     ;# DW_CFA_def_cfa
305a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x1e
306a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x0
307a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 4
308a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LECIE1:
309a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LSFDE1:
310a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LEFDE1-.LASFDE1        ;# FDE Length
311a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LASFDE1:
312a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LASFDE1-.Lframe1       ;# FDE CIE offset
313a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LFB1   ;# FDE initial location
314a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LFE1-.LFB1     ;# FDE address range
315a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
316a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x4     ;# DW_CFA_advance_loc4
317a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LCFI11-.LFB1
318a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x83	;# DW_CFA_offset, column 0x3
319a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x0
320a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
321a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x2
322a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.sleb128 -5
323a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
324a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x4     ;# DW_CFA_advance_loc4
325a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LCFI12-.LCFI11
326a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
327a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x3
328a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
329a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x4     ;# DW_CFA_advance_loc4
330a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LCFI13-.LCFI12
331a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte	0x84	;# DW_CFA_offset, column 0x4
332a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x3
333a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
334a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 4
335a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LEFDE1:
336a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
337a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LSFDE2:
338a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LEFDE2-.LASFDE2        ;# FDE Length
339a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LASFDE2:
340a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LASFDE2-.Lframe1       ;# FDE CIE offset
341a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LFB2   ;# FDE initial location
342a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LFE2-.LFB2     ;# FDE address range
343a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x4     ;# DW_CFA_advance_loc4
344a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LCFI21-.LFB2
345a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x83    ;# DW_CFA_offset, column 0x3
346a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x0
347a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x11    ;# DW_CFA_offset_extended_sf
348a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x2
349a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.sleb128 -5
350a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
351a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0x4     ;# DW_CFA_advance_loc4
352a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.word   .LCFI22-.LCFI21
353a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
354a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.uleb128 0x3
355a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
356a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	.align 4
357a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project.LEFDE2:
358