xref: /aosp_15_r20/external/libffi/src/powerpc/ppc_closure.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.h - Copyright (c) 2003 Jakub Jelinek <[email protected]>
3*1fd5a2e1SPrashanth Swaminathan	    Copyright (c) 2008 Red Hat, Inc.
4*1fd5a2e1SPrashanth Swaminathan
5*1fd5a2e1SPrashanth Swaminathan   PowerPC Assembly glue.
6*1fd5a2e1SPrashanth Swaminathan
7*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
8*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
9*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
10*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
11*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
12*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
13*1fd5a2e1SPrashanth Swaminathan   the following conditions:
14*1fd5a2e1SPrashanth Swaminathan
15*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
16*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
17*1fd5a2e1SPrashanth Swaminathan
18*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19*1fd5a2e1SPrashanth Swaminathan   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21*1fd5a2e1SPrashanth Swaminathan   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22*1fd5a2e1SPrashanth Swaminathan   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23*1fd5a2e1SPrashanth Swaminathan   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24*1fd5a2e1SPrashanth Swaminathan   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25*1fd5a2e1SPrashanth Swaminathan   DEALINGS IN THE SOFTWARE.
26*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
27*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
28*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
29*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
30*1fd5a2e1SPrashanth Swaminathan#include <powerpc/asm.h>
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan	.file   "ppc_closure.S"
33*1fd5a2e1SPrashanth Swaminathan
34*1fd5a2e1SPrashanth Swaminathan#ifndef POWERPC64
35*1fd5a2e1SPrashanth Swaminathan
36*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN(ffi_closure_SYSV)
37*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV)
38*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
39*1fd5a2e1SPrashanth Swaminathan	stwu %r1,-144(%r1)
40*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
41*1fd5a2e1SPrashanth Swaminathan	mflr %r0
42*1fd5a2e1SPrashanth Swaminathan	stw %r0,148(%r1)
43*1fd5a2e1SPrashanth Swaminathan	.cfi_offset 65, 4
44*1fd5a2e1SPrashanth Swaminathan
45*1fd5a2e1SPrashanth Swaminathan# we want to build up an areas for the parameters passed
46*1fd5a2e1SPrashanth Swaminathan# in registers (both floating point and integer)
47*1fd5a2e1SPrashanth Swaminathan
48*1fd5a2e1SPrashanth Swaminathan	# so first save gpr 3 to gpr 10 (aligned to 4)
49*1fd5a2e1SPrashanth Swaminathan	stw   %r3, 16(%r1)
50*1fd5a2e1SPrashanth Swaminathan	stw   %r4, 20(%r1)
51*1fd5a2e1SPrashanth Swaminathan	stw   %r5, 24(%r1)
52*1fd5a2e1SPrashanth Swaminathan
53*1fd5a2e1SPrashanth Swaminathan	# set up registers for the routine that does the work
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan	# closure->cif
56*1fd5a2e1SPrashanth Swaminathan	lwz %r3,FFI_TRAMPOLINE_SIZE(%r11)
57*1fd5a2e1SPrashanth Swaminathan	# closure->fun
58*1fd5a2e1SPrashanth Swaminathan	lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11)
59*1fd5a2e1SPrashanth Swaminathan	# closure->user_data
60*1fd5a2e1SPrashanth Swaminathan	lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11)
61*1fd5a2e1SPrashanth Swaminathan
62*1fd5a2e1SPrashanth Swaminathan.Ldoclosure:
63*1fd5a2e1SPrashanth Swaminathan	stw   %r6, 28(%r1)
64*1fd5a2e1SPrashanth Swaminathan	stw   %r7, 32(%r1)
65*1fd5a2e1SPrashanth Swaminathan	stw   %r8, 36(%r1)
66*1fd5a2e1SPrashanth Swaminathan	stw   %r9, 40(%r1)
67*1fd5a2e1SPrashanth Swaminathan	stw   %r10,44(%r1)
68*1fd5a2e1SPrashanth Swaminathan
69*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__
70*1fd5a2e1SPrashanth Swaminathan	# next save fpr 1 to fpr 8 (aligned to 8)
71*1fd5a2e1SPrashanth Swaminathan	stfd  %f1, 48(%r1)
72*1fd5a2e1SPrashanth Swaminathan	stfd  %f2, 56(%r1)
73*1fd5a2e1SPrashanth Swaminathan	stfd  %f3, 64(%r1)
74*1fd5a2e1SPrashanth Swaminathan	stfd  %f4, 72(%r1)
75*1fd5a2e1SPrashanth Swaminathan	stfd  %f5, 80(%r1)
76*1fd5a2e1SPrashanth Swaminathan	stfd  %f6, 88(%r1)
77*1fd5a2e1SPrashanth Swaminathan	stfd  %f7, 96(%r1)
78*1fd5a2e1SPrashanth Swaminathan	stfd  %f8, 104(%r1)
79*1fd5a2e1SPrashanth Swaminathan#endif
80*1fd5a2e1SPrashanth Swaminathan
81*1fd5a2e1SPrashanth Swaminathan	# pointer to the result storage
82*1fd5a2e1SPrashanth Swaminathan	addi %r6,%r1,112
83*1fd5a2e1SPrashanth Swaminathan
84*1fd5a2e1SPrashanth Swaminathan	# pointer to the saved gpr registers
85*1fd5a2e1SPrashanth Swaminathan	addi %r7,%r1,16
86*1fd5a2e1SPrashanth Swaminathan
87*1fd5a2e1SPrashanth Swaminathan	# pointer to the saved fpr registers
88*1fd5a2e1SPrashanth Swaminathan	addi %r8,%r1,48
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth Swaminathan	# pointer to the outgoing parameter save area in the previous frame
91*1fd5a2e1SPrashanth Swaminathan	# i.e. the previous frame pointer + 8
92*1fd5a2e1SPrashanth Swaminathan	addi %r9,%r1,152
93*1fd5a2e1SPrashanth Swaminathan
94*1fd5a2e1SPrashanth Swaminathan	# make the call
95*1fd5a2e1SPrashanth Swaminathan	bl ffi_closure_helper_SYSV@local
96*1fd5a2e1SPrashanth Swaminathan.Lret:
97*1fd5a2e1SPrashanth Swaminathan	# now r3 contains the return type
98*1fd5a2e1SPrashanth Swaminathan	# so use it to look up in a table
99*1fd5a2e1SPrashanth Swaminathan	# so we know how to deal with each type
100*1fd5a2e1SPrashanth Swaminathan
101*1fd5a2e1SPrashanth Swaminathan	# look up the proper starting point in table
102*1fd5a2e1SPrashanth Swaminathan	# by using return type as offset
103*1fd5a2e1SPrashanth Swaminathan
104*1fd5a2e1SPrashanth Swaminathan	mflr %r4		# move address of .Lret to r4
105*1fd5a2e1SPrashanth Swaminathan	slwi %r3,%r3,4		# now multiply return type by 16
106*1fd5a2e1SPrashanth Swaminathan	addi %r4, %r4, .Lret_type0 - .Lret
107*1fd5a2e1SPrashanth Swaminathan	lwz %r0,148(%r1)
108*1fd5a2e1SPrashanth Swaminathan	add %r3,%r3,%r4		# add contents of table to table address
109*1fd5a2e1SPrashanth Swaminathan	mtctr %r3
110*1fd5a2e1SPrashanth Swaminathan	bctr			# jump to it
111*1fd5a2e1SPrashanth Swaminathan
112*1fd5a2e1SPrashanth Swaminathan# Each of the ret_typeX code fragments has to be exactly 16 bytes long
113*1fd5a2e1SPrashanth Swaminathan# (4 instructions). For cache effectiveness we align to a 16 byte boundary
114*1fd5a2e1SPrashanth Swaminathan# first.
115*1fd5a2e1SPrashanth Swaminathan	.align 4
116*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_VOID
117*1fd5a2e1SPrashanth Swaminathan.Lret_type0:
118*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
119*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
120*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
121*1fd5a2e1SPrashanth Swaminathan	blr
122*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
123*1fd5a2e1SPrashanth Swaminathan	nop
124*1fd5a2e1SPrashanth Swaminathan
125*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_INT
126*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
127*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
128*1fd5a2e1SPrashanth Swaminathan.Lfinish:
129*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
130*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
131*1fd5a2e1SPrashanth Swaminathan	blr
132*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
133*1fd5a2e1SPrashanth Swaminathan
134*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_FLOAT
135*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__
136*1fd5a2e1SPrashanth Swaminathan	lfs %f1,112+0(%r1)
137*1fd5a2e1SPrashanth Swaminathan#else
138*1fd5a2e1SPrashanth Swaminathan	nop
139*1fd5a2e1SPrashanth Swaminathan#endif
140*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
141*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
142*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
143*1fd5a2e1SPrashanth Swaminathan	blr
144*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
145*1fd5a2e1SPrashanth Swaminathan
146*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_DOUBLE
147*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__
148*1fd5a2e1SPrashanth Swaminathan	lfd %f1,112+0(%r1)
149*1fd5a2e1SPrashanth Swaminathan#else
150*1fd5a2e1SPrashanth Swaminathan	nop
151*1fd5a2e1SPrashanth Swaminathan#endif
152*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
153*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
154*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
155*1fd5a2e1SPrashanth Swaminathan	blr
156*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
157*1fd5a2e1SPrashanth Swaminathan
158*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_LONGDOUBLE
159*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__
160*1fd5a2e1SPrashanth Swaminathan	lfd %f1,112+0(%r1)
161*1fd5a2e1SPrashanth Swaminathan	lfd %f2,112+8(%r1)
162*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
163*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
164*1fd5a2e1SPrashanth Swaminathan#else
165*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
166*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
167*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
168*1fd5a2e1SPrashanth Swaminathan	blr
169*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
170*1fd5a2e1SPrashanth Swaminathan	nop
171*1fd5a2e1SPrashanth Swaminathan#endif
172*1fd5a2e1SPrashanth Swaminathan
173*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT8
174*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
175*1fd5a2e1SPrashanth Swaminathan	lbz %r3,112+0(%r1)
176*1fd5a2e1SPrashanth Swaminathan#else
177*1fd5a2e1SPrashanth Swaminathan	lbz %r3,112+3(%r1)
178*1fd5a2e1SPrashanth Swaminathan#endif
179*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
180*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
181*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
182*1fd5a2e1SPrashanth Swaminathan	blr
183*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
184*1fd5a2e1SPrashanth Swaminathan
185*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT8
186*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
187*1fd5a2e1SPrashanth Swaminathan	lbz %r3,112+0(%r1)
188*1fd5a2e1SPrashanth Swaminathan#else
189*1fd5a2e1SPrashanth Swaminathan	lbz %r3,112+3(%r1)
190*1fd5a2e1SPrashanth Swaminathan#endif
191*1fd5a2e1SPrashanth Swaminathan	extsb %r3,%r3
192*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
193*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
194*1fd5a2e1SPrashanth Swaminathan
195*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT16
196*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
197*1fd5a2e1SPrashanth Swaminathan	lhz %r3,112+0(%r1)
198*1fd5a2e1SPrashanth Swaminathan#else
199*1fd5a2e1SPrashanth Swaminathan	lhz %r3,112+2(%r1)
200*1fd5a2e1SPrashanth Swaminathan#endif
201*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
202*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
203*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
204*1fd5a2e1SPrashanth Swaminathan	blr
205*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
206*1fd5a2e1SPrashanth Swaminathan
207*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT16
208*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
209*1fd5a2e1SPrashanth Swaminathan	lha %r3,112+0(%r1)
210*1fd5a2e1SPrashanth Swaminathan#else
211*1fd5a2e1SPrashanth Swaminathan	lha %r3,112+2(%r1)
212*1fd5a2e1SPrashanth Swaminathan#endif
213*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
214*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
215*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
216*1fd5a2e1SPrashanth Swaminathan	blr
217*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
218*1fd5a2e1SPrashanth Swaminathan
219*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT32
220*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
221*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
222*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
223*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
224*1fd5a2e1SPrashanth Swaminathan	blr
225*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
226*1fd5a2e1SPrashanth Swaminathan
227*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT32
228*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
229*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
230*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
231*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
232*1fd5a2e1SPrashanth Swaminathan	blr
233*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
234*1fd5a2e1SPrashanth Swaminathan
235*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT64
236*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
237*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
238*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
239*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
240*1fd5a2e1SPrashanth Swaminathan
241*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT64
242*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
243*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
244*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
245*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
246*1fd5a2e1SPrashanth Swaminathan
247*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_STRUCT
248*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
249*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
250*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
251*1fd5a2e1SPrashanth Swaminathan	blr
252*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
253*1fd5a2e1SPrashanth Swaminathan	nop
254*1fd5a2e1SPrashanth Swaminathan
255*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_POINTER
256*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
257*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
258*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
259*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
260*1fd5a2e1SPrashanth Swaminathan	blr
261*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
262*1fd5a2e1SPrashanth Swaminathan
263*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT128
264*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
265*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
266*1fd5a2e1SPrashanth Swaminathan	lwz %r5,112+8(%r1)
267*1fd5a2e1SPrashanth Swaminathan	b .Luint128
268*1fd5a2e1SPrashanth Swaminathan
269*1fd5a2e1SPrashanth Swaminathan# The return types below are only used when the ABI type is FFI_SYSV.
270*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct.
271*1fd5a2e1SPrashanth Swaminathan	lbz %r3,112+0(%r1)
272*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
273*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
274*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
275*1fd5a2e1SPrashanth Swaminathan	blr
276*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
277*1fd5a2e1SPrashanth Swaminathan
278*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct.
279*1fd5a2e1SPrashanth Swaminathan	lhz %r3,112+0(%r1)
280*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
281*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
282*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
283*1fd5a2e1SPrashanth Swaminathan	blr
284*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
285*1fd5a2e1SPrashanth Swaminathan
286*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
287*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
288*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
289*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
290*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
291*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
292*1fd5a2e1SPrashanth Swaminathan	blr
293*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
294*1fd5a2e1SPrashanth Swaminathan#else
295*1fd5a2e1SPrashanth Swaminathan	srwi %r3,%r3,8
296*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
297*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
298*1fd5a2e1SPrashanth Swaminathan#endif
299*1fd5a2e1SPrashanth Swaminathan
300*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
301*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
302*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
303*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
304*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
305*1fd5a2e1SPrashanth Swaminathan	blr
306*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
307*1fd5a2e1SPrashanth Swaminathan
308*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
309*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
310*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
311*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
312*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
313*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
314*1fd5a2e1SPrashanth Swaminathan#else
315*1fd5a2e1SPrashanth Swaminathan	li %r5,24
316*1fd5a2e1SPrashanth Swaminathan	b .Lstruct567
317*1fd5a2e1SPrashanth Swaminathan#endif
318*1fd5a2e1SPrashanth Swaminathan
319*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
320*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
321*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
322*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
323*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
324*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
325*1fd5a2e1SPrashanth Swaminathan#else
326*1fd5a2e1SPrashanth Swaminathan	li %r5,16
327*1fd5a2e1SPrashanth Swaminathan	b .Lstruct567
328*1fd5a2e1SPrashanth Swaminathan#endif
329*1fd5a2e1SPrashanth Swaminathan
330*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
331*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
332*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
333*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__
334*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
335*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
336*1fd5a2e1SPrashanth Swaminathan#else
337*1fd5a2e1SPrashanth Swaminathan	li %r5,8
338*1fd5a2e1SPrashanth Swaminathan	b .Lstruct567
339*1fd5a2e1SPrashanth Swaminathan#endif
340*1fd5a2e1SPrashanth Swaminathan
341*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
342*1fd5a2e1SPrashanth Swaminathan	lwz %r3,112+0(%r1)
343*1fd5a2e1SPrashanth Swaminathan	lwz %r4,112+4(%r1)
344*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
345*1fd5a2e1SPrashanth Swaminathan	b .Lfinish
346*1fd5a2e1SPrashanth Swaminathan
347*1fd5a2e1SPrashanth Swaminathan#ifndef __LITTLE_ENDIAN__
348*1fd5a2e1SPrashanth Swaminathan.Lstruct567:
349*1fd5a2e1SPrashanth Swaminathan	subfic %r6,%r5,32
350*1fd5a2e1SPrashanth Swaminathan	srw %r4,%r4,%r5
351*1fd5a2e1SPrashanth Swaminathan	slw %r6,%r3,%r6
352*1fd5a2e1SPrashanth Swaminathan	srw %r3,%r3,%r5
353*1fd5a2e1SPrashanth Swaminathan	or %r4,%r6,%r4
354*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
355*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
356*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
357*1fd5a2e1SPrashanth Swaminathan	blr
358*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
359*1fd5a2e1SPrashanth Swaminathan#endif
360*1fd5a2e1SPrashanth Swaminathan
361*1fd5a2e1SPrashanth Swaminathan.Luint128:
362*1fd5a2e1SPrashanth Swaminathan	lwz %r6,112+12(%r1)
363*1fd5a2e1SPrashanth Swaminathan	mtlr %r0
364*1fd5a2e1SPrashanth Swaminathan	addi %r1,%r1,144
365*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 0
366*1fd5a2e1SPrashanth Swaminathan	blr
367*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
368*1fd5a2e1SPrashanth SwaminathanEND(ffi_closure_SYSV)
369*1fd5a2e1SPrashanth Swaminathan
370*1fd5a2e1SPrashanth Swaminathan
371*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN(ffi_go_closure_sysv)
372*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_go_closure_sysv)
373*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
374*1fd5a2e1SPrashanth Swaminathan	stwu %r1,-144(%r1)
375*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_offset 144
376*1fd5a2e1SPrashanth Swaminathan	mflr %r0
377*1fd5a2e1SPrashanth Swaminathan	stw %r0,148(%r1)
378*1fd5a2e1SPrashanth Swaminathan	.cfi_offset 65, 4
379*1fd5a2e1SPrashanth Swaminathan
380*1fd5a2e1SPrashanth Swaminathan	stw   %r3, 16(%r1)
381*1fd5a2e1SPrashanth Swaminathan	stw   %r4, 20(%r1)
382*1fd5a2e1SPrashanth Swaminathan	stw   %r5, 24(%r1)
383*1fd5a2e1SPrashanth Swaminathan
384*1fd5a2e1SPrashanth Swaminathan	# closure->cif
385*1fd5a2e1SPrashanth Swaminathan	lwz %r3,4(%r11)
386*1fd5a2e1SPrashanth Swaminathan	# closure->fun
387*1fd5a2e1SPrashanth Swaminathan	lwz %r4,8(%r11)
388*1fd5a2e1SPrashanth Swaminathan	# user_data
389*1fd5a2e1SPrashanth Swaminathan	mr %r5,%r11
390*1fd5a2e1SPrashanth Swaminathan	b .Ldoclosure
391*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
392*1fd5a2e1SPrashanth SwaminathanEND(ffi_go_closure_sysv)
393*1fd5a2e1SPrashanth Swaminathan
394*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
395*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
396*1fd5a2e1SPrashanth Swaminathan#endif
397*1fd5a2e1SPrashanth Swaminathan#endif
398