2009-06-04 Andrew Haley <aph@redhat.com>
[official-gcc.git] / libffi / src / s390 / sysv.S
blobdb70e602b4eef0f382e288247e17974d5e74f975
1 /* -----------------------------------------------------------------------
2    sysv.S - Copyright (c) 2000 Software AG
3  
4    S390 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:
14    The above copyright notice and this permission notice shall be included
15    in all copies or substantial portions of the Software.
17    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24    DEALINGS IN THE SOFTWARE.
25    ----------------------------------------------------------------------- */
27 #define LIBFFI_ASM
28 #include <fficonfig.h>
29 #include <ffi.h>
31 #ifndef __s390x__
33 .text
35         # r2:   cif->bytes
36         # r3:   &ecif
37         # r4:   ffi_prep_args
38         # r5:   ret_type
39         # r6:   ecif.rvalue
40         # ov:   fn 
42         # This assumes we are using gas.
43         .globl  ffi_call_SYSV
44         .type   ffi_call_SYSV,%function
45 ffi_call_SYSV:
46 .LFB1:
47         stm     %r6,%r15,24(%r15)               # Save registers
48 .LCFI0:
49         basr    %r13,0                          # Set up base register
50 .Lbase:
51         lr      %r11,%r15                       # Set up frame pointer
52 .LCFI1:
53         sr      %r15,%r2
54         ahi     %r15,-96-48                     # Allocate stack
55         lr      %r8,%r6                         # Save ecif.rvalue
56         sr      %r9,%r9
57         ic      %r9,.Ltable-.Lbase(%r13,%r5)    # Load epilog address
58         l       %r7,96(%r11)                    # Load function address
59         st      %r11,0(%r15)                    # Set up back chain
60         ahi     %r11,-48                        # Register save area
61 .LCFI2:
63         la      %r2,96(%r15)                    # Save area
64                                                 # r3 already holds &ecif
65         basr    %r14,%r4                        # Call ffi_prep_args
67         lm      %r2,%r6,0(%r11)                 # Load arguments
68         ld      %f0,32(%r11)
69         ld      %f2,40(%r11)
70         la      %r14,0(%r13,%r9)                # Set return address
71         br      %r7                             # ... and call function
73 .LretNone:                                      # Return void
74         l       %r4,48+56(%r11)
75         lm      %r6,%r15,48+24(%r11)
76         br      %r4
78 .LretFloat:
79         l       %r4,48+56(%r11)
80         ste     %f0,0(%r8)                      # Return float
81         lm      %r6,%r15,48+24(%r11)
82         br      %r4
84 .LretDouble:
85         l       %r4,48+56(%r11)
86         std     %f0,0(%r8)                      # Return double
87         lm      %r6,%r15,48+24(%r11)
88         br      %r4
90 .LretInt32:
91         l       %r4,48+56(%r11)
92         st      %r2,0(%r8)                      # Return int
93         lm      %r6,%r15,48+24(%r11)
94         br      %r4
96 .LretInt64:
97         l       %r4,48+56(%r11)
98         stm     %r2,%r3,0(%r8)                  # Return long long
99         lm      %r6,%r15,48+24(%r11)
100         br      %r4
102 .Ltable:
103         .byte   .LretNone-.Lbase                # FFI390_RET_VOID
104         .byte   .LretNone-.Lbase                # FFI390_RET_STRUCT
105         .byte   .LretFloat-.Lbase               # FFI390_RET_FLOAT
106         .byte   .LretDouble-.Lbase              # FFI390_RET_DOUBLE
107         .byte   .LretInt32-.Lbase               # FFI390_RET_INT32
108         .byte   .LretInt64-.Lbase               # FFI390_RET_INT64
110 .LFE1: 
111 .ffi_call_SYSV_end:
112         .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
115         .globl  ffi_closure_SYSV
116         .type   ffi_closure_SYSV,%function
117 ffi_closure_SYSV:
118 .LFB2:
119         stm     %r12,%r15,48(%r15)              # Save registers
120 .LCFI10:
121         basr    %r13,0                          # Set up base register
122 .Lcbase:
123         stm     %r2,%r6,8(%r15)                 # Save arguments
124         std     %f0,64(%r15)
125         std     %f2,72(%r15)
126         lr      %r1,%r15                        # Set up stack frame
127         ahi     %r15,-96
128 .LCFI11:
129         l       %r12,.Lchelper-.Lcbase(%r13)    # Get helper function
130         lr      %r2,%r0                         # Closure
131         la      %r3,8(%r1)                      # GPRs
132         la      %r4,64(%r1)                     # FPRs
133         la      %r5,96(%r1)                     # Overflow
134         st      %r1,0(%r15)                     # Set up back chain
136         bas     %r14,0(%r12,%r13)               # Call helper
138         l       %r4,96+56(%r15)
139         ld      %f0,96+64(%r15)                 # Load return registers
140         lm      %r2,%r3,96+8(%r15)
141         lm      %r12,%r15,96+48(%r15)
142         br      %r4
144         .align 4
145 .Lchelper:
146         .long   ffi_closure_helper_SYSV-.Lcbase
148 .LFE2: 
150 .ffi_closure_SYSV_end:
151         .size    ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
154         .section        .eh_frame,EH_FRAME_FLAGS,@progbits
155 .Lframe1:
156         .4byte  .LECIE1-.LSCIE1 # Length of Common Information Entry
157 .LSCIE1:
158         .4byte  0x0     # CIE Identifier Tag
159         .byte   0x1     # CIE Version
160         .ascii "zR\0"   # CIE Augmentation
161         .uleb128 0x1    # CIE Code Alignment Factor
162         .sleb128 -4     # CIE Data Alignment Factor
163         .byte   0xe     # CIE RA Column
164         .uleb128 0x1    # Augmentation size
165         .byte   0x1b    # FDE Encoding (pcrel sdata4)
166         .byte   0xc     # DW_CFA_def_cfa
167         .uleb128 0xf
168         .uleb128 0x60
169         .align  4
170 .LECIE1:
171 .LSFDE1:
172         .4byte  .LEFDE1-.LASFDE1        # FDE Length
173 .LASFDE1:
174         .4byte  .LASFDE1-.Lframe1       # FDE CIE offset
175         .4byte  .LFB1-. # FDE initial location
176         .4byte  .LFE1-.LFB1     # FDE address range
177         .uleb128 0x0    # Augmentation size
178         .byte   0x4     # DW_CFA_advance_loc4
179         .4byte  .LCFI0-.LFB1
180         .byte   0x8f    # DW_CFA_offset, column 0xf
181         .uleb128 0x9
182         .byte   0x8e    # DW_CFA_offset, column 0xe
183         .uleb128 0xa
184         .byte   0x8d    # DW_CFA_offset, column 0xd
185         .uleb128 0xb
186         .byte   0x8c    # DW_CFA_offset, column 0xc
187         .uleb128 0xc
188         .byte   0x8b    # DW_CFA_offset, column 0xb
189         .uleb128 0xd
190         .byte   0x8a    # DW_CFA_offset, column 0xa
191         .uleb128 0xe
192         .byte   0x89    # DW_CFA_offset, column 0x9
193         .uleb128 0xf
194         .byte   0x88    # DW_CFA_offset, column 0x8
195         .uleb128 0x10
196         .byte   0x87    # DW_CFA_offset, column 0x7
197         .uleb128 0x11
198         .byte   0x86    # DW_CFA_offset, column 0x6
199         .uleb128 0x12
200         .byte   0x4     # DW_CFA_advance_loc4
201         .4byte  .LCFI1-.LCFI0
202         .byte   0xd     # DW_CFA_def_cfa_register
203         .uleb128 0xb
204         .byte   0x4     # DW_CFA_advance_loc4
205         .4byte  .LCFI2-.LCFI1
206         .byte   0xe     # DW_CFA_def_cfa_offset
207         .uleb128 0x90
208         .align  4
209 .LEFDE1:
210 .LSFDE2:
211         .4byte  .LEFDE2-.LASFDE2        # FDE Length
212 .LASFDE2:
213         .4byte  .LASFDE2-.Lframe1       # FDE CIE offset
214         .4byte  .LFB2-. # FDE initial location
215         .4byte  .LFE2-.LFB2     # FDE address range
216         .uleb128 0x0    # Augmentation size
217         .byte   0x4     # DW_CFA_advance_loc4
218         .4byte  .LCFI10-.LFB2
219         .byte   0x8f    # DW_CFA_offset, column 0xf
220         .uleb128 0x9
221         .byte   0x8e    # DW_CFA_offset, column 0xe
222         .uleb128 0xa
223         .byte   0x8d    # DW_CFA_offset, column 0xd
224         .uleb128 0xb
225         .byte   0x8c    # DW_CFA_offset, column 0xc
226         .uleb128 0xc
227         .byte   0x4     # DW_CFA_advance_loc4
228         .4byte  .LCFI11-.LCFI10
229         .byte   0xe     # DW_CFA_def_cfa_offset
230         .uleb128 0xc0
231         .align  4
232 .LEFDE2:
234 #else
236 .text
238         # r2:   cif->bytes
239         # r3:   &ecif
240         # r4:   ffi_prep_args
241         # r5:   ret_type
242         # r6:   ecif.rvalue
243         # ov:   fn 
245         # This assumes we are using gas.
246         .globl  ffi_call_SYSV
247         .type   ffi_call_SYSV,%function
248 ffi_call_SYSV:
249 .LFB1:
250         stmg    %r6,%r15,48(%r15)               # Save registers
251 .LCFI0:
252         larl    %r13,.Lbase                     # Set up base register
253         lgr     %r11,%r15                       # Set up frame pointer
254 .LCFI1:
255         sgr     %r15,%r2
256         aghi    %r15,-160-80                    # Allocate stack
257         lgr     %r8,%r6                         # Save ecif.rvalue
258         llgc    %r9,.Ltable-.Lbase(%r13,%r5)    # Load epilog address
259         lg      %r7,160(%r11)                   # Load function address
260         stg     %r11,0(%r15)                    # Set up back chain
261         aghi    %r11,-80                        # Register save area
262 .LCFI2:
264         la      %r2,160(%r15)                   # Save area
265                                                 # r3 already holds &ecif
266         basr    %r14,%r4                        # Call ffi_prep_args
268         lmg     %r2,%r6,0(%r11)                 # Load arguments
269         ld      %f0,48(%r11)
270         ld      %f2,56(%r11)
271         ld      %f4,64(%r11)
272         ld      %f6,72(%r11)
273         la      %r14,0(%r13,%r9)                # Set return address
274         br      %r7                             # ... and call function
276 .Lbase:
277 .LretNone:                                      # Return void
278         lg      %r4,80+112(%r11)
279         lmg     %r6,%r15,80+48(%r11)
280         br      %r4
282 .LretFloat:
283         lg      %r4,80+112(%r11)
284         ste     %f0,0(%r8)                      # Return float
285         lmg     %r6,%r15,80+48(%r11)
286         br      %r4
288 .LretDouble:
289         lg      %r4,80+112(%r11)
290         std     %f0,0(%r8)                      # Return double
291         lmg     %r6,%r15,80+48(%r11)
292         br      %r4
294 .LretInt32:
295         lg      %r4,80+112(%r11)
296         st      %r2,0(%r8)                      # Return int
297         lmg     %r6,%r15,80+48(%r11)
298         br      %r4
300 .LretInt64:
301         lg      %r4,80+112(%r11)
302         stg     %r2,0(%r8)                      # Return long
303         lmg     %r6,%r15,80+48(%r11)
304         br      %r4
306 .Ltable:
307         .byte   .LretNone-.Lbase                # FFI390_RET_VOID
308         .byte   .LretNone-.Lbase                # FFI390_RET_STRUCT
309         .byte   .LretFloat-.Lbase               # FFI390_RET_FLOAT
310         .byte   .LretDouble-.Lbase              # FFI390_RET_DOUBLE
311         .byte   .LretInt32-.Lbase               # FFI390_RET_INT32
312         .byte   .LretInt64-.Lbase               # FFI390_RET_INT64
314 .LFE1: 
315 .ffi_call_SYSV_end:
316         .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
319         .globl  ffi_closure_SYSV
320         .type   ffi_closure_SYSV,%function
321 ffi_closure_SYSV:
322 .LFB2:
323         stmg    %r14,%r15,112(%r15)             # Save registers
324 .LCFI10:
325         stmg    %r2,%r6,16(%r15)                # Save arguments
326         std     %f0,128(%r15)
327         std     %f2,136(%r15)
328         std     %f4,144(%r15)
329         std     %f6,152(%r15)
330         lgr     %r1,%r15                        # Set up stack frame
331         aghi    %r15,-160
332 .LCFI11:
333         lgr     %r2,%r0                         # Closure
334         la      %r3,16(%r1)                     # GPRs
335         la      %r4,128(%r1)                    # FPRs
336         la      %r5,160(%r1)                    # Overflow
337         stg     %r1,0(%r15)                     # Set up back chain
339         brasl   %r14,ffi_closure_helper_SYSV    # Call helper
341         lg      %r14,160+112(%r15)
342         ld      %f0,160+128(%r15)               # Load return registers
343         lg      %r2,160+16(%r15)
344         la      %r15,160(%r15)
345         br      %r14
346 .LFE2: 
348 .ffi_closure_SYSV_end:
349         .size    ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
353         .section        .eh_frame,EH_FRAME_FLAGS,@progbits
354 .Lframe1:
355         .4byte  .LECIE1-.LSCIE1 # Length of Common Information Entry
356 .LSCIE1:
357         .4byte  0x0     # CIE Identifier Tag
358         .byte   0x1     # CIE Version
359         .ascii "zR\0"   # CIE Augmentation
360         .uleb128 0x1    # CIE Code Alignment Factor
361         .sleb128 -8     # CIE Data Alignment Factor
362         .byte   0xe     # CIE RA Column
363         .uleb128 0x1    # Augmentation size
364         .byte   0x1b    # FDE Encoding (pcrel sdata4)
365         .byte   0xc     # DW_CFA_def_cfa
366         .uleb128 0xf
367         .uleb128 0xa0
368         .align  8
369 .LECIE1:
370 .LSFDE1:
371         .4byte  .LEFDE1-.LASFDE1        # FDE Length
372 .LASFDE1:
373         .4byte  .LASFDE1-.Lframe1       # FDE CIE offset
374         .4byte  .LFB1-. # FDE initial location
375         .4byte  .LFE1-.LFB1     # FDE address range
376         .uleb128 0x0    # Augmentation size
377         .byte   0x4     # DW_CFA_advance_loc4
378         .4byte  .LCFI0-.LFB1
379         .byte   0x8f    # DW_CFA_offset, column 0xf
380         .uleb128 0x5
381         .byte   0x8e    # DW_CFA_offset, column 0xe
382         .uleb128 0x6
383         .byte   0x8d    # DW_CFA_offset, column 0xd
384         .uleb128 0x7
385         .byte   0x8c    # DW_CFA_offset, column 0xc
386         .uleb128 0x8
387         .byte   0x8b    # DW_CFA_offset, column 0xb
388         .uleb128 0x9
389         .byte   0x8a    # DW_CFA_offset, column 0xa
390         .uleb128 0xa
391         .byte   0x89    # DW_CFA_offset, column 0x9
392         .uleb128 0xb
393         .byte   0x88    # DW_CFA_offset, column 0x8
394         .uleb128 0xc
395         .byte   0x87    # DW_CFA_offset, column 0x7
396         .uleb128 0xd
397         .byte   0x86    # DW_CFA_offset, column 0x6
398         .uleb128 0xe
399         .byte   0x4     # DW_CFA_advance_loc4
400         .4byte  .LCFI1-.LCFI0
401         .byte   0xd     # DW_CFA_def_cfa_register
402         .uleb128 0xb
403         .byte   0x4     # DW_CFA_advance_loc4
404         .4byte  .LCFI2-.LCFI1
405         .byte   0xe     # DW_CFA_def_cfa_offset
406         .uleb128 0xf0
407         .align  8
408 .LEFDE1:
409 .LSFDE2:
410         .4byte  .LEFDE2-.LASFDE2        # FDE Length
411 .LASFDE2:
412         .4byte  .LASFDE2-.Lframe1       # FDE CIE offset
413         .4byte  .LFB2-. # FDE initial location
414         .4byte  .LFE2-.LFB2     # FDE address range
415         .uleb128 0x0    # Augmentation size
416         .byte   0x4     # DW_CFA_advance_loc4
417         .4byte  .LCFI10-.LFB2
418         .byte   0x8f    # DW_CFA_offset, column 0xf
419         .uleb128 0x5
420         .byte   0x8e    # DW_CFA_offset, column 0xe
421         .uleb128 0x6
422         .byte   0x4     # DW_CFA_advance_loc4
423         .4byte  .LCFI11-.LCFI10
424         .byte   0xe     # DW_CFA_def_cfa_offset
425         .uleb128 0x140
426         .align  8
427 .LEFDE2:
429 #endif
431 #if defined __ELF__ && defined __linux__
432         .section        .note.GNU-stack,"",@progbits
433 #endif