~ubuntu-branches/ubuntu/lucid/gauche-c-wrapper/lucid

« back to all changes in this revision

Viewing changes to libffi/src/sh/sysv.S

  • Committer: Bazaar Package Importer
  • Author(s): NIIBE Yutaka
  • Date: 2008-04-07 09:15:03 UTC
  • Revision ID: james.westby@ubuntu.com-20080407091503-wu0h414koe95kj4i
Tags: upstream-0.5.2
ImportĀ upstreamĀ versionĀ 0.5.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -----------------------------------------------------------------------
 
2
   sysv.S - Copyright (c) 2002, 2003, 2004 Kaz Kojima
 
3
   
 
4
   SuperH Foreign Function Interface 
 
5
 
 
6
   Permission is hereby granted, free of charge, to any person obtaining
 
7
   a copy of this software and associated documentation files (the
 
8
   ``Software''), to deal in the Software without restriction, including
 
9
   without limitation the rights to use, copy, modify, merge, publish,
 
10
   distribute, sublicense, and/or sell copies of the Software, and to
 
11
   permit persons to whom the Software is furnished to do so, subject to
 
12
   the following conditions:
 
13
 
 
14
   The above copyright notice and this permission notice shall be included
 
15
   in all copies or substantial portions of the Software.
 
16
 
 
17
   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
18
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
19
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 
20
   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 
21
   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 
22
   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 
23
   OTHER DEALINGS IN THE SOFTWARE.
 
24
   ----------------------------------------------------------------------- */
 
25
 
 
26
#define LIBFFI_ASM      
 
27
#include <fficonfig.h>
 
28
#include <ffi.h>
 
29
#ifdef HAVE_MACHINE_ASM_H
 
30
#include <machine/asm.h>
 
31
#else
 
32
/* XXX these lose for some platforms, I'm sure. */
 
33
#define CNAME(x) x
 
34
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
 
35
#endif
 
36
 
 
37
#if defined(__HITACHI__)
 
38
#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
 
39
#else
 
40
#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
 
41
#endif
 
42
 
 
43
.text
 
44
 
 
45
        # r4:   ffi_prep_args
 
46
        # r5:   &ecif
 
47
        # r6:   bytes
 
48
        # r7:   flags
 
49
        # sp+0: rvalue
 
50
        # sp+4: fn
 
51
 
 
52
        # This assumes we are using gas.
 
53
ENTRY(ffi_call_SYSV)
 
54
        # Save registers
 
55
.LFB1:
 
56
        mov.l   r8,@-r15
 
57
.LCFI0:
 
58
        mov.l   r9,@-r15
 
59
.LCFI1:
 
60
        mov.l   r10,@-r15
 
61
.LCFI2:
 
62
        mov.l   r12,@-r15
 
63
.LCFI3:
 
64
        mov.l   r14,@-r15
 
65
.LCFI4:
 
66
        sts.l   pr,@-r15
 
67
.LCFI5:
 
68
        mov     r15,r14
 
69
.LCFI6:
 
70
#if defined(__SH4__)
 
71
        mov     r6,r8
 
72
        mov     r7,r9
 
73
 
 
74
        sub     r6,r15
 
75
        add     #-16,r15
 
76
        mov     #~7,r0
 
77
        and     r0,r15
 
78
 
 
79
        mov     r4,r0
 
80
        jsr     @r0
 
81
         mov    r15,r4
 
82
 
 
83
        mov     r9,r1
 
84
        shlr8   r9
 
85
        shlr8   r9
 
86
        shlr8   r9
 
87
 
 
88
        mov     #FFI_TYPE_STRUCT,r2
 
89
        cmp/eq  r2,r9
 
90
        bf      1f
 
91
#if STRUCT_VALUE_ADDRESS_WITH_ARG
 
92
        mov.l   @r15+,r4
 
93
        bra     2f
 
94
         mov    #5,r2
 
95
#else
 
96
        mov.l   @r15+,r10
 
97
#endif
 
98
1:
 
99
        mov     #4,r2
 
100
2:
 
101
        mov     #4,r3
 
