* stor-layout.c (bit_field_mode_iterator::bit_field_mode_iterator): Deal
[official-gcc.git] / libffi / src / s390 / sysv.S
blob4731a3177b3bfe61d9c90627af78a445ac9a73f6
1 /* -----------------------------------------------------------------------
2    sysv.S - Copyright (c) 2000 Software AG
3             Copyright (c) 2008 Red Hat, Inc.
4  
5    S390 Foreign Function Interface
6  
7    Permission is hereby granted, free of charge, to any person obtaining
8    a copy of this software and associated documentation files (the
9    ``Software''), to deal in the Software without restriction, including
10    without limitation the rights to use, copy, modify, merge, publish,
11    distribute, sublicense, and/or sell copies of the Software, and to
12    permit persons to whom the Software is furnished to do so, subject to
13    the following conditions:
15    The above copyright notice and this permission notice shall be included
16    in all copies or substantial portions of the Software.
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    ----------------------------------------------------------------------- */
28 #define LIBFFI_ASM
29 #include <fficonfig.h>
30 #include <ffi.h>
32 #ifndef __s390x__
34 .text
36         # r2:   cif->bytes
37         # r3:   &ecif
38         # r4:   ffi_prep_args
39         # r5:   ret_type
40         # r6:   ecif.rvalue
41         # ov:   fn 
43         # This assumes we are using gas.
44         .globl  ffi_call_SYSV
45         .type   ffi_call_SYSV,%function
46 ffi_call_SYSV:
47 .LFB1:
48         stm     %r6,%r15,24(%r15)               # Save registers
49 .LCFI0:
50         basr    %r13,0                          # Set up base register
51 .Lbase:
52         lr      %r11,%r15                       # Set up frame pointer
53 .LCFI1:
54         sr      %r15,%r2
55         ahi     %r15,-96-48                     # Allocate stack
56         lr      %r8,%r6                         # Save ecif.rvalue
57         sr      %r9,%r9
58         ic      %r9,.Ltable-.Lbase(%r13,%r5)    # Load epilog address
59         l       %r7,96(%r11)                    # Load function address
60         st      %r11,0(%r15)                    # Set up back chain
61         ahi     %r11,-48                        # Register save area
62 .LCFI2:
64         la      %r2,96(%r15)                    # Save area
65                                                 # r3 already holds &ecif
66         basr    %r14,%r4                        # Call ffi_prep_args
68         lm      %r2,%r6,0(%r11)                 # Load arguments
69         ld      %f0,32(%r11)
70         ld      %f2,40(%r11)
71         la      %r14,0(%r13,%r9)                # Set return address
72         br      %r7                             # ... and call function
74 .LretNone:                                      # Return void
75         l       %r4,48+56(%r11)
76         lm      %r6,%r15,48+24(%r11)
77         br      %r4
79 .LretFloat:
80         l       %r4,48+56(%r11)
81         ste     %f0,0(%r8)                      # Return float
82         lm      %r6,%r15,48+24(%r11)
83         br      %r4
85 .LretDouble:
86         l       %r4,48+56(%r11)
87         std     %f0,0(%r8)                      # Return double
88         lm      %r6,%r15,48+24(%r11)
89         br      %r4
91 .LretInt32:
92         l       %r4,48+56(%r11)
93         st      %r2,0(%r8)                      # Return int
94         lm      %r6,%r15,48+24(%r11)
95         br      %r4
97 .LretInt64:
98         l       %r4,48+56(%r11)
99         stm     %r2,%r3,0(%r8)                  # Return long long
100         lm      %r6,%r15,48+24(%r11)
101         br      %r4
103 .Ltable:
104         .byte   .LretNone-.Lbase                # FFI390_RET_VOID
105         .byte   .LretNone-.Lbase                # FFI390_RET_STRUCT
106         .byte   .LretFloat-.Lbase               # FFI390_RET_FLOAT
107         .byte   .LretDouble-.Lbase              # FFI390_RET_DOUBLE
108         .byte   .LretInt32-.Lbase               # FFI390_RET_INT32
109         .byte   .LretInt64-.Lbase               # FFI390_RET_INT64
111 .LFE1: 
112 .ffi_call_SYSV_end:
113         .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
116         .globl  ffi_closure_SYSV
117         .type   ffi_closure_SYSV,%function
118 ffi_closure_SYSV:
119 .LFB2:
120         stm     %r12,%r15,48(%r15)              # Save registers
121 .LCFI10:
122         basr    %r13,0                          # Set up base register
123 .Lcbase:
124         stm     %r2,%r6,8(%r15)                 # Save arguments
125         std     %f0,64(%r15)
126         std     %f2,72(%r15)
127         lr      %r1,%r15                        # Set up stack frame
128         ahi     %r15,-96
129 .LCFI11:
130         l       %r12,.Lchelper-.Lcbase(%r13)    # Get helper function
131         lr      %r2,%r0                         # Closure
132         la      %r3,8(%r1)                      # GPRs
133         la      %r4,64(%r1)                     # FPRs
134         la      %r5,96(%r1)                     # Overflow
135         st      %r1,0(%r15)                     # Set up back chain
137         bas     %r14,0(%r12,%r13)               # Call helper
139         l       %r4,96+56(%r15)
140         ld      %f0,96+64(%r15)                 # Load return registers
141         lm      %r2,%r3,96+8(%r15)
142         lm      %r12,%r15,96+48(%r15)
143         br      %r4
145         .align 4
146 .Lchelper:
147         .long   ffi_closure_helper_SYSV-.Lcbase
149 .LFE2: 
151 .ffi_closure_SYSV_end:
152         .size    ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
155         .section        .eh_frame,EH_FRAME_FLAGS,@progbits
156 .Lframe1:
157         .4byte  .LECIE1-.LSCIE1 # Length of Common Information Entry
158 .LSCIE1:
159         .4byte  0x0     # CIE Identifier Tag
160         .byte   0x1     # CIE Version
161         .ascii "zR\0"   # CIE Augmentation
162         .uleb128 0x1    # CIE Code Alignment Factor
163         .sleb128 -4     # CIE Data Alignment Factor
164         .byte   0xe     # CIE RA Column
165         .uleb128 0x1    # Augmentation size
166         .byte   0x1b    # FDE Encoding (pcrel sdata4)
167         .byte   0xc     # DW_CFA_def_cfa
168         .uleb128 0xf
169         .uleb128 0x60
170         .align  4
171 .LECIE1:
172 .LSFDE1:
173         .4byte  .LEFDE1-.LASFDE1        # FDE Length
174 .LASFDE1:
175         .4byte  .LASFDE1-.Lframe1       # FDE CIE offset
176         .4byte  .LFB1-. # FDE initial location
177         .4byte  .LFE1-.LFB1     # FDE address range
178         .uleb128 0x0    # Augmentation size
179         .byte   0x4     # DW_CFA_advance_loc4
180         .4byte  .LCFI0-.LFB1
181         .byte   0x8f    # DW_CFA_offset, column 0xf
182         .uleb128 0x9
183         .byte   0x8e    # DW_CFA_offset, column 0xe
184         .uleb128 0xa
185         .byte   0x8d    # DW_CFA_offset, column 0xd
186         .uleb128 0xb
187         .byte   0x8c    # DW_CFA_offset, column 0xc
188         .uleb128 0xc
189         .byte   0x8b    # DW_CFA_offset, column 0xb
190         .uleb128 0xd
191         .byte   0x8a    # DW_CFA_offset, column 0xa
192         .uleb128 0xe
193         .byte   0x89    # DW_CFA_offset, column 0x9
194         .uleb128 0xf
195         .byte   0x88    # DW_CFA_offset, column 0x8
196         .uleb128 0x10
197         .byte   0x87    # DW_CFA_offset, column 0x7
198         .uleb128 0x11
199         .byte   0x86    # DW_CFA_offset, column 0x6
200         .uleb128 0x12
201         .byte   0x4     # DW_CFA_advance_loc4
202         .4byte  .LCFI1-.LCFI0
203         .byte   0xd     # DW_CFA_def_cfa_register
204         .uleb128 0xb
205         .byte   0x4     # DW_CFA_advance_loc4
206         .4byte  .LCFI2-.LCFI1
207         .byte   0xe     # DW_CFA_def_cfa_offset
208         .uleb128 0x90
209         .align  4
210 .LEFDE1:
211 .LSFDE2:
212         .4byte  .LEFDE2-.LASFDE2        # FDE Length
213 .LASFDE2:
214         .4byte  .LASFDE2-.Lframe1       # FDE CIE offset
215         .4byte  .LFB2-. # FDE initial location
216         .4byte  .LFE2-.LFB2     # FDE address range
217         .uleb128 0x0    # Augmentation size
218         .byte   0x4     # DW_CFA_advance_loc4
219         .4byte  .LCFI10-.LFB2
220         .byte   0x8f    # DW_CFA_offset, column 0xf
221         .uleb128 0x9
222         .byte   0x8e    # DW_CFA_offset, column 0xe
223         .uleb128 0xa
224         .byte   0x8d    # DW_CFA_offset, column 0xd
225         .uleb128 0xb
226         .byte   0x8c    # DW_CFA_offset, column 0xc
227         .uleb128 0xc
228         .byte   0x4     # DW_CFA_advance_loc4
229         .4byte  .LCFI11-.LCFI10
230         .byte   0xe     # DW_CFA_def_cfa_offset
231         .uleb128 0xc0
232         .align  4
233 .LEFDE2:
235 #else
237 .text
239         # r2:   cif->bytes
240         # r3:   &ecif
241         # r4:   ffi_prep_args
242         # r5:   ret_type
243         # r6:   ecif.rvalue
244         # ov:   fn 
246         # This assumes we are using gas.
247         .globl  ffi_call_SYSV
248         .type   ffi_call_SYSV,%function
249 ffi_call_SYSV:
250 .LFB1:
251         stmg    %r6,%r15,48(%r15)               # Save registers
252 .LCFI0:
253         larl    %r13,.Lbase                     # Set up base register
254         lgr     %r11,%r15                       # Set up frame pointer
255 .LCFI1:
256         sgr     %r15,%r2
257         aghi    %r15,-160-80                    # Allocate stack
258         lgr     %r8,%r6                         # Save ecif.rvalue
259         llgc    %r9,.Ltable-.Lbase(%r13,%r5)    # Load epilog address
260         lg      %r7,160(%r11)                   # Load function address
261         stg     %r11,0(%r15)                    # Set up back chain
262         aghi    %r11,-80                        # Register save area
263 .LCFI2:
265         la      %r2,160(%r15)                   # Save area
266                                                 # r3 already holds &ecif
267         basr    %r14,%r4                        # Call ffi_prep_args
269         lmg     %r2,%r6,0(%r11)                 # Load arguments
270         ld      %f0,48(%r11)
271         ld      %f2,56(%r11)
272         ld      %f4,64(%r11)
273         ld      %f6,72(%r11)
274         la      %r14,0(%r13,%r9)                # Set return address
275         br      %r7                             # ... and call function
277 .Lbase:
278 .LretNone:                                      # Return void
279         lg      %r4,80+112(%r11)
280         lmg     %r6,%r15,80+48(%r11)
281         br      %r4
283 .LretFloat:
284         lg      %r4,80+112(%r11)
285         ste     %f0,0(%r8)                      # Return float
286         lmg     %r6,%r15,80+48(%r11)
287         br      %r4
289 .LretDouble:
290         lg      %r4,80+112(%r11)
291         std     %f0,0(%r8)                      # Return double
292         lmg     %r6,%r15,80+48(%r11)
293         br      %r4
295 .LretInt32:
296         lg      %r4,80+112(%r11)
297         st      %r2,0(%r8)                      # Return int
298         lmg     %r6,%r15,80+48(%r11)
299         br      %r4
301 .LretInt64:
302         lg      %r4,80+112(%r11)
303         stg     %r2,0(%r8)                      # Return long
304         lmg     %r6,%r15,80+48(%r11)
305         br      %r4
307 .Ltable:
308         .byte   .LretNone-.Lbase                # FFI390_RET_VOID
309         .byte   .LretNone-.Lbase                # FFI390_RET_STRUCT
310         .byte   .LretFloat-.Lbase               # FFI390_RET_FLOAT
311         .byte   .LretDouble-.Lbase              # FFI390_RET_DOUBLE
312         .byte   .LretInt32-.Lbase               # FFI390_RET_INT32
313         .byte   .LretInt64-.Lbase               # FFI390_RET_INT64
315 .LFE1: 
316 .ffi_call_SYSV_end:
317         .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
320         .globl  ffi_closure_SYSV
321         .type   ffi_closure_SYSV,%function
322 ffi_closure_SYSV:
323 .LFB2:
324         stmg    %r14,%r15,112(%r15)             # Save registers
325 .LCFI10:
326         stmg    %r2,%r6,16(%r15)                # Save arguments
327         std     %f0,128(%r15)
328         std     %f2,136(%r15)
329         std     %f4,144(%r15)
330         std     %f6,152(%r15)
331         lgr     %r1,%r15                        # Set up stack frame
332         aghi    %r15,-160
333 .LCFI11:
334         lgr     %r2,%r0                         # Closure
335         la      %r3,16(%r1)                     # GPRs
336         la      %r4,128(%r1)                    # FPRs
337         la      %r5,160(%r1)                    # Overflow
338         stg     %r1,0(%r15)                     # Set up back chain
340         brasl   %r14,ffi_closure_helper_SYSV    # Call helper
342         lg      %r14,160+112(%r15)
343         ld      %f0,160+128(%r15)               # Load return registers
344         lg      %r2,160+16(%r15)
345         la      %r15,160(%r15)
346         br      %r14
347 .LFE2: 
349 .ffi_closure_SYSV_end:
350         .size    ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
354         .section        .eh_frame,EH_FRAME_FLAGS,@progbits
355 .Lframe1:
356         .4byte  .LECIE1-.LSCIE1 # Length of Common Information Entry
357 .LSCIE1:
358         .4byte  0x0     # CIE Identifier Tag
359         .byte   0x1     # CIE Version
360         .ascii "zR\0"   # CIE Augmentation
361         .uleb128 0x1    # CIE Code Alignment Factor
362         .sleb128 -8     # CIE Data Alignment Factor
363         .byte   0xe     # CIE RA Column
364         .uleb128 0x1    # Augmentation size
365         .byte   0x1b    # FDE Encoding (pcrel sdata4)
366         .byte   0xc     # DW_CFA_def_cfa
367         .uleb128 0xf
368         .uleb128 0xa0
369         .align  8
370 .LECIE1:
371 .LSFDE1:
372         .4byte  .LEFDE1-.LASFDE1        # FDE Length
373 .LASFDE1:
374         .4byte  .LASFDE1-.Lframe1       # FDE CIE offset
375         .4byte  .LFB1-. # FDE initial location
376         .4byte  .LFE1-.LFB1     # FDE address range
377         .uleb128 0x0    # Augmentation size
378         .byte   0x4     # DW_CFA_advance_loc4
379         .4byte  .LCFI0-.LFB1
380         .byte   0x8f    # DW_CFA_offset, column 0xf
381         .uleb128 0x5
382         .byte   0x8e    # DW_CFA_offset, column 0xe
383         .uleb128 0x6
384         .byte   0x8d    # DW_CFA_offset, column 0xd
385         .uleb128 0x7
386         .byte   0x8c    # DW_CFA_offset, column 0xc
387         .uleb128 0x8
388         .byte   0x8b    # DW_CFA_offset, column 0xb
389         .uleb128 0x9
390         .byte   0x8a    # DW_CFA_offset, column 0xa
391         .uleb128 0xa
392         .byte   0x89    # DW_CFA_offset, column 0x9
393         .uleb128 0xb
394         .byte   0x88    # DW_CFA_offset, column 0x8
395         .uleb128 0xc
396         .byte   0x87    # DW_CFA_offset, column 0x7
397         .uleb128 0xd
398         .byte   0x86    # DW_CFA_offset, column 0x6
399         .uleb128 0xe
400         .byte   0x4     # DW_CFA_advance_loc4
401         .4byte  .LCFI1-.LCFI0
402         .byte   0xd     # DW_CFA_def_cfa_register
403         .uleb128 0xb
404         .byte   0x4     # DW_CFA_advance_loc4
405         .4byte  .LCFI2-.LCFI1
406         .byte   0xe     # DW_CFA_def_cfa_offset
407         .uleb128 0xf0
408         .align  8
409 .LEFDE1:
410 .LSFDE2:
411         .4byte  .LEFDE2-.LASFDE2        # FDE Length
412 .LASFDE2:
413         .4byte  .LASFDE2-.Lframe1       # FDE CIE offset
414         .4byte  .LFB2-. # FDE initial location
415         .4byte  .LFE2-.LFB2     # FDE address range
416         .uleb128 0x0    # Augmentation size
417         .byte   0x4     # DW_CFA_advance_loc4
418         .4byte  .LCFI10-.LFB2
419         .byte   0x8f    # DW_CFA_offset, column 0xf
420         .uleb128 0x5
421         .byte   0x8e    # DW_CFA_offset, column 0xe
422         .uleb128 0x6
423         .byte   0x4     # DW_CFA_advance_loc4
424         .4byte  .LCFI11-.LCFI10
425         .byte   0xe     # DW_CFA_def_cfa_offset
426         .uleb128 0x140
427         .align  8
428 .LEFDE2:
430 #endif
432 #if defined __ELF__ && defined __linux__
433         .section        .note.GNU-stack,"",@progbits
434 #endif