PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vuhw.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# (c) 2009 Lion
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include <libvux.h>
12
13void Vu0IdMatrix(VU_MATRIX *m)
14{
15 Vu0ResetMatrix(m);
16}
17
18void Vu0ResetMatrix(VU_MATRIX *m)
19{
20 asm __volatile__(
21#if __GNUC__ > 3
22 "vmr32.xyzw $vf18, $vf0 \n"
23 "sqc2 $vf0, 0x30(%0) \n"
24 "vmr32.xyzw $vf17, $vf18 \n"
25 "sqc2 $vf18, 0x20(%0) \n"
26 "vmr32.xyzw $vf16, $vf17 \n"
27 "sqc2 $vf17, 0x10(%0) \n"
28 "sqc2 $vf16, 0x00(%0) \n"
29#else
30 "vmr32.xyzw vf18, vf00 \n"
31 "sqc2 vf00, 0x30(%0) \n"
32 "vmr32.xyzw vf17, vf18 \n"
33 "sqc2 vf18, 0x20(%0) \n"
34 "vmr32.xyzw vf16, vf17 \n"
35 "sqc2 vf17, 0x10(%0) \n"
36 "sqc2 vf16, 0x00(%0) \n"
37#endif
38
39 : : "r"(m)
40 );
41}
42
43#if 0
44void VuxRotMatrix(VU_MATRIX *m, VU_VECTOR *r)
45{
46 VU_MATRIX mx,my,mz, m0;
47
48 VuxResetMatrix(m);
49 mx = my = mz = m0 = *m;
50
51
52 VuxRotMatrixX(&mx, r->x);
53 VuxRotMatrixY(&my, r->y);
54 VuxRotMatrixZ(&mz, r->z);
55
56 VuxMulMatrix(&mx, &my, &m0);
57 VuxMulMatrix(&m0, &mz, m);
58}
59#endif
60
61void Vu0TransMatrix(VU_MATRIX *m, VU_VECTOR *t)
62{
63
64 asm __volatile__ (
65#if __GNUC__ > 3
66 "lqc2 $vf1, 0(%1) \n" // load 1 qword from 't' to vu's vf1
67 "sqc2 $vf1, 48(%0) \n" // store vf1 data in 'm' with 48 bytes offset which is m[3][0]
68#else
69 "lqc2 vf1, 0(%1) \n" // load 1 qword from 't' to vu's vf1
70 "sqc2 vf1, 48(%0) \n" // store vf1 data in 'm' with 48 bytes offset which is m[3][0]
71#endif
72
73 : : "r" (m), "r" (t)
74 );
75}
76
77void Vu0TransMatrixXYZ(VU_MATRIX *m,float x, float y, float z)
78{
79 VU_VECTOR t;
80
81 t.x = x;
82 t.y = y;
83 t.z = z;
84 t.w = 1.0f;
85
86 Vu0TransMatrix(m, &t);
87}
88
89/*
90 THIS SCALE IS CROP, CLEAN IT UP ************************(99999999(****************************
91 */
92
93void Vu0ScaleMatrix(VU_MATRIX *m, VU_VECTOR *s)
94{
95
96 asm __volatile__ (
97#if __GNUC__ > 3
98 "lqc2 $vf1, 0(%1) \n" // load 1 qword from 't' to vu's vf1
99 "lqc2 $vf10, 0(%0) \n" // load m[0][0]
100 "lqc2 $vf11, 16(%0) \n" // load m[1][0]
101 "lqc2 $vf12, 32(%0) \n" // load m[2][0]
102 // "lqc2 $vf123,48(%0) \n" // load m[3][0]
103
104 "vmulx.x $vf10, $vf10, $vf1x \n" // multiply [0][0] by s->x and store in [0][0]
105 "vmuly.y $vf11, $vf11, $vf1y \n"
106 "vmulz.z $vf12, $vf12, $vf1z \n"
107
108
109 "sqc2 $vf10, 0(%0) \n" // store v m[0][0]
110 "sqc2 $vf11, 16(%0) \n" // store v m[1][0]
111 "sqc2 $vf12, 32(%0) \n" // store v m[2][0]
112// "sqc2 $vf1, 48(%0) \n" // store v m[3][0]
113#else
114 "lqc2 vf1, 0(%1) \n" // load 1 qword from 't' to vu's vf1
115 "lqc2 vf10, 0(%0) \n" // load m[0][0]
116 "lqc2 vf11, 16(%0) \n" // load m[1][0]
117 "lqc2 vf12, 32(%0) \n" // load m[2][0]
118 // "lqc2 vf123,48(%0) \n" // load m[3][0]
119
120 "vmulx.x vf10, vf10, vf1x \n" // multiply [0][0] by s->x and store in [0][0]
121 "vmuly.y vf11, vf11, vf1y \n"
122 "vmulz.z vf12, vf12, vf1z \n"
123
124
125 "sqc2 vf10, 0(%0) \n" // store v m[0][0]
126 "sqc2 vf11, 16(%0) \n" // store v m[1][0]
127 "sqc2 vf12, 32(%0) \n" // store v m[2][0]
128// "sqc2 vf1, 48(%0) \n" // store v m[3][0]
129#endif
130
131 : : "r" (m), "r" (s)
132 );
133
134}
135
136void Vu0ScaleMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
137{
138 VU_VECTOR s;
139 s.x = x;
140 s.y = y;
141 s.z = z;
142 s.w = 1.0f;
143
144 Vu0ScaleMatrix(m, &s);
145
146}
147
148void Vu0MulMatrix(VU_MATRIX *m0, VU_MATRIX *m1, VU_MATRIX *out)
149{
150
151 asm __volatile__ (
152#if __GNUC__ > 3
153 "lqc2 $vf1, 0x00(%0) \n"
154 "lqc2 $vf2, 0x10(%0) \n"
155 "lqc2 $vf3, 0x20(%0) \n"
156 "lqc2 $vf4, 0x30(%0) \n"
157 "lqc2 $vf5, 0x00(%1) \n"
158 "lqc2 $vf6, 0x10(%1) \n"
159 "lqc2 $vf7, 0x20(%1) \n"
160 "lqc2 $vf8, 0x30(%1) \n"
161 "vmulax.xyzw $ACC, $vf5, $vf1 \n"
162 "vmadday.xyzw $ACC, $vf6, $vf1 \n"
163 "vmaddaz.xyzw $ACC, $vf7, $vf1 \n"
164 "vmaddw.xyzw $vf1, $vf8, $vf1 \n"
165 "vmulax.xyzw $ACC, $vf5, $vf2 \n"
166 "vmadday.xyzw $ACC, $vf6, $vf2 \n"
167 "vmaddaz.xyzw $ACC, $vf7, $vf2 \n"
168 "vmaddw.xyzw $vf2, $vf8, $vf2 \n"
169 "vmulax.xyzw $ACC, $vf5, $vf3 \n"
170 "vmadday.xyzw $ACC, $vf6, $vf3 \n"
171 "vmaddaz.xyzw $ACC, $vf7, $vf3 \n"
172 "vmaddw.xyzw $vf3, $vf8, $vf3 \n"
173 "vmulax.xyzw $ACC, $vf5, $vf4 \n"
174 "vmadday.xyzw $ACC, $vf6, $vf4 \n"
175 "vmaddaz.xyzw $ACC, $vf7, $vf4 \n"
176 "vmaddw.xyzw $vf4, $vf8, $vf4 \n"
177 "sqc2 $vf1, 0x00(%2) \n"
178 "sqc2 $vf2, 0x10(%2) \n"
179 "sqc2 $vf3, 0x20(%2) \n"
180 "sqc2 $vf4, 0x30(%2) \n"
181#else
182 "lqc2 vf1, 0x00(%0) \n"
183 "lqc2 vf2, 0x10(%0) \n"
184 "lqc2 vf3, 0x20(%0) \n"
185 "lqc2 vf4, 0x30(%0) \n"
186 "lqc2 vf5, 0x00(%1) \n"
187 "lqc2 vf6, 0x10(%1) \n"
188 "lqc2 vf7, 0x20(%1) \n"
189 "lqc2 vf8, 0x30(%1) \n"
190 "vmulax.xyzw ACC, vf5, vf1 \n"
191 "vmadday.xyzw ACC, vf6, vf1 \n"
192 "vmaddaz.xyzw ACC, vf7, vf1 \n"
193 "vmaddw.xyzw vf1, vf8, vf1 \n"
194 "vmulax.xyzw ACC, vf5, vf2 \n"
195 "vmadday.xyzw ACC, vf6, vf2 \n"
196 "vmaddaz.xyzw ACC, vf7, vf2 \n"
197 "vmaddw.xyzw vf2, vf8, vf2 \n"
198 "vmulax.xyzw ACC, vf5, vf3 \n"
199 "vmadday.xyzw ACC, vf6, vf3 \n"
200 "vmaddaz.xyzw ACC, vf7, vf3 \n"
201 "vmaddw.xyzw vf3, vf8, vf3 \n"
202 "vmulax.xyzw ACC, vf5, vf4 \n"
203 "vmadday.xyzw ACC, vf6, vf4 \n"
204 "vmaddaz.xyzw ACC, vf7, vf4 \n"
205 "vmaddw.xyzw vf4, vf8, vf4 \n"
206 "sqc2 vf1, 0x00(%2) \n"
207 "sqc2 vf2, 0x10(%2) \n"
208 "sqc2 vf3, 0x20(%2) \n"
209 "sqc2 vf4, 0x30(%2) \n"
210#endif
211 : : "r" (m0), "r" (m1), "r" (out)
212 );
213}
214
215void Vu0InverseMatrix(VU_MATRIX *in, VU_MATRIX *out)
216{
217 (void)in;
218 (void)out;
219}
220
221void Vu0ApplyMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
222{
223 /*
224 out->x = m->m[0][0]*v0->x + m->m[1][0]*v0->y + m->m[2][0]*v0->z + m->m[3][0]*v0->w;
225 out->y = m->m[0][1]*v0->x + m->m[1][1]*v0->y + m->m[2][1]*v0->z + m->m[3][1]*v0->w;
226 out->z = m->m[0][2]*v0->x + m->m[1][2]*v0->y + m->m[2][2]*v0->z + m->m[3][2]*v0->w;
227 out->w = m->m[0][3]*v0->x + m->m[1][3]*v0->y + m->m[2][3]*v0->z + m->m[3][3]*v0->w;
228 */
229
230 asm __volatile__(
231#if __GNUC__ > 3
232 "lqc2 $vf20, 0x00(%1) \n"
233 "lqc2 $vf16, 0x00(%0) \n"
234 "lqc2 $vf17, 0x10(%0) \n"
235 "lqc2 $vf18, 0x20(%0) \n"
236 "lqc2 $vf19, 0x30(%0) \n"
237 "vmulax.xyzw $ACC, $vf16,$vf20 \n"
238 "vmadday.xyzw $ACC, $vf17,$vf20 \n"
239 "vmaddaz.xyzw $ACC, $vf18,$vf20 \n"
240 "vmaddw.xyzw $vf20, $vf19,$vf20 \n"
241 "sqc2 $vf20,0x00(%2) \n"
242#else
243 "lqc2 vf20, 0x00(%1) \n"
244 "lqc2 vf16, 0x00(%0) \n"
245 "lqc2 vf17, 0x10(%0) \n"
246 "lqc2 vf18, 0x20(%0) \n"
247 "lqc2 vf19, 0x30(%0) \n"
248 "vmulax.xyzw ACC, vf16,vf20 \n"
249 "vmadday.xyzw ACC, vf17,vf20 \n"
250 "vmaddaz.xyzw ACC, vf18,vf20 \n"
251 "vmaddw.xyzw vf20, vf19,vf20 \n"
252 "sqc2 vf20,0x00(%2) \n"
253#endif
254 : : "r"(m), "r"(v0), "r"(out)
255 );
256
257}
258
259void Vu0ApplyRotMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
260{
261 /*
262 out->x = m->m[0][0]*v0->x + m->m[1][0]*v0->y + m->m[2][0]*v0->z;
263 out->y = m->m[0][1]*v0->x + m->m[1][1]*v0->y + m->m[2][1]*v0->z;
264 out->z = m->m[0][2]*v0->x + m->m[1][2]*v0->y + m->m[2][2]*v0->z;
265 */
266
267 asm __volatile__(
268#if __GNUC__ > 3
269 "lqc2 $vf20, 0x00(%1) \n"
270 "lqc2 $vf16, 0x00(%0) \n"
271 "lqc2 $vf17, 0x10(%0) \n"
272 "lqc2 $vf18, 0x20(%0) \n"
273 "vmulax.xyz $ACC, $vf16,$vf20 \n"
274 "vmadday.xyz $ACC, $vf17,$vf20 \n"
275 "vmaddz.xyz $vf20, $vf18,$vf20 \n"
276 "vmulw.w $vf20, $vf0, $vf0 \n" // out->w = 1.0f
277 "sqc2 $vf20, 0x00(%2) \n" // copy result to out
278#else
279 "lqc2 vf20, 0x00(%1) \n"
280 "lqc2 vf16, 0x00(%0) \n"
281 "lqc2 vf17, 0x10(%0) \n"
282 "lqc2 vf18, 0x20(%0) \n"
283 "vmulax.xyz ACC, vf16,vf20 \n"
284 "vmadday.xyz ACC, vf17,vf20 \n"
285 "vmaddz.xyz vf20, vf18,vf20 \n"
286 "vmulw.w vf20, vf0, vf0 \n" // out->w = 1.0f
287 "sqc2 vf20, 0x00(%2) \n" // copy result to out
288#endif
289 : : "r"(m), "r"(v0), "r"(out)
290 );
291
292}
293
294void Vu0CopyMatrix(VU_MATRIX *dest, VU_MATRIX *src)
295{
296
297 asm __volatile__ (
298#if __GNUC__ > 3
299 "lqc2 $vf1, 0(%1) \n" // load 1 qword from ee
300 "lqc2 $vf2, 16(%1) \n" // load 1 qword from ee
301 "lqc2 $vf3, 32(%1) \n" // load 1 qword from ee
302 "lqc2 $vf4, 48(%1) \n" // load 1 qword from ee
303
304 "sqc2 $vf1, 0(%0) \n" // store 1 qword in ee
305 "sqc2 $vf2, 16(%0) \n" // store 1 qword in ee
306 "sqc2 $vf3, 32(%0) \n" // store 1 qword in ee
307 "sqc2 $vf4, 48(%0) \n" // store 1 qword in ee
308#else
309 "lqc2 vf1, 0(%1) \n" // load 1 qword from ee
310 "lqc2 vf2, 16(%1) \n" // load 1 qword from ee
311 "lqc2 vf3, 32(%1) \n" // load 1 qword from ee
312 "lqc2 vf4, 48(%1) \n" // load 1 qword from ee
313
314 "sqc2 vf1, 0(%0) \n" // store 1 qword in ee
315 "sqc2 vf2, 16(%0) \n" // store 1 qword in ee
316 "sqc2 vf3, 32(%0) \n" // store 1 qword in ee
317 "sqc2 vf4, 48(%0) \n" // store 1 qword in ee
318#endif
319
320 : : "r" (dest), "r" (src)
321 );
322}
323
324float Vu0DotProduct(VU_VECTOR *v0, VU_VECTOR *v1)
325{
326 float ret=0;
327
328 /* ret = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z);*/
329
330 asm __volatile__ (
331#if __GNUC__ > 3
332 "lqc2 $vf1, 0(%1) \n" // load 1 qword from ee
333 "lqc2 $vf2, 0(%2) \n" // load 1 qword from ee
334
335 "vmul.xyz $vf3, $vf1, $vf2 \n" // mul v0 by v1
336
337 "vaddy.x $vf3, $vf3, $vf3y \n" // add x+y and store in x
338 "vaddz.x $vf3, $vf3, $vf3z \n" // add z+x and store in x
339
340 "qmfc2 %0, $vf3 \n" // copy vector to ee reg
341#else
342 "lqc2 vf1, 0(%1) \n" // load 1 qword from ee
343 "lqc2 vf2, 0(%2) \n" // load 1 qword from ee
344
345 "vmul.xyz vf3, vf1, vf2 \n" // mul v0 by v1
346
347 "vaddy.x vf3, vf3, vf3y \n" // add x+y and store in x
348 "vaddz.x vf3, vf3, vf3z \n" // add z+x and store in x
349
350 "qmfc2 %0, vf3 \n" // copy vector to ee reg
351#endif
352 : "=r" (ret) : "r" (v0), "r" (v1)
353 );
354
355 return ret;
356}