102
 
 
103
L_pass:
 
104
        cmp/pl  r8
 
105
        bf      L_call_it
 
106
 
 
107
        mov     r1,r0
 
108
        and     #3,r0
 
109
 
 
110
L_pass_d:
 
111
        cmp/eq  #FFI_TYPE_DOUBLE,r0
 
112
        bf      L_pass_f
 
113
 
 
114
        mov     r3,r0
 
115
        and     #1,r0
 
116
        tst     r0,r0
 
117
        bt      1f
 
118
        add     #1,r3
 
119
1:
 
120
        mov     #12,r0
 
121
        cmp/hs  r0,r3
 
122
        bt/s    3f
 
123
         shlr2  r1
 
124
        bsr     L_pop_d
 
125
         nop
 
126
3:
 
127
        add     #2,r3
 
128
        bra     L_pass
 
129
         add    #-8,r8
 
130
 
 
131
L_pop_d:
 
132
        mov     r3,r0
 
133
        add     r0,r0
 
134
        add     r3,r0
 
135
        add     #-12,r0
 
136
        braf    r0
 
137
         nop
 
138
#ifdef __LITTLE_ENDIAN__
 
139
        fmov.s  @r15+,fr5
 
140
        rts
 
141
         fmov.s @r15+,fr4
 
142
        fmov.s  @r15+,fr7
 
143
        rts
 
144
         fmov.s @r15+,fr6
 
145
        fmov.s  @r15+,fr9
 
146
        rts
 
147
         fmov.s @r15+,fr8
 
148
        fmov.s  @r15+,fr11
 
149
        rts
 
150
         fmov.s @r15+,fr10
 
151
#else
 
152
        fmov.s  @r15+,fr4
 
153
        rts
 
154
         fmov.s @r15+,fr5
 
155
        fmov.s  @r15+,fr6
 
156
        rts
 
157
         fmov.s @r15+,fr7
 
158
        fmov.s  @r15+,fr8
 
159
        rts
 
160
         fmov.s @r15+,fr9
 
161
        fmov.s  @r15+,fr10
 
162
        rts
 
163
         fmov.s @r15+,fr11
 
164
#endif
 
165
 
 
166
L_pass_f:
 
167
        cmp/eq  #FFI_TYPE_FLOAT,r0
 
168
        bf      L_pass_i
 
169
 
 
170
        mov     #12,r0
 
171
        cmp/hs  r0,r3
 
172
        bt/s    2f
 
173
         shlr2  r1
 
174
        bsr     L_pop_f
 
175
         nop
 
176
2:
 
177
        add     #1,r3
 
178
        bra     L_pass
 
179
         add    #-4,r8
 
180
 
 
181
L_pop_f:
 
182
        mov     r3,r0
 
183
        shll2   r0
 
184
        add     #-16,r0
 
185
        braf    r0
 
186
         nop
 
187
#ifdef __LITTLE_ENDIAN__
 
188
        rts
 
189
         fmov.s @r15+,fr5
 
190
        rts
 
191
         fmov.s @r15+,fr4
 
192
        rts
 
193
         fmov.s @r15+,fr7
 
194
        rts
 
195
         fmov.s @r15+,fr6
 
196
        rts
 
197
         fmov.s @r15+,fr9
 
198
        rts
 
199
         fmov.s @r15+,fr8
 
200
        rts
 
201
         fmov.s @r15+,fr11
 
202
        rts
 
203
         fmov.s @r15+,fr10
 
204
#else
 
205
        rts
 
206
         fmov.s @r15+,fr4
 
207
        rts
 
208
         fmov.s @r15+,fr5
 
209
        rts
 
210
         fmov.s @r15+,fr6
 
211
        rts
 
212
         fmov.s @r15+,fr7
 
213
        rts
 
214
         fmov.s @r15+,fr8
 
215
        rts
 
216
         fmov.s @r15+,fr9
 
217
        rts
 
218
         fmov.s @r15+,fr10
 
219
        rts
 
220
         fmov.s @r15+,fr11
 
221
#endif
 
222
 
 
223
L_pass_i:
 
