diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2014-02-07 10:14:24 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2014-02-07 10:14:24 +0000 |
commit | ce245ec69e750d05637be21b59f5013da98f1602 (patch) | |
tree | bd57e14f45de42cc9484512765bf1e00c671e867 /gcc | |
parent | 32cab212f2dd2f17c80c2894e6d9095912db02cc (diff) | |
download | gcc-ce245ec69e750d05637be21b59f5013da98f1602.zip gcc-ce245ec69e750d05637be21b59f5013da98f1602.tar.gz gcc-ce245ec69e750d05637be21b59f5013da98f1602.tar.bz2 |
_fixdfdi.c: Throw invalid exception if number cannot be represented.
2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/32/_fixdfdi.c: Throw invalid exception if number
cannot be represented.
* config/s390/32/_fixsfdi.c: Likewise.
* config/s390/32/_fixtfdi.c: Likewise.
* config/s390/32/_fixunsdfdi.c: Likewise.
* config/s390/32/_fixunssfdi.c: Likewise.
* config/s390/32/_fixunstfdi.c: Likewise.
2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* gcc.target/s390/fp2int1.c: New testcase.
From-SVN: r207596
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/fp2int1.c | 95 |
2 files changed, 99 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a75accc..1a5a636 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * gcc.target/s390/fp2int1.c: New testcase. + 2014-02-07 Richard Biener <rguenther@suse.de> PR middle-end/60092 diff --git a/gcc/testsuite/gcc.target/s390/fp2int1.c b/gcc/testsuite/gcc.target/s390/fp2int1.c new file mode 100644 index 0000000..4a90a8b --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/fp2int1.c @@ -0,0 +1,95 @@ +/* Test for the 32 bit fp to 64 bit int conversion routines. + + On S/390 32 bit we use our own implementations in order to be IEEE + complaint as we are with our machine instructions. These missed to + throw FE_INVALID exceptions in a bunch of cases. */ + +/* { dg-do run { target s390-*-* } } */ +/* { dg-options "-O3 -mesa" } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define _GNU_SOURCE +#include <stdlib.h> +#include <stdio.h> +#include <fenv.h> + +#define INFINITYf (__builtin_inff()) +#define INFINITY (__builtin_inf()) +#define INFINITYl (__builtin_infl()) +#define NANf (__builtin_nanf ("")) +#define NAN (__builtin_nan ("")) +#define NANl (__builtin_nanl ("")) + +#define TESTEXCEPT_FUNC(FUNC, TYPE_FROM, TYPE_TO) \ + TYPE_TO \ + __attribute__((noinline)) FUNC (TYPE_FROM a) \ + { \ + asm volatile ("" : : "f" (a)); \ + return (TYPE_TO)a; \ + } + +#define TESTEXCEPT(FUNC, EXCEPT, EXPECT, VALUE, TYPE_TO) \ + { \ + TYPE_TO b; \ + feclearexcept (FE_ALL_EXCEPT); \ + b = FUNC (VALUE); \ + if ((fetestexcept (EXCEPT) & (EXCEPT)) != EXPECT) \ + { \ + printf ("FAIL in line: %d\n", __LINE__); \ + abort (); \ + } \ + } + +#define TESTEXCEPT_FUNC_ALLFLOATS(FUNC, TYPE_TO) \ + TESTEXCEPT_FUNC (FUNC##_f, float, TYPE_TO); \ + TESTEXCEPT_FUNC (FUNC##_d, double, TYPE_TO); \ + TESTEXCEPT_FUNC (FUNC##_l, long double, TYPE_TO); \ + +#define TESTEXCEPT_ALLFLOATS(FUNC, EXCEPT, EXPECT, VALUE, TYPE_TO) \ + TESTEXCEPT (FUNC##_f, EXCEPT, EXPECT, VALUE##f, TYPE_TO); \ + TESTEXCEPT (FUNC##_d, EXCEPT, EXPECT, VALUE, TYPE_TO); \ + TESTEXCEPT (FUNC##_l, EXCEPT, EXPECT, VALUE##l, TYPE_TO); \ + +TESTEXCEPT_FUNC_ALLFLOATS (a, unsigned long long); +TESTEXCEPT_FUNC_ALLFLOATS (u, long long); + + +int +main () +{ + /* Prevent getting signals. */ + fedisableexcept (FE_INVALID); + + /* To unsigned long long */ + + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, INFINITY, unsigned long long); + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, -INFINITY, unsigned long long); + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, NAN, unsigned long long); + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, -NAN, unsigned long long); + + /* Negative values >-1.0 must not cause FE_INVALID. */ + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, 0, -0x0.ffffffp0, unsigned long long); + /* -1.0 instead must. */ + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, -0x1.0p+0, unsigned long long); + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, 0, 0x1.0p+63, unsigned long long); + TESTEXCEPT_ALLFLOATS (a, FE_INVALID, FE_INVALID, 0x1.0p+64, unsigned long long); + + /* To signed long long */ + + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, INFINITY, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, -INFINITY, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, NAN, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, -NAN, long long); + + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, 0, -0x1.0p+63, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, -0x1.1p+63, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, 0, 0x0.fffffp+63, long long); + TESTEXCEPT_ALLFLOATS (u, FE_INVALID, FE_INVALID, 0x1.0p+63, long long); + + /* If there are additional bits which would not make it into the + integer value no exception is supposed to occur. */ + TESTEXCEPT (u_l, FE_INVALID, 0, -0x1.000000000000000123p+63l, long long); + TESTEXCEPT (u_l, FE_INVALID, FE_INVALID, -0x1.000000000000000223p+63l, long long); + + return 0; +} |