1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan sysv.h - Copyright (c) 2003 Jakub Jelinek <[email protected]> 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2008 Red Hat, Inc. 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathan PowerPC64 Assembly glue. 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#define LIBFFI_ASM 28*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 29*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan .file "linux64_closure.S" 32*1fd5a2e1SPrashanth Swaminathan 33*1fd5a2e1SPrashanth Swaminathan#ifdef POWERPC64 34*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN (ffi_closure_LINUX64) 35*1fd5a2e1SPrashanth Swaminathan .globl ffi_closure_LINUX64 36*1fd5a2e1SPrashanth Swaminathan# if _CALL_ELF == 2 37*1fd5a2e1SPrashanth Swaminathan .text 38*1fd5a2e1SPrashanth Swaminathanffi_closure_LINUX64: 39*1fd5a2e1SPrashanth Swaminathan addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha 40*1fd5a2e1SPrashanth Swaminathan addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l 41*1fd5a2e1SPrashanth Swaminathan .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 42*1fd5a2e1SPrashanth Swaminathan# else 43*1fd5a2e1SPrashanth Swaminathan .section ".opd","aw" 44*1fd5a2e1SPrashanth Swaminathan .align 3 45*1fd5a2e1SPrashanth Swaminathanffi_closure_LINUX64: 46*1fd5a2e1SPrashanth Swaminathan# ifdef _CALL_LINUX 47*1fd5a2e1SPrashanth Swaminathan .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 48*1fd5a2e1SPrashanth Swaminathan .type ffi_closure_LINUX64,@function 49*1fd5a2e1SPrashanth Swaminathan .text 50*1fd5a2e1SPrashanth Swaminathan.L.ffi_closure_LINUX64: 51*1fd5a2e1SPrashanth Swaminathan# else 52*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN (.ffi_closure_LINUX64) 53*1fd5a2e1SPrashanth Swaminathan .globl .ffi_closure_LINUX64 54*1fd5a2e1SPrashanth Swaminathan .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 55*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_LINUX64,24 56*1fd5a2e1SPrashanth Swaminathan .type .ffi_closure_LINUX64,@function 57*1fd5a2e1SPrashanth Swaminathan .text 58*1fd5a2e1SPrashanth Swaminathan.ffi_closure_LINUX64: 59*1fd5a2e1SPrashanth Swaminathan# endif 60*1fd5a2e1SPrashanth Swaminathan# endif 61*1fd5a2e1SPrashanth Swaminathan 62*1fd5a2e1SPrashanth Swaminathan# if _CALL_ELF == 2 63*1fd5a2e1SPrashanth Swaminathan# 32 byte special reg save area + 64 byte parm save area 64*1fd5a2e1SPrashanth Swaminathan# + 64 byte retval area + 13*8 fpr save area + round to 16 65*1fd5a2e1SPrashanth Swaminathan# define STACKFRAME 272 66*1fd5a2e1SPrashanth Swaminathan# define PARMSAVE 32 67*1fd5a2e1SPrashanth Swaminathan# define RETVAL PARMSAVE+64 68*1fd5a2e1SPrashanth Swaminathan# else 69*1fd5a2e1SPrashanth Swaminathan# 48 bytes special reg save area + 64 bytes parm save area 70*1fd5a2e1SPrashanth Swaminathan# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 71*1fd5a2e1SPrashanth Swaminathan# define STACKFRAME 240 72*1fd5a2e1SPrashanth Swaminathan# define PARMSAVE 48 73*1fd5a2e1SPrashanth Swaminathan# define RETVAL PARMSAVE+64 74*1fd5a2e1SPrashanth Swaminathan# endif 75*1fd5a2e1SPrashanth Swaminathan 76*1fd5a2e1SPrashanth Swaminathan.LFB1: 77*1fd5a2e1SPrashanth Swaminathan# if _CALL_ELF == 2 78*1fd5a2e1SPrashanth Swaminathan ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif 79*1fd5a2e1SPrashanth Swaminathan mflr %r0 80*1fd5a2e1SPrashanth Swaminathan lwz %r12, 28(%r12) # cif->flags 81*1fd5a2e1SPrashanth Swaminathan mtcrf 0x40, %r12 82*1fd5a2e1SPrashanth Swaminathan addi %r12, %r1, PARMSAVE 83*1fd5a2e1SPrashanth Swaminathan bt 7, .Lparmsave 84*1fd5a2e1SPrashanth Swaminathan # Our caller has not allocated a parameter save area. 85*1fd5a2e1SPrashanth Swaminathan # We need to allocate one here and use it to pass gprs to 86*1fd5a2e1SPrashanth Swaminathan # ffi_closure_helper_LINUX64. 87*1fd5a2e1SPrashanth Swaminathan addi %r12, %r1, -STACKFRAME+PARMSAVE 88*1fd5a2e1SPrashanth Swaminathan.Lparmsave: 89*1fd5a2e1SPrashanth Swaminathan std %r0, 16(%r1) 90*1fd5a2e1SPrashanth Swaminathan # Save general regs into parm save area 91*1fd5a2e1SPrashanth Swaminathan std %r3, 0(%r12) 92*1fd5a2e1SPrashanth Swaminathan std %r4, 8(%r12) 93*1fd5a2e1SPrashanth Swaminathan std %r5, 16(%r12) 94*1fd5a2e1SPrashanth Swaminathan std %r6, 24(%r12) 95*1fd5a2e1SPrashanth Swaminathan std %r7, 32(%r12) 96*1fd5a2e1SPrashanth Swaminathan std %r8, 40(%r12) 97*1fd5a2e1SPrashanth Swaminathan std %r9, 48(%r12) 98*1fd5a2e1SPrashanth Swaminathan std %r10, 56(%r12) 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan # load up the pointer to the parm save area 101*1fd5a2e1SPrashanth Swaminathan mr %r5, %r12 102*1fd5a2e1SPrashanth Swaminathan# else 103*1fd5a2e1SPrashanth Swaminathan # copy r2 to r11 and load TOC into r2 104*1fd5a2e1SPrashanth Swaminathan mr %r11, %r2 105*1fd5a2e1SPrashanth Swaminathan ld %r2, 16(%r11) 106*1fd5a2e1SPrashanth Swaminathan 107*1fd5a2e1SPrashanth Swaminathan mflr %r0 108*1fd5a2e1SPrashanth Swaminathan # Save general regs into parm save area 109*1fd5a2e1SPrashanth Swaminathan # This is the parameter save area set up by our caller. 110*1fd5a2e1SPrashanth Swaminathan std %r3, PARMSAVE+0(%r1) 111*1fd5a2e1SPrashanth Swaminathan std %r4, PARMSAVE+8(%r1) 112*1fd5a2e1SPrashanth Swaminathan std %r5, PARMSAVE+16(%r1) 113*1fd5a2e1SPrashanth Swaminathan std %r6, PARMSAVE+24(%r1) 114*1fd5a2e1SPrashanth Swaminathan std %r7, PARMSAVE+32(%r1) 115*1fd5a2e1SPrashanth Swaminathan std %r8, PARMSAVE+40(%r1) 116*1fd5a2e1SPrashanth Swaminathan std %r9, PARMSAVE+48(%r1) 117*1fd5a2e1SPrashanth Swaminathan std %r10, PARMSAVE+56(%r1) 118*1fd5a2e1SPrashanth Swaminathan 119*1fd5a2e1SPrashanth Swaminathan std %r0, 16(%r1) 120*1fd5a2e1SPrashanth Swaminathan 121*1fd5a2e1SPrashanth Swaminathan # load up the pointer to the parm save area 122*1fd5a2e1SPrashanth Swaminathan addi %r5, %r1, PARMSAVE 123*1fd5a2e1SPrashanth Swaminathan# endif 124*1fd5a2e1SPrashanth Swaminathan 125*1fd5a2e1SPrashanth Swaminathan # next save fpr 1 to fpr 13 126*1fd5a2e1SPrashanth Swaminathan stfd %f1, -104+(0*8)(%r1) 127*1fd5a2e1SPrashanth Swaminathan stfd %f2, -104+(1*8)(%r1) 128*1fd5a2e1SPrashanth Swaminathan stfd %f3, -104+(2*8)(%r1) 129*1fd5a2e1SPrashanth Swaminathan stfd %f4, -104+(3*8)(%r1) 130*1fd5a2e1SPrashanth Swaminathan stfd %f5, -104+(4*8)(%r1) 131*1fd5a2e1SPrashanth Swaminathan stfd %f6, -104+(5*8)(%r1) 132*1fd5a2e1SPrashanth Swaminathan stfd %f7, -104+(6*8)(%r1) 133*1fd5a2e1SPrashanth Swaminathan stfd %f8, -104+(7*8)(%r1) 134*1fd5a2e1SPrashanth Swaminathan stfd %f9, -104+(8*8)(%r1) 135*1fd5a2e1SPrashanth Swaminathan stfd %f10, -104+(9*8)(%r1) 136*1fd5a2e1SPrashanth Swaminathan stfd %f11, -104+(10*8)(%r1) 137*1fd5a2e1SPrashanth Swaminathan stfd %f12, -104+(11*8)(%r1) 138*1fd5a2e1SPrashanth Swaminathan stfd %f13, -104+(12*8)(%r1) 139*1fd5a2e1SPrashanth Swaminathan 140*1fd5a2e1SPrashanth Swaminathan # load up the pointer to the saved fpr registers */ 141*1fd5a2e1SPrashanth Swaminathan addi %r6, %r1, -104 142*1fd5a2e1SPrashanth Swaminathan 143*1fd5a2e1SPrashanth Swaminathan # load up the pointer to the result storage 144*1fd5a2e1SPrashanth Swaminathan addi %r4, %r1, -STACKFRAME+RETVAL 145*1fd5a2e1SPrashanth Swaminathan 146*1fd5a2e1SPrashanth Swaminathan stdu %r1, -STACKFRAME(%r1) 147*1fd5a2e1SPrashanth Swaminathan.LCFI0: 148*1fd5a2e1SPrashanth Swaminathan 149*1fd5a2e1SPrashanth Swaminathan # get the context pointer from the trampoline 150*1fd5a2e1SPrashanth Swaminathan mr %r3, %r11 151*1fd5a2e1SPrashanth Swaminathan 152*1fd5a2e1SPrashanth Swaminathan # make the call 153*1fd5a2e1SPrashanth Swaminathan# if defined _CALL_LINUX || _CALL_ELF == 2 154*1fd5a2e1SPrashanth Swaminathan bl ffi_closure_helper_LINUX64 155*1fd5a2e1SPrashanth Swaminathan# else 156*1fd5a2e1SPrashanth Swaminathan bl .ffi_closure_helper_LINUX64 157*1fd5a2e1SPrashanth Swaminathan# endif 158*1fd5a2e1SPrashanth Swaminathan.Lret: 159*1fd5a2e1SPrashanth Swaminathan 160*1fd5a2e1SPrashanth Swaminathan # now r3 contains the return type 161*1fd5a2e1SPrashanth Swaminathan # so use it to look up in a table 162*1fd5a2e1SPrashanth Swaminathan # so we know how to deal with each type 163*1fd5a2e1SPrashanth Swaminathan 164*1fd5a2e1SPrashanth Swaminathan # look up the proper starting point in table 165*1fd5a2e1SPrashanth Swaminathan # by using return type as offset 166*1fd5a2e1SPrashanth Swaminathan ld %r0, STACKFRAME+16(%r1) 167*1fd5a2e1SPrashanth Swaminathan cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT 168*1fd5a2e1SPrashanth Swaminathan bge .Lsmall 169*1fd5a2e1SPrashanth Swaminathan mflr %r4 # move address of .Lret to r4 170*1fd5a2e1SPrashanth Swaminathan sldi %r3, %r3, 4 # now multiply return type by 16 171*1fd5a2e1SPrashanth Swaminathan addi %r4, %r4, .Lret_type0 - .Lret 172*1fd5a2e1SPrashanth Swaminathan add %r3, %r3, %r4 # add contents of table to table address 173*1fd5a2e1SPrashanth Swaminathan mtctr %r3 174*1fd5a2e1SPrashanth Swaminathan bctr # jump to it 175*1fd5a2e1SPrashanth Swaminathan 176*1fd5a2e1SPrashanth Swaminathan# Each of the ret_typeX code fragments has to be exactly 16 bytes long 177*1fd5a2e1SPrashanth Swaminathan# (4 instructions). For cache effectiveness we align to a 16 byte boundary 178*1fd5a2e1SPrashanth Swaminathan# first. 179*1fd5a2e1SPrashanth Swaminathan .align 4 180*1fd5a2e1SPrashanth Swaminathan 181*1fd5a2e1SPrashanth Swaminathan.Lret_type0: 182*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_VOID 183*1fd5a2e1SPrashanth Swaminathan mtlr %r0 184*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 185*1fd5a2e1SPrashanth Swaminathan blr 186*1fd5a2e1SPrashanth Swaminathan nop 187*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_INT 188*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 189*1fd5a2e1SPrashanth Swaminathan lwa %r3, RETVAL+0(%r1) 190*1fd5a2e1SPrashanth Swaminathan# else 191*1fd5a2e1SPrashanth Swaminathan lwa %r3, RETVAL+4(%r1) 192*1fd5a2e1SPrashanth Swaminathan# endif 193*1fd5a2e1SPrashanth Swaminathan mtlr %r0 194*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 195*1fd5a2e1SPrashanth Swaminathan blr 196*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_FLOAT 197*1fd5a2e1SPrashanth Swaminathan lfs %f1, RETVAL+0(%r1) 198*1fd5a2e1SPrashanth Swaminathan mtlr %r0 199*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 200*1fd5a2e1SPrashanth Swaminathan blr 201*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_DOUBLE 202*1fd5a2e1SPrashanth Swaminathan lfd %f1, RETVAL+0(%r1) 203*1fd5a2e1SPrashanth Swaminathan mtlr %r0 204*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 205*1fd5a2e1SPrashanth Swaminathan blr 206*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_LONGDOUBLE 207*1fd5a2e1SPrashanth Swaminathan lfd %f1, RETVAL+0(%r1) 208*1fd5a2e1SPrashanth Swaminathan mtlr %r0 209*1fd5a2e1SPrashanth Swaminathan lfd %f2, RETVAL+8(%r1) 210*1fd5a2e1SPrashanth Swaminathan b .Lfinish 211*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT8 212*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 213*1fd5a2e1SPrashanth Swaminathan lbz %r3, RETVAL+0(%r1) 214*1fd5a2e1SPrashanth Swaminathan# else 215*1fd5a2e1SPrashanth Swaminathan lbz %r3, RETVAL+7(%r1) 216*1fd5a2e1SPrashanth Swaminathan# endif 217*1fd5a2e1SPrashanth Swaminathan mtlr %r0 218*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 219*1fd5a2e1SPrashanth Swaminathan blr 220*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT8 221*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 222*1fd5a2e1SPrashanth Swaminathan lbz %r3, RETVAL+0(%r1) 223*1fd5a2e1SPrashanth Swaminathan# else 224*1fd5a2e1SPrashanth Swaminathan lbz %r3, RETVAL+7(%r1) 225*1fd5a2e1SPrashanth Swaminathan# endif 226*1fd5a2e1SPrashanth Swaminathan extsb %r3,%r3 227*1fd5a2e1SPrashanth Swaminathan mtlr %r0 228*1fd5a2e1SPrashanth Swaminathan b .Lfinish 229*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT16 230*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 231*1fd5a2e1SPrashanth Swaminathan lhz %r3, RETVAL+0(%r1) 232*1fd5a2e1SPrashanth Swaminathan# else 233*1fd5a2e1SPrashanth Swaminathan lhz %r3, RETVAL+6(%r1) 234*1fd5a2e1SPrashanth Swaminathan# endif 235*1fd5a2e1SPrashanth Swaminathan mtlr %r0 236*1fd5a2e1SPrashanth Swaminathan.Lfinish: 237*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 238*1fd5a2e1SPrashanth Swaminathan blr 239*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT16 240*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 241*1fd5a2e1SPrashanth Swaminathan lha %r3, RETVAL+0(%r1) 242*1fd5a2e1SPrashanth Swaminathan# else 243*1fd5a2e1SPrashanth Swaminathan lha %r3, RETVAL+6(%r1) 244*1fd5a2e1SPrashanth Swaminathan# endif 245*1fd5a2e1SPrashanth Swaminathan mtlr %r0 246*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 247*1fd5a2e1SPrashanth Swaminathan blr 248*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT32 249*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 250*1fd5a2e1SPrashanth Swaminathan lwz %r3, RETVAL+0(%r1) 251*1fd5a2e1SPrashanth Swaminathan# else 252*1fd5a2e1SPrashanth Swaminathan lwz %r3, RETVAL+4(%r1) 253*1fd5a2e1SPrashanth Swaminathan# endif 254*1fd5a2e1SPrashanth Swaminathan mtlr %r0 255*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 256*1fd5a2e1SPrashanth Swaminathan blr 257*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT32 258*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 259*1fd5a2e1SPrashanth Swaminathan lwa %r3, RETVAL+0(%r1) 260*1fd5a2e1SPrashanth Swaminathan# else 261*1fd5a2e1SPrashanth Swaminathan lwa %r3, RETVAL+4(%r1) 262*1fd5a2e1SPrashanth Swaminathan# endif 263*1fd5a2e1SPrashanth Swaminathan mtlr %r0 264*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 265*1fd5a2e1SPrashanth Swaminathan blr 266*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT64 267*1fd5a2e1SPrashanth Swaminathan ld %r3, RETVAL+0(%r1) 268*1fd5a2e1SPrashanth Swaminathan mtlr %r0 269*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 270*1fd5a2e1SPrashanth Swaminathan blr 271*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT64 272*1fd5a2e1SPrashanth Swaminathan ld %r3, RETVAL+0(%r1) 273*1fd5a2e1SPrashanth Swaminathan mtlr %r0 274*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 275*1fd5a2e1SPrashanth Swaminathan blr 276*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_STRUCT 277*1fd5a2e1SPrashanth Swaminathan mtlr %r0 278*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 279*1fd5a2e1SPrashanth Swaminathan blr 280*1fd5a2e1SPrashanth Swaminathan nop 281*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_POINTER 282*1fd5a2e1SPrashanth Swaminathan ld %r3, RETVAL+0(%r1) 283*1fd5a2e1SPrashanth Swaminathan mtlr %r0 284*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 285*1fd5a2e1SPrashanth Swaminathan blr 286*1fd5a2e1SPrashanth Swaminathan# case FFI_V2_TYPE_FLOAT_HOMOG 287*1fd5a2e1SPrashanth Swaminathan lfs %f1, RETVAL+0(%r1) 288*1fd5a2e1SPrashanth Swaminathan lfs %f2, RETVAL+4(%r1) 289*1fd5a2e1SPrashanth Swaminathan lfs %f3, RETVAL+8(%r1) 290*1fd5a2e1SPrashanth Swaminathan b .Lmorefloat 291*1fd5a2e1SPrashanth Swaminathan# case FFI_V2_TYPE_DOUBLE_HOMOG 292*1fd5a2e1SPrashanth Swaminathan lfd %f1, RETVAL+0(%r1) 293*1fd5a2e1SPrashanth Swaminathan lfd %f2, RETVAL+8(%r1) 294*1fd5a2e1SPrashanth Swaminathan lfd %f3, RETVAL+16(%r1) 295*1fd5a2e1SPrashanth Swaminathan lfd %f4, RETVAL+24(%r1) 296*1fd5a2e1SPrashanth Swaminathan mtlr %r0 297*1fd5a2e1SPrashanth Swaminathan lfd %f5, RETVAL+32(%r1) 298*1fd5a2e1SPrashanth Swaminathan lfd %f6, RETVAL+40(%r1) 299*1fd5a2e1SPrashanth Swaminathan lfd %f7, RETVAL+48(%r1) 300*1fd5a2e1SPrashanth Swaminathan lfd %f8, RETVAL+56(%r1) 301*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 302*1fd5a2e1SPrashanth Swaminathan blr 303*1fd5a2e1SPrashanth Swaminathan.Lmorefloat: 304*1fd5a2e1SPrashanth Swaminathan lfs %f4, RETVAL+12(%r1) 305*1fd5a2e1SPrashanth Swaminathan mtlr %r0 306*1fd5a2e1SPrashanth Swaminathan lfs %f5, RETVAL+16(%r1) 307*1fd5a2e1SPrashanth Swaminathan lfs %f6, RETVAL+20(%r1) 308*1fd5a2e1SPrashanth Swaminathan lfs %f7, RETVAL+24(%r1) 309*1fd5a2e1SPrashanth Swaminathan lfs %f8, RETVAL+28(%r1) 310*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 311*1fd5a2e1SPrashanth Swaminathan blr 312*1fd5a2e1SPrashanth Swaminathan.Lsmall: 313*1fd5a2e1SPrashanth Swaminathan# ifdef __LITTLE_ENDIAN__ 314*1fd5a2e1SPrashanth Swaminathan ld %r3,RETVAL+0(%r1) 315*1fd5a2e1SPrashanth Swaminathan mtlr %r0 316*1fd5a2e1SPrashanth Swaminathan ld %r4,RETVAL+8(%r1) 317*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 318*1fd5a2e1SPrashanth Swaminathan blr 319*1fd5a2e1SPrashanth Swaminathan# else 320*1fd5a2e1SPrashanth Swaminathan # A struct smaller than a dword is returned in the low bits of r3 321*1fd5a2e1SPrashanth Swaminathan # ie. right justified. Larger structs are passed left justified 322*1fd5a2e1SPrashanth Swaminathan # in r3 and r4. The return value area on the stack will have 323*1fd5a2e1SPrashanth Swaminathan # the structs as they are usually stored in memory. 324*1fd5a2e1SPrashanth Swaminathan cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes? 325*1fd5a2e1SPrashanth Swaminathan neg %r5, %r3 326*1fd5a2e1SPrashanth Swaminathan ld %r3,RETVAL+0(%r1) 327*1fd5a2e1SPrashanth Swaminathan blt .Lsmalldown 328*1fd5a2e1SPrashanth Swaminathan mtlr %r0 329*1fd5a2e1SPrashanth Swaminathan ld %r4,RETVAL+8(%r1) 330*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 331*1fd5a2e1SPrashanth Swaminathan blr 332*1fd5a2e1SPrashanth Swaminathan.Lsmalldown: 333*1fd5a2e1SPrashanth Swaminathan addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7 334*1fd5a2e1SPrashanth Swaminathan mtlr %r0 335*1fd5a2e1SPrashanth Swaminathan sldi %r5, %r5, 3 336*1fd5a2e1SPrashanth Swaminathan addi %r1, %r1, STACKFRAME 337*1fd5a2e1SPrashanth Swaminathan srd %r3, %r3, %r5 338*1fd5a2e1SPrashanth Swaminathan blr 339*1fd5a2e1SPrashanth Swaminathan# endif 340*1fd5a2e1SPrashanth Swaminathan 341*1fd5a2e1SPrashanth Swaminathan.LFE1: 342*1fd5a2e1SPrashanth Swaminathan .long 0 343*1fd5a2e1SPrashanth Swaminathan .byte 0,12,0,1,128,0,0,0 344*1fd5a2e1SPrashanth Swaminathan# if _CALL_ELF == 2 345*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_LINUX64,.-ffi_closure_LINUX64 346*1fd5a2e1SPrashanth Swaminathan# else 347*1fd5a2e1SPrashanth Swaminathan# ifdef _CALL_LINUX 348*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 349*1fd5a2e1SPrashanth Swaminathan# else 350*1fd5a2e1SPrashanth Swaminathan .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 351*1fd5a2e1SPrashanth Swaminathan# endif 352*1fd5a2e1SPrashanth Swaminathan# endif 353*1fd5a2e1SPrashanth Swaminathan 354*1fd5a2e1SPrashanth Swaminathan .section .eh_frame,EH_FRAME_FLAGS,@progbits 355*1fd5a2e1SPrashanth Swaminathan.Lframe1: 356*1fd5a2e1SPrashanth Swaminathan .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry 357*1fd5a2e1SPrashanth Swaminathan.LSCIE1: 358*1fd5a2e1SPrashanth Swaminathan .4byte 0x0 # CIE Identifier Tag 359*1fd5a2e1SPrashanth Swaminathan .byte 0x1 # CIE Version 360*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" # CIE Augmentation 361*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 # CIE Code Alignment Factor 362*1fd5a2e1SPrashanth Swaminathan .sleb128 -8 # CIE Data Alignment Factor 363*1fd5a2e1SPrashanth Swaminathan .byte 0x41 # CIE RA Column 364*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 # Augmentation size 365*1fd5a2e1SPrashanth Swaminathan .byte 0x14 # FDE Encoding (pcrel udata8) 366*1fd5a2e1SPrashanth Swaminathan .byte 0xc # DW_CFA_def_cfa 367*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 368*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 369*1fd5a2e1SPrashanth Swaminathan .align 3 370*1fd5a2e1SPrashanth Swaminathan.LECIE1: 371*1fd5a2e1SPrashanth Swaminathan.LSFDE1: 372*1fd5a2e1SPrashanth Swaminathan .4byte .LEFDE1-.LASFDE1 # FDE Length 373*1fd5a2e1SPrashanth Swaminathan.LASFDE1: 374*1fd5a2e1SPrashanth Swaminathan .4byte .LASFDE1-.Lframe1 # FDE CIE offset 375*1fd5a2e1SPrashanth Swaminathan .8byte .LFB1-. # FDE initial location 376*1fd5a2e1SPrashanth Swaminathan .8byte .LFE1-.LFB1 # FDE address range 377*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 # Augmentation size 378*1fd5a2e1SPrashanth Swaminathan .byte 0x2 # DW_CFA_advance_loc1 379*1fd5a2e1SPrashanth Swaminathan .byte .LCFI0-.LFB1 380*1fd5a2e1SPrashanth Swaminathan .byte 0xe # DW_CFA_def_cfa_offset 381*1fd5a2e1SPrashanth Swaminathan .uleb128 STACKFRAME 382*1fd5a2e1SPrashanth Swaminathan .byte 0x11 # DW_CFA_offset_extended_sf 383*1fd5a2e1SPrashanth Swaminathan .uleb128 0x41 384*1fd5a2e1SPrashanth Swaminathan .sleb128 -2 385*1fd5a2e1SPrashanth Swaminathan .align 3 386*1fd5a2e1SPrashanth Swaminathan.LEFDE1: 387*1fd5a2e1SPrashanth Swaminathan 388*1fd5a2e1SPrashanth Swaminathan# if defined __ELF__ && defined __linux__ 389*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 390*1fd5a2e1SPrashanth Swaminathan# endif 391*1fd5a2e1SPrashanth Swaminathan#endif 392