This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v3] [powerpc] No need to enter "Ignore Exceptions Mode"

From: "Paul A. Clarke" <>

Since at least POWER8, there is no performance advantage to entering
"Ignore Exceptions Mode", and doing so conditionally requires the
conditional logic as well as a system call.  Make it a no-op for
uses within glibc.

2019-09-27  Paul A. Clarke  <>

	* sysdeps/powerpc/fpu/fenv_private.h:
	(__EXIT_NON_STOP): New.
	(libc_feholdexcept_setround_ppc): Use __ENTER_NON_STOP.
	(__libc_femergeenv_ppc): Use __ENTER_NON_STOP and __EXIT_NON_STOP.
	(libc_feholdsetround_noex_ppc_ctx): Use __EXIT_NON_STOP.
v2: This was a new patch (#2) in the series "Various FPSCR-related changes".
v3: I was a bit uncomfortable with the approach used in v1/v2, which had
  side effects, although these were expected to be innocuous.
  I reimplemented this patch to be implemented only for uses that are
  internal to glibc.  These are all cases where the mode is to be changed
  only temporarily.  So, the state will be consistent after the code
  block is complete -- no unexpected side effects.

 sysdeps/powerpc/fpu/fenv_private.h | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/sysdeps/powerpc/fpu/fenv_private.h b/sysdeps/powerpc/fpu/fenv_private.h
index 5eedc3b..d186575 100644
--- a/sysdeps/powerpc/fpu/fenv_private.h
+++ b/sysdeps/powerpc/fpu/fenv_private.h
@@ -23,6 +23,15 @@
 #include <fenv_libc.h>
 #include <fpu_control.h>
+#ifdef _ARCH_PWR8
+/* There is no performance advantage to non-stop mode.  */
+#define __ENTER_NON_STOP(old, new) do {} while (old * new * 0 != 0)
+#define __EXIT_NON_STOP(old, new) do {} while (old * new * 0 != 0)
 static __always_inline void
 libc_feholdexcept_setround_ppc (fenv_t *envp, int r)
@@ -30,7 +39,7 @@ libc_feholdexcept_setround_ppc (fenv_t *envp, int r)
   old.fenv = *envp = fegetenv_register ();
+  __ENTER_NON_STOP (old.l, 0ULL);
   /* Clear everything and set the rounding mode.  */
   new.l = r;
@@ -49,8 +58,8 @@ __libc_femergeenv_ppc (const fenv_t *envp, unsigned long long old_mask,
   /* Merge bits while masking unwanted bits from new and old env.  */
   new.l = (old.l & old_mask) | (new.l & new_mask);
-  __TEST_AND_EXIT_NON_STOP (old.l, new.l);
-  __TEST_AND_ENTER_NON_STOP (old.l, new.l);
+  __EXIT_NON_STOP (old.l, new.l);
+  __ENTER_NON_STOP (old.l, new.l);
   /* If requesting to keep status, replace control, and merge exceptions,
      and exceptions haven't changed, we can just set new control instead
@@ -141,7 +150,7 @@ libc_feholdsetround_noex_ppc_ctx (struct rm_ctx *ctx, int r)
   ctx->env = old.fenv;
   if (__glibc_unlikely (new.l != old.l))
-      __TEST_AND_ENTER_NON_STOP (old.l, 0ULL);
+      __ENTER_NON_STOP (old.l, 0ULL);
       fesetenv_control (new.fenv);
       ctx->updated_status = true;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]