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