1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2008 Björn König 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathan X86 Foreign Function Interface for FreeBSD 6*1fd5a2e1SPrashanth Swaminathan 7*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 8*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 9*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 10*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 11*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 12*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 13*1fd5a2e1SPrashanth Swaminathan the following conditions: 14*1fd5a2e1SPrashanth Swaminathan 15*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 16*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 17*1fd5a2e1SPrashanth Swaminathan 18*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 19*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 26*1fd5a2e1SPrashanth Swaminathan----------------------------------------------------------------------- */ 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan#ifndef __x86_64__ 29*1fd5a2e1SPrashanth Swaminathan 30*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 31*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 32*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 33*1fd5a2e1SPrashanth Swaminathan 34*1fd5a2e1SPrashanth Swaminathan.text 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth Swaminathan.globl ffi_prep_args 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan .align 4 39*1fd5a2e1SPrashanth Swaminathan.globl ffi_call_SYSV 40*1fd5a2e1SPrashanth Swaminathan .type ffi_call_SYSV,@function 41*1fd5a2e1SPrashanth Swaminathan 42*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV: 43*1fd5a2e1SPrashanth Swaminathan.LFB1: 44*1fd5a2e1SPrashanth Swaminathan pushl %ebp 45*1fd5a2e1SPrashanth Swaminathan.LCFI0: 46*1fd5a2e1SPrashanth Swaminathan movl %esp,%ebp 47*1fd5a2e1SPrashanth Swaminathan.LCFI1: 48*1fd5a2e1SPrashanth Swaminathan /* Make room for all of the new args. */ 49*1fd5a2e1SPrashanth Swaminathan movl 16(%ebp),%ecx 50*1fd5a2e1SPrashanth Swaminathan subl %ecx,%esp 51*1fd5a2e1SPrashanth Swaminathan 52*1fd5a2e1SPrashanth Swaminathan /* Align the stack pointer to 16-bytes */ 53*1fd5a2e1SPrashanth Swaminathan andl $0xfffffff0, %esp 54*1fd5a2e1SPrashanth Swaminathan 55*1fd5a2e1SPrashanth Swaminathan movl %esp,%eax 56*1fd5a2e1SPrashanth Swaminathan 57*1fd5a2e1SPrashanth Swaminathan /* Place all of the ffi_prep_args in position */ 58*1fd5a2e1SPrashanth Swaminathan pushl 12(%ebp) 59*1fd5a2e1SPrashanth Swaminathan pushl %eax 60*1fd5a2e1SPrashanth Swaminathan call *8(%ebp) 61*1fd5a2e1SPrashanth Swaminathan 62*1fd5a2e1SPrashanth Swaminathan /* Return stack to previous state and call the function */ 63*1fd5a2e1SPrashanth Swaminathan addl $8,%esp 64*1fd5a2e1SPrashanth Swaminathan 65*1fd5a2e1SPrashanth Swaminathan call *28(%ebp) 66*1fd5a2e1SPrashanth Swaminathan 67*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the return type code */ 68*1fd5a2e1SPrashanth Swaminathan movl 20(%ebp),%ecx 69*1fd5a2e1SPrashanth Swaminathan 70*1fd5a2e1SPrashanth Swaminathan /* Protect %esi. We're going to pop it in the epilogue. */ 71*1fd5a2e1SPrashanth Swaminathan pushl %esi 72*1fd5a2e1SPrashanth Swaminathan 73*1fd5a2e1SPrashanth Swaminathan /* If the return value pointer is NULL, assume no return value. */ 74*1fd5a2e1SPrashanth Swaminathan cmpl $0,24(%ebp) 75*1fd5a2e1SPrashanth Swaminathan jne 0f 76*1fd5a2e1SPrashanth Swaminathan 77*1fd5a2e1SPrashanth Swaminathan /* Even if there is no space for the return value, we are 78*1fd5a2e1SPrashanth Swaminathan obliged to handle floating-point values. */ 79*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_FLOAT,%ecx 80*1fd5a2e1SPrashanth Swaminathan jne noretval 81*1fd5a2e1SPrashanth Swaminathan fstp %st(0) 82*1fd5a2e1SPrashanth Swaminathan 83*1fd5a2e1SPrashanth Swaminathan jmp epilogue 84*1fd5a2e1SPrashanth Swaminathan 85*1fd5a2e1SPrashanth Swaminathan0: 86*1fd5a2e1SPrashanth Swaminathan call 1f 87*1fd5a2e1SPrashanth Swaminathan 88*1fd5a2e1SPrashanth Swaminathan.Lstore_table: 89*1fd5a2e1SPrashanth Swaminathan .long noretval-.Lstore_table /* FFI_TYPE_VOID */ 90*1fd5a2e1SPrashanth Swaminathan .long retint-.Lstore_table /* FFI_TYPE_INT */ 91*1fd5a2e1SPrashanth Swaminathan .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ 92*1fd5a2e1SPrashanth Swaminathan .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ 93*1fd5a2e1SPrashanth Swaminathan .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ 94*1fd5a2e1SPrashanth Swaminathan .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ 95*1fd5a2e1SPrashanth Swaminathan .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ 96*1fd5a2e1SPrashanth Swaminathan .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ 97*1fd5a2e1SPrashanth Swaminathan .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ 98*1fd5a2e1SPrashanth Swaminathan .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ 99*1fd5a2e1SPrashanth Swaminathan .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ 100*1fd5a2e1SPrashanth Swaminathan .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ 101*1fd5a2e1SPrashanth Swaminathan .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ 102*1fd5a2e1SPrashanth Swaminathan .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ 103*1fd5a2e1SPrashanth Swaminathan .long retint-.Lstore_table /* FFI_TYPE_POINTER */ 104*1fd5a2e1SPrashanth Swaminathan .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ 105*1fd5a2e1SPrashanth Swaminathan .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ 106*1fd5a2e1SPrashanth Swaminathan 107*1fd5a2e1SPrashanth Swaminathan1: 108*1fd5a2e1SPrashanth Swaminathan pop %esi 109*1fd5a2e1SPrashanth Swaminathan add (%esi, %ecx, 4), %esi 110*1fd5a2e1SPrashanth Swaminathan jmp *%esi 111*1fd5a2e1SPrashanth Swaminathan 112*1fd5a2e1SPrashanth Swaminathan /* Sign/zero extend as appropriate. */ 113*1fd5a2e1SPrashanth Swaminathanretsint8: 114*1fd5a2e1SPrashanth Swaminathan movsbl %al, %eax 115*1fd5a2e1SPrashanth Swaminathan jmp retint 116*1fd5a2e1SPrashanth Swaminathan 117*1fd5a2e1SPrashanth Swaminathanretsint16: 118*1fd5a2e1SPrashanth Swaminathan movswl %ax, %eax 119*1fd5a2e1SPrashanth Swaminathan jmp retint 120*1fd5a2e1SPrashanth Swaminathan 121*1fd5a2e1SPrashanth Swaminathanretuint8: 122*1fd5a2e1SPrashanth Swaminathan movzbl %al, %eax 123*1fd5a2e1SPrashanth Swaminathan jmp retint 124*1fd5a2e1SPrashanth Swaminathan 125*1fd5a2e1SPrashanth Swaminathanretuint16: 126*1fd5a2e1SPrashanth Swaminathan movzwl %ax, %eax 127*1fd5a2e1SPrashanth Swaminathan jmp retint 128*1fd5a2e1SPrashanth Swaminathan 129*1fd5a2e1SPrashanth Swaminathanretfloat: 130*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 131*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 132*1fd5a2e1SPrashanth Swaminathan fstps (%ecx) 133*1fd5a2e1SPrashanth Swaminathan jmp epilogue 134*1fd5a2e1SPrashanth Swaminathan 135*1fd5a2e1SPrashanth Swaminathanretdouble: 136*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 137*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 138*1fd5a2e1SPrashanth Swaminathan fstpl (%ecx) 139*1fd5a2e1SPrashanth Swaminathan jmp epilogue 140*1fd5a2e1SPrashanth Swaminathan 141*1fd5a2e1SPrashanth Swaminathanretlongdouble: 142*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 143*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 144*1fd5a2e1SPrashanth Swaminathan fstpt (%ecx) 145*1fd5a2e1SPrashanth Swaminathan jmp epilogue 146*1fd5a2e1SPrashanth Swaminathan 147*1fd5a2e1SPrashanth Swaminathanretint64: 148*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 149*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 150*1fd5a2e1SPrashanth Swaminathan movl %eax,0(%ecx) 151*1fd5a2e1SPrashanth Swaminathan movl %edx,4(%ecx) 152*1fd5a2e1SPrashanth Swaminathan jmp epilogue 153*1fd5a2e1SPrashanth Swaminathan 154*1fd5a2e1SPrashanth Swaminathanretstruct1b: 155*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 156*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 157*1fd5a2e1SPrashanth Swaminathan movb %al,0(%ecx) 158*1fd5a2e1SPrashanth Swaminathan jmp epilogue 159*1fd5a2e1SPrashanth Swaminathan 160*1fd5a2e1SPrashanth Swaminathanretstruct2b: 161*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 162*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 163*1fd5a2e1SPrashanth Swaminathan movw %ax,0(%ecx) 164*1fd5a2e1SPrashanth Swaminathan jmp epilogue 165*1fd5a2e1SPrashanth Swaminathan 166*1fd5a2e1SPrashanth Swaminathanretint: 167*1fd5a2e1SPrashanth Swaminathan /* Load %ecx with the pointer to storage for the return value */ 168*1fd5a2e1SPrashanth Swaminathan movl 24(%ebp),%ecx 169*1fd5a2e1SPrashanth Swaminathan movl %eax,0(%ecx) 170*1fd5a2e1SPrashanth Swaminathan 171*1fd5a2e1SPrashanth Swaminathanretstruct: 172*1fd5a2e1SPrashanth Swaminathan /* Nothing to do! */ 173*1fd5a2e1SPrashanth Swaminathan 174*1fd5a2e1SPrashanth Swaminathannoretval: 175*1fd5a2e1SPrashanth Swaminathanepilogue: 176*1fd5a2e1SPrashanth Swaminathan popl %esi 177*1fd5a2e1SPrashanth Swaminathan movl %ebp,%esp 178*1fd5a2e1SPrashanth Swaminathan popl %ebp 179*1fd5a2e1SPrashanth Swaminathan ret 180*1fd5a2e1SPrashanth Swaminathan.LFE1: 181*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end: 182*1fd5a2e1SPrashanth Swaminathan .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV 183*1fd5a2e1SPrashanth Swaminathan 184*1fd5a2e1SPrashanth Swaminathan .align 4 185*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN (ffi_closure_SYSV) 186*1fd5a2e1SPrashanth Swaminathan.globl ffi_closure_SYSV 187*1fd5a2e1SPrashanth Swaminathan .type ffi_closure_SYSV, @function 188*1fd5a2e1SPrashanth Swaminathan 189*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV: 190*1fd5a2e1SPrashanth Swaminathan.LFB2: 191*1fd5a2e1SPrashanth Swaminathan pushl %ebp 192*1fd5a2e1SPrashanth Swaminathan.LCFI2: 193*1fd5a2e1SPrashanth Swaminathan movl %esp, %ebp 194*1fd5a2e1SPrashanth Swaminathan.LCFI3: 195*1fd5a2e1SPrashanth Swaminathan subl $40, %esp 196*1fd5a2e1SPrashanth Swaminathan leal -24(%ebp), %edx 197*1fd5a2e1SPrashanth Swaminathan movl %edx, -12(%ebp) /* resp */ 198*1fd5a2e1SPrashanth Swaminathan leal 8(%ebp), %edx 199*1fd5a2e1SPrashanth Swaminathan movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ 200*1fd5a2e1SPrashanth Swaminathan leal -12(%ebp), %edx 201*1fd5a2e1SPrashanth Swaminathan movl %edx, (%esp) /* &resp */ 202*1fd5a2e1SPrashanth Swaminathan#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ 203*1fd5a2e1SPrashanth Swaminathan call ffi_closure_SYSV_inner 204*1fd5a2e1SPrashanth Swaminathan#else 205*1fd5a2e1SPrashanth Swaminathan movl %ebx, 8(%esp) 206*1fd5a2e1SPrashanth Swaminathan.LCFI7: 207*1fd5a2e1SPrashanth Swaminathan call 1f 208*1fd5a2e1SPrashanth Swaminathan1: popl %ebx 209*1fd5a2e1SPrashanth Swaminathan addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx 210*1fd5a2e1SPrashanth Swaminathan call ffi_closure_SYSV_inner@PLT 211*1fd5a2e1SPrashanth Swaminathan movl 8(%esp), %ebx 212*1fd5a2e1SPrashanth Swaminathan#endif 213*1fd5a2e1SPrashanth Swaminathan movl -12(%ebp), %ecx 214*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_INT, %eax 215*1fd5a2e1SPrashanth Swaminathan je .Lcls_retint 216*1fd5a2e1SPrashanth Swaminathan 217*1fd5a2e1SPrashanth Swaminathan /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, 218*1fd5a2e1SPrashanth Swaminathan FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ 219*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_UINT64, %eax 220*1fd5a2e1SPrashanth Swaminathan jge 0f 221*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_UINT8, %eax 222*1fd5a2e1SPrashanth Swaminathan jge .Lcls_retint 223*1fd5a2e1SPrashanth Swaminathan 224*1fd5a2e1SPrashanth Swaminathan0: cmpl $FFI_TYPE_FLOAT, %eax 225*1fd5a2e1SPrashanth Swaminathan je .Lcls_retfloat 226*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_DOUBLE, %eax 227*1fd5a2e1SPrashanth Swaminathan je .Lcls_retdouble 228*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_LONGDOUBLE, %eax 229*1fd5a2e1SPrashanth Swaminathan je .Lcls_retldouble 230*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_SINT64, %eax 231*1fd5a2e1SPrashanth Swaminathan je .Lcls_retllong 232*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax 233*1fd5a2e1SPrashanth Swaminathan je .Lcls_retstruct1b 234*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax 235*1fd5a2e1SPrashanth Swaminathan je .Lcls_retstruct2b 236*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_STRUCT, %eax 237*1fd5a2e1SPrashanth Swaminathan je .Lcls_retstruct 238*1fd5a2e1SPrashanth Swaminathan.Lcls_epilogue: 239*1fd5a2e1SPrashanth Swaminathan movl %ebp, %esp 240*1fd5a2e1SPrashanth Swaminathan popl %ebp 241*1fd5a2e1SPrashanth Swaminathan ret 242*1fd5a2e1SPrashanth Swaminathan.Lcls_retint: 243*1fd5a2e1SPrashanth Swaminathan movl (%ecx), %eax 244*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 245*1fd5a2e1SPrashanth Swaminathan.Lcls_retfloat: 246*1fd5a2e1SPrashanth Swaminathan flds (%ecx) 247*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 248*1fd5a2e1SPrashanth Swaminathan.Lcls_retdouble: 249*1fd5a2e1SPrashanth Swaminathan fldl (%ecx) 250*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 251*1fd5a2e1SPrashanth Swaminathan.Lcls_retldouble: 252*1fd5a2e1SPrashanth Swaminathan fldt (%ecx) 253*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 254*1fd5a2e1SPrashanth Swaminathan.Lcls_retllong: 255*1fd5a2e1SPrashanth Swaminathan movl (%ecx), %eax 256*1fd5a2e1SPrashanth Swaminathan movl 4(%ecx), %edx 257*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 258*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct1b: 259*1fd5a2e1SPrashanth Swaminathan movsbl (%ecx), %eax 260*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 261*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct2b: 262*1fd5a2e1SPrashanth Swaminathan movswl (%ecx), %eax 263*1fd5a2e1SPrashanth Swaminathan jmp .Lcls_epilogue 264*1fd5a2e1SPrashanth Swaminathan.Lcls_retstruct: 265*1fd5a2e1SPrashanth Swaminathan movl %ebp, %esp 266*1fd5a2e1SPrashanth Swaminathan popl %ebp 267*1fd5a2e1SPrashanth Swaminathan ret $4 268*1fd5a2e1SPrashanth Swaminathan.LFE2: 269*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_SYSV, .-ffi_closure_SYSV 270*1fd5a2e1SPrashanth Swaminathan 271*1fd5a2e1SPrashanth Swaminathan#if !FFI_NO_RAW_API 272*1fd5a2e1SPrashanth Swaminathan 273*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) 274*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) 275*1fd5a2e1SPrashanth Swaminathan#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) 276*1fd5a2e1SPrashanth Swaminathan#define CIF_FLAGS_OFFSET 20 277*1fd5a2e1SPrashanth Swaminathan 278*1fd5a2e1SPrashanth Swaminathan .align 4 279*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN (ffi_closure_raw_SYSV) 280*1fd5a2e1SPrashanth Swaminathan.globl ffi_closure_raw_SYSV 281*1fd5a2e1SPrashanth Swaminathan .type ffi_closure_raw_SYSV, @function 282*1fd5a2e1SPrashanth Swaminathan 283*1fd5a2e1SPrashanth Swaminathanffi_closure_raw_SYSV: 284*1fd5a2e1SPrashanth Swaminathan.LFB3: 285*1fd5a2e1SPrashanth Swaminathan pushl %ebp 286*1fd5a2e1SPrashanth Swaminathan.LCFI4: 287*1fd5a2e1SPrashanth Swaminathan movl %esp, %ebp 288*1fd5a2e1SPrashanth Swaminathan.LCFI5: 289*1fd5a2e1SPrashanth Swaminathan pushl %esi 290*1fd5a2e1SPrashanth Swaminathan.LCFI6: 291*1fd5a2e1SPrashanth Swaminathan subl $36, %esp 292*1fd5a2e1SPrashanth Swaminathan movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ 293*1fd5a2e1SPrashanth Swaminathan movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ 294*1fd5a2e1SPrashanth Swaminathan movl %edx, 12(%esp) /* user_data */ 295*1fd5a2e1SPrashanth Swaminathan leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ 296*1fd5a2e1SPrashanth Swaminathan movl %edx, 8(%esp) /* raw_args */ 297*1fd5a2e1SPrashanth Swaminathan leal -24(%ebp), %edx 298*1fd5a2e1SPrashanth Swaminathan movl %edx, 4(%esp) /* &res */ 299*1fd5a2e1SPrashanth Swaminathan movl %esi, (%esp) /* cif */ 300*1fd5a2e1SPrashanth Swaminathan call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ 301*1fd5a2e1SPrashanth Swaminathan movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ 302*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_INT, %eax 303*1fd5a2e1SPrashanth Swaminathan je .Lrcls_retint 304*1fd5a2e1SPrashanth Swaminathan 305*1fd5a2e1SPrashanth Swaminathan /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, 306*1fd5a2e1SPrashanth Swaminathan FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ 307*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_UINT64, %eax 308*1fd5a2e1SPrashanth Swaminathan jge 0f 309*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_UINT8, %eax 310*1fd5a2e1SPrashanth Swaminathan jge .Lrcls_retint 311*1fd5a2e1SPrashanth Swaminathan0: 312*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_FLOAT, %eax 313*1fd5a2e1SPrashanth Swaminathan je .Lrcls_retfloat 314*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_DOUBLE, %eax 315*1fd5a2e1SPrashanth Swaminathan je .Lrcls_retdouble 316*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_LONGDOUBLE, %eax 317*1fd5a2e1SPrashanth Swaminathan je .Lrcls_retldouble 318*1fd5a2e1SPrashanth Swaminathan cmpl $FFI_TYPE_SINT64, %eax 319*1fd5a2e1SPrashanth Swaminathan je .Lrcls_retllong 320*1fd5a2e1SPrashanth Swaminathan.Lrcls_epilogue: 321*1fd5a2e1SPrashanth Swaminathan addl $36, %esp 322*1fd5a2e1SPrashanth Swaminathan popl %esi 323*1fd5a2e1SPrashanth Swaminathan popl %ebp 324*1fd5a2e1SPrashanth Swaminathan ret 325*1fd5a2e1SPrashanth Swaminathan.Lrcls_retint: 326*1fd5a2e1SPrashanth Swaminathan movl -24(%ebp), %eax 327*1fd5a2e1SPrashanth Swaminathan jmp .Lrcls_epilogue 328*1fd5a2e1SPrashanth Swaminathan.Lrcls_retfloat: 329*1fd5a2e1SPrashanth Swaminathan flds -24(%ebp) 330*1fd5a2e1SPrashanth Swaminathan jmp .Lrcls_epilogue 331*1fd5a2e1SPrashanth Swaminathan.Lrcls_retdouble: 332*1fd5a2e1SPrashanth Swaminathan fldl -24(%ebp) 333*1fd5a2e1SPrashanth Swaminathan jmp .Lrcls_epilogue 334*1fd5a2e1SPrashanth Swaminathan.Lrcls_retldouble: 335*1fd5a2e1SPrashanth Swaminathan fldt -24(%ebp) 336*1fd5a2e1SPrashanth Swaminathan jmp .Lrcls_epilogue 337*1fd5a2e1SPrashanth Swaminathan.Lrcls_retllong: 338*1fd5a2e1SPrashanth Swaminathan movl -24(%ebp), %eax 339*1fd5a2e1SPrashanth Swaminathan movl -20(%ebp), %edx 340*1fd5a2e1SPrashanth Swaminathan jmp .Lrcls_epilogue 341*1fd5a2e1SPrashanth Swaminathan.LFE3: 342*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV 343*1fd5a2e1SPrashanth Swaminathan#endif 344*1fd5a2e1SPrashanth Swaminathan 345*1fd5a2e1SPrashanth Swaminathan .section .eh_frame,EH_FRAME_FLAGS,@progbits 346*1fd5a2e1SPrashanth Swaminathan.Lframe1: 347*1fd5a2e1SPrashanth Swaminathan .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ 348*1fd5a2e1SPrashanth Swaminathan.LSCIE1: 349*1fd5a2e1SPrashanth Swaminathan .long 0x0 /* CIE Identifier Tag */ 350*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* CIE Version */ 351*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 352*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" /* CIE Augmentation */ 353*1fd5a2e1SPrashanth Swaminathan#else 354*1fd5a2e1SPrashanth Swaminathan .ascii "\0" /* CIE Augmentation */ 355*1fd5a2e1SPrashanth Swaminathan#endif 356*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ 357*1fd5a2e1SPrashanth Swaminathan .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ 358*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* CIE RA Column */ 359*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 360*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* .uleb128 0x1; Augmentation size */ 361*1fd5a2e1SPrashanth Swaminathan .byte 0x1b /* FDE Encoding (pcrel sdata4) */ 362*1fd5a2e1SPrashanth Swaminathan#endif 363*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* DW_CFA_def_cfa */ 364*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* .uleb128 0x4 */ 365*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* .uleb128 0x4 */ 366*1fd5a2e1SPrashanth Swaminathan .byte 0x88 /* DW_CFA_offset, column 0x8 */ 367*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* .uleb128 0x1 */ 368*1fd5a2e1SPrashanth Swaminathan .align 4 369*1fd5a2e1SPrashanth Swaminathan.LECIE1: 370*1fd5a2e1SPrashanth Swaminathan.LSFDE1: 371*1fd5a2e1SPrashanth Swaminathan .long .LEFDE1-.LASFDE1 /* FDE Length */ 372*1fd5a2e1SPrashanth Swaminathan.LASFDE1: 373*1fd5a2e1SPrashanth Swaminathan .long .LASFDE1-.Lframe1 /* FDE CIE offset */ 374*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 375*1fd5a2e1SPrashanth Swaminathan .long .LFB1-. /* FDE initial location */ 376*1fd5a2e1SPrashanth Swaminathan#else 377*1fd5a2e1SPrashanth Swaminathan .long .LFB1 /* FDE initial location */ 378*1fd5a2e1SPrashanth Swaminathan#endif 379*1fd5a2e1SPrashanth Swaminathan .long .LFE1-.LFB1 /* FDE address range */ 380*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 381*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* .uleb128 0x0; Augmentation size */ 382*1fd5a2e1SPrashanth Swaminathan#endif 383*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 384*1fd5a2e1SPrashanth Swaminathan .long .LCFI0-.LFB1 385*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 386*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* .uleb128 0x8 */ 387*1fd5a2e1SPrashanth Swaminathan .byte 0x85 /* DW_CFA_offset, column 0x5 */ 388*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* .uleb128 0x2 */ 389*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 390*1fd5a2e1SPrashanth Swaminathan .long .LCFI1-.LCFI0 391*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 392*1fd5a2e1SPrashanth Swaminathan .byte 0x5 /* .uleb128 0x5 */ 393*1fd5a2e1SPrashanth Swaminathan .align 4 394*1fd5a2e1SPrashanth Swaminathan.LEFDE1: 395*1fd5a2e1SPrashanth Swaminathan.LSFDE2: 396*1fd5a2e1SPrashanth Swaminathan .long .LEFDE2-.LASFDE2 /* FDE Length */ 397*1fd5a2e1SPrashanth Swaminathan.LASFDE2: 398*1fd5a2e1SPrashanth Swaminathan .long .LASFDE2-.Lframe1 /* FDE CIE offset */ 399*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 400*1fd5a2e1SPrashanth Swaminathan .long .LFB2-. /* FDE initial location */ 401*1fd5a2e1SPrashanth Swaminathan#else 402*1fd5a2e1SPrashanth Swaminathan .long .LFB2 403*1fd5a2e1SPrashanth Swaminathan#endif 404*1fd5a2e1SPrashanth Swaminathan .long .LFE2-.LFB2 /* FDE address range */ 405*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 406*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* .uleb128 0x0; Augmentation size */ 407*1fd5a2e1SPrashanth Swaminathan#endif 408*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 409*1fd5a2e1SPrashanth Swaminathan .long .LCFI2-.LFB2 410*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 411*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* .uleb128 0x8 */ 412*1fd5a2e1SPrashanth Swaminathan .byte 0x85 /* DW_CFA_offset, column 0x5 */ 413*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* .uleb128 0x2 */ 414*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 415*1fd5a2e1SPrashanth Swaminathan .long .LCFI3-.LCFI2 416*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 417*1fd5a2e1SPrashanth Swaminathan .byte 0x5 /* .uleb128 0x5 */ 418*1fd5a2e1SPrashanth Swaminathan#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ 419*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 420*1fd5a2e1SPrashanth Swaminathan .long .LCFI7-.LCFI3 421*1fd5a2e1SPrashanth Swaminathan .byte 0x83 /* DW_CFA_offset, column 0x3 */ 422*1fd5a2e1SPrashanth Swaminathan .byte 0xa /* .uleb128 0xa */ 423*1fd5a2e1SPrashanth Swaminathan#endif 424*1fd5a2e1SPrashanth Swaminathan .align 4 425*1fd5a2e1SPrashanth Swaminathan.LEFDE2: 426*1fd5a2e1SPrashanth Swaminathan 427*1fd5a2e1SPrashanth Swaminathan#if !FFI_NO_RAW_API 428*1fd5a2e1SPrashanth Swaminathan 429*1fd5a2e1SPrashanth Swaminathan.LSFDE3: 430*1fd5a2e1SPrashanth Swaminathan .long .LEFDE3-.LASFDE3 /* FDE Length */ 431*1fd5a2e1SPrashanth Swaminathan.LASFDE3: 432*1fd5a2e1SPrashanth Swaminathan .long .LASFDE3-.Lframe1 /* FDE CIE offset */ 433*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 434*1fd5a2e1SPrashanth Swaminathan .long .LFB3-. /* FDE initial location */ 435*1fd5a2e1SPrashanth Swaminathan#else 436*1fd5a2e1SPrashanth Swaminathan .long .LFB3 437*1fd5a2e1SPrashanth Swaminathan#endif 438*1fd5a2e1SPrashanth Swaminathan .long .LFE3-.LFB3 /* FDE address range */ 439*1fd5a2e1SPrashanth Swaminathan#ifdef __PIC__ 440*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* .uleb128 0x0; Augmentation size */ 441*1fd5a2e1SPrashanth Swaminathan#endif 442*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 443*1fd5a2e1SPrashanth Swaminathan .long .LCFI4-.LFB3 444*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 445*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* .uleb128 0x8 */ 446*1fd5a2e1SPrashanth Swaminathan .byte 0x85 /* DW_CFA_offset, column 0x5 */ 447*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* .uleb128 0x2 */ 448*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 449*1fd5a2e1SPrashanth Swaminathan .long .LCFI5-.LCFI4 450*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 451*1fd5a2e1SPrashanth Swaminathan .byte 0x5 /* .uleb128 0x5 */ 452*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 453*1fd5a2e1SPrashanth Swaminathan .long .LCFI6-.LCFI5 454*1fd5a2e1SPrashanth Swaminathan .byte 0x86 /* DW_CFA_offset, column 0x6 */ 455*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* .uleb128 0x3 */ 456*1fd5a2e1SPrashanth Swaminathan .align 4 457*1fd5a2e1SPrashanth Swaminathan.LEFDE3: 458*1fd5a2e1SPrashanth Swaminathan 459*1fd5a2e1SPrashanth Swaminathan#endif 460*1fd5a2e1SPrashanth Swaminathan 461*1fd5a2e1SPrashanth Swaminathan#endif /* ifndef __x86_64__ */ 462*1fd5a2e1SPrashanth Swaminathan 463*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",%progbits 464