1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan SuperH SHmedia 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 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#define LIBFFI_ASM 29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 31*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_MACHINE_ASM_H 32*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h> 33*1fd5a2e1SPrashanth Swaminathan#else 34*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure. */ 35*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x 36*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): 37*1fd5a2e1SPrashanth Swaminathan#endif 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 40*1fd5a2e1SPrashanth Swaminathan#define OFS_FLT 0 41*1fd5a2e1SPrashanth Swaminathan#else 42*1fd5a2e1SPrashanth Swaminathan#define OFS_FLT 4 43*1fd5a2e1SPrashanth Swaminathan#endif 44*1fd5a2e1SPrashanth Swaminathan 45*1fd5a2e1SPrashanth Swaminathan .section .text..SHmedia32,"ax" 46*1fd5a2e1SPrashanth Swaminathan 47*1fd5a2e1SPrashanth Swaminathan # r2: ffi_prep_args 48*1fd5a2e1SPrashanth Swaminathan # r3: &ecif 49*1fd5a2e1SPrashanth Swaminathan # r4: bytes 50*1fd5a2e1SPrashanth Swaminathan # r5: flags 51*1fd5a2e1SPrashanth Swaminathan # r6: flags2 52*1fd5a2e1SPrashanth Swaminathan # r7: rvalue 53*1fd5a2e1SPrashanth Swaminathan # r8: fn 54*1fd5a2e1SPrashanth Swaminathan 55*1fd5a2e1SPrashanth Swaminathan # This assumes we are using gas. 56*1fd5a2e1SPrashanth Swaminathan .align 5 57*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV) 58*1fd5a2e1SPrashanth Swaminathan # Save registers 59*1fd5a2e1SPrashanth Swaminathan.LFB1: 60*1fd5a2e1SPrashanth Swaminathan addi.l r15, -48, r15 61*1fd5a2e1SPrashanth Swaminathan.LCFI0: 62*1fd5a2e1SPrashanth Swaminathan st.q r15, 40, r32 63*1fd5a2e1SPrashanth Swaminathan st.q r15, 32, r31 64*1fd5a2e1SPrashanth Swaminathan st.q r15, 24, r30 65*1fd5a2e1SPrashanth Swaminathan st.q r15, 16, r29 66*1fd5a2e1SPrashanth Swaminathan st.q r15, 8, r28 67*1fd5a2e1SPrashanth Swaminathan st.l r15, 4, r18 68*1fd5a2e1SPrashanth Swaminathan st.l r15, 0, r14 69*1fd5a2e1SPrashanth Swaminathan.LCFI1: 70*1fd5a2e1SPrashanth Swaminathan add.l r15, r63, r14 71*1fd5a2e1SPrashanth Swaminathan.LCFI2: 72*1fd5a2e1SPrashanth Swaminathan# add r4, r63, r28 73*1fd5a2e1SPrashanth Swaminathan add r5, r63, r29 74*1fd5a2e1SPrashanth Swaminathan add r6, r63, r30 75*1fd5a2e1SPrashanth Swaminathan add r7, r63, r31 76*1fd5a2e1SPrashanth Swaminathan add r8, r63, r32 77*1fd5a2e1SPrashanth Swaminathan 78*1fd5a2e1SPrashanth Swaminathan addi r4, (64 + 7), r4 79*1fd5a2e1SPrashanth Swaminathan andi r4, ~7, r4 80*1fd5a2e1SPrashanth Swaminathan sub.l r15, r4, r15 81*1fd5a2e1SPrashanth Swaminathan 82*1fd5a2e1SPrashanth Swaminathan ptabs/l r2, tr0 83*1fd5a2e1SPrashanth Swaminathan add r15, r63, r2 84*1fd5a2e1SPrashanth Swaminathan blink tr0, r18 85*1fd5a2e1SPrashanth Swaminathan 86*1fd5a2e1SPrashanth Swaminathan addi r15, 64, r22 87*1fd5a2e1SPrashanth Swaminathan movi 0, r0 88*1fd5a2e1SPrashanth Swaminathan movi 0, r1 89*1fd5a2e1SPrashanth Swaminathan movi -1, r23 90*1fd5a2e1SPrashanth Swaminathan 91*1fd5a2e1SPrashanth Swaminathan pt/l 1f, tr1 92*1fd5a2e1SPrashanth Swaminathan bnei/l r29, FFI_TYPE_STRUCT, tr1 93*1fd5a2e1SPrashanth Swaminathan ld.l r15, 0, r19 94*1fd5a2e1SPrashanth Swaminathan addi r15, 8, r15 95*1fd5a2e1SPrashanth Swaminathan addi r0, 1, r0 96*1fd5a2e1SPrashanth Swaminathan1: 97*1fd5a2e1SPrashanth Swaminathan 98*1fd5a2e1SPrashanth Swaminathan.L_pass: 99*1fd5a2e1SPrashanth Swaminathan andi r30, 3, r20 100*1fd5a2e1SPrashanth Swaminathan shlri r30, 2, r30 101*1fd5a2e1SPrashanth Swaminathan 102*1fd5a2e1SPrashanth Swaminathan pt/l .L_call_it, tr0 103*1fd5a2e1SPrashanth Swaminathan pt/l .L_pass_i, tr1 104*1fd5a2e1SPrashanth Swaminathan pt/l .L_pass_f, tr2 105*1fd5a2e1SPrashanth Swaminathan 106*1fd5a2e1SPrashanth Swaminathan beqi/l r20, FFI_TYPE_VOID, tr0 107*1fd5a2e1SPrashanth Swaminathan beqi/l r20, FFI_TYPE_INT, tr1 108*1fd5a2e1SPrashanth Swaminathan beqi/l r20, FFI_TYPE_FLOAT, tr2 109*1fd5a2e1SPrashanth Swaminathan 110*1fd5a2e1SPrashanth Swaminathan.L_pass_d: 111*1fd5a2e1SPrashanth Swaminathan addi r0, 1, r0 112*1fd5a2e1SPrashanth Swaminathan pt/l 3f, tr0 113*1fd5a2e1SPrashanth Swaminathan movi 12, r20 114*1fd5a2e1SPrashanth Swaminathan bge/l r1, r20, tr0 115*1fd5a2e1SPrashanth Swaminathan 116*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_d, tr1 117*1fd5a2e1SPrashanth Swaminathan pt/l 2f, tr0 118*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 119*1fd5a2e1SPrashanth Swaminathan2: 120*1fd5a2e1SPrashanth Swaminathan addi.l r15, 8, r15 121*1fd5a2e1SPrashanth Swaminathan3: 122*1fd5a2e1SPrashanth Swaminathan pt/l .L_pass, tr0 123*1fd5a2e1SPrashanth Swaminathan addi r1, 2, r1 124*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 125*1fd5a2e1SPrashanth Swaminathan 126*1fd5a2e1SPrashanth Swaminathan.L_pop_d: 127*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_d_tbl, tr1 128*1fd5a2e1SPrashanth Swaminathan gettr tr1, r20 129*1fd5a2e1SPrashanth Swaminathan shlli r1, 2, r21 130*1fd5a2e1SPrashanth Swaminathan add r20, r21, r20 131*1fd5a2e1SPrashanth Swaminathan ptabs/l r20, tr1 132*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 133*1fd5a2e1SPrashanth Swaminathan 134*1fd5a2e1SPrashanth Swaminathan.L_pop_d_tbl: 135*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr0 136*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 137*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr2 138*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 139*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr4 140*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 141*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr6 142*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 143*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr8 144*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 145*1fd5a2e1SPrashanth Swaminathan fld.d r15, 0, dr10 146*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 147*1fd5a2e1SPrashanth Swaminathan 148*1fd5a2e1SPrashanth Swaminathan.L_pass_f: 149*1fd5a2e1SPrashanth Swaminathan addi r0, 1, r0 150*1fd5a2e1SPrashanth Swaminathan pt/l 3f, tr0 151*1fd5a2e1SPrashanth Swaminathan movi 12, r20 152*1fd5a2e1SPrashanth Swaminathan bge/l r1, r20, tr0 153*1fd5a2e1SPrashanth Swaminathan 154*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_f, tr1 155*1fd5a2e1SPrashanth Swaminathan pt/l 2f, tr0 156*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 157*1fd5a2e1SPrashanth Swaminathan2: 158*1fd5a2e1SPrashanth Swaminathan addi.l r15, 8, r15 159*1fd5a2e1SPrashanth Swaminathan3: 160*1fd5a2e1SPrashanth Swaminathan pt/l .L_pass, tr0 161*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 162*1fd5a2e1SPrashanth Swaminathan 163*1fd5a2e1SPrashanth Swaminathan.L_pop_f: 164*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_f_tbl, tr1 165*1fd5a2e1SPrashanth Swaminathan pt/l 5f, tr2 166*1fd5a2e1SPrashanth Swaminathan gettr tr1, r20 167*1fd5a2e1SPrashanth Swaminathan bge/l r23, r63, tr2 168*1fd5a2e1SPrashanth Swaminathan add r1, r63, r23 169*1fd5a2e1SPrashanth Swaminathan shlli r1, 3, r21 170*1fd5a2e1SPrashanth Swaminathan addi r1, 2, r1 171*1fd5a2e1SPrashanth Swaminathan add r20, r21, r20 172*1fd5a2e1SPrashanth Swaminathan ptabs/l r20, tr1 173*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 174*1fd5a2e1SPrashanth Swaminathan5: 175*1fd5a2e1SPrashanth Swaminathan addi r23, 1, r21 176*1fd5a2e1SPrashanth Swaminathan movi -1, r23 177*1fd5a2e1SPrashanth Swaminathan shlli r21, 3, r21 178*1fd5a2e1SPrashanth Swaminathan add r20, r21, r20 179*1fd5a2e1SPrashanth Swaminathan ptabs/l r20, tr1 180*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 181*1fd5a2e1SPrashanth Swaminathan 182*1fd5a2e1SPrashanth Swaminathan.L_pop_f_tbl: 183*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr0 184*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 185*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr1 186*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 187*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr2 188*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 189*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr3 190*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 191*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr4 192*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 193*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr5 194*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 195*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr6 196*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 197*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr7 198*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 199*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr8 200*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 201*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr9 202*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 203*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr10 204*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 205*1fd5a2e1SPrashanth Swaminathan fld.s r15, OFS_FLT, fr11 206*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 207*1fd5a2e1SPrashanth Swaminathan 208*1fd5a2e1SPrashanth Swaminathan.L_pass_i: 209*1fd5a2e1SPrashanth Swaminathan pt/l 3f, tr0 210*1fd5a2e1SPrashanth Swaminathan movi 8, r20 211*1fd5a2e1SPrashanth Swaminathan bge/l r0, r20, tr0 212*1fd5a2e1SPrashanth Swaminathan 213*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_i, tr1 214*1fd5a2e1SPrashanth Swaminathan pt/l 2f, tr0 215*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 216*1fd5a2e1SPrashanth Swaminathan2: 217*1fd5a2e1SPrashanth Swaminathan addi.l r15, 8, r15 218*1fd5a2e1SPrashanth Swaminathan3: 219*1fd5a2e1SPrashanth Swaminathan pt/l .L_pass, tr0 220*1fd5a2e1SPrashanth Swaminathan addi r0, 1, r0 221*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 222*1fd5a2e1SPrashanth Swaminathan 223*1fd5a2e1SPrashanth Swaminathan.L_pop_i: 224*1fd5a2e1SPrashanth Swaminathan pt/l .L_pop_i_tbl, tr1 225*1fd5a2e1SPrashanth Swaminathan gettr tr1, r20 226*1fd5a2e1SPrashanth Swaminathan shlli r0, 3, r21 227*1fd5a2e1SPrashanth Swaminathan add r20, r21, r20 228*1fd5a2e1SPrashanth Swaminathan ptabs/l r20, tr1 229*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 230*1fd5a2e1SPrashanth Swaminathan 231*1fd5a2e1SPrashanth Swaminathan.L_pop_i_tbl: 232*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r2 233*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 234*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r3 235*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 236*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r4 237*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 238*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r5 239*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 240*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r6 241*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 242*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r7 243*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 244*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r8 245*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 246*1fd5a2e1SPrashanth Swaminathan ld.q r15, 0, r9 247*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 248*1fd5a2e1SPrashanth Swaminathan 249*1fd5a2e1SPrashanth Swaminathan.L_call_it: 250*1fd5a2e1SPrashanth Swaminathan # call function 251*1fd5a2e1SPrashanth Swaminathan pt/l 1f, tr1 252*1fd5a2e1SPrashanth Swaminathan bnei/l r29, FFI_TYPE_STRUCT, tr1 253*1fd5a2e1SPrashanth Swaminathan add r19, r63, r2 254*1fd5a2e1SPrashanth Swaminathan1: 255*1fd5a2e1SPrashanth Swaminathan add r22, r63, r15 256*1fd5a2e1SPrashanth Swaminathan ptabs/l r32, tr0 257*1fd5a2e1SPrashanth Swaminathan blink tr0, r18 258*1fd5a2e1SPrashanth Swaminathan 259*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_i, tr0 260*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_ll, tr1 261*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_d, tr2 262*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_f, tr3 263*1fd5a2e1SPrashanth Swaminathan pt/l .L_epilogue, tr4 264*1fd5a2e1SPrashanth Swaminathan 265*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_INT, tr0 266*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_UINT32, tr0 267*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_SINT64, tr1 268*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_UINT64, tr1 269*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_DOUBLE, tr2 270*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_FLOAT, tr3 271*1fd5a2e1SPrashanth Swaminathan 272*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_q, tr0 273*1fd5a2e1SPrashanth Swaminathan pt/l .L_ret_h, tr1 274*1fd5a2e1SPrashanth Swaminathan 275*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_UINT8, tr0 276*1fd5a2e1SPrashanth Swaminathan beqi/l r29, FFI_TYPE_UINT16, tr1 277*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 278*1fd5a2e1SPrashanth Swaminathan 279*1fd5a2e1SPrashanth Swaminathan.L_ret_d: 280*1fd5a2e1SPrashanth Swaminathan fst.d r31, 0, dr0 281*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 282*1fd5a2e1SPrashanth Swaminathan 283*1fd5a2e1SPrashanth Swaminathan.L_ret_ll: 284*1fd5a2e1SPrashanth Swaminathan st.q r31, 0, r2 285*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 286*1fd5a2e1SPrashanth Swaminathan 287*1fd5a2e1SPrashanth Swaminathan.L_ret_f: 288*1fd5a2e1SPrashanth Swaminathan fst.s r31, OFS_FLT, fr0 289*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 290*1fd5a2e1SPrashanth Swaminathan 291*1fd5a2e1SPrashanth Swaminathan.L_ret_q: 292*1fd5a2e1SPrashanth Swaminathan st.b r31, 0, r2 293*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 294*1fd5a2e1SPrashanth Swaminathan 295*1fd5a2e1SPrashanth Swaminathan.L_ret_h: 296*1fd5a2e1SPrashanth Swaminathan st.w r31, 0, r2 297*1fd5a2e1SPrashanth Swaminathan blink tr4, r63 298*1fd5a2e1SPrashanth Swaminathan 299*1fd5a2e1SPrashanth Swaminathan.L_ret_i: 300*1fd5a2e1SPrashanth Swaminathan st.l r31, 0, r2 301*1fd5a2e1SPrashanth Swaminathan # Fall 302*1fd5a2e1SPrashanth Swaminathan 303*1fd5a2e1SPrashanth Swaminathan.L_epilogue: 304*1fd5a2e1SPrashanth Swaminathan # Remove the space we pushed for the args 305*1fd5a2e1SPrashanth Swaminathan add r14, r63, r15 306*1fd5a2e1SPrashanth Swaminathan 307*1fd5a2e1SPrashanth Swaminathan ld.l r15, 0, r14 308*1fd5a2e1SPrashanth Swaminathan ld.l r15, 4, r18 309*1fd5a2e1SPrashanth Swaminathan ld.q r15, 8, r28 310*1fd5a2e1SPrashanth Swaminathan ld.q r15, 16, r29 311*1fd5a2e1SPrashanth Swaminathan ld.q r15, 24, r30 312*1fd5a2e1SPrashanth Swaminathan ld.q r15, 32, r31 313*1fd5a2e1SPrashanth Swaminathan ld.q r15, 40, r32 314*1fd5a2e1SPrashanth Swaminathan addi.l r15, 48, r15 315*1fd5a2e1SPrashanth Swaminathan ptabs r18, tr0 316*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 317*1fd5a2e1SPrashanth Swaminathan 318*1fd5a2e1SPrashanth Swaminathan.LFE1: 319*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end: 320*1fd5a2e1SPrashanth Swaminathan .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) 321*1fd5a2e1SPrashanth Swaminathan 322*1fd5a2e1SPrashanth Swaminathan .align 5 323*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV) 324*1fd5a2e1SPrashanth Swaminathan.LFB2: 325*1fd5a2e1SPrashanth Swaminathan addi.l r15, -136, r15 326*1fd5a2e1SPrashanth Swaminathan.LCFI3: 327*1fd5a2e1SPrashanth Swaminathan st.l r15, 12, r18 328*1fd5a2e1SPrashanth Swaminathan st.l r15, 8, r14 329*1fd5a2e1SPrashanth Swaminathan st.l r15, 4, r12 330*1fd5a2e1SPrashanth Swaminathan.LCFI4: 331*1fd5a2e1SPrashanth Swaminathan add r15, r63, r14 332*1fd5a2e1SPrashanth Swaminathan.LCFI5: 333*1fd5a2e1SPrashanth Swaminathan /* Stack layout: 334*1fd5a2e1SPrashanth Swaminathan ... 335*1fd5a2e1SPrashanth Swaminathan 64 bytes (register parameters) 336*1fd5a2e1SPrashanth Swaminathan 48 bytes (floating register parameters) 337*1fd5a2e1SPrashanth Swaminathan 8 bytes (result) 338*1fd5a2e1SPrashanth Swaminathan 4 bytes (r18) 339*1fd5a2e1SPrashanth Swaminathan 4 bytes (r14) 340*1fd5a2e1SPrashanth Swaminathan 4 bytes (r12) 341*1fd5a2e1SPrashanth Swaminathan 4 bytes (for align) 342*1fd5a2e1SPrashanth Swaminathan <- new stack pointer 343*1fd5a2e1SPrashanth Swaminathan */ 344*1fd5a2e1SPrashanth Swaminathan fst.d r14, 24, dr0 345*1fd5a2e1SPrashanth Swaminathan fst.d r14, 32, dr2 346*1fd5a2e1SPrashanth Swaminathan fst.d r14, 40, dr4 347*1fd5a2e1SPrashanth Swaminathan fst.d r14, 48, dr6 348*1fd5a2e1SPrashanth Swaminathan fst.d r14, 56, dr8 349*1fd5a2e1SPrashanth Swaminathan fst.d r14, 64, dr10 350*1fd5a2e1SPrashanth Swaminathan st.q r14, 72, r2 351*1fd5a2e1SPrashanth Swaminathan st.q r14, 80, r3 352*1fd5a2e1SPrashanth Swaminathan st.q r14, 88, r4 353*1fd5a2e1SPrashanth Swaminathan st.q r14, 96, r5 354*1fd5a2e1SPrashanth Swaminathan st.q r14, 104, r6 355*1fd5a2e1SPrashanth Swaminathan st.q r14, 112, r7 356*1fd5a2e1SPrashanth Swaminathan st.q r14, 120, r8 357*1fd5a2e1SPrashanth Swaminathan st.q r14, 128, r9 358*1fd5a2e1SPrashanth Swaminathan 359*1fd5a2e1SPrashanth Swaminathan add r1, r63, r2 360*1fd5a2e1SPrashanth Swaminathan addi r14, 16, r3 361*1fd5a2e1SPrashanth Swaminathan addi r14, 72, r4 362*1fd5a2e1SPrashanth Swaminathan addi r14, 24, r5 363*1fd5a2e1SPrashanth Swaminathan addi r14, 136, r6 364*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 365*1fd5a2e1SPrashanth Swaminathan movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 366*1fd5a2e1SPrashanth Swaminathan shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 367*1fd5a2e1SPrashanth Swaminathan.LPCS0: ptrel/u r12, tr0 368*1fd5a2e1SPrashanth Swaminathan movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 369*1fd5a2e1SPrashanth Swaminathan gettr tr0, r12 370*1fd5a2e1SPrashanth Swaminathan ldx.l r1, r12, r1 371*1fd5a2e1SPrashanth Swaminathan ptabs r1, tr0 372*1fd5a2e1SPrashanth Swaminathan#else 373*1fd5a2e1SPrashanth Swaminathan pt/l ffi_closure_helper_SYSV, tr0 374*1fd5a2e1SPrashanth Swaminathan#endif 375*1fd5a2e1SPrashanth Swaminathan blink tr0, r18 376*1fd5a2e1SPrashanth Swaminathan 377*1fd5a2e1SPrashanth Swaminathan shlli r2, 1, r1 378*1fd5a2e1SPrashanth Swaminathan movi (((datalabel .L_table) >> 16) & 65535), r2 379*1fd5a2e1SPrashanth Swaminathan shori ((datalabel .L_table) & 65535), r2 380*1fd5a2e1SPrashanth Swaminathan ldx.w r2, r1, r1 381*1fd5a2e1SPrashanth Swaminathan add r1, r2, r1 382*1fd5a2e1SPrashanth Swaminathan pt/l .L_case_v, tr1 383*1fd5a2e1SPrashanth Swaminathan ptabs r1, tr0 384*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 385*1fd5a2e1SPrashanth Swaminathan 386*1fd5a2e1SPrashanth Swaminathan .align 2 387*1fd5a2e1SPrashanth Swaminathan.L_table: 388*1fd5a2e1SPrashanth Swaminathan .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ 389*1fd5a2e1SPrashanth Swaminathan .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ 390*1fd5a2e1SPrashanth Swaminathan .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ 391*1fd5a2e1SPrashanth Swaminathan .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ 392*1fd5a2e1SPrashanth Swaminathan .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ 393*1fd5a2e1SPrashanth Swaminathan .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ 394*1fd5a2e1SPrashanth Swaminathan .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ 395*1fd5a2e1SPrashanth Swaminathan .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ 396*1fd5a2e1SPrashanth Swaminathan .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ 397*1fd5a2e1SPrashanth Swaminathan .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ 398*1fd5a2e1SPrashanth Swaminathan .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ 399*1fd5a2e1SPrashanth Swaminathan .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ 400*1fd5a2e1SPrashanth Swaminathan .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ 401*1fd5a2e1SPrashanth Swaminathan .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ 402*1fd5a2e1SPrashanth Swaminathan .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ 403*1fd5a2e1SPrashanth Swaminathan 404*1fd5a2e1SPrashanth Swaminathan .align 2 405*1fd5a2e1SPrashanth Swaminathan.L_case_d: 406*1fd5a2e1SPrashanth Swaminathan fld.d r14, 16, dr0 407*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 408*1fd5a2e1SPrashanth Swaminathan.L_case_f: 409*1fd5a2e1SPrashanth Swaminathan fld.s r14, 16, fr0 410*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 411*1fd5a2e1SPrashanth Swaminathan.L_case_ll: 412*1fd5a2e1SPrashanth Swaminathan ld.q r14, 16, r2 413*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 414*1fd5a2e1SPrashanth Swaminathan.L_case_i: 415*1fd5a2e1SPrashanth Swaminathan ld.l r14, 16, r2 416*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 417*1fd5a2e1SPrashanth Swaminathan.L_case_q: 418*1fd5a2e1SPrashanth Swaminathan ld.b r14, 16, r2 419*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 420*1fd5a2e1SPrashanth Swaminathan.L_case_uq: 421*1fd5a2e1SPrashanth Swaminathan ld.ub r14, 16, r2 422*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 423*1fd5a2e1SPrashanth Swaminathan.L_case_h: 424*1fd5a2e1SPrashanth Swaminathan ld.w r14, 16, r2 425*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 426*1fd5a2e1SPrashanth Swaminathan.L_case_uh: 427*1fd5a2e1SPrashanth Swaminathan ld.uw r14, 16, r2 428*1fd5a2e1SPrashanth Swaminathan blink tr1, r63 429*1fd5a2e1SPrashanth Swaminathan.L_case_v: 430*1fd5a2e1SPrashanth Swaminathan add.l r14, r63, r15 431*1fd5a2e1SPrashanth Swaminathan ld.l r15, 4, r12 432*1fd5a2e1SPrashanth Swaminathan ld.l r15, 8, r14 433*1fd5a2e1SPrashanth Swaminathan ld.l r15, 12, r18 434*1fd5a2e1SPrashanth Swaminathan addi.l r15, 136, r15 435*1fd5a2e1SPrashanth Swaminathan ptabs r18, tr0 436*1fd5a2e1SPrashanth Swaminathan blink tr0, r63 437*1fd5a2e1SPrashanth Swaminathan 438*1fd5a2e1SPrashanth Swaminathan.LFE2: 439*1fd5a2e1SPrashanth Swaminathan.ffi_closure_SYSV_end: 440*1fd5a2e1SPrashanth Swaminathan .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) 441*1fd5a2e1SPrashanth Swaminathan 442*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 443*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 444*1fd5a2e1SPrashanth Swaminathan#endif 445*1fd5a2e1SPrashanth Swaminathan 446*1fd5a2e1SPrashanth Swaminathan .section ".eh_frame","aw",@progbits 447*1fd5a2e1SPrashanth Swaminathan__FRAME_BEGIN__: 448*1fd5a2e1SPrashanth Swaminathan .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ 449*1fd5a2e1SPrashanth Swaminathan.LSCIE1: 450*1fd5a2e1SPrashanth Swaminathan .4byte 0x0 /* CIE Identifier Tag */ 451*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* CIE Version */ 452*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 453*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" /* CIE Augmentation */ 454*1fd5a2e1SPrashanth Swaminathan#else 455*1fd5a2e1SPrashanth Swaminathan .byte 0x0 /* CIE Augmentation */ 456*1fd5a2e1SPrashanth Swaminathan#endif 457*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 /* CIE Code Alignment Factor */ 458*1fd5a2e1SPrashanth Swaminathan .sleb128 -4 /* CIE Data Alignment Factor */ 459*1fd5a2e1SPrashanth Swaminathan .byte 0x12 /* CIE RA Column */ 460*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 461*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 /* Augmentation size */ 462*1fd5a2e1SPrashanth Swaminathan .byte 0x10 /* FDE Encoding (pcrel) */ 463*1fd5a2e1SPrashanth Swaminathan#endif 464*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* DW_CFA_def_cfa */ 465*1fd5a2e1SPrashanth Swaminathan .uleb128 0xf 466*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 467*1fd5a2e1SPrashanth Swaminathan .align 2 468*1fd5a2e1SPrashanth Swaminathan.LECIE1: 469*1fd5a2e1SPrashanth Swaminathan.LSFDE1: 470*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ 471*1fd5a2e1SPrashanth Swaminathan.LASFDE1: 472*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ 473*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 474*1fd5a2e1SPrashanth Swaminathan .4byte .LFB1-. /* FDE initial location */ 475*1fd5a2e1SPrashanth Swaminathan#else 476*1fd5a2e1SPrashanth Swaminathan .4byte .LFB1 /* FDE initial location */ 477*1fd5a2e1SPrashanth Swaminathan#endif 478*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ 479*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 480*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 /* Augmentation size */ 481*1fd5a2e1SPrashanth Swaminathan#endif 482*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 483*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI0-datalabel .LFB1 484*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 485*1fd5a2e1SPrashanth Swaminathan .uleb128 0x30 486*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 487*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI1-datalabel .LCFI0 488*1fd5a2e1SPrashanth Swaminathan .byte 0x8e /* DW_CFA_offset, column 0xe */ 489*1fd5a2e1SPrashanth Swaminathan .uleb128 0xc 490*1fd5a2e1SPrashanth Swaminathan .byte 0x92 /* DW_CFA_offset, column 0x12 */ 491*1fd5a2e1SPrashanth Swaminathan .uleb128 0xb 492*1fd5a2e1SPrashanth Swaminathan .byte 0x9c /* DW_CFA_offset, column 0x1c */ 493*1fd5a2e1SPrashanth Swaminathan .uleb128 0xa 494*1fd5a2e1SPrashanth Swaminathan .byte 0x9d /* DW_CFA_offset, column 0x1d */ 495*1fd5a2e1SPrashanth Swaminathan .uleb128 0x8 496*1fd5a2e1SPrashanth Swaminathan .byte 0x9e /* DW_CFA_offset, column 0x1e */ 497*1fd5a2e1SPrashanth Swaminathan .uleb128 0x6 498*1fd5a2e1SPrashanth Swaminathan .byte 0x9f /* DW_CFA_offset, column 0x1f */ 499*1fd5a2e1SPrashanth Swaminathan .uleb128 0x4 500*1fd5a2e1SPrashanth Swaminathan .byte 0xa0 /* DW_CFA_offset, column 0x20 */ 501*1fd5a2e1SPrashanth Swaminathan .uleb128 0x2 502*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 503*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI2-datalabel .LCFI1 504*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 505*1fd5a2e1SPrashanth Swaminathan .uleb128 0xe 506*1fd5a2e1SPrashanth Swaminathan .align 2 507*1fd5a2e1SPrashanth Swaminathan.LEFDE1: 508*1fd5a2e1SPrashanth Swaminathan 509*1fd5a2e1SPrashanth Swaminathan.LSFDE3: 510*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ 511*1fd5a2e1SPrashanth Swaminathan.LASFDE3: 512*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ 513*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 514*1fd5a2e1SPrashanth Swaminathan .4byte .LFB2-. /* FDE initial location */ 515*1fd5a2e1SPrashanth Swaminathan#else 516*1fd5a2e1SPrashanth Swaminathan .4byte .LFB2 /* FDE initial location */ 517*1fd5a2e1SPrashanth Swaminathan#endif 518*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ 519*1fd5a2e1SPrashanth Swaminathan#ifdef PIC 520*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 /* Augmentation size */ 521*1fd5a2e1SPrashanth Swaminathan#endif 522*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 523*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI3-datalabel .LFB2 524*1fd5a2e1SPrashanth Swaminathan .byte 0xe /* DW_CFA_def_cfa_offset */ 525*1fd5a2e1SPrashanth Swaminathan .uleb128 0x88 526*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 527*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI4-datalabel .LCFI3 528*1fd5a2e1SPrashanth Swaminathan .byte 0x8c /* DW_CFA_offset, column 0xc */ 529*1fd5a2e1SPrashanth Swaminathan .uleb128 0x21 530*1fd5a2e1SPrashanth Swaminathan .byte 0x8e /* DW_CFA_offset, column 0xe */ 531*1fd5a2e1SPrashanth Swaminathan .uleb128 0x20 532*1fd5a2e1SPrashanth Swaminathan .byte 0x92 /* DW_CFA_offset, column 0x12 */ 533*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1f 534*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 535*1fd5a2e1SPrashanth Swaminathan .4byte datalabel .LCFI5-datalabel .LCFI4 536*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 537*1fd5a2e1SPrashanth Swaminathan .uleb128 0xe 538*1fd5a2e1SPrashanth Swaminathan .align 2 539*1fd5a2e1SPrashanth Swaminathan.LEFDE3: 540