diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2025-01-02 10:54:11 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2025-01-09 12:53:58 -0300 |
commit | 9cc9f8e11e8fb8f54f1e84d9f024917634a78201 (patch) | |
tree | 8715ab006b0edd5a44e525e1aa3ce8a07659fdbf | |
parent | e41aabcc93edd6c9a6acb15212b2783d8a7ec5a3 (diff) | |
download | glibc-9cc9f8e11e8fb8f54f1e84d9f024917634a78201.zip glibc-9cc9f8e11e8fb8f54f1e84d9f024917634a78201.tar.gz glibc-9cc9f8e11e8fb8f54f1e84d9f024917634a78201.tar.bz2 |
math: Fix acosf when building with gcc <= 11
GCC <= 11 wrongly assumes the rounding is to nearest and performs a
constant folding where it should evaluate since the result is not
exact [1].
[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57245
-rw-r--r-- | sysdeps/aarch64/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/i386/fpu/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/i386/i686/fpu/multiarch/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/e_acosf.c | 10 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/s390/fpu/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/libm-test-ulps | 2 |
7 files changed, 7 insertions, 15 deletions
diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps index a813938..59ec929 100644 --- a/sysdeps/aarch64/libm-test-ulps +++ b/sysdeps/aarch64/libm-test-ulps @@ -11,7 +11,6 @@ float: 1 Function: "acos_downward": double: 1 -float: 1 ldouble: 1 Function: "acos_sve": @@ -20,7 +19,6 @@ float: 1 Function: "acos_towardzero": double: 1 -float: 1 ldouble: 1 Function: "acos_upward": diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps index 8f3eeb8..737d4cc 100644 --- a/sysdeps/i386/fpu/libm-test-ulps +++ b/sysdeps/i386/fpu/libm-test-ulps @@ -7,12 +7,10 @@ float128: 1 ldouble: 2 Function: "acos_downward": -float: 1 float128: 1 ldouble: 2 Function: "acos_towardzero": -float: 1 float128: 1 ldouble: 2 diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps index d411751..750d519 100644 --- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps +++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps @@ -7,12 +7,10 @@ float128: 1 ldouble: 2 Function: "acos_downward": -float: 1 float128: 1 ldouble: 2 Function: "acos_towardzero": -float: 1 float128: 1 ldouble: 2 diff --git a/sysdeps/ieee754/flt-32/e_acosf.c b/sysdeps/ieee754/flt-32/e_acosf.c index cba0122..a5a4de4 100644 --- a/sysdeps/ieee754/flt-32/e_acosf.c +++ b/sysdeps/ieee754/flt-32/e_acosf.c @@ -3,7 +3,7 @@ Copyright (c) 2023-2024 Alexei Sibidanov. The original version of this file was copied from the CORE-MATH -project (file src/binary32/acos/acosf.c, revision 61d7bef). +project (file src/binary32/acos/acosf.c, revision 56dd347). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -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; diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 22cbb83..cf3dec3 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -8,13 +8,11 @@ ldouble: 1 Function: "acos_downward": double: 1 -float: 1 float128: 1 ldouble: 3 Function: "acos_towardzero": double: 1 -float: 1 float128: 1 ldouble: 3 diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps index 92e2cc7..76a1f3c 100644 --- a/sysdeps/s390/fpu/libm-test-ulps +++ b/sysdeps/s390/fpu/libm-test-ulps @@ -7,12 +7,10 @@ ldouble: 1 Function: "acos_downward": double: 1 -float: 1 ldouble: 1 Function: "acos_towardzero": double: 1 -float: 1 ldouble: 1 Function: "acos_upward": diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 8472cc6..e454a63 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -8,13 +8,11 @@ ldouble: 2 Function: "acos_downward": double: 1 -float: 1 float128: 1 ldouble: 2 Function: "acos_towardzero": double: 1 -float: 1 float128: 1 ldouble: 2 |