224
        cmp/eq  #FFI_TYPE_INT,r0
 
225
        bf      L_call_it
 
226
 
 
227
        mov     #8,r0
 
228
        cmp/hs  r0,r2
 
229
        bt/s    2f
 
230
         shlr2  r1
 
231
        bsr     L_pop_i
 
232
         nop
 
233
2:
 
234
        add     #1,r2
 
235
        bra     L_pass
 
236
         add    #-4,r8
 
237
 
 
238
L_pop_i:
 
239
        mov     r2,r0
 
240
        shll2   r0
 
241
        add     #-16,r0
 
242
        braf    r0
 
243
         nop
 
244
        rts
 
245
         mov.l  @r15+,r4
 
246
        rts
 
247
         mov.l  @r15+,r5
 
248
        rts
 
249
         mov.l  @r15+,r6
 
250
        rts
 
251
         mov.l  @r15+,r7
 
252
 
 
253
L_call_it:
 
254
        # call function
 
255
#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
 
256
        mov     r10, r2
 
257
#endif
 
258
        mov.l  @(28,r14),r1
 
259
        jsr    @r1
 
260
         nop
 
261
 
 
262
L_ret_d:
 
263
        mov     #FFI_TYPE_DOUBLE,r2
 
264
        cmp/eq  r2,r9
 
265
        bf      L_ret_ll
 
266
 
 
267
        mov.l   @(24,r14),r1
 
268
#ifdef __LITTLE_ENDIAN__
 
269
        fmov.s  fr1,@r1
 
270
        add     #4,r1
 
271
        bra     L_epilogue
 
272
         fmov.s fr0,@r1
 
273
#else
 
274
        fmov.s  fr0,@r1
 
275
        add     #4,r1
 
276
        bra     L_epilogue
 
277
         fmov.s fr1,@r1
 
278
#endif
 
279
 
 
280
L_ret_ll:
 
281
        mov     #FFI_TYPE_SINT64,r2
 
282
        cmp/eq  r2,r9
 
283
        bt/s    1f
 
284
         mov    #FFI_TYPE_UINT64,r2
 
285
        cmp/eq  r2,r9
 
286
        bf      L_ret_f
 
287
 
 
288
1:
 
289
        mov.l   @(24,r14),r2
 
290
        mov.l   r0,@r2
 
291
        bra     L_epilogue
 
292
         mov.l  r1,@(4,r2)
 
293
 
 
294
L_ret_f:
 
295
        mov     #FFI_TYPE_FLOAT,r2
 
296
        cmp/eq  r2,r9
 
297
        bf      L_ret_i
 
298
 
 
299
        mov.l   @(24,r14),r1
 
300
        bra     L_epilogue
 
301
         fmov.s fr0,@r1
 
302
 
 
303
L_ret_i:
 
304
        mov     #FFI_TYPE_INT,r2
 
305
        cmp/eq  r2,r9
 
306
        bf      L_epilogue
 
307
 
 
308
        mov.l   @(24,r14),r1
 
309
        bra     L_epilogue
 
310
         mov.l  r0,@r1
 
311
 
 
312
L_epilogue:
 
313
        # Remove the space we pushed for the args
 
314
        mov   r14,r15
 
315
 
 
316
        lds.l  @r15+,pr
 
317
        mov.l  @r15+,r14
 
318
        mov.l  @r15+,r12
 
319
        mov.l  @r15+,r10
 
320
        mov.l  @r15+,r9
 
321
        rts
 
322
         mov.l  @r15+,r8
 
323
#else
 
324
        mov     r6,r8
 
325
        mov     r7,r9
 
326
 
 
327
        sub     r6,r15
 
328
        add     #-16,r15
 
329
        mov     #~7,r0
 
330
        and     r0,r15
 
331
 
 
332
        mov     r4,r0
 
333
        jsr     @r0
 
334
         mov    r15,r4
 
335
 
 
336
        mov     r9,r3
 
337
        shlr8   r9
 
338
        shlr8   r9
 
339
        shlr8   r9
 
