~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

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