summary refs log tree commit diff
path: root/sysdeps/s390/fpu/fsetexcptflg.c
diff options
context:
space:
mode:
authorStefan Liebler <stli@linux.ibm.com>2019-12-11 15:09:32 +0100
committerStefan Liebler <stli@linux.ibm.com>2019-12-11 15:12:25 +0100
commit238adf59db85646ebae47876819bd896dae597bc (patch)
treebc11e42ee2928d1549b9dfd405fbaee17c9cabfd /sysdeps/s390/fpu/fsetexcptflg.c
parent7c94d036c17dfd352d11e9bf98e5d84122c1f95e (diff)
downloadglibc-238adf59db85646ebae47876819bd896dae597bc.tar.gz
glibc-238adf59db85646ebae47876819bd896dae597bc.tar.xz
glibc-238adf59db85646ebae47876819bd896dae597bc.zip
S390: Use libc_fe* macros in fe* functions.
This patch updates the s390 specific functions fegetround,
fesetround, feholdexcept, fesetenv, feupdateenv, fegetexceptflag,
fetestexcept, fesetexceptflag, fetestexceptflag.
Now those functions are using the libc_fe* macros if possible.

Furthermore fegetexceptflag is now returning the exception from
dxc field shifted to the usual exception-flags.
Thus a special fetestexceptflag implementation is not needed anymore.
Diffstat (limited to 'sysdeps/s390/fpu/fsetexcptflg.c')
-rw-r--r--sysdeps/s390/fpu/fsetexcptflg.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/sysdeps/s390/fpu/fsetexcptflg.c b/sysdeps/s390/fpu/fsetexcptflg.c
index b3e4bbf878..0b9517ef59 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;