| /* { dg-require-effective-target vect_float } */ |
| |
| #include "tree-vect.h" |
| |
| extern void abort (void); |
| |
| #define OP * |
| #define INIT 1.0 |
| |
| float __attribute__((noinline,noclone)) |
| foo (float *__restrict__ i) |
| { |
| float l = INIT; |
| int a; |
| int b; |
| |
| for (a = 0; a < 4; a++) |
| for (b = 0; b < 4; b++) |
| l = l OP i[b]; |
| |
| return l; |
| } |
| |
| float __attribute__((noinline,noclone)) |
| foo_ref (float *__restrict__ i) |
| { |
| float l = INIT; |
| |
| l = l OP i[0]; |
| l = l OP i[1]; |
| l = l OP i[2]; |
| l = l OP i[3]; |
| |
| l = l OP i[0]; |
| l = l OP i[1]; |
| l = l OP i[2]; |
| l = l OP i[3]; |
| |
| l = l OP i[0]; |
| l = l OP i[1]; |
| l = l OP i[2]; |
| l = l OP i[3]; |
| |
| l = l OP i[0]; |
| l = l OP i[1]; |
| l = l OP i[2]; |
| l = l OP i[3]; |
| |
| return l; |
| } |
| |
| union u |
| { |
| float f; |
| unsigned int u; |
| }; |
| |
| int |
| main (void) |
| { |
| union u res, res2; |
| float a[4]; |
| |
| if (sizeof (float) != sizeof (unsigned int)) |
| return 0; |
| |
| check_vect (); |
| |
| a[0] = 0.01; |
| a[1] = 0.01; |
| a[2] = 0.01; |
| a[3] = 1.0; |
| |
| res.f = foo_ref (a); |
| |
| res2.f = foo (a); |
| |
| if (res.u != res2.u) |
| abort (); |
| |
| return 0; |
| } |
| |
| /* need -ffast-math to vectorize this loop. */ |
| /* ARM NEON passes -ffast-math to these tests, so expect this to fail. */ |
| /* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" { xfail arm_neon_ok } } } */ |