1 /* Test vclz works correctly. */
3 /* { dg-options "-std=gnu99 -O3 -Wno-div-by-zero --save-temps" } */
6 extern void abort (void);
8 /* Tests in binary should look like:
34 #define TEST17 0x15555
35 #define TEST18 0x2aaaa
36 #define TEST19 0x55555
37 #define TEST20 0xaaaaa
38 #define TEST21 0x155555
39 #define TEST22 0x2aaaaa
40 #define TEST23 0x555555
41 #define TEST24 0xaaaaaa
42 #define TEST25 0x1555555
43 #define TEST26 0x2aaaaaa
44 #define TEST27 0x5555555
45 #define TEST28 0xaaaaaaa
46 #define TEST29 0x15555555
47 #define TEST30 0x2aaaaaaa
48 #define TEST31 0x55555555
49 #define TEST32 0xaaaaaaaa
51 #define INHIB_OPTIMIZATION asm volatile ("" : : : "memory")
53 #define CONCAT(a, b) a##b
54 #define CONCAT1(a, b) CONCAT (a, b)
56 #define REG_INFEX128 q_
59 #define SIGNED(x) SIGNED##x
60 #define REG_INFEX(reg_len) REG_INFEX##reg_len
61 #define POSTFIX(reg_len, data_len, is_signed) \
62 CONCAT1 (REG_INFEX (reg_len), CONCAT1 (SIGNED (is_signed), data_len))
63 #define DATA_TYPE(data_len) DATA_TYPE_##data_len
64 #define LOAD_INST(reg_len, data_len, is_signed) \
65 CONCAT1 (vld1, POSTFIX (reg_len, data_len, is_signed))
66 #define CLZ_INST(reg_len, data_len, is_signed) \
67 CONCAT1 (vclz, POSTFIX (reg_len, data_len, is_signed))
69 #define RUN_TEST(test_set, answ_set, reg_len, data_len, is_signed, n) \
71 a = LOAD_INST (reg_len, data_len, is_signed) (test_set); \
72 b = LOAD_INST (reg_len, data_len, is_signed) (answ_set); \
73 a = CLZ_INST (reg_len, data_len, is_signed) (a); \
74 for (i = 0; i < n; i++) \
85 int8_t test_set0
[8] = {
86 TEST0
, TEST1
, TEST2
, TEST3
,
87 TEST4
, TEST5
, TEST6
, TEST7
89 int8_t test_set1
[8] = {
90 TEST8
, TEST8
, TEST8
, TEST8
,
91 TEST8
, TEST8
, TEST8
, TEST8
93 int8_t answ_set0
[8] = {
97 int8_t answ_set1
[8] = {
101 RUN_TEST (test_set0
, answ_set0
, 64, 8, 1, 8);
102 RUN_TEST (test_set1
, answ_set1
, 64, 8, 1, 1);
107 /* Double scan-assembler-times to take account of unsigned functions. */
108 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 4 } } */
117 int16_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
118 int16_t test_set1
[4] = { TEST4
, TEST5
, TEST6
, TEST7
};
119 int16_t test_set2
[4] = { TEST8
, TEST9
, TEST10
, TEST11
};
120 int16_t test_set3
[4] = { TEST12
, TEST13
, TEST14
, TEST15
};
121 int16_t test_set4
[4] = { TEST16
, TEST16
, TEST16
, TEST16
};
123 int16_t answ_set0
[4] = { 16, 15, 14, 13 };
124 int16_t answ_set1
[4] = { 12, 11, 10, 9 };
125 int16_t answ_set2
[4] = { 8, 7, 6, 5 };
126 int16_t answ_set3
[4] = { 4, 3, 2, 1 };
127 int16_t answ_set4
[4] = { 0, 0, 0, 0 };
129 RUN_TEST (test_set0
, answ_set0
, 64, 16, 1, 4);
130 RUN_TEST (test_set1
, answ_set1
, 64, 16, 1, 4);
131 RUN_TEST (test_set2
, answ_set2
, 64, 16, 1, 4);
132 RUN_TEST (test_set3
, answ_set3
, 64, 16, 1, 4);
133 RUN_TEST (test_set4
, answ_set4
, 64, 16, 1, 1);
138 /* Double scan-assembler-times to take account of unsigned functions. */
139 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 10} } */
148 int32_t test_set0
[2] = { TEST0
, TEST1
};
149 int32_t test_set1
[2] = { TEST2
, TEST3
};
150 int32_t test_set2
[2] = { TEST4
, TEST5
};
151 int32_t test_set3
[2] = { TEST6
, TEST7
};
152 int32_t test_set4
[2] = { TEST8
, TEST9
};
153 int32_t test_set5
[2] = { TEST10
, TEST11
};
154 int32_t test_set6
[2] = { TEST12
, TEST13
};
155 int32_t test_set7
[2] = { TEST14
, TEST15
};
156 int32_t test_set8
[2] = { TEST16
, TEST17
};
157 int32_t test_set9
[2] = { TEST18
, TEST19
};
158 int32_t test_set10
[2] = { TEST20
, TEST21
};
159 int32_t test_set11
[2] = { TEST22
, TEST23
};
160 int32_t test_set12
[2] = { TEST24
, TEST25
};
161 int32_t test_set13
[2] = { TEST26
, TEST27
};
162 int32_t test_set14
[2] = { TEST28
, TEST29
};
163 int32_t test_set15
[2] = { TEST30
, TEST31
};
164 int32_t test_set16
[2] = { TEST32
, TEST32
};
166 int32_t answ_set0
[2] = { 32, 31 };
167 int32_t answ_set1
[2] = { 30, 29 };
168 int32_t answ_set2
[2] = { 28, 27 };
169 int32_t answ_set3
[2] = { 26, 25 };
170 int32_t answ_set4
[2] = { 24, 23 };
171 int32_t answ_set5
[2] = { 22, 21 };
172 int32_t answ_set6
[2] = { 20, 19 };
173 int32_t answ_set7
[2] = { 18, 17 };
174 int32_t answ_set8
[2] = { 16, 15 };
175 int32_t answ_set9
[2] = { 14, 13 };
176 int32_t answ_set10
[2] = { 12, 11 };
177 int32_t answ_set11
[2] = { 10, 9 };
178 int32_t answ_set12
[2] = { 8, 7 };
179 int32_t answ_set13
[2] = { 6, 5 };
180 int32_t answ_set14
[2] = { 4, 3 };
181 int32_t answ_set15
[2] = { 2, 1 };
182 int32_t answ_set16
[2] = { 0, 0 };
184 RUN_TEST (test_set0
, answ_set0
, 64, 32, 1, 2);
185 RUN_TEST (test_set1
, answ_set1
, 64, 32, 1, 2);
186 RUN_TEST (test_set2
, answ_set2
, 64, 32, 1, 2);
187 RUN_TEST (test_set3
, answ_set3
, 64, 32, 1, 2);
188 RUN_TEST (test_set4
, answ_set4
, 64, 32, 1, 2);
189 RUN_TEST (test_set5
, answ_set5
, 64, 32, 1, 2);
190 RUN_TEST (test_set6
, answ_set6
, 64, 32, 1, 2);
191 RUN_TEST (test_set7
, answ_set7
, 64, 32, 1, 2);
192 RUN_TEST (test_set8
, answ_set8
, 64, 32, 1, 2);
193 RUN_TEST (test_set9
, answ_set9
, 64, 32, 1, 2);
194 RUN_TEST (test_set10
, answ_set10
, 64, 32, 1, 2);
195 RUN_TEST (test_set11
, answ_set11
, 64, 32, 1, 2);
196 RUN_TEST (test_set12
, answ_set12
, 64, 32, 1, 2);
197 RUN_TEST (test_set13
, answ_set13
, 64, 32, 1, 2);
198 RUN_TEST (test_set14
, answ_set14
, 64, 32, 1, 2);
199 RUN_TEST (test_set15
, answ_set15
, 64, 32, 1, 2);
200 RUN_TEST (test_set16
, answ_set16
, 64, 32, 1, 1);
205 /* Double scan-assembler-times to take account of unsigned functions. */
206 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 34 } } */
215 int8_t test_set0
[16] = {
216 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, TEST6
, TEST7
,
217 TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
219 int8_t answ_set0
[16] = {
220 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0
222 RUN_TEST (test_set0
, answ_set0
, 128, 8, 1, 9);
226 /* Double scan-assembler-times to take account of unsigned functions. */
227 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 2 } } */
236 int16_t test_set0
[8] = {
237 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, TEST6
, TEST7
239 int16_t test_set1
[8] = {
240 TEST8
, TEST9
, TEST10
, TEST11
, TEST12
, TEST13
, TEST14
, TEST15
242 int16_t test_set2
[8] = {
243 TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
246 int16_t answ_set0
[8] = {
247 16, 15, 14, 13, 12, 11, 10, 9
249 int16_t answ_set1
[8] = {
250 8, 7, 6, 5, 4, 3, 2, 1
252 int16_t answ_set2
[8] = {
253 0, 0, 0, 0, 0, 0, 0, 0
255 RUN_TEST (test_set0
, answ_set0
, 128, 16, 1, 8);
256 RUN_TEST (test_set1
, answ_set1
, 128, 16, 1, 8);
257 RUN_TEST (test_set2
, answ_set2
, 128, 16, 1, 1);
262 /* Double scan-assembler-times to take account of unsigned functions. */
263 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 6 } } */
272 int32_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
273 int32_t test_set1
[4] = { TEST4
, TEST5
, TEST6
, TEST7
};
274 int32_t test_set2
[4] = { TEST8
, TEST9
, TEST10
, TEST11
};
275 int32_t test_set3
[4] = { TEST12
, TEST13
, TEST14
, TEST15
};
276 int32_t test_set4
[4] = { TEST16
, TEST17
, TEST18
, TEST19
};
277 int32_t test_set5
[4] = { TEST20
, TEST21
, TEST22
, TEST23
};
278 int32_t test_set6
[4] = { TEST24
, TEST25
, TEST26
, TEST27
};
279 int32_t test_set7
[4] = { TEST28
, TEST29
, TEST30
, TEST31
};
280 int32_t test_set8
[4] = { TEST32
, TEST32
, TEST32
, TEST32
};
282 int32_t answ_set0
[4] = { 32, 31, 30, 29 };
283 int32_t answ_set1
[4] = { 28, 27, 26, 25 };
284 int32_t answ_set2
[4] = { 24, 23, 22, 21 };
285 int32_t answ_set3
[4] = { 20, 19, 18, 17 };
286 int32_t answ_set4
[4] = { 16, 15, 14, 13 };
287 int32_t answ_set5
[4] = { 12, 11, 10, 9 };
288 int32_t answ_set6
[4] = { 8, 7, 6, 5 };
289 int32_t answ_set7
[4] = { 4, 3, 2, 1 };
290 int32_t answ_set8
[4] = { 0, 0, 0, 0 };
292 RUN_TEST (test_set0
, answ_set0
, 128, 32, 1, 4);
293 RUN_TEST (test_set1
, answ_set1
, 128, 32, 1, 4);
294 RUN_TEST (test_set2
, answ_set2
, 128, 32, 1, 4);
295 RUN_TEST (test_set3
, answ_set3
, 128, 32, 1, 4);
296 RUN_TEST (test_set4
, answ_set4
, 128, 32, 1, 1);
301 /* Double scan-assembler-times to take account of unsigned functions. */
302 /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 10 } } */
304 /* Unsigned versions. */
313 uint8_t test_set0
[8] = {
314 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, TEST6
, TEST7
316 uint8_t test_set1
[8] = {
317 TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
319 uint8_t answ_set0
[8] = {
320 8, 7, 6, 5, 4, 3, 2, 1
322 uint8_t answ_set1
[8] = {
323 0, 0, 0, 0, 0, 0, 0, 0
326 RUN_TEST (test_set0
, answ_set0
, 64, 8, 0, 8);
327 RUN_TEST (test_set1
, answ_set1
, 64, 8, 0, 1);
332 /* ASM scan near test for signed version. */
341 uint16_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
342 uint16_t test_set1
[4] = { TEST4
, TEST5
, TEST6
, TEST7
};
343 uint16_t test_set2
[4] = { TEST8
, TEST9
, TEST10
, TEST11
};
344 uint16_t test_set3
[4] = { TEST12
, TEST13
, TEST14
, TEST15
};
345 uint16_t test_set4
[4] = { TEST16
, TEST16
, TEST16
, TEST16
};
347 uint16_t answ_set0
[4] = { 16, 15, 14, 13 };
348 uint16_t answ_set1
[4] = { 12, 11, 10, 9 };
349 uint16_t answ_set2
[4] = { 8, 7, 6, 5 };
350 uint16_t answ_set3
[4] = { 4, 3, 2, 1 };
351 uint16_t answ_set4
[4] = { 0, 0, 0, 0 };
353 RUN_TEST (test_set0
, answ_set0
, 64, 16, 0, 4);
354 RUN_TEST (test_set1
, answ_set1
, 64, 16, 0, 4);
355 RUN_TEST (test_set2
, answ_set2
, 64, 16, 0, 4);
356 RUN_TEST (test_set3
, answ_set3
, 64, 16, 0, 4);
357 RUN_TEST (test_set4
, answ_set4
, 64, 16, 0, 1);
362 /* ASM scan near test for signed version. */
371 uint32_t test_set0
[2] = { TEST0
, TEST1
};
372 uint32_t test_set1
[2] = { TEST2
, TEST3
};
373 uint32_t test_set2
[2] = { TEST4
, TEST5
};
374 uint32_t test_set3
[2] = { TEST6
, TEST7
};
375 uint32_t test_set4
[2] = { TEST8
, TEST9
};
376 uint32_t test_set5
[2] = { TEST10
, TEST11
};
377 uint32_t test_set6
[2] = { TEST12
, TEST13
};
378 uint32_t test_set7
[2] = { TEST14
, TEST15
};
379 uint32_t test_set8
[2] = { TEST16
, TEST17
};
380 uint32_t test_set9
[2] = { TEST18
, TEST19
};
381 uint32_t test_set10
[2] = { TEST20
, TEST21
};
382 uint32_t test_set11
[2] = { TEST22
, TEST23
};
383 uint32_t test_set12
[2] = { TEST24
, TEST25
};
384 uint32_t test_set13
[2] = { TEST26
, TEST27
};
385 uint32_t test_set14
[2] = { TEST28
, TEST29
};
386 uint32_t test_set15
[2] = { TEST30
, TEST31
};
387 uint32_t test_set16
[2] = { TEST32
, TEST32
};
389 uint32_t answ_set0
[2] = { 32, 31 };
390 uint32_t answ_set1
[2] = { 30, 29 };
391 uint32_t answ_set2
[2] = { 28, 27 };
392 uint32_t answ_set3
[2] = { 26, 25 };
393 uint32_t answ_set4
[2] = { 24, 23 };
394 uint32_t answ_set5
[2] = { 22, 21 };
395 uint32_t answ_set6
[2] = { 20, 19 };
396 uint32_t answ_set7
[2] = { 18, 17 };
397 uint32_t answ_set8
[2] = { 16, 15 };
398 uint32_t answ_set9
[2] = { 14, 13 };
399 uint32_t answ_set10
[2] = { 12, 11 };
400 uint32_t answ_set11
[2] = { 10, 9 };
401 uint32_t answ_set12
[2] = { 8, 7 };
402 uint32_t answ_set13
[2] = { 6, 5 };
403 uint32_t answ_set14
[2] = { 4, 3 };
404 uint32_t answ_set15
[2] = { 2, 1 };
405 uint32_t answ_set16
[2] = { 0, 0 };
407 RUN_TEST (test_set0
, answ_set0
, 64, 32, 0, 2);
408 RUN_TEST (test_set1
, answ_set1
, 64, 32, 0, 2);
409 RUN_TEST (test_set2
, answ_set2
, 64, 32, 0, 2);
410 RUN_TEST (test_set3
, answ_set3
, 64, 32, 0, 2);
411 RUN_TEST (test_set4
, answ_set4
, 64, 32, 0, 2);
412 RUN_TEST (test_set5
, answ_set5
, 64, 32, 0, 2);
413 RUN_TEST (test_set6
, answ_set6
, 64, 32, 0, 2);
414 RUN_TEST (test_set7
, answ_set7
, 64, 32, 0, 2);
415 RUN_TEST (test_set8
, answ_set8
, 64, 32, 0, 2);
416 RUN_TEST (test_set9
, answ_set9
, 64, 32, 0, 2);
417 RUN_TEST (test_set10
, answ_set10
, 64, 32, 0, 2);
418 RUN_TEST (test_set11
, answ_set11
, 64, 32, 0, 2);
419 RUN_TEST (test_set12
, answ_set12
, 64, 32, 0, 2);
420 RUN_TEST (test_set13
, answ_set13
, 64, 32, 0, 2);
421 RUN_TEST (test_set14
, answ_set14
, 64, 32, 0, 2);
422 RUN_TEST (test_set15
, answ_set15
, 64, 32, 0, 2);
423 RUN_TEST (test_set16
, answ_set16
, 64, 32, 0, 1);
428 /* ASM scan near test for signed version. */
437 uint8_t test_set0
[16] = {
438 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, TEST6
, TEST7
,
439 TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
, TEST8
441 uint8_t answ_set0
[16] = {
442 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0
444 RUN_TEST (test_set0
, answ_set0
, 128, 8, 0, 9);
449 /* ASM scan near test for signed version. */
458 uint16_t test_set0
[8] = {
459 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, TEST6
, TEST7
461 uint16_t test_set1
[8] = {
462 TEST8
, TEST9
, TEST10
, TEST11
, TEST12
, TEST13
, TEST14
, TEST15
464 uint16_t test_set2
[8] = {
465 TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
, TEST16
468 uint16_t answ_set0
[8] = {
469 16, 15, 14, 13, 12, 11, 10, 9
472 uint16_t answ_set1
[8] = {
473 8, 7, 6, 5, 4, 3, 2, 1
475 uint16_t answ_set2
[8] = {
476 0, 0, 0, 0, 0, 0, 0, 0
479 RUN_TEST (test_set0
, answ_set0
, 128, 16, 0, 8);
480 RUN_TEST (test_set1
, answ_set1
, 128, 16, 0, 8);
481 RUN_TEST (test_set2
, answ_set2
, 128, 16, 0, 1);
486 /* ASM scan near test for signed version. */
495 uint32_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
496 uint32_t test_set1
[4] = { TEST4
, TEST5
, TEST6
, TEST7
};
497 uint32_t test_set2
[4] = { TEST8
, TEST9
, TEST10
, TEST11
};
498 uint32_t test_set3
[4] = { TEST12
, TEST13
, TEST14
, TEST15
};
499 uint32_t test_set4
[4] = { TEST16
, TEST17
, TEST18
, TEST19
};
500 uint32_t test_set5
[4] = { TEST20
, TEST21
, TEST22
, TEST23
};
501 uint32_t test_set6
[4] = { TEST24
, TEST25
, TEST26
, TEST27
};
502 uint32_t test_set7
[4] = { TEST28
, TEST29
, TEST30
, TEST31
};
503 uint32_t test_set8
[4] = { TEST32
, TEST32
, TEST32
, TEST32
};
505 uint32_t answ_set0
[4] = { 32, 31, 30, 29 };
506 uint32_t answ_set1
[4] = { 28, 27, 26, 25 };
507 uint32_t answ_set2
[4] = { 24, 23, 22, 21 };
508 uint32_t answ_set3
[4] = { 20, 19, 18, 17 };
509 uint32_t answ_set4
[4] = { 16, 15, 14, 13 };
510 uint32_t answ_set5
[4] = { 12, 11, 10, 9 };
511 uint32_t answ_set6
[4] = { 8, 7, 6, 5 };
512 uint32_t answ_set7
[4] = { 4, 3, 2, 1 };
513 uint32_t answ_set8
[4] = { 0, 0, 0, 0 };
515 RUN_TEST (test_set0
, answ_set0
, 128, 32, 0, 4);
516 RUN_TEST (test_set1
, answ_set1
, 128, 32, 0, 4);
517 RUN_TEST (test_set2
, answ_set2
, 128, 32, 0, 4);
518 RUN_TEST (test_set3
, answ_set3
, 128, 32, 0, 4);
519 RUN_TEST (test_set4
, answ_set4
, 128, 32, 0, 1);
524 /* ASM scan near test for signed version. */
527 main (int argc
, char **argv
)
533 if (test_vclz_s16 ())
536 if (test_vclz_s32 ())
539 if (test_vclzq_s8 ())
542 if (test_vclzq_s16 ())
545 if (test_vclzq_s32 ())
551 if (test_vclz_u16 ())
554 if (test_vclz_u32 ())
557 if (test_vclzq_u8 ())
560 if (test_vclzq_u16 ())
563 if (test_vclzq_u32 ())