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