340
 
 
341
        mov     #FFI_TYPE_STRUCT,r2
 
342
        cmp/eq  r2,r9
 
343
        bf      1f
 
344
#if STRUCT_VALUE_ADDRESS_WITH_ARG
 
345
        mov.l   @r15+,r4
 
346
        bra     2f
 
347
         mov    #5,r2
 
348
#else
 
349
        mov.l   @r15+,r10
 
350
#endif
 
351
1:
 
352
        mov     #4,r2
 
353
2:
 
354
 
 
355
L_pass:
 
356
        cmp/pl  r8
 
357
        bf      L_call_it
 
358
 
 
359
        mov     r3,r0
 
360
        and     #3,r0
 
361
 
 
362
L_pass_d:
 
363
        cmp/eq  #FFI_TYPE_DOUBLE,r0
 
364
        bf      L_pass_i
 
365
 
 
366
        mov     r15,r0
 
367
        and     #7,r0
 
368
        tst     r0,r0
 
369
        bt      1f
 
370
        add     #4,r15
 
371
1:
 
372
        mov     #8,r0
 
373
        cmp/hs  r0,r2
 
374
        bt/s    2f
 
375
         shlr2  r3
 
376
        bsr     L_pop_d
 
377
         nop
 
378
2:
 
379
        add     #2,r2
 
380
        bra     L_pass
 
381
         add    #-8,r8
 
382
 
 
383
L_pop_d:
 
384
        mov     r2,r0
 
385
        add     r0,r0
 
386
        add     r2,r0
 
387
        add     #-12,r0
 
388
        add     r0,r0
 
389
        braf    r0
 
390
         nop
 
391
        mov.l   @r15+,r4
 
392
        rts
 
393
         mov.l  @r15+,r5
 
394
        mov.l   @r15+,r5
 
395
        rts
 
396
         mov.l  @r15+,r6
 
397
        mov.l   @r15+,r6
 
398
        rts
 
399
         mov.l  @r15+,r7
 
400
        rts
 
401
         mov.l  @r15+,r7
 
402
 
 
403
L_pass_i:
 
404
        cmp/eq  #FFI_TYPE_INT,r0
 
405
        bf      L_call_it
 
406
 
 
407
        mov     #8,r0
 
408
        cmp/hs  r0,r2
 
409
        bt/s    2f
 
410
         shlr2  r3
 
411
        bsr     L_pop_i
 
412
         nop
 
413
2:
 
414
        add     #1,r2
 
415
        bra     L_pass
 
416
         add    #-4,r8
 
417
 
 
418
L_pop_i:
 
419
        mov     r2,r0
 
420
        shll2   r0
 
421
        add     #-16,r0
 
422
        braf    r0
 
423
         nop
 
424
        rts
 
425
         mov.l  @r15+,r4
 
426
        rts
 
427
         mov.l  @r15+,r5
 
428
        rts
 
429
         mov.l  @r15+,r6
 
430
        rts
 
431
         mov.l  @r15+,r7
 
432
 
 
433
L_call_it:
 
434
        # call function
 
435
#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
 
436
        mov     r10, r2
 
437
#endif
 
438
        mov.l  @(28,r14),r1
 
439
        jsr    @r1
 
440
         nop
 
441
 
 
442
L_ret_d:
 
443
        mov     #FFI_TYPE_DOUBLE,r2
 
444
        cmp/eq  r2,r9
 
445
        bf      L_ret_ll
 
446
 
 
447
        mov.l   @(24,r14),r2
 
448
        mov.l   r0,@r2
 
449
        bra     L_epilogue
 
450
         mov.l  r1,@(4,r2)
 
451
 
 
452
L_ret_ll:
 
453
        mov     #FFI_TYPE_SINT64,r2
 
454
        cmp/eq  r2,r9
 
455
        bt/s    1f
 
456
         mov    #FFI_TYPE_UINT64,r2
 
457
        cmp/eq  r2,r9
 
458
        bf      L_ret_i
 
459
 
 
460
1:
 
461
        mov.l   @(24,r14),r2
 
462
        mov.l   r0,@r2
 
