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