• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 
3 #define TESTINST1(RSval, RD)            \
4 {                                       \
5    unsigned int out = 0;                \
6    __asm__ __volatile__(                \
7       ".set noreorder"          "\n\t"  \
8       "move $"#RD", %1"         "\n\t"  \
9       "b    end"#RSval          "\n\t"  \
10       "nop"                     "\n\t"  \
11       "addi $"#RD", $"#RD", 5"  "\n\t"  \
12       "end"#RSval":"            "\n\t"  \
13       "addi $"#RD", $"#RD", 1"  "\n\t"  \
14       "move %0,     $"#RD       "\n\t"  \
15       ".set reorder"            "\n\t"  \
16       : "=r" (out)                      \
17       : "r" (RSval)                     \
18       : #RD                             \
19    );                                   \
20    printf("B :: %d, RSval: %d\n",       \
21           out, RSval);                  \
22 }
23 
24 #define TESTINST2(RSval, RD)            \
25 {                                       \
26    unsigned int out = 0;                \
27    __asm__ __volatile__(                \
28       ".set noreorder"          "\n\t"  \
29       "move $"#RD", %1"         "\n\t"  \
30       "b    end12"#RSval        "\n\t"  \
31       "addi $"#RD", $"#RD", 3"  "\n\t"  \
32       "addi $"#RD", $"#RD", 5"  "\n\t"  \
33       "end12"#RSval":"          "\n\t"  \
34       "addi $"#RD", $"#RD", 3"  "\n\t"  \
35       "move %0,     $"#RD       "\n\t"  \
36       ".set reorder"            "\n\t"  \
37       : "=r" (out)                      \
38       : "r" (RSval)                     \
39       : #RD                             \
40    );                                   \
41    printf("B :: %d, RSval: %d\n",       \
42           out, RSval);                  \
43 }
44 
45 #define TESTINST3(RSval, RD)              \
46 {                                         \
47    unsigned int out = 0;                  \
48    __asm__ __volatile__(                  \
49       ".set noreorder"          "\n\t"    \
50       "move $"#RD", %1"         "\n\t"    \
51       "bal  end21"#RSval        "\n\t"    \
52       "nop"                     "\n\t"    \
53       "addi $"#RD", $"#RD", 5"  "\n\t"    \
54       "b    r_end"#RSval        "\n\t"    \
55       "nop"                     "\n\t"    \
56       "addi $"#RD", $"#RD", 1"  "\n\t"    \
57       "end21"#RSval":"          "\n\t"    \
58       "addi $"#RD", $"#RD", 1"  "\n\t"    \
59       "jr   $ra"                "\n\t"    \
60       "nop"                     "\n\t"    \
61       "r_end"#RSval":"          "\n\t"    \
62       "move %0,     $"#RD       "\n\t"    \
63       ".set reorder"            "\n\t"    \
64       : "=r" (out)                        \
65       : "r" (RSval)                       \
66       : #RD, "ra"                         \
67    );                                     \
68    printf("B BAL JR :: %d, RSval: %d\n",  \
69           out, RSval);                    \
70 }
71 
72 #define TESTINST3j(RSval, RD)               \
73 {                                           \
74    unsigned int out = 0;                    \
75    __asm__ __volatile__(                    \
76       ".set noreorder"              "\n\t"  \
77       "move $"#RD", %1"             "\n\t"  \
78       "dla  $t9,    end31"#RSval    "\n\t"  \
79       "jal  $t9"                    "\n\t"  \
80       "nop"                         "\n\t"  \
81       "addi $"#RD", $"#RD", 5"      "\n\t"  \
82       "dla  $t9,    r_end11"#RSval  "\n\t"  \
83       "j    $t9"                    "\n\t"  \
84       "nop"                         "\n\t"  \
85       "end31"#RSval":"              "\n\t"  \
86       "addi $"#RD", $"#RD", 1"      "\n\t"  \
87       "jr   $ra"                    "\n\t"  \
88       "nop"                         "\n\t"  \
89       "r_end11"#RSval":"            "\n\t"  \
90       "move %0, $"#RD               "\n\t"  \
91       ".set reorder"                "\n\t"  \
92       : "=r" (out)                          \
93       : "r" (RSval)                         \
94       : #RD, "t9"                           \
95    );                                       \
96    printf("J JAL JR :: %d, RSval: %d\n",    \
97           out, RSval);                      \
98 }
99 
100 #define TESTINST3ja(RSval, RD)             \
101 {                                          \
102    unsigned int out = 0;                   \
103    __asm__ __volatile__(                   \
104       ".set noreorder"            "\n\t"   \
105       "move $"#RD", %1"           "\n\t"   \
106       "dla  $t9,    end41"#RSval  "\n\t"   \
107       "jalr $t0,    $t9"          "\n\t"   \
108       "nop"                       "\n\t"   \
109       "addi $"#RD", $"#RD", 5"    "\n\t"   \
110       "dla  $t9, r_end21"#RSval   "\n\t"   \
111       "j    $t9"                  "\n\t"   \
112       "nop"                       "\n\t"   \
113       "addi $"#RD", $"#RD", 1"    "\n\t"   \
114       "end41"#RSval":"            "\n\t"   \
115       "addi $"#RD", $"#RD", 1"    "\n\t"   \
116       "move $t9,    $t0"          "\n\t"   \
117       "jr   $t9"                  "\n\t"   \
118       "nop"                       "\n\t"   \
119       "r_end21"#RSval":"          "\n\t"   \
120       "move %0,     $"#RD         "\n\t"   \
121       ".set reorder"              "\n\t"   \
122       : "=r" (out)                         \
123       : "r" (RSval)                        \
124       : #RD, "t0", "t9"                    \
125    );                                      \
126    printf("J JALR JR :: %d, RSval: %d\n",  \
127           out, RSval);                     \
128 }
129 
130 #define TESTINST4(instruction, RDval, RSval, RTval, RD, RS, RT)         \
131 {                                                                       \
132    unsigned int out = 0;                                                \
133    __asm__ __volatile__(                                                \
134       ".set noreorder"                                    "\n\t"        \
135       "move        $"#RS", %1"                            "\n\t"        \
136       "move        $"#RT", %2"                            "\n\t"        \
137       "move        $"#RD", %3"                            "\n\t"        \
138       instruction" $"#RS", $"#RT", end"instruction#RDval  "\n\t"        \
139       "nop"                                               "\n\t"        \
140       "addi        $"#RD", $"#RD", 5"                     "\n\t"        \
141       "end"instruction#RDval":"                           "\n\t"        \
142       "addi        $"#RD", $"#RD", 1"                     "\n\t"        \
143       "move        %0,     $" #RD                         "\n\t"        \
144       ".set reorder"                                      "\n\t"        \
145       : "=r" (out)                                                      \
146       : "r" (RSval), "r" (RTval), "r" (RDval)                           \
147       : #RD, #RS, #RT                                                   \
148    );                                                                   \
149    printf(instruction" :: out: %d, RDval: %d, RSval: %d, RTval: %d\n",  \
150           out, RDval, RSval, RTval);                                    \
151 }
152 
153 #define TESTINST5(instruction, RDval, RSval, RD, RS)          \
154 {                                                             \
155    unsigned int out = 0;                                      \
156    __asm__ __volatile__(                                      \
157       ".set        noreorder"                     "\n\t"      \
158       "move        $"#RS", %1"                    "\n\t"      \
159       "move        $"#RD", %2"                    "\n\t"      \
160       instruction" $"#RS", end"instruction#RDval  "\n\t"      \
161       "nop"                                       "\n\t"      \
162       "addi        $"#RD", $"#RD", 5"             "\n\t"      \
163       "end"instruction#RDval":"                   "\n\t"      \
164       "addi        $"#RD", $"#RD", 1"             "\n\t"      \
165       "move        %0,     $"#RD                  "\n\t"      \
166       ".set        reorder"                       "\n\t"      \
167       : "=r" (out)                                            \
168       : "r" (RSval), "r" (RDval)                              \
169       : #RD, #RS                                              \
170     );                                                        \
171     printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
172            out, RDval, RSval);                                \
173 }
174 
175 #define TESTINST6(instruction, RDval, RSval, RD, RS)         \
176 {                                                            \
177    unsigned int out = 0;                                     \
178    __asm__ __volatile__(                                     \
179       ".set        noreorder"                       "\n\t"   \
180       "move        $"#RD", %2"                      "\n\t"   \
181       "move        $"#RS", %1"                      "\n\t"   \
182       instruction" $"#RS", end21"instruction#RDval  "\n\t"   \
183       "nop"                                         "\n\t"   \
184       "addi        $"#RD", $"#RD", 5"               "\n\t"   \
185       "b           r_end"instruction#RDval          "\n\t"   \
186       "nop"                                         "\n\t"   \
187       "end21"instruction#RDval":"                   "\n\t"   \
188       "addi        $"#RD", $"#RD", 1"               "\n\t"   \
189       "jr          $ra"                             "\n\t"   \
190       "r_end"instruction#RDval":"                   "\n\t"   \
191       "move        %0, $"#RD                        "\n\t"   \
192       ".set        reorder"                         "\n\t"   \
193       : "=r" (out)                                           \
194       : "r" (RSval), "r" (RDval)                             \
195       : #RD, #RS, "ra"                                       \
196    );                                                        \
197    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
198           out, RDval, RSval);                                \
199 }
200 
201 #define TESTINST4l(instruction, RDval, RSval, RTval, RD, RS, RT)        \
202 {                                                                       \
203    unsigned int out = 0;                                                \
204    __asm__ __volatile__(                                                \
205       ".set        noreorder"                             "\n\t"        \
206       "move        $"#RS", %1"                            "\n\t"        \
207       "move        $"#RT", %2"                            "\n\t"        \
208       "move        $"#RD", %3"                            "\n\t"        \
209       instruction" $"#RS", $"#RT", end"instruction#RDval  "\n\t"        \
210       "addi        $"#RD", $"#RD", 3"                     "\n\t"        \
211       "addi        $"#RD", $"#RD", 5"                     "\n\t"        \
212       "end"instruction#RDval":"                           "\n\t"        \
213       "addi        $"#RD", $"#RD", 1"                     "\n\t"        \
214       "move        %0, $"#RD                              "\n\t"        \
215       ".set        reorder"                               "\n\t"        \
216       : "=r" (out)                                                      \
217       : "r" (RSval), "r" (RTval), "r" (RDval)                           \
218       : #RD, #RS, #RT                                                   \
219    );                                                                   \
220    printf(instruction" :: out: %d, RDval: %d, RSval: %d, RTval: %d\n",  \
221           out, RDval, RSval, RTval);                                    \
222 }
223 
224 #define TESTINST5l(instruction, RDval, RSval, RD, RS)        \
225 {                                                            \
226    unsigned int out = 0;                                     \
227    __asm__ __volatile__(                                     \
228       ".set        noreorder"                     "\n\t"     \
229       "move        $"#RS", %1"                    "\n\t"     \
230       "move        $"#RD", %2"                    "\n\t"     \
231       instruction" $"#RS", end"instruction#RDval  "\n\t"     \
232       "addi        $"#RD", $"#RD", 3"             "\n\t"     \
233       "addi        $"#RD", $"#RD", 5"             "\n\t"     \
234       "end"instruction#RDval":"                   "\n\t"     \
235       "addi        $"#RD", $"#RD", 1"             "\n\t"     \
236       "move        %0,     $"#RD                  "\n\t"     \
237       ".set        reorder"                       "\n\t"     \
238       : "=r" (out)                                           \
239       : "r" (RSval), "r" (RDval)                             \
240       : #RD, #RS                                             \
241    );                                                        \
242    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
243           out, RDval, RSval);                                \
244 }
245 
246 #define TESTINST6l(instruction, RDval, RSval, RD, RS)        \
247 {                                                            \
248    unsigned int out = 0;                                     \
249    __asm__ __volatile__(                                     \
250       ".set        noreorder"                       "\n\t"   \
251       "move        $"#RD", %2"                      "\n\t"   \
252       "move        $"#RS", %1"                      "\n\t"   \
253       instruction" $"#RS", end21"instruction#RDval  "\n\t"   \
254       "addi        $"#RD", $"#RD", 3"               "\n\t"   \
255       "addi        $"#RD", $"#RD", 5"               "\n\t"   \
256       "b           r_end"instruction#RDval          "\n\t"   \
257       "nop"                                         "\n\t"   \
258       "end21"instruction#RDval":"                   "\n\t"   \
259       "addi        $"#RD", $"#RD", 1"               "\n\t"   \
260       "jr          $ra"                             "\n\t"   \
261       "nop"                                         "\n\t"   \
262       "r_end"instruction#RDval":"                   "\n\t"   \
263       "move        %0, $"#RD                        "\n\t"   \
264       ".set        reorder"                         "\n\t"   \
265       : "=r" (out)                                           \
266       : "r" (RSval), "r" (RDval)                             \
267       : #RD, #RS, "ra"                                       \
268    );                                                        \
269    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
270           out, RDval, RSval);                                \
271 }
272 
273 
main()274 int main()
275 {
276    printf("b\n");
277    TESTINST1(0,  2);
278    TESTINST1(1,  3);
279    TESTINST1(2,  4);
280    TESTINST1(3,  5);
281    TESTINST1(4,  6);
282    TESTINST1(5,  7);
283    TESTINST1(6,  8);
284    TESTINST1(7,  9);
285    TESTINST1(8,  10);
286    TESTINST1(9,  11);
287    TESTINST1(10, 12);
288    TESTINST1(11, 13);
289    TESTINST1(12, 14);
290    TESTINST1(13, 15);
291    TESTINST1(14, 16);
292    TESTINST1(15, 17);
293    TESTINST1(16, 18);
294    TESTINST1(17, 19);
295    TESTINST1(18, 20);
296    TESTINST1(19, 21);
297    TESTINST1(20, 22);
298    TESTINST1(21, 23);
299    TESTINST1(22, 24);
300    TESTINST1(23, 25);
301 
302    printf("b\n");
303    TESTINST2(0,  2);
304    TESTINST2(1,  3);
305    TESTINST2(2,  4);
306    TESTINST2(3,  5);
307    TESTINST2(4,  6);
308    TESTINST2(5,  7);
309    TESTINST2(6,  8);
310    TESTINST2(7,  9);
311    TESTINST2(8,  10);
312    TESTINST2(9,  11);
313    TESTINST2(10, 12);
314    TESTINST2(11, 13);
315    TESTINST2(12, 14);
316    TESTINST2(13, 15);
317    TESTINST2(14, 16);
318    TESTINST2(15, 17);
319    TESTINST2(16, 18);
320    TESTINST2(17, 19);
321    TESTINST2(18, 20);
322    TESTINST2(19, 21);
323    TESTINST2(20, 22);
324    TESTINST2(21, 23);
325    TESTINST2(22, 24);
326    TESTINST2(23, 25);
327 
328    printf("b, bal, jr\n");
329    TESTINST3(0,  2);
330    TESTINST3(1,  3);
331    TESTINST3(2,  4);
332    TESTINST3(3,  5);
333    TESTINST3(4,  6);
334    TESTINST3(5,  7);
335    TESTINST3(6,  8);
336    TESTINST3(7,  9);
337    TESTINST3(8,  10);
338    TESTINST3(9,  11);
339    TESTINST3(10, 12);
340    TESTINST3(11, 13);
341    TESTINST3(12, 14);
342    TESTINST3(13, 15);
343    TESTINST3(14, 16);
344    TESTINST3(15, 17);
345    TESTINST3(16, 18);
346    TESTINST3(17, 19);
347    TESTINST3(18, 20);
348    TESTINST3(19, 21);
349    TESTINST3(20, 22);
350    TESTINST3(21, 23);
351    TESTINST3(22, 24);
352    TESTINST3(23, 25);
353 
354    printf("--- BEQ ---  if RSval == RTval then " \
355           "out = RDval + 1 else out = RDval + 6\n");
356    TESTINST4("beq", 0,  0,          1,          2,  3 , 4);
357    TESTINST4("beq", 1,  1,          1,          3,  4,  5);
358    TESTINST4("beq", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
359    TESTINST4("beq", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
360    TESTINST4("beq", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
361    TESTINST4("beq", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
362    TESTINST4("beq", 6,  0x5,        0x5,        8,  9,  10);
363    TESTINST4("beq", 7,  -3,         -4,         9,  10, 11);
364    TESTINST4("beq", 8,  125,        125,        10, 11, 12);
365    TESTINST4("beq", 9,  0x80000000, 0x80000000, 11, 12, 13);
366    TESTINST4("beq", 10, 0xffffffff, 0x80000000, 12, 13, 14);
367    TESTINST4("beq", 11, 0x256,      0x256,      13, 14, 15);
368    TESTINST4("beq", 12, 0x55,       0x55,       14, 15, 16);
369    TESTINST4("beq", 13, 0xfff,      0xdd,       16, 17, 18);
370    TESTINST4("beq", 14, -1,         0x5,        2,  25, 24);
371    TESTINST4("beq", 15, -1,         -1,         25, 24, 7);
372 
373    printf("--- BNE ---  if RSval != RTval then " \
374           "out = RDval + 1 else out = RDval + 6\n");
375    TESTINST4("bne", 0,  0,          1,          2,  3,  4);
376    TESTINST4("bne", 1,  1,          1,          3,  4,  5);
377    TESTINST4("bne", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
378    TESTINST4("bne", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
379    TESTINST4("bne", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
380    TESTINST4("bne", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
381    TESTINST4("bne", 6,  0x5,        0x5,        8,  9,  10);
382    TESTINST4("bne", 7,  -3,         -4,         9,  10, 11);
383    TESTINST4("bne", 8,  125,        125,        10, 11, 12);
384    TESTINST4("bne", 9,  0x80000000, 0x80000000, 11, 12, 13);
385    TESTINST4("bne", 10, 0xffffffff, 0x80000000, 12, 13, 14);
386    TESTINST4("bne", 11, 0x256,      0x256,      13, 14, 15);
387    TESTINST4("bne", 12, 0x55,       0x55,       14, 15, 16);
388    TESTINST4("bne", 13, 0xfff,      0xdd,       16, 17, 18);
389    TESTINST4("bne", 14, -1,         0x5,        2,  25, 24);
390    TESTINST4("bne", 15, -1,         -1,         25, 24, 7);
391 
392    printf("--- BEQZ ---  if RSval == 0 then " \
393           "out = RDval + 1 else out = RDval + 6\n");
394    TESTINST5("beqz", 0,  0,          2,  3);
395    TESTINST5("beqz", 1,  1,          3,  4);
396    TESTINST5("beqz", 2,  0xffffffff, 4,  5);
397    TESTINST5("beqz", 3,  0xffffffff, 5,  6);
398    TESTINST5("beqz", 4,  0xfffffffe, 6,  8);
399    TESTINST5("beqz", 5,  0xffffffff, 7,  8);
400    TESTINST5("beqz", 6,  0x5,        8,  9);
401    TESTINST5("beqz", 7,  -3,         9,  10);
402    TESTINST5("beqz", 8,  125,        10, 11);
403    TESTINST5("beqz", 9,  0x80000000, 11, 12);
404    TESTINST5("beqz", 10, 0xffffffff, 12, 13);
405    TESTINST5("beqz", 11, 0x256,      13, 14);
406    TESTINST5("beqz", 12, 0x55,       14, 15);
407    TESTINST5("beqz", 13, 0xfff,      16, 17);
408    TESTINST5("beqz", 14, -1,         2,  25);
409    TESTINST5("beqz", 15, -1,         25, 24);
410 
411    printf("--- BGEZ ---  if RSval >= 0 then " \
412           "out = RDval + 1 else out = RDval + 6\n");
413    TESTINST5("bgez", 0,  0,          2,  3);
414    TESTINST5("bgez", 1,  1,          3,  4);
415    TESTINST5("bgez", 2,  0xffffffff, 4,  5);
416    TESTINST5("bgez", 3,  0xffffffff, 5,  6);
417    TESTINST5("bgez", 4,  0xfffffffe, 6,  8);
418    TESTINST5("bgez", 5,  0xffffffff, 7,  8);
419    TESTINST5("bgez", 6,  0x5,        8,  9);
420    TESTINST5("bgez", 7,  -3,         9,  10);
421    TESTINST5("bgez", 8,  125,        10, 11);
422    TESTINST5("bgez", 9,  0x80000000, 11, 12);
423    TESTINST5("bgez", 10, 0xffffffff, 12, 13);
424    TESTINST5("bgez", 11, 0x256,      13, 14);
425    TESTINST5("bgez", 12, 0x55,       14, 15);
426    TESTINST5("bgez", 13, 0xfff,      16, 17);
427    TESTINST5("bgez", 14, -1,         2,  25);
428    TESTINST5("bgez", 15, -1,         25, 24);
429 
430    printf("--- BGTZ ---  if RSval > 0 then " \
431           "out = RDval + 1 else out = RDval + 6\n");
432    TESTINST5("bgtz", 0,  0,          2,  3);
433    TESTINST5("bgtz", 1,  1,          3,  4);
434    TESTINST5("bgtz", 2,  0xffffffff, 4,  5);
435    TESTINST5("bgtz", 3,  0xffffffff, 5,  6);
436    TESTINST5("bgtz", 4,  0xfffffffe, 6,  8);
437    TESTINST5("bgtz", 5,  0xffffffff, 7,  8);
438    TESTINST5("bgtz", 6,  0x5,        8,  9);
439    TESTINST5("bgtz", 7,  -3,         9,  10);
440    TESTINST5("bgtz", 8,  125,        10, 11);
441    TESTINST5("bgtz", 9,  0x80000000, 11, 12);
442    TESTINST5("bgtz", 10, 0xffffffff, 12, 13);
443    TESTINST5("bgtz", 11, 0x256,      13, 14);
444    TESTINST5("bgtz", 12, 0x55,       14, 15);
445    TESTINST5("bgtz", 13, 0xfff,      16, 17);
446    TESTINST5("bgtz", 14, -1,         2,  25);
447    TESTINST5("bgtz", 15, -1,         25, 24);
448 
449    printf("--- BLEZ ---  if RSval <= 0 then " \
450           "out = RDval + 1 else out = RDval + 6\n");
451    TESTINST5("blez", 0,  0,          2,  3);
452    TESTINST5("blez", 1,  1,          3,  4);
453    TESTINST5("blez", 2,  0xffffffff, 4,  5);
454    TESTINST5("blez", 3,  0xffffffff, 5,  6);
455    TESTINST5("blez", 4,  0xfffffffe, 6,  8);
456    TESTINST5("blez", 5,  0xffffffff, 7,  8);
457    TESTINST5("blez", 6,  0x5,        8,  9);
458    TESTINST5("blez", 7,  -3,         9,  10);
459    TESTINST5("blez", 8,  125,        10, 11);
460    TESTINST5("blez", 9,  0x80000000, 11, 12);
461    TESTINST5("blez", 10, 0xffffffff, 12, 13);
462    TESTINST5("blez", 11, 0x256,      13, 14);
463    TESTINST5("blez", 12, 0x55,       14, 15);
464    TESTINST5("blez", 13, 0xfff,      16, 17);
465    TESTINST5("blez", 14, -1,         2,  25);
466    TESTINST5("blez", 15, -1,         25, 24);
467 
468    printf("--- BLTZ ---  if RSval < 0 then " \
469           "out = RDval + 1 else out = RDval + 6\n");
470    TESTINST5("bltz", 0,  0,          2,  3);
471    TESTINST5("bltz", 1,  1,          3,  4);
472    TESTINST5("bltz", 2,  0xffffffff, 4,  5);
473    TESTINST5("bltz", 3,  0xffffffff, 5,  6);
474    TESTINST5("bltz", 4,  0xfffffffe, 6,  8);
475    TESTINST5("bltz", 5,  0xffffffff, 7,  8);
476    TESTINST5("bltz", 6,  0x5,        8,  9);
477    TESTINST5("bltz", 7,  -3,         9,  10);
478    TESTINST5("bltz", 8,  125,        10, 11);
479    TESTINST5("bltz", 9,  0x80000000, 11, 12);
480    TESTINST5("bltz", 10, 0xffffffff, 12, 13);
481    TESTINST5("bltz", 11, 0x256,      13, 14);
482    TESTINST5("bltz", 12, 0x55,       14, 15);
483    TESTINST5("bltz", 13, 0xfff,      16, 17);
484    TESTINST5("bltz", 14, -1,         2,  25);
485    TESTINST5("bltz", 15, -1,         25, 24);
486 
487    printf("--- BGEZAL ---  if RSval >= 0 then " \
488           "out = RDval + 6 else out = RDval + 5\n");
489    TESTINST6("bgezal", 0,  0,          2,  3);
490    TESTINST6("bgezal", 1,  1,          3,  4);
491    TESTINST6("bgezal", 2,  0xffffffff, 4,  5);
492    TESTINST6("bgezal", 3,  0xffffffff, 5,  6);
493    TESTINST6("bgezal", 4,  0xfffffffe, 6,  8);
494    TESTINST6("bgezal", 5,  0xffffffff, 7,  8);
495    TESTINST6("bgezal", 6,  0x5,        8,  9);
496    TESTINST6("bgezal", 7,  -3,         9,  10);
497    TESTINST6("bgezal", 8,  125,        10, 11);
498    TESTINST6("bgezal", 9,  0x80000000, 11, 12);
499    TESTINST6("bgezal", 10, 0xffffffff, 12, 13);
500    TESTINST6("bgezal", 11, 0x256,      13, 14);
501    TESTINST6("bgezal", 12, 0x55,       14, 15);
502    TESTINST6("bgezal", 13, 0xfff,      16, 17);
503    TESTINST6("bgezal", 14, -1,         2,  25);
504    TESTINST6("bgezal", 15, -1,         25, 24);
505 
506    printf("--- BLTZAL ---  if RSval < 0 then " \
507           "out = RDval + 6 else out = RDval + 5\n");
508    TESTINST6("bltzal", 0,  0,          2,  3);
509    TESTINST6("bltzal", 1,  1,          3,  4);
510    TESTINST6("bltzal", 2,  0xffffffff, 4,  5);
511    TESTINST6("bltzal", 3,  0xffffffff, 5,  6);
512    TESTINST6("bltzal", 4,  0xfffffffe, 6,  8);
513    TESTINST6("bltzal", 5,  0xffffffff, 7,  8);
514    TESTINST6("bltzal", 6,  0x5,        8,  9);
515    TESTINST6("bltzal", 7,  -3,         9,  10);
516    TESTINST6("bltzal", 8,  125,        10, 11);
517    TESTINST6("bltzal", 9,  0x80000000, 11, 12);
518    TESTINST6("bltzal", 10, 0xffffffff, 12, 13);
519    TESTINST6("bltzal", 11, 0x256,      13, 14);
520    TESTINST6("bltzal", 12, 0x55,       14, 15);
521    TESTINST6("bltzal", 13, 0xfff,      16, 17);
522    TESTINST6("bltzal", 14, -1,         2,  25);
523    TESTINST6("bltzal", 15, -1,         25, 24);
524 
525    printf("--- BNEZ ---  if RSval != 0 then " \
526           "out = RDval + 1 else out = RDval + 6\n");
527    TESTINST5("bnez", 0,  0,          2,  3);
528    TESTINST5("bnez", 1,  1,          3,  4);
529    TESTINST5("bnez", 2,  0xffffffff, 4,  5);
530    TESTINST5("bnez", 3,  0xffffffff, 5,  6);
531    TESTINST5("bnez", 4,  0xfffffffe, 6,  8);
532    TESTINST5("bnez", 5,  0xffffffff, 7,  8);
533    TESTINST5("bnez", 6,  0x5,        8,  9);
534    TESTINST5("bnez", 7,  -3,         9,  10);
535    TESTINST5("bnez", 8,  125,        10, 11);
536    TESTINST5("bnez", 9,  0x80000000, 11, 12);
537    TESTINST5("bnez", 10, 0xffffffff, 12, 13);
538    TESTINST5("bnez", 11, 0x256,      13, 14);
539    TESTINST5("bnez", 12, 0x55,       14, 15);
540    TESTINST5("bnez", 13, 0xfff,      16, 17);
541    TESTINST5("bnez", 14, -1,         2,  25);
542    TESTINST5("bnez", 15, -1,         25, 24);
543 
544    printf("--- BEQL ---  if RSval == RTval then " \
545           "out = RDval + 4 else out = RDval + 6\n");
546    TESTINST4l("beql", 0,  0,          1,          2,  3,  4);
547    TESTINST4l("beql", 1,  1,          1,          3,  4,  5);
548    TESTINST4l("beql", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
549    TESTINST4l("beql", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
550    TESTINST4l("beql", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
551    TESTINST4l("beql", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
552    TESTINST4l("beql", 6,  0x5,        0x5,        8,  9,  10);
553    TESTINST4l("beql", 7,  -3,         -4,         9,  10, 11);
554    TESTINST4l("beql", 8,  125,        125,        10, 11, 12);
555    TESTINST4l("beql", 9,  0x80000000, 0x80000000, 11, 12, 13);
556    TESTINST4l("beql", 10, 0xffffffff, 0x80000000, 12, 13, 14);
557    TESTINST4l("beql", 11, 0x256,      0x256,      13, 14, 15);
558    TESTINST4l("beql", 12, 0x55,       0x55,       14, 15, 16);
559    TESTINST4l("beql", 13, 0xfff,      0xdd,       16, 17, 18);
560    TESTINST4l("beql", 14, -1,         0x5,        2,  25, 24);
561    TESTINST4l("beql", 15, -1,         -1,         25, 24, 7);
562 
563    printf("--- BGEZALL ---  if RSval >= 0 then " \
564           "out = RDval + 4 else out = RDval + 6\n");
565    TESTINST5l("bgezall", 0,  0,          2,  3);
566    TESTINST5l("bgezall", 1,  1,          3,  4);
567    TESTINST5l("bgezall", 2,  0xffffffff, 4,  5);
568    TESTINST5l("bgezall", 3,  0xffffffff, 5,  6);
569    TESTINST5l("bgezall", 4,  0xfffffffe, 6,  8);
570    TESTINST5l("bgezall", 5,  0xffffffff, 7,  8);
571    TESTINST5l("bgezall", 6,  0x5,        8,  9);
572    TESTINST5l("bgezall", 7,  -3,         9,  10);
573    TESTINST5l("bgezall", 8,  125,        10, 11);
574    TESTINST5l("bgezall", 9,  0x80000000, 11, 12);
575    TESTINST5l("bgezall", 10, 0xffffffff, 12, 13);
576    TESTINST5l("bgezall", 11, 0x256,      13, 14);
577    TESTINST5l("bgezall", 12, 0x55,       14, 15);
578    TESTINST5l("bgezall", 13, 0xfff,      16, 17);
579    TESTINST5l("bgezall", 14, -1,         2,  25);
580    TESTINST5l("bgezall", 15, -1,         25, 24);
581 
582    printf("--- BLTZALL ---  if RSval < 0 then " \
583           "out = RDval + 4 else out = RDval + 6\n");
584    TESTINST5l("bltzall", 0,  0,          2,  3);
585    TESTINST5l("bltzall", 1,  1,          3,  4);
586    TESTINST5l("bltzall", 2,  0xffffffff, 4,  5);
587    TESTINST5l("bltzall", 3,  0xffffffff, 5,  6);
588    TESTINST5l("bltzall", 4,  0xfffffffe, 6,  8);
589    TESTINST5l("bltzall", 5,  0xffffffff, 7,  8);
590    TESTINST5l("bltzall", 6,  0x5,        8,  9);
591    TESTINST5l("bltzall", 7,  -3,         9,  10);
592    TESTINST5l("bltzall", 8,  125,        10, 11);
593    TESTINST5l("bltzall", 9,  0x80000000, 11, 12);
594    TESTINST5l("bltzall", 10, 0xffffffff, 12, 13);
595    TESTINST5l("bltzall", 11, 0x256,      13, 14);
596    TESTINST5l("bltzall", 12, 0x55,       14, 15);
597    TESTINST5l("bltzall", 13, 0xfff,      16, 17);
598    TESTINST5l("bltzall", 14, -1,         2,  25);
599    TESTINST5l("bltzall", 15, -1,         25, 24);
600 
601    printf("--- BGEZL ---  if RSval >= 0 then " \
602           "out = RDval + 4 else out = RDval + 6\n");
603    TESTINST5l("bgezl", 0,  0,          2,  3);
604    TESTINST5l("bgezl", 1,  1,          3,  4);
605    TESTINST5l("bgezl", 2,  0xffffffff, 4,  5);
606    TESTINST5l("bgezl", 3,  0xffffffff, 5,  6);
607    TESTINST5l("bgezl", 4,  0xfffffffe, 6,  8);
608    TESTINST5l("bgezl", 5,  0xffffffff, 7,  8);
609    TESTINST5l("bgezl", 6,  0x5,        8,  9);
610    TESTINST5l("bgezl", 7,  -3,         9,  10);
611    TESTINST5l("bgezl", 8,  125,        10, 11);
612    TESTINST5l("bgezl", 9,  0x80000000, 11, 12);
613    TESTINST5l("bgezl", 10, 0xffffffff, 12, 13);
614    TESTINST5l("bgezl", 11, 0x256,      13, 14);
615    TESTINST5l("bgezl", 12, 0x55,       14, 15);
616    TESTINST5l("bgezl", 13, 0xfff,      16, 17);
617    TESTINST5l("bgezl", 14, -1,         2,  25);
618    TESTINST5l("bgezl", 15, -1,         25, 24);
619 
620    printf("--- BGTZL ---  if RSval > 0 then " \
621           "out = RDval + 4 else out = RDval + 6\n");
622    TESTINST5l("bgtzl", 0,  0,          2,  3);
623    TESTINST5l("bgtzl", 1,  1,          3,  4);
624    TESTINST5l("bgtzl", 2,  0xffffffff, 4,  5);
625    TESTINST5l("bgtzl", 3,  0xffffffff, 5,  6);
626    TESTINST5l("bgtzl", 4,  0xfffffffe, 6,  8);
627    TESTINST5l("bgtzl", 5,  0xffffffff, 7,  8);
628    TESTINST5l("bgtzl", 6,  0x5,        8,  9);
629    TESTINST5l("bgtzl", 7,  -3,         9,  10);
630    TESTINST5l("bgtzl", 8,  125,        10, 11);
631    TESTINST5l("bgtzl", 9,  0x80000000, 11, 12);
632    TESTINST5l("bgtzl", 10, 0xffffffff, 12, 13);
633    TESTINST5l("bgtzl", 11, 0x256,      13, 14);
634    TESTINST5l("bgtzl", 12, 0x55,       14, 15);
635    TESTINST5l("bgtzl", 13, 0xfff,      16, 17);
636    TESTINST5l("bgtzl", 14, -1,         2,  25);
637    TESTINST5l("bgtzl", 15, -1,         25, 24);
638 
639    printf("--- BLEZL ---  if RSval <= 0 then " \
640           "out = RDval + 4 else out = RDval + 6\n");
641    TESTINST5l("blezl", 0,  0,          2,  3);
642    TESTINST5l("blezl", 1,  1,          3,  4);
643    TESTINST5l("blezl", 2,  0xffffffff, 4,  5);
644    TESTINST5l("blezl", 3,  0xffffffff, 5,  6);
645    TESTINST5l("blezl", 4,  0xfffffffe, 6,  8);
646    TESTINST5l("blezl", 5,  0xffffffff, 7,  8);
647    TESTINST5l("blezl", 6,  0x5,        8,  9);
648    TESTINST5l("blezl", 7,  -3,         9,  10);
649    TESTINST5l("blezl", 8,  125,        10, 11);
650    TESTINST5l("blezl", 9,  0x80000000, 11, 12);
651    TESTINST5l("blezl", 10, 0xffffffff, 12, 13);
652    TESTINST5l("blezl", 11, 0x256,      13, 14);
653    TESTINST5l("blezl", 12, 0x55,       14, 15);
654    TESTINST5l("blezl", 13, 0xfff,      16, 17);
655    TESTINST5l("blezl", 14, -1,         2,  25);
656    TESTINST5l("blezl", 15, -1,         25, 24);
657 
658    printf("--- BGEZALL ---  if RSval >= 0 then " \
659           "out = RDval + 9 else out = RDval + 5\n");
660    TESTINST6l("bgezall", 0,  0,          2,  3);
661    TESTINST6l("bgezall", 1,  1,          3,  4);
662    TESTINST6l("bgezall", 2,  0xffffffff, 4,  5);
663    TESTINST6l("bgezall", 3,  0xffffffff, 5,  6);
664    TESTINST6l("bgezall", 4,  0xfffffffe, 6,  8);
665    TESTINST6l("bgezall", 5,  0xffffffff, 7,  8);
666    TESTINST6l("bgezall", 6,  0x5,        8,  9);
667    TESTINST6l("bgezall", 7,  -3,         9,  10);
668    TESTINST6l("bgezall", 8,  125,        10, 11);
669    TESTINST6l("bgezall", 9,  0x80000000, 11, 12);
670    TESTINST6l("bgezall", 10, 0xffffffff, 12, 13);
671    TESTINST6l("bgezall", 11, 0x256,      13, 14);
672    TESTINST6l("bgezall", 12, 0x55,       14, 15);
673    TESTINST6l("bgezall", 13, 0xfff,      16, 17);
674    TESTINST6l("bgezall", 14, -1,         2,  25);
675    TESTINST6l("bgezall", 15, -1,         25, 24);
676 
677    printf("--- BLTZL ---  if RSval < 0 then " \
678           "out = RDval + 4 else out = RDval + 6\n");
679    TESTINST5l("bltzl", 0,  0,          2,  3);
680    TESTINST5l("bltzl", 1,  1,          3,  4);
681    TESTINST5l("bltzl", 2,  0xffffffff, 4,  5);
682    TESTINST5l("bltzl", 3,  0xffffffff, 5,  6);
683    TESTINST5l("bltzl", 4,  0xfffffffe, 6,  8);
684    TESTINST5l("bltzl", 5,  0xffffffff, 7,  8);
685    TESTINST5l("bltzl", 6,  0x5,        8,  9);
686    TESTINST5l("bltzl", 7,  -3,         9,  10);
687    TESTINST5l("bltzl", 8,  125,        10, 11);
688    TESTINST5l("bltzl", 9,  0x80000000, 11, 12);
689    TESTINST5l("bltzl", 10, 0xffffffff, 12, 13);
690    TESTINST5l("bltzl", 11, 0x256,      13, 14);
691    TESTINST5l("bltzl", 12, 0x55,       14, 15);
692    TESTINST5l("bltzl", 13, 0xfff,      16, 17);
693    TESTINST5l("bltzl", 14, -1,         2,  25);
694    TESTINST5l("bltzl", 15, -1,         25, 24);
695 
696    printf("--- BNEL ---  if RSval != RTval then " \
697           "out = RDval + 4 else out = RDval + 5\n");
698    TESTINST4l("bnel", 0,  0,          1,          2,  3,  4);
699    TESTINST4l("bnel", 1,  1,          1,          3,  4,  5);
700    TESTINST4l("bnel", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
701    TESTINST4l("bnel", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
702    TESTINST4l("bnel", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
703    TESTINST4l("bnel", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
704    TESTINST4l("bnel", 6,  0x5,        0x5,        8,  9,  10);
705    TESTINST4l("bnel", 7,  -3,         -4,         9,  10, 11);
706    TESTINST4l("bnel", 8,  125,        125,        10, 11, 12);
707    TESTINST4l("bnel", 9,  0x80000000, 0x80000000, 11, 12, 13);
708    TESTINST4l("bnel", 10, 0xffffffff, 0x80000000, 12, 13, 14);
709    TESTINST4l("bnel", 11, 0x256,      0x256,      13, 14, 15);
710    TESTINST4l("bnel", 12, 0x55,       0x55,       14, 15, 16);
711    TESTINST4l("bnel", 13, 0xfff,      0xdd,       16, 17, 18);
712    TESTINST4l("bnel", 14, -1,         0x5,        2,  25, 24);
713    TESTINST4l("bnel", 15, -1,         -1,         25, 24, 7);
714 
715    printf("j, jal, jr\n");
716    TESTINST3j(0,  2);
717    TESTINST3j(1,  3);
718    TESTINST3j(2,  4);
719    TESTINST3j(3,  5);
720    TESTINST3j(4,  6);
721    TESTINST3j(5,  7);
722    TESTINST3j(6,  4);
723    TESTINST3j(7,  9);
724    TESTINST3j(8,  10);
725    TESTINST3j(9,  11);
726    TESTINST3j(10, 12);
727    TESTINST3j(11, 13);
728    TESTINST3j(12, 14);
729    TESTINST3j(13, 15);
730    TESTINST3j(14, 16);
731    TESTINST3j(15, 17);
732    TESTINST3j(16, 18);
733    TESTINST3j(17, 19);
734    TESTINST3j(18, 20);
735    TESTINST3j(19, 21);
736    TESTINST3j(20, 22);
737    TESTINST3j(21, 23);
738    TESTINST3j(22, 24);
739    TESTINST3j(23, 24);
740 
741    printf("j, jalr, jr\n");
742    TESTINST3ja(0,  2);
743    TESTINST3ja(1,  3);
744    TESTINST3ja(2,  4);
745    TESTINST3ja(3,  5);
746    TESTINST3ja(4,  6);
747    TESTINST3ja(5,  7);
748    TESTINST3ja(6,  4);
749    TESTINST3ja(7,  7);
750    TESTINST3ja(8,  10);
751    TESTINST3ja(9,  11);
752    TESTINST3ja(11, 13);
753    TESTINST3ja(12, 14);
754    TESTINST3ja(13, 15);
755    TESTINST3ja(14, 16);
756    TESTINST3ja(15, 17);
757    TESTINST3ja(16, 18);
758    TESTINST3ja(17, 19);
759    TESTINST3ja(18, 20);
760    TESTINST3ja(19, 21);
761    TESTINST3ja(20, 22);
762    TESTINST3ja(21, 23);
763    TESTINST3ja(22, 24);
764    TESTINST3ja(23, 24);
765 
766    return 0;
767 }
768