This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] [powerpc] fegetmode: utilize faster method to get rounding mode
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Fri, 7 Jun 2019 11:20:31 -0300
- Subject: Re: [PATCH] [powerpc] fegetmode: utilize faster method to get rounding mode
- References: <1559870599-2079-1-git-send-email-pc@us.ibm.com>
On 06/06/2019 22:23, Paul A. Clarke wrote:
> From: "Paul A. Clarke" <pc@us.ibm.com>
>
> Add support to use 'mffsl' instruction if compiled for POWER9 (or later).
What about using dl_hwcap to check for ISA 3.0 for fegetenv_register
(as fesetenv_register does for fdp)? Not sure how performance-wise it would
be, but in the other hand it would not require to build glibc using -mcpu=power9
to actually use this instruction.
>
> 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 { \
>