Nugget
Loading...
Searching...
No Matches
inline_n.h
Go to the documentation of this file.
1/*
2 * GTE Macro definitions - special version for Nugget (NO DMPSX)
3 */
4
5/*
6 * Type 1 functions
7 */
8
9#define gte_ldv0(r0) \
10 __asm__ volatile( \
11 "lwc2 $0, 0( %0 );" \
12 "lwc2 $1, 4( %0 )" \
13 : \
14 : "r"(r0))
15
16#define gte_ldv1(r0) \
17 __asm__ volatile( \
18 "lwc2 $2, 0( %0 );" \
19 "lwc2 $3, 4( %0 )" \
20 : \
21 : "r"(r0))
22
23#define gte_ldv2(r0) \
24 __asm__ volatile( \
25 "lwc2 $4, 0( %0 );" \
26 "lwc2 $5, 4( %0 )" \
27 : \
28 : "r"(r0))
29
30#define gte_ldv3(r0, r1, r2) \
31 __asm__ volatile( \
32 "lwc2 $0, 0( %0 );" \
33 "lwc2 $1, 4( %0 );" \
34 "lwc2 $2, 0( %1 );" \
35 "lwc2 $3, 4( %1 );" \
36 "lwc2 $4, 0( %2 );" \
37 "lwc2 $5, 4( %2 )" \
38 : \
39 : "r"(r0), "r"(r1), "r"(r2))
40
41#define gte_ldv3c(r0) \
42 __asm__ volatile( \
43 "lwc2 $0, 0( %0 );" \
44 "lwc2 $1, 4( %0 );" \
45 "lwc2 $2, 8( %0 );" \
46 "lwc2 $3, 12( %0 );" \
47 "lwc2 $4, 16( %0 );" \
48 "lwc2 $5, 20( %0 )" \
49 : \
50 : "r"(r0))
51
52#define gte_ldv3c_vertc(r0) \
53 __asm__ volatile( \
54 "lwc2 $0, 0( %0 );" \
55 "lwc2 $1, 4( %0 );" \
56 "lwc2 $2, 12( %0 );" \
57 "lwc2 $3, 16( %0 );" \
58 "lwc2 $4, 24( %0 );" \
59 "lwc2 $5, 28( %0 )" \
60 : \
61 : "r"(r0))
62
63#define gte_ldv01(r0, r1) \
64 __asm__ volatile( \
65 "lwc2 $0, 0( %0 );" \
66 "lwc2 $1, 4( %0 );" \
67 "lwc2 $2, 0( %1 );" \
68 "lwc2 $3, 4( %1 )" \
69 : \
70 : "r"(r0), "r"(r1))
71
72#define gte_ldv01c(r0) \
73 __asm__ volatile( \
74 "lwc2 $0, 0( %0 );" \
75 "lwc2 $1, 4( %0 );" \
76 "lwc2 $2, 8( %0 );" \
77 "lwc2 $3, 12( %0 )" \
78 : \
79 : "r"(r0))
80
81#define gte_ldrgb(r0) __asm__ volatile("lwc2 $6, 0( %0 )" : : "r"(r0))
82
83#define gte_ldrgb3(r0, r1, r2) \
84 __asm__ volatile( \
85 "lwc2 $20, 0( %0 );" \
86 "lwc2 $21, 0( %1 );" \
87 "lwc2 $22, 0( %2 );" \
88 "lwc2 $6, 0( %2 )" \
89 : \
90 : "r"(r0), "r"(r1), "r"(r2))
91
92#define gte_ldrgb3c(r0) \
93 __asm__ volatile( \
94 "lwc2 $20, 0( %0 );" \
95 "lwc2 $21, 4( %0 );" \
96 "lwc2 $22, 8( %0 );" \
97 "lwc2 $6, 8( %0 )" \
98 : \
99 : "r"(r0))
100
101#define gte_ldlv0(r0) \
102 __asm__ volatile( \
103 "lhu $13, 4( %0 );" \
104 "lhu $12, 0( %0 );" \
105 "sll $13, $13, 16;" \
106 "or $12, $12, $13;" \
107 "mtc2 $12, $0;" \
108 "lwc2 $1, 8( %0 )" \
109 : \
110 : "r"(r0) \
111 : "$12", "$13")
112
113#define gte_ldlvl(r0) \
114 __asm__ volatile( \
115 "lwc2 $9, 0( %0 );" \
116 "lwc2 $10, 4( %0 );" \
117 "lwc2 $11, 8( %0 )" \
118 : \
119 : "r"(r0))
120
121#define gte_ldsv(r0) \
122 __asm__ volatile( \
123 "lhu $12, 0( %0 );" \
124 "lhu $13, 2( %0 );" \
125 "lhu $14, 4( %0 );" \
126 "mtc2 $12, $9;" \
127 "mtc2 $13, $10;" \
128 "mtc2 $14, $11" \
129 : \
130 : "r"(r0) \
131 : "$12", "$13", "$14")
132
133#define gte_ldbv(r0) \
134 __asm__ volatile( \
135 "lbu $12, 0( %0 );" \
136 "lbu $13, 1( %0 );" \
137 "mtc2 $12, $9;" \
138 "mtc2 $13, $10" \
139 : \
140 : "r"(r0) \
141 : "$12", "$13")
142
143#define gte_ldcv(r0) \
144 __asm__ volatile( \
145 "lbu $12, 0( %0 );" \
146 "lbu $13, 1( %0 );" \
147 "lbu $14, 2( %0 );" \
148 "mtc2 $12, $9;" \
149 "mtc2 $13, $10;" \
150 "mtc2 $14, $11" \
151 : \
152 : "r"(r0) \
153 : "$12", "$13", "$14")
154
155#define gte_ldclmv(r0) \
156 __asm__ volatile( \
157 "lhu $12, 0( %0 );" \
158 "lhu $13, 6( %0 );" \
159 "lhu $14, 12( %0 );" \
160 "mtc2 $12, $9;" \
161 "mtc2 $13, $10;" \
162 "mtc2 $14, $11" \
163 : \
164 : "r"(r0) \
165 : "$12", "$13", "$14")
166
167#define gte_lddp(r0) __asm__ volatile("mtc2 %0, $8" : : "r"(r0))
168
169#define gte_ldsxy0(r0) __asm__ volatile("mtc2 %0, $12" : : "r"(r0))
170
171#define gte_ldsxy1(r0) __asm__ volatile("mtc2 %0, $13" : : "r"(r0))
172
173#define gte_ldsxy2(r0) __asm__ volatile("mtc2 %0, $14" : : "r"(r0))
174
175#define gte_ldsxy3(r0, r1, r2) \
176 __asm__ volatile( \
177 "mtc2 %0, $12;" \
178 "mtc2 %2, $14;" \
179 "mtc2 %1, $13" \
180 : \
181 : "r"(r0), "r"(r1), "r"(r2))
182
183#define gte_ldsxy3c(r0) \
184 __asm__ volatile( \
185 "lwc2 $12, 0( %0 );" \
186 "lwc2 $13, 4( %0 );" \
187 "lwc2 $14, 8( %0 )" \
188 : \
189 : "r"(r0))
190
191#define gte_ldsz3(r0, r1, r2) \
192 __asm__ volatile( \
193 "mtc2 %0, $17;" \
194 "mtc2 %1, $18;" \
195 "mtc2 %2, $19" \
196 : \
197 : "r"(r0), "r"(r1), "r"(r2))
198
199#define gte_ldsz4(r0, r1, r2, r3) \
200 __asm__ volatile( \
201 "mtc2 %0, $16;" \
202 "mtc2 %1, $17;" \
203 "mtc2 %2, $18;" \
204 "mtc2 %3, $19" \
205 : \
206 : "r"(r0), "r"(r1), "r"(r2), "r"(r3))
207
208#define gte_ldopv1(r0) \
209 __asm__ volatile( \
210 "lw $12, 0( %0 );" \
211 "lw $13, 4( %0 );" \
212 "ctc2 $12, $0;" \
213 "lw $14, 8( %0 );" \
214 "ctc2 $13, $2;" \
215 "ctc2 $14, $4" \
216 : \
217 : "r"(r0) \
218 : "$12", "$13", "$14")
219
220#define gte_ldopv2(r0) \
221 __asm__ volatile( \
222 "lwc2 $11, 8( %0 );" \
223 "lwc2 $9, 0( %0 );" \
224 "lwc2 $10, 4( %0 )" \
225 : \
226 : "r"(r0))
227
228#define gte_ldlzc(r0) __asm__ volatile("mtc2 %0, $30" : : "r"(r0))
229
230#define gte_SetRGBcd(r0) __asm__ volatile("lwc2 $6, 0( %0 )" : : "r"(r0))
231
232#define gte_ldbkdir(r0, r1, r2) \
233 __asm__ volatile( \
234 "ctc2 %0, $13;" \
235 "ctc2 %1, $14;" \
236 "ctc2 %2, $15" \
237 : \
238 : "r"(r0), "r"(r1), "r"(r2))
239
240#define gte_SetBackColor(r0, r1, r2) \
241 __asm__ volatile( \
242 "sll $12, %0, 4;" \
243 "sll $13, %1, 4;" \
244 "sll $14, %2, 4;" \
245 "ctc2 $12, $13;" \
246 "ctc2 $13, $14;" \
247 "ctc2 $14, $15" \
248 : \
249 : "r"(r0), "r"(r1), "r"(r2) \
250 : "$12", "$13", "$14")
251
252#define gte_ldfcdir(r0, r1, r2) \
253 __asm__ volatile( \
254 "ctc2 %0, $21;" \
255 "ctc2 %1, $22;" \
256 "ctc2 %2, $23" \
257 : \
258 : "r"(r0), "r"(r1), "r"(r2))
259
260#define gte_SetFarColor(r0, r1, r2) \
261 __asm__ volatile( \
262 "sll $12, %0, 4;" \
263 "sll $13, %1, 4;" \
264 "sll $14, %2, 4;" \
265 "ctc2 $12, $21;" \
266 "ctc2 $13, $22;" \
267 "ctc2 $14, $23" \
268 : \
269 : "r"(r0), "r"(r1), "r"(r2) \
270 : "$12", "$13", "$14")
271
272#define gte_SetGeomOffset(r0, r1) \
273 __asm__ volatile( \
274 "sll $12, %0, 16;" \
275 "sll $13, %1, 16;" \
276 "ctc2 $12, $24;" \
277 "ctc2 $13, $25" \
278 : \
279 : "r"(r0), "r"(r1) \
280 : "$12", "$13")
281
282#define gte_SetGeomScreen(r0) __asm__ volatile("ctc2 %0, $26" : : "r"(r0))
283
284#define gte_ldsvrtrow0(r0) \
285 __asm__ volatile( \
286 "lw $12, 0( %0 );" \
287 "lw $13, 4( %0 );" \
288 "ctc2 $12, $0;" \
289 "ctc2 $13, $1" \
290 : \
291 : "r"(r0) \
292 : "$12", "$13")
293
294#define gte_SetRotMatrix(r0) \
295 __asm__ volatile( \
296 "lw $12, 0( %0 );" \
297 "lw $13, 4( %0 );" \
298 "ctc2 $12, $0;" \
299 "ctc2 $13, $1;" \
300 "lw $12, 8( %0 );" \
301 "lw $13, 12( %0 );" \
302 "lw $14, 16( %0 );" \
303 "ctc2 $12, $2;" \
304 "ctc2 $13, $3;" \
305 "ctc2 $14, $4" \
306 : \
307 : "r"(r0) \
308 : "$12", "$13", "$14")
309
310#define gte_ldsvllrow0(r0) \
311 __asm__ volatile( \
312 "lw $12, 0( %0 );" \
313 "lw $13, 4( %0 );" \
314 "ctc2 $12, $8;" \
315 "ctc2 $13, $9" \
316 : \
317 : "r"(r0) \
318 : "$12", "$13")
319
320#define gte_SetLightMatrix(r0) \
321 __asm__ volatile( \
322 "lw $12, 0( %0 );" \
323 "lw $13, 4( %0 );" \
324 "ctc2 $12, $8;" \
325 "ctc2 $13, $9;" \
326 "lw $12, 8( %0 );" \
327 "lw $13, 12( %0 );" \
328 "lw $14, 16( %0 );" \
329 "ctc2 $12, $10;" \
330 "ctc2 $13, $11;" \
331 "ctc2 $14, $12" \
332 : \
333 : "r"(r0) \
334 : "$12", "$13", "$14")
335
336#define gte_ldsvlcrow0(r0) \
337 __asm__ volatile( \
338 "lw $12, 0( %0 );" \
339 "lw $13, 4( %0 );" \
340 "ctc2 $12, $16;" \
341 "ctc2 $13, $17" \
342 : \
343 : "r"(r0) \
344 : "$12", "$13")
345
346#define gte_SetColorMatrix(r0) \
347 __asm__ volatile( \
348 "lw $12, 0( %0 );" \
349 "lw $13, 4( %0 );" \
350 "ctc2 $12, $16;" \
351 "ctc2 $13, $17;" \
352 "lw $12, 8( %0 );" \
353 "lw $13, 12( %0 );" \
354 "lw $14, 16( %0 );" \
355 "ctc2 $12, $18;" \
356 "ctc2 $13, $19;" \
357 "ctc2 $14, $20" \
358 : \
359 : "r"(r0) \
360 : "$12", "$13", "$14")
361
362#define gte_SetTransMatrix(r0) \
363 __asm__ volatile( \
364 "lw $12, 20( %0 );" \
365 "lw $13, 24( %0 );" \
366 "ctc2 $12, $5;" \
367 "lw $14, 28( %0 );" \
368 "ctc2 $13, $6;" \
369 "ctc2 $14, $7" \
370 : \
371 : "r"(r0) \
372 : "$12", "$13", "$14")
373
374#define gte_ldtr(r0, r1, r2) \
375 __asm__ volatile( \
376 "ctc2 %0, $5;" \
377 "ctc2 %1, $6;" \
378 "ctc2 %2, $7" \
379 : \
380 : "r"(r0), "r"(r1), "r"(r2))
381
382#define gte_SetTransVector(r0) \
383 __asm__ volatile( \
384 "lw $12, 0( %0 );" \
385 "lw $13, 4( %0 );" \
386 "lw $14, 8( %0 );" \
387 "ctc2 $12, $5;" \
388 "ctc2 $13, $6;" \
389 "ctc2 $14, $7" \
390 : \
391 : "r"(r0) \
392 : "$12", "$13", "$14")
393
394#define gte_ld_intpol_uv0(r0) \
395 __asm__ volatile( \
396 "lbu $12, 0( %0 );" \
397 "lbu $13, 1( %0 );" \
398 "ctc2 $12, $21;" \
399 "ctc2 $13, $22" \
400 : \
401 : "r"(r0) \
402 : "$12", "$13")
403
404#define gte_ld_intpol_uv1(r0) \
405 __asm__ volatile( \
406 "lbu $12, 0( %0 );" \
407 "lbu $13, 1( %0 );" \
408 "mtc2 $12, $9;" \
409 "mtc2 $13, $10" \
410 : \
411 : "r"(r0) \
412 : "$12", "$13")
413
414#define gte_ld_intpol_bv0(r0) \
415 __asm__ volatile( \
416 "lbu $12, 0( %0 );" \
417 "lbu $13, 1( %0 );" \
418 "ctc2 $12, $21;" \
419 "ctc2 $13, $22" \
420 : \
421 : "r"(r0) \
422 : "$12", "$13")
423
424#define gte_ld_intpol_bv1(r0) \
425 __asm__ volatile( \
426 "lbu $12, 0( %0 );" \
427 "lbu $13, 1( %0 );" \
428 "mtc2 $12, $9;" \
429 "mtc2 $13, $10" \
430 : \
431 : "r"(r0) \
432 : "$12", "$13")
433
434#define gte_ld_intpol_sv0(r0) \
435 __asm__ volatile( \
436 "lh $12, 0( %0 );" \
437 "lh $13, 2( %0 );" \
438 "lh $14, 4( %0 );" \
439 "ctc2 $12, $21;" \
440 "ctc2 $13, $22;" \
441 "ctc2 $14, $23" \
442 : \
443 : "r"(r0) \
444 : "$12", "$13", "$14")
445
446#define gte_ld_intpol_sv1(r0) \
447 __asm__ volatile( \
448 "lh $12, 0( %0 );" \
449 "lh $13, 2( %0 );" \
450 "lh $14, 4( %0 );" \
451 "mtc2 $12, $9;" \
452 "mtc2 $13, $10;" \
453 "mtc2 $14, $11" \
454 : \
455 : "r"(r0) \
456 : "$12", "$13", "$14")
457
458#define gte_ldfc(r0) \
459 __asm__ volatile( \
460 "lw $12, 0( %0 );" \
461 "lw $13, 4( %0 );" \
462 "lw $14, 8( %0 );" \
463 "ctc2 $12, $21;" \
464 "ctc2 $13, $22;" \
465 "ctc2 $14, $23" \
466 : \
467 : "r"(r0) \
468 : "$12", "$13", "$14")
469
470#define gte_ldopv2SV(r0) \
471 __asm__ volatile( \
472 "lh $12, 0( %0 );" \
473 "lh $13, 2( %0 );" \
474 "lh $14, 4( %0 );" \
475 "mtc2 $12, $9;" \
476 "mtc2 $13, $10;" \
477 "mtc2 $14, $11" \
478 : \
479 : "r"(r0) \
480 : "$12", "$13", "$14")
481
482#define gte_ldopv1SV(r0) \
483 __asm__ volatile( \
484 "lh $12, 0( %0 );" \
485 "lh $13, 2( %0 );" \
486 "ctc2 $12, $0;" \
487 "lh $14, 4( %0 );" \
488 "ctc2 $13, $2;" \
489 "ctc2 $14, $4" \
490 : \
491 : "r"(r0) \
492 : "$12", "$13", "$14")
493
494/*
495 * Type 2 functions
496 */
497
498#define gte_rtps() \
499 __asm__ volatile( \
500 "nop;" \
501 "nop;" \
502 "cop2 0x0180001;")
503
504#define gte_rtpt() \
505 __asm__ volatile( \
506 "nop;" \
507 "nop;" \
508 "cop2 0x0280030;")
509
510#define gte_rt() \
511 __asm__ volatile( \
512 "nop;" \
513 "nop;" \
514 "cop2 0x0480012;")
515
516#define gte_rtv0() \
517 __asm__ volatile( \
518 "nop;" \
519 "nop;" \
520 "cop2 0x0486012;")
521
522#define gte_rtv1() \
523 __asm__ volatile( \
524 "nop;" \
525 "nop;" \
526 "cop2 0x048E012;")
527
528#define gte_rtv2() \
529 __asm__ volatile( \
530 "nop;" \
531 "nop;" \
532 "cop2 0x0496012;")
533
534#define gte_rtir() \
535 __asm__ volatile( \
536 "nop;" \
537 "nop;" \
538 "cop2 0x049E012;")
539
540#define gte_rtir_sf0() \
541 __asm__ volatile( \
542 "nop;" \
543 "nop;" \
544 "cop2 0x041E012;")
545
546#define gte_rtv0tr() \
547 __asm__ volatile( \
548 "nop;" \
549 "nop;" \
550 "cop2 0x0480012;")
551
552#define gte_rtv1tr() \
553 __asm__ volatile( \
554 "nop;" \
555 "nop;" \
556 "cop2 0x0488012;")
557
558#define gte_rtv2tr() \
559 __asm__ volatile( \
560 "nop;" \
561 "nop;" \
562 "cop2 0x0490012;")
563
564#define gte_rtirtr() \
565 __asm__ volatile( \
566 "nop;" \
567 "nop;" \
568 "cop2 0x0498012;")
569
570#define gte_rtv0bk() \
571 __asm__ volatile( \
572 "nop;" \
573 "nop;" \
574 "cop2 0x0482012;")
575
576#define gte_rtv1bk() \
577 __asm__ volatile( \
578 "nop;" \
579 "nop;" \
580 "cop2 0x048A012;")
581
582#define gte_rtv2bk() \
583 __asm__ volatile( \
584 "nop;" \
585 "nop;" \
586 "cop2 0x0492012;")
587
588#define gte_rtirbk() \
589 __asm__ volatile( \
590 "nop;" \
591 "nop;" \
592 "cop2 0x049A012;")
593
594#define gte_ll() \
595 __asm__ volatile( \
596 "nop;" \
597 "nop;" \
598 "cop2 0x04A6412;")
599
600#define gte_llv0() \
601 __asm__ volatile( \
602 "nop;" \
603 "nop;" \
604 "cop2 0x04A6012;")
605
606#define gte_llv1() \
607 __asm__ volatile( \
608 "nop;" \
609 "nop;" \
610 "cop2 0x04AE012;")
611
612#define gte_llv2() \
613 __asm__ volatile( \
614 "nop;" \
615 "nop;" \
616 "cop2 0x04B6012;")
617
618#define gte_llir() \
619 __asm__ volatile( \
620 "nop;" \
621 "nop;" \
622 "cop2 0x04BE012;")
623
624#define gte_llv0tr() \
625 __asm__ volatile( \
626 "nop;" \
627 "nop;" \
628 "cop2 0x04A0012;")
629
630#define gte_llv1tr() \
631 __asm__ volatile( \
632 "nop;" \
633 "nop;" \
634 "cop2 0x04A8012;")
635
636#define gte_llv2tr() \
637 __asm__ volatile( \
638 "nop;" \
639 "nop;" \
640 "cop2 0x04B0012;")
641
642#define gte_llirtr() \
643 __asm__ volatile( \
644 "nop;" \
645 "nop;" \
646 "cop2 0x04B8012;")
647
648#define gte_llv0bk() \
649 __asm__ volatile( \
650 "nop;" \
651 "nop;" \
652 "cop2 0x04A2012;")
653
654#define gte_llv1bk() \
655 __asm__ volatile( \
656 "nop;" \
657 "nop;" \
658 "cop2 0x04AA012;")
659
660#define gte_llv2bk() \
661 __asm__ volatile( \
662 "nop;" \
663 "nop;" \
664 "cop2 0x04B2012;")
665
666#define gte_llirbk() \
667 __asm__ volatile( \
668 "nop;" \
669 "nop;" \
670 "cop2 0x04BA012;")
671
672#define gte_lc() \
673 __asm__ volatile( \
674 "nop;" \
675 "nop;" \
676 "cop2 0x04DA412;")
677
678#define gte_lcv0() \
679 __asm__ volatile( \
680 "nop;" \
681 "nop;" \
682 "cop2 0x04C6012;")
683
684#define gte_lcv1() \
685 __asm__ volatile( \
686 "nop;" \
687 "nop;" \
688 "cop2 0x04CE012;")
689
690#define gte_lcv2() \
691 __asm__ volatile( \
692 "nop;" \
693 "nop;" \
694 "cop2 0x04D6012;")
695
696#define gte_lcir() \
697 __asm__ volatile( \
698 "nop;" \
699 "nop;" \
700 "cop2 0x04DE012;")
701
702#define gte_lcv0tr() \
703 __asm__ volatile( \
704 "nop;" \
705 "nop;" \
706 "cop2 0x04C0012;")
707
708#define gte_lcv1tr() \
709 __asm__ volatile( \
710 "nop;" \
711 "nop;" \
712 "cop2 0x04C8012;")
713
714#define gte_lcv2tr() \
715 __asm__ volatile( \
716 "nop;" \
717 "nop;" \
718 "cop2 0x04D0012;")
719
720#define gte_lcirtr() \
721 __asm__ volatile( \
722 "nop;" \
723 "nop;" \
724 "cop2 0x04D8012;")
725
726#define gte_lcv0bk() \
727 __asm__ volatile( \
728 "nop;" \
729 "nop;" \
730 "cop2 0x04C2012;")
731
732#define gte_lcv1bk() \
733 __asm__ volatile( \
734 "nop;" \
735 "nop;" \
736 "cop2 0x04CA012;")
737
738#define gte_lcv2bk() \
739 __asm__ volatile( \
740 "nop;" \
741 "nop;" \
742 "cop2 0x04D2012;")
743
744#define gte_lcirbk() \
745 __asm__ volatile( \
746 "nop;" \
747 "nop;" \
748 "cop2 0x04DA012;")
749
750#define gte_dpcl() \
751 __asm__ volatile( \
752 "nop;" \
753 "nop;" \
754 "cop2 0x0680029;")
755
756#define gte_dpcs() \
757 __asm__ volatile( \
758 "nop;" \
759 "nop;" \
760 "cop2 0x0780010;")
761
762#define gte_dpct() \
763 __asm__ volatile( \
764 "nop;" \
765 "nop;" \
766 "cop2 0x0F8002A;")
767
768#define gte_intpl() \
769 __asm__ volatile( \
770 "nop;" \
771 "nop;" \
772 "cop2 0x0980011;")
773
774#define gte_sqr12() \
775 __asm__ volatile( \
776 "nop;" \
777 "nop;" \
778 "cop2 0x0A80428;")
779
780#define gte_sqr0() \
781 __asm__ volatile( \
782 "nop;" \
783 "nop;" \
784 "cop2 0x0A00428;")
785
786#define gte_ncs() \
787 __asm__ volatile( \
788 "nop;" \
789 "nop;" \
790 "cop2 0x0C8041E;")
791
792#define gte_nct() \
793 __asm__ volatile( \
794 "nop;" \
795 "nop;" \
796 "cop2 0x0D80420;")
797
798#define gte_ncds() \
799 __asm__ volatile( \
800 "nop;" \
801 "nop;" \
802 "cop2 0x0E80413;")
803
804#define gte_ncdt() \
805 __asm__ volatile( \
806 "nop;" \
807 "nop;" \
808 "cop2 0x0F80416;")
809
810#define gte_nccs() \
811 __asm__ volatile( \
812 "nop;" \
813 "nop;" \
814 "cop2 0x0108041B;")
815
816#define gte_ncct() \
817 __asm__ volatile( \
818 "nop;" \
819 "nop;" \
820 "cop2 0x0118043F;")
821
822#define gte_cdp() \
823 __asm__ volatile( \
824 "nop;" \
825 "nop;" \
826 "cop2 0x01280414;")
827
828#define gte_cc() \
829 __asm__ volatile( \
830 "nop;" \
831 "nop;" \
832 "cop2 0x0138041C;")
833
834#define gte_nclip() \
835 __asm__ volatile( \
836 "nop;" \
837 "nop;" \
838 "cop2 0x01400006;")
839
840#define gte_avsz3() \
841 __asm__ volatile( \
842 "nop;" \
843 "nop;" \
844 "cop2 0x0158002D;")
845
846#define gte_avsz4() \
847 __asm__ volatile( \
848 "nop;" \
849 "nop;" \
850 "cop2 0x0168002E;")
851
852#define gte_op12() \
853 __asm__ volatile( \
854 "nop;" \
855 "nop;" \
856 "cop2 0x0178000C;")
857
858#define gte_op0() \
859 __asm__ volatile( \
860 "nop;" \
861 "nop;" \
862 "cop2 0x0170000C;")
863
864#define gte_gpf12() \
865 __asm__ volatile( \
866 "nop;" \
867 "nop;" \
868 "cop2 0x0198003D;")
869
870#define gte_gpf0() \
871 __asm__ volatile( \
872 "nop;" \
873 "nop;" \
874 "cop2 0x0190003D;")
875
876#define gte_gpl12() \
877 __asm__ volatile( \
878 "nop;" \
879 "nop;" \
880 "cop2 0x01A8003E;")
881
882#define gte_gpl0() \
883 __asm__ volatile( \
884 "nop;" \
885 "nop;" \
886 "cop2 0x01A0003E0")
887
888#define gte_mvmva_core(r0) \
889 __asm__ volatile( \
890 "nop;" \
891 "nop;" \
892 "cop2 %0" \
893 : \
894 : "g"(r0))
895
896#define gte_mvmva(sf, mx, v, cv, lm) \
897 gte_mvmva_core(0x0400012 | ((sf) << 19) | ((mx) << 17) | ((v) << 15) | ((cv) << 13) | ((lm) << 10))
898
899/*
900 * Type 2 functions without nop
901 */
902
903#define gte_rtps_b() __asm__ volatile("cop2 0x0180001;")
904#define gte_rtpt_b() __asm__ volatile("cop2 0x0280030;")
905#define gte_rt_b() __asm__ volatile("cop2 0x0480012;")
906#define gte_rtv0_b() __asm__ volatile("cop2 0x0486012;")
907#define gte_rtv1_b() __asm__ volatile("cop2 0x048E012;")
908#define gte_rtv2_b() __asm__ volatile("cop2 0x0496012;")
909#define gte_rtir_b() __asm__ volatile("cop2 0x049E012;")
910#define gte_rtir_sf0_b() __asm__ volatile("cop2 0x041E012;")
911#define gte_rtv0tr_b() __asm__ volatile("cop2 0x0480012;")
912#define gte_rtv1tr_b() __asm__ volatile("cop2 0x0488012;")
913#define gte_rtv2tr_b() __asm__ volatile("cop2 0x0490012;")
914#define gte_rtirtr_b() __asm__ volatile("cop2 0x0498012;")
915#define gte_rtv0bk_b() __asm__ volatile("cop2 0x0482012;")
916#define gte_rtv1bk_b() __asm__ volatile("cop2 0x048A012;")
917#define gte_rtv2bk_b() __asm__ volatile("cop2 0x0492012;")
918#define gte_rtirbk_b() __asm__ volatile("cop2 0x049A012;")
919#define gte_ll_b() __asm__ volatile("cop2 0x04A6412;")
920#define gte_llv0_b() __asm__ volatile("cop2 0x04A6012;")
921#define gte_llv1_b() __asm__ volatile("cop2 0x04AE012;")
922#define gte_llv2_b() __asm__ volatile("cop2 0x04B6012;")
923#define gte_llir_b() __asm__ volatile("cop2 0x04BE012;")
924#define gte_llv0tr_b() __asm__ volatile("cop2 0x04A0012;")
925#define gte_llv1tr_b() __asm__ volatile("cop2 0x04A8012;")
926#define gte_llv2tr_b() __asm__ volatile("cop2 0x04B0012;")
927#define gte_llirtr_b() __asm__ volatile("cop2 0x04B8012;")
928#define gte_llv0bk_b() __asm__ volatile("cop2 0x04A2012;")
929#define gte_llv1bk_b() __asm__ volatile("cop2 0x04AA012;")
930#define gte_llv2bk_b() __asm__ volatile("cop2 0x04B2012;")
931#define gte_llirbk_b() __asm__ volatile("cop2 0x04BA012;")
932#define gte_lc_b() __asm__ volatile("cop2 0x04DA412;")
933#define gte_lcv0_b() __asm__ volatile("cop2 0x04C6012;")
934#define gte_lcv1_b() __asm__ volatile("cop2 0x04CE012;")
935#define gte_lcv2_b() __asm__ volatile("cop2 0x04D6012;")
936#define gte_lcir_b() __asm__ volatile("cop2 0x04DE012;")
937#define gte_lcv0tr_b() __asm__ volatile("cop2 0x04C0012;")
938#define gte_lcv1tr_b() __asm__ volatile("cop2 0x04C8012;")
939#define gte_lcv2tr_b() __asm__ volatile("cop2 0x04D0012;")
940#define gte_lcirtr_b() __asm__ volatile("cop2 0x04D8012;")
941#define gte_lcv0bk_b() __asm__ volatile("cop2 0x04C2012;")
942#define gte_lcv1bk_b() __asm__ volatile("cop2 0x04CA012;")
943#define gte_lcv2bk_b() __asm__ volatile("cop2 0x04D2012;")
944#define gte_lcirbk_b() __asm__ volatile("cop2 0x04DA012;")
945#define gte_dpcl_b() __asm__ volatile("cop2 0x0680029;")
946#define gte_dpcs_b() __asm__ volatile("cop2 0x0780010;")
947#define gte_dpct_b() __asm__ volatile("cop2 0x0F8002A;")
948#define gte_intpl_b() __asm__ volatile("cop2 0x0980011;")
949#define gte_sqr12_b() __asm__ volatile("cop2 0x0A80428;")
950#define gte_sqr0_b() __asm__ volatile("cop2 0x0A00428;")
951#define gte_ncs_b() __asm__ volatile("cop2 0x0C8041E;")
952#define gte_nct_b() __asm__ volatile("cop2 0x0D80420;")
953#define gte_ncds_b() __asm__ volatile("cop2 0x0E80413;")
954#define gte_ncdt_b() __asm__ volatile("cop2 0x0F80416;")
955#define gte_nccs_b() __asm__ volatile("cop2 0x0108041B;")
956#define gte_ncct_b() __asm__ volatile("cop2 0x0118043F;")
957#define gte_cdp_b() __asm__ volatile("cop2 0x01280414;")
958#define gte_cc_b() __asm__ volatile("cop2 0x0138041C;")
959#define gte_nclip_b() __asm__ volatile("cop2 0x01400006;")
960#define gte_avsz3_b() __asm__ volatile("cop2 0x0158002D;")
961#define gte_avsz4_b() __asm__ volatile("cop2 0x0168002E;")
962#define gte_op12_b() __asm__ volatile("cop2 0x0178000C;")
963#define gte_op0_b() __asm__ volatile("cop2 0x0170000C;")
964#define gte_gpf12_b() __asm__ volatile("cop2 0x0198003D;")
965#define gte_gpf0_b() __asm__ volatile("cop2 0x0190003D;")
966#define gte_gpl12_b() __asm__ volatile("cop2 0x01A8003E;")
967#define gte_gpl0_b() __asm__ volatile("cop2 0x01A0003E;")
968#define gte_mvmva_core_b(r0) __asm__ volatile("cop2 %0" : : "g"(r0))
969#define gte_mvmva_b(sf, mx, v, cv, lm) \
970 gte_mvmva_core_b(0x0400012 | ((sf) << 19) | ((mx) << 17) | ((v) << 15) | ((cv) << 13) | ((lm) << 10))
971
972/*
973 * Type 3 functions
974 */
975
976#define gte_stsxy(r0) __asm__ volatile("swc2 $14, 0( %0 )" : : "r"(r0) : "memory")
977
978#define gte_stsxy3(r0, r1, r2) \
979 __asm__ volatile( \
980 "swc2 $12, 0( %0 );" \
981 "swc2 $13, 0( %1 );" \
982 "swc2 $14, 0( %2 )" \
983 : \
984 : "r"(r0), "r"(r1), "r"(r2) \
985 : "memory")
986
987#define gte_stsxy3c(r0) \
988 __asm__ volatile( \
989 "swc2 $12, 0( %0 );" \
990 "swc2 $13, 4( %0 );" \
991 "swc2 $14, 8( %0 )" \
992 : \
993 : "r"(r0) \
994 : "memory")
995
996#define gte_stsxy2(r0) __asm__ volatile("swc2 $14, 0( %0 )" : : "r"(r0) : "memory")
997
998#define gte_stsxy1(r0) __asm__ volatile("swc2 $13, 0( %0 )" : : "r"(r0) : "memory")
999
1000#define gte_stsxy0(r0) __asm__ volatile("swc2 $12, 0( %0 )" : : "r"(r0) : "memory")
1001
1002#define gte_stsxy01(r0, r1) \
1003 __asm__ volatile( \
1004 "swc2 $12, 0( %0 );" \
1005 "swc2 $13, 0( %1 )" \
1006 : \
1007 : "r"(r0), "r"(r1) \
1008 : "memory")
1009
1010#define gte_stsxy01c(r0) \
1011 __asm__ volatile( \
1012 "swc2 $12, 0( %0 );" \
1013 "swc2 $13, 4( %0 )" \
1014 : \
1015 : "r"(r0) \
1016 : "memory")
1017
1018#define gte_stsxy3_f3(r0) \
1019 __asm__ volatile( \
1020 "swc2 $12, 8( %0 );" \
1021 "swc2 $13, 12( %0 );" \
1022 "swc2 $14, 16( %0 )" \
1023 : \
1024 : "r"(r0) \
1025 : "memory")
1026
1027#define gte_stsxy3_g3(r0) \
1028 __asm__ volatile( \
1029 "swc2 $12, 8( %0 );" \
1030 "swc2 $13, 16( %0 );" \
1031 "swc2 $14, 24( %0 )" \
1032 : \
1033 : "r"(r0) \
1034 : "memory")
1035
1036#define gte_stsxy3_ft3(r0) \
1037 __asm__ volatile( \
1038 "swc2 $12, 8( %0 );" \
1039 "swc2 $13, 16( %0 );" \
1040 "swc2 $14, 24( %0 )" \
1041 : \
1042 : "r"(r0) \
1043 : "memory")
1044
1045#define gte_stsxy3_gt3(r0) \
1046 __asm__ volatile( \
1047 "swc2 $12, 8( %0 );" \
1048 "swc2 $13, 20( %0 );" \
1049 "swc2 $14, 32( %0 )" \
1050 : \
1051 : "r"(r0) \
1052 : "memory")
1053
1054#define gte_stsxy3_f4(r0) \
1055 __asm__ volatile( \
1056 "swc2 $12, 8( %0 );" \
1057 "swc2 $13, 12( %0 );" \
1058 "swc2 $14, 16( %0 )" \
1059 : \
1060 : "r"(r0) \
1061 : "memory")
1062
1063#define gte_stsxy3_g4(r0) \
1064 __asm__ volatile( \
1065 "swc2 $12, 8( %0 );" \
1066 "swc2 $13, 16( %0 );" \
1067 "swc2 $14, 24( %0 )" \
1068 : \
1069 : "r"(r0) \
1070 : "memory")
1071
1072#define gte_stsxy3_ft4(r0) \
1073 __asm__ volatile( \
1074 "swc2 $12, 8( %0 );" \
1075 "swc2 $13, 16( %0 );" \
1076 "swc2 $14, 24( %0 )" \
1077 : \
1078 : "r"(r0) \
1079 : "memory")
1080
1081#define gte_stsxy3_gt4(r0) \
1082 __asm__ volatile( \
1083 "swc2 $12, 8( %0 );" \
1084 "swc2 $13, 20( %0 );" \
1085 "swc2 $14, 32( %0 )" \
1086 : \
1087 : "r"(r0) \
1088 : "memory")
1089
1090#define gte_stdp(r0) __asm__ volatile("swc2 $8, 0( %0 )" : : "r"(r0) : "memory")
1091
1092#define gte_stflg(r0) \
1093 __asm__ volatile( \
1094 "cfc2 $12, $31;" \
1095 "nop;" \
1096 "sw $12, 0( %0 )" \
1097 : \
1098 : "r"(r0) \
1099 : "$12", "memory")
1100
1101#define gte_stflg_4(r0) \
1102 __asm__ volatile( \
1103 "cfc2 $12, $31;" \
1104 "addi $13, $0, 4;" \
1105 "sll $13, $13, 16;" \
1106 "and $12, $12, $13;" \
1107 "sw $12, 0( %0 )" \
1108 : \
1109 : "r"(r0) \
1110 : "$12", "$13", "memory")
1111
1112#define gte_stsz(r0) __asm__ volatile("swc2 $19, 0( %0 )" : : "r"(r0) : "memory")
1113
1114#define gte_stsz3(r0, r1, r2) \
1115 __asm__ volatile( \
1116 "swc2 $17, 0( %0 );" \
1117 "swc2 $18, 0( %1 );" \
1118 "swc2 $19, 0( %2 )" \
1119 : \
1120 : "r"(r0), "r"(r1), "r"(r2) \
1121 : "memory")
1122
1123#define gte_stsz4(r0, r1, r2, r3) \
1124 __asm__ volatile( \
1125 "swc2 $16, 0( %0 );" \
1126 "swc2 $17, 0( %1 );" \
1127 "swc2 $18, 0( %2 );" \
1128 "swc2 $19, 0( %3 )" \
1129 : \
1130 : "r"(r0), "r"(r1), "r"(r2), "r"(r3) \
1131 : "memory")
1132
1133#define gte_stsz3c(r0) \
1134 __asm__ volatile( \
1135 "swc2 $17, 0( %0 );" \
1136 "swc2 $18, 4( %0 );" \
1137 "swc2 $19, 8( %0 )" \
1138 : \
1139 : "r"(r0) \
1140 : "memory")
1141
1142#define gte_stsz4c(r0) \
1143 __asm__ volatile( \
1144 "swc2 $16, 0( %0 );" \
1145 "swc2 $17, 4( %0 );" \
1146 "swc2 $18, 8( %0 );" \
1147 "swc2 $19, 12( %0 )" \
1148 : \
1149 : "r"(r0) \
1150 : "memory")
1151
1152#define gte_stszotz(r0) \
1153 __asm__ volatile( \
1154 "mfc2 $12, $19;" \
1155 "nop;" \
1156 "sra $12, $12, 2;" \
1157 "sw $12, 0( %0 )" \
1158 : \
1159 : "r"(r0) \
1160 : "$12", "memory")
1161
1162#define gte_stotz(r0) __asm__ volatile("swc2 $7, 0( %0 )" : : "r"(r0) : "memory")
1163
1164#define gte_stopz(r0) __asm__ volatile("swc2 $24, 0( %0 )" : : "r"(r0) : "memory")
1165
1166#define gte_stlvl(r0) \
1167 __asm__ volatile( \
1168 "swc2 $9, 0( %0 );" \
1169 "swc2 $10, 4( %0 );" \
1170 "swc2 $11, 8( %0 )" \
1171 : \
1172 : "r"(r0) \
1173 : "memory")
1174
1175#define gte_stlvnl(r0) \
1176 __asm__ volatile( \
1177 "swc2 $25, 0( %0 );" \
1178 "swc2 $26, 4( %0 );" \
1179 "swc2 $27, 8( %0 )" \
1180 : \
1181 : "r"(r0) \
1182 : "memory")
1183
1184#define gte_stlvnl0(r0) __asm__ volatile("swc2 $25, 0( %0 )" : : "r"(r0) : "memory")
1185
1186#define gte_stlvnl1(r0) __asm__ volatile("swc2 $26, 0( %0 )" : : "r"(r0) : "memory")
1187
1188#define gte_stlvnl2(r0) __asm__ volatile("swc2 $27, 0( %0 )" : : "r"(r0) : "memory")
1189
1190#define gte_stsv(r0) \
1191 __asm__ volatile( \
1192 "mfc2 $12, $9;" \
1193 "mfc2 $13, $10;" \
1194 "mfc2 $14, $11;" \
1195 "sh $12, 0( %0 );" \
1196 "sh $13, 2( %0 );" \
1197 "sh $14, 4( %0 )" \
1198 : \
1199 : "r"(r0) \
1200 : "$12", "$13", "$14", "memory")
1201
1202#define gte_stclmv(r0) \
1203 __asm__ volatile( \
1204 "mfc2 $12, $9;" \
1205 "mfc2 $13, $10;" \
1206 "mfc2 $14, $11;" \
1207 "sh $12, 0( %0 );" \
1208 "sh $13, 6( %0 );" \
1209 "sh $14, 12( %0 )" \
1210 : \
1211 : "r"(r0) \
1212 : "$12", "$13", "$14", "memory")
1213
1214#define gte_stbv(r0) \
1215 __asm__ volatile( \
1216 "mfc2 $12, $9;" \
1217 "mfc2 $13, $10;" \
1218 "sb $12, 0( %0 );" \
1219 "sb $13, 1( %0 )" \
1220 : \
1221 : "r"(r0) \
1222 : "$12", "$13", "memory")
1223
1224#define gte_stcv(r0) \
1225 __asm__ volatile( \
1226 "mfc2 $12, $9;" \
1227 "mfc2 $13, $10;" \
1228 "mfc2 $14, $11;" \
1229 "sb $12, 0( %0 );" \
1230 "sb $13, 1( %0 );" \
1231 "sb $14, 2( %0 )" \
1232 : \
1233 : "r"(r0) \
1234 : "$12", "$13", "$14", "memory")
1235
1236#define gte_strgb(r0) __asm__ volatile("swc2 $22, 0( %0 )" : : "r"(r0) : "memory")
1237
1238#define gte_strgb3(r0, r1, r2) \
1239 __asm__ volatile( \
1240 "swc2 $20, 0( %0 );" \
1241 "swc2 $21, 0( %1 );" \
1242 "swc2 $22, 0( %2 )" \
1243 : \
1244 : "r"(r0), "r"(r1), "r"(r2) \
1245 : "memory")
1246
1247#define gte_strgb3_g3(r0) \
1248 __asm__ volatile( \
1249 "swc2 $20, 4( %0 );" \
1250 "swc2 $21, 12( %0 );" \
1251 "swc2 $22, 20( %0 )" \
1252 : \
1253 : "r"(r0) \
1254 : "memory")
1255
1256#define gte_strgb3_gt3(r0) \
1257 __asm__ volatile( \
1258 "swc2 $20, 4( %0 );" \
1259 "swc2 $21, 16( %0 );" \
1260 "swc2 $22, 28( %0 )" \
1261 : \
1262 : "r"(r0) \
1263 : "memory")
1264
1265#define gte_strgb3_g4(r0) \
1266 __asm__ volatile( \
1267 "swc2 $20, 4( %0 );" \
1268 "swc2 $21, 12( %0 );" \
1269 "swc2 $22, 20( %0 )" \
1270 : \
1271 : "r"(r0) \
1272 : "memory")
1273
1274#define gte_strgb3_gt4(r0) \
1275 __asm__ volatile( \
1276 "swc2 $20, 4( %0 );" \
1277 "swc2 $21, 16( %0 );" \
1278 "swc2 $22, 28( %0 )" \
1279 : \
1280 : "r"(r0) \
1281 : "memory")
1282
1283#define gte_ReadGeomOffset(r0, r1) \
1284 __asm__ volatile( \
1285 "cfc2 $12, $24;" \
1286 "cfc2 $13, $25;" \
1287 "sra $12, $12, 16;" \
1288 "sra $13, $13, 16;" \
1289 "sw $12, 0( %0 );" \
1290 "sw $13, 0( %1 )" \
1291 : \
1292 : "r"(r0), "r"(r1) \
1293 : "$12", "$13", "memory")
1294
1295#define gte_ReadGeomScreen(r0) \
1296 __asm__ volatile( \
1297 "cfc2 $12, $26;" \
1298 "nop;" \
1299 "sw $12, 0( %0 )" \
1300 : \
1301 : "r"(r0) \
1302 : "$12", "memory")
1303
1304#define gte_ReadRotMatrix(r0) \
1305 __asm__ volatile( \
1306 "cfc2 $12, $0;" \
1307 "cfc2 $13, $1;" \
1308 "sw $12, 0( %0 );" \
1309 "sw $13, 4( %0 );" \
1310 "cfc2 $12, $2;" \
1311 "cfc2 $13, $3;" \
1312 "cfc2 $14, $4;" \
1313 "sw $12, 8( %0 );" \
1314 "sw $13, 12( %0 );" \
1315 "sw $14, 16( %0 );" \
1316 "cfc2 $12, $5;" \
1317 "cfc2 $13, $6;" \
1318 "cfc2 $14, $7;" \
1319 "sw $12, 20( %0 );" \
1320 "sw $13, 24( %0 );" \
1321 "sw $14, 28( %0 )" \
1322 : \
1323 : "r"(r0) \
1324 : "$12", "$13", "$14", "memory")
1325
1326#define gte_sttr(r0) \
1327 __asm__ volatile( \
1328 "cfc2 $12, $5;" \
1329 "cfc2 $13, $6;" \
1330 "cfc2 $14, $7;" \
1331 "sw $12, 0( %0 );" \
1332 "sw $13, 4( %0 );" \
1333 "sw $14, 8( %0 )" \
1334 : \
1335 : "r"(r0) \
1336 : "$12", "$13", "$14", "memory")
1337
1338#define gte_ReadLightMatrix(r0) \
1339 __asm__ volatile( \
1340 "cfc2 $12, $8;" \
1341 "cfc2 $13, $9;" \
1342 "sw $12, 0( %0 );" \
1343 "sw $13, 4( %0 );" \
1344 "cfc2 $12, $10;" \
1345 "cfc2 $13, $11;" \
1346 "cfc2 $14, $12;" \
1347 "sw $12, 8( %0 );" \
1348 "sw $13, 12( %0 );" \
1349 "sw $14, 16( %0 );" \
1350 "cfc2 $12, $13;" \
1351 "cfc2 $13, $14;" \
1352 "cfc2 $14, $15;" \
1353 "sw $12, 20( %0 );" \
1354 "sw $13, 24( %0 );" \
1355 "sw $14, 28( %0 )" \
1356 : \
1357 : "r"(r0) \
1358 : "$12", "$13", "$14", "memory")
1359
1360#define gte_ReadColorMatrix(r0) \
1361 __asm__ volatile( \
1362 "cfc2 $12, $16;" \
1363 "cfc2 $13, $17;" \
1364 "sw $12, 0( %0 );" \
1365 "sw $13, 4( %0 );" \
1366 "cfc2 $12, $18;" \
1367 "cfc2 $13, $19;" \
1368 "cfc2 $14, $20;" \
1369 "sw $12, 8( %0 );" \
1370 "sw $13, 12( %0 );" \
1371 "sw $14, 16( %0 );" \
1372 "cfc2 $12, $21;" \
1373 "cfc2 $13, $22;" \
1374 "cfc2 $14, $23;" \
1375 "sw $12, 20( %0 );" \
1376 "sw $13, 24( %0 );" \
1377 "sw $14, 28( %0 )" \
1378 : \
1379 : "r"(r0) \
1380 : "$12", "$13", "$14", "memory")
1381
1382#define gte_stlzc(r0) __asm__ volatile("swc2 $31, 0( %0 )" : : "r"(r0) : "memory")
1383
1384#define gte_stfc(r0) \
1385 __asm__ volatile( \
1386 "cfc2 $12, $21;" \
1387 "cfc2 $13, $22;" \
1388 "cfc2 $14, $23;" \
1389 "sw $12, 0( %0 );" \
1390 "sw $13, 4( %0 );" \
1391 "sw $14, 8( %0 )" \
1392 : \
1393 : "r"(r0) \
1394 : "$12", "$13", "$14", "memory")
1395
1396#define gte_mvlvtr() \
1397 __asm__ volatile( \
1398 "mfc2 $12, $25;" \
1399 "mfc2 $13, $26;" \
1400 "mfc2 $14, $27;" \
1401 "ctc2 $12, $5;" \
1402 "ctc2 $13, $6;" \
1403 "ctc2 $14, $7" \
1404 : \
1405 : \
1406 : "$12", "$13", "$14")
1407
1408#define gte_nop() __asm__ volatile("nop")
1409
1410#define gte_subdvl(r0, r1, r2) \
1411 __asm__ volatile( \
1412 "lw $12, 0( %0 );" \
1413 "lw $13, 0( %1 );" \
1414 "mtc2 $12, $9;" \
1415 "mtc2 $13, $10;" \
1416 "sra $12, $12, 16;" \
1417 "sra $13, $13, 16;" \
1418 "subu $15, $12, $13;" \
1419 "mfc2 $12, $9;" \
1420 "mfc2 $13, $10;" \
1421 "sw $15, 4( %2 );" \
1422 "subu $12, $12, $13;" \
1423 "sw $12, 0( %2 )" \
1424 : \
1425 : "r"(r0), "r"(r1), "r"(r2) \
1426 : "$12", "$13", "$14", "$15", "memory")
1427
1428#define gte_subdvd(r0, r1, r2) \
1429 __asm__ volatile( \
1430 "lw $12, 0( %0 );" \
1431 "lw $13, 0( %1 );" \
1432 "mtc2 $12, $9;" \
1433 "mtc2 $13, $10;" \
1434 "sra $12, $12, 16;" \
1435 "sra $13, $13, 16;" \
1436 "subu $15, $12, $13;" \
1437 "mfc2 $12, $9;" \
1438 "mfc2 $13, $10;" \
1439 "sh $15, 2( %2 );" \
1440 "subu $12, $12, $13;" \
1441 "sh $12, 0( %2 )" \
1442 : \
1443 : "r"(r0), "r"(r1), "r"(r2) \
1444 : "$12", "$13", "$14", "$15", "memory")
1445
1446#define gte_adddvl(r0, r1, r2) \
1447 __asm__ volatile( \
1448 "lw $12, 0( %0 );" \
1449 "lw $13, 0( %1 );" \
1450 "mtc2 $12, $9;" \
1451 "mtc2 $13, $10;" \
1452 "sra $12, $12, 16;" \
1453 "sra $13, $13, 16;" \
1454 "addu $15, $12, $13;" \
1455 "mfc2 $12, $9;" \
1456 "mfc2 $13, $10;" \
1457 "sw $15, 4( %2 );" \
1458 "addu $12, $12, $13;" \
1459 "sw $12, 0( %2 )" \
1460 : \
1461 : "r"(r0), "r"(r1), "r"(r2) \
1462 : "$12", "$13", "$14", "$15", "memory")
1463
1464#define gte_adddvd(r0, r1, r2) \
1465 __asm__ volatile( \
1466 "lw $12, 0( %0 );" \
1467 "lw $13, 0( %1 );" \
1468 "mtc2 $12, $9;" \
1469 "mtc2 $13, $10;" \
1470 "sra $12, $12, 16;" \
1471 "sra $13, $13, 16;" \
1472 "addu $15, $12, $13;" \
1473 "mfc2 $12, $9;" \
1474 "mfc2 $13, $10;" \
1475 "sh $15, 2( %2 );" \
1476 "addu $12, $12, $13;" \
1477 "sh $12, 0( %2 )" \
1478 : \
1479 : "r"(r0), "r"(r1), "r"(r2) \
1480 : "$12", "$13", "$14", "$15", "memory")
1481
1482#define gte_FlipRotMatrixX() \
1483 __asm__ volatile( \
1484 "cfc2 $12, $0;" \
1485 "cfc2 $13, $1;" \
1486 "sll $14, $12, 16;" \
1487 "sra $14, $14, 16;" \
1488 "subu $14, $0, $14;" \
1489 "sra $15, $12, 16;" \
1490 "subu $15, $0, $15;" \
1491 "sll $15, $15, 16;" \
1492 "sll $14, $14, 16;" \
1493 "srl $14, $14, 16;" \
1494 "or $14, $14, $15;" \
1495 "ctc2 $14, $0;" \
1496 "sll $14, $13, 16;" \
1497 "sra $14, $14, 16;" \
1498 "subu $14, $0, $14;" \
1499 "sra $15, $13, 16;" \
1500 "sll $15, $15, 16;" \
1501 "sll $14, $14, 16;" \
1502 "srl $14, $14, 16;" \
1503 "or $14, $14, $15;" \
1504 "ctc2 $14, $1" \
1505 : \
1506 : \
1507 : "$12", "$13", "$14", "$15")
1508
1509#define gte_FlipTRX() \
1510 __asm__ volatile( \
1511 "cfc2 $12, $5;" \
1512 "nop;" \
1513 "subu $12, $0, $12;" \
1514 "ctc2 $12, $5" \
1515 : \
1516 : \
1517 : "$12")