463
        bra     L_epilogue
 
464
         mov.l  r1,@(4,r2)
 
465
 
 
466
L_ret_i:
 
467
        mov     #FFI_TYPE_FLOAT,r2
 
468
        cmp/eq  r2,r9
 
469
        bt      1f
 
470
        mov     #FFI_TYPE_INT,r2
 
471
        cmp/eq  r2,r9
 
472
        bf      L_epilogue
 
473
1:
 
474
        mov.l   @(24,r14),r1
 
475
        bra     L_epilogue
 
476
         mov.l  r0,@r1
 
477
 
 
478
L_epilogue:
 
479
        # Remove the space we pushed for the args
 
480
        mov   r14,r15
 
481
 
 
482
        lds.l  @r15+,pr
 
483
        mov.l  @r15+,r14
 
484
        mov.l  @r15+,r12
 
485
        mov.l  @r15+,r10
 
486
        mov.l  @r15+,r9
 
487
        rts
 
488
         mov.l  @r15+,r8
 
489
#endif
 
490
.LFE1:
 
491
.ffi_call_SYSV_end:
 
492
        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
 
493
 
 
494
.globl  ffi_closure_helper_SYSV
 
495
 
 
496
ENTRY(ffi_closure_SYSV)
 
497
.LFB2:
 
498
        mov.l   r7,@-r15
 
499
.LCFI7:
 
500
        mov.l   r6,@-r15
 
501
.LCFI8:
 
502
        mov.l   r5,@-r15
 
503
.LCFI9:
 
504
        mov.l   r4,@-r15
 
505
.LCFIA:
 
506
        mov.l   r14,@-r15
 
507
.LCFIB:
 
508
        sts.l   pr,@-r15
 
509
 
 
510
        /* Stack layout:        
 
511
           xx bytes (on stack parameters)
 
512
           16 bytes (register parameters)
 
513
            4 bytes (saved frame pointer)
 
514
            4 bytes (saved return address)
 
515
           32 bytes (floating register parameters, SH-4 only)
 
516
            8 bytes (result)
 
517
            4 bytes (pad)
 
518
            4 bytes (5th arg)
 
519
           <- new stack pointer
 
520
        */
 
521
.LCFIC:
 
522
#if defined(__SH4__)
 
523
        add     #-48,r15
 
524
#else
 
525
        add     #-16,r15
 
526
#endif
 
527
.LCFID:
 
528
        mov     r15,r14
 
529
.LCFIE:
 
530
 
 
531
#if defined(__SH4__)
 
532
        mov     r14,r1
 
533
        add     #48,r1
 
534
#ifdef __LITTLE_ENDIAN__
 
535
        fmov.s  fr10,@-r1
 
536
        fmov.s  fr11,@-r1
 
537
        fmov.s  fr8,@-r1
 
538
        fmov.s  fr9,@-r1
 
539
        fmov.s  fr6,@-r1
 
540
        fmov.s  fr7,@-r1
 
541
        fmov.s  fr4,@-r1
 
542
        fmov.s  fr5,@-r1
 
543
#else
 
544
        fmov.s  fr11,@-r1
 
545
        fmov.s  fr10,@-r1
 
546
        fmov.s  fr9,@-r1
 
547
        fmov.s  fr8,@-r1
 
548
        fmov.s  fr7,@-r1
 
549
        fmov.s  fr6,@-r1
 
550
        fmov.s  fr5,@-r1
 
551
        fmov.s  fr4,@-r1
 
552
#endif
 
553
        mov     r1,r7
 
554
        mov     r14,r6
 
555
        add     #56,r6
 
556
#else
 
557
        mov     r14,r6
 
558
        add     #24,r6
 
559
#endif
 
560
 
 
561
        bt/s    10f
 
562
         mov    r2, r5
 
563
        mov     r14,r1
 
564
        add     #8,r1
 
565
        mov     r1,r5
 
566
10:
 
567
 
 
568
        mov     r14,r1
 
569
#if defined(__SH4__)
 
570
        add     #72,r1
 
571
#else
 
572
        add     #40,r1
 
