diff options
Diffstat (limited to 'sysdeps/s390/fpu/fsetexcptflg.c')
-rw-r--r-- | sysdeps/s390/fpu/fsetexcptflg.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/sysdeps/s390/fpu/fsetexcptflg.c b/sysdeps/s390/fpu/fsetexcptflg.c index b3e4bbf..0b9517e 100644 --- a/sysdeps/s390/fpu/fsetexcptflg.c +++ b/sysdeps/s390/fpu/fsetexcptflg.c @@ -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; |