public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Stefan Liebler <stli@linux.ibm.com>
To: libc-alpha@sourceware.org
Cc: Stefan Liebler <stli@linux.ibm.com>
Subject: [PATCH 14/17] S390: Use libc_fe* macros in fe* functions.
Date: Mon, 04 Nov 2019 16:04:00 -0000	[thread overview]
Message-ID: <1572881244-6781-14-git-send-email-stli@linux.ibm.com> (raw)
In-Reply-To: <1572881244-6781-1-git-send-email-stli@linux.ibm.com>

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.
---
 sysdeps/s390/fpu/fegetround.c       |  9 ++-------
 sysdeps/s390/fpu/feholdexcpt.c      | 12 ++---------
 sysdeps/s390/fpu/fesetenv.c         | 21 +++----------------
 sysdeps/s390/fpu/fesetround.c       |  9 +++------
 sysdeps/s390/fpu/fetestexceptflag.c | 31 -----------------------------
 sysdeps/s390/fpu/feupdateenv.c      | 14 +++----------
 sysdeps/s390/fpu/fgetexcptflg.c     | 16 ++-------------
 sysdeps/s390/fpu/fsetexcptflg.c     | 23 ++++++++++-----------
 sysdeps/s390/fpu/ftestexcept.c      | 16 ++-------------
 9 files changed, 27 insertions(+), 124 deletions(-)
 delete mode 100644 sysdeps/s390/fpu/fetestexceptflag.c

diff --git a/sysdeps/s390/fpu/fegetround.c b/sysdeps/s390/fpu/fegetround.c
index 8e61605bad..847b5d2de5 100644
--- a/sysdeps/s390/fpu/fegetround.c
+++ b/sysdeps/s390/fpu/fegetround.c
@@ -17,17 +17,12 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <get-rounding-mode.h>
 
 int
 __fegetround (void)
 {
-  fexcept_t cw;
-
-  _FPU_GETCW (cw);
-
-  return cw & FPC_RM_MASK;
+  return get_rounding_mode ();
 }
 libm_hidden_def (__fegetround)
 weak_alias (__fegetround, fegetround)
diff --git a/sysdeps/s390/fpu/feholdexcpt.c b/sysdeps/s390/fpu/feholdexcpt.c
index 8ad7d530bd..e2eb5d2a77 100644
--- a/sysdeps/s390/fpu/feholdexcpt.c
+++ b/sysdeps/s390/fpu/feholdexcpt.c
@@ -17,19 +17,11 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <fenv_private.h>
 
 int __feholdexcept (fenv_t *envp)
 {
-  fexcept_t fpc;
-  /* Store the environment.  */
-  __fegetenv (envp);
-  /* Clear the current sticky bits as more than one exception
-     may be generated.  */
-  fpc = envp->__fpc & ~(FPC_FLAGS_MASK | FPC_DXC_MASK);
-  /* Hold from generating fpu exceptions temporarily.  */
-  _FPU_SETCW ((fpc & ~(FE_ALL_EXCEPT << FPC_EXCEPTION_MASK_SHIFT)));
+  libc_feholdexcept_s390 (envp);
   return 0;
 }
 libm_hidden_def (__feholdexcept)