573
#endif
 
574
        mov.l   r1,@r14
 
575
 
 
576
#ifdef PIC
 
577
        mov.l   L_got,r1
 
578
        mova    L_got,r0
 
579
        add     r0,r1
 
580
        mov.l   L_helper,r0
 
581
        add     r1,r0
 
582
#else
 
583
        mov.l   L_helper,r0
 
584
#endif
 
585
        jsr     @r0
 
586
         mov    r3,r4
 
587
 
 
588
        shll    r0
 
589
        mov     r0,r1
 
590
        mova    L_table,r0
 
591
        add     r1,r0
 
592
        mov.w   @r0,r0
 
593
        mov     r14,r2
 
594
        braf    r0
 
595
         add    #8,r2
 
596
0:
 
597
        .align 2
 
598
#ifdef PIC
 
599
L_got:
 
600
        .long   _GLOBAL_OFFSET_TABLE_
 
601
L_helper:
 
602
        .long   ffi_closure_helper_SYSV@GOTOFF
 
603
#else
 
604
L_helper:
 
605
        .long   ffi_closure_helper_SYSV
 
606
#endif
 
607
L_table:
 
608
        .short L_case_v - 0b    /* FFI_TYPE_VOID */
 
609
        .short L_case_i - 0b    /* FFI_TYPE_INT */
 
610
#if defined(__SH4__)
 
611
        .short L_case_f - 0b    /* FFI_TYPE_FLOAT */
 
612
        .short L_case_d - 0b    /* FFI_TYPE_DOUBLE */
 
613
        .short L_case_d - 0b    /* FFI_TYPE_LONGDOUBLE */
 
614
#else
 
615
        .short L_case_i - 0b    /* FFI_TYPE_FLOAT */
 
616
        .short L_case_ll - 0b   /* FFI_TYPE_DOUBLE */
 
617
        .short L_case_ll - 0b   /* FFI_TYPE_LONGDOUBLE */
 
618
#endif
 
619
        .short L_case_uq - 0b   /* FFI_TYPE_UINT8 */
 
620
        .short L_case_q - 0b    /* FFI_TYPE_SINT8 */
 
621
        .short L_case_uh - 0b   /* FFI_TYPE_UINT16 */
 
622
        .short L_case_h - 0b    /* FFI_TYPE_SINT16 */
 
623
        .short L_case_i - 0b    /* FFI_TYPE_UINT32 */
 
624
        .short L_case_i - 0b    /* FFI_TYPE_SINT32 */
 
625
        .short L_case_ll - 0b   /* FFI_TYPE_UINT64 */
 
626
        .short L_case_ll - 0b   /* FFI_TYPE_SINT64 */
 
627
        .short L_case_v - 0b    /* FFI_TYPE_STRUCT */
 
628
        .short L_case_i - 0b    /* FFI_TYPE_POINTER */
 
629
 
 
630
#if defined(__SH4__)
 
631
L_case_d:
 
632
#ifdef __LITTLE_ENDIAN__
 
633
        fmov.s  @r2+,fr1
 
634
        bra     L_case_v
 
635
         fmov.s @r2,fr0
 
636
#else
 
637
        fmov.s  @r2+,fr0
 
638
        bra     L_case_v
 
639
         fmov.s @r2,fr1
 
640
#endif
 
641
 
 
642
L_case_f:
 
643
        bra     L_case_v
 
644
         fmov.s @r2,fr0
 
645
#endif
 
646
        
 
647
L_case_ll:
 
648
        mov.l   @r2+,r0
 
649
        bra     L_case_v
 
650
         mov.l  @r2,r1
 
651
        
 
652
L_case_i:
 
653
        bra     L_case_v
 
654
         mov.l  @r2,r0
 
655
        
 
656
L_case_q:
 
657
#ifdef __LITTLE_ENDIAN__
 
658
#else
 
659
        add     #3,r2
 
660
#endif
 
661
        bra     L_case_v
 
662
         mov.b  @r2,r0
 
663
 
 
664
L_case_uq:
 
665
#ifdef __LITTLE_ENDIAN__
 
