[glibc] powerpc: Update acosf ulps
Paul Zimmermann
Paul.Zimmermann@inria.fr
Thu Jan 2 14:58:37 GMT 2025
thank you Adhemerval, this answers well my questions.
Ok to commit on my side.
Paul
> Date: Thu, 2 Jan 2025 11:07:46 -0300
> Cc: amonakov@ispras.ru, fweimer@redhat.com, libc-alpha@sourceware.org
> From: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
> Organization: Linaro
>
>
>
> On 02/01/25 11:05, Paul Zimmermann wrote:
> > 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 ?
>
> Because gcc complains due how math_opt_barrier is implemented:
>
> ../sysdeps/ieee754/flt-32/e_acosf.c: In function ‘__ieee754_acosf’:
> ../sysdeps/aarch64/fpu/math-barriers.h:23:30: error: read-only variable ‘__x’ used as ‘asm’ output
> 23 | ({ __typeof (x) __x = (x); __asm ("" : "+w" (__x)); __x; })
> | ^~~~~
> ../sysdeps/ieee754/flt-32/e_acosf.c:94:16: note: in expansion of macro ‘math_opt_barrier’
> 94 | return math_opt_barrier (pi2);
> | ^~~~~~~~~~~~~~~~
>
> >
> > 2) does math_opt_barrier() return a float? Or is the return value cast
> > to float by the return?
>
> The later, since math_opt_barrier aims to be type agnostic by using
> __typeof.
>
> >
> > Paul
>
>
More information about the Libc-alpha
mailing list