diff --git a/sysdeps/s390/fpu/fesetenv.c b/sysdeps/s390/fpu/fesetenv.c
index ede3d89b3b..dca26033a7 100644
--- a/sysdeps/s390/fpu/fesetenv.c
+++ b/sysdeps/s390/fpu/fesetenv.c
@@ -17,28 +17,13 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
-#include <stddef.h>
-#include <unistd.h>
+#include <fenv_private.h>
 
 int
 __fesetenv (const fenv_t *envp)
 {
-  fenv_t env;
-
-  if (envp == FE_DFL_ENV)
-    {
-      env.__fpc = _FPU_DEFAULT;
-    }
-  else if (envp == FE_NOMASK_ENV)
-    {
-      env.__fpc = FPC_EXCEPTION_MASK;
-    }
-  else
-    env = (*envp);
-
-  _FPU_SETCW (env.__fpc);
+  fenv_t env = libc_handle_user_fenv_s390 (envp);
+  libc_fesetenv_s390 (&env);
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/s390/fpu/fesetround.c b/sysdeps/s390/fpu/fesetround.c
index 38ec4284d3..752b41a171 100644
--- a/sysdeps/s390/fpu/fesetround.c
+++ b/sysdeps/s390/fpu/fesetround.c
@@ -17,21 +17,18 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <fenv_private.h>
 
 int
 __fesetround (int round)
 {
-  if ((round|FPC_RM_MASK) != FPC_RM_MASK)
+  if ((round | FPC_RM_MASK) != FPC_RM_MASK)
     {
       /* ROUND is not a valid rounding mode.  */
       return 1;
     }
-  __asm__ __volatile__ ("srnm 0(%0)"
-			:
-			: "a" (round));
 
+  libc_fesetround_s390 (round);
   return 0;
 }
 libm_hidden_def (__fesetround)
diff --git a/sysdeps/s390/fpu/fetestexceptflag.c b/sysdeps/s390/fpu/fetestexceptflag.c
deleted file mode 100644
index e8badeb13e..0000000000
--- a/sysdeps/s390/fpu/fetestexceptflag.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Test exception in saved exception state.  S/390 version.
-   Copyright (C) 2016-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <fenv.h>
-#include <fenv_libc.h>
-
-int
-fetestexceptflag (const fexcept_t *flagp, int excepts)
-{
-  /* As *flagp is obtained by an earlier call of fegetexceptflag the
-     bits 0-5 of dxc-byte are either zero or correspond to the
-     flag-bits.  Evaluate flags and last dxc-exception-code.  */
-  return (((*flagp >> FPC_FLAGS_SHIFT) | (*flagp >> FPC_DXC_SHIFT))
-	  & excepts
-	  & FE_ALL_EXCEPT);
-}
diff --git a/sysdeps/s390/fpu/feupdateenv.c b/sysdeps/s390/fpu/feupdateenv.c
index e6b1ff8ff1..9ddff724e6 100644
--- a/sysdeps/s390/fpu/feupdateenv.c
+++ b/sysdeps/s390/fpu/feupdateenv.c
@@ -18,21 +18,13 @@
    <https://www.gnu.org/licenses/>.  */
 
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <fenv_private.h>
 
 int
 __feupdateenv (const fenv_t *envp)
 {
-  fexcept_t temp;
-
-  _FPU_GETCW (temp);
-  temp = (temp & FPC_FLAGS_MASK) >> FPC_FLAGS_SHIFT;
-
-  /* Raise the exceptions since the last call to feholdenv  */
-  /* re install saved environment.  */
-  __fesetenv (envp);
-  __feraiseexcept ((int) temp);
+  fenv_t env = libc_handle_user_fenv_s390 (envp);
+  libc_feupdateenv_s390 (&env);
 
   /* Success.  */
   return 0;
diff --git a/sysdeps/s390/fpu/fgetexcptflg.c b/sysdeps/s390/fpu/fgetexcptflg.c
index 779eec83bc..7231752029 100644
--- a/sysdeps/s390/fpu/fgetexcptflg.c
+++ b/sysdeps/s390/fpu/fgetexcptflg.c
@@ -17,24 +17,12 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <fenv_private.h>
 
 int
 fegetexceptflag (fexcept_t *flagp, int excepts)
 {
-  fexcept_t temp, newexcepts;
-
-  /* Get the current exceptions.  */
-  _FPU_GETCW (temp);
-  newexcepts = excepts << FPC_FLAGS_SHIFT;
-  if ((temp & 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.
-       Evaluate flags and last dxc-exception-code.  */
-    newexcepts |= excepts << FPC_DXC_SHIFT;
-
-  *flagp = temp & newexcepts;
+  *flagp = libc_fetestexcept_s390 (excepts);
 
   /* Success.  */
   return 0;
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;
diff --git a/sysdeps/s390/fpu/ftestexcept.c b/sysdeps/s390/fpu/ftestexcept.c
index eabc1b65b9..ed7df8b02b 100644
--- a/sysdeps/s390/fpu/ftestexcept.c
+++ b/sysdeps/s390/fpu/ftestexcept.c
@@ -17,23 +17,11 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <fenv_libc.h>
-#include <fpu_control.h>
+#include <fenv_private.h>
 
 int
 fetestexcept (int excepts)
 {
-  fexcept_t temp, res;
-
-  /* Get current exceptions.  */
-  _FPU_GETCW (temp);
-  res = temp >> FPC_FLAGS_SHIFT;
-  if ((temp & 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.
-       Evaluate flags and last dxc-exception-code.  */
-    res |= temp >> FPC_DXC_SHIFT;
-
-  return res & excepts & FE_ALL_EXCEPT;
+  return libc_fetestexcept_s390 (excepts);
 }
 libm_hidden_def (fetestexcept)
-- 
2.19.1

  parent reply	other threads:[~2019-11-04 16:04 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-04 15:28 [PATCH 01/17] S390: Use load-fp-integer instruction for nearbyint functions Stefan Liebler
2019-11-04 15:28 ` [PATCH 10/17] S390: Use convert-to-fixed instruction for lround functions Stefan Liebler
2019-12-02 14:56   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 17/17] S390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 13/17] S390: Implement libc_fe* macros Stefan Liebler
2019-12-02 14:58   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 15/17] S390: Implement math-barriers math_opt_barrier and math_force_eval Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 04/17] S390: Use load-fp-integer instruction for ceil functions Stefan Liebler
2019-12-02 14:56   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 05/17] S390: Use load-fp-integer instruction for trunc functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 03/17] S390: Use load-fp-integer instruction for floor functions Stefan Liebler
2019-12-02 14:56   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 06/17] S390: Use load-fp-integer instruction for round functions Stefan Liebler
2019-12-02 14:58   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 08/17] S390: Use convert-to-fixed instruction for lrint functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 07/17] S390: Use load-fp-integer instruction for roundeven functions Stefan Liebler
2019-12-02 15:04   ` Stefan Liebler
2019-12-11 14:18     ` Stefan Liebler
2019-11-04 15:28 ` [PATCH 12/17] S390: Use copy-sign instruction for copysign functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:49 ` [PATCH 16/17] S390: Implement roundtoint and converttoint and define TOINT_INTRINSICS Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 15:54 ` [PATCH 02/17] S390: Use load-fp-integer instruction for rint functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 16:04 ` Stefan Liebler [this message]
2019-12-02 14:56   ` [PATCH 14/17] S390: Use libc_fe* macros in fe* functions Stefan Liebler
2019-11-04 16:27 ` [PATCH 11/17] S390: Use convert-to-fixed instruction for llround functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 16:28 ` [PATCH 09/17] S390: Use convert-to-fixed instruction for llrint functions Stefan Liebler
2019-12-02 14:57   ` Stefan Liebler
2019-11-04 18:22 ` [PATCH 01/17] S390: Use load-fp-integer instruction for nearbyint functions Adhemerval Zanella
2019-11-05 15:49   ` Stefan Liebler
2019-11-05 16:48     ` Joseph Myers
2019-11-05 18:55     ` Adhemerval Zanella
2019-12-02 14:56   ` Stefan Liebler
2019-12-02 15:20     ` Adhemerval Zanella

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1572881244-6781-14-git-send-email-stli@linux.ibm.com \
    --to=stli@linux.ibm.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).