666
#else
 
667
        add     #3,r2
 
668
#endif
 
669
        mov.b   @r2,r0
 
670
        bra     L_case_v
 
671
         extu.b r0,r0
 
672
 
 
673
L_case_h:
 
674
#ifdef __LITTLE_ENDIAN__
 
675
#else
 
676
        add     #2,r2
 
677
#endif
 
678
        bra     L_case_v
 
679
         mov.w  @r2,r0
 
680
 
 
681
L_case_uh:
 
682
#ifdef __LITTLE_ENDIAN__
 
683
#else
 
684
        add     #2,r2
 
685
#endif
 
686
        mov.w   @r2,r0
 
687
        extu.w  r0,r0
 
688
        /* fall through */
 
689
 
 
690
L_case_v:
 
691
#if defined(__SH4__)
 
692
        add     #48,r15
 
693
#else
 
694
        add     #16,r15
 
695
#endif
 
696
        lds.l   @r15+,pr
 
697
        mov.l   @r15+,r14
 
698
        rts
 
699
         add    #16,r15
 
700
.LFE2:
 
701
.ffi_closure_SYSV_end:
 
702
        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
 
703
 
 
704
        .section        ".eh_frame","aw",@progbits
 
705
__FRAME_BEGIN__:
 
706
        .4byte  .LECIE1-.LSCIE1 /* Length of Common Information Entry */
 
707
.LSCIE1:
 
708
        .4byte  0x0     /* CIE Identifier Tag */
 
709
        .byte   0x1     /* CIE Version */
 
710
#ifdef PIC
 
711
        .ascii "zR\0"   /* CIE Augmentation */
 
712
#else
 
713
        .byte   0x0     /* CIE Augmentation */
 
714
#endif
 
715
        .byte   0x1     /* uleb128 0x1; CIE Code Alignment Factor */
 
716
        .byte   0x7c    /* sleb128 -4; CIE Data Alignment Factor */
 
717
        .byte   0x11    /* CIE RA Column */
 
718
#ifdef PIC
 
719
        .uleb128 0x1    /* Augmentation size */
 
720
        .byte   0x10    /* FDE Encoding (pcrel) */
 
721
#endif
 
722
        .byte   0xc     /* DW_CFA_def_cfa */
 
723
        .byte   0xf     /* uleb128 0xf */
 
724
        .byte   0x0     /* uleb128 0x0 */
 
725
        .align  2
 
726
.LECIE1:
 
727
.LSFDE1:
 
728
        .4byte  .LEFDE1-.LASFDE1        /* FDE Length */
 
729
.LASFDE1:
 
730
        .4byte  .LASFDE1-__FRAME_BEGIN__        /* FDE CIE offset */
 
731
#ifdef PIC
 
732
        .4byte  .LFB1-. /* FDE initial location */
 
733
#else
 
734
        .4byte  .LFB1   /* FDE initial location */
 
735
#endif
 
736
        .4byte  .LFE1-.LFB1      /* FDE address range */
 
737
#ifdef PIC
 
738
        .uleb128 0x0    /* Augmentation size */
 
739
#endif
 
740
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
741
        .4byte  .LCFI0-.LFB1
 
742
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
743
        .byte   0x4     /* uleb128 0x4 */
 
744
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
745
        .4byte  .LCFI1-.LCFI0
 
746
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
747
        .byte   0x8     /* uleb128 0x4 */
 
748
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
749
        .4byte  .LCFI2-.LCFI1
 
750
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
751
        .byte   0xc     /* uleb128 0x4 */
 
752
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
753
        .4byte  .LCFI3-.LCFI2
 
754
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
755
        .byte   0x10    /* uleb128 0x4 */
 
756
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
757
        .4byte  .LCFI4-.LCFI3
 
758
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
759
        .byte   0x14    /* uleb128 0x4 */
 
760
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
761
        .4byte  .LCFI5-.LCFI4
 
762
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
763
        .byte   0x18    /* uleb128 0x4 */
 
764
        .byte   0x91    /* DW_CFA_offset, column 0x11 */
 
