FreeBSD: add file descriptor tracking for _umtx_op
[valgrind.git] / none / tests / mips64 / branch_and_jump_instructions.c
blob96da64827bb59298ceb0810380a098ce112a716d
1 #include <stdio.h>
2 #include "const.h"
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); \
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); \
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); \
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); \
108 #define TEST3(instruction, RDval, RSval, RTval, RD, RS, RT) \
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); \
131 #define TEST4(instruction, RDval, RSval, RD, RS) \
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); \
153 #define TEST5(instruction, RDval, RSval, RD, RS) \
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); \
179 int main()
181 int i;
182 init_reg_val2();
183 #if (__mips_isa_rev < 6)
185 printf("B \n");
186 for (i = 0; i < N; i++)
187 TEST1(reg_val1[i], t0);
189 printf("BAL \n");
190 for (i = 0; i < N; i++)
191 TEST2(reg_val1[i], t0);
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);
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);
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);
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);
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);
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);
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);
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);
345 printf("JAL, JR \n");
346 for (i = 0; i < N; i++)
347 TEST2a(reg_val1[i], t0);
349 printf("J, JALR \n");
350 for (i = 0; i < N; i++)
351 TEST2b(reg_val1[i], t1);
352 #endif
353 return 0;