1/* -*- Mode: asm -*- */
2/* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6        .text
7        .globl _SharedStub
8dnl
9define(STUB_MANGLED_ENTRY,
10`        .globl  '$2`
11        .align  2
12'$2`:
13        addi    r12,   0,'$1`
14        b       _SharedStub')
15dnl
16define(STUB_ENTRY,
17`       .if     '$1` < 10
18STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase5Stub'$1`Ev')
19        .elseif '$1` < 100
20STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase6Stub'$1`Ev')
21        .elseif '$1` < 1000
22STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase7Stub'$1`Ev')
23        .else
24        .err    "Stub'$1` >= 1000 not yet supported."
25        .endif
26')
27dnl
28define(SENTINEL_ENTRY, `')
29dnl
30include(xptcstubsdef.inc)
31dnl
32// See also xptcstubs_ppc_rhapsody.cpp:PrepareAndDispatch.
33_SharedStub:
34                                // Prolog(ue)
35        mflr     r0             // Save the link register in the caller's
36        stw      r0,   8(r1)    //   stack frame
37        stwu     r1,-176(r1)    // Allocate stack space for our own frame and
38                                //   adjust stack pointer
39
40                                // Linkage area, 0(r1) to 24(r1)
41                                // Original sp saved at 0(r1)
42
43                                // Parameter area, 20 bytes from 24(r1) to
44                                //   44(r1) to accomodate 5 arguments passed
45                                //   to PrepareAndDispatch
46
47                                // Local variables, 132 bytes from 44(r1)
48                                //   to 176(r1), to accomodate 5 words and
49                                //   13 doubles
50
51        stw      r4,  44(r1)    // Save parameters passed in GPRs r4-r10;
52        stw      r5,  48(r1)    //   a pointer to here will be passed to
53        stw      r6,  52(r1)    //   PrepareAndDispatch for access to
54        stw      r7,  56(r1)    //   arguments passed in registers.  r3,
55        stw      r8,  60(r1)    //   the self pointer, is used for the
56        stw      r9,  64(r1)    //   call but isn't otherwise needed in
57        stw     r10,  68(r1)    //   PrepareAndDispatch, so it is not saved.
58
59        stfd     f1,  72(r1)    // Do the same for floating-point parameters
60        stfd     f2,  80(r1)    //   passed in FPRs f1-f13
61        stfd     f3,  88(r1)
62        stfd     f4,  96(r1)
63        stfd     f5, 104(r1)
64        stfd     f6, 112(r1)
65        stfd     f7, 120(r1)
66        stfd     f8, 128(r1)
67        stfd     f9, 136(r1)
68        stfd    f10, 144(r1)
69        stfd    f11, 152(r1)
70        stfd    f12, 160(r1)
71        stfd    f13, 168(r1)
72
73                                // Set up parameters for call to
74                                //   PrepareAndDispatch.  argument=
75                                // 0, pointer to self, already in r3
76        mr       r4,r12         // 1, stub number
77        addi     r5, r1, 204    // 2, pointer to the parameter area in our
78                                //   caller's stack, for access to
79                                //   parameters beyond those passed in
80                                //   registers.  Skip past the first parameter
81                                //   (corresponding to r3) for the same reason
82                                //   as above.  176 (size of our frame) + 24
83                                //   (size of caller's linkage) + 4 (skipped
84                                //   parameter)
85        addi     r6, r1,  44    // 3, pointer to saved GPRs
86        addi     r7, r1,  72    // 4, pointer to saved FPRs
87
88        bl      L_PrepareAndDispatch$stub
89                                // Do it
90        nop                     // Leave room for linker magic
91
92                                // Epilog(ue)
93        lwz      r0, 184(r1)    // Retrieve old link register value
94        addi     r1, r1, 176    // Restore stack pointer
95        mtlr     r0             // Restore link register
96        blr                     // Return
97
98.picsymbol_stub
99L_PrepareAndDispatch$stub:      // Standard PIC symbol stub
100        .indirect_symbol _PrepareAndDispatch
101        mflr    r0
102        bcl     20,31,L1$pb
103L1$pb:
104        mflr    r11
105        addis   r11,r11,ha16(L1$lz-L1$pb)
106        mtlr    r0
107        lwz     r12,lo16(L1$lz-L1$pb)(r11)
108        mtctr   r12
109        addi    r11,r11,lo16(L1$lz-L1$pb)
110        bctr
111.lazy_symbol_pointer
112L1$lz:
113        .indirect_symbol _PrepareAndDispatch
114        .long   dyld_stub_binding_helper
115