This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] [powerpc] fegetmode: utilize faster method to get rounding mode
- From: "Paul A. Clarke" <pc at us dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Cc: tuliom at ascii dot art dot br
- Date: Thu, 6 Jun 2019 20:23:19 -0500
- Subject: [PATCH] [powerpc] fegetmode: utilize faster method to get rounding mode
From: "Paul A. Clarke" <pc@us.ibm.com>
Add support to use 'mffsl' instruction if compiled for POWER9 (or later).
2019-06-06 Paul A. Clarke <pc@us.ibm.com>
* sysdeps/powerpc/fpu/fenv_libc.h (fegetenv_status): New.
* sysdeps/powerpc/fpu/fegetmode.c (fegetmode): Use fegetenv_status()
instead of fegetenv_register().
---
sysdeps/powerpc/fpu/fegetmode.c | 2 +-
sysdeps/powerpc/fpu/fenv_libc.h | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/sysdeps/powerpc/fpu/fegetmode.c b/sysdeps/powerpc/fpu/fegetmode.c
index f43ab60..466f5b7 100644
--- a/sysdeps/powerpc/fpu/fegetmode.c
+++ b/sysdeps/powerpc/fpu/fegetmode.c
@@ -21,6 +21,6 @@
int
fegetmode (femode_t *modep)
{
- *modep = fegetenv_register ();
+ *modep = fegetenv_status ();
return 0;
}
diff --git a/sysdeps/powerpc/fpu/fenv_libc.h b/sysdeps/powerpc/fpu/fenv_libc.h
index f8dd1b7..64f7398 100644
--- a/sysdeps/powerpc/fpu/fenv_libc.h
+++ b/sysdeps/powerpc/fpu/fenv_libc.h
@@ -34,6 +34,18 @@ extern const fenv_t *__fe_mask_env (void) attribute_hidden;
pointer. */
#define fegetenv_register() __builtin_mffs()
+/* Equivalent to fegetenv_register, but only returns bits for
+ status, exception enables, and mode. */
+#ifdef _ARCH_PWR9
+#define fegetenv_status() \
+ ({register double __fr; \
+ __asm__ ("mffsl %0" : "=f" (__fr)); \
+ __fr; \
+ })
+#else
+#define fegetenv_status() fegetenv_register()
+#endif
+
/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer. */
#define fesetenv_register(env) \
do { \
--
1.8.3.1