diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/powerpc/float128-hw11.c')
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/float128-hw11.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-hw11.c b/gcc/testsuite/gcc.target/powerpc/float128-hw11.c new file mode 100644 index 00000000000..7bd9b81427a --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/float128-hw11.c @@ -0,0 +1,58 @@ +/* { dg-do run { target { powerpc*-*-* && lp64 } } } */ +/* { dg-require-effective-target p9vector_hw } */ +/* { dg-options "-mpower9-vector -O2" } */ + +#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1 +#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 + +#include <math.h> +#include <stdlib.h> +#include <stddef.h> + +extern _Float128 roundf128 (_Float128); +extern _Float128 floorf128 (_Float128); +extern _Float128 ceilf128 (_Float128); +extern _Float128 truncf128 (_Float128); + +static const struct { + _Float128 value; + _Float128 exp_round; + _Float128 exp_floor; + _Float128 exp_ceil; + _Float128 exp_trunc; +} a[] = { + { -2.0Q, -2.0Q, -2.0Q, -2.0Q, -2.0Q }, + { -1.7Q, -2.0Q, -2.0Q, -1.0Q, -1.0Q }, + { -1.5Q, -2.0Q, -2.0Q, -1.0Q, -1.0Q }, + { -1.3Q, -1.0Q, -2.0Q, -1.0Q, -1.0Q }, + { +0.0Q, +0.0Q, +0.0Q, +0.0Q, +0.0Q }, + { +1.3Q, +1.0Q, +1.0Q, +2.0Q, +1.0Q }, + { +1.5Q, +2.0Q, +1.0Q, +2.0Q, +1.0Q }, + { +1.7Q, +2.0Q, +1.0Q, +2.0Q, +1.0Q }, + { +2.0Q, +2.0Q, +2.0Q, +2.0Q, +2.0Q } +}; + +int +main (void) +{ + size_t i; + _Float128 v; + + for (i = 0; i < sizeof (a) / sizeof (a[0]); i++) + { + v = a[i].value; + if (roundf128 (v) != a[i].exp_round) + abort (); + + if (floorf128 (v) != a[i].exp_floor) + abort (); + + if (ceilf128 (v) != a[i].exp_ceil) + abort (); + + if (truncf128 (v) != a[i].exp_trunc) + abort (); + } + + return 0; +} |