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,3			# methodIndex * 8
91		addi	r5,r5,8			# step over junk at start of vTable !
92		lwzx	r11,r5,r4		# get function pointer
93
94		addi	r5,r5,4    	 	# We need to manually adjust the 'that' pointer, this is CFRONT based
95		lwzx	r5,r4,r5 		# offset = r4(vtable) + r5(methodIndex offset) - 4
96		add	r3,r5,r3		# adjust 'that' r3 = r3 + r5
97
98		lwz	r4,28(sp)
99		lwz	r5,32(sp)
100		lwz	r6,36(sp)
101		lwz	r7,40(sp)
102		lwz	r8,44(sp)
103		lwz	r9,48(sp)
104		lwz	r10,52(sp)
105
106		bl      ._ptrgl{PR}
107		nop
108
109		mr      sp,r31
110		lwz	r0,144(sp)
111		addi    sp,sp,136
112		mtlr    r0
113		lwz     r31,-4(sp)
114	        blr
115
116
117# .data section
118
119        .toc                            # 0x00000038
120T.18.NS_InvokeByIndex:
121        .tc     H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
122
123        .csect  NS_InvokeByIndex{DS}
124        .long   .NS_InvokeByIndex     # "\0\0\0\0"
125        .long   TOC{TC0}                # "\0\0\0008"
126        .long   0x00000000              # "\0\0\0\0"
127# End   csect   NS_InvokeByIndex{DS}
128
129# .bss section
130