1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan 3*1fd5a2e1SPrashanth Swaminathan sysv.S - Copyright (c) 2012 Alan Hourihane 4*1fd5a2e1SPrashanth Swaminathan Copyright (c) 1998, 2012 Andreas Schwab 5*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2008 Red Hat, Inc. 6*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2012, 2016 Thorsten Glaser 7*1fd5a2e1SPrashanth Swaminathan 8*1fd5a2e1SPrashanth Swaminathan m68k Foreign Function Interface 9*1fd5a2e1SPrashanth Swaminathan 10*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 11*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 12*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 13*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 14*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 15*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 16*1fd5a2e1SPrashanth Swaminathan the following conditions: 17*1fd5a2e1SPrashanth Swaminathan 18*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 19*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 20*1fd5a2e1SPrashanth Swaminathan 21*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 22*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 28*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 29*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 32*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 33*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 34*1fd5a2e1SPrashanth Swaminathan 35*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_CFI_PSEUDO_OP 36*1fd5a2e1SPrashanth Swaminathan#define CFI_STARTPROC() .cfi_startproc 37*1fd5a2e1SPrashanth Swaminathan#define CFI_OFFSET(reg,off) .cfi_offset reg,off 38*1fd5a2e1SPrashanth Swaminathan#define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off 39*1fd5a2e1SPrashanth Swaminathan#define CFI_ENDPROC() .cfi_endproc 40*1fd5a2e1SPrashanth Swaminathan#else 41*1fd5a2e1SPrashanth Swaminathan#define CFI_STARTPROC() 42*1fd5a2e1SPrashanth Swaminathan#define CFI_OFFSET(reg,off) 43*1fd5a2e1SPrashanth Swaminathan#define CFI_DEF_CFA(reg,off) 44*1fd5a2e1SPrashanth Swaminathan#define CFI_ENDPROC() 45*1fd5a2e1SPrashanth Swaminathan#endif 46*1fd5a2e1SPrashanth Swaminathan 47*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__ 48*1fd5a2e1SPrashanth Swaminathan#define CALLFUNC(funcname) _ ## funcname 49*1fd5a2e1SPrashanth Swaminathan#else 50*1fd5a2e1SPrashanth Swaminathan#define CALLFUNC(funcname) funcname 51*1fd5a2e1SPrashanth Swaminathan#endif 52*1fd5a2e1SPrashanth Swaminathan 53*1fd5a2e1SPrashanth Swaminathan .text 54*1fd5a2e1SPrashanth Swaminathan 55*1fd5a2e1SPrashanth Swaminathan .globl CALLFUNC(ffi_call_SYSV) 56*1fd5a2e1SPrashanth Swaminathan .type CALLFUNC(ffi_call_SYSV),@function 57*1fd5a2e1SPrashanth Swaminathan .align 4 58*1fd5a2e1SPrashanth Swaminathan 59*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_call_SYSV): 60*1fd5a2e1SPrashanth Swaminathan CFI_STARTPROC() 61*1fd5a2e1SPrashanth Swaminathan link %fp,#0 62*1fd5a2e1SPrashanth Swaminathan CFI_OFFSET(14,-8) 63*1fd5a2e1SPrashanth Swaminathan CFI_DEF_CFA(14,8) 64*1fd5a2e1SPrashanth Swaminathan move.l %d2,-(%sp) 65*1fd5a2e1SPrashanth Swaminathan CFI_OFFSET(2,-12) 66*1fd5a2e1SPrashanth Swaminathan 67*1fd5a2e1SPrashanth Swaminathan | Make room for all of the new args. 68*1fd5a2e1SPrashanth Swaminathan sub.l 12(%fp),%sp 69*1fd5a2e1SPrashanth Swaminathan 70*1fd5a2e1SPrashanth Swaminathan | Call ffi_prep_args 71*1fd5a2e1SPrashanth Swaminathan move.l 8(%fp),-(%sp) 72*1fd5a2e1SPrashanth Swaminathan pea 4(%sp) 73*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__ 74*1fd5a2e1SPrashanth Swaminathan jsr CALLFUNC(ffi_prep_args) 75*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) 76*1fd5a2e1SPrashanth Swaminathan move.l _current_shared_library_a5_offset_(%a5),%a0 77*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 78*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 79*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) 80*1fd5a2e1SPrashanth Swaminathan move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 81*1fd5a2e1SPrashanth Swaminathan lea (-6,%pc,%a0),%a0 82*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 83*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 84*1fd5a2e1SPrashanth Swaminathan#else 85*1fd5a2e1SPrashanth Swaminathan bsr.l CALLFUNC(ffi_prep_args@PLTPC) 86*1fd5a2e1SPrashanth Swaminathan#endif 87*1fd5a2e1SPrashanth Swaminathan addq.l #8,%sp 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan | Pass pointer to struct value, if any 90*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__ 91*1fd5a2e1SPrashanth Swaminathan move.l %d0,%a1 92*1fd5a2e1SPrashanth Swaminathan#else 93*1fd5a2e1SPrashanth Swaminathan move.l %a0,%a1 94*1fd5a2e1SPrashanth Swaminathan#endif 95*1fd5a2e1SPrashanth Swaminathan 96*1fd5a2e1SPrashanth Swaminathan | Call the function 97*1fd5a2e1SPrashanth Swaminathan move.l 24(%fp),%a0 98*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan | Remove the space we pushed for the args 101*1fd5a2e1SPrashanth Swaminathan add.l 12(%fp),%sp 102*1fd5a2e1SPrashanth Swaminathan 103*1fd5a2e1SPrashanth Swaminathan | Load the pointer to storage for the return value 104*1fd5a2e1SPrashanth Swaminathan move.l 20(%fp),%a1 105*1fd5a2e1SPrashanth Swaminathan 106*1fd5a2e1SPrashanth Swaminathan | Load the return type code 107*1fd5a2e1SPrashanth Swaminathan move.l 16(%fp),%d2 108*1fd5a2e1SPrashanth Swaminathan 109*1fd5a2e1SPrashanth Swaminathan | If the return value pointer is NULL, assume no return value. 110*1fd5a2e1SPrashanth Swaminathan | NOTE: On the mc68000, tst on an address register is not supported. 111*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) 112*1fd5a2e1SPrashanth Swaminathan cmp.w #0, %a1 113*1fd5a2e1SPrashanth Swaminathan#else 114*1fd5a2e1SPrashanth Swaminathan tst.l %a1 115*1fd5a2e1SPrashanth Swaminathan#endif 116*1fd5a2e1SPrashanth Swaminathan jbeq noretval 117*1fd5a2e1SPrashanth Swaminathan 118*1fd5a2e1SPrashanth Swaminathan btst #0,%d2 119*1fd5a2e1SPrashanth Swaminathan jbeq retlongint 120*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 121*1fd5a2e1SPrashanth Swaminathan jbra epilogue 122*1fd5a2e1SPrashanth Swaminathan 123*1fd5a2e1SPrashanth Swaminathanretlongint: 124*1fd5a2e1SPrashanth Swaminathan btst #1,%d2 125*1fd5a2e1SPrashanth Swaminathan jbeq retfloat 126*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 127*1fd5a2e1SPrashanth Swaminathan move.l %d1,4(%a1) 128*1fd5a2e1SPrashanth Swaminathan jbra epilogue 129*1fd5a2e1SPrashanth Swaminathan 130*1fd5a2e1SPrashanth Swaminathanretfloat: 131*1fd5a2e1SPrashanth Swaminathan btst #2,%d2 132*1fd5a2e1SPrashanth Swaminathan jbeq retdouble 133*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 134*1fd5a2e1SPrashanth Swaminathan fmove.s %fp0,(%a1) 135*1fd5a2e1SPrashanth Swaminathan#else 136*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 137*1fd5a2e1SPrashanth Swaminathan#endif 138*1fd5a2e1SPrashanth Swaminathan jbra epilogue 139*1fd5a2e1SPrashanth Swaminathan 140*1fd5a2e1SPrashanth Swaminathanretdouble: 141*1fd5a2e1SPrashanth Swaminathan btst #3,%d2 142*1fd5a2e1SPrashanth Swaminathan jbeq retlongdouble 143*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 144*1fd5a2e1SPrashanth Swaminathan fmove.d %fp0,(%a1) 145*1fd5a2e1SPrashanth Swaminathan#else 146*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1)+ 147*1fd5a2e1SPrashanth Swaminathan move.l %d1,(%a1) 148*1fd5a2e1SPrashanth Swaminathan#endif 149*1fd5a2e1SPrashanth Swaminathan jbra epilogue 150*1fd5a2e1SPrashanth Swaminathan 151*1fd5a2e1SPrashanth Swaminathanretlongdouble: 152*1fd5a2e1SPrashanth Swaminathan btst #4,%d2 153*1fd5a2e1SPrashanth Swaminathan jbeq retpointer 154*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 155*1fd5a2e1SPrashanth Swaminathan fmove.x %fp0,(%a1) 156*1fd5a2e1SPrashanth Swaminathan#else 157*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1)+ 158*1fd5a2e1SPrashanth Swaminathan move.l %d1,(%a1)+ 159*1fd5a2e1SPrashanth Swaminathan move.l %d2,(%a1) 160*1fd5a2e1SPrashanth Swaminathan#endif 161*1fd5a2e1SPrashanth Swaminathan jbra epilogue 162*1fd5a2e1SPrashanth Swaminathan 163*1fd5a2e1SPrashanth Swaminathanretpointer: 164*1fd5a2e1SPrashanth Swaminathan btst #5,%d2 165*1fd5a2e1SPrashanth Swaminathan jbeq retstruct1 166*1fd5a2e1SPrashanth Swaminathan#ifdef __MINT__ 167*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 168*1fd5a2e1SPrashanth Swaminathan#else 169*1fd5a2e1SPrashanth Swaminathan move.l %a0,(%a1) 170*1fd5a2e1SPrashanth Swaminathan#endif 171*1fd5a2e1SPrashanth Swaminathan jbra epilogue 172*1fd5a2e1SPrashanth Swaminathan 173*1fd5a2e1SPrashanth Swaminathanretstruct1: 174*1fd5a2e1SPrashanth Swaminathan btst #6,%d2 175*1fd5a2e1SPrashanth Swaminathan jbeq retstruct2 176*1fd5a2e1SPrashanth Swaminathan move.b %d0,(%a1) 177*1fd5a2e1SPrashanth Swaminathan jbra epilogue 178*1fd5a2e1SPrashanth Swaminathan 179*1fd5a2e1SPrashanth Swaminathanretstruct2: 180*1fd5a2e1SPrashanth Swaminathan btst #7,%d2 181*1fd5a2e1SPrashanth Swaminathan jbeq retsint8 182*1fd5a2e1SPrashanth Swaminathan move.w %d0,(%a1) 183*1fd5a2e1SPrashanth Swaminathan jbra epilogue 184*1fd5a2e1SPrashanth Swaminathan 185*1fd5a2e1SPrashanth Swaminathanretsint8: 186*1fd5a2e1SPrashanth Swaminathan btst #8,%d2 187*1fd5a2e1SPrashanth Swaminathan jbeq retsint16 188*1fd5a2e1SPrashanth Swaminathan | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. 189*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) 190*1fd5a2e1SPrashanth Swaminathan ext.w %d0 191*1fd5a2e1SPrashanth Swaminathan ext.l %d0 192*1fd5a2e1SPrashanth Swaminathan#else 193*1fd5a2e1SPrashanth Swaminathan extb.l %d0 194*1fd5a2e1SPrashanth Swaminathan#endif 195*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 196*1fd5a2e1SPrashanth Swaminathan jbra epilogue 197*1fd5a2e1SPrashanth Swaminathan 198*1fd5a2e1SPrashanth Swaminathanretsint16: 199*1fd5a2e1SPrashanth Swaminathan btst #9,%d2 200*1fd5a2e1SPrashanth Swaminathan jbeq noretval 201*1fd5a2e1SPrashanth Swaminathan ext.l %d0 202*1fd5a2e1SPrashanth Swaminathan move.l %d0,(%a1) 203*1fd5a2e1SPrashanth Swaminathan 204*1fd5a2e1SPrashanth Swaminathannoretval: 205*1fd5a2e1SPrashanth Swaminathanepilogue: 206*1fd5a2e1SPrashanth Swaminathan move.l (%sp)+,%d2 207*1fd5a2e1SPrashanth Swaminathan unlk %fp 208*1fd5a2e1SPrashanth Swaminathan rts 209*1fd5a2e1SPrashanth Swaminathan CFI_ENDPROC() 210*1fd5a2e1SPrashanth Swaminathan .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) 211*1fd5a2e1SPrashanth Swaminathan 212*1fd5a2e1SPrashanth Swaminathan .globl CALLFUNC(ffi_closure_SYSV) 213*1fd5a2e1SPrashanth Swaminathan .type CALLFUNC(ffi_closure_SYSV), @function 214*1fd5a2e1SPrashanth Swaminathan .align 4 215*1fd5a2e1SPrashanth Swaminathan 216*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_closure_SYSV): 217*1fd5a2e1SPrashanth Swaminathan CFI_STARTPROC() 218*1fd5a2e1SPrashanth Swaminathan link %fp,#-12 219*1fd5a2e1SPrashanth Swaminathan CFI_OFFSET(14,-8) 220*1fd5a2e1SPrashanth Swaminathan CFI_DEF_CFA(14,8) 221*1fd5a2e1SPrashanth Swaminathan move.l %sp,-12(%fp) 222*1fd5a2e1SPrashanth Swaminathan pea 8(%fp) 223*1fd5a2e1SPrashanth Swaminathan pea -12(%fp) 224*1fd5a2e1SPrashanth Swaminathan move.l %a0,-(%sp) 225*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__ 226*1fd5a2e1SPrashanth Swaminathan jsr CALLFUNC(ffi_closure_SYSV_inner) 227*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) 228*1fd5a2e1SPrashanth Swaminathan move.l _current_shared_library_a5_offset_(%a5),%a0 229*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 230*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 231*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) 232*1fd5a2e1SPrashanth Swaminathan move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 233*1fd5a2e1SPrashanth Swaminathan lea (-6,%pc,%a0),%a0 234*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 235*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 236*1fd5a2e1SPrashanth Swaminathan#else 237*1fd5a2e1SPrashanth Swaminathan bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) 238*1fd5a2e1SPrashanth Swaminathan#endif 239*1fd5a2e1SPrashanth Swaminathan 240*1fd5a2e1SPrashanth Swaminathan lsr.l #1,%d0 241*1fd5a2e1SPrashanth Swaminathan jne 1f 242*1fd5a2e1SPrashanth Swaminathan jcc .Lcls_epilogue 243*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_INT 244*1fd5a2e1SPrashanth Swaminathan move.l -12(%fp),%d0 245*1fd5a2e1SPrashanth Swaminathan.Lcls_epilogue: 246*1fd5a2e1SPrashanth Swaminathan | no CIF_FLAGS_* 247*1fd5a2e1SPrashanth Swaminathan unlk %fp 248*1fd5a2e1SPrashanth Swaminathan rts 249*1fd5a2e1SPrashanth Swaminathan1: 250*1fd5a2e1SPrashanth Swaminathan lea -12(%fp),%a0 251*1fd5a2e1SPrashanth Swaminathan lsr.l #2,%d0 252*1fd5a2e1SPrashanth Swaminathan jne 1f 253*1fd5a2e1SPrashanth Swaminathan jcs .Lcls_ret_float 254*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_DINT 255*1fd5a2e1SPrashanth Swaminathan move.l (%a0)+,%d0 256*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d1 257*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 258*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_float: 259*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 260*1fd5a2e1SPrashanth Swaminathan fmove.s (%a0),%fp0 261*1fd5a2e1SPrashanth Swaminathan#else 262*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d0 263*1fd5a2e1SPrashanth Swaminathan#endif 264*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 265*1fd5a2e1SPrashanth Swaminathan1: 266*1fd5a2e1SPrashanth Swaminathan lsr.l #2,%d0 267*1fd5a2e1SPrashanth Swaminathan jne 1f 268*1fd5a2e1SPrashanth Swaminathan jcs .Lcls_ret_ldouble 269*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_DOUBLE 270*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 271*1fd5a2e1SPrashanth Swaminathan fmove.d (%a0),%fp0 272*1fd5a2e1SPrashanth Swaminathan#else 273*1fd5a2e1SPrashanth Swaminathan move.l (%a0)+,%d0 274*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d1 275*1fd5a2e1SPrashanth Swaminathan#endif 276*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 277*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_ldouble: 278*1fd5a2e1SPrashanth Swaminathan#if defined(__MC68881__) || defined(__HAVE_68881__) 279*1fd5a2e1SPrashanth Swaminathan fmove.x (%a0),%fp0 280*1fd5a2e1SPrashanth Swaminathan#else 281*1fd5a2e1SPrashanth Swaminathan move.l (%a0)+,%d0 282*1fd5a2e1SPrashanth Swaminathan move.l (%a0)+,%d1 283*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d2 284*1fd5a2e1SPrashanth Swaminathan#endif 285*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 286*1fd5a2e1SPrashanth Swaminathan1: 287*1fd5a2e1SPrashanth Swaminathan lsr.l #2,%d0 288*1fd5a2e1SPrashanth Swaminathan jne 1f 289*1fd5a2e1SPrashanth Swaminathan jcs .Lcls_ret_struct1 290*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_POINTER 291*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%a0 292*1fd5a2e1SPrashanth Swaminathan move.l %a0,%d0 293*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 294*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_struct1: 295*1fd5a2e1SPrashanth Swaminathan move.b (%a0),%d0 296*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 297*1fd5a2e1SPrashanth Swaminathan1: 298*1fd5a2e1SPrashanth Swaminathan lsr.l #2,%d0 299*1fd5a2e1SPrashanth Swaminathan jne 1f 300*1fd5a2e1SPrashanth Swaminathan jcs .Lcls_ret_sint8 301*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_STRUCT2 302*1fd5a2e1SPrashanth Swaminathan move.w (%a0),%d0 303*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 304*1fd5a2e1SPrashanth Swaminathan.Lcls_ret_sint8: 305*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d0 306*1fd5a2e1SPrashanth Swaminathan | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. 307*1fd5a2e1SPrashanth Swaminathan#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) 308*1fd5a2e1SPrashanth Swaminathan ext.w %d0 309*1fd5a2e1SPrashanth Swaminathan ext.l %d0 310*1fd5a2e1SPrashanth Swaminathan#else 311*1fd5a2e1SPrashanth Swaminathan extb.l %d0 312*1fd5a2e1SPrashanth Swaminathan#endif 313*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 314*1fd5a2e1SPrashanth Swaminathan1: 315*1fd5a2e1SPrashanth Swaminathan | CIF_FLAGS_SINT16 316*1fd5a2e1SPrashanth Swaminathan move.l (%a0),%d0 317*1fd5a2e1SPrashanth Swaminathan ext.l %d0 318*1fd5a2e1SPrashanth Swaminathan jra .Lcls_epilogue 319*1fd5a2e1SPrashanth Swaminathan CFI_ENDPROC() 320*1fd5a2e1SPrashanth Swaminathan 321*1fd5a2e1SPrashanth Swaminathan .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) 322*1fd5a2e1SPrashanth Swaminathan 323*1fd5a2e1SPrashanth Swaminathan .globl CALLFUNC(ffi_closure_struct_SYSV) 324*1fd5a2e1SPrashanth Swaminathan .type CALLFUNC(ffi_closure_struct_SYSV), @function 325*1fd5a2e1SPrashanth Swaminathan .align 4 326*1fd5a2e1SPrashanth Swaminathan 327*1fd5a2e1SPrashanth SwaminathanCALLFUNC(ffi_closure_struct_SYSV): 328*1fd5a2e1SPrashanth Swaminathan CFI_STARTPROC() 329*1fd5a2e1SPrashanth Swaminathan link %fp,#0 330*1fd5a2e1SPrashanth Swaminathan CFI_OFFSET(14,-8) 331*1fd5a2e1SPrashanth Swaminathan CFI_DEF_CFA(14,8) 332*1fd5a2e1SPrashanth Swaminathan move.l %sp,-12(%fp) 333*1fd5a2e1SPrashanth Swaminathan pea 8(%fp) 334*1fd5a2e1SPrashanth Swaminathan move.l %a1,-(%sp) 335*1fd5a2e1SPrashanth Swaminathan move.l %a0,-(%sp) 336*1fd5a2e1SPrashanth Swaminathan#if !defined __PIC__ 337*1fd5a2e1SPrashanth Swaminathan jsr CALLFUNC(ffi_closure_SYSV_inner) 338*1fd5a2e1SPrashanth Swaminathan#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) 339*1fd5a2e1SPrashanth Swaminathan move.l _current_shared_library_a5_offset_(%a5),%a0 340*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 341*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 342*1fd5a2e1SPrashanth Swaminathan#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) 343*1fd5a2e1SPrashanth Swaminathan move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 344*1fd5a2e1SPrashanth Swaminathan lea (-6,%pc,%a0),%a0 345*1fd5a2e1SPrashanth Swaminathan move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 346*1fd5a2e1SPrashanth Swaminathan jsr (%a0) 347*1fd5a2e1SPrashanth Swaminathan#else 348*1fd5a2e1SPrashanth Swaminathan bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) 349*1fd5a2e1SPrashanth Swaminathan#endif 350*1fd5a2e1SPrashanth Swaminathan unlk %fp 351*1fd5a2e1SPrashanth Swaminathan rts 352*1fd5a2e1SPrashanth Swaminathan CFI_ENDPROC() 353*1fd5a2e1SPrashanth Swaminathan .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) 354*1fd5a2e1SPrashanth Swaminathan 355*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 356*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 357*1fd5a2e1SPrashanth Swaminathan#endif 358