| /* { dg-do run } */ |
| /* { dg-options "-O3 -fwrapv" } */ |
| /* Make sure vectorized absolute difference behaves same as scalar version. */ |
| |
| #define N 16 |
| signed char a[] = {-100, -100, -100, -100,-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100 }; |
| signed char b[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; |
| |
| signed char out[N]; |
| |
| __attribute__ ((noinline,noipa)) |
| void |
| foo (void) |
| { |
| for (int i = 0; i < N; i++) |
| { |
| signed char diff = b[i] - a[i]; |
| out[i] = diff > 0 ? diff : -diff; |
| } |
| } |
| |
| signed char out2[N]; |
| |
| __attribute__ ((noinline,noipa)) |
| void |
| foo_scalar (void) |
| { |
| for (int i = 0; i < N; i++) |
| { |
| asm volatile (""); |
| signed char diff = b[i] - a[i]; |
| out2[i] = diff > 0 ? diff : -diff; |
| } |
| } |
| |
| int |
| main (void) |
| { |
| foo (); |
| foo_scalar (); |
| for (int i = 0; i < N; i++) |
| if (out[i] != out2[i]) |
| __builtin_abort (); |
| |
| return 0; |
| } |
| |