annotate libffi/src/sh64/sysv.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 sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 SuperH SHmedia Foreign Function Interface
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 Permission is hereby granted, free of charge, to any person obtaining
kono
parents:
diff changeset
7 a copy of this software and associated documentation files (the
kono
parents:
diff changeset
8 ``Software''), to deal in the Software without restriction, including
kono
parents:
diff changeset
9 without limitation the rights to use, copy, modify, merge, publish,
kono
parents:
diff changeset
10 distribute, sublicense, and/or sell copies of the Software, and to
kono
parents:
diff changeset
11 permit persons to whom the Software is furnished to do so, subject to
kono
parents:
diff changeset
12 the following conditions:
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 The above copyright notice and this permission notice shall be included
kono
parents:
diff changeset
15 in all copies or substantial portions of the Software.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
kono
parents:
diff changeset
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
kono
parents:
diff changeset
21 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
kono
parents:
diff changeset
22 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
kono
parents:
diff changeset
23 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kono
parents:
diff changeset
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
kono
parents:
diff changeset
25 DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
26 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 #define LIBFFI_ASM
kono
parents:
diff changeset
29 #include <fficonfig.h>
kono
parents:
diff changeset
30 #include <ffi.h>
kono
parents:
diff changeset
31 #ifdef HAVE_MACHINE_ASM_H
kono
parents:
diff changeset
32 #include <machine/asm.h>
kono
parents:
diff changeset
33 #else
kono
parents:
diff changeset
34 /* XXX these lose for some platforms, I'm sure. */
kono
parents:
diff changeset
35 #define CNAME(x) x
kono
parents:
diff changeset
36 #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
kono
parents:
diff changeset
37 #endif
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 #ifdef __LITTLE_ENDIAN__
kono
parents:
diff changeset
40 #define OFS_FLT 0
kono
parents:
diff changeset
41 #else
kono
parents:
diff changeset
42 #define OFS_FLT 4
kono
parents:
diff changeset
43 #endif
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 .section .text..SHmedia32,"ax"
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 # r2: ffi_prep_args
kono
parents:
diff changeset
48 # r3: &ecif
kono
parents:
diff changeset
49 # r4: bytes
kono
parents:
diff changeset
50 # r5: flags
kono
parents:
diff changeset
51 # r6: flags2
kono
parents:
diff changeset
52 # r7: rvalue
kono
parents:
diff changeset
53 # r8: fn
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 # This assumes we are using gas.
kono
parents:
diff changeset
56 .align 5
kono
parents:
diff changeset
57 ENTRY(ffi_call_SYSV)
kono
parents:
diff changeset
58 # Save registers
kono
parents:
diff changeset
59 .LFB1:
kono
parents:
diff changeset
60 addi.l r15, -48, r15
kono
parents:
diff changeset
61 .LCFI0:
kono
parents:
diff changeset
62 st.q r15, 40, r32
kono
parents:
diff changeset
63 st.q r15, 32, r31
kono
parents:
diff changeset
64 st.q r15, 24, r30
kono
parents:
diff changeset
65 st.q r15, 16, r29
kono
parents:
diff changeset
66 st.q r15, 8, r28
kono
parents:
diff changeset
67 st.l r15, 4, r18
kono
parents:
diff changeset
68 st.l r15, 0, r14
kono
parents:
diff changeset
69 .LCFI1:
kono
parents:
diff changeset
70 add.l r15, r63, r14
kono
parents:
diff changeset
71 .LCFI2:
kono
parents:
diff changeset
72 # add r4, r63, r28
kono
parents:
diff changeset
73 add r5, r63, r29
kono
parents:
diff changeset
74 add r6, r63, r30
kono
parents:
diff changeset
75 add r7, r63, r31
kono
parents:
diff changeset
76 add r8, r63, r32
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 addi r4, (64 + 7), r4
kono
parents:
diff changeset
79 andi r4, ~7, r4
kono
parents:
diff changeset
80 sub.l r15, r4, r15
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 ptabs/l r2, tr0
kono
parents:
diff changeset
83 add r15, r63, r2
kono
parents:
diff changeset
84 blink tr0, r18
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 addi r15, 64, r22
kono
parents:
diff changeset
87 movi 0, r0
kono
parents:
diff changeset
88 movi 0, r1
kono
parents:
diff changeset
89 movi -1, r23
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 pt/l 1f, tr1
kono
parents:
diff changeset
92 bnei/l r29, FFI_TYPE_STRUCT, tr1
kono
parents:
diff changeset
93 ld.l r15, 0, r19
kono
parents:
diff changeset
94 addi r15, 8, r15
kono
parents:
diff changeset
95 addi r0, 1, r0
kono
parents:
diff changeset
96 1:
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 .L_pass:
kono
parents:
diff changeset
99 andi r30, 3, r20
kono
parents:
diff changeset
100 shlri r30, 2, r30
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 pt/l .L_call_it, tr0
kono
parents:
diff changeset
103 pt/l .L_pass_i, tr1
kono
parents:
diff changeset
104 pt/l .L_pass_f, tr2
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 beqi/l r20, FFI_TYPE_VOID, tr0
kono
parents:
diff changeset
107 beqi/l r20, FFI_TYPE_INT, tr1
kono
parents:
diff changeset
108 beqi/l r20, FFI_TYPE_FLOAT, tr2
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 .L_pass_d:
kono
parents:
diff changeset
111 addi r0, 1, r0
kono
parents:
diff changeset
112 pt/l 3f, tr0
kono
parents:
diff changeset
113 movi 12, r20
kono
parents:
diff changeset
114 bge/l r1, r20, tr0
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 pt/l .L_pop_d, tr1
kono
parents:
diff changeset
117 pt/l 2f, tr0
kono
parents:
diff changeset
118 blink tr1, r63
kono
parents:
diff changeset
119 2:
kono
parents:
diff changeset
120 addi.l r15, 8, r15
kono
parents:
diff changeset
121 3:
kono
parents:
diff changeset
122 pt/l .L_pass, tr0
kono
parents:
diff changeset
123 addi r1, 2, r1
kono
parents:
diff changeset
124 blink tr0, r63
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 .L_pop_d:
kono
parents:
diff changeset
127 pt/l .L_pop_d_tbl, tr1
kono
parents:
diff changeset
128 gettr tr1, r20
kono
parents:
diff changeset
129 shlli r1, 2, r21
kono
parents:
diff changeset
130 add r20, r21, r20
kono
parents:
diff changeset
131 ptabs/l r20, tr1
kono
parents:
diff changeset
132 blink tr1, r63
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 .L_pop_d_tbl:
kono
parents:
diff changeset
135 fld.d r15, 0, dr0
kono
parents:
diff changeset
136 blink tr0, r63
kono
parents:
diff changeset
137 fld.d r15, 0, dr2
kono
parents:
diff changeset
138 blink tr0, r63
kono
parents:
diff changeset
139 fld.d r15, 0, dr4
kono
parents:
diff changeset
140 blink tr0, r63
kono
parents:
diff changeset
141 fld.d r15, 0, dr6
kono
parents:
diff changeset
142 blink tr0, r63
kono
parents:
diff changeset
143 fld.d r15, 0, dr8
kono
parents:
diff changeset
144 blink tr0, r63
kono
parents:
diff changeset
145 fld.d r15, 0, dr10
kono
parents:
diff changeset
146 blink tr0, r63
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 .L_pass_f:
kono
parents:
diff changeset
149 addi r0, 1, r0
kono
parents:
diff changeset
150 pt/l 3f, tr0
kono
parents:
diff changeset
151 movi 12, r20
kono
parents:
diff changeset
152 bge/l r1, r20, tr0
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 pt/l .L_pop_f, tr1
kono
parents:
diff changeset
155 pt/l 2f, tr0
kono
parents:
diff changeset
156 blink tr1, r63
kono
parents:
diff changeset
157 2:
kono
parents:
diff changeset
158 addi.l r15, 8, r15
kono
parents:
diff changeset
159 3:
kono
parents:
diff changeset
160 pt/l .L_pass, tr0
kono
parents:
diff changeset
161 blink tr0, r63
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 .L_pop_f:
kono
parents:
diff changeset
164 pt/l .L_pop_f_tbl, tr1
kono
parents:
diff changeset
165 pt/l 5f, tr2
kono
parents:
diff changeset
166 gettr tr1, r20
kono
parents:
diff changeset
167 bge/l r23, r63, tr2
kono
parents:
diff changeset
168 add r1, r63, r23
kono
parents:
diff changeset
169 shlli r1, 3, r21
kono
parents:
diff changeset
170 addi r1, 2, r1
kono
parents:
diff changeset
171 add r20, r21, r20
kono
parents:
diff changeset
172 ptabs/l r20, tr1
kono
parents:
diff changeset
173 blink tr1, r63
kono
parents:
diff changeset
174 5:
kono
parents:
diff changeset
175 addi r23, 1, r21
kono
parents:
diff changeset
176 movi -1, r23
kono
parents:
diff changeset
177 shlli r21, 3, r21
kono
parents:
diff changeset
178 add r20, r21, r20
kono
parents:
diff changeset
179 ptabs/l r20, tr1
kono
parents:
diff changeset
180 blink tr1, r63
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 .L_pop_f_tbl:
kono
parents:
diff changeset
183 fld.s r15, OFS_FLT, fr0
kono
parents:
diff changeset
184 blink tr0, r63
kono
parents:
diff changeset
185 fld.s r15, OFS_FLT, fr1
kono
parents:
diff changeset
186 blink tr0, r63
kono
parents:
diff changeset
187 fld.s r15, OFS_FLT, fr2
kono
parents:
diff changeset
188 blink tr0, r63
kono
parents:
diff changeset
189 fld.s r15, OFS_FLT, fr3
kono
parents:
diff changeset
190 blink tr0, r63
kono
parents:
diff changeset
191 fld.s r15, OFS_FLT, fr4
kono
parents:
diff changeset
192 blink tr0, r63
kono
parents:
diff changeset
193 fld.s r15, OFS_FLT, fr5
kono
parents:
diff changeset
194 blink tr0, r63
kono
parents:
diff changeset
195 fld.s r15, OFS_FLT, fr6
kono
parents:
diff changeset
196 blink tr0, r63
kono
parents:
diff changeset
197 fld.s r15, OFS_FLT, fr7
kono
parents:
diff changeset
198 blink tr0, r63
kono
parents:
diff changeset
199 fld.s r15, OFS_FLT, fr8
kono
parents:
diff changeset
200 blink tr0, r63
kono
parents:
diff changeset
201 fld.s r15, OFS_FLT, fr9
kono
parents:
diff changeset
202 blink tr0, r63
kono
parents:
diff changeset
203 fld.s r15, OFS_FLT, fr10
kono
parents:
diff changeset
204 blink tr0, r63
kono
parents:
diff changeset
205 fld.s r15, OFS_FLT, fr11
kono
parents:
diff changeset
206 blink tr0, r63
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 .L_pass_i:
kono
parents:
diff changeset
209 pt/l 3f, tr0
kono
parents:
diff changeset
210 movi 8, r20
kono
parents:
diff changeset
211 bge/l r0, r20, tr0
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 pt/l .L_pop_i, tr1
kono
parents:
diff changeset
214 pt/l 2f, tr0
kono
parents:
diff changeset
215 blink tr1, r63
kono
parents:
diff changeset
216 2:
kono
parents:
diff changeset
217 addi.l r15, 8, r15
kono
parents:
diff changeset
218 3:
kono
parents:
diff changeset
219 pt/l .L_pass, tr0
kono
parents:
diff changeset
220 addi r0, 1, r0
kono
parents:
diff changeset
221 blink tr0, r63
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 .L_pop_i:
kono
parents:
diff changeset
224 pt/l .L_pop_i_tbl, tr1
kono
parents:
diff changeset
225 gettr tr1, r20
kono
parents:
diff changeset
226 shlli r0, 3, r21
kono
parents:
diff changeset
227 add r20, r21, r20
kono
parents:
diff changeset
228 ptabs/l r20, tr1
kono
parents:
diff changeset
229 blink tr1, r63
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 .L_pop_i_tbl:
kono
parents:
diff changeset
232 ld.q r15, 0, r2
kono
parents:
diff changeset
233 blink tr0, r63
kono
parents:
diff changeset
234 ld.q r15, 0, r3
kono
parents:
diff changeset
235 blink tr0, r63
kono
parents:
diff changeset
236 ld.q r15, 0, r4
kono
parents:
diff changeset
237 blink tr0, r63
kono
parents:
diff changeset
238 ld.q r15, 0, r5
kono
parents:
diff changeset
239 blink tr0, r63
kono
parents:
diff changeset
240 ld.q r15, 0, r6
kono
parents:
diff changeset
241 blink tr0, r63
kono
parents:
diff changeset
242 ld.q r15, 0, r7
kono
parents:
diff changeset
243 blink tr0, r63
kono
parents:
diff changeset
244 ld.q r15, 0, r8
kono
parents:
diff changeset
245 blink tr0, r63
kono
parents:
diff changeset
246 ld.q r15, 0, r9
kono
parents:
diff changeset
247 blink tr0, r63
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 .L_call_it:
kono
parents:
diff changeset
250 # call function
kono
parents:
diff changeset
251 pt/l 1f, tr1
kono
parents:
diff changeset
252 bnei/l r29, FFI_TYPE_STRUCT, tr1
kono
parents:
diff changeset
253 add r19, r63, r2
kono
parents:
diff changeset
254 1:
kono
parents:
diff changeset
255 add r22, r63, r15
kono
parents:
diff changeset
256 ptabs/l r32, tr0
kono
parents:
diff changeset
257 blink tr0, r18
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 pt/l .L_ret_i, tr0
kono
parents:
diff changeset
260 pt/l .L_ret_ll, tr1
kono
parents:
diff changeset
261 pt/l .L_ret_d, tr2
kono
parents:
diff changeset
262 pt/l .L_ret_f, tr3
kono
parents:
diff changeset
263 pt/l .L_epilogue, tr4
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 beqi/l r29, FFI_TYPE_INT, tr0
kono
parents:
diff changeset
266 beqi/l r29, FFI_TYPE_UINT32, tr0
kono
parents:
diff changeset
267 beqi/l r29, FFI_TYPE_SINT64, tr1
kono
parents:
diff changeset
268 beqi/l r29, FFI_TYPE_UINT64, tr1
kono
parents:
diff changeset
269 beqi/l r29, FFI_TYPE_DOUBLE, tr2
kono
parents:
diff changeset
270 beqi/l r29, FFI_TYPE_FLOAT, tr3
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 pt/l .L_ret_q, tr0
kono
parents:
diff changeset
273 pt/l .L_ret_h, tr1
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 beqi/l r29, FFI_TYPE_UINT8, tr0
kono
parents:
diff changeset
276 beqi/l r29, FFI_TYPE_UINT16, tr1
kono
parents:
diff changeset
277 blink tr4, r63
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 .L_ret_d:
kono
parents:
diff changeset
280 fst.d r31, 0, dr0
kono
parents:
diff changeset
281 blink tr4, r63
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 .L_ret_ll:
kono
parents:
diff changeset
284 st.q r31, 0, r2
kono
parents:
diff changeset
285 blink tr4, r63
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 .L_ret_f:
kono
parents:
diff changeset
288 fst.s r31, OFS_FLT, fr0
kono
parents:
diff changeset
289 blink tr4, r63
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 .L_ret_q:
kono
parents:
diff changeset
292 st.b r31, 0, r2
kono
parents:
diff changeset
293 blink tr4, r63
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 .L_ret_h:
kono
parents:
diff changeset
296 st.w r31, 0, r2
kono
parents:
diff changeset
297 blink tr4, r63
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 .L_ret_i:
kono
parents:
diff changeset
300 st.l r31, 0, r2
kono
parents:
diff changeset
301 # Fall
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 .L_epilogue:
kono
parents:
diff changeset
304 # Remove the space we pushed for the args
kono
parents:
diff changeset
305 add r14, r63, r15
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 ld.l r15, 0, r14
kono
parents:
diff changeset
308 ld.l r15, 4, r18
kono
parents:
diff changeset
309 ld.q r15, 8, r28
kono
parents:
diff changeset
310 ld.q r15, 16, r29
kono
parents:
diff changeset
311 ld.q r15, 24, r30
kono
parents:
diff changeset
312 ld.q r15, 32, r31
kono
parents:
diff changeset
313 ld.q r15, 40, r32
kono
parents:
diff changeset
314 addi.l r15, 48, r15
kono
parents:
diff changeset
315 ptabs r18, tr0
kono
parents:
diff changeset
316 blink tr0, r63
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 .LFE1:
kono
parents:
diff changeset
319 .ffi_call_SYSV_end:
kono
parents:
diff changeset
320 .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 .align 5
kono
parents:
diff changeset
323 ENTRY(ffi_closure_SYSV)
kono
parents:
diff changeset
324 .LFB2:
kono
parents:
diff changeset
325 addi.l r15, -136, r15
kono
parents:
diff changeset
326 .LCFI3:
kono
parents:
diff changeset
327 st.l r15, 12, r18
kono
parents:
diff changeset
328 st.l r15, 8, r14
kono
parents:
diff changeset
329 st.l r15, 4, r12
kono
parents:
diff changeset
330 .LCFI4:
kono
parents:
diff changeset
331 add r15, r63, r14
kono
parents:
diff changeset
332 .LCFI5:
kono
parents:
diff changeset
333 /* Stack layout:
kono
parents:
diff changeset
334 ...
kono
parents:
diff changeset
335 64 bytes (register parameters)
kono
parents:
diff changeset
336 48 bytes (floating register parameters)
kono
parents:
diff changeset
337 8 bytes (result)
kono
parents:
diff changeset
338 4 bytes (r18)
kono
parents:
diff changeset
339 4 bytes (r14)
kono
parents:
diff changeset
340 4 bytes (r12)
kono
parents:
diff changeset
341 4 bytes (for align)
kono
parents:
diff changeset
342 <- new stack pointer
kono
parents:
diff changeset
343 */
kono
parents:
diff changeset
344 fst.d r14, 24, dr0
kono
parents:
diff changeset
345 fst.d r14, 32, dr2
kono
parents:
diff changeset
346 fst.d r14, 40, dr4
kono
parents:
diff changeset
347 fst.d r14, 48, dr6
kono
parents:
diff changeset
348 fst.d r14, 56, dr8
kono
parents:
diff changeset
349 fst.d r14, 64, dr10
kono
parents:
diff changeset
350 st.q r14, 72, r2
kono
parents:
diff changeset
351 st.q r14, 80, r3
kono
parents:
diff changeset
352 st.q r14, 88, r4
kono
parents:
diff changeset
353 st.q r14, 96, r5
kono
parents:
diff changeset
354 st.q r14, 104, r6
kono
parents:
diff changeset
355 st.q r14, 112, r7
kono
parents:
diff changeset
356 st.q r14, 120, r8
kono
parents:
diff changeset
357 st.q r14, 128, r9
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 add r1, r63, r2
kono
parents:
diff changeset
360 addi r14, 16, r3
kono
parents:
diff changeset
361 addi r14, 72, r4
kono
parents:
diff changeset
362 addi r14, 24, r5
kono
parents:
diff changeset
363 addi r14, 136, r6
kono
parents:
diff changeset
364 #ifdef PIC
kono
parents:
diff changeset
365 movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12
kono
parents:
diff changeset
366 shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12
kono
parents:
diff changeset
367 .LPCS0: ptrel/u r12, tr0
kono
parents:
diff changeset
368 movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1
kono
parents:
diff changeset
369 gettr tr0, r12
kono
parents:
diff changeset
370 ldx.l r1, r12, r1
kono
parents:
diff changeset
371 ptabs r1, tr0
kono
parents:
diff changeset
372 #else
kono
parents:
diff changeset
373 pt/l ffi_closure_helper_SYSV, tr0
kono
parents:
diff changeset
374 #endif
kono
parents:
diff changeset
375 blink tr0, r18
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 shlli r2, 1, r1
kono
parents:
diff changeset
378 movi (((datalabel .L_table) >> 16) & 65535), r2
kono
parents:
diff changeset
379 shori ((datalabel .L_table) & 65535), r2
kono
parents:
diff changeset
380 ldx.w r2, r1, r1
kono
parents:
diff changeset
381 add r1, r2, r1
kono
parents:
diff changeset
382 pt/l .L_case_v, tr1
kono
parents:
diff changeset
383 ptabs r1, tr0
kono
parents:
diff changeset
384 blink tr0, r63
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 .align 2
kono
parents:
diff changeset
387 .L_table:
kono
parents:
diff changeset
388 .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */
kono
parents:
diff changeset
389 .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */
kono
parents:
diff changeset
390 .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */
kono
parents:
diff changeset
391 .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */
kono
parents:
diff changeset
392 .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */
kono
parents:
diff changeset
393 .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */
kono
parents:
diff changeset
394 .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */
kono
parents:
diff changeset
395 .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */
kono
parents:
diff changeset
396 .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */
kono
parents:
diff changeset
397 .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */
kono
parents:
diff changeset
398 .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */
kono
parents:
diff changeset
399 .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */
kono
parents:
diff changeset
400 .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */
kono
parents:
diff changeset
401 .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */
kono
parents:
diff changeset
402 .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 .align 2
kono
parents:
diff changeset
405 .L_case_d:
kono
parents:
diff changeset
406 fld.d r14, 16, dr0
kono
parents:
diff changeset
407 blink tr1, r63
kono
parents:
diff changeset
408 .L_case_f:
kono
parents:
diff changeset
409 fld.s r14, 16, fr0
kono
parents:
diff changeset
410 blink tr1, r63
kono
parents:
diff changeset
411 .L_case_ll:
kono
parents:
diff changeset
412 ld.q r14, 16, r2
kono
parents:
diff changeset
413 blink tr1, r63
kono
parents:
diff changeset
414 .L_case_i:
kono
parents:
diff changeset
415 ld.l r14, 16, r2
kono
parents:
diff changeset
416 blink tr1, r63
kono
parents:
diff changeset
417 .L_case_q:
kono
parents:
diff changeset
418 ld.b r14, 16, r2
kono
parents:
diff changeset
419 blink tr1, r63
kono
parents:
diff changeset
420 .L_case_uq:
kono
parents:
diff changeset
421 ld.ub r14, 16, r2
kono
parents:
diff changeset
422 blink tr1, r63
kono
parents:
diff changeset
423 .L_case_h:
kono
parents:
diff changeset
424 ld.w r14, 16, r2
kono
parents:
diff changeset
425 blink tr1, r63
kono
parents:
diff changeset
426 .L_case_uh:
kono
parents:
diff changeset
427 ld.uw r14, 16, r2
kono
parents:
diff changeset
428 blink tr1, r63
kono
parents:
diff changeset
429 .L_case_v:
kono
parents:
diff changeset
430 add.l r14, r63, r15
kono
parents:
diff changeset
431 ld.l r15, 4, r12
kono
parents:
diff changeset
432 ld.l r15, 8, r14
kono
parents:
diff changeset
433 ld.l r15, 12, r18
kono
parents:
diff changeset
434 addi.l r15, 136, r15
kono
parents:
diff changeset
435 ptabs r18, tr0
kono
parents:
diff changeset
436 blink tr0, r63
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 .LFE2:
kono
parents:
diff changeset
439 .ffi_closure_SYSV_end:
kono
parents:
diff changeset
440 .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 #if defined __ELF__ && defined __linux__
kono
parents:
diff changeset
443 .section .note.GNU-stack,"",@progbits
kono
parents:
diff changeset
444 #endif
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 .section ".eh_frame","aw",@progbits
kono
parents:
diff changeset
447 __FRAME_BEGIN__:
kono
parents:
diff changeset
448 .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */
kono
parents:
diff changeset
449 .LSCIE1:
kono
parents:
diff changeset
450 .4byte 0x0 /* CIE Identifier Tag */
kono
parents:
diff changeset
451 .byte 0x1 /* CIE Version */
kono
parents:
diff changeset
452 #ifdef PIC
kono
parents:
diff changeset
453 .ascii "zR\0" /* CIE Augmentation */
kono
parents:
diff changeset
454 #else
kono
parents:
diff changeset
455 .byte 0x0 /* CIE Augmentation */
kono
parents:
diff changeset
456 #endif
kono
parents:
diff changeset
457 .uleb128 0x1 /* CIE Code Alignment Factor */
kono
parents:
diff changeset
458 .sleb128 -4 /* CIE Data Alignment Factor */
kono
parents:
diff changeset
459 .byte 0x12 /* CIE RA Column */
kono
parents:
diff changeset
460 #ifdef PIC
kono
parents:
diff changeset
461 .uleb128 0x1 /* Augmentation size */
kono
parents:
diff changeset
462 .byte 0x10 /* FDE Encoding (pcrel) */
kono
parents:
diff changeset
463 #endif
kono
parents:
diff changeset
464 .byte 0xc /* DW_CFA_def_cfa */
kono
parents:
diff changeset
465 .uleb128 0xf
kono
parents:
diff changeset
466 .uleb128 0x0
kono
parents:
diff changeset
467 .align 2
kono
parents:
diff changeset
468 .LECIE1:
kono
parents:
diff changeset
469 .LSFDE1:
kono
parents:
diff changeset
470 .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */
kono
parents:
diff changeset
471 .LASFDE1:
kono
parents:
diff changeset
472 .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__
kono
parents:
diff changeset
473 #ifdef PIC
kono
parents:
diff changeset
474 .4byte .LFB1-. /* FDE initial location */
kono
parents:
diff changeset
475 #else
kono
parents:
diff changeset
476 .4byte .LFB1 /* FDE initial location */
kono
parents:
diff changeset
477 #endif
kono
parents:
diff changeset
478 .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */
kono
parents:
diff changeset
479 #ifdef PIC
kono
parents:
diff changeset
480 .uleb128 0x0 /* Augmentation size */
kono
parents:
diff changeset
481 #endif
kono
parents:
diff changeset
482 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
483 .4byte datalabel .LCFI0-datalabel .LFB1
kono
parents:
diff changeset
484 .byte 0xe /* DW_CFA_def_cfa_offset */
kono
parents:
diff changeset
485 .uleb128 0x30
kono
parents:
diff changeset
486 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
487 .4byte datalabel .LCFI1-datalabel .LCFI0
kono
parents:
diff changeset
488 .byte 0x8e /* DW_CFA_offset, column 0xe */
kono
parents:
diff changeset
489 .uleb128 0xc
kono
parents:
diff changeset
490 .byte 0x92 /* DW_CFA_offset, column 0x12 */
kono
parents:
diff changeset
491 .uleb128 0xb
kono
parents:
diff changeset
492 .byte 0x9c /* DW_CFA_offset, column 0x1c */
kono
parents:
diff changeset
493 .uleb128 0xa
kono
parents:
diff changeset
494 .byte 0x9d /* DW_CFA_offset, column 0x1d */
kono
parents:
diff changeset
495 .uleb128 0x8
kono
parents:
diff changeset
496 .byte 0x9e /* DW_CFA_offset, column 0x1e */
kono
parents:
diff changeset
497 .uleb128 0x6
kono
parents:
diff changeset
498 .byte 0x9f /* DW_CFA_offset, column 0x1f */
kono
parents:
diff changeset
499 .uleb128 0x4
kono
parents:
diff changeset
500 .byte 0xa0 /* DW_CFA_offset, column 0x20 */
kono
parents:
diff changeset
501 .uleb128 0x2
kono
parents:
diff changeset
502 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
503 .4byte datalabel .LCFI2-datalabel .LCFI1
kono
parents:
diff changeset
504 .byte 0xd /* DW_CFA_def_cfa_register */
kono
parents:
diff changeset
505 .uleb128 0xe
kono
parents:
diff changeset
506 .align 2
kono
parents:
diff changeset
507 .LEFDE1:
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 .LSFDE3:
kono
parents:
diff changeset
510 .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */
kono
parents:
diff changeset
511 .LASFDE3:
kono
parents:
diff changeset
512 .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__
kono
parents:
diff changeset
513 #ifdef PIC
kono
parents:
diff changeset
514 .4byte .LFB2-. /* FDE initial location */
kono
parents:
diff changeset
515 #else
kono
parents:
diff changeset
516 .4byte .LFB2 /* FDE initial location */
kono
parents:
diff changeset
517 #endif
kono
parents:
diff changeset
518 .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */
kono
parents:
diff changeset
519 #ifdef PIC
kono
parents:
diff changeset
520 .uleb128 0x0 /* Augmentation size */
kono
parents:
diff changeset
521 #endif
kono
parents:
diff changeset
522 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
523 .4byte datalabel .LCFI3-datalabel .LFB2
kono
parents:
diff changeset
524 .byte 0xe /* DW_CFA_def_cfa_offset */
kono
parents:
diff changeset
525 .uleb128 0x88
kono
parents:
diff changeset
526 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
527 .4byte datalabel .LCFI4-datalabel .LCFI3
kono
parents:
diff changeset
528 .byte 0x8c /* DW_CFA_offset, column 0xc */
kono
parents:
diff changeset
529 .uleb128 0x21
kono
parents:
diff changeset
530 .byte 0x8e /* DW_CFA_offset, column 0xe */
kono
parents:
diff changeset
531 .uleb128 0x20
kono
parents:
diff changeset
532 .byte 0x92 /* DW_CFA_offset, column 0x12 */
kono
parents:
diff changeset
533 .uleb128 0x1f
kono
parents:
diff changeset
534 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
535 .4byte datalabel .LCFI5-datalabel .LCFI4
kono
parents:
diff changeset
536 .byte 0xd /* DW_CFA_def_cfa_register */
kono
parents:
diff changeset
537 .uleb128 0xe
kono
parents:
diff changeset
538 .align 2
kono
parents:
diff changeset
539 .LEFDE3: