summaryrefslogtreecommitdiff
path: root/asm/SDK/MTX/vec.s
blob: ba5f3161ded3ad49c92dca81f2e8248880db5f1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
.include "macros.inc"

.section .text, "ax"  # 0x80006980 - 0x803E1E60

.global PSVECAdd
PSVECAdd:
/* 8027CCC4 00278924  E0 43 00 00 */	psq_l f2, 0(r3), 0, qr0
/* 8027CCC8 00278928  E0 84 00 00 */	psq_l f4, 0(r4), 0, qr0
/* 8027CCCC 0027892C  10 C2 20 2A */	ps_add f6, f2, f4
/* 8027CCD0 00278930  F0 C5 00 00 */	psq_st f6, 0(r5), 0, qr0
/* 8027CCD4 00278934  E0 63 80 08 */	psq_l f3, 8(r3), 1, qr0
/* 8027CCD8 00278938  E0 A4 80 08 */	psq_l f5, 8(r4), 1, qr0
/* 8027CCDC 0027893C  10 E3 28 2A */	ps_add f7, f3, f5
/* 8027CCE0 00278940  F0 E5 80 08 */	psq_st f7, 8(r5), 1, qr0
/* 8027CCE4 00278944  4E 80 00 20 */	blr

.global PSVECSubtract
PSVECSubtract:
/* 8027CCE8 00278948  E0 43 00 00 */	psq_l f2, 0(r3), 0, qr0
/* 8027CCEC 0027894C  E0 84 00 00 */	psq_l f4, 0(r4), 0, qr0
/* 8027CCF0 00278950  10 C2 20 28 */	ps_sub f6, f2, f4
/* 8027CCF4 00278954  F0 C5 00 00 */	psq_st f6, 0(r5), 0, qr0
/* 8027CCF8 00278958  E0 63 80 08 */	psq_l f3, 8(r3), 1, qr0
/* 8027CCFC 0027895C  E0 A4 80 08 */	psq_l f5, 8(r4), 1, qr0
/* 8027CD00 00278960  10 E3 28 28 */	ps_sub f7, f3, f5
/* 8027CD04 00278964  F0 E5 80 08 */	psq_st f7, 8(r5), 1, qr0
/* 8027CD08 00278968  4E 80 00 20 */	blr

.global PSVECScale
PSVECScale:
/* 8027CD0C 0027896C  E0 03 00 00 */	psq_l f0, 0(r3), 0, qr0
/* 8027CD10 00278970  E0 43 80 08 */	psq_l f2, 8(r3), 1, qr0
/* 8027CD14 00278974  10 00 00 58 */	ps_muls0 f0, f0, f1
/* 8027CD18 00278978  10 22 00 58 */	ps_muls0 f1, f2, f1
/* 8027CD1C 0027897C  F0 04 00 00 */	psq_st f0, 0(r4), 0, qr0
/* 8027CD20 00278980  F0 24 80 08 */	psq_st f1, 8(r4), 1, qr0
/* 8027CD24 00278984  4E 80 00 20 */	blr

.global PSVECNormalize
PSVECNormalize:
/* 8027CD28 00278988  E0 43 00 00 */	psq_l f2, 0(r3), 0, qr0
/* 8027CD2C 0027898C  E0 63 80 08 */	psq_l f3, 8(r3), 1, qr0
/* 8027CD30 00278990  10 A2 00 B2 */	ps_mul f5, f2, f2
/* 8027CD34 00278994  C0 02 A0 A8 */	lfs f0, lbl_806426A8-_SDA2_BASE_(r2)
/* 8027CD38 00278998  C0 22 A0 AC */	lfs f1, lbl_806426AC-_SDA2_BASE_(r2)
/* 8027CD3C 0027899C  10 83 28 FA */	ps_madd f4, f3, f3, f5
/* 8027CD40 002789A0  10 84 28 D4 */	ps_sum0 f4, f4, f3, f5
/* 8027CD44 002789A4  FC A0 20 34 */	frsqrte f5, f4
/* 8027CD48 002789A8  EC C5 01 72 */	fmuls f6, f5, f5
/* 8027CD4C 002789AC  EC 05 00 32 */	fmuls f0, f5, f0
/* 8027CD50 002789B0  EC C6 09 3C */	fnmsubs f6, f6, f4, f1
/* 8027CD54 002789B4  EC A6 00 32 */	fmuls f5, f6, f0
/* 8027CD58 002789B8  10 42 01 58 */	ps_muls0 f2, f2, f5
/* 8027CD5C 002789BC  10 63 01 58 */	ps_muls0 f3, f3, f5
/* 8027CD60 002789C0  F0 44 00 00 */	psq_st f2, 0(r4), 0, qr0
/* 8027CD64 002789C4  F0 64 80 08 */	psq_st f3, 8(r4), 1, qr0
/* 8027CD68 002789C8  4E 80 00 20 */	blr

.global PSVECSquareMag
PSVECSquareMag:
/* 8027CD6C 002789CC  E0 03 00 00 */	psq_l f0, 0(r3), 0, qr0
/* 8027CD70 002789D0  C0 23 00 08 */	lfs f1, 8(r3)
/* 8027CD74 002789D4  10 00 00 32 */	ps_mul f0, f0, f0
/* 8027CD78 002789D8  10 21 00 7A */	ps_madd f1, f1, f1, f0
/* 8027CD7C 002789DC  10 21 00 14 */	ps_sum0 f1, f1, f0, f0
/* 8027CD80 002789E0  4E 80 00 20 */	blr

.global PSVECMag
PSVECMag:
/* 8027CD84 002789E4  E0 03 00 00 */	psq_l f0, 0(r3), 0, qr0
/* 8027CD88 002789E8  C0 82 A0 A8 */	lfs f4, lbl_806426A8-_SDA2_BASE_(r2)
/* 8027CD8C 002789EC  10 00 00 32 */	ps_mul f0, f0, f0
/* 8027CD90 002789F0  C0 23 00 08 */	lfs f1, 8(r3)
/* 8027CD94 002789F4  EC 44 20 28 */	fsubs f2, f4, f4
/* 8027CD98 002789F8  10 21 00 7A */	ps_madd f1, f1, f1, f0
/* 8027CD9C 002789FC  10 21 00 14 */	ps_sum0 f1, f1, f0, f0
/* 8027CDA0 00278A00  FC 01 10 00 */	fcmpu cr0, f1, f2
/* 8027CDA4 00278A04  4D 82 00 20 */	beqlr
/* 8027CDA8 00278A08  FC 00 08 34 */	frsqrte f0, f1
/* 8027CDAC 00278A0C  C0 62 A0 AC */	lfs f3, lbl_806426AC-_SDA2_BASE_(r2)
/* 8027CDB0 00278A10  EC 40 00 32 */	fmuls f2, f0, f0
/* 8027CDB4 00278A14  EC 00 01 32 */	fmuls f0, f0, f4
/* 8027CDB8 00278A18  EC 42 18 7C */	fnmsubs f2, f2, f1, f3
/* 8027CDBC 00278A1C  EC 02 00 32 */	fmuls f0, f2, f0
/* 8027CDC0 00278A20  EC 21 00 32 */	fmuls f1, f1, f0
/* 8027CDC4 00278A24  4E 80 00 20 */	blr

.global PSQUATDotProduct
PSQUATDotProduct:
/* 8027CDC8 00278A28  E0 43 00 04 */	psq_l f2, 4(r3), 0, qr0
/* 8027CDCC 00278A2C  E0 64 00 04 */	psq_l f3, 4(r4), 0, qr0
/* 8027CDD0 00278A30  10 42 00 F2 */	ps_mul f2, f2, f3
/* 8027CDD4 00278A34  E0 A3 00 00 */	psq_l f5, 0(r3), 0, qr0
/* 8027CDD8 00278A38  E0 84 00 00 */	psq_l f4, 0(r4), 0, qr0
/* 8027CDDC 00278A3C  10 65 11 3A */	ps_madd f3, f5, f4, f2
/* 8027CDE0 00278A40  10 23 10 94 */	ps_sum0 f1, f3, f2, f2
/* 8027CDE4 00278A44  4E 80 00 20 */	blr

.global PSVECCrossProduct
PSVECCrossProduct:
/* 8027CDE8 00278A48  E0 24 00 00 */	psq_l f1, 0(r4), 0, qr0
/* 8027CDEC 00278A4C  C0 43 00 08 */	lfs f2, 8(r3)
/* 8027CDF0 00278A50  E0 03 00 00 */	psq_l f0, 0(r3), 0, qr0
/* 8027CDF4 00278A54  10 C1 0C A0 */	ps_merge10 f6, f1, f1
/* 8027CDF8 00278A58  C0 64 00 08 */	lfs f3, 8(r4)
/* 8027CDFC 00278A5C  10 81 00 B2 */	ps_mul f4, f1, f2
/* 8027CE00 00278A60  10 E1 00 18 */	ps_muls0 f7, f1, f0
/* 8027CE04 00278A64  10 A0 20 F8 */	ps_msub f5, f0, f3, f4
/* 8027CE08 00278A68  11 00 39 B8 */	ps_msub f8, f0, f6, f7
/* 8027CE0C 00278A6C  11 25 2C E0 */	ps_merge11 f9, f5, f5
/* 8027CE10 00278A70  11 45 44 60 */	ps_merge01 f10, f5, f8
/* 8027CE14 00278A74  F1 25 80 00 */	psq_st f9, 0(r5), 1, qr0
/* 8027CE18 00278A78  11 40 50 50 */	ps_neg f10, f10
/* 8027CE1C 00278A7C  F1 45 00 04 */	psq_st f10, 4(r5), 0, qr0
/* 8027CE20 00278A80  4E 80 00 20 */	blr

.global C_VECHalfAngle
C_VECHalfAngle:
/* 8027CE24 00278A84  94 21 FF C0 */	stwu r1, -0x40(r1)
/* 8027CE28 00278A88  7C 08 02 A6 */	mflr r0
/* 8027CE2C 00278A8C  C0 43 00 00 */	lfs f2, 0(r3)
/* 8027CE30 00278A90  C0 23 00 04 */	lfs f1, 4(r3)
/* 8027CE34 00278A94  C0 03 00 08 */	lfs f0, 8(r3)
/* 8027CE38 00278A98  FC A0 10 50 */	fneg f5, f2
/* 8027CE3C 00278A9C  C0 44 00 00 */	lfs f2, 0(r4)
/* 8027CE40 00278AA0  FC 80 08 50 */	fneg f4, f1
/* 8027CE44 00278AA4  C0 24 00 04 */	lfs f1, 4(r4)
/* 8027CE48 00278AA8  FC 60 00 50 */	fneg f3, f0
/* 8027CE4C 00278AAC  C0 04 00 08 */	lfs f0, 8(r4)
/* 8027CE50 00278AB0  90 01 00 44 */	stw r0, 0x44(r1)
/* 8027CE54 00278AB4  38 61 00 20 */	addi r3, r1, 0x20
/* 8027CE58 00278AB8  FC 40 10 50 */	fneg f2, f2
/* 8027CE5C 00278ABC  7C 64 1B 78 */	mr r4, r3
/* 8027CE60 00278AC0  93 E1 00 3C */	stw r31, 0x3c(r1)
/* 8027CE64 00278AC4  FC 20 08 50 */	fneg f1, f1
/* 8027CE68 00278AC8  FC 00 00 50 */	fneg f0, f0
/* 8027CE6C 00278ACC  7C BF 2B 78 */	mr r31, r5
/* 8027CE70 00278AD0  D0 A1 00 20 */	stfs f5, 0x20(r1)
/* 8027CE74 00278AD4  D0 81 00 24 */	stfs f4, 0x24(r1)
/* 8027CE78 00278AD8  D0 61 00 28 */	stfs f3, 0x28(r1)
/* 8027CE7C 00278ADC  D0 41 00 14 */	stfs f2, 0x14(r1)
/* 8027CE80 00278AE0  D0 21 00 18 */	stfs f1, 0x18(r1)
/* 8027CE84 00278AE4  D0 01 00 1C */	stfs f0, 0x1c(r1)
/* 8027CE88 00278AE8  4B FF FE A1 */	bl PSVECNormalize
/* 8027CE8C 00278AEC  38 61 00 14 */	addi r3, r1, 0x14
/* 8027CE90 00278AF0  7C 64 1B 78 */	mr r4, r3
/* 8027CE94 00278AF4  4B FF FE 95 */	bl PSVECNormalize
/* 8027CE98 00278AF8  38 61 00 20 */	addi r3, r1, 0x20
/* 8027CE9C 00278AFC  38 81 00 14 */	addi r4, r1, 0x14
/* 8027CEA0 00278B00  38 A1 00 08 */	addi r5, r1, 8
/* 8027CEA4 00278B04  4B FF FE 21 */	bl PSVECAdd
/* 8027CEA8 00278B08  38 61 00 08 */	addi r3, r1, 8
/* 8027CEAC 00278B0C  7C 64 1B 78 */	mr r4, r3
/* 8027CEB0 00278B10  4B FF FF 19 */	bl PSQUATDotProduct
/* 8027CEB4 00278B14  C0 02 A0 B0 */	lfs f0, lbl_806426B0-_SDA2_BASE_(r2)
/* 8027CEB8 00278B18  FC 01 00 40 */	fcmpo cr0, f1, f0
/* 8027CEBC 00278B1C  40 81 00 14 */	ble lbl_8027CED0
/* 8027CEC0 00278B20  7F E4 FB 78 */	mr r4, r31
/* 8027CEC4 00278B24  38 61 00 08 */	addi r3, r1, 8
/* 8027CEC8 00278B28  4B FF FE 61 */	bl PSVECNormalize
/* 8027CECC 00278B2C  48 00 00 1C */	b lbl_8027CEE8
lbl_8027CED0:
/* 8027CED0 00278B30  80 61 00 08 */	lwz r3, 8(r1)
/* 8027CED4 00278B34  80 01 00 0C */	lwz r0, 0xc(r1)
/* 8027CED8 00278B38  90 7F 00 00 */	stw r3, 0(r31)
/* 8027CEDC 00278B3C  90 1F 00 04 */	stw r0, 4(r31)
/* 8027CEE0 00278B40  80 01 00 10 */	lwz r0, 0x10(r1)
/* 8027CEE4 00278B44  90 1F 00 08 */	stw r0, 8(r31)
lbl_8027CEE8:
/* 8027CEE8 00278B48  80 01 00 44 */	lwz r0, 0x44(r1)
/* 8027CEEC 00278B4C  83 E1 00 3C */	lwz r31, 0x3c(r1)
/* 8027CEF0 00278B50  7C 08 03 A6 */	mtlr r0
/* 8027CEF4 00278B54  38 21 00 40 */	addi r1, r1, 0x40
/* 8027CEF8 00278B58  4E 80 00 20 */	blr

