diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.target/aarch64/vect-fmax-fmin.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gcc.target/aarch64/vect-fmax-fmin.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/aarch64/vect-fmax-fmin.c b/gcc-4.9/gcc/testsuite/gcc.target/aarch64/vect-fmax-fmin.c new file mode 100644 index 000000000..42600b739 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.target/aarch64/vect-fmax-fmin.c @@ -0,0 +1,105 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -ffast-math" } */ + +extern void abort (void); + +#include "vect-fmax-fmin.x" + +#include "vect-fmaxv-fminv.x" + +#define DEFN_SETV(type) \ + set_vector_##type (pR##type a, type n) \ + { \ + int i; \ + for (i=0; i<16; i++) \ + a[i] = n; \ + } + +#define DEFN_CHECKV(type) \ + void check_vector_##type (pR##type a, pR##type vec) \ + { \ + int i; \ + for (i=0; i<16; i++) \ + if (a[i] != vec[i]) \ + abort (); \ + } + +#define TEST2(fname, type) \ + set_vector_##type (c##type, 0.0); \ + fname##_##type (a##type, b##type); \ + check_vector_##type (c##type, fname##_##type##_vector); + +#define TEST3(fname, type) \ + set_vector_##type (c##type, 0.0); \ + fname##_##type (a##type, b##type, c##type); \ + check_vector_##type (c##type, fname##_##type##_vector); + +#define TEST(fname, N) \ + TEST##N (fname, F32); \ + TEST##N (fname, F64); + +typedef float F32; +typedef double F64; + +DEFN_SETV (F32) +DEFN_SETV (F64) + +DEFN_CHECKV (F32) +DEFN_CHECKV (F64) + +int main (void) +{ + + F32 aF32[16]; + F32 bF32[16]; + F32 cF32[16]; + + F64 aF64[16]; + F64 bF64[16]; + F64 cF64[16]; + int i; + + /* Golden vectors. */ + F32 max_F32_vector[] = { 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, + 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 }; + + F64 max_F64_vector[] = { 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, + 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 }; + + F32 min_F32_vector[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, + 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0 }; + + F64 min_F64_vector[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, + 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0 }; + + F32 minv_F32_value = 0.0f; + F32 maxv_F32_value = 15.0f; + + F64 minv_F64_value = 0.0; + F64 maxv_F64_value = 15.0; + + /* Setup input vectors. */ + for (i=0; i<16; i++) + { + aF32[i] = (float)(15-i); + bF32[i] = (float)i; + aF64[i] = (double)(15-i); + bF64[i] = (double)i; + } + + TEST (max, 3); + TEST (min, 3); + + /* Test across lanes ops. */ + if (maxv_f32 (max_F32_vector) != maxv_F32_value) + abort (); + if (minv_f32 (min_F32_vector) != minv_F32_value) + abort (); + + if (maxv_f64 (max_F64_vector) != maxv_F64_value) + abort (); + if (minv_f64 (min_F64_vector) != minv_F64_value) + abort (); + + return 0; +} |