aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2025-01-02 10:54:11 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2025-01-09 12:53:58 -0300
commit9cc9f8e11e8fb8f54f1e84d9f024917634a78201 (patch)
tree8715ab006b0edd5a44e525e1aa3ce8a07659fdbf
parente41aabcc93edd6c9a6acb15212b2783d8a7ec5a3 (diff)
downloadglibc-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-ulps2
-rw-r--r--sysdeps/i386/fpu/libm-test-ulps2
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/libm-test-ulps2
-rw-r--r--sysdeps/ieee754/flt-32/e_acosf.c10
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps2
-rw-r--r--sysdeps/s390/fpu/libm-test-ulps2
-rw-r--r--sysdeps/x86_64/fpu/libm-test-ulps2
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