.global C_VECReflect
C_VECReflect:
/* 8027CEFC 00278B5C  94 21 FF D0 */	stwu r1, -0x30(r1)
/* 8027CF00 00278B60  7C 08 02 A6 */	mflr r0
/* 8027CF04 00278B64  C0 43 00 00 */	lfs f2, 0(r3)
/* 8027CF08 00278B68  90 01 00 34 */	stw r0, 0x34(r1)
/* 8027CF0C 00278B6C  C0 23 00 04 */	lfs f1, 4(r3)
/* 8027CF10 00278B70  FC 40 10 50 */	fneg f2, f2
/* 8027CF14 00278B74  C0 03 00 08 */	lfs f0, 8(r3)
/* 8027CF18 00278B78  38 61 00 14 */	addi r3, r1, 0x14
/* 8027CF1C 00278B7C  93 E1 00 2C */	stw r31, 0x2c(r1)
/* 8027CF20 00278B80  FC 20 08 50 */	fneg f1, f1
/* 8027CF24 00278B84  FC 00 00 50 */	fneg f0, f0
/* 8027CF28 00278B88  93 C1 00 28 */	stw r30, 0x28(r1)
/* 8027CF2C 00278B8C  7C 9E 23 78 */	mr r30, r4
/* 8027CF30 00278B90  7C BF 2B 78 */	mr r31, r5
/* 8027CF34 00278B94  7C 64 1B 78 */	mr r4, r3
/* 8027CF38 00278B98  D0 41 00 14 */	stfs f2, 0x14(r1)
/* 8027CF3C 00278B9C  D0 21 00 18 */	stfs f1, 0x18(r1)
/* 8027CF40 00278BA0  D0 01 00 1C */	stfs f0, 0x1c(r1)
/* 8027CF44 00278BA4  4B FF FD E5 */	bl PSVECNormalize
/* 8027CF48 00278BA8  7F C3 F3 78 */	mr r3, r30
/* 8027CF4C 00278BAC  38 81 00 08 */	addi r4, r1, 8
/* 8027CF50 00278BB0  4B FF FD D9 */	bl PSVECNormalize
/* 8027CF54 00278BB4  38 61 00 14 */	addi r3, r1, 0x14
/* 8027CF58 00278BB8  38 81 00 08 */	addi r4, r1, 8
/* 8027CF5C 00278BBC  4B FF FE 6D */	bl PSQUATDotProduct
/* 8027CF60 00278BC0  C0 62 A0 B4 */	lfs f3, lbl_806426B4-_SDA2_BASE_(r2)
/* 8027CF64 00278BC4  7F E3 FB 78 */	mr r3, r31
/* 8027CF68 00278BC8  C0 41 00 08 */	lfs f2, 8(r1)
/* 8027CF6C 00278BCC  7F E4 FB 78 */	mr r4, r31
/* 8027CF70 00278BD0  C0 01 00 14 */	lfs f0, 0x14(r1)
/* 8027CF74 00278BD4  EC 43 00 B2 */	fmuls f2, f3, f2
/* 8027CF78 00278BD8  EC 42 00 72 */	fmuls f2, f2, f1
/* 8027CF7C 00278BDC  EC 02 00 28 */	fsubs f0, f2, f0
/* 8027CF80 00278BE0  D0 1F 00 00 */	stfs f0, 0(r31)
/* 8027CF84 00278BE4  C0 41 00 0C */	lfs f2, 0xc(r1)
/* 8027CF88 00278BE8  C0 01 00 18 */	lfs f0, 0x18(r1)
/* 8027CF8C 00278BEC  EC 43 00 B2 */	fmuls f2, f3, f2
/* 8027CF90 00278BF0  EC 42 00 72 */	fmuls f2, f2, f1
/* 8027CF94 00278BF4  EC 02 00 28 */	fsubs f0, f2, f0
/* 8027CF98 00278BF8  D0 1F 00 04 */	stfs f0, 4(r31)
/* 8027CF9C 00278BFC  C0 41 00 10 */	lfs f2, 0x10(r1)
/* 8027CFA0 00278C00  C0 01 00 1C */	lfs f0, 0x1c(r1)
/* 8027CFA4 00278C04  EC 43 00 B2 */	fmuls f2, f3, f2
/* 8027CFA8 00278C08  EC 22 00 72 */	fmuls f1, f2, f1
/* 8027CFAC 00278C0C  EC 01 00 28 */	fsubs f0, f1, f0
/* 8027CFB0 00278C10  D0 1F 00 08 */	stfs f0, 8(r31)
/* 8027CFB4 00278C14  4B FF FD 75 */	bl PSVECNormalize
/* 8027CFB8 00278C18  80 01 00 34 */	lwz r0, 0x34(r1)
/* 8027CFBC 00278C1C  83 E1 00 2C */	lwz r31, 0x2c(r1)
/* 8027CFC0 00278C20  83 C1 00 28 */	lwz r30, 0x28(r1)
/* 8027CFC4 00278C24  7C 08 03 A6 */	mtlr r0
/* 8027CFC8 00278C28  38 21 00 30 */	addi r1, r1, 0x30
/* 8027CFCC 00278C2C  4E 80 00 20 */	blr

