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 PowerPC 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#include <powerpc/asm.h> 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan .file "ppc_closure.S" 33*1fd5a2e1SPrashanth Swaminathan 34*1fd5a2e1SPrashanth Swaminathan#ifndef POWERPC64 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN(ffi_closure_SYSV) 37*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_SYSV) 38*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 39*1fd5a2e1SPrashanth Swaminathan stwu %r1,-144(%r1) 40*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 41*1fd5a2e1SPrashanth Swaminathan mflr %r0 42*1fd5a2e1SPrashanth Swaminathan stw %r0,148(%r1) 43*1fd5a2e1SPrashanth Swaminathan .cfi_offset 65, 4 44*1fd5a2e1SPrashanth Swaminathan 45*1fd5a2e1SPrashanth Swaminathan# we want to build up an areas for the parameters passed 46*1fd5a2e1SPrashanth Swaminathan# in registers (both floating point and integer) 47*1fd5a2e1SPrashanth Swaminathan 48*1fd5a2e1SPrashanth Swaminathan # so first save gpr 3 to gpr 10 (aligned to 4) 49*1fd5a2e1SPrashanth Swaminathan stw %r3, 16(%r1) 50*1fd5a2e1SPrashanth Swaminathan stw %r4, 20(%r1) 51*1fd5a2e1SPrashanth Swaminathan stw %r5, 24(%r1) 52*1fd5a2e1SPrashanth Swaminathan 53*1fd5a2e1SPrashanth Swaminathan # set up registers for the routine that does the work 54*1fd5a2e1SPrashanth Swaminathan 55*1fd5a2e1SPrashanth Swaminathan # closure->cif 56*1fd5a2e1SPrashanth Swaminathan lwz %r3,FFI_TRAMPOLINE_SIZE(%r11) 57*1fd5a2e1SPrashanth Swaminathan # closure->fun 58*1fd5a2e1SPrashanth Swaminathan lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11) 59*1fd5a2e1SPrashanth Swaminathan # closure->user_data 60*1fd5a2e1SPrashanth Swaminathan lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11) 61*1fd5a2e1SPrashanth Swaminathan 62*1fd5a2e1SPrashanth Swaminathan.Ldoclosure: 63*1fd5a2e1SPrashanth Swaminathan stw %r6, 28(%r1) 64*1fd5a2e1SPrashanth Swaminathan stw %r7, 32(%r1) 65*1fd5a2e1SPrashanth Swaminathan stw %r8, 36(%r1) 66*1fd5a2e1SPrashanth Swaminathan stw %r9, 40(%r1) 67*1fd5a2e1SPrashanth Swaminathan stw %r10,44(%r1) 68*1fd5a2e1SPrashanth Swaminathan 69*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__ 70*1fd5a2e1SPrashanth Swaminathan # next save fpr 1 to fpr 8 (aligned to 8) 71*1fd5a2e1SPrashanth Swaminathan stfd %f1, 48(%r1) 72*1fd5a2e1SPrashanth Swaminathan stfd %f2, 56(%r1) 73*1fd5a2e1SPrashanth Swaminathan stfd %f3, 64(%r1) 74*1fd5a2e1SPrashanth Swaminathan stfd %f4, 72(%r1) 75*1fd5a2e1SPrashanth Swaminathan stfd %f5, 80(%r1) 76*1fd5a2e1SPrashanth Swaminathan stfd %f6, 88(%r1) 77*1fd5a2e1SPrashanth Swaminathan stfd %f7, 96(%r1) 78*1fd5a2e1SPrashanth Swaminathan stfd %f8, 104(%r1) 79*1fd5a2e1SPrashanth Swaminathan#endif 80*1fd5a2e1SPrashanth Swaminathan 81*1fd5a2e1SPrashanth Swaminathan # pointer to the result storage 82*1fd5a2e1SPrashanth Swaminathan addi %r6,%r1,112 83*1fd5a2e1SPrashanth Swaminathan 84*1fd5a2e1SPrashanth Swaminathan # pointer to the saved gpr registers 85*1fd5a2e1SPrashanth Swaminathan addi %r7,%r1,16 86*1fd5a2e1SPrashanth Swaminathan 87*1fd5a2e1SPrashanth Swaminathan # pointer to the saved fpr registers 88*1fd5a2e1SPrashanth Swaminathan addi %r8,%r1,48 89*1fd5a2e1SPrashanth Swaminathan 90*1fd5a2e1SPrashanth Swaminathan # pointer to the outgoing parameter save area in the previous frame 91*1fd5a2e1SPrashanth Swaminathan # i.e. the previous frame pointer + 8 92*1fd5a2e1SPrashanth Swaminathan addi %r9,%r1,152 93*1fd5a2e1SPrashanth Swaminathan 94*1fd5a2e1SPrashanth Swaminathan # make the call 95*1fd5a2e1SPrashanth Swaminathan bl ffi_closure_helper_SYSV@local 96*1fd5a2e1SPrashanth Swaminathan.Lret: 97*1fd5a2e1SPrashanth Swaminathan # now r3 contains the return type 98*1fd5a2e1SPrashanth Swaminathan # so use it to look up in a table 99*1fd5a2e1SPrashanth Swaminathan # so we know how to deal with each type 100*1fd5a2e1SPrashanth Swaminathan 101*1fd5a2e1SPrashanth Swaminathan # look up the proper starting point in table 102*1fd5a2e1SPrashanth Swaminathan # by using return type as offset 103*1fd5a2e1SPrashanth Swaminathan 104*1fd5a2e1SPrashanth Swaminathan mflr %r4 # move address of .Lret to r4 105*1fd5a2e1SPrashanth Swaminathan slwi %r3,%r3,4 # now multiply return type by 16 106*1fd5a2e1SPrashanth Swaminathan addi %r4, %r4, .Lret_type0 - .Lret 107*1fd5a2e1SPrashanth Swaminathan lwz %r0,148(%r1) 108*1fd5a2e1SPrashanth Swaminathan add %r3,%r3,%r4 # add contents of table to table address 109*1fd5a2e1SPrashanth Swaminathan mtctr %r3 110*1fd5a2e1SPrashanth Swaminathan bctr # jump to it 111*1fd5a2e1SPrashanth Swaminathan 112*1fd5a2e1SPrashanth Swaminathan# Each of the ret_typeX code fragments has to be exactly 16 bytes long 113*1fd5a2e1SPrashanth Swaminathan# (4 instructions). For cache effectiveness we align to a 16 byte boundary 114*1fd5a2e1SPrashanth Swaminathan# first. 115*1fd5a2e1SPrashanth Swaminathan .align 4 116*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_VOID 117*1fd5a2e1SPrashanth Swaminathan.Lret_type0: 118*1fd5a2e1SPrashanth Swaminathan mtlr %r0 119*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 120*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 121*1fd5a2e1SPrashanth Swaminathan blr 122*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 123*1fd5a2e1SPrashanth Swaminathan nop 124*1fd5a2e1SPrashanth Swaminathan 125*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_INT 126*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 127*1fd5a2e1SPrashanth Swaminathan mtlr %r0 128*1fd5a2e1SPrashanth Swaminathan.Lfinish: 129*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 130*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 131*1fd5a2e1SPrashanth Swaminathan blr 132*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 133*1fd5a2e1SPrashanth Swaminathan 134*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_FLOAT 135*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__ 136*1fd5a2e1SPrashanth Swaminathan lfs %f1,112+0(%r1) 137*1fd5a2e1SPrashanth Swaminathan#else 138*1fd5a2e1SPrashanth Swaminathan nop 139*1fd5a2e1SPrashanth Swaminathan#endif 140*1fd5a2e1SPrashanth Swaminathan mtlr %r0 141*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 142*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 143*1fd5a2e1SPrashanth Swaminathan blr 144*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 145*1fd5a2e1SPrashanth Swaminathan 146*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_DOUBLE 147*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__ 148*1fd5a2e1SPrashanth Swaminathan lfd %f1,112+0(%r1) 149*1fd5a2e1SPrashanth Swaminathan#else 150*1fd5a2e1SPrashanth Swaminathan nop 151*1fd5a2e1SPrashanth Swaminathan#endif 152*1fd5a2e1SPrashanth Swaminathan mtlr %r0 153*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 154*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 155*1fd5a2e1SPrashanth Swaminathan blr 156*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 157*1fd5a2e1SPrashanth Swaminathan 158*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_LONGDOUBLE 159*1fd5a2e1SPrashanth Swaminathan#ifndef __NO_FPRS__ 160*1fd5a2e1SPrashanth Swaminathan lfd %f1,112+0(%r1) 161*1fd5a2e1SPrashanth Swaminathan lfd %f2,112+8(%r1) 162*1fd5a2e1SPrashanth Swaminathan mtlr %r0 163*1fd5a2e1SPrashanth Swaminathan b .Lfinish 164*1fd5a2e1SPrashanth Swaminathan#else 165*1fd5a2e1SPrashanth Swaminathan mtlr %r0 166*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 167*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 168*1fd5a2e1SPrashanth Swaminathan blr 169*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 170*1fd5a2e1SPrashanth Swaminathan nop 171*1fd5a2e1SPrashanth Swaminathan#endif 172*1fd5a2e1SPrashanth Swaminathan 173*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT8 174*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 175*1fd5a2e1SPrashanth Swaminathan lbz %r3,112+0(%r1) 176*1fd5a2e1SPrashanth Swaminathan#else 177*1fd5a2e1SPrashanth Swaminathan lbz %r3,112+3(%r1) 178*1fd5a2e1SPrashanth Swaminathan#endif 179*1fd5a2e1SPrashanth Swaminathan mtlr %r0 180*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 181*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 182*1fd5a2e1SPrashanth Swaminathan blr 183*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 184*1fd5a2e1SPrashanth Swaminathan 185*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT8 186*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 187*1fd5a2e1SPrashanth Swaminathan lbz %r3,112+0(%r1) 188*1fd5a2e1SPrashanth Swaminathan#else 189*1fd5a2e1SPrashanth Swaminathan lbz %r3,112+3(%r1) 190*1fd5a2e1SPrashanth Swaminathan#endif 191*1fd5a2e1SPrashanth Swaminathan extsb %r3,%r3 192*1fd5a2e1SPrashanth Swaminathan mtlr %r0 193*1fd5a2e1SPrashanth Swaminathan b .Lfinish 194*1fd5a2e1SPrashanth Swaminathan 195*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT16 196*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 197*1fd5a2e1SPrashanth Swaminathan lhz %r3,112+0(%r1) 198*1fd5a2e1SPrashanth Swaminathan#else 199*1fd5a2e1SPrashanth Swaminathan lhz %r3,112+2(%r1) 200*1fd5a2e1SPrashanth Swaminathan#endif 201*1fd5a2e1SPrashanth Swaminathan mtlr %r0 202*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 203*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 204*1fd5a2e1SPrashanth Swaminathan blr 205*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 206*1fd5a2e1SPrashanth Swaminathan 207*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT16 208*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 209*1fd5a2e1SPrashanth Swaminathan lha %r3,112+0(%r1) 210*1fd5a2e1SPrashanth Swaminathan#else 211*1fd5a2e1SPrashanth Swaminathan lha %r3,112+2(%r1) 212*1fd5a2e1SPrashanth Swaminathan#endif 213*1fd5a2e1SPrashanth Swaminathan mtlr %r0 214*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 215*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 216*1fd5a2e1SPrashanth Swaminathan blr 217*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 218*1fd5a2e1SPrashanth Swaminathan 219*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT32 220*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 221*1fd5a2e1SPrashanth Swaminathan mtlr %r0 222*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 223*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 224*1fd5a2e1SPrashanth Swaminathan blr 225*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 226*1fd5a2e1SPrashanth Swaminathan 227*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT32 228*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 229*1fd5a2e1SPrashanth Swaminathan mtlr %r0 230*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 231*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 232*1fd5a2e1SPrashanth Swaminathan blr 233*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 234*1fd5a2e1SPrashanth Swaminathan 235*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT64 236*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 237*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 238*1fd5a2e1SPrashanth Swaminathan mtlr %r0 239*1fd5a2e1SPrashanth Swaminathan b .Lfinish 240*1fd5a2e1SPrashanth Swaminathan 241*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_SINT64 242*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 243*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 244*1fd5a2e1SPrashanth Swaminathan mtlr %r0 245*1fd5a2e1SPrashanth Swaminathan b .Lfinish 246*1fd5a2e1SPrashanth Swaminathan 247*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_STRUCT 248*1fd5a2e1SPrashanth Swaminathan mtlr %r0 249*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 250*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 251*1fd5a2e1SPrashanth Swaminathan blr 252*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 253*1fd5a2e1SPrashanth Swaminathan nop 254*1fd5a2e1SPrashanth Swaminathan 255*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_POINTER 256*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 257*1fd5a2e1SPrashanth Swaminathan mtlr %r0 258*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 259*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 260*1fd5a2e1SPrashanth Swaminathan blr 261*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 262*1fd5a2e1SPrashanth Swaminathan 263*1fd5a2e1SPrashanth Swaminathan# case FFI_TYPE_UINT128 264*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 265*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 266*1fd5a2e1SPrashanth Swaminathan lwz %r5,112+8(%r1) 267*1fd5a2e1SPrashanth Swaminathan b .Luint128 268*1fd5a2e1SPrashanth Swaminathan 269*1fd5a2e1SPrashanth Swaminathan# The return types below are only used when the ABI type is FFI_SYSV. 270*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. 271*1fd5a2e1SPrashanth Swaminathan lbz %r3,112+0(%r1) 272*1fd5a2e1SPrashanth Swaminathan mtlr %r0 273*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 274*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 275*1fd5a2e1SPrashanth Swaminathan blr 276*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 277*1fd5a2e1SPrashanth Swaminathan 278*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. 279*1fd5a2e1SPrashanth Swaminathan lhz %r3,112+0(%r1) 280*1fd5a2e1SPrashanth Swaminathan mtlr %r0 281*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 282*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 283*1fd5a2e1SPrashanth Swaminathan blr 284*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 285*1fd5a2e1SPrashanth Swaminathan 286*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. 287*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 288*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 289*1fd5a2e1SPrashanth Swaminathan mtlr %r0 290*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 291*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 292*1fd5a2e1SPrashanth Swaminathan blr 293*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 294*1fd5a2e1SPrashanth Swaminathan#else 295*1fd5a2e1SPrashanth Swaminathan srwi %r3,%r3,8 296*1fd5a2e1SPrashanth Swaminathan mtlr %r0 297*1fd5a2e1SPrashanth Swaminathan b .Lfinish 298*1fd5a2e1SPrashanth Swaminathan#endif 299*1fd5a2e1SPrashanth Swaminathan 300*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. 301*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 302*1fd5a2e1SPrashanth Swaminathan mtlr %r0 303*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 304*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 305*1fd5a2e1SPrashanth Swaminathan blr 306*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 307*1fd5a2e1SPrashanth Swaminathan 308*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. 309*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 310*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 311*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 312*1fd5a2e1SPrashanth Swaminathan mtlr %r0 313*1fd5a2e1SPrashanth Swaminathan b .Lfinish 314*1fd5a2e1SPrashanth Swaminathan#else 315*1fd5a2e1SPrashanth Swaminathan li %r5,24 316*1fd5a2e1SPrashanth Swaminathan b .Lstruct567 317*1fd5a2e1SPrashanth Swaminathan#endif 318*1fd5a2e1SPrashanth Swaminathan 319*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. 320*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 321*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 322*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 323*1fd5a2e1SPrashanth Swaminathan mtlr %r0 324*1fd5a2e1SPrashanth Swaminathan b .Lfinish 325*1fd5a2e1SPrashanth Swaminathan#else 326*1fd5a2e1SPrashanth Swaminathan li %r5,16 327*1fd5a2e1SPrashanth Swaminathan b .Lstruct567 328*1fd5a2e1SPrashanth Swaminathan#endif 329*1fd5a2e1SPrashanth Swaminathan 330*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. 331*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 332*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 333*1fd5a2e1SPrashanth Swaminathan#ifdef __LITTLE_ENDIAN__ 334*1fd5a2e1SPrashanth Swaminathan mtlr %r0 335*1fd5a2e1SPrashanth Swaminathan b .Lfinish 336*1fd5a2e1SPrashanth Swaminathan#else 337*1fd5a2e1SPrashanth Swaminathan li %r5,8 338*1fd5a2e1SPrashanth Swaminathan b .Lstruct567 339*1fd5a2e1SPrashanth Swaminathan#endif 340*1fd5a2e1SPrashanth Swaminathan 341*1fd5a2e1SPrashanth Swaminathan# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. 342*1fd5a2e1SPrashanth Swaminathan lwz %r3,112+0(%r1) 343*1fd5a2e1SPrashanth Swaminathan lwz %r4,112+4(%r1) 344*1fd5a2e1SPrashanth Swaminathan mtlr %r0 345*1fd5a2e1SPrashanth Swaminathan b .Lfinish 346*1fd5a2e1SPrashanth Swaminathan 347*1fd5a2e1SPrashanth Swaminathan#ifndef __LITTLE_ENDIAN__ 348*1fd5a2e1SPrashanth Swaminathan.Lstruct567: 349*1fd5a2e1SPrashanth Swaminathan subfic %r6,%r5,32 350*1fd5a2e1SPrashanth Swaminathan srw %r4,%r4,%r5 351*1fd5a2e1SPrashanth Swaminathan slw %r6,%r3,%r6 352*1fd5a2e1SPrashanth Swaminathan srw %r3,%r3,%r5 353*1fd5a2e1SPrashanth Swaminathan or %r4,%r6,%r4 354*1fd5a2e1SPrashanth Swaminathan mtlr %r0 355*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 356*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 357*1fd5a2e1SPrashanth Swaminathan blr 358*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 359*1fd5a2e1SPrashanth Swaminathan#endif 360*1fd5a2e1SPrashanth Swaminathan 361*1fd5a2e1SPrashanth Swaminathan.Luint128: 362*1fd5a2e1SPrashanth Swaminathan lwz %r6,112+12(%r1) 363*1fd5a2e1SPrashanth Swaminathan mtlr %r0 364*1fd5a2e1SPrashanth Swaminathan addi %r1,%r1,144 365*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 0 366*1fd5a2e1SPrashanth Swaminathan blr 367*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 368*1fd5a2e1SPrashanth SwaminathanEND(ffi_closure_SYSV) 369*1fd5a2e1SPrashanth Swaminathan 370*1fd5a2e1SPrashanth Swaminathan 371*1fd5a2e1SPrashanth SwaminathanFFI_HIDDEN(ffi_go_closure_sysv) 372*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_go_closure_sysv) 373*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 374*1fd5a2e1SPrashanth Swaminathan stwu %r1,-144(%r1) 375*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_offset 144 376*1fd5a2e1SPrashanth Swaminathan mflr %r0 377*1fd5a2e1SPrashanth Swaminathan stw %r0,148(%r1) 378*1fd5a2e1SPrashanth Swaminathan .cfi_offset 65, 4 379*1fd5a2e1SPrashanth Swaminathan 380*1fd5a2e1SPrashanth Swaminathan stw %r3, 16(%r1) 381*1fd5a2e1SPrashanth Swaminathan stw %r4, 20(%r1) 382*1fd5a2e1SPrashanth Swaminathan stw %r5, 24(%r1) 383*1fd5a2e1SPrashanth Swaminathan 384*1fd5a2e1SPrashanth Swaminathan # closure->cif 385*1fd5a2e1SPrashanth Swaminathan lwz %r3,4(%r11) 386*1fd5a2e1SPrashanth Swaminathan # closure->fun 387*1fd5a2e1SPrashanth Swaminathan lwz %r4,8(%r11) 388*1fd5a2e1SPrashanth Swaminathan # user_data 389*1fd5a2e1SPrashanth Swaminathan mr %r5,%r11 390*1fd5a2e1SPrashanth Swaminathan b .Ldoclosure 391*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 392*1fd5a2e1SPrashanth SwaminathanEND(ffi_go_closure_sysv) 393*1fd5a2e1SPrashanth Swaminathan 394*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 395*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 396*1fd5a2e1SPrashanth Swaminathan#endif 397*1fd5a2e1SPrashanth Swaminathan#endif 398