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

« back to all changes in this revision

Viewing changes to Modules/_ctypes/libffi/src/x86/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) 1996, 1998, 2001-2003, 2005, 2008  Red Hat, Inc.
 
3
   
 
4
   X86 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,
 
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
   ----------------------------------------------------------------------- */
 
26
 
 
27
#ifndef __x86_64__
 
28
 
 
29
#define LIBFFI_ASM      
 
30
#include <fficonfig.h>
 
31
#include <ffi.h>
 
32
 
 
33
.text
 
34
 
 
35
.globl ffi_prep_args
 
36
 
 
37
        .align 4
 
38
.globl ffi_call_SYSV
 
39
        .type    ffi_call_SYSV,@function
 
40
 
 
41
ffi_call_SYSV:
 
42
.LFB1:
 
43
        pushl %ebp
 
44
.LCFI0:
 
45
        movl  %esp,%ebp
 
46
.LCFI1:
 
47
        /* Make room for all of the new args.  */
 
48
        movl  16(%ebp),%ecx
 
49
        subl  %ecx,%esp
 
50
 
 
51
        movl  %esp,%eax
 
52
 
 
53
        /* Place all of the ffi_prep_args in position  */
 
54
        pushl 12(%ebp)
 
55
        pushl %eax
 
56
        call  *8(%ebp)
 
57
 
 
58
        /* Return stack to previous state and call the function  */
 
59
        addl  $8,%esp   
 
60
 
 
61
        call  *28(%ebp)
 
62
 
 
63
        /* Load %ecx with the return type code  */
 
64
        movl  20(%ebp),%ecx     
 
65
 
 
66
        /* Protect %esi.  We're going to pop it in the epilogue.  */
 
67
        pushl %esi
 
68
 
 
69
        /* If the return value pointer is NULL, assume no return value.  */
 
70
        cmpl  $0,24(%ebp)
 
71
        jne  0f
 
72
 
 
73
        /* Even if there is no space for the return value, we are 
 
74
           obliged to handle floating-point values.  */
 
75
        cmpl  $FFI_TYPE_FLOAT,%ecx
 
76
        jne   noretval
 
77
        fstp  %st(0)
 
78
 
 
79
        jmp   epilogue
 
80
 
 
81
0:
 
82
        call  1f
 
83
 
 
84
.Lstore_table:
 
85
        .long   noretval-.Lstore_table  /* FFI_TYPE_VOID */
 
86
        .long   retint-.Lstore_table    /* FFI_TYPE_INT */
 
87
        .long   retfloat-.Lstore_table  /* FFI_TYPE_FLOAT */
 
88
        .long   retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */
 
89
        .long   retlongdouble-.Lstore_table     /* FFI_TYPE_LONGDOUBLE */
 
90
        .long   retuint8-.Lstore_table  /* FFI_TYPE_UINT8 */
 
91
        .long   retsint8-.Lstore_table  /* FFI_TYPE_SINT8 */
 
92
        .long   retuint16-.Lstore_table /* FFI_TYPE_UINT16 */
 
93
        .long   retsint16-.Lstore_table /* FFI_TYPE_SINT16 */
 
94
        .long   retint-.Lstore_table    /* FFI_TYPE_UINT32 */
 
95
        .long   retint-.Lstore_table    /* FFI_TYPE_SINT32 */
 
96
        .long   retint64-.Lstore_table  /* FFI_TYPE_UINT64 */
 
97
        .long   retint64-.Lstore_table  /* FFI_TYPE_SINT64 */
 
98
        .long   retstruct-.Lstore_table /* FFI_TYPE_STRUCT */
 
99
        .long   retint-.Lstore_table    /* FFI_TYPE_POINTER */
 
100
 
 
101
1:
 
102
        pop  %esi
 
103
        add  (%esi, %ecx, 4), %esi
 
104
        jmp  *%esi
 
105
 
 
106
        /* Sign/zero extend as appropriate.  */
 
107
retsint8:
 
108
        movsbl  %al, %eax
 
109
        jmp  retint
 
110
 
 
111
retsint16:
 
112
        movswl  %ax, %eax
 
113
        jmp  retint
 
114
 
 
115
retuint8:
 
116
        movzbl  %al, %eax
 
117
        jmp  retint
 
118
 
 
119
retuint16:
 
120
        movzwl  %ax, %eax
 
121
        jmp  retint
 
122
 
 
123
retfloat:
 
124
        /* Load %ecx with the pointer to storage for the return value  */
 
125
        movl  24(%ebp),%ecx     
 
126
        fstps (%ecx)
 
127
        jmp   epilogue
 
128
 
 
129
retdouble:
 
130
        /* Load %ecx with the pointer to storage for the return value  */
 
