diff options
Diffstat (limited to 'sysdeps/s390/fpu/fsetexcptflg.c')
-rw-r--r-- | sysdeps/s390/fpu/fsetexcptflg.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/sysdeps/s390/fpu/fsetexcptflg.c b/sysdeps/s390/fpu/fsetexcptflg.c index e50684c574..0b9517ef59 100644 --- a/sysdeps/s390/fpu/fsetexcptflg.c +++ b/sysdeps/s390/fpu/fsetexcptflg.c @@ -1,5 +1,5 @@ /* Set floating-point environment exception handling. - Copyright (C) 2000-2018 Free Software Foundation, Inc. + Copyright (C) 2000-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). @@ -15,7 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ + <https://www.gnu.org/licenses/>. */ #include <fenv_libc.h> #include <math.h> @@ -24,29 +24,26 @@ int fesetexceptflag (const fexcept_t *flagp, int excepts) { - fexcept_t temp, newexcepts; + fexcept_t fpc, fpc_new; /* Get the current environment. We have to do this since we cannot separately set the status word. */ - _FPU_GETCW (temp); - /* Install the new exception bits in the Accrued Exception Byte. */ - excepts = excepts & FE_ALL_EXCEPT; - newexcepts = excepts << FPC_FLAGS_SHIFT; - temp &= ~newexcepts; - if ((temp & FPC_NOT_FPU_EXCEPTION) == 0) + _FPU_GETCW (fpc); + + /* Clear the current exception bits. */ + fpc_new = fpc & ~((excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT); + if ((fpc & FPC_NOT_FPU_EXCEPTION) == 0) /* Bits 6, 7 of dxc-byte are zero, thus bits 0-5 of dxc-byte correspond to the flag-bits. Clear given exceptions in dxc-field. */ - temp &= ~(excepts << FPC_DXC_SHIFT); + fpc_new &= ~((excepts & FE_ALL_EXCEPT) << FPC_DXC_SHIFT); - /* Integrate dxc-byte of flagp into flags. The dxc-byte of flagp contains - either an ieee-exception or 0 (see fegetexceptflag). */ - temp |= (*flagp | ((*flagp >> FPC_DXC_SHIFT) << FPC_FLAGS_SHIFT)) - & newexcepts; + /* Set exceptions from flagp in flags-field. */ + fpc_new |= (*flagp & excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT; /* Store the new status word (along with the rest of the environment. Possibly new exceptions are set but they won't get executed. */ - _FPU_SETCW (temp); + _FPU_SETCW (fpc_new); /* Success. */ return 0; |