[glibc] powerpc: Update acosf ulps

Paul Zimmermann Paul.Zimmermann@inria.fr
Thu Jan 2 14:05:22 GMT 2025


       Hi Adhemerval,

> This seems to show no regression on gcc 11 and gcc 13 on x86_64, i686, aarch64,
> and powerpc64le:
> 
> diff --git a/sysdeps/ieee754/flt-32/e_acosf.c b/sysdeps/ieee754/flt-32/e_acosf.c
> index cba01221dc..35e241f6c4 100644
> --- a/sysdeps/ieee754/flt-32/e_acosf.c
> +++ b/sysdeps/ieee754/flt-32/e_acosf.c
> @@ -28,6 +28,7 @@ SOFTWARE.
>  #include <math.h>
>  #include <math_private.h>
>  #include <libm-alias-finite.h>
> +#include <math-barriers.h>
>  #include "math_config.h"
> 
>  static __attribute__ ((noinline)) float
> @@ -66,7 +67,7 @@ poly12 (double z, const double *c)
>  float
>  __ieee754_acosf (float x)
>  {
> -  const double pi2 = 0x1.921fb54442d18p+0;
> +  double pi2 = 0x1.921fb54442d18p+0;
>    static const double o[] = { 0, 0x1.921fb54442d18p+1 };
>    double xs = x;
>    double r;
> @@ -87,7 +88,10 @@ __ieee754_acosf (float x)
>         };
>        /* Avoid spurious underflow exception.  */
>        if (__glibc_unlikely (ax <= 0x40000000u)) /* |x| < 2^-63 */
> -       return (float) pi2;
> +       /* GCC <= 11 wrongly assumes the rounding is to nearest and
> +          performs a constant folding here:
> +          https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57245 */
> +       return math_opt_barrier (pi2);
>        double z = xs;
>        double z2 = z * z;
>        double z4 = z2 * z2;

this looks good to me, with two questions:

1) why did you remove "const" in pi2 ? This does not work with const ?

2) does math_opt_barrier() return a float? Or is the return value cast
   to float by the return?

Paul


More information about the Libc-alpha mailing list