131
        movl  24(%ebp),%ecx     
 
132
        fstpl (%ecx)
 
133
        jmp   epilogue
 
134
 
 
135
retlongdouble:
 
136
        /* Load %ecx with the pointer to storage for the return value  */
 
137
        movl  24(%ebp),%ecx     
 
138
        fstpt (%ecx)
 
139
        jmp   epilogue
 
140
        
 
141
retint64:       
 
142
        /* Load %ecx with the pointer to storage for the return value  */
 
143
        movl  24(%ebp),%ecx     
 
144
        movl  %eax,0(%ecx)
 
145
        movl  %edx,4(%ecx)
 
146
        jmp   epilogue
 
147
        
 
148
retint:
 
149
        /* Load %ecx with the pointer to storage for the return value  */
 
150
        movl  24(%ebp),%ecx     
 
151
        movl  %eax,0(%ecx)
 
152
 
 
153
retstruct:
 
154
        /* Nothing to do!  */
 
155
 
 
156
noretval:
 
157
epilogue:
 
158
        popl %esi
 
159
        movl %ebp,%esp
 
160
        popl %ebp
 
161
        ret
 
162
.LFE1:
 
163
.ffi_call_SYSV_end:
 
164
        .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
 
165
 
 
166
        .align  4
 
167
FFI_HIDDEN (ffi_closure_SYSV)
 
168
.globl ffi_closure_SYSV
 
169
        .type   ffi_closure_SYSV, @function
 
170
 
 
171
ffi_closure_SYSV:
 
172
.LFB2:
 
173
        pushl   %ebp
 
174
.LCFI2:
 
175
        movl    %esp, %ebp
 
176
.LCFI3:
 
177
        subl    $40, %esp
 
178
        leal    -24(%ebp), %edx
 
179
        movl    %edx, -12(%ebp) /* resp */
 
180
        leal    8(%ebp), %edx
 
181
        movl    %edx, 4(%esp)   /* args = __builtin_dwarf_cfa () */
 
182
        leal    -12(%ebp), %edx
 
183
        movl    %edx, (%esp)    /* &resp */
 
184
#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
 
185
        call    ffi_closure_SYSV_inner
 
186
#else
 
187
        movl    %ebx, 8(%esp)
 
188
.LCFI7:
 
189
        call    1f
 
190
1:      popl    %ebx
 
191
        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
 
192
        call    ffi_closure_SYSV_inner@PLT
 
193
        movl    8(%esp), %ebx
 
194
#endif
 
195
        movl    -12(%ebp), %ecx
 
196
        cmpl    $FFI_TYPE_INT, %eax
 
197
        je      .Lcls_retint
 
198
 
 
199
        /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
 
200
           FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
 
201
        cmpl    $FFI_TYPE_UINT64, %eax
 
202
        jge     0f
 
203
        cmpl    $FFI_TYPE_UINT8, %eax
 
204
        jge     .Lcls_retint
 
205
        
 
206
0:      cmpl    $FFI_TYPE_FLOAT, %eax
 
207
        je      .Lcls_retfloat
 
208
        cmpl    $FFI_TYPE_DOUBLE, %eax
 
209
        je      .Lcls_retdouble
 
210
        cmpl    $FFI_TYPE_LONGDOUBLE, %eax
 
211
        je      .Lcls_retldouble
 
212
        cmpl    $FFI_TYPE_SINT64, %eax
 
213
        je      .Lcls_retllong
 
214
        cmpl    $FFI_TYPE_STRUCT, %eax
 
215
        je      .Lcls_retstruct
 
216
.Lcls_epilogue:
 
217
        movl    %ebp, %esp
 
218
        popl    %ebp
 
219
        ret
 
220
.Lcls_retint:
 
221
        movl    (%ecx), %eax
 
222
        jmp     .Lcls_epilogue
 
223
.Lcls_retfloat:
 
224
        flds    (%ecx)
 
225
        jmp     .Lcls_epilogue
 
226
.Lcls_retdouble:
 
227
        fldl    (%ecx)
 
228
        jmp     .Lcls_epilogue
 
229
.Lcls_retldouble:
 
230
        fldt    (%ecx)
 
231
        jmp     .Lcls_epilogue
 
232
.Lcls_retllong:
 
233
        movl    (%ecx), %eax
 
234
        movl    4(%ecx), %edx
 
235
        jmp     .Lcls_epilogue
 
236
.Lcls_retstruct:
 
237
        movl    %ebp, %esp
 
238
        popl    %ebp
 
239
        ret     $4
 
240
.LFE2:
 
241
        .size   ffi_closure_SYSV, .-ffi_closure_SYSV
 
