1# This Source Code Form is subject to the terms of the Mozilla Public
2# License, v. 2.0. If a copy of the MPL was not distributed with this
3# file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
6.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
7.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
8.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
9.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
10.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
11.set r30,30; .set r31,31
12.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
13.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
14.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
15.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
16.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
17.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
18.set f30,30; .set f31,31
19.set BO_IF,12
20.set CR0_EQ,2
21
22        .rename H.10.NO_SYMBOL{PR},""
23        .rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
24
25
26# .text section
27
28        .csect  H.10.NO_SYMBOL{PR}
29        .globl  .NS_InvokeByIndex
30        .globl  NS_InvokeByIndex{DS}
31        .extern .invoke_copy_to_stack
32        .extern ._ptrgl{PR}
33
34#
35#   NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
36#                      uint32_t paramCount, nsXPTCVariant* params)
37#
38
39.NS_InvokeByIndex:
40        mflr    r0
41        std     r31,-8(sp)
42#
43# save off the incoming values in the caller's parameter area
44#
45        std     r3,48(sp)       # that
46        std     r4,56(sp)       # methodIndex
47        std     r5,64(sp)       # paramCount
48        std     r6,72(sp)       # params
49	std     r0,16(sp)
50	stdu    sp,-168(sp)     # 2*24=48 for linkage area,
51                                # 8*13=104 for fprData area
52                                #      16 for saved registers
53
54# prepare args for 'invoke_copy_to_stack' call
55#
56        ld      r4,232(sp)      # paramCount (168+8+56)
57        ld      r5,240(sp)      # params
58        mr      r6,sp           # fprData
59        sldi    r3,r4,3         # number of bytes of stack required
60                                # is at most numParams*8
61        addi    r3,r3,56        # linkage area (48) + this (8)
62        mr      r31,sp          # save original stack top
63        subfc   sp,r3,sp        # bump the stack
64        addi    r3,sp,56        # parameter pointer excludes linkage area
65                                # size + 'this'
66
67        bl      .invoke_copy_to_stack
68        nop
69
70        lfd     f1,0(r31)       # Restore floating point registers
71	lfd     f2,8(r31)
72        lfd     f3,16(r31)
73        lfd     f4,24(r31)
74        lfd     f5,32(r31)
75        lfd     f6,40(r31)
76        lfd     f7,48(r31)
77        lfd     f8,56(r31)
78        lfd     f9,64(r31)
79        lfd     f10,72(r31)
80        lfd     f11,80(r31)
81        lfd     f12,88(r31)
82        lfd     f13,96(r31)
83
84        ld      r3,216(r31)     # that (168+48)
85        ld      r4,0(r3)        # get vTable from 'that'
86        ld      r5,224(r31)     # methodIndex (168+56)
87        sldi    r5,r5,3         # methodIndex * 8
88                                # No junk at the start of 64bit vtable !!!
89        ldx     r11,r5,r4       # get function pointer (this jumps
90                                # either to the function if no adjustment
91                                # is needed (displacement = 0), or it
92                                # jumps to the thunk code, which will jump
93                                # to the function at the end)
94
95        # No adjustment of the that pointer in 64bit mode, this is done
96        # by the thunk code
97
98        ld      r4,56(sp)
99        ld      r5,64(sp)
100        ld      r6,72(sp)
101        ld      r7,80(sp)
102        ld      r8,88(sp)
103        ld      r9,96(sp)
104        ld      r10,104(sp)
105
106        bl      ._ptrgl{PR}
107        nop
108
109        mr      sp,r31
110        ld      r0,184(sp)      # 168+16
111        addi    sp,sp,168
112        mtlr    r0
113        ld      r31,-8(sp)
114        blr
115
116# .data section
117
118        .toc                            # 0x00000038
119T.18.NS_InvokeByIndex:
120        .tc     H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
121
122        .csect  NS_InvokeByIndex{DS}
123        .llong  .NS_InvokeByIndex     # "\0\0\0\0"
124        .llong  TOC{TC0}                # "\0\0\0008"
125        .llong  0x00000000              # "\0\0\0\0"
126# End   csect   NS_InvokeByIndex{DS}
127
128# .bss section
129