1#define TEST1(instruction, RSval, RTval, RD, RS, RT)  \
2{                                                     \
3   unsigned long long out;                            \
4   __asm__ __volatile__(                              \
5      "move $"#RS", %1"     "\n\t"                    \
6      "move $"#RT", %2"     "\n\t"                    \
7      "move $"#RD", $zero"  "\n\t"                    \
8      instruction           "\n\t"                    \
9      "move %0,     $"#RD   "\n\t"                    \
10      : "=r" (out)                                    \
11      : "r" (RSval), "r" (RTval)                      \
12      : #RD, #RS, #RT                                 \
13   );                                                 \
14   printf("%s :: rd 0x%llx, rs 0x%llx, rt 0x%llx\n",  \
15          instruction, out, (long long) RSval,        \
16          (long long) RTval);                         \
17}
18
19#define TEST2(instruction, RSval, imm, RT, RS)         \
20{                                                      \
21   unsigned long long out;                             \
22   __asm__ __volatile__(                               \
23      "move $"#RS", %1"     "\n\t"                     \
24      "move $"#RT", $zero"  "\n\t"                     \
25      instruction           "\n\t"                     \
26      "move %0,     $"#RT   "\n\t"                     \
27      : "=r" (out)                                     \
28      : "r" (RSval)                                    \
29      : #RT, #RS                                       \
30   );                                                  \
31   printf("%s :: rt 0x%llx, rs 0x%llx, imm 0x%04x\n",  \
32          instruction, out, (long long) RSval, imm);   \
33}
34
35#define TEST3(instruction, RSval, RD, RS)        \
36{                                                \
37   unsigned long long out;                       \
38   __asm__ __volatile__(                         \
39      "move $"#RS", %1"     "\n\t"               \
40      "move $"#RD", $zero"  "\n\t"               \
41      instruction           "\n\t"               \
42      "move %0,     $"#RD   "\n\t"               \
43      : "=r" (out)                               \
44      : "r" (RSval)                              \
45      : #RD, #RS                                 \
46   );                                            \
47   printf("%s :: rd 0x%llx, rs 0x%llx\n",        \
48          instruction, out, (long long) RSval);  \
49}
50
51#define TEST4(instruction, RSval, RTval, RS, RT)                       \
52{                                                                      \
53   unsigned long long HI;                                              \
54   unsigned long long LO;                                              \
55   __asm__ __volatile__(                                               \
56      "move $"#RS", %2"  "\n\t"                                        \
57      "move $"#RT", %3"  "\n\t"                                        \
58      "mthi $zero"       "\n\t"                                        \
59      "mtlo $zero"       "\n\t"                                        \
60      instruction        "\n\t"                                        \
61      "mfhi %0"          "\n\t"                                        \
62      "mflo %1"          "\n\t"                                        \
63      : "=r" (HI), "=r" (LO)                                           \
64      : "r" (RSval), "r"(RTval)                                        \
65      : #RS, #RT                                                       \
66   );                                                                  \
67   printf("%s :: rs 0x%llx, rt 0x%llx, HI 0x%llx, LO 0x%llx\n",        \
68          instruction, (long long) RSval, (long long) RTval, HI, LO);  \
69}
70
71#define TEST5(instruction, RSval, RTval, RS, RT)                       \
72{                                                                      \
73   unsigned long long HI;                                              \
74   unsigned long long LO;                                              \
75   __asm__ __volatile__(                                               \
76      "move $"#RS", %2"  "\n\t"                                        \
77      "move $"#RT", %3"  "\n\t"                                        \
78      "mthi $"#RS        "\n\t"                                        \
79      "mtlo $"#RT        "\n\t"                                        \
80      instruction        "\n\t"                                        \
81      "mfhi %0"          "\n\t"                                        \
82      "mflo %1"          "\n\t"                                        \
83      : "=r" (HI), "=r" (LO)                                           \
84      : "r" (RSval), "r"(RTval)                                        \
85      : #RS, #RT                                                       \
86   );                                                                  \
87   printf("%s :: rs 0x%llx, rt 0x%llx, HI 0x%llx, LO 0x%llx\n",        \
88          instruction, (long long) RSval, (long long) RTval, HI, LO);  \
89}
90
91#define TEST6(instruction, imm, RT)         \
92{                                           \
93   unsigned long long out;                  \
94   __asm__ __volatile__(                    \
95      "move $"#RT", $zero"  "\n\t"          \
96      instruction           "\n\t"          \
97      "move %0, $"#RT       "\n\t"          \
98      : "=r" (out) :                        \
99      : #RT                                 \
100   );                                       \
101   printf("%s :: rt 0x%llx, imm 0x%04x\n",  \
102          instruction, out, imm);           \
103}
104