1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan SuperH Foreign Function Interface 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 7*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 8*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 9*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 10*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 11*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 12*1fd5a2e1SPrashanth Swaminathan the following conditions: 13*1fd5a2e1SPrashanth Swaminathan 14*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 15*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 18*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 25*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 26*1fd5a2e1SPrashanth Swaminathan 27*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 28*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 29*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 30*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_MACHINE_ASM_H 31*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h> 32*1fd5a2e1SPrashanth Swaminathan#else 33*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure. */ 34*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x 35*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): 36*1fd5a2e1SPrashanth Swaminathan#endif 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan#if defined(__HITACHI__) 39*1fd5a2e1SPrashanth Swaminathan#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 40*1fd5a2e1SPrashanth Swaminathan#else 41*1fd5a2e1SPrashanth Swaminathan#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 42*1fd5a2e1SPrashanth Swaminathan#endif 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathan.text 45*1fd5a2e1SPrashanth Swaminathan 46*1fd5a2e1SPrashanth Swaminathan # r4: ffi_prep_args 47*1fd5a2e1SPrashanth Swaminathan # r5: &ecif 48*1fd5a2e1SPrashanth Swaminathan # r6: bytes 49*1fd5a2e1SPrashanth Swaminathan # r7: flags 50*1fd5a2e1SPrashanth Swaminathan # sp+0: rvalue 51*1fd5a2e1SPrashanth Swaminathan # sp+4: fn 52*1fd5a2e1SPrashanth Swaminathan 53*1fd5a2e1SPrashanth Swaminathan # This assumes we are using gas. 54*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV) 55*1fd5a2e1SPrashanth Swaminathan # Save registers 56*1fd5a2e1SPrashanth Swaminathan.LFB1: 57*1fd5a2e1SPrashanth Swaminathan mov.l r8,@-r15 58*1fd5a2e1SPrashanth Swaminathan.LCFI0: 59*1fd5a2e1SPrashanth Swaminathan mov.l r9,@-r15 60*1fd5a2e1SPrashanth Swaminathan.LCFI1: 61*1fd5a2e1SPrashanth Swaminathan mov.l r10,@-r15 62*1fd5a2e1SPrashanth Swaminathan.LCFI2: 63*1fd5a2e1SPrashanth Swaminathan mov.l r12,@-r15 64*1fd5a2e1SPrashanth Swaminathan.LCFI3: 65*1fd5a2e1SPrashanth Swaminathan mov.l r14,@-r15 66*1fd5a2e1SPrashanth Swaminathan.LCFI4: 67*1fd5a2e1SPrashanth Swaminathan sts.l pr,@-r15 68*1fd5a2e1SPrashanth Swaminathan.LCFI5: 69*1fd5a2e1SPrashanth Swaminathan mov r15,r14 70*1fd5a2e1SPrashanth Swaminathan.LCFI6: 71*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 72*1fd5a2e1SPrashanth Swaminathan mov r6,r8 73*1fd5a2e1SPrashanth Swaminathan mov r7,r9 74*1fd5a2e1SPrashanth Swaminathan 75*1fd5a2e1SPrashanth Swaminathan sub r6,r15 76*1fd5a2e1SPrashanth Swaminathan add #-16,r15 77*1fd5a2e1SPrashanth Swaminathan mov #~7,r0 78*1fd5a2e1SPrashanth Swaminathan and r0,r15 79*1fd5a2e1SPrashanth Swaminathan 80*1fd5a2e1SPrashanth Swaminathan mov r4,r0 81*1fd5a2e1SPrashanth Swaminathan jsr @r0 82*1fd5a2e1SPrashanth Swaminathan mov r15,r4 83*1fd5a2e1SPrashanth Swaminathan 84*1fd5a2e1SPrashanth Swaminathan mov r9,r1 85*1fd5a2e1SPrashanth Swaminathan shlr8 r9 86*1fd5a2e1SPrashanth Swaminathan shlr8 r9 87*1fd5a2e1SPrashanth Swaminathan shlr8 r9 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_STRUCT,r2 90*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 91*1fd5a2e1SPrashanth Swaminathan bf 1f 92*1fd5a2e1SPrashanth Swaminathan#if STRUCT_VALUE_ADDRESS_WITH_ARG 93*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r4 94*1fd5a2e1SPrashanth Swaminathan bra 2f 95*1fd5a2e1SPrashanth Swaminathan mov #5,r2 96*1fd5a2e1SPrashanth Swaminathan#else 97*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r10 98*1fd5a2e1SPrashanth Swaminathan#endif 99*1fd5a2e1SPrashanth Swaminathan1: 100*1fd5a2e1SPrashanth Swaminathan mov #4,r2 101*1fd5a2e1SPrashanth Swaminathan2: 102*1fd5a2e1SPrashanth Swaminathan mov #4,r3 103*1fd5a2e1SPrashanth Swaminathan 104*1fd5a2e1SPrashanth SwaminathanL_pass: 105*1fd5a2e1SPrashanth Swaminathan cmp/pl r8 106*1fd5a2e1SPrashanth Swaminathan bf L_call_it 107*1fd5a2e1SPrashanth Swaminathan 108*1fd5a2e1SPrashanth Swaminathan mov r1,r0 109*1fd5a2e1SPrashanth Swaminathan and #3,r0 110*1fd5a2e1SPrashanth Swaminathan 111*1fd5a2e1SPrashanth SwaminathanL_pass_d: 112*1fd5a2e1SPrashanth Swaminathan cmp/eq #FFI_TYPE_DOUBLE,r0 113*1fd5a2e1SPrashanth Swaminathan bf L_pass_f 114*1fd5a2e1SPrashanth Swaminathan 115*1fd5a2e1SPrashanth Swaminathan mov r3,r0 116*1fd5a2e1SPrashanth Swaminathan and #1,r0 117*1fd5a2e1SPrashanth Swaminathan tst r0,r0 118*1fd5a2e1SPrashanth Swaminathan bt 1f 119*1fd5a2e1SPrashanth Swaminathan add #1,r3 120*1fd5a2e1SPrashanth Swaminathan1: 121*1fd5a2e1SPrashanth Swaminathan mov #12,r0 122*1fd5a2e1SPrashanth Swaminathan cmp/hs r0,r3 123*1fd5a2e1SPrashanth Swaminathan bt/s 3f 124*1fd5a2e1SPrashanth Swaminathan shlr2 r1 125*1fd5a2e1SPrashanth Swaminathan bsr L_pop_d 126*1fd5a2e1SPrashanth Swaminathan nop 127*1fd5a2e1SPrashanth Swaminathan3: 128*1fd5a2e1SPrashanth Swaminathan add #2,r3 129*1fd5a2e1SPrashanth Swaminathan bra L_pass 130*1fd5a2e1SPrashanth Swaminathan add #-8,r8 131*1fd5a2e1SPrashanth Swaminathan 132*1fd5a2e1SPrashanth SwaminathanL_pop_d: 133*1fd5a2e1SPrashanth Swaminathan mov r3,r0 134*1fd5a2e1SPrashanth Swaminathan add r0,r0 135*1fd5a2e1SPrashanth Swaminathan add r3,r0 136*1fd5a2e1SPrashanth Swaminathan add #-12,r0 137*1fd5a2e1SPrashanth Swaminathan braf r0 138*1fd5a2e1SPrashanth Swaminathan nop 139*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 140*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr5 141*1fd5a2e1SPrashanth Swaminathan rts 142*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr4 143*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr7 144*1fd5a2e1SPrashanth Swaminathan rts 145*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr6 146*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr9 147*1fd5a2e1SPrashanth Swaminathan rts 148*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr8 149*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr11 150*1fd5a2e1SPrashanth Swaminathan rts 151*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr10 152*1fd5a2e1SPrashanth Swaminathan#else 153*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr4 154*1fd5a2e1SPrashanth Swaminathan rts 155*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr5 156*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr6 157*1fd5a2e1SPrashanth Swaminathan rts 158*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr7 159*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr8 160*1fd5a2e1SPrashanth Swaminathan rts 161*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr9 162*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr10 163*1fd5a2e1SPrashanth Swaminathan rts 164*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr11 165*1fd5a2e1SPrashanth Swaminathan#endif 166*1fd5a2e1SPrashanth Swaminathan 167*1fd5a2e1SPrashanth SwaminathanL_pass_f: 168*1fd5a2e1SPrashanth Swaminathan cmp/eq #FFI_TYPE_FLOAT,r0 169*1fd5a2e1SPrashanth Swaminathan bf L_pass_i 170*1fd5a2e1SPrashanth Swaminathan 171*1fd5a2e1SPrashanth Swaminathan mov #12,r0 172*1fd5a2e1SPrashanth Swaminathan cmp/hs r0,r3 173*1fd5a2e1SPrashanth Swaminathan bt/s 2f 174*1fd5a2e1SPrashanth Swaminathan shlr2 r1 175*1fd5a2e1SPrashanth Swaminathan bsr L_pop_f 176*1fd5a2e1SPrashanth Swaminathan nop 177*1fd5a2e1SPrashanth Swaminathan2: 178*1fd5a2e1SPrashanth Swaminathan add #1,r3 179*1fd5a2e1SPrashanth Swaminathan bra L_pass 180*1fd5a2e1SPrashanth Swaminathan add #-4,r8 181*1fd5a2e1SPrashanth Swaminathan 182*1fd5a2e1SPrashanth SwaminathanL_pop_f: 183*1fd5a2e1SPrashanth Swaminathan mov r3,r0 184*1fd5a2e1SPrashanth Swaminathan shll2 r0 185*1fd5a2e1SPrashanth Swaminathan add #-16,r0 186*1fd5a2e1SPrashanth Swaminathan braf r0 187*1fd5a2e1SPrashanth Swaminathan nop 188*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 189*1fd5a2e1SPrashanth Swaminathan rts 190*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr5 191*1fd5a2e1SPrashanth Swaminathan rts 192*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr4 193*1fd5a2e1SPrashanth Swaminathan rts 194*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr7 195*1fd5a2e1SPrashanth Swaminathan rts 196*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr6 197*1fd5a2e1SPrashanth Swaminathan rts 198*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr9 199*1fd5a2e1SPrashanth Swaminathan rts 200*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr8 201*1fd5a2e1SPrashanth Swaminathan rts 202*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr11 203*1fd5a2e1SPrashanth Swaminathan rts 204*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr10 205*1fd5a2e1SPrashanth Swaminathan#else 206*1fd5a2e1SPrashanth Swaminathan rts 207*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr4 208*1fd5a2e1SPrashanth Swaminathan rts 209*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr5 210*1fd5a2e1SPrashanth Swaminathan rts 211*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr6 212*1fd5a2e1SPrashanth Swaminathan rts 213*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr7 214*1fd5a2e1SPrashanth Swaminathan rts 215*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr8 216*1fd5a2e1SPrashanth Swaminathan rts 217*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr9 218*1fd5a2e1SPrashanth Swaminathan rts 219*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr10 220*1fd5a2e1SPrashanth Swaminathan rts 221*1fd5a2e1SPrashanth Swaminathan fmov.s @r15+,fr11 222*1fd5a2e1SPrashanth Swaminathan#endif 223*1fd5a2e1SPrashanth Swaminathan 224*1fd5a2e1SPrashanth SwaminathanL_pass_i: 225*1fd5a2e1SPrashanth Swaminathan cmp/eq #FFI_TYPE_INT,r0 226*1fd5a2e1SPrashanth Swaminathan bf L_call_it 227*1fd5a2e1SPrashanth Swaminathan 228*1fd5a2e1SPrashanth Swaminathan mov #8,r0 229*1fd5a2e1SPrashanth Swaminathan cmp/hs r0,r2 230*1fd5a2e1SPrashanth Swaminathan bt/s 2f 231*1fd5a2e1SPrashanth Swaminathan shlr2 r1 232*1fd5a2e1SPrashanth Swaminathan bsr L_pop_i 233*1fd5a2e1SPrashanth Swaminathan nop 234*1fd5a2e1SPrashanth Swaminathan2: 235*1fd5a2e1SPrashanth Swaminathan add #1,r2 236*1fd5a2e1SPrashanth Swaminathan bra L_pass 237*1fd5a2e1SPrashanth Swaminathan add #-4,r8 238*1fd5a2e1SPrashanth Swaminathan 239*1fd5a2e1SPrashanth SwaminathanL_pop_i: 240*1fd5a2e1SPrashanth Swaminathan mov r2,r0 241*1fd5a2e1SPrashanth Swaminathan shll2 r0 242*1fd5a2e1SPrashanth Swaminathan add #-16,r0 243*1fd5a2e1SPrashanth Swaminathan braf r0 244*1fd5a2e1SPrashanth Swaminathan nop 245*1fd5a2e1SPrashanth Swaminathan rts 246*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r4 247*1fd5a2e1SPrashanth Swaminathan rts 248*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r5 249*1fd5a2e1SPrashanth Swaminathan rts 250*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r6 251*1fd5a2e1SPrashanth Swaminathan rts 252*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r7 253*1fd5a2e1SPrashanth Swaminathan 254*1fd5a2e1SPrashanth SwaminathanL_call_it: 255*1fd5a2e1SPrashanth Swaminathan # call function 256*1fd5a2e1SPrashanth Swaminathan#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) 257*1fd5a2e1SPrashanth Swaminathan mov r10, r2 258*1fd5a2e1SPrashanth Swaminathan#endif 259*1fd5a2e1SPrashanth Swaminathan mov.l @(28,r14),r1 260*1fd5a2e1SPrashanth Swaminathan jsr @r1 261*1fd5a2e1SPrashanth Swaminathan nop 262*1fd5a2e1SPrashanth Swaminathan 263*1fd5a2e1SPrashanth SwaminathanL_ret_d: 264*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_DOUBLE,r2 265*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 266*1fd5a2e1SPrashanth Swaminathan bf L_ret_ll 267*1fd5a2e1SPrashanth Swaminathan 268*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r1 269*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 270*1fd5a2e1SPrashanth Swaminathan fmov.s fr1,@r1 271*1fd5a2e1SPrashanth Swaminathan add #4,r1 272*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 273*1fd5a2e1SPrashanth Swaminathan fmov.s fr0,@r1 274*1fd5a2e1SPrashanth Swaminathan#else 275*1fd5a2e1SPrashanth Swaminathan fmov.s fr0,@r1 276*1fd5a2e1SPrashanth Swaminathan add #4,r1 277*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 278*1fd5a2e1SPrashanth Swaminathan fmov.s fr1,@r1 279*1fd5a2e1SPrashanth Swaminathan#endif 280*1fd5a2e1SPrashanth Swaminathan 281*1fd5a2e1SPrashanth SwaminathanL_ret_ll: 282*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_SINT64,r2 283*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 284*1fd5a2e1SPrashanth Swaminathan bt/s 1f 285*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_UINT64,r2 286*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 287*1fd5a2e1SPrashanth Swaminathan bf L_ret_f 288*1fd5a2e1SPrashanth Swaminathan 289*1fd5a2e1SPrashanth Swaminathan1: 290*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r2 291*1fd5a2e1SPrashanth Swaminathan mov.l r0,@r2 292*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 293*1fd5a2e1SPrashanth Swaminathan mov.l r1,@(4,r2) 294*1fd5a2e1SPrashanth Swaminathan 295*1fd5a2e1SPrashanth SwaminathanL_ret_f: 296*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_FLOAT,r2 297*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 298*1fd5a2e1SPrashanth Swaminathan bf L_ret_i 299*1fd5a2e1SPrashanth Swaminathan 300*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r1 301*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 302*1fd5a2e1SPrashanth Swaminathan fmov.s fr0,@r1 303*1fd5a2e1SPrashanth Swaminathan 304*1fd5a2e1SPrashanth SwaminathanL_ret_i: 305*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_INT,r2 306*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 307*1fd5a2e1SPrashanth Swaminathan bf L_epilogue 308*1fd5a2e1SPrashanth Swaminathan 309*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r1 310*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 311*1fd5a2e1SPrashanth Swaminathan mov.l r0,@r1 312*1fd5a2e1SPrashanth Swaminathan 313*1fd5a2e1SPrashanth SwaminathanL_epilogue: 314*1fd5a2e1SPrashanth Swaminathan # Remove the space we pushed for the args 315*1fd5a2e1SPrashanth Swaminathan mov r14,r15 316*1fd5a2e1SPrashanth Swaminathan 317*1fd5a2e1SPrashanth Swaminathan lds.l @r15+,pr 318*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r14 319*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r12 320*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r10 321*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r9 322*1fd5a2e1SPrashanth Swaminathan rts 323*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r8 324*1fd5a2e1SPrashanth Swaminathan#else 325*1fd5a2e1SPrashanth Swaminathan mov r6,r8 326*1fd5a2e1SPrashanth Swaminathan mov r7,r9 327*1fd5a2e1SPrashanth Swaminathan 328*1fd5a2e1SPrashanth Swaminathan sub r6,r15 329*1fd5a2e1SPrashanth Swaminathan add #-16,r15 330*1fd5a2e1SPrashanth Swaminathan mov #~7,r0 331*1fd5a2e1SPrashanth Swaminathan and r0,r15 332*1fd5a2e1SPrashanth Swaminathan 333*1fd5a2e1SPrashanth Swaminathan mov r4,r0 334*1fd5a2e1SPrashanth Swaminathan jsr @r0 335*1fd5a2e1SPrashanth Swaminathan mov r15,r4 336*1fd5a2e1SPrashanth Swaminathan 337*1fd5a2e1SPrashanth Swaminathan mov r9,r3 338*1fd5a2e1SPrashanth Swaminathan shlr8 r9 339*1fd5a2e1SPrashanth Swaminathan shlr8 r9 340*1fd5a2e1SPrashanth Swaminathan shlr8 r9 341*1fd5a2e1SPrashanth Swaminathan 342*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_STRUCT,r2 343*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 344*1fd5a2e1SPrashanth Swaminathan bf 1f 345*1fd5a2e1SPrashanth Swaminathan#if STRUCT_VALUE_ADDRESS_WITH_ARG 346*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r4 347*1fd5a2e1SPrashanth Swaminathan bra 2f 348*1fd5a2e1SPrashanth Swaminathan mov #5,r2 349*1fd5a2e1SPrashanth Swaminathan#else 350*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r10 351*1fd5a2e1SPrashanth Swaminathan#endif 352*1fd5a2e1SPrashanth Swaminathan1: 353*1fd5a2e1SPrashanth Swaminathan mov #4,r2 354*1fd5a2e1SPrashanth Swaminathan2: 355*1fd5a2e1SPrashanth Swaminathan 356*1fd5a2e1SPrashanth SwaminathanL_pass: 357*1fd5a2e1SPrashanth Swaminathan cmp/pl r8 358*1fd5a2e1SPrashanth Swaminathan bf L_call_it 359*1fd5a2e1SPrashanth Swaminathan 360*1fd5a2e1SPrashanth Swaminathan mov r3,r0 361*1fd5a2e1SPrashanth Swaminathan and #3,r0 362*1fd5a2e1SPrashanth Swaminathan 363*1fd5a2e1SPrashanth SwaminathanL_pass_d: 364*1fd5a2e1SPrashanth Swaminathan cmp/eq #FFI_TYPE_DOUBLE,r0 365*1fd5a2e1SPrashanth Swaminathan bf L_pass_i 366*1fd5a2e1SPrashanth Swaminathan 367*1fd5a2e1SPrashanth Swaminathan mov r15,r0 368*1fd5a2e1SPrashanth Swaminathan and #7,r0 369*1fd5a2e1SPrashanth Swaminathan tst r0,r0 370*1fd5a2e1SPrashanth Swaminathan bt 1f 371*1fd5a2e1SPrashanth Swaminathan add #4,r15 372*1fd5a2e1SPrashanth Swaminathan1: 373*1fd5a2e1SPrashanth Swaminathan mov #8,r0 374*1fd5a2e1SPrashanth Swaminathan cmp/hs r0,r2 375*1fd5a2e1SPrashanth Swaminathan bt/s 2f 376*1fd5a2e1SPrashanth Swaminathan shlr2 r3 377*1fd5a2e1SPrashanth Swaminathan bsr L_pop_d 378*1fd5a2e1SPrashanth Swaminathan nop 379*1fd5a2e1SPrashanth Swaminathan2: 380*1fd5a2e1SPrashanth Swaminathan add #2,r2 381*1fd5a2e1SPrashanth Swaminathan bra L_pass 382*1fd5a2e1SPrashanth Swaminathan add #-8,r8 383*1fd5a2e1SPrashanth Swaminathan 384*1fd5a2e1SPrashanth SwaminathanL_pop_d: 385*1fd5a2e1SPrashanth Swaminathan mov r2,r0 386*1fd5a2e1SPrashanth Swaminathan add r0,r0 387*1fd5a2e1SPrashanth Swaminathan add r2,r0 388*1fd5a2e1SPrashanth Swaminathan add #-12,r0 389*1fd5a2e1SPrashanth Swaminathan add r0,r0 390*1fd5a2e1SPrashanth Swaminathan braf r0 391*1fd5a2e1SPrashanth Swaminathan nop 392*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r4 393*1fd5a2e1SPrashanth Swaminathan rts 394*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r5 395*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r5 396*1fd5a2e1SPrashanth Swaminathan rts 397*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r6 398*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r6 399*1fd5a2e1SPrashanth Swaminathan rts 400*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r7 401*1fd5a2e1SPrashanth Swaminathan rts 402*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r7 403*1fd5a2e1SPrashanth Swaminathan 404*1fd5a2e1SPrashanth SwaminathanL_pass_i: 405*1fd5a2e1SPrashanth Swaminathan cmp/eq #FFI_TYPE_INT,r0 406*1fd5a2e1SPrashanth Swaminathan bf L_call_it 407*1fd5a2e1SPrashanth Swaminathan 408*1fd5a2e1SPrashanth Swaminathan mov #8,r0 409*1fd5a2e1SPrashanth Swaminathan cmp/hs r0,r2 410*1fd5a2e1SPrashanth Swaminathan bt/s 2f 411*1fd5a2e1SPrashanth Swaminathan shlr2 r3 412*1fd5a2e1SPrashanth Swaminathan bsr L_pop_i 413*1fd5a2e1SPrashanth Swaminathan nop 414*1fd5a2e1SPrashanth Swaminathan2: 415*1fd5a2e1SPrashanth Swaminathan add #1,r2 416*1fd5a2e1SPrashanth Swaminathan bra L_pass 417*1fd5a2e1SPrashanth Swaminathan add #-4,r8 418*1fd5a2e1SPrashanth Swaminathan 419*1fd5a2e1SPrashanth SwaminathanL_pop_i: 420*1fd5a2e1SPrashanth Swaminathan mov r2,r0 421*1fd5a2e1SPrashanth Swaminathan shll2 r0 422*1fd5a2e1SPrashanth Swaminathan add #-16,r0 423*1fd5a2e1SPrashanth Swaminathan braf r0 424*1fd5a2e1SPrashanth Swaminathan nop 425*1fd5a2e1SPrashanth Swaminathan rts 426*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r4 427*1fd5a2e1SPrashanth Swaminathan rts 428*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r5 429*1fd5a2e1SPrashanth Swaminathan rts 430*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r6 431*1fd5a2e1SPrashanth Swaminathan rts 432*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r7 433*1fd5a2e1SPrashanth Swaminathan 434*1fd5a2e1SPrashanth SwaminathanL_call_it: 435*1fd5a2e1SPrashanth Swaminathan # call function 436*1fd5a2e1SPrashanth Swaminathan#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) 437*1fd5a2e1SPrashanth Swaminathan mov r10, r2 438*1fd5a2e1SPrashanth Swaminathan#endif 439*1fd5a2e1SPrashanth Swaminathan mov.l @(28,r14),r1 440*1fd5a2e1SPrashanth Swaminathan jsr @r1 441*1fd5a2e1SPrashanth Swaminathan nop 442*1fd5a2e1SPrashanth Swaminathan 443*1fd5a2e1SPrashanth SwaminathanL_ret_d: 444*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_DOUBLE,r2 445*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 446*1fd5a2e1SPrashanth Swaminathan bf L_ret_ll 447*1fd5a2e1SPrashanth Swaminathan 448*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r2 449*1fd5a2e1SPrashanth Swaminathan mov.l r0,@r2 450*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 451*1fd5a2e1SPrashanth Swaminathan mov.l r1,@(4,r2) 452*1fd5a2e1SPrashanth Swaminathan 453*1fd5a2e1SPrashanth SwaminathanL_ret_ll: 454*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_SINT64,r2 455*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 456*1fd5a2e1SPrashanth Swaminathan bt/s 1f 457*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_UINT64,r2 458*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 459*1fd5a2e1SPrashanth Swaminathan bf L_ret_i 460*1fd5a2e1SPrashanth Swaminathan 461*1fd5a2e1SPrashanth Swaminathan1: 462*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r2 463*1fd5a2e1SPrashanth Swaminathan mov.l r0,@r2 464*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 465*1fd5a2e1SPrashanth Swaminathan mov.l r1,@(4,r2) 466*1fd5a2e1SPrashanth Swaminathan 467*1fd5a2e1SPrashanth SwaminathanL_ret_i: 468*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_FLOAT,r2 469*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 470*1fd5a2e1SPrashanth Swaminathan bt 1f 471*1fd5a2e1SPrashanth Swaminathan mov #FFI_TYPE_INT,r2 472*1fd5a2e1SPrashanth Swaminathan cmp/eq r2,r9 473*1fd5a2e1SPrashanth Swaminathan bf L_epilogue 474*1fd5a2e1SPrashanth Swaminathan1: 475*1fd5a2e1SPrashanth Swaminathan mov.l @(24,r14),r1 476*1fd5a2e1SPrashanth Swaminathan bra L_epilogue 477*1fd5a2e1SPrashanth Swaminathan mov.l r0,@r1 478*1fd5a2e1SPrashanth Swaminathan 479*1fd5a2e1SPrashanth SwaminathanL_epilogue: 480*1fd5a2e1SPrashanth Swaminathan # Remove the space we pushed for the args 481*1fd5a2e1SPrashanth Swaminathan mov r14,r15 482*1fd5a2e1SPrashanth Swaminathan 483*1fd5a2e1SPrashanth Swaminathan lds.l @r15+,pr 484*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r14 485*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r12 486*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r10 487*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r9 488*1fd5a2e1SPrashanth Swaminathan rts 489*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r8 490*1fd5a2e1SPrashanth Swaminathan#endif 491*1fd5a2e1SPrashanth Swaminathan.LFE1: 492*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end: 493*1fd5a2e1SPrashanth Swaminathan .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) 494*1fd5a2e1SPrashanth Swaminathan 495*1fd5a2e1SPrashanth Swaminathan.globl ffi_closure_helper_SYSV 496*1fd5a2e1SPrashanth Swaminathan 497*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV) 498*1fd5a2e1SPrashanth Swaminathan.LFB2: 499*1fd5a2e1SPrashanth Swaminathan mov.l r7,@-r15 500*1fd5a2e1SPrashanth Swaminathan.LCFI7: 501*1fd5a2e1SPrashanth Swaminathan mov.l r6,@-r15 502*1fd5a2e1SPrashanth Swaminathan.LCFI8: 503*1fd5a2e1SPrashanth Swaminathan mov.l r5,@-r15 504*1fd5a2e1SPrashanth Swaminathan.LCFI9: 505*1fd5a2e1SPrashanth Swaminathan mov.l r4,@-r15 506*1fd5a2e1SPrashanth Swaminathan.LCFIA: 507*1fd5a2e1SPrashanth Swaminathan mov.l r14,@-r15 508*1fd5a2e1SPrashanth Swaminathan.LCFIB: 509*1fd5a2e1SPrashanth Swaminathan sts.l pr,@-r15 510*1fd5a2e1SPrashanth Swaminathan 511*1fd5a2e1SPrashanth Swaminathan /* Stack layout: 512*1fd5a2e1SPrashanth Swaminathan xx bytes (on stack parameters) 513*1fd5a2e1SPrashanth Swaminathan 16 bytes (register parameters) 514*1fd5a2e1SPrashanth Swaminathan 4 bytes (saved frame pointer) 515*1fd5a2e1SPrashanth Swaminathan 4 bytes (saved return address) 516*1fd5a2e1SPrashanth Swaminathan 32 bytes (floating register parameters, SH-4 only) 517*1fd5a2e1SPrashanth Swaminathan 8 bytes (result) 518*1fd5a2e1SPrashanth Swaminathan 4 bytes (pad) 519*1fd5a2e1SPrashanth Swaminathan 4 bytes (5th arg) 520*1fd5a2e1SPrashanth Swaminathan <- new stack pointer 521*1fd5a2e1SPrashanth Swaminathan */ 522*1fd5a2e1SPrashanth Swaminathan.LCFIC: 523*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 524*1fd5a2e1SPrashanth Swaminathan add #-48,r15 525*1fd5a2e1SPrashanth Swaminathan#else 526*1fd5a2e1SPrashanth Swaminathan add #-16,r15 527*1fd5a2e1SPrashanth Swaminathan#endif 528*1fd5a2e1SPrashanth Swaminathan.LCFID: 529*1fd5a2e1SPrashanth Swaminathan mov r15,r14 530*1fd5a2e1SPrashanth Swaminathan.LCFIE: 531*1fd5a2e1SPrashanth Swaminathan 532*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 533*1fd5a2e1SPrashanth Swaminathan mov r14,r1 534*1fd5a2e1SPrashanth Swaminathan add #48,r1 535*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 536*1fd5a2e1SPrashanth Swaminathan fmov.s fr10,@-r1 537*1fd5a2e1SPrashanth Swaminathan fmov.s fr11,@-r1 538*1fd5a2e1SPrashanth Swaminathan fmov.s fr8,@-r1 539*1fd5a2e1SPrashanth Swaminathan fmov.s fr9,@-r1 540*1fd5a2e1SPrashanth Swaminathan fmov.s fr6,@-r1 541*1fd5a2e1SPrashanth Swaminathan fmov.s fr7,@-r1 542*1fd5a2e1SPrashanth Swaminathan fmov.s fr4,@-r1 543*1fd5a2e1SPrashanth Swaminathan fmov.s fr5,@-r1 544*1fd5a2e1SPrashanth Swaminathan#else 545*1fd5a2e1SPrashanth Swaminathan fmov.s fr11,@-r1 546*1fd5a2e1SPrashanth Swaminathan fmov.s fr10,@-r1 547*1fd5a2e1SPrashanth Swaminathan fmov.s fr9,@-r1 548*1fd5a2e1SPrashanth Swaminathan fmov.s fr8,@-r1 549*1fd5a2e1SPrashanth Swaminathan fmov.s fr7,@-r1 550*1fd5a2e1SPrashanth Swaminathan fmov.s fr6,@-r1 551*1fd5a2e1SPrashanth Swaminathan fmov.s fr5,@-r1 552*1fd5a2e1SPrashanth Swaminathan fmov.s fr4,@-r1 553*1fd5a2e1SPrashanth Swaminathan#endif 554*1fd5a2e1SPrashanth Swaminathan mov r1,r7 555*1fd5a2e1SPrashanth Swaminathan mov r14,r6 556*1fd5a2e1SPrashanth Swaminathan add #56,r6 557*1fd5a2e1SPrashanth Swaminathan#else 558*1fd5a2e1SPrashanth Swaminathan mov r14,r6 559*1fd5a2e1SPrashanth Swaminathan add #24,r6 560*1fd5a2e1SPrashanth Swaminathan#endif 561*1fd5a2e1SPrashanth Swaminathan 562*1fd5a2e1SPrashanth Swaminathan bt/s 10f 563*1fd5a2e1SPrashanth Swaminathan mov r2, r5 564*1fd5a2e1SPrashanth Swaminathan mov r14,r1 565*1fd5a2e1SPrashanth Swaminathan add #8,r1 566*1fd5a2e1SPrashanth Swaminathan mov r1,r5 567*1fd5a2e1SPrashanth Swaminathan10: 568*1fd5a2e1SPrashanth Swaminathan 569*1fd5a2e1SPrashanth Swaminathan mov r14,r1 570*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 571*1fd5a2e1SPrashanth Swaminathan add #72,r1 572*1fd5a2e1SPrashanth Swaminathan#else 573*1fd5a2e1SPrashanth Swaminathan add #40,r1 574*1fd5a2e1SPrashanth Swaminathan#endif 575*1fd5a2e1SPrashanth Swaminathan mov.l r1,@r14 576*1fd5a2e1SPrashanth Swaminathan 577*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 578*1fd5a2e1SPrashanth Swaminathan mov.l L_got,r1 579*1fd5a2e1SPrashanth Swaminathan mova L_got,r0 580*1fd5a2e1SPrashanth Swaminathan add r0,r1 581*1fd5a2e1SPrashanth Swaminathan mov.l L_helper,r0 582*1fd5a2e1SPrashanth Swaminathan add r1,r0 583*1fd5a2e1SPrashanth Swaminathan#else 584*1fd5a2e1SPrashanth Swaminathan mov.l L_helper,r0 585*1fd5a2e1SPrashanth Swaminathan#endif 586*1fd5a2e1SPrashanth Swaminathan jsr @r0 587*1fd5a2e1SPrashanth Swaminathan mov r3,r4 588*1fd5a2e1SPrashanth Swaminathan 589*1fd5a2e1SPrashanth Swaminathan shll r0 590*1fd5a2e1SPrashanth Swaminathan mov r0,r1 591*1fd5a2e1SPrashanth Swaminathan mova L_table,r0 592*1fd5a2e1SPrashanth Swaminathan add r1,r0 593*1fd5a2e1SPrashanth Swaminathan mov.w @r0,r0 594*1fd5a2e1SPrashanth Swaminathan mov r14,r2 595*1fd5a2e1SPrashanth Swaminathan braf r0 596*1fd5a2e1SPrashanth Swaminathan add #8,r2 597*1fd5a2e1SPrashanth Swaminathan0: 598*1fd5a2e1SPrashanth Swaminathan .align 2 599*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 600*1fd5a2e1SPrashanth SwaminathanL_got: 601*1fd5a2e1SPrashanth Swaminathan .long _GLOBAL_OFFSET_TABLE_ 602*1fd5a2e1SPrashanth SwaminathanL_helper: 603*1fd5a2e1SPrashanth Swaminathan .long ffi_closure_helper_SYSV@GOTOFF 604*1fd5a2e1SPrashanth Swaminathan#else 605*1fd5a2e1SPrashanth SwaminathanL_helper: 606*1fd5a2e1SPrashanth Swaminathan .long ffi_closure_helper_SYSV 607*1fd5a2e1SPrashanth Swaminathan#endif 608*1fd5a2e1SPrashanth SwaminathanL_table: 609*1fd5a2e1SPrashanth Swaminathan .short L_case_v - 0b /* FFI_TYPE_VOID */ 610*1fd5a2e1SPrashanth Swaminathan .short L_case_i - 0b /* FFI_TYPE_INT */ 611*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 612*1fd5a2e1SPrashanth Swaminathan .short L_case_f - 0b /* FFI_TYPE_FLOAT */ 613*1fd5a2e1SPrashanth Swaminathan .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ 614*1fd5a2e1SPrashanth Swaminathan .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ 615*1fd5a2e1SPrashanth Swaminathan#else 616*1fd5a2e1SPrashanth Swaminathan .short L_case_i - 0b /* FFI_TYPE_FLOAT */ 617*1fd5a2e1SPrashanth Swaminathan .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ 618*1fd5a2e1SPrashanth Swaminathan .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ 619*1fd5a2e1SPrashanth Swaminathan#endif 620*1fd5a2e1SPrashanth Swaminathan .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ 621*1fd5a2e1SPrashanth Swaminathan .short L_case_q - 0b /* FFI_TYPE_SINT8 */ 622*1fd5a2e1SPrashanth Swaminathan .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ 623*1fd5a2e1SPrashanth Swaminathan .short L_case_h - 0b /* FFI_TYPE_SINT16 */ 624*1fd5a2e1SPrashanth Swaminathan .short L_case_i - 0b /* FFI_TYPE_UINT32 */ 625*1fd5a2e1SPrashanth Swaminathan .short L_case_i - 0b /* FFI_TYPE_SINT32 */ 626*1fd5a2e1SPrashanth Swaminathan .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ 627*1fd5a2e1SPrashanth Swaminathan .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ 628*1fd5a2e1SPrashanth Swaminathan .short L_case_v - 0b /* FFI_TYPE_STRUCT */ 629*1fd5a2e1SPrashanth Swaminathan .short L_case_i - 0b /* FFI_TYPE_POINTER */ 630*1fd5a2e1SPrashanth Swaminathan 631*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 632*1fd5a2e1SPrashanth SwaminathanL_case_d: 633*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 634*1fd5a2e1SPrashanth Swaminathan fmov.s @r2+,fr1 635*1fd5a2e1SPrashanth Swaminathan bra L_case_v 636*1fd5a2e1SPrashanth Swaminathan fmov.s @r2,fr0 637*1fd5a2e1SPrashanth Swaminathan#else 638*1fd5a2e1SPrashanth Swaminathan fmov.s @r2+,fr0 639*1fd5a2e1SPrashanth Swaminathan bra L_case_v 640*1fd5a2e1SPrashanth Swaminathan fmov.s @r2,fr1 641*1fd5a2e1SPrashanth Swaminathan#endif 642*1fd5a2e1SPrashanth Swaminathan 643*1fd5a2e1SPrashanth SwaminathanL_case_f: 644*1fd5a2e1SPrashanth Swaminathan bra L_case_v 645*1fd5a2e1SPrashanth Swaminathan fmov.s @r2,fr0 646*1fd5a2e1SPrashanth Swaminathan#endif 647*1fd5a2e1SPrashanth Swaminathan 648*1fd5a2e1SPrashanth SwaminathanL_case_ll: 649*1fd5a2e1SPrashanth Swaminathan mov.l @r2+,r0 650*1fd5a2e1SPrashanth Swaminathan bra L_case_v 651*1fd5a2e1SPrashanth Swaminathan mov.l @r2,r1 652*1fd5a2e1SPrashanth Swaminathan 653*1fd5a2e1SPrashanth SwaminathanL_case_i: 654*1fd5a2e1SPrashanth Swaminathan bra L_case_v 655*1fd5a2e1SPrashanth Swaminathan mov.l @r2,r0 656*1fd5a2e1SPrashanth Swaminathan 657*1fd5a2e1SPrashanth SwaminathanL_case_q: 658*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 659*1fd5a2e1SPrashanth Swaminathan#else 660*1fd5a2e1SPrashanth Swaminathan add #3,r2 661*1fd5a2e1SPrashanth Swaminathan#endif 662*1fd5a2e1SPrashanth Swaminathan bra L_case_v 663*1fd5a2e1SPrashanth Swaminathan mov.b @r2,r0 664*1fd5a2e1SPrashanth Swaminathan 665*1fd5a2e1SPrashanth SwaminathanL_case_uq: 666*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 667*1fd5a2e1SPrashanth Swaminathan#else 668*1fd5a2e1SPrashanth Swaminathan add #3,r2 669*1fd5a2e1SPrashanth Swaminathan#endif 670*1fd5a2e1SPrashanth Swaminathan mov.b @r2,r0 671*1fd5a2e1SPrashanth Swaminathan bra L_case_v 672*1fd5a2e1SPrashanth Swaminathan extu.b r0,r0 673*1fd5a2e1SPrashanth Swaminathan 674*1fd5a2e1SPrashanth SwaminathanL_case_h: 675*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 676*1fd5a2e1SPrashanth Swaminathan#else 677*1fd5a2e1SPrashanth Swaminathan add #2,r2 678*1fd5a2e1SPrashanth Swaminathan#endif 679*1fd5a2e1SPrashanth Swaminathan bra L_case_v 680*1fd5a2e1SPrashanth Swaminathan mov.w @r2,r0 681*1fd5a2e1SPrashanth Swaminathan 682*1fd5a2e1SPrashanth SwaminathanL_case_uh: 683*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 684*1fd5a2e1SPrashanth Swaminathan#else 685*1fd5a2e1SPrashanth Swaminathan add #2,r2 686*1fd5a2e1SPrashanth Swaminathan#endif 687*1fd5a2e1SPrashanth Swaminathan mov.w @r2,r0 688*1fd5a2e1SPrashanth Swaminathan extu.w r0,r0 689*1fd5a2e1SPrashanth Swaminathan /* fall through */ 690*1fd5a2e1SPrashanth Swaminathan 691*1fd5a2e1SPrashanth SwaminathanL_case_v: 692*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 693*1fd5a2e1SPrashanth Swaminathan add #48,r15 694*1fd5a2e1SPrashanth Swaminathan#else 695*1fd5a2e1SPrashanth Swaminathan add #16,r15 696*1fd5a2e1SPrashanth Swaminathan#endif 697*1fd5a2e1SPrashanth Swaminathan lds.l @r15+,pr 698*1fd5a2e1SPrashanth Swaminathan mov.l @r15+,r14 699*1fd5a2e1SPrashanth Swaminathan rts 700*1fd5a2e1SPrashanth Swaminathan add #16,r15 701*1fd5a2e1SPrashanth Swaminathan.LFE2: 702*1fd5a2e1SPrashanth Swaminathan.ffi_closure_SYSV_end: 703*1fd5a2e1SPrashanth Swaminathan .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) 704*1fd5a2e1SPrashanth Swaminathan 705*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 706*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 707*1fd5a2e1SPrashanth Swaminathan#endif 708*1fd5a2e1SPrashanth Swaminathan 709*1fd5a2e1SPrashanth Swaminathan .section ".eh_frame","aw",@progbits 710*1fd5a2e1SPrashanth Swaminathan__FRAME_BEGIN__: 711*1fd5a2e1SPrashanth Swaminathan .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ 712*1fd5a2e1SPrashanth Swaminathan.LSCIE1: 713*1fd5a2e1SPrashanth Swaminathan .4byte 0x0 /* CIE Identifier Tag */ 714*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* CIE Version */ 715*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 716*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" /* CIE Augmentation */ 717*1fd5a2e1SPrashanth Swaminathan#else 718*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* CIE Augmentation */ 719*1fd5a2e1SPrashanth Swaminathan#endif 720*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ 721*1fd5a2e1SPrashanth Swaminathan .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ 722*1fd5a2e1SPrashanth Swaminathan .byte 0x11 /* CIE RA Column */ 723*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 724*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 /* Augmentation size */ 725*1fd5a2e1SPrashanth Swaminathan .byte 0x10 /* FDE Encoding (pcrel) */ 726*1fd5a2e1SPrashanth Swaminathan#endif 727*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* DW_CFA_def_cfa */ 728*1fd5a2e1SPrashanth Swaminathan .byte 0xf /* uleb128 0xf */ 729*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* uleb128 0x0 */ 730*1fd5a2e1SPrashanth Swaminathan .align 2 731*1fd5a2e1SPrashanth Swaminathan.LECIE1: 732*1fd5a2e1SPrashanth Swaminathan.LSFDE1: 733*1fd5a2e1SPrashanth Swaminathan .4byte .LEFDE1-.LASFDE1 /* FDE Length */ 734*1fd5a2e1SPrashanth Swaminathan.LASFDE1: 735*1fd5a2e1SPrashanth Swaminathan .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ 736*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 737*1fd5a2e1SPrashanth Swaminathan .4byte .LFB1-. /* FDE initial location */ 738*1fd5a2e1SPrashanth Swaminathan#else 739*1fd5a2e1SPrashanth Swaminathan .4byte .LFB1 /* FDE initial location */ 740*1fd5a2e1SPrashanth Swaminathan#endif 741*1fd5a2e1SPrashanth Swaminathan .4byte .LFE1-.LFB1 /* FDE address range */ 742*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 743*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 /* Augmentation size */ 744*1fd5a2e1SPrashanth Swaminathan#endif 745*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 746*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI0-.LFB1 747*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 748*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4 */ 749*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 750*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI1-.LCFI0 751*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 752*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* uleb128 0x4 */ 753*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 754*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI2-.LCFI1 755*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 756*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* uleb128 0x4 */ 757*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 758*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI3-.LCFI2 759*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 760*1fd5a2e1SPrashanth Swaminathan .byte 0x10 /* uleb128 0x4 */ 761*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 762*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI4-.LCFI3 763*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 764*1fd5a2e1SPrashanth Swaminathan .byte 0x14 /* uleb128 0x4 */ 765*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 766*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI5-.LCFI4 767*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 768*1fd5a2e1SPrashanth Swaminathan .byte 0x18 /* uleb128 0x4 */ 769*1fd5a2e1SPrashanth Swaminathan .byte 0x91 /* DW_CFA_offset, column 0x11 */ 770*1fd5a2e1SPrashanth Swaminathan .byte 0x6 /* uleb128 0x6 */ 771*1fd5a2e1SPrashanth Swaminathan .byte 0x8e /* DW_CFA_offset, column 0xe */ 772*1fd5a2e1SPrashanth Swaminathan .byte 0x5 /* uleb128 0x5 */ 773*1fd5a2e1SPrashanth Swaminathan .byte 0x8c /* DW_CFA_offset, column 0xc */ 774*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4 */ 775*1fd5a2e1SPrashanth Swaminathan .byte 0x8a /* DW_CFA_offset, column 0xa */ 776*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* uleb128 0x3 */ 777*1fd5a2e1SPrashanth Swaminathan .byte 0x89 /* DW_CFA_offset, column 0x9 */ 778*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* uleb128 0x2 */ 779*1fd5a2e1SPrashanth Swaminathan .byte 0x88 /* DW_CFA_offset, column 0x8 */ 780*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1 */ 781*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 782*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI6-.LCFI5 783*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 784*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* uleb128 0xe */ 785*1fd5a2e1SPrashanth Swaminathan .align 2 786*1fd5a2e1SPrashanth Swaminathan.LEFDE1: 787*1fd5a2e1SPrashanth Swaminathan 788*1fd5a2e1SPrashanth Swaminathan.LSFDE3: 789*1fd5a2e1SPrashanth Swaminathan .4byte .LEFDE3-.LASFDE3 /* FDE Length */ 790*1fd5a2e1SPrashanth Swaminathan.LASFDE3: 791*1fd5a2e1SPrashanth Swaminathan .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ 792*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 793*1fd5a2e1SPrashanth Swaminathan .4byte .LFB2-. /* FDE initial location */ 794*1fd5a2e1SPrashanth Swaminathan#else 795*1fd5a2e1SPrashanth Swaminathan .4byte .LFB2 /* FDE initial location */ 796*1fd5a2e1SPrashanth Swaminathan#endif 797*1fd5a2e1SPrashanth Swaminathan .4byte .LFE2-.LFB2 /* FDE address range */ 798*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 799*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 /* Augmentation size */ 800*1fd5a2e1SPrashanth Swaminathan#endif 801*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 802*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI7-.LFB2 803*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 804*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4 */ 805*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 806*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI8-.LCFI7 807*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 808*1fd5a2e1SPrashanth Swaminathan .byte 0x8 /* uleb128 0x4 */ 809*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 810*1fd5a2e1SPrashanth Swaminathan .4byte .LCFI9-.LCFI8 811*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 812*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* uleb128 0x4 */ 813*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 814*1fd5a2e1SPrashanth Swaminathan .4byte .LCFIA-.LCFI9 815*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 816*1fd5a2e1SPrashanth Swaminathan .byte 0x10 /* uleb128 0x4 */ 817*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 818*1fd5a2e1SPrashanth Swaminathan .4byte .LCFIB-.LCFIA 819*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 820*1fd5a2e1SPrashanth Swaminathan .byte 0x14 /* uleb128 0x4 */ 821*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 822*1fd5a2e1SPrashanth Swaminathan .4byte .LCFIC-.LCFIB 823*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 824*1fd5a2e1SPrashanth Swaminathan .byte 0x18 /* uleb128 0x4 */ 825*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 826*1fd5a2e1SPrashanth Swaminathan .4byte .LCFID-.LCFIC 827*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 828*1fd5a2e1SPrashanth Swaminathan#if defined(__SH4__) 829*1fd5a2e1SPrashanth Swaminathan .byte 24+48 /* uleb128 24+48 */ 830*1fd5a2e1SPrashanth Swaminathan#else 831*1fd5a2e1SPrashanth Swaminathan .byte 24+16 /* uleb128 24+16 */ 832*1fd5a2e1SPrashanth Swaminathan#endif 833*1fd5a2e1SPrashanth Swaminathan .byte 0x91 /* DW_CFA_offset, column 0x11 */ 834*1fd5a2e1SPrashanth Swaminathan .byte 0x6 /* uleb128 0x6 */ 835*1fd5a2e1SPrashanth Swaminathan .byte 0x8e /* DW_CFA_offset, column 0xe */ 836*1fd5a2e1SPrashanth Swaminathan .byte 0x5 /* uleb128 0x5 */ 837*1fd5a2e1SPrashanth Swaminathan .byte 0x84 /* DW_CFA_offset, column 0x4 */ 838*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4 */ 839*1fd5a2e1SPrashanth Swaminathan .byte 0x85 /* DW_CFA_offset, column 0x5 */ 840*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* uleb128 0x3 */ 841*1fd5a2e1SPrashanth Swaminathan .byte 0x86 /* DW_CFA_offset, column 0x6 */ 842*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* uleb128 0x2 */ 843*1fd5a2e1SPrashanth Swaminathan .byte 0x87 /* DW_CFA_offset, column 0x7 */ 844*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1 */ 845*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 846*1fd5a2e1SPrashanth Swaminathan .4byte .LCFIE-.LCFID 847*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 848*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* uleb128 0xe */ 849*1fd5a2e1SPrashanth Swaminathan .align 2 850*1fd5a2e1SPrashanth Swaminathan.LEFDE3: 851