ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
vuhw.c
Go to the documentation of this file.
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 
14 {
15  Vu0ResetMatrix(m);
16 }
17 
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
44 void 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 
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 
77 void 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 
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 
136 void 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 
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 
216 {}
217 
219 {
220  /*
221  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;
222  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;
223  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;
224  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;
225  */
226 
227  asm __volatile__(
228 #if __GNUC__ > 3
229  "lqc2 $vf20, 0x00(%1) \n"
230  "lqc2 $vf16, 0x00(%0) \n"
231  "lqc2 $vf17, 0x10(%0) \n"
232  "lqc2 $vf18, 0x20(%0) \n"
233  "lqc2 $vf19, 0x30(%0) \n"
234  "vmulax.xyzw $ACC, $vf16,$vf20 \n"
235  "vmadday.xyzw $ACC, $vf17,$vf20 \n"
236  "vmaddaz.xyzw $ACC, $vf18,$vf20 \n"
237  "vmaddw.xyzw $vf20, $vf19,$vf20 \n"
238  "sqc2 $vf20,0x00(%2) \n"
239 #else
240  "lqc2 vf20, 0x00(%1) \n"
241  "lqc2 vf16, 0x00(%0) \n"
242  "lqc2 vf17, 0x10(%0) \n"
243  "lqc2 vf18, 0x20(%0) \n"
244  "lqc2 vf19, 0x30(%0) \n"
245  "vmulax.xyzw ACC, vf16,vf20 \n"
246  "vmadday.xyzw ACC, vf17,vf20 \n"
247  "vmaddaz.xyzw ACC, vf18,vf20 \n"
248  "vmaddw.xyzw vf20, vf19,vf20 \n"
249  "sqc2 vf20,0x00(%2) \n"
250 #endif
251  : : "r"(m), "r"(v0), "r"(out)
252  );
253 
254 }
255 
257 {
258  /*
259  out->x = m->m[0][0]*v0->x + m->m[1][0]*v0->y + m->m[2][0]*v0->z;
260  out->y = m->m[0][1]*v0->x + m->m[1][1]*v0->y + m->m[2][1]*v0->z;
261  out->z = m->m[0][2]*v0->x + m->m[1][2]*v0->y + m->m[2][2]*v0->z;
262  */
263 
264  asm __volatile__(
265 #if __GNUC__ > 3
266  "lqc2 $vf20, 0x00(%1) \n"
267  "lqc2 $vf16, 0x00(%0) \n"
268  "lqc2 $vf17, 0x10(%0) \n"
269  "lqc2 $vf18, 0x20(%0) \n"
270  "vmulax.xyz $ACC, $vf16,$vf20 \n"
271  "vmadday.xyz $ACC, $vf17,$vf20 \n"
272  "vmaddz.xyz $vf20, $vf18,$vf20 \n"
273  "vmulw.w $vf20, $vf0, $vf0 \n" // out->w = 1.0f
274  "sqc2 $vf20, 0x00(%2) \n" // copy result to out
275 #else
276  "lqc2 vf20, 0x00(%1) \n"
277  "lqc2 vf16, 0x00(%0) \n"
278  "lqc2 vf17, 0x10(%0) \n"
279  "lqc2 vf18, 0x20(%0) \n"
280  "vmulax.xyz ACC, vf16,vf20 \n"
281  "vmadday.xyz ACC, vf17,vf20 \n"
282  "vmaddz.xyz vf20, vf18,vf20 \n"
283  "vmulw.w vf20, vf0, vf0 \n" // out->w = 1.0f
284  "sqc2 vf20, 0x00(%2) \n" // copy result to out
285 #endif
286  : : "r"(m), "r"(v0), "r"(out)
287  );
288 
289 }
290 
292 {
293 
294  asm __volatile__ (
295 #if __GNUC__ > 3
296  "lqc2 $vf1, 0(%1) \n" // load 1 qword from ee
297  "lqc2 $vf2, 16(%1) \n" // load 1 qword from ee
298  "lqc2 $vf3, 32(%1) \n" // load 1 qword from ee
299  "lqc2 $vf4, 48(%1) \n" // load 1 qword from ee
300 
301  "sqc2 $vf1, 0(%0) \n" // store 1 qword in ee
302  "sqc2 $vf2, 16(%0) \n" // store 1 qword in ee
303  "sqc2 $vf3, 32(%0) \n" // store 1 qword in ee
304  "sqc2 $vf4, 48(%0) \n" // store 1 qword in ee
305 #else
306  "lqc2 vf1, 0(%1) \n" // load 1 qword from ee
307  "lqc2 vf2, 16(%1) \n" // load 1 qword from ee
308  "lqc2 vf3, 32(%1) \n" // load 1 qword from ee
309  "lqc2 vf4, 48(%1) \n" // load 1 qword from ee
310 
311  "sqc2 vf1, 0(%0) \n" // store 1 qword in ee
312  "sqc2 vf2, 16(%0) \n" // store 1 qword in ee
313  "sqc2 vf3, 32(%0) \n" // store 1 qword in ee
314  "sqc2 vf4, 48(%0) \n" // store 1 qword in ee
315 #endif
316 
317  : : "r" (dest), "r" (src)
318  );
319 }
320 
322 {
323  float ret=0;
324 
325  /* ret = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z);*/
326 
327  asm __volatile__ (
328 #if __GNUC__ > 3
329  "lqc2 $vf1, 0(%1) \n" // load 1 qword from ee
330  "lqc2 $vf2, 0(%2) \n" // load 1 qword from ee
331 
332  "vmul.xyz $vf3, $vf1, $vf2 \n" // mul v0 by v1
333 
334  "vaddy.x $vf3, $vf3, $vf3y \n" // add x+y and store in x
335  "vaddz.x $vf3, $vf3, $vf3z \n" // add z+x and store in x
336 
337  "qmfc2 %0, $vf3 \n" // copy vector to ee reg
338 #else
339  "lqc2 vf1, 0(%1) \n" // load 1 qword from ee
340  "lqc2 vf2, 0(%2) \n" // load 1 qword from ee
341 
342  "vmul.xyz vf3, vf1, vf2 \n" // mul v0 by v1
343 
344  "vaddy.x vf3, vf3, vf3y \n" // add x+y and store in x
345  "vaddz.x vf3, vf3, vf3z \n" // add z+x and store in x
346 
347  "qmfc2 %0, vf3 \n" // copy vector to ee reg
348 #endif
349  : "=r" (ret) : "r" (v0), "r" (v1)
350  );
351 
352  return ret;
353 }
#define v0
Definition: as_reg_compat.h:35
#define v1
Definition: as_reg_compat.h:36
s32 x
Definition: libmouse.c:34
s32 y
Definition: libmouse.c:34
void VuxRotMatrixX(VU_MATRIX *m, float x)
Definition: vusw.c:74
void VuxRotMatrixZ(VU_MATRIX *m, float z)
Definition: vusw.c:129
void VuxRotMatrix(VU_MATRIX *m, VU_VECTOR *v)
Definition: vusw.c:51
void VuxResetMatrix(VU_MATRIX *m)
Definition: vusw.c:39
void VuxRotMatrixY(VU_MATRIX *m, float y)
Definition: vusw.c:101
void VuxMulMatrix(VU_MATRIX *m0, VU_MATRIX *m1, VU_MATRIX *out)
Definition: vusw.c:251
s32 s
Definition: ps2ipc.c:30
float w
Definition: libvux.h:48
float x
Definition: libvux.h:45
float z
Definition: libvux.h:47
float y
Definition: libvux.h:46
void Vu0TransMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
Definition: vuhw.c:77
void Vu0IdMatrix(VU_MATRIX *m)
Definition: vuhw.c:13
void Vu0TransMatrix(VU_MATRIX *m, VU_VECTOR *t)
Definition: vuhw.c:61
void Vu0CopyMatrix(VU_MATRIX *dest, VU_MATRIX *src)
Definition: vuhw.c:291
void Vu0MulMatrix(VU_MATRIX *m0, VU_MATRIX *m1, VU_MATRIX *out)
Definition: vuhw.c:148
void Vu0ScaleMatrix(VU_MATRIX *m, VU_VECTOR *s)
Definition: vuhw.c:93
void Vu0ResetMatrix(VU_MATRIX *m)
Definition: vuhw.c:18
void Vu0ApplyMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
Definition: vuhw.c:218
void Vu0ScaleMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
Definition: vuhw.c:136
void Vu0InverseMatrix(VU_MATRIX *in, VU_MATRIX *out)
Definition: vuhw.c:215
void Vu0ApplyRotMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
Definition: vuhw.c:256
float Vu0DotProduct(VU_VECTOR *v0, VU_VECTOR *v1)
Definition: vuhw.c:321