1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc_darwin.s.m4 Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,114 @@ 1.4 +/* -*- Mode: asm -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 + .text 1.10 + .globl _SharedStub 1.11 +dnl 1.12 +define(STUB_MANGLED_ENTRY, 1.13 +` .globl '$2` 1.14 + .align 2 1.15 +'$2`: 1.16 + addi r12, 0,'$1` 1.17 + b _SharedStub') 1.18 +dnl 1.19 +define(STUB_ENTRY, 1.20 +` .if '$1` < 10 1.21 +STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase5Stub'$1`Ev') 1.22 + .elseif '$1` < 100 1.23 +STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase6Stub'$1`Ev') 1.24 + .elseif '$1` < 1000 1.25 +STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase7Stub'$1`Ev') 1.26 + .else 1.27 + .err "Stub'$1` >= 1000 not yet supported." 1.28 + .endif 1.29 +') 1.30 +dnl 1.31 +define(SENTINEL_ENTRY, `') 1.32 +dnl 1.33 +include(xptcstubsdef.inc) 1.34 +dnl 1.35 +// See also xptcstubs_ppc_rhapsody.cpp:PrepareAndDispatch. 1.36 +_SharedStub: 1.37 + // Prolog(ue) 1.38 + mflr r0 // Save the link register in the caller's 1.39 + stw r0, 8(r1) // stack frame 1.40 + stwu r1,-176(r1) // Allocate stack space for our own frame and 1.41 + // adjust stack pointer 1.42 + 1.43 + // Linkage area, 0(r1) to 24(r1) 1.44 + // Original sp saved at 0(r1) 1.45 + 1.46 + // Parameter area, 20 bytes from 24(r1) to 1.47 + // 44(r1) to accomodate 5 arguments passed 1.48 + // to PrepareAndDispatch 1.49 + 1.50 + // Local variables, 132 bytes from 44(r1) 1.51 + // to 176(r1), to accomodate 5 words and 1.52 + // 13 doubles 1.53 + 1.54 + stw r4, 44(r1) // Save parameters passed in GPRs r4-r10; 1.55 + stw r5, 48(r1) // a pointer to here will be passed to 1.56 + stw r6, 52(r1) // PrepareAndDispatch for access to 1.57 + stw r7, 56(r1) // arguments passed in registers. r3, 1.58 + stw r8, 60(r1) // the self pointer, is used for the 1.59 + stw r9, 64(r1) // call but isn't otherwise needed in 1.60 + stw r10, 68(r1) // PrepareAndDispatch, so it is not saved. 1.61 + 1.62 + stfd f1, 72(r1) // Do the same for floating-point parameters 1.63 + stfd f2, 80(r1) // passed in FPRs f1-f13 1.64 + stfd f3, 88(r1) 1.65 + stfd f4, 96(r1) 1.66 + stfd f5, 104(r1) 1.67 + stfd f6, 112(r1) 1.68 + stfd f7, 120(r1) 1.69 + stfd f8, 128(r1) 1.70 + stfd f9, 136(r1) 1.71 + stfd f10, 144(r1) 1.72 + stfd f11, 152(r1) 1.73 + stfd f12, 160(r1) 1.74 + stfd f13, 168(r1) 1.75 + 1.76 + // Set up parameters for call to 1.77 + // PrepareAndDispatch. argument= 1.78 + // 0, pointer to self, already in r3 1.79 + mr r4,r12 // 1, stub number 1.80 + addi r5, r1, 204 // 2, pointer to the parameter area in our 1.81 + // caller's stack, for access to 1.82 + // parameters beyond those passed in 1.83 + // registers. Skip past the first parameter 1.84 + // (corresponding to r3) for the same reason 1.85 + // as above. 176 (size of our frame) + 24 1.86 + // (size of caller's linkage) + 4 (skipped 1.87 + // parameter) 1.88 + addi r6, r1, 44 // 3, pointer to saved GPRs 1.89 + addi r7, r1, 72 // 4, pointer to saved FPRs 1.90 + 1.91 + bl L_PrepareAndDispatch$stub 1.92 + // Do it 1.93 + nop // Leave room for linker magic 1.94 + 1.95 + // Epilog(ue) 1.96 + lwz r0, 184(r1) // Retrieve old link register value 1.97 + addi r1, r1, 176 // Restore stack pointer 1.98 + mtlr r0 // Restore link register 1.99 + blr // Return 1.100 + 1.101 +.picsymbol_stub 1.102 +L_PrepareAndDispatch$stub: // Standard PIC symbol stub 1.103 + .indirect_symbol _PrepareAndDispatch 1.104 + mflr r0 1.105 + bcl 20,31,L1$pb 1.106 +L1$pb: 1.107 + mflr r11 1.108 + addis r11,r11,ha16(L1$lz-L1$pb) 1.109 + mtlr r0 1.110 + lwz r12,lo16(L1$lz-L1$pb)(r11) 1.111 + mtctr r12 1.112 + addi r11,r11,lo16(L1$lz-L1$pb) 1.113 + bctr 1.114 +.lazy_symbol_pointer 1.115 +L1$lz: 1.116 + .indirect_symbol _PrepareAndDispatch 1.117 + .long dyld_stub_binding_helper