diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2016-11-16 17:27:04 +0000 |
---|---|---|
committer | Szabolcs Nagy <nsz@gcc.gnu.org> | 2016-11-16 17:27:04 +0000 |
commit | 0af30954688a9dc1fccdc7579807cb1f46b6ebd6 (patch) | |
tree | aea10529cc9a78a64ef9fc70e98fc3f892d3e7ba /libgfortran | |
parent | e38f65725b06aaf41ad62f023c26cfe8b99bb640 (diff) | |
download | gcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.zip gcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.tar.gz gcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.tar.bz2 |
[PR libgfortran/78314] Fix ieee_support_halting
ieee_support_halting only checked the availability of status
flags, not trapping support. On some targets the later can
only be checked at runtime: feenableexcept reports if
enabling traps failed.
So check trapping support by enabling/disabling it.
Updated the test that enabled trapping to check if it is
supported.
gcc/testsuite/
PR libgfortran/78314
* gfortran.dg/ieee/ieee_6.f90: Use ieee_support_halting.
libgfortran/
PR libgfortran/78314
* config/fpu-glibc.h (support_fpu_trap): Use feenableexcept.
From-SVN: r242505
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 5 | ||||
-rw-r--r-- | libgfortran/config/fpu-glibc.h | 36 |
2 files changed, 40 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 50305af..15fe663 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2016-11-16 Szabolcs Nagy <szabolcs.nagy@arm.com> + + PR libgfortran/78314 + * config/fpu-glibc.h (support_fpu_trap): Use feenableexcept. + 2016-11-15 Jerry DeLisle <jvdelisle@gcc.gnu.org> Thomas Koenig <tkoenig@gcc.gnu.org> diff --git a/libgfortran/config/fpu-glibc.h b/libgfortran/config/fpu-glibc.h index 6e505da..8b29a76 100644 --- a/libgfortran/config/fpu-glibc.h +++ b/libgfortran/config/fpu-glibc.h @@ -121,7 +121,41 @@ get_fpu_trap_exceptions (void) int support_fpu_trap (int flag) { - return support_fpu_flag (flag); + int exceptions = 0; + int old; + + if (!support_fpu_flag (flag)) + return 0; + +#ifdef FE_INVALID + if (flag & GFC_FPE_INVALID) exceptions |= FE_INVALID; +#endif + +#ifdef FE_DIVBYZERO + if (flag & GFC_FPE_ZERO) exceptions |= FE_DIVBYZERO; +#endif + +#ifdef FE_OVERFLOW + if (flag & GFC_FPE_OVERFLOW) exceptions |= FE_OVERFLOW; +#endif + +#ifdef FE_UNDERFLOW + if (flag & GFC_FPE_UNDERFLOW) exceptions |= FE_UNDERFLOW; +#endif + +#ifdef FE_DENORMAL + if (flag & GFC_FPE_DENORMAL) exceptions |= FE_DENORMAL; +#endif + +#ifdef FE_INEXACT + if (flag & GFC_FPE_INEXACT) exceptions |= FE_INEXACT; +#endif + + old = feenableexcept (exceptions); + if (old == -1) + return 0; + fedisableexcept (exceptions & ~old); + return 1; } |