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