.global PSVECDistance
PSVECDistance:
/* 8027CFD0 00278C30  E0 03 00 04 */	psq_l f0, 4(r3), 0, qr0
/* 8027CFD4 00278C34  E0 24 00 04 */	psq_l f1, 4(r4), 0, qr0
/* 8027CFD8 00278C38  C0 62 A0 A8 */	lfs f3, lbl_806426A8-_SDA2_BASE_(r2)
/* 8027CFDC 00278C3C  10 40 08 28 */	ps_sub f2, f0, f1
/* 8027CFE0 00278C40  E0 03 00 00 */	psq_l f0, 0(r3), 0, qr0
/* 8027CFE4 00278C44  E0 24 00 00 */	psq_l f1, 0(r4), 0, qr0
/* 8027CFE8 00278C48  EC 83 18 28 */	fsubs f4, f3, f3
/* 8027CFEC 00278C4C  10 42 00 B2 */	ps_mul f2, f2, f2
/* 8027CFF0 00278C50  10 00 08 28 */	ps_sub f0, f0, f1
/* 8027CFF4 00278C54  10 20 10 3A */	ps_madd f1, f0, f0, f2
/* 8027CFF8 00278C58  10 21 10 94 */	ps_sum0 f1, f1, f2, f2
/* 8027CFFC 00278C5C  FC 04 08 00 */	fcmpu cr0, f4, f1
/* 8027D000 00278C60  4D 82 00 20 */	beqlr
/* 8027D004 00278C64  FC 00 08 34 */	frsqrte f0, f1
/* 8027D008 00278C68  C0 82 A0 AC */	lfs f4, lbl_806426AC-_SDA2_BASE_(r2)
/* 8027D00C 00278C6C  EC 40 00 32 */	fmuls f2, f0, f0
/* 8027D010 00278C70  EC 00 00 F2 */	fmuls f0, f0, f3
/* 8027D014 00278C74  EC 42 20 7C */	fnmsubs f2, f2, f1, f4
/* 8027D018 00278C78  EC 02 00 32 */	fmuls f0, f2, f0
/* 8027D01C 00278C7C  EC 21 00 32 */	fmuls f1, f1, f0
/* 8027D020 00278C80  4E 80 00 20 */	blr