1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan v8.S - Copyright (c) 2013 The Written Word, Inc. 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathan SPARC Foreign Function Interface 6*1fd5a2e1SPrashanth Swaminathan 7*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 8*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 9*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 10*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 11*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 12*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 13*1fd5a2e1SPrashanth Swaminathan the following conditions: 14*1fd5a2e1SPrashanth Swaminathan 15*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 16*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 17*1fd5a2e1SPrashanth Swaminathan 18*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 19*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 26*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 31*1fd5a2e1SPrashanth Swaminathan#include "internal.h" 32*1fd5a2e1SPrashanth Swaminathan 33*1fd5a2e1SPrashanth Swaminathan#ifndef SPARC64 34*1fd5a2e1SPrashanth Swaminathan 35*1fd5a2e1SPrashanth Swaminathan#define C2(X, Y) X ## Y 36*1fd5a2e1SPrashanth Swaminathan#define C1(X, Y) C2(X, Y) 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan#ifdef __USER_LABEL_PREFIX__ 39*1fd5a2e1SPrashanth Swaminathan# define C(Y) C1(__USER_LABEL_PREFIX__, Y) 40*1fd5a2e1SPrashanth Swaminathan#else 41*1fd5a2e1SPrashanth Swaminathan# define C(Y) Y 42*1fd5a2e1SPrashanth Swaminathan#endif 43*1fd5a2e1SPrashanth Swaminathan#define L(Y) C1(.L, Y) 44*1fd5a2e1SPrashanth Swaminathan 45*1fd5a2e1SPrashanth Swaminathan .text 46*1fd5a2e1SPrashanth Swaminathan 47*1fd5a2e1SPrashanth Swaminathan#ifndef __GNUC__ 48*1fd5a2e1SPrashanth Swaminathan .align 8 49*1fd5a2e1SPrashanth Swaminathan .globl C(ffi_flush_icache) 50*1fd5a2e1SPrashanth Swaminathan .type C(ffi_flush_icache),#function 51*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(C(ffi_flush_icache)) 52*1fd5a2e1SPrashanth Swaminathan 53*1fd5a2e1SPrashanth SwaminathanC(ffi_flush_icache): 54*1fd5a2e1SPrashanth Swaminathan1: iflush %o0 55*1fd5a2e1SPrashanth Swaminathan iflush %o+8 56*1fd5a2e1SPrashanth Swaminathan nop 57*1fd5a2e1SPrashanth Swaminathan nop 58*1fd5a2e1SPrashanth Swaminathan nop 59*1fd5a2e1SPrashanth Swaminathan nop 60*1fd5a2e1SPrashanth Swaminathan nop 61*1fd5a2e1SPrashanth Swaminathan retl 62*1fd5a2e1SPrashanth Swaminathan nop 63*1fd5a2e1SPrashanth Swaminathan .size C(ffi_flush_icache), . - C(ffi_flush_icache) 64*1fd5a2e1SPrashanth Swaminathan#endif 65*1fd5a2e1SPrashanth Swaminathan 66*1fd5a2e1SPrashanth Swaminathan#if defined(__sun__) && defined(__svr4__) 67*1fd5a2e1SPrashanth Swaminathan# define E(INDEX) .align 16 68*1fd5a2e1SPrashanth Swaminathan#else 69*1fd5a2e1SPrashanth Swaminathan# define E(INDEX) .align 16; .org 2b + INDEX * 16 70*1fd5a2e1SPrashanth Swaminathan#endif 71*1fd5a2e1SPrashanth Swaminathan 72*1fd5a2e1SPrashanth Swaminathan .align 8 73*1fd5a2e1SPrashanth Swaminathan .globl C(ffi_call_v8) 74*1fd5a2e1SPrashanth Swaminathan .type C(ffi_call_v8),#function 75*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(C(ffi_call_v8)) 76*1fd5a2e1SPrashanth Swaminathan 77*1fd5a2e1SPrashanth SwaminathanC(ffi_call_v8): 78*1fd5a2e1SPrashanth Swaminathan.LUW0: 79*1fd5a2e1SPrashanth Swaminathan ! Allocate a stack frame sized by ffi_call. 80*1fd5a2e1SPrashanth Swaminathan save %sp, %o4, %sp 81*1fd5a2e1SPrashanth Swaminathan.LUW1: 82*1fd5a2e1SPrashanth Swaminathan mov %i0, %o0 ! copy cif 83*1fd5a2e1SPrashanth Swaminathan add %sp, 64+32, %o1 ! load args area 84*1fd5a2e1SPrashanth Swaminathan mov %i2, %o2 ! copy rvalue 85*1fd5a2e1SPrashanth Swaminathan call C(ffi_prep_args_v8) 86*1fd5a2e1SPrashanth Swaminathan mov %i3, %o3 ! copy avalue 87*1fd5a2e1SPrashanth Swaminathan 88*1fd5a2e1SPrashanth Swaminathan add %sp, 32, %sp ! deallocate prep frame 89*1fd5a2e1SPrashanth Swaminathan and %o0, SPARC_FLAG_RET_MASK, %l0 ! save return type 90*1fd5a2e1SPrashanth Swaminathan srl %o0, SPARC_SIZEMASK_SHIFT, %l1 ! save return size 91*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+4], %o0 ! load all argument registers 92*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+8], %o1 93*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+12], %o2 94*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+16], %o3 95*1fd5a2e1SPrashanth Swaminathan cmp %l0, SPARC_RET_STRUCT ! struct return needs an unimp 4 96*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+20], %o4 97*1fd5a2e1SPrashanth Swaminathan be 8f 98*1fd5a2e1SPrashanth Swaminathan ld [%sp+64+24], %o5 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan ! Call foreign function 101*1fd5a2e1SPrashanth Swaminathan call %i1 102*1fd5a2e1SPrashanth Swaminathan mov %i5, %g2 ! load static chain 103*1fd5a2e1SPrashanth Swaminathan 104*1fd5a2e1SPrashanth Swaminathan0: call 1f ! load pc in %o7 105*1fd5a2e1SPrashanth Swaminathan sll %l0, 4, %l0 106*1fd5a2e1SPrashanth Swaminathan1: add %o7, %l0, %o7 ! o7 = 0b + ret_type*16 107*1fd5a2e1SPrashanth Swaminathan jmp %o7+(2f-0b) 108*1fd5a2e1SPrashanth Swaminathan nop 109*1fd5a2e1SPrashanth Swaminathan 110*1fd5a2e1SPrashanth Swaminathan ! Note that each entry is 4 insns, enforced by the E macro. 111*1fd5a2e1SPrashanth Swaminathan .align 16 112*1fd5a2e1SPrashanth Swaminathan2: 113*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_VOID) 114*1fd5a2e1SPrashanth Swaminathan ret 115*1fd5a2e1SPrashanth Swaminathan restore 116*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_STRUCT) 117*1fd5a2e1SPrashanth Swaminathan unimp 118*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT8) 119*1fd5a2e1SPrashanth Swaminathan and %o0, 0xff, %o0 120*1fd5a2e1SPrashanth Swaminathan st %o0, [%i2] 121*1fd5a2e1SPrashanth Swaminathan ret 122*1fd5a2e1SPrashanth Swaminathan restore 123*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT8) 124*1fd5a2e1SPrashanth Swaminathan sll %o0, 24, %o0 125*1fd5a2e1SPrashanth Swaminathan b 7f 126*1fd5a2e1SPrashanth Swaminathan sra %o0, 24, %o0 127*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT16) 128*1fd5a2e1SPrashanth Swaminathan sll %o0, 16, %o0 129*1fd5a2e1SPrashanth Swaminathan b 7f 130*1fd5a2e1SPrashanth Swaminathan srl %o0, 16, %o0 131*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT16) 132*1fd5a2e1SPrashanth Swaminathan sll %o0, 16, %o0 133*1fd5a2e1SPrashanth Swaminathan b 7f 134*1fd5a2e1SPrashanth Swaminathan sra %o0, 16, %o0 135*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT32) 136*1fd5a2e1SPrashanth Swaminathan7: st %o0, [%i2] 137*1fd5a2e1SPrashanth Swaminathan ret 138*1fd5a2e1SPrashanth Swaminathan restore 139*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX16) 140*1fd5a2e1SPrashanth Swaminathan sth %o0, [%i2+2] 141*1fd5a2e1SPrashanth Swaminathan b 9f 142*1fd5a2e1SPrashanth Swaminathan srl %o0, 16, %o0 143*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT64) 144*1fd5a2e1SPrashanth Swaminathan st %o0, [%i2] 145*1fd5a2e1SPrashanth Swaminathan st %o1, [%i2+4] 146*1fd5a2e1SPrashanth Swaminathan ret 147*1fd5a2e1SPrashanth Swaminathan restore 148*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT128) 149*1fd5a2e1SPrashanth Swaminathan std %o0, [%i2] 150*1fd5a2e1SPrashanth Swaminathan std %o2, [%i2+8] 151*1fd5a2e1SPrashanth Swaminathan ret 152*1fd5a2e1SPrashanth Swaminathan restore 153*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_8) 154*1fd5a2e1SPrashanth Swaminathan st %f7, [%i2+7*4] 155*1fd5a2e1SPrashanth Swaminathan nop 156*1fd5a2e1SPrashanth Swaminathan st %f6, [%i2+6*4] 157*1fd5a2e1SPrashanth Swaminathan nop 158*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_6) 159*1fd5a2e1SPrashanth Swaminathan st %f5, [%i2+5*4] 160*1fd5a2e1SPrashanth Swaminathan nop 161*1fd5a2e1SPrashanth Swaminathan st %f4, [%i2+4*4] 162*1fd5a2e1SPrashanth Swaminathan nop 163*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_4) 164*1fd5a2e1SPrashanth Swaminathan st %f3, [%i2+3*4] 165*1fd5a2e1SPrashanth Swaminathan nop 166*1fd5a2e1SPrashanth Swaminathan st %f2, [%i2+2*4] 167*1fd5a2e1SPrashanth Swaminathan nop 168*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_2) 169*1fd5a2e1SPrashanth Swaminathan st %f1, [%i2+4] 170*1fd5a2e1SPrashanth Swaminathan st %f0, [%i2] 171*1fd5a2e1SPrashanth Swaminathan ret 172*1fd5a2e1SPrashanth Swaminathan restore 173*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX8) 174*1fd5a2e1SPrashanth Swaminathan stb %o0, [%i2+1] 175*1fd5a2e1SPrashanth Swaminathan b 0f 176*1fd5a2e1SPrashanth Swaminathan srl %o0, 8, %o0 177*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_1) 178*1fd5a2e1SPrashanth Swaminathan st %f0, [%i2] 179*1fd5a2e1SPrashanth Swaminathan ret 180*1fd5a2e1SPrashanth Swaminathan restore 181*1fd5a2e1SPrashanth Swaminathan 182*1fd5a2e1SPrashanth Swaminathan .align 8 183*1fd5a2e1SPrashanth Swaminathan9: sth %o0, [%i2] 184*1fd5a2e1SPrashanth Swaminathan ret 185*1fd5a2e1SPrashanth Swaminathan restore 186*1fd5a2e1SPrashanth Swaminathan .align 8 187*1fd5a2e1SPrashanth Swaminathan0: stb %o0, [%i2] 188*1fd5a2e1SPrashanth Swaminathan ret 189*1fd5a2e1SPrashanth Swaminathan restore 190*1fd5a2e1SPrashanth Swaminathan 191*1fd5a2e1SPrashanth Swaminathan ! Struct returning functions expect and skip the unimp here. 192*1fd5a2e1SPrashanth Swaminathan ! To make it worse, conforming callees examine the unimp and 193*1fd5a2e1SPrashanth Swaminathan ! make sure the low 12 bits of the unimp match the size of 194*1fd5a2e1SPrashanth Swaminathan ! the struct being returned. 195*1fd5a2e1SPrashanth Swaminathan .align 8 196*1fd5a2e1SPrashanth Swaminathan8: call 1f ! load pc in %o7 197*1fd5a2e1SPrashanth Swaminathan sll %l1, 2, %l0 ! size * 4 198*1fd5a2e1SPrashanth Swaminathan1: sll %l1, 4, %l1 ! size * 16 199*1fd5a2e1SPrashanth Swaminathan add %l0, %l1, %l0 ! size * 20 200*1fd5a2e1SPrashanth Swaminathan add %o7, %l0, %o7 ! o7 = 8b + size*20 201*1fd5a2e1SPrashanth Swaminathan jmp %o7+(2f-8b) 202*1fd5a2e1SPrashanth Swaminathan mov %i5, %g2 ! load static chain 203*1fd5a2e1SPrashanth Swaminathan2: 204*1fd5a2e1SPrashanth Swaminathan 205*1fd5a2e1SPrashanth Swaminathan/* The Sun assembler doesn't understand .rept 0x1000. */ 206*1fd5a2e1SPrashanth Swaminathan#define rept1 \ 207*1fd5a2e1SPrashanth Swaminathan call %i1; \ 208*1fd5a2e1SPrashanth Swaminathan nop; \ 209*1fd5a2e1SPrashanth Swaminathan unimp (. - 2b) / 20; \ 210*1fd5a2e1SPrashanth Swaminathan ret; \ 211*1fd5a2e1SPrashanth Swaminathan restore 212*1fd5a2e1SPrashanth Swaminathan 213*1fd5a2e1SPrashanth Swaminathan#define rept16 \ 214*1fd5a2e1SPrashanth Swaminathan rept1; rept1; rept1; rept1; \ 215*1fd5a2e1SPrashanth Swaminathan rept1; rept1; rept1; rept1; \ 216*1fd5a2e1SPrashanth Swaminathan rept1; rept1; rept1; rept1; \ 217*1fd5a2e1SPrashanth Swaminathan rept1; rept1; rept1; rept1 218*1fd5a2e1SPrashanth Swaminathan 219*1fd5a2e1SPrashanth Swaminathan#define rept256 \ 220*1fd5a2e1SPrashanth Swaminathan rept16; rept16; rept16; rept16; \ 221*1fd5a2e1SPrashanth Swaminathan rept16; rept16; rept16; rept16; \ 222*1fd5a2e1SPrashanth Swaminathan rept16; rept16; rept16; rept16; \ 223*1fd5a2e1SPrashanth Swaminathan rept16; rept16; rept16; rept16 224*1fd5a2e1SPrashanth Swaminathan 225*1fd5a2e1SPrashanth Swaminathan rept256; rept256; rept256; rept256 226*1fd5a2e1SPrashanth Swaminathan rept256; rept256; rept256; rept256 227*1fd5a2e1SPrashanth Swaminathan rept256; rept256; rept256; rept256 228*1fd5a2e1SPrashanth Swaminathan rept256; rept256; rept256; rept256 229*1fd5a2e1SPrashanth Swaminathan 230*1fd5a2e1SPrashanth Swaminathan.LUW2: 231*1fd5a2e1SPrashanth Swaminathan .size C(ffi_call_v8),. - C(ffi_call_v8) 232*1fd5a2e1SPrashanth Swaminathan 233*1fd5a2e1SPrashanth Swaminathan 234*1fd5a2e1SPrashanth Swaminathan/* 16*4 register window + 1*4 struct return + 6*4 args backing store 235*1fd5a2e1SPrashanth Swaminathan + 8*4 return storage + 1*4 alignment. */ 236*1fd5a2e1SPrashanth Swaminathan#define STACKFRAME (16*4 + 4 + 6*4 + 8*4 + 4) 237*1fd5a2e1SPrashanth Swaminathan 238*1fd5a2e1SPrashanth Swaminathan/* ffi_closure_v8(...) 239*1fd5a2e1SPrashanth Swaminathan 240*1fd5a2e1SPrashanth Swaminathan Receives the closure argument in %g2. */ 241*1fd5a2e1SPrashanth Swaminathan 242*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_REGISTER_PSEUDO_OP 243*1fd5a2e1SPrashanth Swaminathan .register %g2, #scratch 244*1fd5a2e1SPrashanth Swaminathan#endif 245*1fd5a2e1SPrashanth Swaminathan 246*1fd5a2e1SPrashanth Swaminathan .align 8 247*1fd5a2e1SPrashanth Swaminathan .globl C(ffi_go_closure_v8) 248*1fd5a2e1SPrashanth Swaminathan .type C(ffi_go_closure_v8),#function 249*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(C(ffi_go_closure_v8)) 250*1fd5a2e1SPrashanth Swaminathan 251*1fd5a2e1SPrashanth SwaminathanC(ffi_go_closure_v8): 252*1fd5a2e1SPrashanth Swaminathan.LUW3: 253*1fd5a2e1SPrashanth Swaminathan save %sp, -STACKFRAME, %sp 254*1fd5a2e1SPrashanth Swaminathan.LUW4: 255*1fd5a2e1SPrashanth Swaminathan ld [%g2+4], %o0 ! load cif 256*1fd5a2e1SPrashanth Swaminathan ld [%g2+8], %o1 ! load fun 257*1fd5a2e1SPrashanth Swaminathan b 0f 258*1fd5a2e1SPrashanth Swaminathan mov %g2, %o2 ! load user_data 259*1fd5a2e1SPrashanth Swaminathan.LUW5: 260*1fd5a2e1SPrashanth Swaminathan .size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8) 261*1fd5a2e1SPrashanth Swaminathan 262*1fd5a2e1SPrashanth Swaminathan .align 8 263*1fd5a2e1SPrashanth Swaminathan .globl C(ffi_closure_v8) 264*1fd5a2e1SPrashanth Swaminathan .type C(ffi_closure_v8),#function 265*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(C(ffi_closure_v8)) 266*1fd5a2e1SPrashanth Swaminathan 267*1fd5a2e1SPrashanth SwaminathanC(ffi_closure_v8): 268*1fd5a2e1SPrashanth Swaminathan.LUW6: 269*1fd5a2e1SPrashanth Swaminathan save %sp, -STACKFRAME, %sp 270*1fd5a2e1SPrashanth Swaminathan.LUW7: 271*1fd5a2e1SPrashanth Swaminathan ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif 272*1fd5a2e1SPrashanth Swaminathan ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun 273*1fd5a2e1SPrashanth Swaminathan ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data 274*1fd5a2e1SPrashanth Swaminathan0: 275*1fd5a2e1SPrashanth Swaminathan ! Store all of the potential argument registers in va_list format. 276*1fd5a2e1SPrashanth Swaminathan st %i0, [%fp+68+0] 277*1fd5a2e1SPrashanth Swaminathan st %i1, [%fp+68+4] 278*1fd5a2e1SPrashanth Swaminathan st %i2, [%fp+68+8] 279*1fd5a2e1SPrashanth Swaminathan st %i3, [%fp+68+12] 280*1fd5a2e1SPrashanth Swaminathan st %i4, [%fp+68+16] 281*1fd5a2e1SPrashanth Swaminathan st %i5, [%fp+68+20] 282*1fd5a2e1SPrashanth Swaminathan 283*1fd5a2e1SPrashanth Swaminathan ! Call ffi_closure_sparc_inner to do the bulk of the work. 284*1fd5a2e1SPrashanth Swaminathan add %fp, -8*4, %o3 285*1fd5a2e1SPrashanth Swaminathan call ffi_closure_sparc_inner_v8 286*1fd5a2e1SPrashanth Swaminathan add %fp, 64, %o4 287*1fd5a2e1SPrashanth Swaminathan 288*1fd5a2e1SPrashanth Swaminathan0: call 1f 289*1fd5a2e1SPrashanth Swaminathan and %o0, SPARC_FLAG_RET_MASK, %o0 290*1fd5a2e1SPrashanth Swaminathan1: sll %o0, 4, %o0 ! o0 = o0 * 16 291*1fd5a2e1SPrashanth Swaminathan add %o7, %o0, %o7 ! o7 = 0b + o0*16 292*1fd5a2e1SPrashanth Swaminathan jmp %o7+(2f-0b) 293*1fd5a2e1SPrashanth Swaminathan add %fp, -8*4, %i2 294*1fd5a2e1SPrashanth Swaminathan 295*1fd5a2e1SPrashanth Swaminathan ! Note that each entry is 4 insns, enforced by the E macro. 296*1fd5a2e1SPrashanth Swaminathan .align 16 297*1fd5a2e1SPrashanth Swaminathan2: 298*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_VOID) 299*1fd5a2e1SPrashanth Swaminathan ret 300*1fd5a2e1SPrashanth Swaminathan restore 301*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_STRUCT) 302*1fd5a2e1SPrashanth Swaminathan ld [%i2], %i0 303*1fd5a2e1SPrashanth Swaminathan jmp %i7+12 304*1fd5a2e1SPrashanth Swaminathan restore 305*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT8) 306*1fd5a2e1SPrashanth Swaminathan ldub [%i2+3], %i0 307*1fd5a2e1SPrashanth Swaminathan ret 308*1fd5a2e1SPrashanth Swaminathan restore 309*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT8) 310*1fd5a2e1SPrashanth Swaminathan ldsb [%i2+3], %i0 311*1fd5a2e1SPrashanth Swaminathan ret 312*1fd5a2e1SPrashanth Swaminathan restore 313*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT16) 314*1fd5a2e1SPrashanth Swaminathan lduh [%i2+2], %i0 315*1fd5a2e1SPrashanth Swaminathan ret 316*1fd5a2e1SPrashanth Swaminathan restore 317*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_SINT16) 318*1fd5a2e1SPrashanth Swaminathan ldsh [%i2+2], %i0 319*1fd5a2e1SPrashanth Swaminathan ret 320*1fd5a2e1SPrashanth Swaminathan restore 321*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_UINT32) 322*1fd5a2e1SPrashanth Swaminathan ld [%i2], %i0 323*1fd5a2e1SPrashanth Swaminathan ret 324*1fd5a2e1SPrashanth Swaminathan restore 325*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX16) 326*1fd5a2e1SPrashanth Swaminathan ld [%i2], %i0 327*1fd5a2e1SPrashanth Swaminathan ret 328*1fd5a2e1SPrashanth Swaminathan restore 329*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT64) 330*1fd5a2e1SPrashanth Swaminathan ldd [%i2], %i0 331*1fd5a2e1SPrashanth Swaminathan ret 332*1fd5a2e1SPrashanth Swaminathan restore 333*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_INT128) 334*1fd5a2e1SPrashanth Swaminathan ldd [%i2], %i0 335*1fd5a2e1SPrashanth Swaminathan ldd [%i2+8], %i2 336*1fd5a2e1SPrashanth Swaminathan ret 337*1fd5a2e1SPrashanth Swaminathan restore 338*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_8) 339*1fd5a2e1SPrashanth Swaminathan ld [%i2+7*4], %f7 340*1fd5a2e1SPrashanth Swaminathan nop 341*1fd5a2e1SPrashanth Swaminathan ld [%i2+6*4], %f6 342*1fd5a2e1SPrashanth Swaminathan nop 343*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_6) 344*1fd5a2e1SPrashanth Swaminathan ld [%i2+5*4], %f5 345*1fd5a2e1SPrashanth Swaminathan nop 346*1fd5a2e1SPrashanth Swaminathan ld [%i2+4*4], %f4 347*1fd5a2e1SPrashanth Swaminathan nop 348*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_4) 349*1fd5a2e1SPrashanth Swaminathan ld [%i2+3*4], %f3 350*1fd5a2e1SPrashanth Swaminathan nop 351*1fd5a2e1SPrashanth Swaminathan ld [%i2+2*4], %f2 352*1fd5a2e1SPrashanth Swaminathan nop 353*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_2) 354*1fd5a2e1SPrashanth Swaminathan ldd [%i2], %f0 355*1fd5a2e1SPrashanth Swaminathan ret 356*1fd5a2e1SPrashanth Swaminathan restore 357*1fd5a2e1SPrashanth SwaminathanE(SP_V8_RET_CPLX8) 358*1fd5a2e1SPrashanth Swaminathan lduh [%i2], %i0 359*1fd5a2e1SPrashanth Swaminathan ret 360*1fd5a2e1SPrashanth Swaminathan restore 361*1fd5a2e1SPrashanth SwaminathanE(SPARC_RET_F_1) 362*1fd5a2e1SPrashanth Swaminathan ld [%i2], %f0 363*1fd5a2e1SPrashanth Swaminathan ret 364*1fd5a2e1SPrashanth Swaminathan restore 365*1fd5a2e1SPrashanth Swaminathan 366*1fd5a2e1SPrashanth Swaminathan.LUW8: 367*1fd5a2e1SPrashanth Swaminathan .size C(ffi_closure_v8), . - C(ffi_closure_v8) 368*1fd5a2e1SPrashanth Swaminathan 369*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_RO_EH_FRAME 370*1fd5a2e1SPrashanth Swaminathan .section ".eh_frame",#alloc 371*1fd5a2e1SPrashanth Swaminathan#else 372*1fd5a2e1SPrashanth Swaminathan .section ".eh_frame",#alloc,#write 373*1fd5a2e1SPrashanth Swaminathan#endif 374*1fd5a2e1SPrashanth Swaminathan 375*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_SPARC_UA_PCREL 376*1fd5a2e1SPrashanth Swaminathan# define FDE_ADDR(X) %r_disp32(X) 377*1fd5a2e1SPrashanth Swaminathan#else 378*1fd5a2e1SPrashanth Swaminathan# define FDE_ADDR(X) X 379*1fd5a2e1SPrashanth Swaminathan#endif 380*1fd5a2e1SPrashanth Swaminathan 381*1fd5a2e1SPrashanth Swaminathan .align 4 382*1fd5a2e1SPrashanth Swaminathan.LCIE: 383*1fd5a2e1SPrashanth Swaminathan .long .LECIE - .LSCIE ! CIE Length 384*1fd5a2e1SPrashanth Swaminathan.LSCIE: 385*1fd5a2e1SPrashanth Swaminathan .long 0 ! CIE Identifier Tag 386*1fd5a2e1SPrashanth Swaminathan .byte 1 ! CIE Version 387*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" ! CIE Augmentation 388*1fd5a2e1SPrashanth Swaminathan .byte 4 ! CIE Code Alignment Factor 389*1fd5a2e1SPrashanth Swaminathan .byte 0x7c ! CIE Data Alignment Factor 390*1fd5a2e1SPrashanth Swaminathan .byte 15 ! CIE RA Column 391*1fd5a2e1SPrashanth Swaminathan .byte 1 ! Augmentation size 392*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_SPARC_UA_PCREL 393*1fd5a2e1SPrashanth Swaminathan .byte 0x1b ! FDE Encoding (pcrel sdata4) 394*1fd5a2e1SPrashanth Swaminathan#else 395*1fd5a2e1SPrashanth Swaminathan .byte 0x50 ! FDE Encoding (aligned absolute) 396*1fd5a2e1SPrashanth Swaminathan#endif 397*1fd5a2e1SPrashanth Swaminathan .byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0 398*1fd5a2e1SPrashanth Swaminathan .align 4 399*1fd5a2e1SPrashanth Swaminathan.LECIE: 400*1fd5a2e1SPrashanth Swaminathan 401*1fd5a2e1SPrashanth Swaminathan .long .LEFDE1 - .LSFDE1 ! FDE Length 402*1fd5a2e1SPrashanth Swaminathan.LSFDE1: 403*1fd5a2e1SPrashanth Swaminathan .long .LSFDE1 - .LCIE ! FDE CIE offset 404*1fd5a2e1SPrashanth Swaminathan .long FDE_ADDR(.LUW0) ! Initial location 405*1fd5a2e1SPrashanth Swaminathan .long .LUW2 - .LUW0 ! Address range 406*1fd5a2e1SPrashanth Swaminathan .byte 0 ! Augmentation size 407*1fd5a2e1SPrashanth Swaminathan .byte 0x40+1 ! DW_CFA_advance_loc 4 408*1fd5a2e1SPrashanth Swaminathan .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 409*1fd5a2e1SPrashanth Swaminathan .byte 0x2d ! DW_CFA_GNU_window_save 410*1fd5a2e1SPrashanth Swaminathan .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 411*1fd5a2e1SPrashanth Swaminathan .align 4 412*1fd5a2e1SPrashanth Swaminathan.LEFDE1: 413*1fd5a2e1SPrashanth Swaminathan 414*1fd5a2e1SPrashanth Swaminathan .long .LEFDE2 - .LSFDE2 ! FDE Length 415*1fd5a2e1SPrashanth Swaminathan.LSFDE2: 416*1fd5a2e1SPrashanth Swaminathan .long .LSFDE2 - .LCIE ! FDE CIE offset 417*1fd5a2e1SPrashanth Swaminathan .long FDE_ADDR(.LUW3) ! Initial location 418*1fd5a2e1SPrashanth Swaminathan .long .LUW5 - .LUW3 ! Address range 419*1fd5a2e1SPrashanth Swaminathan .byte 0 ! Augmentation size 420*1fd5a2e1SPrashanth Swaminathan .byte 0x40+1 ! DW_CFA_advance_loc 4 421*1fd5a2e1SPrashanth Swaminathan .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 422*1fd5a2e1SPrashanth Swaminathan .byte 0x2d ! DW_CFA_GNU_window_save 423*1fd5a2e1SPrashanth Swaminathan .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 424*1fd5a2e1SPrashanth Swaminathan .align 4 425*1fd5a2e1SPrashanth Swaminathan.LEFDE2: 426*1fd5a2e1SPrashanth Swaminathan 427*1fd5a2e1SPrashanth Swaminathan .long .LEFDE3 - .LSFDE3 ! FDE Length 428*1fd5a2e1SPrashanth Swaminathan.LSFDE3: 429*1fd5a2e1SPrashanth Swaminathan .long .LSFDE3 - .LCIE ! FDE CIE offset 430*1fd5a2e1SPrashanth Swaminathan .long FDE_ADDR(.LUW6) ! Initial location 431*1fd5a2e1SPrashanth Swaminathan .long .LUW8 - .LUW6 ! Address range 432*1fd5a2e1SPrashanth Swaminathan .byte 0 ! Augmentation size 433*1fd5a2e1SPrashanth Swaminathan .byte 0x40+1 ! DW_CFA_advance_loc 4 434*1fd5a2e1SPrashanth Swaminathan .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 435*1fd5a2e1SPrashanth Swaminathan .byte 0x2d ! DW_CFA_GNU_window_save 436*1fd5a2e1SPrashanth Swaminathan .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 437*1fd5a2e1SPrashanth Swaminathan .align 4 438*1fd5a2e1SPrashanth Swaminathan.LEFDE3: 439*1fd5a2e1SPrashanth Swaminathan 440*1fd5a2e1SPrashanth Swaminathan#endif /* !SPARC64 */ 441*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 442*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 443*1fd5a2e1SPrashanth Swaminathan#endif 444