OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libffi/] [src/] [sh64/] [sysv.S] - Blame information for rev 801

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.