242
 
 
243
#if !FFI_NO_RAW_API
 
244
 
 
245
#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
 
246
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
 
247
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
 
248
#define CIF_FLAGS_OFFSET 20
 
249
 
 
250
        .align  4
 
251
FFI_HIDDEN (ffi_closure_raw_SYSV)
 
252
.globl ffi_closure_raw_SYSV
 
253
        .type   ffi_closure_raw_SYSV, @function
 
254
 
 
255
ffi_closure_raw_SYSV:
 
256
.LFB3:
 
257
        pushl   %ebp
 
258
.LCFI4:
 
259
        movl    %esp, %ebp
 
260
.LCFI5:
 
261
        pushl   %esi
 
262
.LCFI6:
 
263
        subl    $36, %esp
 
264
        movl    RAW_CLOSURE_CIF_OFFSET(%eax), %esi       /* closure->cif */
 
265
        movl    RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
 
266
        movl    %edx, 12(%esp)  /* user_data */
 
267
        leal    8(%ebp), %edx   /* __builtin_dwarf_cfa () */
 
268
        movl    %edx, 8(%esp)   /* raw_args */
 
269
        leal    -24(%ebp), %edx
 
270
        movl    %edx, 4(%esp)   /* &res */
 
271
        movl    %esi, (%esp)    /* cif */
 
272
        call    *RAW_CLOSURE_FUN_OFFSET(%eax)            /* closure->fun */
 
273
        movl    CIF_FLAGS_OFFSET(%esi), %eax             /* rtype */
 
274
        cmpl    $FFI_TYPE_INT, %eax
 
275
        je      .Lrcls_retint
 
276
 
 
277
        /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
 
278
           FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
 
279
        cmpl    $FFI_TYPE_UINT64, %eax
 
280
        jge     0f
 
281
        cmpl    $FFI_TYPE_UINT8, %eax
 
282
        jge     .Lrcls_retint
 
283
0:
 
284
        cmpl    $FFI_TYPE_FLOAT, %eax
 
285
        je      .Lrcls_retfloat
 
286
        cmpl    $FFI_TYPE_DOUBLE, %eax
 
287
        je      .Lrcls_retdouble
 
288
        cmpl    $FFI_TYPE_LONGDOUBLE, %eax
 
289
        je      .Lrcls_retldouble
 
290
        cmpl    $FFI_TYPE_SINT64, %eax
 
291
        je      .Lrcls_retllong
 
292
.Lrcls_epilogue:
 
293
        addl    $36, %esp
 
294
        popl    %esi
 
295
        popl    %ebp
 
296
        ret
 
297
.Lrcls_retint:
 
298
        movl    -24(%ebp), %eax
 
299
        jmp     .Lrcls_epilogue
 
300
.Lrcls_retfloat:
 
301
        flds    -24(%ebp)
 
302
        jmp     .Lrcls_epilogue
 
303
.Lrcls_retdouble:
 
304
        fldl    -24(%ebp)
 
305
        jmp     .Lrcls_epilogue
 
306
.Lrcls_retldouble:
 
307
        fldt    -24(%ebp)
 
308
        jmp     .Lrcls_epilogue
 
309
.Lrcls_retllong:
 
310
        movl    -24(%ebp), %eax
 
311
        movl    -20(%ebp), %edx
 
312
        jmp     .Lrcls_epilogue
 
313
.LFE3:
 
314
        .size   ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
 
315
#endif
 
316
 
 
317
        .section        .eh_frame,EH_FRAME_FLAGS,@progbits
 
318
.Lframe1:
 
319
        .long   .LECIE1-.LSCIE1 /* Length of Common Information Entry */
 
320
.LSCIE1:
 
321
        .long   0x0     /* CIE Identifier Tag */
 
322
        .byte   0x1     /* CIE Version */
 
323
#ifdef __PIC__
 
324
        .ascii "zR\0"   /* CIE Augmentation */
 
325
#else
 
326
        .ascii "\0"     /* CIE Augmentation */
 
327
#endif
 
328
        .byte   0x1     /* .uleb128 0x1; CIE Code Alignment Factor */
 
329
        .byte   0x7c    /* .sleb128 -4; CIE Data Alignment Factor */
 
330
        .byte   0x8     /* CIE RA Column */
 
331
#ifdef __PIC__
 
332
        .byte   0x1     /* .uleb128 0x1; Augmentation size */
 
333
        .byte   0x1b    /* FDE Encoding (pcrel sdata4) */
 
334
#endif
 
335
        .byte   0xc     /* DW_CFA_def_cfa */
 
336
        .byte   0x4     /* .uleb128 0x4 */
 
337
        .byte   0x4     /* .uleb128 0x4 */
 
