From: Uros Bizjak Date: Sun, 3 Feb 2019 16:21:06 +0000 (+0100) Subject: re PR fortran/88678 (Many gfortran.dg/ieee/ieee_X.f90 test cases fail starting with... X-Git-Tag: releases/gcc-7.5.0~617 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd8d35ec8a947885a7c8aeeedafa053278ac7656;p=thirdparty%2Fgcc.git re PR fortran/88678 (Many gfortran.dg/ieee/ieee_X.f90 test cases fail starting with r267465) 2019-02-03 Uroš Bizjak PR libfortran/88678 Revert: 2016-11-16 Szabolcs Nagy PR libfortran/78314 * config/fpu-glibc.h (support_fpu_trap): Use feenableexcept. 2019-02-03 Uroš Bizjak PR libfortran/88678 * config/fpu-glibc.h (set_fpu_trap_exceptions): Clear stalled exception flags before changing trap mode. Optimize to call feenableexcept and fedisableexcept only once. From-SVN: r268493 --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index b8b75e155f14..219b1ffd89ad 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,10 +1,26 @@ +2019-02-03 UroÅ¡ Bizjak + + PR libfortran/88678 + Revert: + 2016-11-16 Szabolcs Nagy + + PR libfortran/78314 + * config/fpu-glibc.h (support_fpu_trap): Use feenableexcept. + +2019-02-03 UroÅ¡ Bizjak + + PR libfortran/88678 + * config/fpu-glibc.h (set_fpu_trap_exceptions): Clear stalled + exception flags before changing trap mode. Optimize to call + feenableexcept and fedisableexcept only once. + 2019-01-13 Jerry DeLisle PR libfortran/88776 * io/list_read.c (namelist_read): Use nml_err_ret path on read error not based on stdin_unit. * io/open.c (newunit): Free format buffer if the unit specified is for - stdin, stdout, or stderr. + stdin, stdout, or stderr. 2018-12-06 Janne Blomqvist diff --git a/libgfortran/config/fpu-glibc.h b/libgfortran/config/fpu-glibc.h index a00a153be79c..2f076be6587e 100644 --- a/libgfortran/config/fpu-glibc.h +++ b/libgfortran/config/fpu-glibc.h @@ -39,48 +39,56 @@ _Static_assert (sizeof(fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE, void set_fpu_trap_exceptions (int trap, int notrap) { + int mode_set = 0, mode_clr = 0; + #ifdef FE_INVALID if (trap & GFC_FPE_INVALID) - feenableexcept (FE_INVALID); + mode_set |= FE_INVALID; if (notrap & GFC_FPE_INVALID) - fedisableexcept (FE_INVALID); + mode_clr |= FE_INVALID; #endif /* Some glibc targets (like alpha) have FE_DENORMAL, but not many. */ #ifdef FE_DENORMAL if (trap & GFC_FPE_DENORMAL) - feenableexcept (FE_DENORMAL); + mode_set |= FE_DENORMAL; if (notrap & GFC_FPE_DENORMAL) - fedisableexcept (FE_DENORMAL); + mode_clr |= FE_DENORMAL; #endif #ifdef FE_DIVBYZERO if (trap & GFC_FPE_ZERO) - feenableexcept (FE_DIVBYZERO); + mode_set |= FE_DIVBYZERO; if (notrap & GFC_FPE_ZERO) - fedisableexcept (FE_DIVBYZERO); + mode_clr |= FE_DIVBYZERO; #endif #ifdef FE_OVERFLOW if (trap & GFC_FPE_OVERFLOW) - feenableexcept (FE_OVERFLOW); + mode_set |= FE_OVERFLOW; if (notrap & GFC_FPE_OVERFLOW) - fedisableexcept (FE_OVERFLOW); + mode_clr |= FE_OVERFLOW; #endif #ifdef FE_UNDERFLOW if (trap & GFC_FPE_UNDERFLOW) - feenableexcept (FE_UNDERFLOW); + mode_set |= FE_UNDERFLOW; if (notrap & GFC_FPE_UNDERFLOW) - fedisableexcept (FE_UNDERFLOW); + mode_clr |= FE_UNDERFLOW; #endif #ifdef FE_INEXACT if (trap & GFC_FPE_INEXACT) - feenableexcept (FE_INEXACT); + mode_set |= FE_INEXACT; if (notrap & GFC_FPE_INEXACT) - fedisableexcept (FE_INEXACT); + mode_clr |= FE_INEXACT; #endif + + /* Clear stalled exception flags. */ + feclearexcept (FE_ALL_EXCEPT); + + feenableexcept (mode_set); + fedisableexcept (mode_clr); } @@ -121,41 +129,7 @@ get_fpu_trap_exceptions (void) int support_fpu_trap (int 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; + return support_fpu_flag (flag); }