annotate libffi/src/ia64/unix.S @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* -----------------------------------------------------------------------
kono
parents:
diff changeset
2 unix.S - Copyright (c) 1998, 2008 Red Hat, Inc.
kono
parents:
diff changeset
3 Copyright (c) 2000 Hewlett Packard Company
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 IA64/unix Foreign Function Interface
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 Primary author: Hans Boehm, HP Labs
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 Loosely modeled on Cygnus code for other platforms.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 Permission is hereby granted, free of charge, to any person obtaining
kono
parents:
diff changeset
12 a copy of this software and associated documentation files (the
kono
parents:
diff changeset
13 ``Software''), to deal in the Software without restriction, including
kono
parents:
diff changeset
14 without limitation the rights to use, copy, modify, merge, publish,
kono
parents:
diff changeset
15 distribute, sublicense, and/or sell copies of the Software, and to
kono
parents:
diff changeset
16 permit persons to whom the Software is furnished to do so, subject to
kono
parents:
diff changeset
17 the following conditions:
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 The above copyright notice and this permission notice shall be included
kono
parents:
diff changeset
20 in all copies or substantial portions of the Software.
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
kono
parents:
diff changeset
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
kono
parents:
diff changeset
25 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
kono
parents:
diff changeset
26 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
kono
parents:
diff changeset
27 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kono
parents:
diff changeset
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
kono
parents:
diff changeset
29 DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
30 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 #define LIBFFI_ASM
kono
parents:
diff changeset
33 #include <fficonfig.h>
kono
parents:
diff changeset
34 #include <ffi.h>
kono
parents:
diff changeset
35 #include "ia64_flags.h"
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 .pred.safe_across_calls p1-p5,p16-p63
kono
parents:
diff changeset
38 .text
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 /* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue,
kono
parents:
diff changeset
41 void (*fn)(void), int flags);
kono
parents:
diff changeset
42 */
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 .align 16
kono
parents:
diff changeset
45 .global ffi_call_unix
kono
parents:
diff changeset
46 .proc ffi_call_unix
kono
parents:
diff changeset
47 ffi_call_unix:
kono
parents:
diff changeset
48 .prologue
kono
parents:
diff changeset
49 /* Bit o trickiness. We actually share a stack frame with ffi_call.
kono
parents:
diff changeset
50 Rely on the fact that ffi_call uses a vframe and don't bother
kono
parents:
diff changeset
51 tracking one here at all. */
kono
parents:
diff changeset
52 .fframe 0
kono
parents:
diff changeset
53 .save ar.pfs, r36 // loc0
kono
parents:
diff changeset
54 alloc loc0 = ar.pfs, 4, 3, 8, 0
kono
parents:
diff changeset
55 .save rp, loc1
kono
parents:
diff changeset
56 mov loc1 = b0
kono
parents:
diff changeset
57 .body
kono
parents:
diff changeset
58 add r16 = 16, in0
kono
parents:
diff changeset
59 mov loc2 = gp
kono
parents:
diff changeset
60 mov r8 = in1
kono
parents:
diff changeset
61 ;;
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Load up all of the argument registers. */
kono
parents:
diff changeset
64 ldf.fill f8 = [in0], 32
kono
parents:
diff changeset
65 ldf.fill f9 = [r16], 32
kono
parents:
diff changeset
66 ;;
kono
parents:
diff changeset
67 ldf.fill f10 = [in0], 32
kono
parents:
diff changeset
68 ldf.fill f11 = [r16], 32
kono
parents:
diff changeset
69 ;;
kono
parents:
diff changeset
70 ldf.fill f12 = [in0], 32
kono
parents:
diff changeset
71 ldf.fill f13 = [r16], 32
kono
parents:
diff changeset
72 ;;
kono
parents:
diff changeset
73 ldf.fill f14 = [in0], 32
kono
parents:
diff changeset
74 ldf.fill f15 = [r16], 24
kono
parents:
diff changeset
75 ;;
kono
parents:
diff changeset
76 ld8 out0 = [in0], 16
kono
parents:
diff changeset
77 ld8 out1 = [r16], 16
kono
parents:
diff changeset
78 ;;
kono
parents:
diff changeset
79 ld8 out2 = [in0], 16
kono
parents:
diff changeset
80 ld8 out3 = [r16], 16
kono
parents:
diff changeset
81 ;;
kono
parents:
diff changeset
82 ld8 out4 = [in0], 16
kono
parents:
diff changeset
83 ld8 out5 = [r16], 16
kono
parents:
diff changeset
84 ;;
kono
parents:
diff changeset
85 ld8 out6 = [in0]
kono
parents:
diff changeset
86 ld8 out7 = [r16]
kono
parents:
diff changeset
87 ;;
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* Deallocate the register save area from the stack frame. */
kono
parents:
diff changeset
90 mov sp = in0
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 /* Call the target function. */
kono
parents:
diff changeset
93 ld8 r16 = [in2], 8
kono
parents:
diff changeset
94 ;;
kono
parents:
diff changeset
95 ld8 gp = [in2]
kono
parents:
diff changeset
96 mov b6 = r16
kono
parents:
diff changeset
97 br.call.sptk.many b0 = b6
kono
parents:
diff changeset
98 ;;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 /* Dispatch to handle return value. */
kono
parents:
diff changeset
101 mov gp = loc2
kono
parents:
diff changeset
102 zxt1 r16 = in3
kono
parents:
diff changeset
103 ;;
kono
parents:
diff changeset
104 mov ar.pfs = loc0
kono
parents:
diff changeset
105 addl r18 = @ltoffx(.Lst_table), gp
kono
parents:
diff changeset
106 ;;
kono
parents:
diff changeset
107 ld8.mov r18 = [r18], .Lst_table
kono
parents:
diff changeset
108 mov b0 = loc1
kono
parents:
diff changeset
109 ;;
kono
parents:
diff changeset
110 shladd r18 = r16, 3, r18
kono
parents:
diff changeset
111 ;;
kono
parents:
diff changeset
112 ld8 r17 = [r18]
kono
parents:
diff changeset
113 shr in3 = in3, 8
kono
parents:
diff changeset
114 ;;
kono
parents:
diff changeset
115 add r17 = r17, r18
kono
parents:
diff changeset
116 ;;
kono
parents:
diff changeset
117 mov b6 = r17
kono
parents:
diff changeset
118 br b6
kono
parents:
diff changeset
119 ;;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 .Lst_void:
kono
parents:
diff changeset
122 br.ret.sptk.many b0
kono
parents:
diff changeset
123 ;;
kono
parents:
diff changeset
124 .Lst_uint8:
kono
parents:
diff changeset
125 zxt1 r8 = r8
kono
parents:
diff changeset
126 ;;
kono
parents:
diff changeset
127 st8 [in1] = r8
kono
parents:
diff changeset
128 br.ret.sptk.many b0
kono
parents:
diff changeset
129 ;;
kono
parents:
diff changeset
130 .Lst_sint8:
kono
parents:
diff changeset
131 sxt1 r8 = r8
kono
parents:
diff changeset
132 ;;
kono
parents:
diff changeset
133 st8 [in1] = r8
kono
parents:
diff changeset
134 br.ret.sptk.many b0
kono
parents:
diff changeset
135 ;;
kono
parents:
diff changeset
136 .Lst_uint16:
kono
parents:
diff changeset
137 zxt2 r8 = r8
kono
parents:
diff changeset
138 ;;
kono
parents:
diff changeset
139 st8 [in1] = r8
kono
parents:
diff changeset
140 br.ret.sptk.many b0
kono
parents:
diff changeset
141 ;;
kono
parents:
diff changeset
142 .Lst_sint16:
kono
parents:
diff changeset
143 sxt2 r8 = r8
kono
parents:
diff changeset
144 ;;
kono
parents:
diff changeset
145 st8 [in1] = r8
kono
parents:
diff changeset
146 br.ret.sptk.many b0
kono
parents:
diff changeset
147 ;;
kono
parents:
diff changeset
148 .Lst_uint32:
kono
parents:
diff changeset
149 zxt4 r8 = r8
kono
parents:
diff changeset
150 ;;
kono
parents:
diff changeset
151 st8 [in1] = r8
kono
parents:
diff changeset
152 br.ret.sptk.many b0
kono
parents:
diff changeset
153 ;;
kono
parents:
diff changeset
154 .Lst_sint32:
kono
parents:
diff changeset
155 sxt4 r8 = r8
kono
parents:
diff changeset
156 ;;
kono
parents:
diff changeset
157 st8 [in1] = r8
kono
parents:
diff changeset
158 br.ret.sptk.many b0
kono
parents:
diff changeset
159 ;;
kono
parents:
diff changeset
160 .Lst_int64:
kono
parents:
diff changeset
161 st8 [in1] = r8
kono
parents:
diff changeset
162 br.ret.sptk.many b0
kono
parents:
diff changeset
163 ;;
kono
parents:
diff changeset
164 .Lst_float:
kono
parents:
diff changeset
165 stfs [in1] = f8
kono
parents:
diff changeset
166 br.ret.sptk.many b0
kono
parents:
diff changeset
167 ;;
kono
parents:
diff changeset
168 .Lst_double:
kono
parents:
diff changeset
169 stfd [in1] = f8
kono
parents:
diff changeset
170 br.ret.sptk.many b0
kono
parents:
diff changeset
171 ;;
kono
parents:
diff changeset
172 .Lst_ldouble:
kono
parents:
diff changeset
173 stfe [in1] = f8
kono
parents:
diff changeset
174 br.ret.sptk.many b0
kono
parents:
diff changeset
175 ;;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 .Lst_small_struct:
kono
parents:
diff changeset
178 add sp = -16, sp
kono
parents:
diff changeset
179 cmp.lt p6, p0 = 8, in3
kono
parents:
diff changeset
180 cmp.lt p7, p0 = 16, in3
kono
parents:
diff changeset
181 cmp.lt p8, p0 = 24, in3
kono
parents:
diff changeset
182 ;;
kono
parents:
diff changeset
183 add r16 = 8, sp
kono
parents:
diff changeset
184 add r17 = 16, sp
kono
parents:
diff changeset
185 add r18 = 24, sp
kono
parents:
diff changeset
186 ;;
kono
parents:
diff changeset
187 st8 [sp] = r8
kono
parents:
diff changeset
188 (p6) st8 [r16] = r9
kono
parents:
diff changeset
189 mov out0 = in1
kono
parents:
diff changeset
190 (p7) st8 [r17] = r10
kono
parents:
diff changeset
191 (p8) st8 [r18] = r11
kono
parents:
diff changeset
192 mov out1 = sp
kono
parents:
diff changeset
193 mov out2 = in3
kono
parents:
diff changeset
194 br.call.sptk.many b0 = memcpy#
kono
parents:
diff changeset
195 ;;
kono
parents:
diff changeset
196 mov ar.pfs = loc0
kono
parents:
diff changeset
197 mov b0 = loc1
kono
parents:
diff changeset
198 mov gp = loc2
kono
parents:
diff changeset
199 br.ret.sptk.many b0
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 .Lst_hfa_float:
kono
parents:
diff changeset
202 add r16 = 4, in1
kono
parents:
diff changeset
203 cmp.lt p6, p0 = 4, in3
kono
parents:
diff changeset
204 ;;
kono
parents:
diff changeset
205 stfs [in1] = f8, 8
kono
parents:
diff changeset
206 (p6) stfs [r16] = f9, 8
kono
parents:
diff changeset
207 cmp.lt p7, p0 = 8, in3
kono
parents:
diff changeset
208 cmp.lt p8, p0 = 12, in3
kono
parents:
diff changeset
209 ;;
kono
parents:
diff changeset
210 (p7) stfs [in1] = f10, 8
kono
parents:
diff changeset
211 (p8) stfs [r16] = f11, 8
kono
parents:
diff changeset
212 cmp.lt p9, p0 = 16, in3
kono
parents:
diff changeset
213 cmp.lt p10, p0 = 20, in3
kono
parents:
diff changeset
214 ;;
kono
parents:
diff changeset
215 (p9) stfs [in1] = f12, 8
kono
parents:
diff changeset
216 (p10) stfs [r16] = f13, 8
kono
parents:
diff changeset
217 cmp.lt p6, p0 = 24, in3
kono
parents:
diff changeset
218 cmp.lt p7, p0 = 28, in3
kono
parents:
diff changeset
219 ;;
kono
parents:
diff changeset
220 (p6) stfs [in1] = f14
kono
parents:
diff changeset
221 (p7) stfs [r16] = f15
kono
parents:
diff changeset
222 br.ret.sptk.many b0
kono
parents:
diff changeset
223 ;;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 .Lst_hfa_double:
kono
parents:
diff changeset
226 add r16 = 8, in1
kono
parents:
diff changeset
227 cmp.lt p6, p0 = 8, in3
kono
parents:
diff changeset
228 ;;
kono
parents:
diff changeset
229 stfd [in1] = f8, 16
kono
parents:
diff changeset
230 (p6) stfd [r16] = f9, 16
kono
parents:
diff changeset
231 cmp.lt p7, p0 = 16, in3
kono
parents:
diff changeset
232 cmp.lt p8, p0 = 24, in3
kono
parents:
diff changeset
233 ;;
kono
parents:
diff changeset
234 (p7) stfd [in1] = f10, 16
kono
parents:
diff changeset
235 (p8) stfd [r16] = f11, 16
kono
parents:
diff changeset
236 cmp.lt p9, p0 = 32, in3
kono
parents:
diff changeset
237 cmp.lt p10, p0 = 40, in3
kono
parents:
diff changeset
238 ;;
kono
parents:
diff changeset
239 (p9) stfd [in1] = f12, 16
kono
parents:
diff changeset
240 (p10) stfd [r16] = f13, 16
kono
parents:
diff changeset
241 cmp.lt p6, p0 = 48, in3
kono
parents:
diff changeset
242 cmp.lt p7, p0 = 56, in3
kono
parents:
diff changeset
243 ;;
kono
parents:
diff changeset
244 (p6) stfd [in1] = f14
kono
parents:
diff changeset
245 (p7) stfd [r16] = f15
kono
parents:
diff changeset
246 br.ret.sptk.many b0
kono
parents:
diff changeset
247 ;;
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 .Lst_hfa_ldouble:
kono
parents:
diff changeset
250 add r16 = 16, in1
kono
parents:
diff changeset
251 cmp.lt p6, p0 = 16, in3
kono
parents:
diff changeset
252 ;;
kono
parents:
diff changeset
253 stfe [in1] = f8, 32
kono
parents:
diff changeset
254 (p6) stfe [r16] = f9, 32
kono
parents:
diff changeset
255 cmp.lt p7, p0 = 32, in3
kono
parents:
diff changeset
256 cmp.lt p8, p0 = 48, in3
kono
parents:
diff changeset
257 ;;
kono
parents:
diff changeset
258 (p7) stfe [in1] = f10, 32
kono
parents:
diff changeset
259 (p8) stfe [r16] = f11, 32
kono
parents:
diff changeset
260 cmp.lt p9, p0 = 64, in3
kono
parents:
diff changeset
261 cmp.lt p10, p0 = 80, in3
kono
parents:
diff changeset
262 ;;
kono
parents:
diff changeset
263 (p9) stfe [in1] = f12, 32
kono
parents:
diff changeset
264 (p10) stfe [r16] = f13, 32
kono
parents:
diff changeset
265 cmp.lt p6, p0 = 96, in3
kono
parents:
diff changeset
266 cmp.lt p7, p0 = 112, in3
kono
parents:
diff changeset
267 ;;
kono
parents:
diff changeset
268 (p6) stfe [in1] = f14
kono
parents:
diff changeset
269 (p7) stfe [r16] = f15
kono
parents:
diff changeset
270 br.ret.sptk.many b0
kono
parents:
diff changeset
271 ;;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 .endp ffi_call_unix
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 .align 16
kono
parents:
diff changeset
276 .global ffi_closure_unix
kono
parents:
diff changeset
277 .proc ffi_closure_unix
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 #define FRAME_SIZE (8*16 + 8*8 + 8*16)
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 ffi_closure_unix:
kono
parents:
diff changeset
282 .prologue
kono
parents:
diff changeset
283 .save ar.pfs, r40 // loc0
kono
parents:
diff changeset
284 alloc loc0 = ar.pfs, 8, 4, 4, 0
kono
parents:
diff changeset
285 .fframe FRAME_SIZE
kono
parents:
diff changeset
286 add r12 = -FRAME_SIZE, r12
kono
parents:
diff changeset
287 .save rp, loc1
kono
parents:
diff changeset
288 mov loc1 = b0
kono
parents:
diff changeset
289 .save ar.unat, loc2
kono
parents:
diff changeset
290 mov loc2 = ar.unat
kono
parents:
diff changeset
291 .body
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 /* Retrieve closure pointer and real gp. */
kono
parents:
diff changeset
294 #ifdef _ILP32
kono
parents:
diff changeset
295 addp4 out0 = 0, gp
kono
parents:
diff changeset
296 addp4 gp = 16, gp
kono
parents:
diff changeset
297 #else
kono
parents:
diff changeset
298 mov out0 = gp
kono
parents:
diff changeset
299 add gp = 16, gp
kono
parents:
diff changeset
300 #endif
kono
parents:
diff changeset
301 ;;
kono
parents:
diff changeset
302 ld8 gp = [gp]
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 /* Spill all of the possible argument registers. */
kono
parents:
diff changeset
305 add r16 = 16 + 8*16, sp
kono
parents:
diff changeset
306 add r17 = 16 + 8*16 + 16, sp
kono
parents:
diff changeset
307 ;;
kono
parents:
diff changeset
308 stf.spill [r16] = f8, 32
kono
parents:
diff changeset
309 stf.spill [r17] = f9, 32
kono
parents:
diff changeset
310 mov loc3 = gp
kono
parents:
diff changeset
311 ;;
kono
parents:
diff changeset
312 stf.spill [r16] = f10, 32
kono
parents:
diff changeset
313 stf.spill [r17] = f11, 32
kono
parents:
diff changeset
314 ;;
kono
parents:
diff changeset
315 stf.spill [r16] = f12, 32
kono
parents:
diff changeset
316 stf.spill [r17] = f13, 32
kono
parents:
diff changeset
317 ;;
kono
parents:
diff changeset
318 stf.spill [r16] = f14, 32
kono
parents:
diff changeset
319 stf.spill [r17] = f15, 24
kono
parents:
diff changeset
320 ;;
kono
parents:
diff changeset
321 .mem.offset 0, 0
kono
parents:
diff changeset
322 st8.spill [r16] = in0, 16
kono
parents:
diff changeset
323 .mem.offset 8, 0
kono
parents:
diff changeset
324 st8.spill [r17] = in1, 16
kono
parents:
diff changeset
325 add out1 = 16 + 8*16, sp
kono
parents:
diff changeset
326 ;;
kono
parents:
diff changeset
327 .mem.offset 0, 0
kono
parents:
diff changeset
328 st8.spill [r16] = in2, 16
kono
parents:
diff changeset
329 .mem.offset 8, 0
kono
parents:
diff changeset
330 st8.spill [r17] = in3, 16
kono
parents:
diff changeset
331 add out2 = 16, sp
kono
parents:
diff changeset
332 ;;
kono
parents:
diff changeset
333 .mem.offset 0, 0
kono
parents:
diff changeset
334 st8.spill [r16] = in4, 16
kono
parents:
diff changeset
335 .mem.offset 8, 0
kono
parents:
diff changeset
336 st8.spill [r17] = in5, 16
kono
parents:
diff changeset
337 mov out3 = r8
kono
parents:
diff changeset
338 ;;
kono
parents:
diff changeset
339 .mem.offset 0, 0
kono
parents:
diff changeset
340 st8.spill [r16] = in6
kono
parents:
diff changeset
341 .mem.offset 8, 0
kono
parents:
diff changeset
342 st8.spill [r17] = in7
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 /* Invoke ffi_closure_unix_inner for the hard work. */
kono
parents:
diff changeset
345 br.call.sptk.many b0 = ffi_closure_unix_inner
kono
parents:
diff changeset
346 ;;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 /* Dispatch to handle return value. */
kono
parents:
diff changeset
349 mov gp = loc3
kono
parents:
diff changeset
350 zxt1 r16 = r8
kono
parents:
diff changeset
351 ;;
kono
parents:
diff changeset
352 addl r18 = @ltoffx(.Lld_table), gp
kono
parents:
diff changeset
353 mov ar.pfs = loc0
kono
parents:
diff changeset
354 ;;
kono
parents:
diff changeset
355 ld8.mov r18 = [r18], .Lld_table
kono
parents:
diff changeset
356 mov b0 = loc1
kono
parents:
diff changeset
357 ;;
kono
parents:
diff changeset
358 shladd r18 = r16, 3, r18
kono
parents:
diff changeset
359 mov ar.unat = loc2
kono
parents:
diff changeset
360 ;;
kono
parents:
diff changeset
361 ld8 r17 = [r18]
kono
parents:
diff changeset
362 shr r8 = r8, 8
kono
parents:
diff changeset
363 ;;
kono
parents:
diff changeset
364 add r17 = r17, r18
kono
parents:
diff changeset
365 add r16 = 16, sp
kono
parents:
diff changeset
366 ;;
kono
parents:
diff changeset
367 mov b6 = r17
kono
parents:
diff changeset
368 br b6
kono
parents:
diff changeset
369 ;;
kono
parents:
diff changeset
370 .label_state 1
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 .Lld_void:
kono
parents:
diff changeset
373 .restore sp
kono
parents:
diff changeset
374 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
375 br.ret.sptk.many b0
kono
parents:
diff changeset
376 ;;
kono
parents:
diff changeset
377 .Lld_int:
kono
parents:
diff changeset
378 .body
kono
parents:
diff changeset
379 .copy_state 1
kono
parents:
diff changeset
380 ld8 r8 = [r16]
kono
parents:
diff changeset
381 .restore sp
kono
parents:
diff changeset
382 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
383 br.ret.sptk.many b0
kono
parents:
diff changeset
384 ;;
kono
parents:
diff changeset
385 .Lld_float:
kono
parents:
diff changeset
386 .body
kono
parents:
diff changeset
387 .copy_state 1
kono
parents:
diff changeset
388 ldfs f8 = [r16]
kono
parents:
diff changeset
389 .restore sp
kono
parents:
diff changeset
390 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
391 br.ret.sptk.many b0
kono
parents:
diff changeset
392 ;;
kono
parents:
diff changeset
393 .Lld_double:
kono
parents:
diff changeset
394 .body
kono
parents:
diff changeset
395 .copy_state 1
kono
parents:
diff changeset
396 ldfd f8 = [r16]
kono
parents:
diff changeset
397 .restore sp
kono
parents:
diff changeset
398 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
399 br.ret.sptk.many b0
kono
parents:
diff changeset
400 ;;
kono
parents:
diff changeset
401 .Lld_ldouble:
kono
parents:
diff changeset
402 .body
kono
parents:
diff changeset
403 .copy_state 1
kono
parents:
diff changeset
404 ldfe f8 = [r16]
kono
parents:
diff changeset
405 .restore sp
kono
parents:
diff changeset
406 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
407 br.ret.sptk.many b0
kono
parents:
diff changeset
408 ;;
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 .Lld_small_struct:
kono
parents:
diff changeset
411 .body
kono
parents:
diff changeset
412 .copy_state 1
kono
parents:
diff changeset
413 add r17 = 8, r16
kono
parents:
diff changeset
414 cmp.lt p6, p0 = 8, r8
kono
parents:
diff changeset
415 cmp.lt p7, p0 = 16, r8
kono
parents:
diff changeset
416 cmp.lt p8, p0 = 24, r8
kono
parents:
diff changeset
417 ;;
kono
parents:
diff changeset
418 ld8 r8 = [r16], 16
kono
parents:
diff changeset
419 (p6) ld8 r9 = [r17], 16
kono
parents:
diff changeset
420 ;;
kono
parents:
diff changeset
421 (p7) ld8 r10 = [r16]
kono
parents:
diff changeset
422 (p8) ld8 r11 = [r17]
kono
parents:
diff changeset
423 .restore sp
kono
parents:
diff changeset
424 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
425 br.ret.sptk.many b0
kono
parents:
diff changeset
426 ;;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 .Lld_hfa_float:
kono
parents:
diff changeset
429 .body
kono
parents:
diff changeset
430 .copy_state 1
kono
parents:
diff changeset
431 add r17 = 4, r16
kono
parents:
diff changeset
432 cmp.lt p6, p0 = 4, r8
kono
parents:
diff changeset
433 ;;
kono
parents:
diff changeset
434 ldfs f8 = [r16], 8
kono
parents:
diff changeset
435 (p6) ldfs f9 = [r17], 8
kono
parents:
diff changeset
436 cmp.lt p7, p0 = 8, r8
kono
parents:
diff changeset
437 cmp.lt p8, p0 = 12, r8
kono
parents:
diff changeset
438 ;;
kono
parents:
diff changeset
439 (p7) ldfs f10 = [r16], 8
kono
parents:
diff changeset
440 (p8) ldfs f11 = [r17], 8
kono
parents:
diff changeset
441 cmp.lt p9, p0 = 16, r8
kono
parents:
diff changeset
442 cmp.lt p10, p0 = 20, r8
kono
parents:
diff changeset
443 ;;
kono
parents:
diff changeset
444 (p9) ldfs f12 = [r16], 8
kono
parents:
diff changeset
445 (p10) ldfs f13 = [r17], 8
kono
parents:
diff changeset
446 cmp.lt p6, p0 = 24, r8
kono
parents:
diff changeset
447 cmp.lt p7, p0 = 28, r8
kono
parents:
diff changeset
448 ;;
kono
parents:
diff changeset
449 (p6) ldfs f14 = [r16]
kono
parents:
diff changeset
450 (p7) ldfs f15 = [r17]
kono
parents:
diff changeset
451 .restore sp
kono
parents:
diff changeset
452 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
453 br.ret.sptk.many b0
kono
parents:
diff changeset
454 ;;
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 .Lld_hfa_double:
kono
parents:
diff changeset
457 .body
kono
parents:
diff changeset
458 .copy_state 1
kono
parents:
diff changeset
459 add r17 = 8, r16
kono
parents:
diff changeset
460 cmp.lt p6, p0 = 8, r8
kono
parents:
diff changeset
461 ;;
kono
parents:
diff changeset
462 ldfd f8 = [r16], 16
kono
parents:
diff changeset
463 (p6) ldfd f9 = [r17], 16
kono
parents:
diff changeset
464 cmp.lt p7, p0 = 16, r8
kono
parents:
diff changeset
465 cmp.lt p8, p0 = 24, r8
kono
parents:
diff changeset
466 ;;
kono
parents:
diff changeset
467 (p7) ldfd f10 = [r16], 16
kono
parents:
diff changeset
468 (p8) ldfd f11 = [r17], 16
kono
parents:
diff changeset
469 cmp.lt p9, p0 = 32, r8
kono
parents:
diff changeset
470 cmp.lt p10, p0 = 40, r8
kono
parents:
diff changeset
471 ;;
kono
parents:
diff changeset
472 (p9) ldfd f12 = [r16], 16
kono
parents:
diff changeset
473 (p10) ldfd f13 = [r17], 16
kono
parents:
diff changeset
474 cmp.lt p6, p0 = 48, r8
kono
parents:
diff changeset
475 cmp.lt p7, p0 = 56, r8
kono
parents:
diff changeset
476 ;;
kono
parents:
diff changeset
477 (p6) ldfd f14 = [r16]
kono
parents:
diff changeset
478 (p7) ldfd f15 = [r17]
kono
parents:
diff changeset
479 .restore sp
kono
parents:
diff changeset
480 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
481 br.ret.sptk.many b0
kono
parents:
diff changeset
482 ;;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 .Lld_hfa_ldouble:
kono
parents:
diff changeset
485 .body
kono
parents:
diff changeset
486 .copy_state 1
kono
parents:
diff changeset
487 add r17 = 16, r16
kono
parents:
diff changeset
488 cmp.lt p6, p0 = 16, r8
kono
parents:
diff changeset
489 ;;
kono
parents:
diff changeset
490 ldfe f8 = [r16], 32
kono
parents:
diff changeset
491 (p6) ldfe f9 = [r17], 32
kono
parents:
diff changeset
492 cmp.lt p7, p0 = 32, r8
kono
parents:
diff changeset
493 cmp.lt p8, p0 = 48, r8
kono
parents:
diff changeset
494 ;;
kono
parents:
diff changeset
495 (p7) ldfe f10 = [r16], 32
kono
parents:
diff changeset
496 (p8) ldfe f11 = [r17], 32
kono
parents:
diff changeset
497 cmp.lt p9, p0 = 64, r8
kono
parents:
diff changeset
498 cmp.lt p10, p0 = 80, r8
kono
parents:
diff changeset
499 ;;
kono
parents:
diff changeset
500 (p9) ldfe f12 = [r16], 32
kono
parents:
diff changeset
501 (p10) ldfe f13 = [r17], 32
kono
parents:
diff changeset
502 cmp.lt p6, p0 = 96, r8
kono
parents:
diff changeset
503 cmp.lt p7, p0 = 112, r8
kono
parents:
diff changeset
504 ;;
kono
parents:
diff changeset
505 (p6) ldfe f14 = [r16]
kono
parents:
diff changeset
506 (p7) ldfe f15 = [r17]
kono
parents:
diff changeset
507 .restore sp
kono
parents:
diff changeset
508 add sp = FRAME_SIZE, sp
kono
parents:
diff changeset
509 br.ret.sptk.many b0
kono
parents:
diff changeset
510 ;;
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 .endp ffi_closure_unix
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 .section .rodata
kono
parents:
diff changeset
515 .align 8
kono
parents:
diff changeset
516 .Lst_table:
kono
parents:
diff changeset
517 data8 @pcrel(.Lst_void) // FFI_TYPE_VOID
kono
parents:
diff changeset
518 data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT
kono
parents:
diff changeset
519 data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT
kono
parents:
diff changeset
520 data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE
kono
parents:
diff changeset
521 data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE
kono
parents:
diff changeset
522 data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8
kono
parents:
diff changeset
523 data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8
kono
parents:
diff changeset
524 data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16
kono
parents:
diff changeset
525 data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16
kono
parents:
diff changeset
526 data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32
kono
parents:
diff changeset
527 data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32
kono
parents:
diff changeset
528 data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64
kono
parents:
diff changeset
529 data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64
kono
parents:
diff changeset
530 data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT
kono
parents:
diff changeset
531 data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER
kono
parents:
diff changeset
532 data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT
kono
parents:
diff changeset
533 data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT
kono
parents:
diff changeset
534 data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE
kono
parents:
diff changeset
535 data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 .Lld_table:
kono
parents:
diff changeset
538 data8 @pcrel(.Lld_void) // FFI_TYPE_VOID
kono
parents:
diff changeset
539 data8 @pcrel(.Lld_int) // FFI_TYPE_INT
kono
parents:
diff changeset
540 data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT
kono
parents:
diff changeset
541 data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE
kono
parents:
diff changeset
542 data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE
kono
parents:
diff changeset
543 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8
kono
parents:
diff changeset
544 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8
kono
parents:
diff changeset
545 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16
kono
parents:
diff changeset
546 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16
kono
parents:
diff changeset
547 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32
kono
parents:
diff changeset
548 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32
kono
parents:
diff changeset
549 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64
kono
parents:
diff changeset
550 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64
kono
parents:
diff changeset
551 data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT
kono
parents:
diff changeset
552 data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER
kono
parents:
diff changeset
553 data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT
kono
parents:
diff changeset
554 data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT
kono
parents:
diff changeset
555 data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE
kono
parents:
diff changeset
556 data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 #if defined __ELF__ && defined __linux__
kono
parents:
diff changeset
559 .section .note.GNU-stack,"",@progbits
kono
parents:
diff changeset
560 #endif