338
        .byte   0x88    /* DW_CFA_offset, column 0x8 */
 
339
        .byte   0x1     /* .uleb128 0x1 */
 
340
        .align 4
 
341
.LECIE1:
 
342
.LSFDE1:
 
343
        .long   .LEFDE1-.LASFDE1        /* FDE Length */
 
344
.LASFDE1:
 
345
        .long   .LASFDE1-.Lframe1       /* FDE CIE offset */
 
346
#ifdef __PIC__
 
347
        .long   .LFB1-. /* FDE initial location */
 
348
#else
 
349
        .long   .LFB1   /* FDE initial location */
 
350
#endif
 
351
        .long   .LFE1-.LFB1     /* FDE address range */
 
352
#ifdef __PIC__
 
353
        .byte   0x0     /* .uleb128 0x0; Augmentation size */
 
354
#endif
 
355
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
356
        .long   .LCFI0-.LFB1
 
357
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
358
        .byte   0x8     /* .uleb128 0x8 */
 
359
        .byte   0x85    /* DW_CFA_offset, column 0x5 */
 
360
        .byte   0x2     /* .uleb128 0x2 */
 
361
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
362
        .long   .LCFI1-.LCFI0
 
363
        .byte   0xd     /* DW_CFA_def_cfa_register */
 
364
        .byte   0x5     /* .uleb128 0x5 */
 
365
        .align 4
 
366
.LEFDE1:
 
367
.LSFDE2:
 
368
        .long   .LEFDE2-.LASFDE2        /* FDE Length */
 
369
.LASFDE2:
 
370
        .long   .LASFDE2-.Lframe1       /* FDE CIE offset */
 
371
#ifdef __PIC__
 
372
        .long   .LFB2-. /* FDE initial location */
 
373
#else
 
374
        .long   .LFB2
 
375
#endif
 
376
        .long   .LFE2-.LFB2     /* FDE address range */
 
377
#ifdef __PIC__
 
378
        .byte   0x0     /* .uleb128 0x0; Augmentation size */
 
379
#endif
 
380
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
381
        .long   .LCFI2-.LFB2
 
382
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
383
        .byte   0x8     /* .uleb128 0x8 */
 
384
        .byte   0x85    /* DW_CFA_offset, column 0x5 */
 
385
        .byte   0x2     /* .uleb128 0x2 */
 
386
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
387
        .long   .LCFI3-.LCFI2
 
388
        .byte   0xd     /* DW_CFA_def_cfa_register */
 
389
        .byte   0x5     /* .uleb128 0x5 */
 
390
#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
 
391
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
392
        .long   .LCFI7-.LCFI3
 
393
        .byte   0x83    /* DW_CFA_offset, column 0x3 */
 
394
        .byte   0xa     /* .uleb128 0xa */
 
395
#endif
 
396
        .align 4
 
397
.LEFDE2:
 
398
 
 
399
#if !FFI_NO_RAW_API
 
400
 
 
401
.LSFDE3:
 
402
        .long   .LEFDE3-.LASFDE3        /* FDE Length */
 
403
.LASFDE3:
 
404
        .long   .LASFDE3-.Lframe1       /* FDE CIE offset */
 
405
#ifdef __PIC__
 
406
        .long   .LFB3-. /* FDE initial location */
 
407
#else
 
408
        .long   .LFB3
 
409
#endif
 
410
        .long   .LFE3-.LFB3     /* FDE address range */
 
411
#ifdef __PIC__
 
412
        .byte   0x0     /* .uleb128 0x0; Augmentation size */
 
413
#endif
 
414
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
415
        .long   .LCFI4-.LFB3
 
416
        .byte   0xe     /* DW_CFA_def_cfa_offset */
 
417
        .byte   0x8     /* .uleb128 0x8 */
 
418
        .byte   0x85    /* DW_CFA_offset, column 0x5 */
 
419
        .byte   0x2     /* .uleb128 0x2 */
 
420
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
421
        .long   .LCFI5-.LCFI4
 
422
        .byte   0xd     /* DW_CFA_def_cfa_register */
 
423
        .byte   0x5     /* .uleb128 0x5 */
 
424
        .byte   0x4     /* DW_CFA_advance_loc4 */
 
425
        .long   .LCFI6-.LCFI5
 
426
        .byte   0x86    /* DW_CFA_offset, column 0x6 */
 
427
        .byte   0x3     /* .uleb128 0x3 */
 
428
        .align 4
 
429
.LEFDE3:
 
430
 
 
431
#endif
 
432
 
 
433
#endif /* ifndef __x86_64__ */
 
434
 
 
435
#if defined __ELF__ && defined __linux__
 
436
        .section        .note.GNU-stack,"",@progbits
 
437
#endif