This is the mail archive of the libc-alpha@sourceware.org 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]

Re: [PATCH] [powerpc] fegetmode: utilize faster method to get rounding mode



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 { \
> 


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