765
        .byte   0x6     /* uleb128 0x6 */
 
766
        .byte   0x8e    /* DW_CFA_offset, column 0xe */
 
767
        .byte   0x5     /* uleb128 0x5 */
 
768
        .byte   0x8c    /* DW_CFA_offset, column 0xc */
 
769
        .byte   0x4     /* uleb128 0x4 */
 
770
        .byte   0x8a    /* DW_CFA_offset, column 0xa */
 
771
        .byte   0x3     /* uleb128 0x3 */
 
772
        .byte   0x89    /* DW_CFA_offset, column 0x9 */
 
773
        .byte   0x2     /* uleb128 0x2 */
 
774
        .byte   0x88    /* DW_CFA_offset, column 0x8 */
 
775
        .byte   0x1     /* uleb128 0x1 */
 
776
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
777
        .4byte  .LCFI6-.LCFI5
 
778
        .byte   0xd     /* DW_CFA_def_cfa_register */
 
779
        .byte   0xe     /* uleb128 0xe */
 
780
        .align  2
 
781
.LEFDE1:
 
782
 
 
783
.LSFDE3:
 
784
        .4byte  .LEFDE3-.LASFDE3        /* FDE Length */
 
785
.LASFDE3:
 
786
        .4byte  .LASFDE3-__FRAME_BEGIN__        /* FDE CIE offset */
 
787
#ifdef PIC
 
788
        .4byte  .LFB2-. /* FDE initial location */
 
789
#else
 
790
        .4byte  .LFB2   /* FDE initial location */
 
791
#endif
 
792
        .4byte  .LFE2-.LFB2      /* FDE address range */
 
793
#ifdef PIC
 
794
        .uleb128 0x0    /* Augmentation size */
 
795
#endif
 
796
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
797
        .4byte  .LCFI7-.LFB2
 
798
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
799
        .byte   0x4     /* uleb128 0x4 */
 
800
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
801
        .4byte  .LCFI8-.LCFI7
 
802
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
803
        .byte   0x8     /* uleb128 0x4 */
 
804
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
805
        .4byte  .LCFI9-.LCFI8
 
806
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
807
        .byte   0xc     /* uleb128 0x4 */
 
808
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
809
        .4byte  .LCFIA-.LCFI9
 
810
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
811
        .byte   0x10    /* uleb128 0x4 */
 
812
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
813
        .4byte  .LCFIB-.LCFIA
 
814
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
815
        .byte   0x14    /* uleb128 0x4 */
 
816
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
817
        .4byte  .LCFIC-.LCFIB
 
818
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
819
        .byte   0x18    /* uleb128 0x4 */
 
820
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
821
        .4byte  .LCFID-.LCFIC
 
822
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
823
#if defined(__SH4__)
 
824
        .byte   24+48   /* uleb128 24+48 */
 
825
#else
 
826
        .byte   24+16   /* uleb128 24+16 */
 
827
#endif
 
828
        .byte   0x91    /* DW_CFA_offset, column 0x11 */
 
829
        .byte   0x6     /* uleb128 0x6 */
 
830
        .byte   0x8e    /* DW_CFA_offset, column 0xe */
 
831
        .byte   0x5     /* uleb128 0x5 */
 
832
        .byte   0x8b    /* DW_CFA_offset, column 0xb */
 
833
        .byte   0x4     /* uleb128 0x4 */
 
834
        .byte   0x8a    /* DW_CFA_offset, column 0xa */
 
835
        .byte   0x3     /* uleb128 0x3 */
 
836
        .byte   0x89    /* DW_CFA_offset, column 0x9 */
 
837
        .byte   0x2     /* uleb128 0x2 */
 
838
        .byte   0x88    /* DW_CFA_offset, column 0x8 */
 
839
        .byte   0x1     /* uleb128 0x1 */
 
840
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
841
        .4byte  .LCFIE-.LCFID
 
842
        .byte   0xd     /* DW_CFA_def_cfa_register */
 
843
        .byte   0xe     /* uleb128 0xe */
 
844
        .align  2
 
845
.LEFDE3: