1 #include <stdio.h>
2 #include "const.h"
3 
4 
5 #define TEST1(RSval, RD)                   \
6 {                                          \
7    unsigned long long out = 0;             \
8    __asm__ __volatile__(                   \
9       ".set  noreorder"          "\n\t"    \
10       "move  $"#RD", %1"         "\n\t"    \
11       "b end"#RD                 "\n\t"    \
12       "nop"                      "\n\t"    \
13       "daddi $"#RD", $"#RD", 5"  "\n\t"    \
14       "end"#RD":"                "\n\t"    \
15       "daddi $"#RD", $"#RD", 1"  "\n\t"    \
16       "move  %0,     $"#RD       "\n\t"    \
17       ".set  reorder"            "\n\t"    \
18       : "=r" (out)                         \
19       : "r" (RSval)                        \
20       : #RD                                \
21    );                                      \
22    printf("B :: 0x%llx, RSval: 0x%llx\n",  \
23           out, (long long) RSval);         \
24 }
25 
26 #define TEST2(RSval, RD)                          \
27 {                                                 \
28    unsigned long long out = 0;                    \
29    __asm__ __volatile__(                          \
30       ".set  noreorder"          "\n\t"           \
31       "move  $"#RD", %1"         "\n\t"           \
32       "bal   end1"#RD            "\n\t"           \
33       "nop"                      "\n\t"           \
34       "daddi $"#RD", $"#RD", 5"  "\n\t"           \
35       "b     r_end"#RD           "\n\t"           \
36       "nop"                      "\n\t"           \
37       "end1"#RD":"               "\n\t"           \
38       "daddi $"#RD", $"#RD", 1"  "\n\t"           \
39       "jr    $ra"                "\n\t"           \
40       "nop"                      "\n\t"           \
41       "r_end"#RD":"              "\n\t"           \
42       "move  %0,     $"#RD       "\n\t"           \
43       ".set  reorder"            "\n\t"           \
44       : "=r" (out)                                \
45       : "r" (RSval)                               \
46       : #RD, "ra"                                 \
47    );                                             \
48    printf("B BAL JR :: 0x%llx, RSval: 0x%llx\n",  \
49           out, (long long) RSval);                \
50 }
51 
52 #define TEST2a(RSval, RD)                           \
53 {                                                   \
54    unsigned long long out = 0;                      \
55    __asm__ __volatile__(                            \
56       ".set  noreorder"          "\n\t"             \
57       "move  $"#RD", %1"         "\n\t"             \
58       "bal   end12"#RD           "\n\t"             \
59       "nop"                      "\n\t"             \
60       "daddi $"#RD", $"#RD", 5"  "\n\t"             \
61       "move  $t9, $ra"           "\n\t"             \
62       "jr    $t9"                "\n\t"             \
63       "nop"                      "\n\t"             \
64       "daddi $"#RD", $"#RD", 1"  "\n\t"             \
65       "end12"#RD":"              "\n\t"             \
66       "daddi $"#RD", $"#RD", 1"  "\n\t"             \
67       "move  $t9, $ra"           "\n\t"             \
68       "jal   $t9"                "\n\t"             \
69       "nop"                      "\n\t"             \
70       "move  %0,     $"#RD       "\n\t"             \
71       ".set  reorder"            "\n\t"             \
72       : "=r" (out)                                  \
73       : "r" (RSval)                                 \
74       : #RD, "t9", "ra"                             \
75    );                                               \
76    printf("BAL JR JAL :: 0x%llx, RSval: 0x%llx\n",  \
77           out, (long long) RSval);                  \
78 }
79 
80 #define TEST2b(RSval, RD)                           \
81 {                                                   \
82    unsigned long long out = 0;                      \
83    __asm__ __volatile__(                            \
84       ".set  noreorder"          "\n\t"             \
85       "move  $"#RD", %1"         "\n\t"             \
86       "bal   end13"#RD           "\n\t"             \
87       "nop"                      "\n\t"             \
88       "daddi $"#RD", $"#RD", 5"  "\n\t"             \
89       "move  $t9,    $t0"        "\n\t"             \
90       "j     $t9"                "\n\t"             \
91       "nop"                      "\n\t"             \
92       "daddi $"#RD", $"#RD", 1"  "\n\t"             \
93       "end13"#RD":"              "\n\t"             \
94       "daddi $"#RD", $"#RD", 1"  "\n\t"             \
95       "move  $t9,    $ra"        "\n\t"             \
96       "jalr  $t0,    $t9"        "\n\t"             \
97       "nop"                      "\n\t"             \
98       "move  %0,     $"#RD       "\n\t"             \
99       ".set  reorder"            "\n\t"             \
100       : "=r" (out)                                  \
101       : "r" (RSval)                                 \
102       : #RD, "t0", "t9", "ra"                       \
103    );                                               \
104    printf("BAL JR JAL :: 0x%llx, RSval: 0x%llx\n",  \
105           out, (long long) RSval);                  \
106 }
107 
108 #define TEST3(instruction, RDval, RSval, RTval, RD, RS, RT)              \
109 {                                                                        \
110    unsigned long long out = 0;                                           \
111    __asm__ __volatile__(                                                 \
112       ".set        noreorder"                             "\n\t"         \
113       "move        $"#RS", %1"                            "\n\t"         \
114       "move        $"#RT", %2"                            "\n\t"         \
115       "move        $"#RD", %3"                            "\n\t"         \
116       instruction" $"#RS", $"#RT", end"instruction#RDval  "\n\t"         \
117       "nop"                                               "\n\t"         \
118       "daddi       $"#RD", $"#RD", 5"                     "\n\t"         \
119       "end"instruction#RDval":"                           "\n\t"         \
120       "daddi       $"#RD", $"#RD", 1"                     "\n\t"         \
121       "move        %0,     $"#RD                          "\n\t"         \
122       ".set        reorder"                               "\n\t"         \
123       : "=r" (out)                                                       \
124       : "r" (RSval), "r" (RTval), "r" (RDval)                            \
125       : #RD, #RS, #RT                                                    \
126    );                                                                    \
127    printf(instruction" :: out: 0x%llx, RSval: 0x%llx, RTval: 0x%llx\n",  \
128           out, (long long) RSval, (long long) RTval);                    \
129 }
130 
131 #define TEST4(instruction, RDval, RSval, RD, RS)          \
132 {                                                         \
133    unsigned long long out = 0;                            \
134    __asm__ __volatile__(                                  \
135       ".set        noreorder"                     "\n\t"  \
136       "move        $"#RS", %1"                    "\n\t"  \
137       "move        $"#RD", %2"                    "\n\t"  \
138       instruction" $"#RS", end"instruction#RDval  "\n\t"  \
139       "nop"                                       "\n\t"  \
140       "daddi       $"#RD", $"#RD", 8"             "\n\t"  \
141       "end"instruction#RDval":"                   "\n\t"  \
142       "daddi       $"#RD", $"#RD", 1"             "\n\t"  \
143       "move        %0,     $"#RD                  "\n\t"  \
144       ".set        reorder"                       "\n\t"  \
145       : "=r" (out)                                        \
146       : "r" (RSval), "r" (RDval)                          \
147       : #RD, #RS                                          \
148    );                                                     \
149    printf(instruction" :: out: 0x%llx, RSval: 0x%llx\n",  \
150           out, (long long) RSval);                        \
151 }
152 
153 #define TEST5(instruction, RDval, RSval, RD, RS)            \
154 {                                                           \
155    unsigned long long out = 0;                              \
156    __asm__ __volatile__(                                    \
157       ".set        noreorder"                       "\n\t"  \
158       "move        $"#RD", %2"                      "\n\t"  \
159       "move        $"#RS", %1"                      "\n\t"  \
160       instruction" $"#RS", end21"instruction#RDval  "\n\t"  \
161       "nop"                                         "\n\t"  \
162       "daddi       $"#RD", $"#RD", 5"               "\n\t"  \
163       "b           r_end"instruction#RDval          "\n\t"  \
164       "nop"                                         "\n\t"  \
165       "end21"instruction#RDval":"                   "\n\t"  \
166       "daddi       $"#RD", $"#RD", 1"               "\n\t"  \
167       "jr          $ra"                             "\n\t"  \
168       "r_end"instruction#RDval":"                   "\n\t"  \
169       "move        %0,     $"#RD                    "\n\t"  \
170       ".set        reorder"                         "\n\t"  \
171       : "=r" (out)                                          \
172       : "r" (RSval), "r" (RDval)                            \
173       : #RD, #RS, "ra"                                      \
174    );                                                       \
175    printf(instruction" :: out: 0x%llx, RSval: 0x%llx\n",    \
176           out, (long long) RSval);                          \
177 }
178 
main()179 int main()
180 {
181    int i;
182    init_reg_val2();
183 #if (__mips_isa_rev < 6)
184 
185    printf("B \n");
186    for (i = 0; i < N; i++)
187       TEST1(reg_val1[i], t0);
188 
189    printf("BAL \n");
190    for (i = 0; i < N; i++)
191       TEST2(reg_val1[i], t0);
192 
193    printf("--- BEQ ---  if RSval == RTval then " \
194           "out = RDval + 1 else out = RDval + 6\n");
195    TEST3("beq", 0,  0,          1,          2,  3,  4);
196    TEST3("beq", 1,  1,          1,          3,  4,  5);
197    TEST3("beq", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
198    TEST3("beq", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
199    TEST3("beq", 4,  0xfffffffe, 0xffffffff, 6,  7,  8);
200    TEST3("beq", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
201    TEST3("beq", 6,  0x5,        0x5,        8,  9,  10);
202    TEST3("beq", 7,  -3,         -4,         9,  10, 11);
203    TEST3("beq", 8,  125,        125,        10, 11, 12);
204    TEST3("beq", 9,  0x80000000, 0x80000000, 11, 12, 15);
205    TEST3("beq", 10, 0xffffffff, 0x80000000, 12, 13, 14);
206    TEST3("beq", 11, 0x256,      0x256,      13, 14, 15);
207    TEST3("beq", 12, 0x55,       0x55,       14, 15, 16);
208    TEST3("beq", 13, 0xfff,      0xdd,       15, 16, 17);
209    TEST3("beq", 14, -1,         0x5,        16, 17, 18);
210    TEST3("beq", 15, -1,         -1,         17, 18, 19);
211 
212    printf("--- BGEZ ---  if RSval >= 0 then " \
213           "out = RDval + 1 else out = RDval + 9\n");
214    TEST4("bgez", 0,  0,          2,  3);
215    TEST4("bgez", 1,  1,          3,  4);
216    TEST4("bgez", 2,  0xffffffff, 4,  5);
217    TEST4("bgez", 3,  0xffffffff, 5,  6);
218    TEST4("bgez", 4,  0xfffffffe, 6,  7);
219    TEST4("bgez", 5,  0xffffffff, 7,  8);
220    TEST4("bgez", 6,  0x5,        8,  9);
221    TEST4("bgez", 7,  -3,         9,  10);
222    TEST4("bgez", 8,  125,        10, 11);
223    TEST4("bgez", 9,  0x80000000, 11, 12);
224    TEST4("bgez", 10, 0xffffffff, 12, 13);
225    TEST4("bgez", 11, 0x256,      13, 14);
226    TEST4("bgez", 12, 0x55,       14, 15);
227    TEST4("bgez", 13, 0xfff,      15, 16);
228    TEST4("bgez", 14, -1,         16, 17);
229    TEST4("bgez", 15, -1,         17, 18);
230 
231    printf("--- BGEZAL ---  if RSval >= 0 then " \
232           "out = RDval + 1 else out = RDval + 6\n");
233    TEST5("bgezal", 0,  0,          2,  3);
234    TEST5("bgezal", 1,  1,          3,  4);
235    TEST5("bgezal", 2,  0xffffffff, 4,  5);
236    TEST5("bgezal", 3,  0xffffffff, 5,  6);
237    TEST5("bgezal", 4,  0xfffffffe, 6,  7);
238    TEST5("bgezal", 5,  0xffffffff, 7,  8);
239    TEST5("bgezal", 6,  0x5,        8,  9);
240    TEST5("bgezal", 7,  -3,         9,  10);
241    TEST5("bgezal", 8,  125,        10, 11);
242    TEST5("bgezal", 9,  0x80000000, 11, 12);
243    TEST5("bgezal", 10, 0xffffffff, 12, 13);
244    TEST5("bgezal", 11, 0x256,      13, 14);
245    TEST5("bgezal", 12, 0x55,       14, 15);
246    TEST5("bgezal", 13, 0xfff,      15, 16);
247    TEST5("bgezal", 14, -1,         16, 17);
248    TEST5("bgezal", 15, -1,         17, 18);
249 
250    printf("--- BGTZ ---  if RSval > 0 then " \
251           "out = RDval + 1 else out = RDval + 9\n");
252    TEST4("bgtz", 0,  0,          2,  3);
253    TEST4("bgtz", 1,  1,          3,  4);
254    TEST4("bgtz", 2,  0xffffffff, 4,  5);
255    TEST4("bgtz", 3,  0xffffffff, 5,  6);
256    TEST4("bgtz", 4,  0xfffffffe, 6,  7);
257    TEST4("bgtz", 5,  0xffffffff, 7,  8);
258    TEST4("bgtz", 6,  0x5,        8,  9);
259    TEST4("bgtz", 7,  -3,         9,  10);
260    TEST4("bgtz", 8,  125,        10, 11);
261    TEST4("bgtz", 9,  0x80000000, 11, 12);
262    TEST4("bgtz", 10, 0xffffffff, 12, 13);
263    TEST4("bgtz", 11, 0x256,      13, 14);
264    TEST4("bgtz", 12, 0x55,       14, 15);
265    TEST4("bgtz", 13, 0xfff,      15, 16);
266    TEST4("bgtz", 14, -1,         16, 17);
267    TEST4("bgtz", 15, -1,         17, 18);
268 
269    printf("--- BLEZ ---  if RSval <= 0 then " \
270           "out = RDval + 1 else out = RDval + 9\n");
271    TEST4("blez", 0,  0,          2,  3);
272    TEST4("blez", 1,  1,          3,  4);
273    TEST4("blez", 2,  0xffffffff, 4,  5);
274    TEST4("blez", 3,  0xffffffff, 5,  6);
275    TEST4("blez", 4,  0xfffffffe, 6,  7);
276    TEST4("blez", 5,  0xffffffff, 7,  8);
277    TEST4("blez", 6,  0x5,        8,  9);
278    TEST4("blez", 7,  -3,         9,  10);
279    TEST4("blez", 8,  125,        10, 11);
280    TEST4("blez", 9,  0x80000000, 11, 12);
281    TEST4("blez", 10, 0xffffffff, 12, 13);
282    TEST4("blez", 11, 0x256,      13, 14);
283    TEST4("blez", 12, 0x55,       14, 15);
284    TEST4("blez", 13, 0xfff,      15, 16);
285    TEST4("blez", 14, -1,         16, 17);
286    TEST4("blez", 15, -1,         17, 18);
287 
288    printf("--- BLTZ ---  if RSval < 0 then " \
289           "out = RDval + 1 else out = RDval + 9\n");
290    TEST4("bltz", 0,  0,          2,  3);
291    TEST4("bltz", 1,  1,          3,  4);
292    TEST4("bltz", 2,  0xffffffff, 4,  5);
293    TEST4("bltz", 3,  0xffffffff, 5,  6);
294    TEST4("bltz", 4,  0xfffffffe, 6,  7);
295    TEST4("bltz", 5,  0xffffffff, 7,  8);
296    TEST4("bltz", 6,  0x5,        8,  9);
297    TEST4("bltz", 7,  -3,         9,  10);
298    TEST4("bltz", 8,  125,        10, 11);
299    TEST4("bltz", 9,  0x80000000, 11, 12);
300    TEST4("bltz", 10, 0xffffffff, 12, 13);
301    TEST4("bltz", 11, 0x256,      13, 14);
302    TEST4("bltz", 12, 0x55,       14, 15);
303    TEST4("bltz", 13, 0xfff,      15, 16);
304    TEST4("bltz", 14, -1,         16, 17);
305    TEST4("bltz", 15, -1,         17, 18);
306 
307    printf("--- BLTZAL ---  if RSval < 0 then " \
308           "out = RDval + 1 else out = RDval + 6\n");
309    TEST5("bltzal", 0, 0,           2,  3);
310    TEST5("bltzal", 1, 1,           3,  4);
311    TEST5("bltzal", 2, 0xffffffff,  4,  5);
312    TEST5("bltzal", 3, 0xffffffff,  5,  6);
313    TEST5("bltzal", 4, 0xfffffffe,  6,  7);
314    TEST5("bltzal", 5, 0xffffffff,  7,  8);
315    TEST5("bltzal", 6, 0x5,         8,  9);
316    TEST5("bltzal", 7, -3,          9,  10);
317    TEST5("bltzal", 8, 125,         10, 11);
318    TEST5("bltzal", 9, 0x80000000,  11, 12);
319    TEST5("bltzal", 10, 0xffffffff, 12, 13);
320    TEST5("bltzal", 11, 0x256,      13, 14);
321    TEST5("bltzal", 12, 0x55,       14, 15);
322    TEST5("bltzal", 13, 0xfff,      15, 16);
323    TEST5("bltzal", 14, -1,         16, 17);
324    TEST5("bltzal", 15, -1,         17, 18);
325 
326    printf("--- BNE ---  if RSval != RTval then " \
327           "out = RDval + 1 else out = RDval + 6\n");
328    TEST3("bne", 0,  0,          1,          2,  3,  4);
329    TEST3("bne", 1,  1,          1,          3,  4,  5);
330    TEST3("bne", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
331    TEST3("bne", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
332    TEST3("bne", 4,  0xfffffffe, 0xffffffff, 6,  7,  8);
333    TEST3("bne", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
334    TEST3("bne", 6,  0x5,        0x5,        8,  9,  10);
335    TEST3("bne", 7,  -3,         -4,         9,  10, 11);
336    TEST3("bne", 8,  125,        125,        10, 11, 12);
337    TEST3("bne", 9,  0x80000000, 0x80000000, 11, 12, 15);
338    TEST3("bne", 10, 0xffffffff, 0x80000000, 12, 13, 14);
339    TEST3("bne", 11, 0x256,      0x256,      13, 14, 15);
340    TEST3("bne", 12, 0x55,       0x55,       14, 15, 16);
341    TEST3("bne", 13, 0xfff,      0xdd,       15, 16, 17);
342    TEST3("bne", 14, -1,         0x5,        16, 17, 18);
343    TEST3("bne", 15, -1,         -1,         17, 18, 19);
344 
345    printf("JAL, JR \n");
346    for (i = 0; i < N; i++)
347       TEST2a(reg_val1[i], t0);
348 
349    printf("J, JALR \n");
350    for (i = 0; i < N; i++)
351       TEST2b(reg_val1[i], t1);
352 #endif
353    return 0;
354 }
355