about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul A. Clarke <pc@us.ibm.com>2019-09-19 11:31:31 -0500
committerPaul A. Clarke <pc@us.ibm.com>2019-09-27 11:01:54 -0500
commit36c17c7079a5243a890ba43affff326a041775a9 (patch)
treecba6527c4987bf4fef2c179b1b57beacaf8d73fc
parent81ecb0ee4970865cbe5d1da733c4879b999c528f (diff)
downloadglibc-36c17c7079a5243a890ba43affff326a041775a9.tar.gz
glibc-36c17c7079a5243a890ba43affff326a041775a9.tar.xz
glibc-36c17c7079a5243a890ba43affff326a041775a9.zip
[powerpc] libc_feholdsetround_noex_ppc_ctx: optimize FPSCR write
libc_feholdsetround_noex_ppc_ctx currently performs:
1. Read FPSCR, save to context.
2. Create new FPSCR value: clear enables and set new rounding mode.
3. Write new value to FPSCR.

Since other bits just pass through, there is no need to write them.

Instead, write just the changed values (enables and rounding mode),
which can be a bit more efficient.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/powerpc/fpu/fenv_private.h2
2 files changed, 7 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c28351c37..3c792b4317 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2019-09-27  Paul A. Clarke  <pc@us.ibm.com>
 
+	* sysdeps/powerpc/fpu/fenv_private.h
+	(libc_feholdsetround_noex_ppc_ctx): Call fesetenv_mode instead
+	of fesetenv_register.
+
+2019-09-27  Paul A. Clarke  <pc@us.ibm.com>
+
 	* sysdeps/powerpc/fpu/fenv_libc.h (fegetenv_status): Rename to
 	fegetenv_control.
 	* sysdeps/powerpc/fpu/fedisblxcpt.c (fedisableexcept): Accommodate
diff --git a/sysdeps/powerpc/fpu/fenv_private.h b/sysdeps/powerpc/fpu/fenv_private.h
index 94960262dd..ade0bfaf5f 100644
--- a/sysdeps/powerpc/fpu/fenv_private.h
+++ b/sysdeps/powerpc/fpu/fenv_private.h
@@ -142,7 +142,7 @@ libc_feholdsetround_noex_ppc_ctx (struct rm_ctx *ctx, int r)
   if (__glibc_unlikely (new.l != old.l))
     {
       __TEST_AND_ENTER_NON_STOP (old.l, 0ULL);
-      fesetenv_register (new.fenv);
+      fesetenv_mode (new.fenv);
       ctx->updated_status = true;
     }
   else