Nugget
inline_n.h
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 0x01A0003E0;")
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")