17864476afa402a0537c33ba9630e77351720baf8Christian Heimes#ifdef __i386__ 27864476afa402a0537c33ba9630e77351720baf8Christian Heimes/* ----------------------------------------------------------------------- 37864476afa402a0537c33ba9630e77351720baf8Christian Heimes darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. 47864476afa402a0537c33ba9630e77351720baf8Christian Heimes 57864476afa402a0537c33ba9630e77351720baf8Christian Heimes X86 Foreign Function Interface 67864476afa402a0537c33ba9630e77351720baf8Christian Heimes 77864476afa402a0537c33ba9630e77351720baf8Christian Heimes Permission is hereby granted, free of charge, to any person obtaining 87864476afa402a0537c33ba9630e77351720baf8Christian Heimes a copy of this software and associated documentation files (the 97864476afa402a0537c33ba9630e77351720baf8Christian Heimes ``Software''), to deal in the Software without restriction, including 107864476afa402a0537c33ba9630e77351720baf8Christian Heimes without limitation the rights to use, copy, modify, merge, publish, 117864476afa402a0537c33ba9630e77351720baf8Christian Heimes distribute, sublicense, and/or sell copies of the Software, and to 127864476afa402a0537c33ba9630e77351720baf8Christian Heimes permit persons to whom the Software is furnished to do so, subject to 137864476afa402a0537c33ba9630e77351720baf8Christian Heimes the following conditions: 147864476afa402a0537c33ba9630e77351720baf8Christian Heimes 157864476afa402a0537c33ba9630e77351720baf8Christian Heimes The above copyright notice and this permission notice shall be included 167864476afa402a0537c33ba9630e77351720baf8Christian Heimes in all copies or substantial portions of the Software. 177864476afa402a0537c33ba9630e77351720baf8Christian Heimes 187864476afa402a0537c33ba9630e77351720baf8Christian Heimes THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS 197864476afa402a0537c33ba9630e77351720baf8Christian Heimes OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 207864476afa402a0537c33ba9630e77351720baf8Christian Heimes MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 217864476afa402a0537c33ba9630e77351720baf8Christian Heimes IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR 227864476afa402a0537c33ba9630e77351720baf8Christian Heimes OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 237864476afa402a0537c33ba9630e77351720baf8Christian Heimes ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 247864476afa402a0537c33ba9630e77351720baf8Christian Heimes OTHER DEALINGS IN THE SOFTWARE. 257864476afa402a0537c33ba9630e77351720baf8Christian Heimes ----------------------------------------------------------------------- */ 267864476afa402a0537c33ba9630e77351720baf8Christian Heimes 277864476afa402a0537c33ba9630e77351720baf8Christian Heimes/* 287864476afa402a0537c33ba9630e77351720baf8Christian Heimes * This file is based on sysv.S and then hacked up by Ronald who hasn't done 297864476afa402a0537c33ba9630e77351720baf8Christian Heimes * assembly programming in 8 years. 307864476afa402a0537c33ba9630e77351720baf8Christian Heimes */ 317864476afa402a0537c33ba9630e77351720baf8Christian Heimes 327864476afa402a0537c33ba9630e77351720baf8Christian Heimes#ifndef __x86_64__ 337864476afa402a0537c33ba9630e77351720baf8Christian Heimes 347864476afa402a0537c33ba9630e77351720baf8Christian Heimes#define LIBFFI_ASM 357864476afa402a0537c33ba9630e77351720baf8Christian Heimes#include <fficonfig.h> 367864476afa402a0537c33ba9630e77351720baf8Christian Heimes#include <ffi.h> 377864476afa402a0537c33ba9630e77351720baf8Christian Heimes 387864476afa402a0537c33ba9630e77351720baf8Christian Heimes#ifdef PyObjC_STRICT_DEBUGGING 397864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* XXX: Debugging of stack alignment, to be removed */ 407864476afa402a0537c33ba9630e77351720baf8Christian Heimes#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 417864476afa402a0537c33ba9630e77351720baf8Christian Heimes#else 427864476afa402a0537c33ba9630e77351720baf8Christian Heimes#define ASSERT_STACK_ALIGNED 437864476afa402a0537c33ba9630e77351720baf8Christian Heimes#endif 447864476afa402a0537c33ba9630e77351720baf8Christian Heimes 457864476afa402a0537c33ba9630e77351720baf8Christian Heimes.text 467864476afa402a0537c33ba9630e77351720baf8Christian Heimes 477864476afa402a0537c33ba9630e77351720baf8Christian Heimes.globl _ffi_prep_args 487864476afa402a0537c33ba9630e77351720baf8Christian Heimes 496ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 4 507864476afa402a0537c33ba9630e77351720baf8Christian Heimes.globl _ffi_call_SYSV 517864476afa402a0537c33ba9630e77351720baf8Christian Heimes 527864476afa402a0537c33ba9630e77351720baf8Christian Heimes_ffi_call_SYSV: 536ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFB1: 547864476afa402a0537c33ba9630e77351720baf8Christian Heimes pushl %ebp 556ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI0: 567864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %esp,%ebp 576ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI1: 586ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren subl $8,%esp 597864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Make room for all of the new args. */ 607864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 16(%ebp),%ecx 617864476afa402a0537c33ba9630e77351720baf8Christian Heimes subl %ecx,%esp 627864476afa402a0537c33ba9630e77351720baf8Christian Heimes 637864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %esp,%eax 647864476afa402a0537c33ba9630e77351720baf8Christian Heimes 657864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Place all of the ffi_prep_args in position */ 667864476afa402a0537c33ba9630e77351720baf8Christian Heimes subl $8,%esp 677864476afa402a0537c33ba9630e77351720baf8Christian Heimes pushl 12(%ebp) 687864476afa402a0537c33ba9630e77351720baf8Christian Heimes pushl %eax 697864476afa402a0537c33ba9630e77351720baf8Christian Heimes call *8(%ebp) 707864476afa402a0537c33ba9630e77351720baf8Christian Heimes 717864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Return stack to previous state and call the function */ 726ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren addl $16,%esp 737864476afa402a0537c33ba9630e77351720baf8Christian Heimes 747864476afa402a0537c33ba9630e77351720baf8Christian Heimes call *28(%ebp) 756ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 766ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren /* Remove the space we pushed for the args */ 777864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 16(%ebp),%ecx 787864476afa402a0537c33ba9630e77351720baf8Christian Heimes addl %ecx,%esp 797864476afa402a0537c33ba9630e77351720baf8Christian Heimes 807864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the return type code */ 817864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 20(%ebp),%ecx 827864476afa402a0537c33ba9630e77351720baf8Christian Heimes 837864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* If the return value pointer is NULL, assume no return value. */ 847864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $0,24(%ebp) 856ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretint 867864476afa402a0537c33ba9630e77351720baf8Christian Heimes 877864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Even if there is no space for the return value, we are 887864476afa402a0537c33ba9630e77351720baf8Christian Heimes obliged to handle floating-point values. */ 897864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_FLOAT,%ecx 906ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lnoretval 917864476afa402a0537c33ba9630e77351720baf8Christian Heimes fstp %st(0) 927864476afa402a0537c33ba9630e77351720baf8Christian Heimes 936ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 947864476afa402a0537c33ba9630e77351720baf8Christian Heimes 956ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretint: 967864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_INT,%ecx 976ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretfloat 987864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the pointer to storage for the return value */ 997864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 24(%ebp),%ecx 1007864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %eax,0(%ecx) 1016ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1027864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1036ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretfloat: 1047864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_FLOAT,%ecx 1056ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretdouble 1067864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the pointer to storage for the return value */ 1077864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 24(%ebp),%ecx 1087864476afa402a0537c33ba9630e77351720baf8Christian Heimes fstps (%ecx) 1096ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1107864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1116ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretdouble: 1127864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_DOUBLE,%ecx 1136ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretlongdouble 1147864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the pointer to storage for the return value */ 1157864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 24(%ebp),%ecx 1167864476afa402a0537c33ba9630e77351720baf8Christian Heimes fstpl (%ecx) 1176ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1187864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1196ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretlongdouble: 1207864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_LONGDOUBLE,%ecx 1216ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretint64 1227864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the pointer to storage for the return value */ 1237864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 24(%ebp),%ecx 1247864476afa402a0537c33ba9630e77351720baf8Christian Heimes fstpt (%ecx) 1256ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1267864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1276ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretint64: 1287864476afa402a0537c33ba9630e77351720baf8Christian Heimes cmpl $FFI_TYPE_SINT64,%ecx 1296ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretstruct1b 1307864476afa402a0537c33ba9630e77351720baf8Christian Heimes /* Load %ecx with the pointer to storage for the return value */ 1317864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl 24(%ebp),%ecx 1327864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %eax,0(%ecx) 1337864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %edx,4(%ecx) 1346ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1357864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1366ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretstruct1b: 1376ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT8,%ecx 1386ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretstruct2b 1396ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren /* Load %ecx with the pointer to storage for the return value */ 1406ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl 24(%ebp),%ecx 1416ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movb %al,0(%ecx) 1426ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1437864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1446ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretstruct2b: 1456ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT16,%ecx 1466ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lretstruct 1476ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren /* Load %ecx with the pointer to storage for the return value */ 1486ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl 24(%ebp),%ecx 1496ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movw %ax,0(%ecx) 1506ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lepilogue 1517864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1526ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLretstruct: 1536ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_STRUCT,%ecx 1546ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jne Lnoretval 1556ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren /* Nothing to do! */ 1566ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren addl $4,%esp 1576ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren popl %ebp 1586ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren ret 1597864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1606ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLnoretval: 1616ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLepilogue: 1626ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren addl $8,%esp 1637864476afa402a0537c33ba9630e77351720baf8Christian Heimes movl %ebp,%esp 1647864476afa402a0537c33ba9630e77351720baf8Christian Heimes popl %ebp 1657864476afa402a0537c33ba9630e77351720baf8Christian Heimes ret 1666ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFE1: 1677864476afa402a0537c33ba9630e77351720baf8Christian Heimes.ffi_call_SYSV_end: 1687864476afa402a0537c33ba9630e77351720baf8Christian Heimes 1696ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 4 1706ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenFFI_HIDDEN (ffi_closure_SYSV) 1716ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.globl _ffi_closure_SYSV 1726ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 1736ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren_ffi_closure_SYSV: 1746ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFB2: 1756ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren pushl %ebp 1766ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI2: 1776ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %esp, %ebp 1786ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI3: 1796ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren subl $56, %esp 1806ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren leal -40(%ebp), %edx 1816ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, -12(%ebp) /* resp */ 1826ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren leal 8(%ebp), %edx 1836ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ 1846ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren leal -12(%ebp), %edx 1856ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, (%esp) /* &resp */ 1866ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %ebx, 8(%esp) 1876ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI7: 1886ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren call L_ffi_closure_SYSV_inner$stub 1896ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl 8(%esp), %ebx 1906ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl -12(%ebp), %ecx 1916ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_INT, %eax 1926ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retint 1936ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_FLOAT, %eax 1946ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retfloat 1956ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_DOUBLE, %eax 1966ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retdouble 1976ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_LONGDOUBLE, %eax 1986ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retldouble 1996ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT64, %eax 2006ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retllong 20125437565f9f456a1e88f209706ced0353bbdeb14Ronald Oussoren cmpl $FFI_TYPE_UINT8, %eax 20225437565f9f456a1e88f209706ced0353bbdeb14Ronald Oussoren je Lcls_retstruct1 2036ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT8, %eax 2046ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retstruct1 20525437565f9f456a1e88f209706ced0353bbdeb14Ronald Oussoren cmpl $FFI_TYPE_UINT16, %eax 20625437565f9f456a1e88f209706ced0353bbdeb14Ronald Oussoren je Lcls_retstruct2 2076ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT16, %eax 2086ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retstruct2 2096ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_STRUCT, %eax 2106ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lcls_retstruct 2116ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_epilogue: 2126ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %ebp, %esp 2136ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren popl %ebp 2146ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren ret 2156ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retint: 2166ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl (%ecx), %eax 2176ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2186ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retfloat: 2196ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren flds (%ecx) 2206ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2216ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retdouble: 2226ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren fldl (%ecx) 2236ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2246ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retldouble: 2256ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren fldt (%ecx) 2266ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2276ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retllong: 2286ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl (%ecx), %eax 2296ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl 4(%ecx), %edx 2306ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2316ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retstruct1: 2326ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movsbl (%ecx), %eax 2336ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2346ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retstruct2: 2356ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movswl (%ecx), %eax 2366ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lcls_epilogue 2376ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLcls_retstruct: 2386ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren lea -8(%ebp),%esp 2396ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %ebp, %esp 2406ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren popl %ebp 2416ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren ret $4 2426ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFE2: 2436ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 2446ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#if !FFI_NO_RAW_API 2456ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 2466ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) 2476ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) 2486ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) 2496ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#define CIF_FLAGS_OFFSET 20 2506ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 2516ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 4 2526ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenFFI_HIDDEN (ffi_closure_raw_SYSV) 2536ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.globl _ffi_closure_raw_SYSV 2546ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 2556ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren_ffi_closure_raw_SYSV: 2566ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFB3: 2576ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren pushl %ebp 2586ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI4: 2596ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %esp, %ebp 2606ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI5: 2616ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren pushl %esi 2626ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLCFI6: 2636ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren subl $36, %esp 2646ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ 2656ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ 2666ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, 12(%esp) /* user_data */ 2676ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ 2686ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, 8(%esp) /* raw_args */ 2696ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren leal -24(%ebp), %edx 2706ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %edx, 4(%esp) /* &res */ 2716ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl %esi, (%esp) /* cif */ 2726ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ 2736ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ 2746ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_INT, %eax 2756ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lrcls_retint 2766ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_FLOAT, %eax 2776ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lrcls_retfloat 2786ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_DOUBLE, %eax 2796ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lrcls_retdouble 2806ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_LONGDOUBLE, %eax 2816ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lrcls_retldouble 2826ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren cmpl $FFI_TYPE_SINT64, %eax 2836ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren je Lrcls_retllong 2846ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_epilogue: 2856ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren addl $36, %esp 2866ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren popl %esi 2876ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren popl %ebp 2886ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren ret 2896ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_retint: 2906ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl -24(%ebp), %eax 2916ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lrcls_epilogue 2926ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_retfloat: 2936ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren flds -24(%ebp) 2946ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lrcls_epilogue 2956ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_retdouble: 2966ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren fldl -24(%ebp) 2976ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lrcls_epilogue 2986ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_retldouble: 2996ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren fldt -24(%ebp) 3006ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lrcls_epilogue 3016ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLrcls_retllong: 3026ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl -24(%ebp), %eax 3036ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren movl -20(%ebp), %edx 3046ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren jmp Lrcls_epilogue 3056ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLFE3: 3067864476afa402a0537c33ba9630e77351720baf8Christian Heimes#endif 3076ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 3086ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 3096ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenL_ffi_closure_SYSV_inner$stub: 3106ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .indirect_symbol _ffi_closure_SYSV_inner 3116ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren hlt ; hlt ; hlt ; hlt ; hlt 3126ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 3136ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 3146ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 3156ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenEH_frame1: 3166ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$0,LECIE1-LSCIE1 3176ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$0 3186ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLSCIE1: 3196ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long 0x0 3206ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x1 3216ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .ascii "zR\0" 3226ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x1 3236ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x7c 3246ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x8 3256ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x1 3266ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x10 3276ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xc 3286ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x5 3296ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3306ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x88 3316ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x1 3326ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 2 3336ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLECIE1: 3346ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.globl _ffi_call_SYSV.eh 3356ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren_ffi_call_SYSV.eh: 3366ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLSFDE1: 3376ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$1,LEFDE1-LASFDE1 3386ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$1 3396ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLASFDE1: 3406ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LASFDE1-EH_frame1 3416ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LFB1-. 3426ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$2,LFE1-LFB1 3436ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$2 3446ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x0 3456ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3466ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$3,LCFI0-LFB1 3476ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$3 3486ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xe 3496ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x8 3506ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x84 3516ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x2 3526ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3536ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$4,LCFI1-LCFI0 3546ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$4 3556ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xd 3566ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3576ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 2 3586ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLEFDE1: 3596ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.globl _ffi_closure_SYSV.eh 3606ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren_ffi_closure_SYSV.eh: 3616ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLSFDE2: 3626ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$5,LEFDE2-LASFDE2 3636ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$5 3646ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLASFDE2: 3656ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LASFDE2-EH_frame1 3666ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LFB2-. 3676ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$6,LFE2-LFB2 3686ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$6 3696ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x0 3706ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3716ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$7,LCFI2-LFB2 3726ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$7 3736ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xe 3746ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x8 3756ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x84 3766ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x2 3776ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3786ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$8,LCFI3-LCFI2 3796ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$8 3806ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xd 3816ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3826ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 2 3836ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLEFDE2: 3846ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 3856ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren#if !FFI_NO_RAW_API 3866ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 3876ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren.globl _ffi_closure_raw_SYSV.eh 3886ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren_ffi_closure_raw_SYSV.eh: 3896ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLSFDE3: 3906ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$10,LEFDE3-LASFDE3 3916ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$10 3926ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLASFDE3: 3936ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LASFDE3-EH_frame1 3946ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long LFB3-. 3956ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$11,LFE3-LFB3 3966ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$11 3976ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x0 3986ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 3996ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$12,LCFI4-LFB3 4006ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$12 4016ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xe 4026ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x8 4036ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x84 4046ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x2 4056ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 4066ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$13,LCFI5-LCFI4 4076ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$13 4086ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0xd 4096ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 4106ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x4 4116ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .set L$set$14,LCFI6-LCFI5 4126ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .long L$set$14 4136ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x85 4146ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .byte 0x3 4156ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren .align 2 4166ce931fabefd820ce4626a90212c4d045ba86c5eRonald OussorenLEFDE3: 4176ce931fabefd820ce4626a90212c4d045ba86c5eRonald Oussoren 4187864476afa402a0537c33ba9630e77351720baf8Christian Heimes#endif 4197864476afa402a0537c33ba9630e77351720baf8Christian Heimes 4207864476afa402a0537c33ba9630e77351720baf8Christian Heimes#endif /* ifndef __x86_64__ */ 4217864476afa402a0537c33ba9630e77351720baf8Christian Heimes 4227864476afa402a0537c33ba9630e77351720baf8Christian Heimes#endif /* defined __i386__ */ 423