xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc_darwin.s.m4

changeset 0
6474c204b198
     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

mercurial