1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, 3*1fd5a2e1SPrashanth Swaminathan Free Software Foundation, Inc. 4*1fd5a2e1SPrashanth Swaminathan based on ppc_closure.S 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan PowerPC Assembly glue. 7*1fd5a2e1SPrashanth Swaminathan 8*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 9*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 10*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 11*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 12*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 13*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 14*1fd5a2e1SPrashanth Swaminathan the following conditions: 15*1fd5a2e1SPrashanth Swaminathan 16*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 17*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS 20*1fd5a2e1SPrashanth Swaminathan OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22*1fd5a2e1SPrashanth Swaminathan IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR 23*1fd5a2e1SPrashanth Swaminathan OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 24*1fd5a2e1SPrashanth Swaminathan ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25*1fd5a2e1SPrashanth Swaminathan OTHER DEALINGS IN THE SOFTWARE. 26*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 29*1fd5a2e1SPrashanth Swaminathan#define L(x) x 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 32*1fd5a2e1SPrashanth Swaminathan#define MODE_CHOICE(x, y) y 33*1fd5a2e1SPrashanth Swaminathan#else 34*1fd5a2e1SPrashanth Swaminathan#define MODE_CHOICE(x, y) x 35*1fd5a2e1SPrashanth Swaminathan#endif 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan#define machine_choice MODE_CHOICE(ppc7400,ppc64) 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan; Define some pseudo-opcodes for size-independent load & store of GPRs ... 40*1fd5a2e1SPrashanth Swaminathan#define lgu MODE_CHOICE(lwzu, ldu) 41*1fd5a2e1SPrashanth Swaminathan#define lg MODE_CHOICE(lwz,ld) 42*1fd5a2e1SPrashanth Swaminathan#define sg MODE_CHOICE(stw,std) 43*1fd5a2e1SPrashanth Swaminathan#define sgu MODE_CHOICE(stwu,stdu) 44*1fd5a2e1SPrashanth Swaminathan 45*1fd5a2e1SPrashanth Swaminathan; ... and the size of GPRs and their storage indicator. 46*1fd5a2e1SPrashanth Swaminathan#define GPR_BYTES MODE_CHOICE(4,8) 47*1fd5a2e1SPrashanth Swaminathan#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ 48*1fd5a2e1SPrashanth Swaminathan#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. 51*1fd5a2e1SPrashanth Swaminathan#define LINKAGE_SIZE MODE_CHOICE(24,48) 52*1fd5a2e1SPrashanth Swaminathan#define PARAM_AREA MODE_CHOICE(32,64) 53*1fd5a2e1SPrashanth Swaminathan 54*1fd5a2e1SPrashanth Swaminathan#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ 55*1fd5a2e1SPrashanth Swaminathan#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ 56*1fd5a2e1SPrashanth Swaminathan 57*1fd5a2e1SPrashanth Swaminathan/* WARNING: if ffi_type is changed... here be monsters. 58*1fd5a2e1SPrashanth Swaminathan Offsets of items within the result type. */ 59*1fd5a2e1SPrashanth Swaminathan#define FFI_TYPE_TYPE MODE_CHOICE(6,10) 60*1fd5a2e1SPrashanth Swaminathan#define FFI_TYPE_ELEM MODE_CHOICE(8,16) 61*1fd5a2e1SPrashanth Swaminathan 62*1fd5a2e1SPrashanth Swaminathan#define SAVED_FPR_COUNT 13 63*1fd5a2e1SPrashanth Swaminathan#define FPR_SIZE 8 64*1fd5a2e1SPrashanth Swaminathan/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ 65*1fd5a2e1SPrashanth Swaminathan#define RESULT_BYTES MODE_CHOICE(16,176) 66*1fd5a2e1SPrashanth Swaminathan 67*1fd5a2e1SPrashanth Swaminathan; The whole stack frame **MUST** be 16byte-aligned. 68*1fd5a2e1SPrashanth Swaminathan#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) 69*1fd5a2e1SPrashanth Swaminathan#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) 70*1fd5a2e1SPrashanth Swaminathan 71*1fd5a2e1SPrashanth Swaminathan#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) 72*1fd5a2e1SPrashanth Swaminathan#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) 73*1fd5a2e1SPrashanth Swaminathan 74*1fd5a2e1SPrashanth Swaminathan#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 75*1fd5a2e1SPrashanth Swaminathan; We no longer need the pic symbol stub for Darwin >= 9. 76*1fd5a2e1SPrashanth Swaminathan#define BLCLS_HELP _ffi_closure_helper_DARWIN 77*1fd5a2e1SPrashanth Swaminathan#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p 78*1fd5a2e1SPrashanth Swaminathan#define PASS_STR_FLOATS _darwin64_pass_struct_floats 79*1fd5a2e1SPrashanth Swaminathan#undef WANT_STUB 80*1fd5a2e1SPrashanth Swaminathan#else 81*1fd5a2e1SPrashanth Swaminathan#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub 82*1fd5a2e1SPrashanth Swaminathan#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub 83*1fd5a2e1SPrashanth Swaminathan#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub 84*1fd5a2e1SPrashanth Swaminathan#define WANT_STUB 85*1fd5a2e1SPrashanth Swaminathan#endif 86*1fd5a2e1SPrashanth Swaminathan 87*1fd5a2e1SPrashanth Swaminathan/* m32/m64 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan The stack layout looks like this: 90*1fd5a2e1SPrashanth Swaminathan 91*1fd5a2e1SPrashanth Swaminathan | Additional params... | | Higher address 92*1fd5a2e1SPrashanth Swaminathan ~ ~ ~ 93*1fd5a2e1SPrashanth Swaminathan | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS 94*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 95*1fd5a2e1SPrashanth Swaminathan | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | 96*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 97*1fd5a2e1SPrashanth Swaminathan | Reserved 2*4/8 | | 98*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 99*1fd5a2e1SPrashanth Swaminathan | Space for callee`s LR 4/8 | | 100*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 101*1fd5a2e1SPrashanth Swaminathan | Saved CR [low word for m64] 4/8 | | 102*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 103*1fd5a2e1SPrashanth Swaminathan | Current backchain pointer 4/8 |-/ Parent`s frame. 104*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| <+ <<< on entry to 105*1fd5a2e1SPrashanth Swaminathan | Result Bytes 16/176 | | 106*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 107*1fd5a2e1SPrashanth Swaminathan ~ padding to 16-byte alignment ~ ~ 108*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 109*1fd5a2e1SPrashanth Swaminathan | NUM_FPR_ARG_REGISTERS slots | | 110*1fd5a2e1SPrashanth Swaminathan | here fp13 .. fp1 13*8 | | 111*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 112*1fd5a2e1SPrashanth Swaminathan | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS 113*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | 114*1fd5a2e1SPrashanth Swaminathan | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | 115*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | stack | 116*1fd5a2e1SPrashanth Swaminathan | Reserved [compiler,binder] 2*4/8 | | grows | 117*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | down V 118*1fd5a2e1SPrashanth Swaminathan | Space for callees LR 4/8 | | 119*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | lower addresses 120*1fd5a2e1SPrashanth Swaminathan | Saved CR [low word for m64] 4/8 | | 121*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| | stack pointer here 122*1fd5a2e1SPrashanth Swaminathan | Current backchain pointer 4/8 |-/ during 123*1fd5a2e1SPrashanth Swaminathan |--------------------------------------------| <<< call. 124*1fd5a2e1SPrashanth Swaminathan 125*1fd5a2e1SPrashanth Swaminathan*/ 126*1fd5a2e1SPrashanth Swaminathan 127*1fd5a2e1SPrashanth Swaminathan .file "darwin_closure.S" 128*1fd5a2e1SPrashanth Swaminathan 129*1fd5a2e1SPrashanth Swaminathan .machine machine_choice 130*1fd5a2e1SPrashanth Swaminathan 131*1fd5a2e1SPrashanth Swaminathan .text 132*1fd5a2e1SPrashanth Swaminathan .globl _ffi_closure_ASM 133*1fd5a2e1SPrashanth Swaminathan .align LOG2_GPR_BYTES 134*1fd5a2e1SPrashanth Swaminathan_ffi_closure_ASM: 135*1fd5a2e1SPrashanth SwaminathanLFB1: 136*1fd5a2e1SPrashanth SwaminathanLstartcode: 137*1fd5a2e1SPrashanth Swaminathan mflr r0 /* extract return address */ 138*1fd5a2e1SPrashanth Swaminathan sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ 139*1fd5a2e1SPrashanth SwaminathanLCFI0: 140*1fd5a2e1SPrashanth Swaminathan sgu r1,-SAVE_SIZE(r1) /* skip over caller save area 141*1fd5a2e1SPrashanth Swaminathan keep stack aligned to 16. */ 142*1fd5a2e1SPrashanth SwaminathanLCFI1: 143*1fd5a2e1SPrashanth Swaminathan /* We want to build up an area for the parameters passed 144*1fd5a2e1SPrashanth Swaminathan in registers. (both floating point and integer) */ 145*1fd5a2e1SPrashanth Swaminathan 146*1fd5a2e1SPrashanth Swaminathan /* Put gpr 3 to gpr 10 in the parents outgoing area... 147*1fd5a2e1SPrashanth Swaminathan ... the remainder of any params that overflowed the regs will 148*1fd5a2e1SPrashanth Swaminathan follow here. */ 149*1fd5a2e1SPrashanth Swaminathan sg r3, (PARENT_PARM_BASE )(r1) 150*1fd5a2e1SPrashanth Swaminathan sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) 151*1fd5a2e1SPrashanth Swaminathan sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) 152*1fd5a2e1SPrashanth Swaminathan sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) 153*1fd5a2e1SPrashanth Swaminathan sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) 154*1fd5a2e1SPrashanth Swaminathan sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) 155*1fd5a2e1SPrashanth Swaminathan sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) 156*1fd5a2e1SPrashanth Swaminathan sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) 157*1fd5a2e1SPrashanth Swaminathan 158*1fd5a2e1SPrashanth Swaminathan /* We save fpr 1 to fpr 14 in our own save frame. */ 159*1fd5a2e1SPrashanth Swaminathan stfd f1, (FP_SAVE_BASE )(r1) 160*1fd5a2e1SPrashanth Swaminathan stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) 161*1fd5a2e1SPrashanth Swaminathan stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) 162*1fd5a2e1SPrashanth Swaminathan stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) 163*1fd5a2e1SPrashanth Swaminathan stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) 164*1fd5a2e1SPrashanth Swaminathan stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) 165*1fd5a2e1SPrashanth Swaminathan stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) 166*1fd5a2e1SPrashanth Swaminathan stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) 167*1fd5a2e1SPrashanth Swaminathan stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) 168*1fd5a2e1SPrashanth Swaminathan stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) 169*1fd5a2e1SPrashanth Swaminathan stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) 170*1fd5a2e1SPrashanth Swaminathan stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) 171*1fd5a2e1SPrashanth Swaminathan stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) 172*1fd5a2e1SPrashanth Swaminathan 173*1fd5a2e1SPrashanth Swaminathan /* Set up registers for the routine that actually does the work 174*1fd5a2e1SPrashanth Swaminathan get the context pointer from the trampoline. */ 175*1fd5a2e1SPrashanth Swaminathan mr r3,r11 176*1fd5a2e1SPrashanth Swaminathan 177*1fd5a2e1SPrashanth Swaminathan /* Now load up the pointer to the result storage. */ 178*1fd5a2e1SPrashanth Swaminathan addi r4,r1,(SAVE_SIZE-RESULT_BYTES) 179*1fd5a2e1SPrashanth Swaminathan 180*1fd5a2e1SPrashanth Swaminathan /* Now load up the pointer to the saved gpr registers. */ 181*1fd5a2e1SPrashanth Swaminathan addi r5,r1,PARENT_PARM_BASE 182*1fd5a2e1SPrashanth Swaminathan 183*1fd5a2e1SPrashanth Swaminathan /* Now load up the pointer to the saved fpr registers. */ 184*1fd5a2e1SPrashanth Swaminathan addi r6,r1,FP_SAVE_BASE 185*1fd5a2e1SPrashanth Swaminathan 186*1fd5a2e1SPrashanth Swaminathan /* Make the call. */ 187*1fd5a2e1SPrashanth Swaminathan bl BLCLS_HELP 188*1fd5a2e1SPrashanth Swaminathan 189*1fd5a2e1SPrashanth Swaminathan /* r3 contains the rtype pointer... save it since we will need 190*1fd5a2e1SPrashanth Swaminathan it later. */ 191*1fd5a2e1SPrashanth Swaminathan sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type 192*1fd5a2e1SPrashanth Swaminathan lg r0,0(r3) ; size => r0 193*1fd5a2e1SPrashanth Swaminathan lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 194*1fd5a2e1SPrashanth Swaminathan 195*1fd5a2e1SPrashanth Swaminathan /* The helper will have intercepted structure returns and inserted 196*1fd5a2e1SPrashanth Swaminathan the caller`s destination address for structs returned by ref. */ 197*1fd5a2e1SPrashanth Swaminathan 198*1fd5a2e1SPrashanth Swaminathan /* r3 contains the return type so use it to look up in a table 199*1fd5a2e1SPrashanth Swaminathan so we know how to deal with each type. */ 200*1fd5a2e1SPrashanth Swaminathan 201*1fd5a2e1SPrashanth Swaminathan addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ 202*1fd5a2e1SPrashanth Swaminathan bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ 203*1fd5a2e1SPrashanth Swaminathan mflr r4 /* Move to r4. */ 204*1fd5a2e1SPrashanth Swaminathan slwi r3,r3,4 /* Now multiply return type by 16. */ 205*1fd5a2e1SPrashanth Swaminathan add r3,r3,r4 /* Add contents of table to table address. */ 206*1fd5a2e1SPrashanth Swaminathan mtctr r3 207*1fd5a2e1SPrashanth Swaminathan bctr /* Jump to it. */ 208*1fd5a2e1SPrashanth SwaminathanLFE1: 209*1fd5a2e1SPrashanth Swaminathan/* Each of the ret_typeX code fragments has to be exactly 16 bytes long 210*1fd5a2e1SPrashanth Swaminathan (4 instructions). For cache effectiveness we align to a 16 byte boundary 211*1fd5a2e1SPrashanth Swaminathan first. */ 212*1fd5a2e1SPrashanth Swaminathan 213*1fd5a2e1SPrashanth Swaminathan .align 4 214*1fd5a2e1SPrashanth Swaminathan 215*1fd5a2e1SPrashanth Swaminathan nop 216*1fd5a2e1SPrashanth Swaminathan nop 217*1fd5a2e1SPrashanth Swaminathan nop 218*1fd5a2e1SPrashanth SwaminathanLget_ret_type0_addr: 219*1fd5a2e1SPrashanth Swaminathan blrl 220*1fd5a2e1SPrashanth Swaminathan 221*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_VOID */ 222*1fd5a2e1SPrashanth SwaminathanLret_type0: 223*1fd5a2e1SPrashanth Swaminathan b Lfinish 224*1fd5a2e1SPrashanth Swaminathan nop 225*1fd5a2e1SPrashanth Swaminathan nop 226*1fd5a2e1SPrashanth Swaminathan nop 227*1fd5a2e1SPrashanth Swaminathan 228*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_INT */ 229*1fd5a2e1SPrashanth SwaminathanLret_type1: 230*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) 231*1fd5a2e1SPrashanth Swaminathan b Lfinish 232*1fd5a2e1SPrashanth Swaminathan nop 233*1fd5a2e1SPrashanth Swaminathan nop 234*1fd5a2e1SPrashanth Swaminathan 235*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_FLOAT */ 236*1fd5a2e1SPrashanth SwaminathanLret_type2: 237*1fd5a2e1SPrashanth Swaminathan lfs f1,0(r5) 238*1fd5a2e1SPrashanth Swaminathan b Lfinish 239*1fd5a2e1SPrashanth Swaminathan nop 240*1fd5a2e1SPrashanth Swaminathan nop 241*1fd5a2e1SPrashanth Swaminathan 242*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_DOUBLE */ 243*1fd5a2e1SPrashanth SwaminathanLret_type3: 244*1fd5a2e1SPrashanth Swaminathan lfd f1,0(r5) 245*1fd5a2e1SPrashanth Swaminathan b Lfinish 246*1fd5a2e1SPrashanth Swaminathan nop 247*1fd5a2e1SPrashanth Swaminathan nop 248*1fd5a2e1SPrashanth Swaminathan 249*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_LONGDOUBLE */ 250*1fd5a2e1SPrashanth SwaminathanLret_type4: 251*1fd5a2e1SPrashanth Swaminathan lfd f1,0(r5) 252*1fd5a2e1SPrashanth Swaminathan lfd f2,8(r5) 253*1fd5a2e1SPrashanth Swaminathan b Lfinish 254*1fd5a2e1SPrashanth Swaminathan nop 255*1fd5a2e1SPrashanth Swaminathan 256*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT8 */ 257*1fd5a2e1SPrashanth SwaminathanLret_type5: 258*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 259*1fd5a2e1SPrashanth Swaminathan lbz r3,7(r5) 260*1fd5a2e1SPrashanth Swaminathan#else 261*1fd5a2e1SPrashanth Swaminathan lbz r3,3(r5) 262*1fd5a2e1SPrashanth Swaminathan#endif 263*1fd5a2e1SPrashanth Swaminathan b Lfinish 264*1fd5a2e1SPrashanth Swaminathan nop 265*1fd5a2e1SPrashanth Swaminathan nop 266*1fd5a2e1SPrashanth Swaminathan 267*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT8 */ 268*1fd5a2e1SPrashanth SwaminathanLret_type6: 269*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 270*1fd5a2e1SPrashanth Swaminathan lbz r3,7(r5) 271*1fd5a2e1SPrashanth Swaminathan#else 272*1fd5a2e1SPrashanth Swaminathan lbz r3,3(r5) 273*1fd5a2e1SPrashanth Swaminathan#endif 274*1fd5a2e1SPrashanth Swaminathan extsb r3,r3 275*1fd5a2e1SPrashanth Swaminathan b Lfinish 276*1fd5a2e1SPrashanth Swaminathan nop 277*1fd5a2e1SPrashanth Swaminathan 278*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT16 */ 279*1fd5a2e1SPrashanth SwaminathanLret_type7: 280*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 281*1fd5a2e1SPrashanth Swaminathan lhz r3,6(r5) 282*1fd5a2e1SPrashanth Swaminathan#else 283*1fd5a2e1SPrashanth Swaminathan lhz r3,2(r5) 284*1fd5a2e1SPrashanth Swaminathan#endif 285*1fd5a2e1SPrashanth Swaminathan b Lfinish 286*1fd5a2e1SPrashanth Swaminathan nop 287*1fd5a2e1SPrashanth Swaminathan nop 288*1fd5a2e1SPrashanth Swaminathan 289*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT16 */ 290*1fd5a2e1SPrashanth SwaminathanLret_type8: 291*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 292*1fd5a2e1SPrashanth Swaminathan lha r3,6(r5) 293*1fd5a2e1SPrashanth Swaminathan#else 294*1fd5a2e1SPrashanth Swaminathan lha r3,2(r5) 295*1fd5a2e1SPrashanth Swaminathan#endif 296*1fd5a2e1SPrashanth Swaminathan b Lfinish 297*1fd5a2e1SPrashanth Swaminathan nop 298*1fd5a2e1SPrashanth Swaminathan nop 299*1fd5a2e1SPrashanth Swaminathan 300*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT32 */ 301*1fd5a2e1SPrashanth SwaminathanLret_type9: 302*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 303*1fd5a2e1SPrashanth Swaminathan lwz r3,4(r5) 304*1fd5a2e1SPrashanth Swaminathan#else 305*1fd5a2e1SPrashanth Swaminathan lwz r3,0(r5) 306*1fd5a2e1SPrashanth Swaminathan#endif 307*1fd5a2e1SPrashanth Swaminathan b Lfinish 308*1fd5a2e1SPrashanth Swaminathan nop 309*1fd5a2e1SPrashanth Swaminathan nop 310*1fd5a2e1SPrashanth Swaminathan 311*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT32 */ 312*1fd5a2e1SPrashanth SwaminathanLret_type10: 313*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 314*1fd5a2e1SPrashanth Swaminathan lwz r3,4(r5) 315*1fd5a2e1SPrashanth Swaminathan#else 316*1fd5a2e1SPrashanth Swaminathan lwz r3,0(r5) 317*1fd5a2e1SPrashanth Swaminathan#endif 318*1fd5a2e1SPrashanth Swaminathan b Lfinish 319*1fd5a2e1SPrashanth Swaminathan nop 320*1fd5a2e1SPrashanth Swaminathan nop 321*1fd5a2e1SPrashanth Swaminathan 322*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_UINT64 */ 323*1fd5a2e1SPrashanth SwaminathanLret_type11: 324*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 325*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) 326*1fd5a2e1SPrashanth Swaminathan b Lfinish 327*1fd5a2e1SPrashanth Swaminathan nop 328*1fd5a2e1SPrashanth Swaminathan#else 329*1fd5a2e1SPrashanth Swaminathan lwz r3,0(r5) 330*1fd5a2e1SPrashanth Swaminathan lwz r4,4(r5) 331*1fd5a2e1SPrashanth Swaminathan b Lfinish 332*1fd5a2e1SPrashanth Swaminathan#endif 333*1fd5a2e1SPrashanth Swaminathan nop 334*1fd5a2e1SPrashanth Swaminathan 335*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_SINT64 */ 336*1fd5a2e1SPrashanth SwaminathanLret_type12: 337*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 338*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) 339*1fd5a2e1SPrashanth Swaminathan b Lfinish 340*1fd5a2e1SPrashanth Swaminathan nop 341*1fd5a2e1SPrashanth Swaminathan#else 342*1fd5a2e1SPrashanth Swaminathan lwz r3,0(r5) 343*1fd5a2e1SPrashanth Swaminathan lwz r4,4(r5) 344*1fd5a2e1SPrashanth Swaminathan b Lfinish 345*1fd5a2e1SPrashanth Swaminathan#endif 346*1fd5a2e1SPrashanth Swaminathan nop 347*1fd5a2e1SPrashanth Swaminathan 348*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_STRUCT */ 349*1fd5a2e1SPrashanth SwaminathanLret_type13: 350*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 351*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) ; we need at least this... 352*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,4 353*1fd5a2e1SPrashanth Swaminathan bgt Lstructend ; not a special small case 354*1fd5a2e1SPrashanth Swaminathan b Lsmallstruct ; see if we need more. 355*1fd5a2e1SPrashanth Swaminathan#else 356*1fd5a2e1SPrashanth Swaminathan cmpwi 0,r0,4 357*1fd5a2e1SPrashanth Swaminathan bgt Lfinish ; not by value 358*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) 359*1fd5a2e1SPrashanth Swaminathan b Lfinish 360*1fd5a2e1SPrashanth Swaminathan#endif 361*1fd5a2e1SPrashanth Swaminathan/* case FFI_TYPE_POINTER */ 362*1fd5a2e1SPrashanth SwaminathanLret_type14: 363*1fd5a2e1SPrashanth Swaminathan lg r3,0(r5) 364*1fd5a2e1SPrashanth Swaminathan b Lfinish 365*1fd5a2e1SPrashanth Swaminathan nop 366*1fd5a2e1SPrashanth Swaminathan nop 367*1fd5a2e1SPrashanth Swaminathan 368*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 369*1fd5a2e1SPrashanth SwaminathanLsmallstruct: 370*1fd5a2e1SPrashanth Swaminathan beq Lfour ; continuation of Lret13. 371*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,3 372*1fd5a2e1SPrashanth Swaminathan beq Lfinish ; don`t adjust this - can`t be any floats here... 373*1fd5a2e1SPrashanth Swaminathan srdi r3,r3,48 374*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,2 375*1fd5a2e1SPrashanth Swaminathan beq Lfinish ; .. or here .. 376*1fd5a2e1SPrashanth Swaminathan srdi r3,r3,8 377*1fd5a2e1SPrashanth Swaminathan b Lfinish ; .. or here. 378*1fd5a2e1SPrashanth Swaminathan 379*1fd5a2e1SPrashanth SwaminathanLfour: 380*1fd5a2e1SPrashanth Swaminathan lg r6,LINKAGE_SIZE(r1) ; get the result type 381*1fd5a2e1SPrashanth Swaminathan lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer 382*1fd5a2e1SPrashanth Swaminathan lg r6,0(r6) ; first element 383*1fd5a2e1SPrashanth Swaminathan lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type 384*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,2 ; FFI_TYPE_FLOAT 385*1fd5a2e1SPrashanth Swaminathan bne Lfourint 386*1fd5a2e1SPrashanth Swaminathan lfs f1,0(r5) ; just one float in the struct. 387*1fd5a2e1SPrashanth Swaminathan b Lfinish 388*1fd5a2e1SPrashanth Swaminathan 389*1fd5a2e1SPrashanth SwaminathanLfourint: 390*1fd5a2e1SPrashanth Swaminathan srdi r3,r3,32 ; four bytes. 391*1fd5a2e1SPrashanth Swaminathan b Lfinish 392*1fd5a2e1SPrashanth Swaminathan 393*1fd5a2e1SPrashanth SwaminathanLstructend: 394*1fd5a2e1SPrashanth Swaminathan lg r3,LINKAGE_SIZE(r1) ; get the result type 395*1fd5a2e1SPrashanth Swaminathan bl STRUCT_RETVALUE_P 396*1fd5a2e1SPrashanth Swaminathan cmpi 0,r3,0 397*1fd5a2e1SPrashanth Swaminathan beq Lfinish ; nope. 398*1fd5a2e1SPrashanth Swaminathan /* Recover a pointer to the results. */ 399*1fd5a2e1SPrashanth Swaminathan addi r11,r1,(SAVE_SIZE-RESULT_BYTES) 400*1fd5a2e1SPrashanth Swaminathan lg r3,0(r11) ; we need at least this... 401*1fd5a2e1SPrashanth Swaminathan lg r4,8(r11) 402*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,16 403*1fd5a2e1SPrashanth Swaminathan beq Lfinish ; special case 16 bytes we don't consider floats. 404*1fd5a2e1SPrashanth Swaminathan 405*1fd5a2e1SPrashanth Swaminathan /* OK, frustratingly, the process of saving the struct to mem might have 406*1fd5a2e1SPrashanth Swaminathan messed with the FPRs, so we have to re-load them :(. 407*1fd5a2e1SPrashanth Swaminathan We`ll use our FPRs space again - calling: 408*1fd5a2e1SPrashanth Swaminathan void darwin64_pass_struct_floats (ffi_type *s, char *src, 409*1fd5a2e1SPrashanth Swaminathan unsigned *nfpr, double **fprs) 410*1fd5a2e1SPrashanth Swaminathan We`ll temporarily pinch the first two slots of the param area for local 411*1fd5a2e1SPrashanth Swaminathan vars used by the routine. */ 412*1fd5a2e1SPrashanth Swaminathan xor r6,r6,r6 413*1fd5a2e1SPrashanth Swaminathan addi r5,r1,PARENT_PARM_BASE ; some space 414*1fd5a2e1SPrashanth Swaminathan sg r6,0(r5) ; *nfpr zeroed. 415*1fd5a2e1SPrashanth Swaminathan addi r6,r5,8 ; **fprs 416*1fd5a2e1SPrashanth Swaminathan addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space 417*1fd5a2e1SPrashanth Swaminathan sg r3,0(r6) 418*1fd5a2e1SPrashanth Swaminathan mr r4,r11 ; the struct is here... 419*1fd5a2e1SPrashanth Swaminathan lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. 420*1fd5a2e1SPrashanth Swaminathan bl PASS_STR_FLOATS ; get struct floats into FPR save space. 421*1fd5a2e1SPrashanth Swaminathan /* See if we used any floats */ 422*1fd5a2e1SPrashanth Swaminathan lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) 423*1fd5a2e1SPrashanth Swaminathan cmpi 0,r0,0 424*1fd5a2e1SPrashanth Swaminathan beq Lstructints ; nope. 425*1fd5a2e1SPrashanth Swaminathan /* OK load `em up... */ 426*1fd5a2e1SPrashanth Swaminathan lfd f1, (FP_SAVE_BASE )(r1) 427*1fd5a2e1SPrashanth Swaminathan lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) 428*1fd5a2e1SPrashanth Swaminathan lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) 429*1fd5a2e1SPrashanth Swaminathan lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) 430*1fd5a2e1SPrashanth Swaminathan lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) 431*1fd5a2e1SPrashanth Swaminathan lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) 432*1fd5a2e1SPrashanth Swaminathan lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) 433*1fd5a2e1SPrashanth Swaminathan lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) 434*1fd5a2e1SPrashanth Swaminathan lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) 435*1fd5a2e1SPrashanth Swaminathan lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) 436*1fd5a2e1SPrashanth Swaminathan lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) 437*1fd5a2e1SPrashanth Swaminathan lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) 438*1fd5a2e1SPrashanth Swaminathan lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) 439*1fd5a2e1SPrashanth Swaminathan 440*1fd5a2e1SPrashanth Swaminathan /* point back at our saved struct. */ 441*1fd5a2e1SPrashanth SwaminathanLstructints: 442*1fd5a2e1SPrashanth Swaminathan addi r11,r1,(SAVE_SIZE-RESULT_BYTES) 443*1fd5a2e1SPrashanth Swaminathan lg r3,0(r11) ; we end up picking the 444*1fd5a2e1SPrashanth Swaminathan lg r4,8(r11) ; first two again. 445*1fd5a2e1SPrashanth Swaminathan lg r5,16(r11) 446*1fd5a2e1SPrashanth Swaminathan lg r6,24(r11) 447*1fd5a2e1SPrashanth Swaminathan lg r7,32(r11) 448*1fd5a2e1SPrashanth Swaminathan lg r8,40(r11) 449*1fd5a2e1SPrashanth Swaminathan lg r9,48(r11) 450*1fd5a2e1SPrashanth Swaminathan lg r10,56(r11) 451*1fd5a2e1SPrashanth Swaminathan#endif 452*1fd5a2e1SPrashanth Swaminathan 453*1fd5a2e1SPrashanth Swaminathan/* case done */ 454*1fd5a2e1SPrashanth SwaminathanLfinish: 455*1fd5a2e1SPrashanth Swaminathan addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ 456*1fd5a2e1SPrashanth Swaminathan lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ 457*1fd5a2e1SPrashanth Swaminathan mtlr r0 /* Reset link register. */ 458*1fd5a2e1SPrashanth Swaminathan blr 459*1fd5a2e1SPrashanth SwaminathanLendcode: 460*1fd5a2e1SPrashanth Swaminathan .align 1 461*1fd5a2e1SPrashanth Swaminathan 462*1fd5a2e1SPrashanth Swaminathan/* END(ffi_closure_ASM) */ 463*1fd5a2e1SPrashanth Swaminathan 464*1fd5a2e1SPrashanth Swaminathan/* EH frame stuff. */ 465*1fd5a2e1SPrashanth Swaminathan#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) 466*1fd5a2e1SPrashanth Swaminathan/* 176, 400 */ 467*1fd5a2e1SPrashanth Swaminathan#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) 468*1fd5a2e1SPrashanth Swaminathan#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) 469*1fd5a2e1SPrashanth Swaminathan 470*1fd5a2e1SPrashanth Swaminathan .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 471*1fd5a2e1SPrashanth SwaminathanEH_frame1: 472*1fd5a2e1SPrashanth Swaminathan .set L$set$0,LECIE1-LSCIE1 473*1fd5a2e1SPrashanth Swaminathan .long L$set$0 ; Length of Common Information Entry 474*1fd5a2e1SPrashanth SwaminathanLSCIE1: 475*1fd5a2e1SPrashanth Swaminathan .long 0x0 ; CIE Identifier Tag 476*1fd5a2e1SPrashanth Swaminathan .byte 0x1 ; CIE Version 477*1fd5a2e1SPrashanth Swaminathan .ascii "zR\0" ; CIE Augmentation 478*1fd5a2e1SPrashanth Swaminathan .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor 479*1fd5a2e1SPrashanth Swaminathan .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor 480*1fd5a2e1SPrashanth Swaminathan .byte 0x41 ; CIE RA Column 481*1fd5a2e1SPrashanth Swaminathan .byte 0x1 ; uleb128 0x1; Augmentation size 482*1fd5a2e1SPrashanth Swaminathan .byte 0x10 ; FDE Encoding (pcrel) 483*1fd5a2e1SPrashanth Swaminathan .byte 0xc ; DW_CFA_def_cfa 484*1fd5a2e1SPrashanth Swaminathan .byte 0x1 ; uleb128 0x1 485*1fd5a2e1SPrashanth Swaminathan .byte 0x0 ; uleb128 0x0 486*1fd5a2e1SPrashanth Swaminathan .align LOG2_GPR_BYTES 487*1fd5a2e1SPrashanth SwaminathanLECIE1: 488*1fd5a2e1SPrashanth Swaminathan .globl _ffi_closure_ASM.eh 489*1fd5a2e1SPrashanth Swaminathan_ffi_closure_ASM.eh: 490*1fd5a2e1SPrashanth SwaminathanLSFDE1: 491*1fd5a2e1SPrashanth Swaminathan .set L$set$1,LEFDE1-LASFDE1 492*1fd5a2e1SPrashanth Swaminathan .long L$set$1 ; FDE Length 493*1fd5a2e1SPrashanth Swaminathan 494*1fd5a2e1SPrashanth SwaminathanLASFDE1: 495*1fd5a2e1SPrashanth Swaminathan .long LASFDE1-EH_frame1 ; FDE CIE offset 496*1fd5a2e1SPrashanth Swaminathan .g_long Lstartcode-. ; FDE initial location 497*1fd5a2e1SPrashanth Swaminathan .set L$set$2,LFE1-Lstartcode 498*1fd5a2e1SPrashanth Swaminathan .g_long L$set$2 ; FDE address range 499*1fd5a2e1SPrashanth Swaminathan .byte 0x0 ; uleb128 0x0; Augmentation size 500*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ; DW_CFA_advance_loc4 501*1fd5a2e1SPrashanth Swaminathan .set L$set$3,LCFI1-LCFI0 502*1fd5a2e1SPrashanth Swaminathan .long L$set$3 503*1fd5a2e1SPrashanth Swaminathan .byte 0xe ; DW_CFA_def_cfa_offset 504*1fd5a2e1SPrashanth Swaminathan .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 505*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ; DW_CFA_advance_loc4 506*1fd5a2e1SPrashanth Swaminathan .set L$set$4,LCFI0-Lstartcode 507*1fd5a2e1SPrashanth Swaminathan .long L$set$4 508*1fd5a2e1SPrashanth Swaminathan .byte 0x11 ; DW_CFA_offset_extended_sf 509*1fd5a2e1SPrashanth Swaminathan .byte 0x41 ; uleb128 0x41 510*1fd5a2e1SPrashanth Swaminathan .byte 0x7e ; sleb128 -2 511*1fd5a2e1SPrashanth Swaminathan .align LOG2_GPR_BYTES 512*1fd5a2e1SPrashanth SwaminathanLEFDE1: 513*1fd5a2e1SPrashanth Swaminathan .align 1 514*1fd5a2e1SPrashanth Swaminathan 515*1fd5a2e1SPrashanth Swaminathan#ifdef WANT_STUB 516*1fd5a2e1SPrashanth Swaminathan .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 517*1fd5a2e1SPrashanth Swaminathan .align 5 518*1fd5a2e1SPrashanth SwaminathanL_ffi_closure_helper_DARWIN$stub: 519*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _ffi_closure_helper_DARWIN 520*1fd5a2e1SPrashanth Swaminathan mflr r0 521*1fd5a2e1SPrashanth Swaminathan bcl 20,31,"L1$spb" 522*1fd5a2e1SPrashanth Swaminathan"L1$spb": 523*1fd5a2e1SPrashanth Swaminathan mflr r11 524*1fd5a2e1SPrashanth Swaminathan addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") 525*1fd5a2e1SPrashanth Swaminathan mtlr r0 526*1fd5a2e1SPrashanth Swaminathan lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) 527*1fd5a2e1SPrashanth Swaminathan mtctr r12 528*1fd5a2e1SPrashanth Swaminathan bctr 529*1fd5a2e1SPrashanth Swaminathan .lazy_symbol_pointer 530*1fd5a2e1SPrashanth SwaminathanL_ffi_closure_helper_DARWIN$lazy_ptr: 531*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _ffi_closure_helper_DARWIN 532*1fd5a2e1SPrashanth Swaminathan .g_long dyld_stub_binding_helper 533*1fd5a2e1SPrashanth Swaminathan 534*1fd5a2e1SPrashanth Swaminathan#if defined(__ppc64__) 535*1fd5a2e1SPrashanth Swaminathan .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 536*1fd5a2e1SPrashanth Swaminathan .align 5 537*1fd5a2e1SPrashanth SwaminathanL_darwin64_struct_ret_by_value_p$stub: 538*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _darwin64_struct_ret_by_value_p 539*1fd5a2e1SPrashanth Swaminathan mflr r0 540*1fd5a2e1SPrashanth Swaminathan bcl 20,31,"L2$spb" 541*1fd5a2e1SPrashanth Swaminathan"L2$spb": 542*1fd5a2e1SPrashanth Swaminathan mflr r11 543*1fd5a2e1SPrashanth Swaminathan addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") 544*1fd5a2e1SPrashanth Swaminathan mtlr r0 545*1fd5a2e1SPrashanth Swaminathan lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11) 546*1fd5a2e1SPrashanth Swaminathan mtctr r12 547*1fd5a2e1SPrashanth Swaminathan bctr 548*1fd5a2e1SPrashanth Swaminathan .lazy_symbol_pointer 549*1fd5a2e1SPrashanth SwaminathanL_darwin64_struct_ret_by_value_p$lazy_ptr: 550*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _darwin64_struct_ret_by_value_p 551*1fd5a2e1SPrashanth Swaminathan .g_long dyld_stub_binding_helper 552*1fd5a2e1SPrashanth Swaminathan 553*1fd5a2e1SPrashanth Swaminathan .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 554*1fd5a2e1SPrashanth Swaminathan .align 5 555*1fd5a2e1SPrashanth SwaminathanL_darwin64_pass_struct_floats$stub: 556*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _darwin64_pass_struct_floats 557*1fd5a2e1SPrashanth Swaminathan mflr r0 558*1fd5a2e1SPrashanth Swaminathan bcl 20,31,"L3$spb" 559*1fd5a2e1SPrashanth Swaminathan"L3$spb": 560*1fd5a2e1SPrashanth Swaminathan mflr r11 561*1fd5a2e1SPrashanth Swaminathan addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") 562*1fd5a2e1SPrashanth Swaminathan mtlr r0 563*1fd5a2e1SPrashanth Swaminathan lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) 564*1fd5a2e1SPrashanth Swaminathan mtctr r12 565*1fd5a2e1SPrashanth Swaminathan bctr 566*1fd5a2e1SPrashanth Swaminathan .lazy_symbol_pointer 567*1fd5a2e1SPrashanth SwaminathanL_darwin64_pass_struct_floats$lazy_ptr: 568*1fd5a2e1SPrashanth Swaminathan .indirect_symbol _darwin64_pass_struct_floats 569*1fd5a2e1SPrashanth Swaminathan .g_long dyld_stub_binding_helper 570*1fd5a2e1SPrashanth Swaminathan# endif 571*1fd5a2e1SPrashanth Swaminathan#endif 572