| /* { dg-require-effective-target vect_int } */ |
| /* { dg-require-effective-target vect_shift } */ |
| /* { dg-require-effective-target vect_pack_trunc } */ |
| /* { dg-require-effective-target vect_unpack } */ |
| |
| #include "tree-vect.h" |
| |
| /* Deliberate use of signed >>. */ |
| #define DEF_LOOP(SIGNEDNESS) \ |
| void __attribute__ ((noipa)) \ |
| f_##SIGNEDNESS (SIGNEDNESS char *restrict a, \ |
| SIGNEDNESS char *restrict b, \ |
| SIGNEDNESS char c) \ |
| { \ |
| a[0] = (b[0] + c) >> 1; \ |
| a[1] = (b[1] + c) >> 1; \ |
| a[2] = (b[2] + c) >> 1; \ |
| a[3] = (b[3] + c) >> 1; \ |
| a[4] = (b[4] + c) >> 1; \ |
| a[5] = (b[5] + c) >> 1; \ |
| a[6] = (b[6] + c) >> 1; \ |
| a[7] = (b[7] + c) >> 1; \ |
| a[8] = (b[8] + c) >> 1; \ |
| a[9] = (b[9] + c) >> 1; \ |
| a[10] = (b[10] + c) >> 1; \ |
| a[11] = (b[11] + c) >> 1; \ |
| a[12] = (b[12] + c) >> 1; \ |
| a[13] = (b[13] + c) >> 1; \ |
| a[14] = (b[14] + c) >> 1; \ |
| a[15] = (b[15] + c) >> 1; \ |
| } |
| |
| DEF_LOOP (signed) |
| DEF_LOOP (unsigned) |
| |
| #define N 16 |
| |
| #define TEST_LOOP(SIGNEDNESS, BASE_B, C) \ |
| { \ |
| SIGNEDNESS char a[N], b[N], c[N]; \ |
| for (int i = 0; i < N; ++i) \ |
| { \ |
| b[i] = BASE_B + i * 15; \ |
| asm volatile ("" ::: "memory"); \ |
| } \ |
| f_##SIGNEDNESS (a, b, C); \ |
| for (int i = 0; i < N; ++i) \ |
| if (a[i] != (BASE_B + C + i * 15) >> 1) \ |
| __builtin_abort (); \ |
| } |
| |
| int |
| main (void) |
| { |
| check_vect (); |
| |
| TEST_LOOP (signed, -128, -120); |
| TEST_LOOP (unsigned, 4, 250); |
| |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump "demoting int to signed short" "slp2" { target { ! vect_widen_shift } } } } */ |
| /* { dg-final { scan-tree-dump "demoting int to unsigned short" "slp2" { target { ! vect_widen_shift } } } } */ |
| /* { dg-final { scan-tree-dump {\.AVG_FLOOR} "slp2" { target vect_avg_qi } } } */ |
| /* { dg-final { scan-tree-dump-times "optimized: basic block" 2 "slp2" { target vect_hw_misalign } } } */ |