1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. 3*1fd5a2e1SPrashanth Swaminathan based on darwin.S by John Hornkvist 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, EXPRESS 19*1fd5a2e1SPrashanth Swaminathan OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21*1fd5a2e1SPrashanth Swaminathan IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR 22*1fd5a2e1SPrashanth Swaminathan OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23*1fd5a2e1SPrashanth Swaminathan ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24*1fd5a2e1SPrashanth Swaminathan OTHER DEALINGS IN THE SOFTWARE. 25*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 26*1fd5a2e1SPrashanth Swaminathan 27*1fd5a2e1SPrashanth Swaminathan .set r0,0 28*1fd5a2e1SPrashanth Swaminathan .set r1,1 29*1fd5a2e1SPrashanth Swaminathan .set r2,2 30*1fd5a2e1SPrashanth Swaminathan .set r3,3 31*1fd5a2e1SPrashanth Swaminathan .set r4,4 32*1fd5a2e1SPrashanth Swaminathan .set r5,5 33*1fd5a2e1SPrashanth Swaminathan .set r6,6 34*1fd5a2e1SPrashanth Swaminathan .set r7,7 35*1fd5a2e1SPrashanth Swaminathan .set r8,8 36*1fd5a2e1SPrashanth Swaminathan .set r9,9 37*1fd5a2e1SPrashanth Swaminathan .set r10,10 38*1fd5a2e1SPrashanth Swaminathan .set r11,11 39*1fd5a2e1SPrashanth Swaminathan .set r12,12 40*1fd5a2e1SPrashanth Swaminathan .set r13,13 41*1fd5a2e1SPrashanth Swaminathan .set r14,14 42*1fd5a2e1SPrashanth Swaminathan .set r15,15 43*1fd5a2e1SPrashanth Swaminathan .set r16,16 44*1fd5a2e1SPrashanth Swaminathan .set r17,17 45*1fd5a2e1SPrashanth Swaminathan .set r18,18 46*1fd5a2e1SPrashanth Swaminathan .set r19,19 47*1fd5a2e1SPrashanth Swaminathan .set r20,20 48*1fd5a2e1SPrashanth Swaminathan .set r21,21 49*1fd5a2e1SPrashanth Swaminathan .set r22,22 50*1fd5a2e1SPrashanth Swaminathan .set r23,23 51*1fd5a2e1SPrashanth Swaminathan .set r24,24 52*1fd5a2e1SPrashanth Swaminathan .set r25,25 53*1fd5a2e1SPrashanth Swaminathan .set r26,26 54*1fd5a2e1SPrashanth Swaminathan .set r27,27 55*1fd5a2e1SPrashanth Swaminathan .set r28,28 56*1fd5a2e1SPrashanth Swaminathan .set r29,29 57*1fd5a2e1SPrashanth Swaminathan .set r30,30 58*1fd5a2e1SPrashanth Swaminathan .set r31,31 59*1fd5a2e1SPrashanth Swaminathan .set f0,0 60*1fd5a2e1SPrashanth Swaminathan .set f1,1 61*1fd5a2e1SPrashanth Swaminathan .set f2,2 62*1fd5a2e1SPrashanth Swaminathan .set f3,3 63*1fd5a2e1SPrashanth Swaminathan .set f4,4 64*1fd5a2e1SPrashanth Swaminathan .set f5,5 65*1fd5a2e1SPrashanth Swaminathan .set f6,6 66*1fd5a2e1SPrashanth Swaminathan .set f7,7 67*1fd5a2e1SPrashanth Swaminathan .set f8,8 68*1fd5a2e1SPrashanth Swaminathan .set f9,9 69*1fd5a2e1SPrashanth Swaminathan .set f10,10 70*1fd5a2e1SPrashanth Swaminathan .set f11,11 71*1fd5a2e1SPrashanth Swaminathan .set f12,12 72*1fd5a2e1SPrashanth Swaminathan .set f13,13 73*1fd5a2e1SPrashanth Swaminathan .set f14,14 74*1fd5a2e1SPrashanth Swaminathan .set f15,15 75*1fd5a2e1SPrashanth Swaminathan .set f16,16 76*1fd5a2e1SPrashanth Swaminathan .set f17,17 77*1fd5a2e1SPrashanth Swaminathan .set f18,18 78*1fd5a2e1SPrashanth Swaminathan .set f19,19 79*1fd5a2e1SPrashanth Swaminathan .set f20,20 80*1fd5a2e1SPrashanth Swaminathan .set f21,21 81*1fd5a2e1SPrashanth Swaminathan 82*1fd5a2e1SPrashanth Swaminathan .extern .ffi_prep_args 83*1fd5a2e1SPrashanth Swaminathan 84*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 85*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 86*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 87*1fd5a2e1SPrashanth Swaminathan#define JUMPTARGET(name) name 88*1fd5a2e1SPrashanth Swaminathan#define L(x) x 89*1fd5a2e1SPrashanth Swaminathan .file "aix.S" 90*1fd5a2e1SPrashanth Swaminathan .toc 91*1fd5a2e1SPrashanth Swaminathan 92*1fd5a2e1SPrashanth Swaminathan /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, 93*1fd5a2e1SPrashanth Swaminathan * unsigned int flags, unsigned int *rvalue, 94*1fd5a2e1SPrashanth Swaminathan * void (*fn)(), 95*1fd5a2e1SPrashanth Swaminathan * void (*prep_args)(extended_cif*, unsigned *const)); 96*1fd5a2e1SPrashanth Swaminathan * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args 97*1fd5a2e1SPrashanth Swaminathan */ 98*1fd5a2e1SPrashanth Swaminathan 99*1fd5a2e1SPrashanth Swaminathan.csect .text[PR] 100*1fd5a2e1SPrashanth Swaminathan .align 2 101*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_AIX 102*1fd5a2e1SPrashanth Swaminathan .globl .ffi_call_AIX 103*1fd5a2e1SPrashanth Swaminathan.csect ffi_call_AIX[DS] 104*1fd5a2e1SPrashanth Swaminathanffi_call_AIX: 105*1fd5a2e1SPrashanth Swaminathan#ifdef __64BIT__ 106*1fd5a2e1SPrashanth Swaminathan .llong .ffi_call_AIX, TOC[tc0], 0 107*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 108*1fd5a2e1SPrashanth Swaminathan.ffi_call_AIX: 109*1fd5a2e1SPrashanth Swaminathan .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 110*1fd5a2e1SPrashanth Swaminathan .bf __LINE__ 111*1fd5a2e1SPrashanth Swaminathan .line 1 112*1fd5a2e1SPrashanth SwaminathanLFB..0: 113*1fd5a2e1SPrashanth Swaminathan /* Save registers we use. */ 114*1fd5a2e1SPrashanth Swaminathan mflr r0 115*1fd5a2e1SPrashanth Swaminathan 116*1fd5a2e1SPrashanth Swaminathan std r28,-32(r1) 117*1fd5a2e1SPrashanth Swaminathan std r29,-24(r1) 118*1fd5a2e1SPrashanth Swaminathan std r30,-16(r1) 119*1fd5a2e1SPrashanth Swaminathan std r31, -8(r1) 120*1fd5a2e1SPrashanth Swaminathan 121*1fd5a2e1SPrashanth Swaminathan std r0, 16(r1) 122*1fd5a2e1SPrashanth SwaminathanLCFI..0: 123*1fd5a2e1SPrashanth Swaminathan mr r28, r1 /* our AP. */ 124*1fd5a2e1SPrashanth Swaminathan stdux r1, r1, r4 125*1fd5a2e1SPrashanth SwaminathanLCFI..1: 126*1fd5a2e1SPrashanth Swaminathan 127*1fd5a2e1SPrashanth Swaminathan /* Save arguments over call... */ 128*1fd5a2e1SPrashanth Swaminathan mr r31, r5 /* flags, */ 129*1fd5a2e1SPrashanth Swaminathan mr r30, r6 /* rvalue, */ 130*1fd5a2e1SPrashanth Swaminathan mr r29, r7 /* function address. */ 131*1fd5a2e1SPrashanth Swaminathan std r2, 40(r1) 132*1fd5a2e1SPrashanth Swaminathan 133*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 134*1fd5a2e1SPrashanth Swaminathan mr r4, r1 135*1fd5a2e1SPrashanth Swaminathan bl .ffi_prep_args 136*1fd5a2e1SPrashanth Swaminathan nop 137*1fd5a2e1SPrashanth Swaminathan 138*1fd5a2e1SPrashanth Swaminathan /* Now do the call. */ 139*1fd5a2e1SPrashanth Swaminathan ld r0, 0(r29) 140*1fd5a2e1SPrashanth Swaminathan ld r2, 8(r29) 141*1fd5a2e1SPrashanth Swaminathan ld r11, 16(r29) 142*1fd5a2e1SPrashanth Swaminathan /* Set up cr1 with bits 4-7 of the flags. */ 143*1fd5a2e1SPrashanth Swaminathan mtcrf 0x40, r31 144*1fd5a2e1SPrashanth Swaminathan mtctr r0 145*1fd5a2e1SPrashanth Swaminathan /* Load all those argument registers. */ 146*1fd5a2e1SPrashanth Swaminathan /* We have set up a nice stack frame, just load it into registers. */ 147*1fd5a2e1SPrashanth Swaminathan ld r3, 40+(1*8)(r1) 148*1fd5a2e1SPrashanth Swaminathan ld r4, 40+(2*8)(r1) 149*1fd5a2e1SPrashanth Swaminathan ld r5, 40+(3*8)(r1) 150*1fd5a2e1SPrashanth Swaminathan ld r6, 40+(4*8)(r1) 151*1fd5a2e1SPrashanth Swaminathan nop 152*1fd5a2e1SPrashanth Swaminathan ld r7, 40+(5*8)(r1) 153*1fd5a2e1SPrashanth Swaminathan ld r8, 40+(6*8)(r1) 154*1fd5a2e1SPrashanth Swaminathan ld r9, 40+(7*8)(r1) 155*1fd5a2e1SPrashanth Swaminathan ld r10,40+(8*8)(r1) 156*1fd5a2e1SPrashanth Swaminathan 157*1fd5a2e1SPrashanth SwaminathanL1: 158*1fd5a2e1SPrashanth Swaminathan /* Load all the FP registers. */ 159*1fd5a2e1SPrashanth Swaminathan bf 6,L2 /* 2f + 0x18 */ 160*1fd5a2e1SPrashanth Swaminathan lfd f1,-32-(13*8)(r28) 161*1fd5a2e1SPrashanth Swaminathan lfd f2,-32-(12*8)(r28) 162*1fd5a2e1SPrashanth Swaminathan lfd f3,-32-(11*8)(r28) 163*1fd5a2e1SPrashanth Swaminathan lfd f4,-32-(10*8)(r28) 164*1fd5a2e1SPrashanth Swaminathan nop 165*1fd5a2e1SPrashanth Swaminathan lfd f5,-32-(9*8)(r28) 166*1fd5a2e1SPrashanth Swaminathan lfd f6,-32-(8*8)(r28) 167*1fd5a2e1SPrashanth Swaminathan lfd f7,-32-(7*8)(r28) 168*1fd5a2e1SPrashanth Swaminathan lfd f8,-32-(6*8)(r28) 169*1fd5a2e1SPrashanth Swaminathan nop 170*1fd5a2e1SPrashanth Swaminathan lfd f9,-32-(5*8)(r28) 171*1fd5a2e1SPrashanth Swaminathan lfd f10,-32-(4*8)(r28) 172*1fd5a2e1SPrashanth Swaminathan lfd f11,-32-(3*8)(r28) 173*1fd5a2e1SPrashanth Swaminathan lfd f12,-32-(2*8)(r28) 174*1fd5a2e1SPrashanth Swaminathan nop 175*1fd5a2e1SPrashanth Swaminathan lfd f13,-32-(1*8)(r28) 176*1fd5a2e1SPrashanth Swaminathan 177*1fd5a2e1SPrashanth SwaminathanL2: 178*1fd5a2e1SPrashanth Swaminathan /* Make the call. */ 179*1fd5a2e1SPrashanth Swaminathan bctrl 180*1fd5a2e1SPrashanth Swaminathan ld r2, 40(r1) 181*1fd5a2e1SPrashanth Swaminathan 182*1fd5a2e1SPrashanth Swaminathan /* Now, deal with the return value. */ 183*1fd5a2e1SPrashanth Swaminathan mtcrf 0x01, r31 184*1fd5a2e1SPrashanth Swaminathan 185*1fd5a2e1SPrashanth Swaminathan bt 30, L(done_return_value) 186*1fd5a2e1SPrashanth Swaminathan bt 29, L(fp_return_value) 187*1fd5a2e1SPrashanth Swaminathan std r3, 0(r30) 188*1fd5a2e1SPrashanth Swaminathan 189*1fd5a2e1SPrashanth Swaminathan /* Fall through... */ 190*1fd5a2e1SPrashanth Swaminathan 191*1fd5a2e1SPrashanth SwaminathanL(done_return_value): 192*1fd5a2e1SPrashanth Swaminathan /* Restore the registers we used and return. */ 193*1fd5a2e1SPrashanth Swaminathan mr r1, r28 194*1fd5a2e1SPrashanth Swaminathan ld r0, 16(r28) 195*1fd5a2e1SPrashanth Swaminathan ld r28, -32(r1) 196*1fd5a2e1SPrashanth Swaminathan mtlr r0 197*1fd5a2e1SPrashanth Swaminathan ld r29, -24(r1) 198*1fd5a2e1SPrashanth Swaminathan ld r30, -16(r1) 199*1fd5a2e1SPrashanth Swaminathan ld r31, -8(r1) 200*1fd5a2e1SPrashanth Swaminathan blr 201*1fd5a2e1SPrashanth Swaminathan 202*1fd5a2e1SPrashanth SwaminathanL(fp_return_value): 203*1fd5a2e1SPrashanth Swaminathan bf 28, L(float_return_value) 204*1fd5a2e1SPrashanth Swaminathan stfd f1, 0(r30) 205*1fd5a2e1SPrashanth Swaminathan bf 31, L(done_return_value) 206*1fd5a2e1SPrashanth Swaminathan stfd f2, 8(r30) 207*1fd5a2e1SPrashanth Swaminathan b L(done_return_value) 208*1fd5a2e1SPrashanth SwaminathanL(float_return_value): 209*1fd5a2e1SPrashanth Swaminathan stfs f1, 0(r30) 210*1fd5a2e1SPrashanth Swaminathan b L(done_return_value) 211*1fd5a2e1SPrashanth SwaminathanLFE..0: 212*1fd5a2e1SPrashanth Swaminathan#else /* ! __64BIT__ */ 213*1fd5a2e1SPrashanth Swaminathan 214*1fd5a2e1SPrashanth Swaminathan .long .ffi_call_AIX, TOC[tc0], 0 215*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 216*1fd5a2e1SPrashanth Swaminathan.ffi_call_AIX: 217*1fd5a2e1SPrashanth Swaminathan .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 218*1fd5a2e1SPrashanth Swaminathan .bf __LINE__ 219*1fd5a2e1SPrashanth Swaminathan .line 1 220*1fd5a2e1SPrashanth SwaminathanLFB..0: 221*1fd5a2e1SPrashanth Swaminathan /* Save registers we use. */ 222*1fd5a2e1SPrashanth Swaminathan mflr r0 223*1fd5a2e1SPrashanth Swaminathan 224*1fd5a2e1SPrashanth Swaminathan stw r28,-16(r1) 225*1fd5a2e1SPrashanth Swaminathan stw r29,-12(r1) 226*1fd5a2e1SPrashanth Swaminathan stw r30, -8(r1) 227*1fd5a2e1SPrashanth Swaminathan stw r31, -4(r1) 228*1fd5a2e1SPrashanth Swaminathan 229*1fd5a2e1SPrashanth Swaminathan stw r0, 8(r1) 230*1fd5a2e1SPrashanth SwaminathanLCFI..0: 231*1fd5a2e1SPrashanth Swaminathan mr r28, r1 /* out AP. */ 232*1fd5a2e1SPrashanth Swaminathan stwux r1, r1, r4 233*1fd5a2e1SPrashanth SwaminathanLCFI..1: 234*1fd5a2e1SPrashanth Swaminathan 235*1fd5a2e1SPrashanth Swaminathan /* Save arguments over call... */ 236*1fd5a2e1SPrashanth Swaminathan mr r31, r5 /* flags, */ 237*1fd5a2e1SPrashanth Swaminathan mr r30, r6 /* rvalue, */ 238*1fd5a2e1SPrashanth Swaminathan mr r29, r7 /* function address, */ 239*1fd5a2e1SPrashanth Swaminathan stw r2, 20(r1) 240*1fd5a2e1SPrashanth Swaminathan 241*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 242*1fd5a2e1SPrashanth Swaminathan mr r4, r1 243*1fd5a2e1SPrashanth Swaminathan bl .ffi_prep_args 244*1fd5a2e1SPrashanth Swaminathan nop 245*1fd5a2e1SPrashanth Swaminathan 246*1fd5a2e1SPrashanth Swaminathan /* Now do the call. */ 247*1fd5a2e1SPrashanth Swaminathan lwz r0, 0(r29) 248*1fd5a2e1SPrashanth Swaminathan lwz r2, 4(r29) 249*1fd5a2e1SPrashanth Swaminathan lwz r11, 8(r29) 250*1fd5a2e1SPrashanth Swaminathan /* Set up cr1 with bits 4-7 of the flags. */ 251*1fd5a2e1SPrashanth Swaminathan mtcrf 0x40, r31 252*1fd5a2e1SPrashanth Swaminathan mtctr r0 253*1fd5a2e1SPrashanth Swaminathan /* Load all those argument registers. */ 254*1fd5a2e1SPrashanth Swaminathan /* We have set up a nice stack frame, just load it into registers. */ 255*1fd5a2e1SPrashanth Swaminathan lwz r3, 20+(1*4)(r1) 256*1fd5a2e1SPrashanth Swaminathan lwz r4, 20+(2*4)(r1) 257*1fd5a2e1SPrashanth Swaminathan lwz r5, 20+(3*4)(r1) 258*1fd5a2e1SPrashanth Swaminathan lwz r6, 20+(4*4)(r1) 259*1fd5a2e1SPrashanth Swaminathan nop 260*1fd5a2e1SPrashanth Swaminathan lwz r7, 20+(5*4)(r1) 261*1fd5a2e1SPrashanth Swaminathan lwz r8, 20+(6*4)(r1) 262*1fd5a2e1SPrashanth Swaminathan lwz r9, 20+(7*4)(r1) 263*1fd5a2e1SPrashanth Swaminathan lwz r10,20+(8*4)(r1) 264*1fd5a2e1SPrashanth Swaminathan 265*1fd5a2e1SPrashanth SwaminathanL1: 266*1fd5a2e1SPrashanth Swaminathan /* Load all the FP registers. */ 267*1fd5a2e1SPrashanth Swaminathan bf 6,L2 /* 2f + 0x18 */ 268*1fd5a2e1SPrashanth Swaminathan lfd f1,-16-(13*8)(r28) 269*1fd5a2e1SPrashanth Swaminathan lfd f2,-16-(12*8)(r28) 270*1fd5a2e1SPrashanth Swaminathan lfd f3,-16-(11*8)(r28) 271*1fd5a2e1SPrashanth Swaminathan lfd f4,-16-(10*8)(r28) 272*1fd5a2e1SPrashanth Swaminathan nop 273*1fd5a2e1SPrashanth Swaminathan lfd f5,-16-(9*8)(r28) 274*1fd5a2e1SPrashanth Swaminathan lfd f6,-16-(8*8)(r28) 275*1fd5a2e1SPrashanth Swaminathan lfd f7,-16-(7*8)(r28) 276*1fd5a2e1SPrashanth Swaminathan lfd f8,-16-(6*8)(r28) 277*1fd5a2e1SPrashanth Swaminathan nop 278*1fd5a2e1SPrashanth Swaminathan lfd f9,-16-(5*8)(r28) 279*1fd5a2e1SPrashanth Swaminathan lfd f10,-16-(4*8)(r28) 280*1fd5a2e1SPrashanth Swaminathan lfd f11,-16-(3*8)(r28) 281*1fd5a2e1SPrashanth Swaminathan lfd f12,-16-(2*8)(r28) 282*1fd5a2e1SPrashanth Swaminathan nop 283*1fd5a2e1SPrashanth Swaminathan lfd f13,-16-(1*8)(r28) 284*1fd5a2e1SPrashanth Swaminathan 285*1fd5a2e1SPrashanth SwaminathanL2: 286*1fd5a2e1SPrashanth Swaminathan /* Make the call. */ 287*1fd5a2e1SPrashanth Swaminathan bctrl 288*1fd5a2e1SPrashanth Swaminathan lwz r2, 20(r1) 289*1fd5a2e1SPrashanth Swaminathan 290*1fd5a2e1SPrashanth Swaminathan /* Now, deal with the return value. */ 291*1fd5a2e1SPrashanth Swaminathan mtcrf 0x01, r31 292*1fd5a2e1SPrashanth Swaminathan 293*1fd5a2e1SPrashanth Swaminathan bt 30, L(done_return_value) 294*1fd5a2e1SPrashanth Swaminathan bt 29, L(fp_return_value) 295*1fd5a2e1SPrashanth Swaminathan stw r3, 0(r30) 296*1fd5a2e1SPrashanth Swaminathan bf 28, L(done_return_value) 297*1fd5a2e1SPrashanth Swaminathan stw r4, 4(r30) 298*1fd5a2e1SPrashanth Swaminathan 299*1fd5a2e1SPrashanth Swaminathan /* Fall through... */ 300*1fd5a2e1SPrashanth Swaminathan 301*1fd5a2e1SPrashanth SwaminathanL(done_return_value): 302*1fd5a2e1SPrashanth Swaminathan /* Restore the registers we used and return. */ 303*1fd5a2e1SPrashanth Swaminathan mr r1, r28 304*1fd5a2e1SPrashanth Swaminathan lwz r0, 8(r28) 305*1fd5a2e1SPrashanth Swaminathan lwz r28,-16(r1) 306*1fd5a2e1SPrashanth Swaminathan mtlr r0 307*1fd5a2e1SPrashanth Swaminathan lwz r29,-12(r1) 308*1fd5a2e1SPrashanth Swaminathan lwz r30, -8(r1) 309*1fd5a2e1SPrashanth Swaminathan lwz r31, -4(r1) 310*1fd5a2e1SPrashanth Swaminathan blr 311*1fd5a2e1SPrashanth Swaminathan 312*1fd5a2e1SPrashanth SwaminathanL(fp_return_value): 313*1fd5a2e1SPrashanth Swaminathan bf 28, L(float_return_value) 314*1fd5a2e1SPrashanth Swaminathan stfd f1, 0(r30) 315*1fd5a2e1SPrashanth Swaminathan b L(done_return_value) 316*1fd5a2e1SPrashanth SwaminathanL(float_return_value): 317*1fd5a2e1SPrashanth Swaminathan stfs f1, 0(r30) 318*1fd5a2e1SPrashanth Swaminathan b L(done_return_value) 319*1fd5a2e1SPrashanth SwaminathanLFE..0: 320*1fd5a2e1SPrashanth Swaminathan#endif 321*1fd5a2e1SPrashanth Swaminathan .ef __LINE__ 322*1fd5a2e1SPrashanth Swaminathan .long 0 323*1fd5a2e1SPrashanth Swaminathan .byte 0,0,0,1,128,4,0,0 324*1fd5a2e1SPrashanth Swaminathan/* END(ffi_call_AIX) */ 325*1fd5a2e1SPrashanth Swaminathan 326*1fd5a2e1SPrashanth Swaminathan /* void ffi_call_go_AIX(extended_cif *ecif, unsigned long bytes, 327*1fd5a2e1SPrashanth Swaminathan * unsigned int flags, unsigned int *rvalue, 328*1fd5a2e1SPrashanth Swaminathan * void (*fn)(), 329*1fd5a2e1SPrashanth Swaminathan * void (*prep_args)(extended_cif*, unsigned *const), 330*1fd5a2e1SPrashanth Swaminathan * void *closure); 331*1fd5a2e1SPrashanth Swaminathan * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args, r9=closure 332*1fd5a2e1SPrashanth Swaminathan */ 333*1fd5a2e1SPrashanth Swaminathan 334*1fd5a2e1SPrashanth Swaminathan.csect .text[PR] 335*1fd5a2e1SPrashanth Swaminathan .align 2 336*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_go_AIX 337*1fd5a2e1SPrashanth Swaminathan .globl .ffi_call_go_AIX 338*1fd5a2e1SPrashanth Swaminathan.csect ffi_call_go_AIX[DS] 339*1fd5a2e1SPrashanth Swaminathanffi_call_go_AIX: 340*1fd5a2e1SPrashanth Swaminathan#ifdef __64BIT__ 341*1fd5a2e1SPrashanth Swaminathan .llong .ffi_call_go_AIX, TOC[tc0], 0 342*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 343*1fd5a2e1SPrashanth Swaminathan.ffi_call_go_AIX: 344*1fd5a2e1SPrashanth Swaminathan .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 345*1fd5a2e1SPrashanth Swaminathan .bf __LINE__ 346*1fd5a2e1SPrashanth Swaminathan .line 1 347*1fd5a2e1SPrashanth SwaminathanLFB..1: 348*1fd5a2e1SPrashanth Swaminathan /* Save registers we use. */ 349*1fd5a2e1SPrashanth Swaminathan mflr r0 350*1fd5a2e1SPrashanth Swaminathan 351*1fd5a2e1SPrashanth Swaminathan std r28,-32(r1) 352*1fd5a2e1SPrashanth Swaminathan std r29,-24(r1) 353*1fd5a2e1SPrashanth Swaminathan std r30,-16(r1) 354*1fd5a2e1SPrashanth Swaminathan std r31, -8(r1) 355*1fd5a2e1SPrashanth Swaminathan 356*1fd5a2e1SPrashanth Swaminathan std r9, 8(r1) /* closure, saved in cr field. */ 357*1fd5a2e1SPrashanth Swaminathan std r0, 16(r1) 358*1fd5a2e1SPrashanth SwaminathanLCFI..2: 359*1fd5a2e1SPrashanth Swaminathan mr r28, r1 /* our AP. */ 360*1fd5a2e1SPrashanth Swaminathan stdux r1, r1, r4 361*1fd5a2e1SPrashanth SwaminathanLCFI..3: 362*1fd5a2e1SPrashanth Swaminathan 363*1fd5a2e1SPrashanth Swaminathan /* Save arguments over call... */ 364*1fd5a2e1SPrashanth Swaminathan mr r31, r5 /* flags, */ 365*1fd5a2e1SPrashanth Swaminathan mr r30, r6 /* rvalue, */ 366*1fd5a2e1SPrashanth Swaminathan mr r29, r7 /* function address, */ 367*1fd5a2e1SPrashanth Swaminathan std r2, 40(r1) 368*1fd5a2e1SPrashanth Swaminathan 369*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 370*1fd5a2e1SPrashanth Swaminathan mr r4, r1 371*1fd5a2e1SPrashanth Swaminathan bl .ffi_prep_args 372*1fd5a2e1SPrashanth Swaminathan nop 373*1fd5a2e1SPrashanth Swaminathan 374*1fd5a2e1SPrashanth Swaminathan /* Now do the call. */ 375*1fd5a2e1SPrashanth Swaminathan ld r0, 0(r29) 376*1fd5a2e1SPrashanth Swaminathan ld r2, 8(r29) 377*1fd5a2e1SPrashanth Swaminathan ld r11, 8(r28) /* closure */ 378*1fd5a2e1SPrashanth Swaminathan /* Set up cr1 with bits 4-7 of the flags. */ 379*1fd5a2e1SPrashanth Swaminathan mtcrf 0x40, r31 380*1fd5a2e1SPrashanth Swaminathan mtctr r0 381*1fd5a2e1SPrashanth Swaminathan /* Load all those argument registers. */ 382*1fd5a2e1SPrashanth Swaminathan /* We have set up a nice stack frame, just load it into registers. */ 383*1fd5a2e1SPrashanth Swaminathan ld r3, 40+(1*8)(r1) 384*1fd5a2e1SPrashanth Swaminathan ld r4, 40+(2*8)(r1) 385*1fd5a2e1SPrashanth Swaminathan ld r5, 40+(3*8)(r1) 386*1fd5a2e1SPrashanth Swaminathan ld r6, 40+(4*8)(r1) 387*1fd5a2e1SPrashanth Swaminathan nop 388*1fd5a2e1SPrashanth Swaminathan ld r7, 40+(5*8)(r1) 389*1fd5a2e1SPrashanth Swaminathan ld r8, 40+(6*8)(r1) 390*1fd5a2e1SPrashanth Swaminathan ld r9, 40+(7*8)(r1) 391*1fd5a2e1SPrashanth Swaminathan ld r10,40+(8*8)(r1) 392*1fd5a2e1SPrashanth Swaminathan 393*1fd5a2e1SPrashanth Swaminathan b L1 394*1fd5a2e1SPrashanth SwaminathanLFE..1: 395*1fd5a2e1SPrashanth Swaminathan#else /* ! __64BIT__ */ 396*1fd5a2e1SPrashanth Swaminathan 397*1fd5a2e1SPrashanth Swaminathan .long .ffi_call_go_AIX, TOC[tc0], 0 398*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 399*1fd5a2e1SPrashanth Swaminathan.ffi_call_go_AIX: 400*1fd5a2e1SPrashanth Swaminathan .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 401*1fd5a2e1SPrashanth Swaminathan .bf __LINE__ 402*1fd5a2e1SPrashanth Swaminathan .line 1 403*1fd5a2e1SPrashanth Swaminathan /* Save registers we use. */ 404*1fd5a2e1SPrashanth SwaminathanLFB..1: 405*1fd5a2e1SPrashanth Swaminathan mflr r0 406*1fd5a2e1SPrashanth Swaminathan 407*1fd5a2e1SPrashanth Swaminathan stw r28,-16(r1) 408*1fd5a2e1SPrashanth Swaminathan stw r29,-12(r1) 409*1fd5a2e1SPrashanth Swaminathan stw r30, -8(r1) 410*1fd5a2e1SPrashanth Swaminathan stw r31, -4(r1) 411*1fd5a2e1SPrashanth Swaminathan 412*1fd5a2e1SPrashanth Swaminathan stw r9, 4(r1) /* closure, saved in cr field. */ 413*1fd5a2e1SPrashanth Swaminathan stw r0, 8(r1) 414*1fd5a2e1SPrashanth SwaminathanLCFI..2: 415*1fd5a2e1SPrashanth Swaminathan mr r28, r1 /* out AP. */ 416*1fd5a2e1SPrashanth Swaminathan stwux r1, r1, r4 417*1fd5a2e1SPrashanth SwaminathanLCFI..3: 418*1fd5a2e1SPrashanth Swaminathan 419*1fd5a2e1SPrashanth Swaminathan /* Save arguments over call... */ 420*1fd5a2e1SPrashanth Swaminathan mr r31, r5 /* flags, */ 421*1fd5a2e1SPrashanth Swaminathan mr r30, r6 /* rvalue, */ 422*1fd5a2e1SPrashanth Swaminathan mr r29, r7 /* function address, */ 423*1fd5a2e1SPrashanth Swaminathan stw r2, 20(r1) 424*1fd5a2e1SPrashanth Swaminathan 425*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 426*1fd5a2e1SPrashanth Swaminathan mr r4, r1 427*1fd5a2e1SPrashanth Swaminathan bl .ffi_prep_args 428*1fd5a2e1SPrashanth Swaminathan nop 429*1fd5a2e1SPrashanth Swaminathan 430*1fd5a2e1SPrashanth Swaminathan /* Now do the call. */ 431*1fd5a2e1SPrashanth Swaminathan lwz r0, 0(r29) 432*1fd5a2e1SPrashanth Swaminathan lwz r2, 4(r29) 433*1fd5a2e1SPrashanth Swaminathan lwz r11, 4(r28) /* closure */ 434*1fd5a2e1SPrashanth Swaminathan /* Set up cr1 with bits 4-7 of the flags. */ 435*1fd5a2e1SPrashanth Swaminathan mtcrf 0x40, r31 436*1fd5a2e1SPrashanth Swaminathan mtctr r0 437*1fd5a2e1SPrashanth Swaminathan /* Load all those argument registers. */ 438*1fd5a2e1SPrashanth Swaminathan /* We have set up a nice stack frame, just load it into registers. */ 439*1fd5a2e1SPrashanth Swaminathan lwz r3, 20+(1*4)(r1) 440*1fd5a2e1SPrashanth Swaminathan lwz r4, 20+(2*4)(r1) 441*1fd5a2e1SPrashanth Swaminathan lwz r5, 20+(3*4)(r1) 442*1fd5a2e1SPrashanth Swaminathan lwz r6, 20+(4*4)(r1) 443*1fd5a2e1SPrashanth Swaminathan nop 444*1fd5a2e1SPrashanth Swaminathan lwz r7, 20+(5*4)(r1) 445*1fd5a2e1SPrashanth Swaminathan lwz r8, 20+(6*4)(r1) 446*1fd5a2e1SPrashanth Swaminathan lwz r9, 20+(7*4)(r1) 447*1fd5a2e1SPrashanth Swaminathan lwz r10,20+(8*4)(r1) 448*1fd5a2e1SPrashanth Swaminathan 449*1fd5a2e1SPrashanth Swaminathan b L1 450*1fd5a2e1SPrashanth SwaminathanLFE..1: 451*1fd5a2e1SPrashanth Swaminathan#endif 452*1fd5a2e1SPrashanth Swaminathan .ef __LINE__ 453*1fd5a2e1SPrashanth Swaminathan .long 0 454*1fd5a2e1SPrashanth Swaminathan .byte 0,0,0,1,128,4,0,0 455*1fd5a2e1SPrashanth Swaminathan/* END(ffi_call_go_AIX) */ 456*1fd5a2e1SPrashanth Swaminathan 457*1fd5a2e1SPrashanth Swaminathan.csect .text[PR] 458*1fd5a2e1SPrashanth Swaminathan .align 2 459*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_DARWIN 460*1fd5a2e1SPrashanth Swaminathan .globl .ffi_call_DARWIN 461*1fd5a2e1SPrashanth Swaminathan.csect ffi_call_DARWIN[DS] 462*1fd5a2e1SPrashanth Swaminathanffi_call_DARWIN: 463*1fd5a2e1SPrashanth Swaminathan#ifdef __64BIT__ 464*1fd5a2e1SPrashanth Swaminathan .llong .ffi_call_DARWIN, TOC[tc0], 0 465*1fd5a2e1SPrashanth Swaminathan#else 466*1fd5a2e1SPrashanth Swaminathan .long .ffi_call_DARWIN, TOC[tc0], 0 467*1fd5a2e1SPrashanth Swaminathan#endif 468*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 469*1fd5a2e1SPrashanth Swaminathan.ffi_call_DARWIN: 470*1fd5a2e1SPrashanth Swaminathan blr 471*1fd5a2e1SPrashanth Swaminathan .long 0 472*1fd5a2e1SPrashanth Swaminathan .byte 0,0,0,0,0,0,0,0 473*1fd5a2e1SPrashanth Swaminathan/* END(ffi_call_DARWIN) */ 474*1fd5a2e1SPrashanth Swaminathan 475*1fd5a2e1SPrashanth Swaminathan/* EH frame stuff. */ 476*1fd5a2e1SPrashanth Swaminathan 477*1fd5a2e1SPrashanth Swaminathan#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ 478*1fd5a2e1SPrashanth Swaminathan#ifdef __64BIT__ 479*1fd5a2e1SPrashanth Swaminathan#define PTRSIZE 8 480*1fd5a2e1SPrashanth Swaminathan#define LOG2_PTRSIZE 3 481*1fd5a2e1SPrashanth Swaminathan#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ 482*1fd5a2e1SPrashanth Swaminathan#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ 483*1fd5a2e1SPrashanth Swaminathan#else 484*1fd5a2e1SPrashanth Swaminathan#define PTRSIZE 4 485*1fd5a2e1SPrashanth Swaminathan#define LOG2_PTRSIZE 2 486*1fd5a2e1SPrashanth Swaminathan#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ 487*1fd5a2e1SPrashanth Swaminathan#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ 488*1fd5a2e1SPrashanth Swaminathan#endif 489*1fd5a2e1SPrashanth Swaminathan .csect _unwind.ro_[RO],4 490*1fd5a2e1SPrashanth Swaminathan .align LOG2_PTRSIZE 491*1fd5a2e1SPrashanth Swaminathan .globl _GLOBAL__F_libffi_src_powerpc_aix 492*1fd5a2e1SPrashanth Swaminathan_GLOBAL__F_libffi_src_powerpc_aix: 493*1fd5a2e1SPrashanth SwaminathanLframe..1: 494*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ 495*1fd5a2e1SPrashanth SwaminathanLSCIE..1: 496*1fd5a2e1SPrashanth Swaminathan .vbyte 4,0 /* CIE Identifier Tag */ 497*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* CIE Version */ 498*1fd5a2e1SPrashanth Swaminathan .byte "zR" /* CIE Augmentation */ 499*1fd5a2e1SPrashanth Swaminathan .byte 0 500*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ 501*1fd5a2e1SPrashanth Swaminathan .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ 502*1fd5a2e1SPrashanth Swaminathan .byte 0x41 /* CIE RA Column */ 503*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; Augmentation size */ 504*1fd5a2e1SPrashanth Swaminathan .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ 505*1fd5a2e1SPrashanth Swaminathan .byte 0xc /* DW_CFA_def_cfa */ 506*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; Register r1 */ 507*1fd5a2e1SPrashanth Swaminathan .byte 0 /* uleb128 0x0; Offset 0 */ 508*1fd5a2e1SPrashanth Swaminathan .align LOG2_PTRSIZE 509*1fd5a2e1SPrashanth SwaminathanLECIE..1: 510*1fd5a2e1SPrashanth SwaminathanLSFDE..1: 511*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ 512*1fd5a2e1SPrashanth SwaminathanLASFDE..1: 513*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ 514*1fd5a2e1SPrashanth Swaminathan .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ 515*1fd5a2e1SPrashanth Swaminathan .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ 516*1fd5a2e1SPrashanth Swaminathan .byte 0 /* uleb128 0x0; Augmentation size */ 517*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 518*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LCFI..0-LFB..0 519*1fd5a2e1SPrashanth Swaminathan .byte 0x11 /* DW_CFA_def_offset_extended_sf */ 520*1fd5a2e1SPrashanth Swaminathan .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ 521*1fd5a2e1SPrashanth Swaminathan .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ 522*1fd5a2e1SPrashanth Swaminathan .byte 0x9f /* DW_CFA_offset Register r31 */ 523*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ 524*1fd5a2e1SPrashanth Swaminathan .byte 0x9e /* DW_CFA_offset Register r30 */ 525*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ 526*1fd5a2e1SPrashanth Swaminathan .byte 0x9d /* DW_CFA_offset Register r29 */ 527*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ 528*1fd5a2e1SPrashanth Swaminathan .byte 0x9c /* DW_CFA_offset Register r28 */ 529*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ 530*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 531*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LCFI..1-LCFI..0 532*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 533*1fd5a2e1SPrashanth Swaminathan .byte 0x1c /* uleb128 28; Register r28 */ 534*1fd5a2e1SPrashanth Swaminathan .align LOG2_PTRSIZE 535*1fd5a2e1SPrashanth SwaminathanLEFDE..1: 536*1fd5a2e1SPrashanth SwaminathanLSFDE..2: 537*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ 538*1fd5a2e1SPrashanth SwaminathanLASFDE..2: 539*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ 540*1fd5a2e1SPrashanth Swaminathan .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ 541*1fd5a2e1SPrashanth Swaminathan .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ 542*1fd5a2e1SPrashanth Swaminathan .byte 0 /* uleb128 0x0; Augmentation size */ 543*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 544*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LCFI..2-LFB..1 545*1fd5a2e1SPrashanth Swaminathan .byte 0x11 /* DW_CFA_def_offset_extended_sf */ 546*1fd5a2e1SPrashanth Swaminathan .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ 547*1fd5a2e1SPrashanth Swaminathan .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ 548*1fd5a2e1SPrashanth Swaminathan .byte 0x9f /* DW_CFA_offset Register r31 */ 549*1fd5a2e1SPrashanth Swaminathan .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ 550*1fd5a2e1SPrashanth Swaminathan .byte 0x9e /* DW_CFA_offset Register r30 */ 551*1fd5a2e1SPrashanth Swaminathan .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ 552*1fd5a2e1SPrashanth Swaminathan .byte 0x9d /* DW_CFA_offset Register r29 */ 553*1fd5a2e1SPrashanth Swaminathan .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ 554*1fd5a2e1SPrashanth Swaminathan .byte 0x9c /* DW_CFA_offset Register r28 */ 555*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ 556*1fd5a2e1SPrashanth Swaminathan .byte 0x4 /* DW_CFA_advance_loc4 */ 557*1fd5a2e1SPrashanth Swaminathan .vbyte 4,LCFI..3-LCFI..2 558*1fd5a2e1SPrashanth Swaminathan .byte 0xd /* DW_CFA_def_cfa_register */ 559*1fd5a2e1SPrashanth Swaminathan .byte 0x1c /* uleb128 28; Register r28 */ 560*1fd5a2e1SPrashanth Swaminathan .align LOG2_PTRSIZE 561*1fd5a2e1SPrashanth SwaminathanLEFDE..2: 562*1fd5a2e1SPrashanth Swaminathan .vbyte 4,0 /* End of FDEs */ 563*1fd5a2e1SPrashanth Swaminathan 564*1fd5a2e1SPrashanth Swaminathan .csect .text[PR] 565*1fd5a2e1SPrashanth Swaminathan .ref _GLOBAL__F_libffi_src_powerpc_aix /* Prevents garbage collection by AIX linker */ 566*1fd5a2e1SPrashanth Swaminathan 567