xref: /aosp_15_r20/external/libffi/src/s390/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2000 Software AG
3*1fd5a2e1SPrashanth Swaminathan            Copyright (c) 2008 Red Hat, Inc.
4*1fd5a2e1SPrashanth Swaminathan
5*1fd5a2e1SPrashanth Swaminathan   S390 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,
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
28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan	.text
33*1fd5a2e1SPrashanth Swaminathan
34*1fd5a2e1SPrashanth Swaminathan#ifndef __s390x__
35*1fd5a2e1SPrashanth Swaminathan
36*1fd5a2e1SPrashanth Swaminathan	# r2:	frame
37*1fd5a2e1SPrashanth Swaminathan	# r3:	ret_type
38*1fd5a2e1SPrashanth Swaminathan	# r4:	ret_addr
39*1fd5a2e1SPrashanth Swaminathan	# r5:	fun
40*1fd5a2e1SPrashanth Swaminathan	# r6:	closure
41*1fd5a2e1SPrashanth Swaminathan
42*1fd5a2e1SPrashanth Swaminathan	# This assumes we are using gas.
43*1fd5a2e1SPrashanth Swaminathan	.balign	8
44*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_call_SYSV
45*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_call_SYSV)
46*1fd5a2e1SPrashanth Swaminathan	.type	ffi_call_SYSV,%function
47*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV:
48*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
49*1fd5a2e1SPrashanth Swaminathan	st	%r6,44(%r2)			# Save registers
50*1fd5a2e1SPrashanth Swaminathan	stm	%r12,%r14,48(%r2)
51*1fd5a2e1SPrashanth Swaminathan	lr	%r13,%r2			# Install frame pointer
52*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r6, 44
53*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r12, 48
54*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r13, 52
55*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r14, 56
56*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r13
57*1fd5a2e1SPrashanth Swaminathan	st	%r2,0(%r15)			# Set up back chain
58*1fd5a2e1SPrashanth Swaminathan	sla	%r3,3				# ret_type *= 8
59*1fd5a2e1SPrashanth Swaminathan	lr	%r12,%r4			# Save ret_addr
60*1fd5a2e1SPrashanth Swaminathan	lr	%r1,%r5				# Save fun
61*1fd5a2e1SPrashanth Swaminathan	lr	%r0,%r6				# Install static chain
62*1fd5a2e1SPrashanth Swaminathan
63*1fd5a2e1SPrashanth Swaminathan	# Set return address, so that there is only one indirect jump.
64*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_S390_ZARCH
65*1fd5a2e1SPrashanth Swaminathan	larl	%r14,.Ltable
66*1fd5a2e1SPrashanth Swaminathan	ar	%r14,%r3
67*1fd5a2e1SPrashanth Swaminathan#else
68*1fd5a2e1SPrashanth Swaminathan	basr	%r14,0
69*1fd5a2e1SPrashanth Swaminathan0:	la	%r14,.Ltable-0b(%r14,%r3)
70*1fd5a2e1SPrashanth Swaminathan#endif
71*1fd5a2e1SPrashanth Swaminathan
72*1fd5a2e1SPrashanth Swaminathan	lm	%r2,%r6,8(%r13)			# Load arguments
73*1fd5a2e1SPrashanth Swaminathan	ld	%f0,64(%r13)
74*1fd5a2e1SPrashanth Swaminathan	ld	%f2,72(%r13)
75*1fd5a2e1SPrashanth Swaminathan	br	%r1				# ... and call function
76*1fd5a2e1SPrashanth Swaminathan
77*1fd5a2e1SPrashanth Swaminathan	.balign	8
78*1fd5a2e1SPrashanth Swaminathan.Ltable:
79*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE
80*1fd5a2e1SPrashanth Swaminathan	std	%f0,0(%r12)
81*1fd5a2e1SPrashanth Swaminathan	j	.Ldone
82*1fd5a2e1SPrashanth Swaminathan
83*1fd5a2e1SPrashanth Swaminathan	.balign	8
84*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_FLOAT
85*1fd5a2e1SPrashanth Swaminathan	ste	%f0,0(%r12)
86*1fd5a2e1SPrashanth Swaminathan	j	.Ldone
87*1fd5a2e1SPrashanth Swaminathan
88*1fd5a2e1SPrashanth Swaminathan	.balign	8
89*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT64
90*1fd5a2e1SPrashanth Swaminathan	st	%r3,4(%r12)
91*1fd5a2e1SPrashanth Swaminathan	nop
92*1fd5a2e1SPrashanth Swaminathan	# fallthru
93*1fd5a2e1SPrashanth Swaminathan
94*1fd5a2e1SPrashanth Swaminathan	.balign	8
95*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT32
96*1fd5a2e1SPrashanth Swaminathan	st	%r2,0(%r12)
97*1fd5a2e1SPrashanth Swaminathan	nop
98*1fd5a2e1SPrashanth Swaminathan	# fallthru
99*1fd5a2e1SPrashanth Swaminathan
100*1fd5a2e1SPrashanth Swaminathan	.balign	8
101*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_VOID
102*1fd5a2e1SPrashanth Swaminathan.Ldone:
103*1fd5a2e1SPrashanth Swaminathan	l	%r14,56(%r13)
104*1fd5a2e1SPrashanth Swaminathan	l	%r12,48(%r13)
105*1fd5a2e1SPrashanth Swaminathan	l	%r6,44(%r13)
106*1fd5a2e1SPrashanth Swaminathan	l	%r13,52(%r13)
107*1fd5a2e1SPrashanth Swaminathan	.cfi_restore 14
108*1fd5a2e1SPrashanth Swaminathan	.cfi_restore 13
109*1fd5a2e1SPrashanth Swaminathan	.cfi_restore 12
110*1fd5a2e1SPrashanth Swaminathan	.cfi_restore 6
111*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa r15, 96
112*1fd5a2e1SPrashanth Swaminathan	br	%r14
113*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
114*1fd5a2e1SPrashanth Swaminathan	.size	 ffi_call_SYSV,.-ffi_call_SYSV
115*1fd5a2e1SPrashanth Swaminathan
116*1fd5a2e1SPrashanth Swaminathan
117*1fd5a2e1SPrashanth Swaminathan	.balign	8
118*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_go_closure_SYSV
119*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_go_closure_SYSV)
120*1fd5a2e1SPrashanth Swaminathan	.type	ffi_go_closure_SYSV,%function
121*1fd5a2e1SPrashanth Swaminathanffi_go_closure_SYSV:
122*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
123*1fd5a2e1SPrashanth Swaminathan	stm	%r2,%r6,8(%r15)			# Save arguments
124*1fd5a2e1SPrashanth Swaminathan	lr	%r4,%r0				# Load closure -> user_data
125*1fd5a2e1SPrashanth Swaminathan	l	%r2,4(%r4)			#   ->cif
126*1fd5a2e1SPrashanth Swaminathan	l	%r3,8(%r4)			#   ->fun
127*1fd5a2e1SPrashanth Swaminathan	j	.Ldoclosure
128*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
129*1fd5a2e1SPrashanth Swaminathan
130*1fd5a2e1SPrashanth Swaminathan	.balign	8
131*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_closure_SYSV
132*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_closure_SYSV)
133*1fd5a2e1SPrashanth Swaminathan	.type	ffi_closure_SYSV,%function
134*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV:
135*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
136*1fd5a2e1SPrashanth Swaminathan	stm	%r2,%r6,8(%r15)			# Save arguments
137*1fd5a2e1SPrashanth Swaminathan	lr	%r4,%r0				# Closure
138*1fd5a2e1SPrashanth Swaminathan	l	%r2,16(%r4)			#   ->cif
139*1fd5a2e1SPrashanth Swaminathan	l	%r3,20(%r4)			#   ->fun
140*1fd5a2e1SPrashanth Swaminathan	l	%r4,24(%r4)			#   ->user_data
141*1fd5a2e1SPrashanth Swaminathan.Ldoclosure:
142*1fd5a2e1SPrashanth Swaminathan	stm	%r12,%r15,48(%r15)		# Save registers
143*1fd5a2e1SPrashanth Swaminathan	lr	%r12,%r15
144*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r12
145*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r6, 24
146*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r12, 48
147*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r13, 52
148*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r14, 56
149*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r15, 60
150*1fd5a2e1SPrashanth Swaminathan#ifndef HAVE_AS_S390_ZARCH
151*1fd5a2e1SPrashanth Swaminathan	basr	%r13,0				# Set up base register
152*1fd5a2e1SPrashanth Swaminathan.Lcbase:
153*1fd5a2e1SPrashanth Swaminathan	l	%r1,.Lchelper-.Lcbase(%r13)	# Get helper function
154*1fd5a2e1SPrashanth Swaminathan#endif
155*1fd5a2e1SPrashanth Swaminathan	ahi	%r15,-96-8			# Set up stack frame
156*1fd5a2e1SPrashanth Swaminathan	st	%r12,0(%r15)			# Set up back chain
157*1fd5a2e1SPrashanth Swaminathan
158*1fd5a2e1SPrashanth Swaminathan	std	%f0,64(%r12)			# Save fp arguments
159*1fd5a2e1SPrashanth Swaminathan	std	%f2,72(%r12)
160*1fd5a2e1SPrashanth Swaminathan
161*1fd5a2e1SPrashanth Swaminathan	la	%r5,96(%r12)			# Overflow
162*1fd5a2e1SPrashanth Swaminathan	st	%r5,96(%r15)
163*1fd5a2e1SPrashanth Swaminathan	la	%r6,64(%r12)			# FPRs
164*1fd5a2e1SPrashanth Swaminathan	la	%r5,8(%r12)			# GPRs
165*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_S390_ZARCH
166*1fd5a2e1SPrashanth Swaminathan	brasl	%r14,ffi_closure_helper_SYSV
167*1fd5a2e1SPrashanth Swaminathan#else
168*1fd5a2e1SPrashanth Swaminathan	bas	%r14,0(%r1,%r13)		# Call helper
169*1fd5a2e1SPrashanth Swaminathan#endif
170*1fd5a2e1SPrashanth Swaminathan
171*1fd5a2e1SPrashanth Swaminathan	lr	%r15,%r12
172*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r15
173*1fd5a2e1SPrashanth Swaminathan	lm	%r12,%r14,48(%r12)		# Restore saved registers
174*1fd5a2e1SPrashanth Swaminathan	l	%r6,24(%r15)
175*1fd5a2e1SPrashanth Swaminathan	ld	%f0,64(%r15)			# Load return registers
176*1fd5a2e1SPrashanth Swaminathan	lm	%r2,%r3,8(%r15)
177*1fd5a2e1SPrashanth Swaminathan	br	%r14
178*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
179*1fd5a2e1SPrashanth Swaminathan
180*1fd5a2e1SPrashanth Swaminathan#ifndef HAVE_AS_S390_ZARCH
181*1fd5a2e1SPrashanth Swaminathan	.align 4
182*1fd5a2e1SPrashanth Swaminathan.Lchelper:
183*1fd5a2e1SPrashanth Swaminathan	.long	ffi_closure_helper_SYSV-.Lcbase
184*1fd5a2e1SPrashanth Swaminathan#endif
185*1fd5a2e1SPrashanth Swaminathan
186*1fd5a2e1SPrashanth Swaminathan	.size	 ffi_closure_SYSV,.-ffi_closure_SYSV
187*1fd5a2e1SPrashanth Swaminathan
188*1fd5a2e1SPrashanth Swaminathan#else
189*1fd5a2e1SPrashanth Swaminathan
190*1fd5a2e1SPrashanth Swaminathan	# r2:	frame
191*1fd5a2e1SPrashanth Swaminathan	# r3:	ret_type
192*1fd5a2e1SPrashanth Swaminathan	# r4:	ret_addr
193*1fd5a2e1SPrashanth Swaminathan	# r5:	fun
194*1fd5a2e1SPrashanth Swaminathan	# r6:	closure
195*1fd5a2e1SPrashanth Swaminathan
196*1fd5a2e1SPrashanth Swaminathan	# This assumes we are using gas.
197*1fd5a2e1SPrashanth Swaminathan	.balign	8
198*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_call_SYSV
199*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_call_SYSV)
200*1fd5a2e1SPrashanth Swaminathan	.type	ffi_call_SYSV,%function
201*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV:
202*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
203*1fd5a2e1SPrashanth Swaminathan	stg	%r6,88(%r2)			# Save registers
204*1fd5a2e1SPrashanth Swaminathan	stmg	%r12,%r14,96(%r2)
205*1fd5a2e1SPrashanth Swaminathan	lgr	%r13,%r2			# Install frame pointer
206*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r6, 88
207*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r12, 96
208*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r13, 104
209*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r14, 112
210*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r13
211*1fd5a2e1SPrashanth Swaminathan	stg	%r2,0(%r15)			# Set up back chain
212*1fd5a2e1SPrashanth Swaminathan	larl	%r14,.Ltable			# Set up return address
213*1fd5a2e1SPrashanth Swaminathan	slag	%r3,%r3,3			# ret_type *= 8
214*1fd5a2e1SPrashanth Swaminathan	lgr	%r12,%r4			# Save ret_addr
215*1fd5a2e1SPrashanth Swaminathan	lgr	%r1,%r5				# Save fun
216*1fd5a2e1SPrashanth Swaminathan	lgr	%r0,%r6				# Install static chain
217*1fd5a2e1SPrashanth Swaminathan	agr	%r14,%r3
218*1fd5a2e1SPrashanth Swaminathan	lmg	%r2,%r6,16(%r13)		# Load arguments
219*1fd5a2e1SPrashanth Swaminathan	ld	%f0,128(%r13)
220*1fd5a2e1SPrashanth Swaminathan	ld	%f2,136(%r13)
221*1fd5a2e1SPrashanth Swaminathan	ld	%f4,144(%r13)
222*1fd5a2e1SPrashanth Swaminathan	ld	%f6,152(%r13)
223*1fd5a2e1SPrashanth Swaminathan	br	%r1				# ... and call function
224*1fd5a2e1SPrashanth Swaminathan
225*1fd5a2e1SPrashanth Swaminathan	.balign	8
226*1fd5a2e1SPrashanth Swaminathan.Ltable:
227*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE
228*1fd5a2e1SPrashanth Swaminathan	std	%f0,0(%r12)
229*1fd5a2e1SPrashanth Swaminathan	j	.Ldone
230*1fd5a2e1SPrashanth Swaminathan
231*1fd5a2e1SPrashanth Swaminathan	.balign	8
232*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE
233*1fd5a2e1SPrashanth Swaminathan	ste	%f0,0(%r12)
234*1fd5a2e1SPrashanth Swaminathan	j	.Ldone
235*1fd5a2e1SPrashanth Swaminathan
236*1fd5a2e1SPrashanth Swaminathan	.balign	8
237*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT64
238*1fd5a2e1SPrashanth Swaminathan	stg	%r2,0(%r12)
239*1fd5a2e1SPrashanth Swaminathan
240*1fd5a2e1SPrashanth Swaminathan	.balign	8
241*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT32
242*1fd5a2e1SPrashanth Swaminathan	# Never used, as we always store type ffi_arg.
243*1fd5a2e1SPrashanth Swaminathan	# But the stg above is 6 bytes and we cannot
244*1fd5a2e1SPrashanth Swaminathan	# jump around this case, so fall through.
245*1fd5a2e1SPrashanth Swaminathan	nop
246*1fd5a2e1SPrashanth Swaminathan	nop
247*1fd5a2e1SPrashanth Swaminathan
248*1fd5a2e1SPrashanth Swaminathan	.balign	8
249*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_VOID
250*1fd5a2e1SPrashanth Swaminathan.Ldone:
251*1fd5a2e1SPrashanth Swaminathan	lg	%r14,112(%r13)
252*1fd5a2e1SPrashanth Swaminathan	lg	%r12,96(%r13)
253*1fd5a2e1SPrashanth Swaminathan	lg	%r6,88(%r13)
254*1fd5a2e1SPrashanth Swaminathan	lg	%r13,104(%r13)
255*1fd5a2e1SPrashanth Swaminathan	.cfi_restore r14
256*1fd5a2e1SPrashanth Swaminathan	.cfi_restore r13
257*1fd5a2e1SPrashanth Swaminathan	.cfi_restore r12
258*1fd5a2e1SPrashanth Swaminathan	.cfi_restore r6
259*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa r15, 160
260*1fd5a2e1SPrashanth Swaminathan	br	%r14
261*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
262*1fd5a2e1SPrashanth Swaminathan	.size	 ffi_call_SYSV,.-ffi_call_SYSV
263*1fd5a2e1SPrashanth Swaminathan
264*1fd5a2e1SPrashanth Swaminathan
265*1fd5a2e1SPrashanth Swaminathan	.balign	8
266*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_go_closure_SYSV
267*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_go_closure_SYSV)
268*1fd5a2e1SPrashanth Swaminathan	.type	ffi_go_closure_SYSV,%function
269*1fd5a2e1SPrashanth Swaminathanffi_go_closure_SYSV:
270*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
271*1fd5a2e1SPrashanth Swaminathan	stmg	%r2,%r6,16(%r15)		# Save arguments
272*1fd5a2e1SPrashanth Swaminathan	lgr	%r4,%r0				# Load closure -> user_data
273*1fd5a2e1SPrashanth Swaminathan	lg	%r2,8(%r4)			#   ->cif
274*1fd5a2e1SPrashanth Swaminathan	lg	%r3,16(%r4)			#   ->fun
275*1fd5a2e1SPrashanth Swaminathan	j	.Ldoclosure
276*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
277*1fd5a2e1SPrashanth Swaminathan	.size	 ffi_go_closure_SYSV,.-ffi_go_closure_SYSV
278*1fd5a2e1SPrashanth Swaminathan
279*1fd5a2e1SPrashanth Swaminathan
280*1fd5a2e1SPrashanth Swaminathan	.balign	8
281*1fd5a2e1SPrashanth Swaminathan	.globl	ffi_closure_SYSV
282*1fd5a2e1SPrashanth Swaminathan	FFI_HIDDEN(ffi_closure_SYSV)
283*1fd5a2e1SPrashanth Swaminathan	.type	ffi_closure_SYSV,%function
284*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV:
285*1fd5a2e1SPrashanth Swaminathan	.cfi_startproc
286*1fd5a2e1SPrashanth Swaminathan	stmg	%r2,%r6,16(%r15)		# Save arguments
287*1fd5a2e1SPrashanth Swaminathan	lgr	%r4,%r0				# Load closure
288*1fd5a2e1SPrashanth Swaminathan	lg	%r2,32(%r4)			#   ->cif
289*1fd5a2e1SPrashanth Swaminathan	lg	%r3,40(%r4)			#   ->fun
290*1fd5a2e1SPrashanth Swaminathan	lg	%r4,48(%r4)			#   ->user_data
291*1fd5a2e1SPrashanth Swaminathan.Ldoclosure:
292*1fd5a2e1SPrashanth Swaminathan	stmg	%r13,%r15,104(%r15)		# Save registers
293*1fd5a2e1SPrashanth Swaminathan	lgr	%r13,%r15
294*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r13
295*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r6, 48
296*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r13, 104
297*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r14, 112
298*1fd5a2e1SPrashanth Swaminathan	.cfi_rel_offset r15, 120
299*1fd5a2e1SPrashanth Swaminathan	aghi	%r15,-160-16			# Set up stack frame
300*1fd5a2e1SPrashanth Swaminathan	stg	%r13,0(%r15)			# Set up back chain
301*1fd5a2e1SPrashanth Swaminathan
302*1fd5a2e1SPrashanth Swaminathan	std	%f0,128(%r13)			# Save fp arguments
303*1fd5a2e1SPrashanth Swaminathan	std	%f2,136(%r13)
304*1fd5a2e1SPrashanth Swaminathan	std	%f4,144(%r13)
305*1fd5a2e1SPrashanth Swaminathan	std	%f6,152(%r13)
306*1fd5a2e1SPrashanth Swaminathan	la	%r5,160(%r13)			# Overflow
307*1fd5a2e1SPrashanth Swaminathan	stg	%r5,160(%r15)
308*1fd5a2e1SPrashanth Swaminathan	la	%r6,128(%r13)			# FPRs
309*1fd5a2e1SPrashanth Swaminathan	la	%r5,16(%r13)			# GPRs
310*1fd5a2e1SPrashanth Swaminathan	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
311*1fd5a2e1SPrashanth Swaminathan
312*1fd5a2e1SPrashanth Swaminathan	lgr	%r15,%r13
313*1fd5a2e1SPrashanth Swaminathan	.cfi_def_cfa_register r15
314*1fd5a2e1SPrashanth Swaminathan	lmg	%r13,%r14,104(%r13)		# Restore saved registers
315*1fd5a2e1SPrashanth Swaminathan	lg	%r6,48(%r15)
316*1fd5a2e1SPrashanth Swaminathan	ld	%f0,128(%r15)			# Load return registers
317*1fd5a2e1SPrashanth Swaminathan	lg	%r2,16(%r15)
318*1fd5a2e1SPrashanth Swaminathan	br	%r14
319*1fd5a2e1SPrashanth Swaminathan	.cfi_endproc
320*1fd5a2e1SPrashanth Swaminathan	.size	 ffi_closure_SYSV,.-ffi_closure_SYSV
321*1fd5a2e1SPrashanth Swaminathan#endif /* !s390x */
322*1fd5a2e1SPrashanth Swaminathan
323*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__
324*1fd5a2e1SPrashanth Swaminathan	.section	.note.GNU-stack,"",@progbits
325*1fd5a2e1SPrashanth Swaminathan#endif
326