branches.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
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
274int 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