1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2000 Hewlett Packard Company 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathan IA64/unix Foreign Function Interface 6*1fd5a2e1SPrashanth Swaminathan 7*1fd5a2e1SPrashanth Swaminathan Primary author: Hans Boehm, HP Labs 8*1fd5a2e1SPrashanth Swaminathan 9*1fd5a2e1SPrashanth Swaminathan Loosely modeled on Cygnus code for other platforms. 10*1fd5a2e1SPrashanth Swaminathan 11*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 12*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 13*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 14*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 15*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 16*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 17*1fd5a2e1SPrashanth Swaminathan the following conditions: 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 20*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 21*1fd5a2e1SPrashanth Swaminathan 22*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 23*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 26*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 27*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 29*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 30*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 33*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 34*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 35*1fd5a2e1SPrashanth Swaminathan#include "ia64_flags.h" 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan .pred.safe_across_calls p1-p5,p16-p63 38*1fd5a2e1SPrashanth Swaminathan.text 39*1fd5a2e1SPrashanth Swaminathan 40*1fd5a2e1SPrashanth Swaminathan/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, 41*1fd5a2e1SPrashanth Swaminathan void (*fn)(void), int flags); 42*1fd5a2e1SPrashanth Swaminathan */ 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathan .align 16 45*1fd5a2e1SPrashanth Swaminathan .global ffi_call_unix 46*1fd5a2e1SPrashanth Swaminathan .proc ffi_call_unix 47*1fd5a2e1SPrashanth Swaminathanffi_call_unix: 48*1fd5a2e1SPrashanth Swaminathan .prologue 49*1fd5a2e1SPrashanth Swaminathan /* Bit o trickiness. We actually share a stack frame with ffi_call. 50*1fd5a2e1SPrashanth Swaminathan Rely on the fact that ffi_call uses a vframe and don't bother 51*1fd5a2e1SPrashanth Swaminathan tracking one here at all. */ 52*1fd5a2e1SPrashanth Swaminathan .fframe 0 53*1fd5a2e1SPrashanth Swaminathan .save ar.pfs, r36 // loc0 54*1fd5a2e1SPrashanth Swaminathan alloc loc0 = ar.pfs, 4, 3, 8, 0 55*1fd5a2e1SPrashanth Swaminathan .save rp, loc1 56*1fd5a2e1SPrashanth Swaminathan mov loc1 = b0 57*1fd5a2e1SPrashanth Swaminathan .body 58*1fd5a2e1SPrashanth Swaminathan add r16 = 16, in0 59*1fd5a2e1SPrashanth Swaminathan mov loc2 = gp 60*1fd5a2e1SPrashanth Swaminathan mov r8 = in1 61*1fd5a2e1SPrashanth Swaminathan ;; 62*1fd5a2e1SPrashanth Swaminathan 63*1fd5a2e1SPrashanth Swaminathan /* Load up all of the argument registers. */ 64*1fd5a2e1SPrashanth Swaminathan ldf.fill f8 = [in0], 32 65*1fd5a2e1SPrashanth Swaminathan ldf.fill f9 = [r16], 32 66*1fd5a2e1SPrashanth Swaminathan ;; 67*1fd5a2e1SPrashanth Swaminathan ldf.fill f10 = [in0], 32 68*1fd5a2e1SPrashanth Swaminathan ldf.fill f11 = [r16], 32 69*1fd5a2e1SPrashanth Swaminathan ;; 70*1fd5a2e1SPrashanth Swaminathan ldf.fill f12 = [in0], 32 71*1fd5a2e1SPrashanth Swaminathan ldf.fill f13 = [r16], 32 72*1fd5a2e1SPrashanth Swaminathan ;; 73*1fd5a2e1SPrashanth Swaminathan ldf.fill f14 = [in0], 32 74*1fd5a2e1SPrashanth Swaminathan ldf.fill f15 = [r16], 24 75*1fd5a2e1SPrashanth Swaminathan ;; 76*1fd5a2e1SPrashanth Swaminathan ld8 out0 = [in0], 16 77*1fd5a2e1SPrashanth Swaminathan ld8 out1 = [r16], 16 78*1fd5a2e1SPrashanth Swaminathan ;; 79*1fd5a2e1SPrashanth Swaminathan ld8 out2 = [in0], 16 80*1fd5a2e1SPrashanth Swaminathan ld8 out3 = [r16], 16 81*1fd5a2e1SPrashanth Swaminathan ;; 82*1fd5a2e1SPrashanth Swaminathan ld8 out4 = [in0], 16 83*1fd5a2e1SPrashanth Swaminathan ld8 out5 = [r16], 16 84*1fd5a2e1SPrashanth Swaminathan ;; 85*1fd5a2e1SPrashanth Swaminathan ld8 out6 = [in0] 86*1fd5a2e1SPrashanth Swaminathan ld8 out7 = [r16] 87*1fd5a2e1SPrashanth Swaminathan ;; 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan /* Deallocate the register save area from the stack frame. */ 90*1fd5a2e1SPrashanth Swaminathan mov sp = in0 91*1fd5a2e1SPrashanth Swaminathan 92*1fd5a2e1SPrashanth Swaminathan /* Call the target function. */ 93*1fd5a2e1SPrashanth Swaminathan ld8 r16 = [in2], 8 94*1fd5a2e1SPrashanth Swaminathan ;; 95*1fd5a2e1SPrashanth Swaminathan ld8 gp = [in2] 96*1fd5a2e1SPrashanth Swaminathan mov b6 = r16 97*1fd5a2e1SPrashanth Swaminathan br.call.sptk.many b0 = b6 98*1fd5a2e1SPrashanth Swaminathan ;; 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan /* Dispatch to handle return value. */ 101*1fd5a2e1SPrashanth Swaminathan mov gp = loc2 102*1fd5a2e1SPrashanth Swaminathan zxt1 r16 = in3 103*1fd5a2e1SPrashanth Swaminathan ;; 104*1fd5a2e1SPrashanth Swaminathan mov ar.pfs = loc0 105*1fd5a2e1SPrashanth Swaminathan addl r18 = @ltoffx(.Lst_table), gp 106*1fd5a2e1SPrashanth Swaminathan ;; 107*1fd5a2e1SPrashanth Swaminathan ld8.mov r18 = [r18], .Lst_table 108*1fd5a2e1SPrashanth Swaminathan mov b0 = loc1 109*1fd5a2e1SPrashanth Swaminathan ;; 110*1fd5a2e1SPrashanth Swaminathan shladd r18 = r16, 3, r18 111*1fd5a2e1SPrashanth Swaminathan ;; 112*1fd5a2e1SPrashanth Swaminathan ld8 r17 = [r18] 113*1fd5a2e1SPrashanth Swaminathan shr in3 = in3, 8 114*1fd5a2e1SPrashanth Swaminathan ;; 115*1fd5a2e1SPrashanth Swaminathan add r17 = r17, r18 116*1fd5a2e1SPrashanth Swaminathan ;; 117*1fd5a2e1SPrashanth Swaminathan mov b6 = r17 118*1fd5a2e1SPrashanth Swaminathan br b6 119*1fd5a2e1SPrashanth Swaminathan ;; 120*1fd5a2e1SPrashanth Swaminathan 121*1fd5a2e1SPrashanth Swaminathan.Lst_void: 122*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 123*1fd5a2e1SPrashanth Swaminathan ;; 124*1fd5a2e1SPrashanth Swaminathan.Lst_uint8: 125*1fd5a2e1SPrashanth Swaminathan zxt1 r8 = r8 126*1fd5a2e1SPrashanth Swaminathan ;; 127*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 128*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 129*1fd5a2e1SPrashanth Swaminathan ;; 130*1fd5a2e1SPrashanth Swaminathan.Lst_sint8: 131*1fd5a2e1SPrashanth Swaminathan sxt1 r8 = r8 132*1fd5a2e1SPrashanth Swaminathan ;; 133*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 134*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 135*1fd5a2e1SPrashanth Swaminathan ;; 136*1fd5a2e1SPrashanth Swaminathan.Lst_uint16: 137*1fd5a2e1SPrashanth Swaminathan zxt2 r8 = r8 138*1fd5a2e1SPrashanth Swaminathan ;; 139*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 140*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 141*1fd5a2e1SPrashanth Swaminathan ;; 142*1fd5a2e1SPrashanth Swaminathan.Lst_sint16: 143*1fd5a2e1SPrashanth Swaminathan sxt2 r8 = r8 144*1fd5a2e1SPrashanth Swaminathan ;; 145*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 146*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 147*1fd5a2e1SPrashanth Swaminathan ;; 148*1fd5a2e1SPrashanth Swaminathan.Lst_uint32: 149*1fd5a2e1SPrashanth Swaminathan zxt4 r8 = r8 150*1fd5a2e1SPrashanth Swaminathan ;; 151*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 152*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 153*1fd5a2e1SPrashanth Swaminathan ;; 154*1fd5a2e1SPrashanth Swaminathan.Lst_sint32: 155*1fd5a2e1SPrashanth Swaminathan sxt4 r8 = r8 156*1fd5a2e1SPrashanth Swaminathan ;; 157*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 158*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 159*1fd5a2e1SPrashanth Swaminathan ;; 160*1fd5a2e1SPrashanth Swaminathan.Lst_int64: 161*1fd5a2e1SPrashanth Swaminathan st8 [in1] = r8 162*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 163*1fd5a2e1SPrashanth Swaminathan ;; 164*1fd5a2e1SPrashanth Swaminathan.Lst_float: 165*1fd5a2e1SPrashanth Swaminathan stfs [in1] = f8 166*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 167*1fd5a2e1SPrashanth Swaminathan ;; 168*1fd5a2e1SPrashanth Swaminathan.Lst_double: 169*1fd5a2e1SPrashanth Swaminathan stfd [in1] = f8 170*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 171*1fd5a2e1SPrashanth Swaminathan ;; 172*1fd5a2e1SPrashanth Swaminathan.Lst_ldouble: 173*1fd5a2e1SPrashanth Swaminathan stfe [in1] = f8 174*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 175*1fd5a2e1SPrashanth Swaminathan ;; 176*1fd5a2e1SPrashanth Swaminathan 177*1fd5a2e1SPrashanth Swaminathan.Lst_small_struct: 178*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 8, in3 179*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 16, in3 180*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 24, in3 181*1fd5a2e1SPrashanth Swaminathan ;; 182*1fd5a2e1SPrashanth Swaminathan add r16 = 8, sp 183*1fd5a2e1SPrashanth Swaminathan add r17 = 16, sp 184*1fd5a2e1SPrashanth Swaminathan add r18 = 24, sp 185*1fd5a2e1SPrashanth Swaminathan ;; 186*1fd5a2e1SPrashanth Swaminathan st8 [sp] = r8 187*1fd5a2e1SPrashanth Swaminathan(p6) st8 [r16] = r9 188*1fd5a2e1SPrashanth Swaminathan mov out0 = in1 189*1fd5a2e1SPrashanth Swaminathan(p7) st8 [r17] = r10 190*1fd5a2e1SPrashanth Swaminathan(p8) st8 [r18] = r11 191*1fd5a2e1SPrashanth Swaminathan mov out1 = sp 192*1fd5a2e1SPrashanth Swaminathan mov out2 = in3 193*1fd5a2e1SPrashanth Swaminathan ;; 194*1fd5a2e1SPrashanth Swaminathan // ia64 software calling convention requires 195*1fd5a2e1SPrashanth Swaminathan // top 16 bytes of stack to be scratch space 196*1fd5a2e1SPrashanth Swaminathan // PLT resolver uses that scratch space at 197*1fd5a2e1SPrashanth Swaminathan // 'memcpy' symbol reolution time 198*1fd5a2e1SPrashanth Swaminathan add sp = -16, sp 199*1fd5a2e1SPrashanth Swaminathan br.call.sptk.many b0 = memcpy# 200*1fd5a2e1SPrashanth Swaminathan ;; 201*1fd5a2e1SPrashanth Swaminathan mov ar.pfs = loc0 202*1fd5a2e1SPrashanth Swaminathan mov b0 = loc1 203*1fd5a2e1SPrashanth Swaminathan mov gp = loc2 204*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 205*1fd5a2e1SPrashanth Swaminathan 206*1fd5a2e1SPrashanth Swaminathan.Lst_hfa_float: 207*1fd5a2e1SPrashanth Swaminathan add r16 = 4, in1 208*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 4, in3 209*1fd5a2e1SPrashanth Swaminathan ;; 210*1fd5a2e1SPrashanth Swaminathan stfs [in1] = f8, 8 211*1fd5a2e1SPrashanth Swaminathan(p6) stfs [r16] = f9, 8 212*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 8, in3 213*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 12, in3 214*1fd5a2e1SPrashanth Swaminathan ;; 215*1fd5a2e1SPrashanth Swaminathan(p7) stfs [in1] = f10, 8 216*1fd5a2e1SPrashanth Swaminathan(p8) stfs [r16] = f11, 8 217*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 16, in3 218*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 20, in3 219*1fd5a2e1SPrashanth Swaminathan ;; 220*1fd5a2e1SPrashanth Swaminathan(p9) stfs [in1] = f12, 8 221*1fd5a2e1SPrashanth Swaminathan(p10) stfs [r16] = f13, 8 222*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 24, in3 223*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 28, in3 224*1fd5a2e1SPrashanth Swaminathan ;; 225*1fd5a2e1SPrashanth Swaminathan(p6) stfs [in1] = f14 226*1fd5a2e1SPrashanth Swaminathan(p7) stfs [r16] = f15 227*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 228*1fd5a2e1SPrashanth Swaminathan ;; 229*1fd5a2e1SPrashanth Swaminathan 230*1fd5a2e1SPrashanth Swaminathan.Lst_hfa_double: 231*1fd5a2e1SPrashanth Swaminathan add r16 = 8, in1 232*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 8, in3 233*1fd5a2e1SPrashanth Swaminathan ;; 234*1fd5a2e1SPrashanth Swaminathan stfd [in1] = f8, 16 235*1fd5a2e1SPrashanth Swaminathan(p6) stfd [r16] = f9, 16 236*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 16, in3 237*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 24, in3 238*1fd5a2e1SPrashanth Swaminathan ;; 239*1fd5a2e1SPrashanth Swaminathan(p7) stfd [in1] = f10, 16 240*1fd5a2e1SPrashanth Swaminathan(p8) stfd [r16] = f11, 16 241*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 32, in3 242*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 40, in3 243*1fd5a2e1SPrashanth Swaminathan ;; 244*1fd5a2e1SPrashanth Swaminathan(p9) stfd [in1] = f12, 16 245*1fd5a2e1SPrashanth Swaminathan(p10) stfd [r16] = f13, 16 246*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 48, in3 247*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 56, in3 248*1fd5a2e1SPrashanth Swaminathan ;; 249*1fd5a2e1SPrashanth Swaminathan(p6) stfd [in1] = f14 250*1fd5a2e1SPrashanth Swaminathan(p7) stfd [r16] = f15 251*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 252*1fd5a2e1SPrashanth Swaminathan ;; 253*1fd5a2e1SPrashanth Swaminathan 254*1fd5a2e1SPrashanth Swaminathan.Lst_hfa_ldouble: 255*1fd5a2e1SPrashanth Swaminathan add r16 = 16, in1 256*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 16, in3 257*1fd5a2e1SPrashanth Swaminathan ;; 258*1fd5a2e1SPrashanth Swaminathan stfe [in1] = f8, 32 259*1fd5a2e1SPrashanth Swaminathan(p6) stfe [r16] = f9, 32 260*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 32, in3 261*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 48, in3 262*1fd5a2e1SPrashanth Swaminathan ;; 263*1fd5a2e1SPrashanth Swaminathan(p7) stfe [in1] = f10, 32 264*1fd5a2e1SPrashanth Swaminathan(p8) stfe [r16] = f11, 32 265*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 64, in3 266*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 80, in3 267*1fd5a2e1SPrashanth Swaminathan ;; 268*1fd5a2e1SPrashanth Swaminathan(p9) stfe [in1] = f12, 32 269*1fd5a2e1SPrashanth Swaminathan(p10) stfe [r16] = f13, 32 270*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 96, in3 271*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 112, in3 272*1fd5a2e1SPrashanth Swaminathan ;; 273*1fd5a2e1SPrashanth Swaminathan(p6) stfe [in1] = f14 274*1fd5a2e1SPrashanth Swaminathan(p7) stfe [r16] = f15 275*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 276*1fd5a2e1SPrashanth Swaminathan ;; 277*1fd5a2e1SPrashanth Swaminathan 278*1fd5a2e1SPrashanth Swaminathan .endp ffi_call_unix 279*1fd5a2e1SPrashanth Swaminathan 280*1fd5a2e1SPrashanth Swaminathan .align 16 281*1fd5a2e1SPrashanth Swaminathan .global ffi_closure_unix 282*1fd5a2e1SPrashanth Swaminathan .proc ffi_closure_unix 283*1fd5a2e1SPrashanth Swaminathan 284*1fd5a2e1SPrashanth Swaminathan#define FRAME_SIZE (8*16 + 8*8 + 8*16) 285*1fd5a2e1SPrashanth Swaminathan 286*1fd5a2e1SPrashanth Swaminathanffi_closure_unix: 287*1fd5a2e1SPrashanth Swaminathan .prologue 288*1fd5a2e1SPrashanth Swaminathan .save ar.pfs, r40 // loc0 289*1fd5a2e1SPrashanth Swaminathan alloc loc0 = ar.pfs, 8, 4, 4, 0 290*1fd5a2e1SPrashanth Swaminathan .fframe FRAME_SIZE 291*1fd5a2e1SPrashanth Swaminathan add r12 = -FRAME_SIZE, r12 292*1fd5a2e1SPrashanth Swaminathan .save rp, loc1 293*1fd5a2e1SPrashanth Swaminathan mov loc1 = b0 294*1fd5a2e1SPrashanth Swaminathan .save ar.unat, loc2 295*1fd5a2e1SPrashanth Swaminathan mov loc2 = ar.unat 296*1fd5a2e1SPrashanth Swaminathan .body 297*1fd5a2e1SPrashanth Swaminathan 298*1fd5a2e1SPrashanth Swaminathan /* Retrieve closure pointer and real gp. */ 299*1fd5a2e1SPrashanth Swaminathan#ifdef _ILP32 300*1fd5a2e1SPrashanth Swaminathan addp4 out0 = 0, gp 301*1fd5a2e1SPrashanth Swaminathan addp4 gp = 16, gp 302*1fd5a2e1SPrashanth Swaminathan#else 303*1fd5a2e1SPrashanth Swaminathan mov out0 = gp 304*1fd5a2e1SPrashanth Swaminathan add gp = 16, gp 305*1fd5a2e1SPrashanth Swaminathan#endif 306*1fd5a2e1SPrashanth Swaminathan ;; 307*1fd5a2e1SPrashanth Swaminathan ld8 gp = [gp] 308*1fd5a2e1SPrashanth Swaminathan 309*1fd5a2e1SPrashanth Swaminathan /* Spill all of the possible argument registers. */ 310*1fd5a2e1SPrashanth Swaminathan add r16 = 16 + 8*16, sp 311*1fd5a2e1SPrashanth Swaminathan add r17 = 16 + 8*16 + 16, sp 312*1fd5a2e1SPrashanth Swaminathan ;; 313*1fd5a2e1SPrashanth Swaminathan stf.spill [r16] = f8, 32 314*1fd5a2e1SPrashanth Swaminathan stf.spill [r17] = f9, 32 315*1fd5a2e1SPrashanth Swaminathan mov loc3 = gp 316*1fd5a2e1SPrashanth Swaminathan ;; 317*1fd5a2e1SPrashanth Swaminathan stf.spill [r16] = f10, 32 318*1fd5a2e1SPrashanth Swaminathan stf.spill [r17] = f11, 32 319*1fd5a2e1SPrashanth Swaminathan ;; 320*1fd5a2e1SPrashanth Swaminathan stf.spill [r16] = f12, 32 321*1fd5a2e1SPrashanth Swaminathan stf.spill [r17] = f13, 32 322*1fd5a2e1SPrashanth Swaminathan ;; 323*1fd5a2e1SPrashanth Swaminathan stf.spill [r16] = f14, 32 324*1fd5a2e1SPrashanth Swaminathan stf.spill [r17] = f15, 24 325*1fd5a2e1SPrashanth Swaminathan ;; 326*1fd5a2e1SPrashanth Swaminathan .mem.offset 0, 0 327*1fd5a2e1SPrashanth Swaminathan st8.spill [r16] = in0, 16 328*1fd5a2e1SPrashanth Swaminathan .mem.offset 8, 0 329*1fd5a2e1SPrashanth Swaminathan st8.spill [r17] = in1, 16 330*1fd5a2e1SPrashanth Swaminathan add out1 = 16 + 8*16, sp 331*1fd5a2e1SPrashanth Swaminathan ;; 332*1fd5a2e1SPrashanth Swaminathan .mem.offset 0, 0 333*1fd5a2e1SPrashanth Swaminathan st8.spill [r16] = in2, 16 334*1fd5a2e1SPrashanth Swaminathan .mem.offset 8, 0 335*1fd5a2e1SPrashanth Swaminathan st8.spill [r17] = in3, 16 336*1fd5a2e1SPrashanth Swaminathan add out2 = 16, sp 337*1fd5a2e1SPrashanth Swaminathan ;; 338*1fd5a2e1SPrashanth Swaminathan .mem.offset 0, 0 339*1fd5a2e1SPrashanth Swaminathan st8.spill [r16] = in4, 16 340*1fd5a2e1SPrashanth Swaminathan .mem.offset 8, 0 341*1fd5a2e1SPrashanth Swaminathan st8.spill [r17] = in5, 16 342*1fd5a2e1SPrashanth Swaminathan mov out3 = r8 343*1fd5a2e1SPrashanth Swaminathan ;; 344*1fd5a2e1SPrashanth Swaminathan .mem.offset 0, 0 345*1fd5a2e1SPrashanth Swaminathan st8.spill [r16] = in6 346*1fd5a2e1SPrashanth Swaminathan .mem.offset 8, 0 347*1fd5a2e1SPrashanth Swaminathan st8.spill [r17] = in7 348*1fd5a2e1SPrashanth Swaminathan 349*1fd5a2e1SPrashanth Swaminathan /* Invoke ffi_closure_unix_inner for the hard work. */ 350*1fd5a2e1SPrashanth Swaminathan br.call.sptk.many b0 = ffi_closure_unix_inner 351*1fd5a2e1SPrashanth Swaminathan ;; 352*1fd5a2e1SPrashanth Swaminathan 353*1fd5a2e1SPrashanth Swaminathan /* Dispatch to handle return value. */ 354*1fd5a2e1SPrashanth Swaminathan mov gp = loc3 355*1fd5a2e1SPrashanth Swaminathan zxt1 r16 = r8 356*1fd5a2e1SPrashanth Swaminathan ;; 357*1fd5a2e1SPrashanth Swaminathan addl r18 = @ltoffx(.Lld_table), gp 358*1fd5a2e1SPrashanth Swaminathan mov ar.pfs = loc0 359*1fd5a2e1SPrashanth Swaminathan ;; 360*1fd5a2e1SPrashanth Swaminathan ld8.mov r18 = [r18], .Lld_table 361*1fd5a2e1SPrashanth Swaminathan mov b0 = loc1 362*1fd5a2e1SPrashanth Swaminathan ;; 363*1fd5a2e1SPrashanth Swaminathan shladd r18 = r16, 3, r18 364*1fd5a2e1SPrashanth Swaminathan mov ar.unat = loc2 365*1fd5a2e1SPrashanth Swaminathan ;; 366*1fd5a2e1SPrashanth Swaminathan ld8 r17 = [r18] 367*1fd5a2e1SPrashanth Swaminathan shr r8 = r8, 8 368*1fd5a2e1SPrashanth Swaminathan ;; 369*1fd5a2e1SPrashanth Swaminathan add r17 = r17, r18 370*1fd5a2e1SPrashanth Swaminathan add r16 = 16, sp 371*1fd5a2e1SPrashanth Swaminathan ;; 372*1fd5a2e1SPrashanth Swaminathan mov b6 = r17 373*1fd5a2e1SPrashanth Swaminathan br b6 374*1fd5a2e1SPrashanth Swaminathan ;; 375*1fd5a2e1SPrashanth Swaminathan .label_state 1 376*1fd5a2e1SPrashanth Swaminathan 377*1fd5a2e1SPrashanth Swaminathan.Lld_void: 378*1fd5a2e1SPrashanth Swaminathan .restore sp 379*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 380*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 381*1fd5a2e1SPrashanth Swaminathan ;; 382*1fd5a2e1SPrashanth Swaminathan.Lld_int: 383*1fd5a2e1SPrashanth Swaminathan .body 384*1fd5a2e1SPrashanth Swaminathan .copy_state 1 385*1fd5a2e1SPrashanth Swaminathan ld8 r8 = [r16] 386*1fd5a2e1SPrashanth Swaminathan .restore sp 387*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 388*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 389*1fd5a2e1SPrashanth Swaminathan ;; 390*1fd5a2e1SPrashanth Swaminathan.Lld_float: 391*1fd5a2e1SPrashanth Swaminathan .body 392*1fd5a2e1SPrashanth Swaminathan .copy_state 1 393*1fd5a2e1SPrashanth Swaminathan ldfs f8 = [r16] 394*1fd5a2e1SPrashanth Swaminathan .restore sp 395*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 396*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 397*1fd5a2e1SPrashanth Swaminathan ;; 398*1fd5a2e1SPrashanth Swaminathan.Lld_double: 399*1fd5a2e1SPrashanth Swaminathan .body 400*1fd5a2e1SPrashanth Swaminathan .copy_state 1 401*1fd5a2e1SPrashanth Swaminathan ldfd f8 = [r16] 402*1fd5a2e1SPrashanth Swaminathan .restore sp 403*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 404*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 405*1fd5a2e1SPrashanth Swaminathan ;; 406*1fd5a2e1SPrashanth Swaminathan.Lld_ldouble: 407*1fd5a2e1SPrashanth Swaminathan .body 408*1fd5a2e1SPrashanth Swaminathan .copy_state 1 409*1fd5a2e1SPrashanth Swaminathan ldfe f8 = [r16] 410*1fd5a2e1SPrashanth Swaminathan .restore sp 411*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 412*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 413*1fd5a2e1SPrashanth Swaminathan ;; 414*1fd5a2e1SPrashanth Swaminathan 415*1fd5a2e1SPrashanth Swaminathan.Lld_small_struct: 416*1fd5a2e1SPrashanth Swaminathan .body 417*1fd5a2e1SPrashanth Swaminathan .copy_state 1 418*1fd5a2e1SPrashanth Swaminathan add r17 = 8, r16 419*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 8, r8 420*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 16, r8 421*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 24, r8 422*1fd5a2e1SPrashanth Swaminathan ;; 423*1fd5a2e1SPrashanth Swaminathan ld8 r8 = [r16], 16 424*1fd5a2e1SPrashanth Swaminathan(p6) ld8 r9 = [r17], 16 425*1fd5a2e1SPrashanth Swaminathan ;; 426*1fd5a2e1SPrashanth Swaminathan(p7) ld8 r10 = [r16] 427*1fd5a2e1SPrashanth Swaminathan(p8) ld8 r11 = [r17] 428*1fd5a2e1SPrashanth Swaminathan .restore sp 429*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 430*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 431*1fd5a2e1SPrashanth Swaminathan ;; 432*1fd5a2e1SPrashanth Swaminathan 433*1fd5a2e1SPrashanth Swaminathan.Lld_hfa_float: 434*1fd5a2e1SPrashanth Swaminathan .body 435*1fd5a2e1SPrashanth Swaminathan .copy_state 1 436*1fd5a2e1SPrashanth Swaminathan add r17 = 4, r16 437*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 4, r8 438*1fd5a2e1SPrashanth Swaminathan ;; 439*1fd5a2e1SPrashanth Swaminathan ldfs f8 = [r16], 8 440*1fd5a2e1SPrashanth Swaminathan(p6) ldfs f9 = [r17], 8 441*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 8, r8 442*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 12, r8 443*1fd5a2e1SPrashanth Swaminathan ;; 444*1fd5a2e1SPrashanth Swaminathan(p7) ldfs f10 = [r16], 8 445*1fd5a2e1SPrashanth Swaminathan(p8) ldfs f11 = [r17], 8 446*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 16, r8 447*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 20, r8 448*1fd5a2e1SPrashanth Swaminathan ;; 449*1fd5a2e1SPrashanth Swaminathan(p9) ldfs f12 = [r16], 8 450*1fd5a2e1SPrashanth Swaminathan(p10) ldfs f13 = [r17], 8 451*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 24, r8 452*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 28, r8 453*1fd5a2e1SPrashanth Swaminathan ;; 454*1fd5a2e1SPrashanth Swaminathan(p6) ldfs f14 = [r16] 455*1fd5a2e1SPrashanth Swaminathan(p7) ldfs f15 = [r17] 456*1fd5a2e1SPrashanth Swaminathan .restore sp 457*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 458*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 459*1fd5a2e1SPrashanth Swaminathan ;; 460*1fd5a2e1SPrashanth Swaminathan 461*1fd5a2e1SPrashanth Swaminathan.Lld_hfa_double: 462*1fd5a2e1SPrashanth Swaminathan .body 463*1fd5a2e1SPrashanth Swaminathan .copy_state 1 464*1fd5a2e1SPrashanth Swaminathan add r17 = 8, r16 465*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 8, r8 466*1fd5a2e1SPrashanth Swaminathan ;; 467*1fd5a2e1SPrashanth Swaminathan ldfd f8 = [r16], 16 468*1fd5a2e1SPrashanth Swaminathan(p6) ldfd f9 = [r17], 16 469*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 16, r8 470*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 24, r8 471*1fd5a2e1SPrashanth Swaminathan ;; 472*1fd5a2e1SPrashanth Swaminathan(p7) ldfd f10 = [r16], 16 473*1fd5a2e1SPrashanth Swaminathan(p8) ldfd f11 = [r17], 16 474*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 32, r8 475*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 40, r8 476*1fd5a2e1SPrashanth Swaminathan ;; 477*1fd5a2e1SPrashanth Swaminathan(p9) ldfd f12 = [r16], 16 478*1fd5a2e1SPrashanth Swaminathan(p10) ldfd f13 = [r17], 16 479*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 48, r8 480*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 56, r8 481*1fd5a2e1SPrashanth Swaminathan ;; 482*1fd5a2e1SPrashanth Swaminathan(p6) ldfd f14 = [r16] 483*1fd5a2e1SPrashanth Swaminathan(p7) ldfd f15 = [r17] 484*1fd5a2e1SPrashanth Swaminathan .restore sp 485*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 486*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 487*1fd5a2e1SPrashanth Swaminathan ;; 488*1fd5a2e1SPrashanth Swaminathan 489*1fd5a2e1SPrashanth Swaminathan.Lld_hfa_ldouble: 490*1fd5a2e1SPrashanth Swaminathan .body 491*1fd5a2e1SPrashanth Swaminathan .copy_state 1 492*1fd5a2e1SPrashanth Swaminathan add r17 = 16, r16 493*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 16, r8 494*1fd5a2e1SPrashanth Swaminathan ;; 495*1fd5a2e1SPrashanth Swaminathan ldfe f8 = [r16], 32 496*1fd5a2e1SPrashanth Swaminathan(p6) ldfe f9 = [r17], 32 497*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 32, r8 498*1fd5a2e1SPrashanth Swaminathan cmp.lt p8, p0 = 48, r8 499*1fd5a2e1SPrashanth Swaminathan ;; 500*1fd5a2e1SPrashanth Swaminathan(p7) ldfe f10 = [r16], 32 501*1fd5a2e1SPrashanth Swaminathan(p8) ldfe f11 = [r17], 32 502*1fd5a2e1SPrashanth Swaminathan cmp.lt p9, p0 = 64, r8 503*1fd5a2e1SPrashanth Swaminathan cmp.lt p10, p0 = 80, r8 504*1fd5a2e1SPrashanth Swaminathan ;; 505*1fd5a2e1SPrashanth Swaminathan(p9) ldfe f12 = [r16], 32 506*1fd5a2e1SPrashanth Swaminathan(p10) ldfe f13 = [r17], 32 507*1fd5a2e1SPrashanth Swaminathan cmp.lt p6, p0 = 96, r8 508*1fd5a2e1SPrashanth Swaminathan cmp.lt p7, p0 = 112, r8 509*1fd5a2e1SPrashanth Swaminathan ;; 510*1fd5a2e1SPrashanth Swaminathan(p6) ldfe f14 = [r16] 511*1fd5a2e1SPrashanth Swaminathan(p7) ldfe f15 = [r17] 512*1fd5a2e1SPrashanth Swaminathan .restore sp 513*1fd5a2e1SPrashanth Swaminathan add sp = FRAME_SIZE, sp 514*1fd5a2e1SPrashanth Swaminathan br.ret.sptk.many b0 515*1fd5a2e1SPrashanth Swaminathan ;; 516*1fd5a2e1SPrashanth Swaminathan 517*1fd5a2e1SPrashanth Swaminathan .endp ffi_closure_unix 518*1fd5a2e1SPrashanth Swaminathan 519*1fd5a2e1SPrashanth Swaminathan .section .rodata 520*1fd5a2e1SPrashanth Swaminathan .align 8 521*1fd5a2e1SPrashanth Swaminathan.Lst_table: 522*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_void) // FFI_TYPE_VOID 523*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT 524*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT 525*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE 526*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE 527*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 528*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 529*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 530*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 531*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 532*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 533*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 534*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 535*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT 536*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER 537*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_void) // FFI_TYPE_COMPLEX (not implemented) 538*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT 539*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT 540*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE 541*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE 542*1fd5a2e1SPrashanth Swaminathan 543*1fd5a2e1SPrashanth Swaminathan.Lld_table: 544*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_void) // FFI_TYPE_VOID 545*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_INT 546*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT 547*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE 548*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE 549*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 550*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 551*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 552*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 553*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 554*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 555*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 556*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 557*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT 558*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER 559*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_void) // FFI_TYPE_COMPLEX (not implemented) 560*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT 561*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT 562*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE 563*1fd5a2e1SPrashanth Swaminathan data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE 564*1fd5a2e1SPrashanth Swaminathan 565*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 566*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 567*1fd5a2e1SPrashanth Swaminathan#endif 568