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