* [PATCH 00/15] Fix some libm static issues
@ 2024-03-27 16:45 Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 01/15] math: Add support for auto static math tests Adhemerval Zanella
` (14 more replies)
0 siblings, 15 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
Some recent math optimizations removed some symbols from the static
build and due to the limited static build check, along with
--disable-shared being broken for some time [1]; this issue has slipped
some releases.
Although the fix is straightforward, I added an extra framework to
enable static build for select math libraries using the generic type
framework (which autogenerated the tests for all supported types using
the C template files). I have not enabled it for all tests due to the
required extra size constraint, maybe a future
---enable-static-math-tests configure option could improve test
coverage.
As an experiment, I enabled static build for all autogenerated math
tests. This has uncovered some extra missing symbols on some ABIs, along
with some issues with implementation used on static for some ABIs.
I tested this patchset on x86_64, i686, armhf, aarch64, and powerpc64le.
The powerpc64le shows some issues with the static linking, due to the
newly enabled tests (using gcc 13.1):
FAIL: math/test-float128-exp10-static
FAIL: math/test-float128-y1-static
FAIL: math/test-float64x-exp10-static
FAIL: math/test-float64x-y1-static
FAIL: math/test-ibm128-acos-static
FAIL: math/test-ibm128-copysign-static
FAIL: math/test-ibm128-exp10-static
FAIL: math/test-ibm128-fmod-static
FAIL: math/test-ibm128-frexp-static
FAIL: math/test-ibm128-log10-static
FAIL: math/test-ibm128-log2-static
FAIL: math/test-ibm128-modf-static
FAIL: math/test-ibm128-y0-static
FAIL: math/test-ibm128-y1-static
I have not analyzed what is happening, but it might be due to the
'-mabi=ibmlongdouble' along with how libgcc.a was built (I saw some
issues on GCC bugzilla). One option could be XFAIL for now.
[1] https://sourceware.org/bugzilla/show_bug.cgi?id=20845
Adhemerval Zanella (15):
math: Add support for auto static math tests
math: Fix i386 and m68k fmod/fmodf on static build (BZ 31488)
i386: Use generic fmod
i386: Use generic fmodf
math: Fix i386 and m68k exp10 on static build
i386: Use generic exp10
math: Fix isnanf128 static build
math: Provided copysignf128 for static libm on alpha, s390, and
sparcv9
math: Provide frexpf128 for static libm on alpha, s390, and sparcv9
math: Provide modf128 for static libm on alpha, s390, and sparcv9
math: Fix acos template for arguments greater than 1
math: Fix log10 template for inputs less than 0
math: Fix log2 template for inputs less than 0
math: Fix y0 template for arguments less/equal than 0
math: Fix y1 template for arguments less/equal than 0
math/Makefile | 116 +++++++++++++++++++-
math/test-double-static.h | 1 +
math/test-float-static.h | 1 +
math/test-float128-static.h | 1 +
math/test-float32-static.h | 1 +
math/test-float32x-static.h | 1 +
math/test-float64-static.h | 1 +
math/test-float64x-static.h | 1 +
math/test-ibm128-static.h | 1 +
math/test-ldouble-static.h | 1 +
math/w_acos_template.c | 9 +-
math/w_j0_template.c | 16 ++-
math/w_j1_template.c | 16 ++-
math/w_log10_template.c | 16 ++-
math/w_log2_template.c | 16 ++-
sysdeps/i386/fpu/Versions | 5 +
sysdeps/i386/fpu/e_exp10.S | 51 ---------
sysdeps/i386/fpu/e_exp10.c | 2 +
sysdeps/i386/fpu/e_exp_data.c | 1 -
sysdeps/i386/fpu/e_fmod.S | 18 ---
sysdeps/i386/fpu/e_fmod.c | 2 +
sysdeps/i386/fpu/e_fmodf.S | 18 ---
sysdeps/i386/fpu/e_fmodf.c | 2 +
sysdeps/i386/fpu/math_err.c | 1 -
sysdeps/i386/fpu/w_exp10_compat.c | 3 -
sysdeps/i386/fpu/w_fmod_compat.c | 14 ---
sysdeps/i386/fpu/w_fmodf_compat.c | 14 ---
sysdeps/ieee754/dbl-64/e_exp10.c | 7 +-
sysdeps/ieee754/dbl-64/e_fmod.c | 5 +-
sysdeps/ieee754/float128/float128_private.h | 2 +-
sysdeps/ieee754/float128/s_isnanf128.c | 4 +
sysdeps/ieee754/flt-32/e_fmodf.c | 5 +-
sysdeps/ieee754/ldbl-64-128/s_copysignl.c | 4 +-
sysdeps/ieee754/ldbl-64-128/s_frexpl.c | 4 +-
sysdeps/ieee754/ldbl-64-128/s_modfl.c | 4 +-
sysdeps/ieee754/ldbl-opt/s_ldexpl.c | 4 +-
sysdeps/m68k/m680x0/fpu/w_exp10_compat.c | 9 +-
sysdeps/m68k/m680x0/fpu/w_fmod_compat.c | 5 +-
sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c | 7 +-
sysdeps/mach/hurd/i386/libm.abilist | 3 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 3 +
41 files changed, 235 insertions(+), 160 deletions(-)
create mode 100644 math/test-double-static.h
create mode 100644 math/test-float-static.h
create mode 100644 math/test-float128-static.h
create mode 100644 math/test-float32-static.h
create mode 100644 math/test-float32x-static.h
create mode 100644 math/test-float64-static.h
create mode 100644 math/test-float64x-static.h
create mode 100644 math/test-ibm128-static.h
create mode 100644 math/test-ldouble-static.h
delete mode 100644 sysdeps/i386/fpu/e_exp10.S
create mode 100644 sysdeps/i386/fpu/e_exp10.c
delete mode 100644 sysdeps/i386/fpu/e_exp_data.c
delete mode 100644 sysdeps/i386/fpu/e_fmod.S
create mode 100644 sysdeps/i386/fpu/e_fmod.c
delete mode 100644 sysdeps/i386/fpu/e_fmodf.S
create mode 100644 sysdeps/i386/fpu/e_fmodf.c
delete mode 100644 sysdeps/i386/fpu/math_err.c
delete mode 100644 sysdeps/i386/fpu/w_exp10_compat.c
delete mode 100644 sysdeps/i386/fpu/w_fmod_compat.c
delete mode 100644 sysdeps/i386/fpu/w_fmodf_compat.c
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 01/15] math: Add support for auto static math tests
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 02/15] math: Fix i386 and m68k fmod/fmodf on static build (BZ 31488) Adhemerval Zanella
` (13 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
It basically copy the already in place rules for dynamic tests for
auto-generated math functions for all support types. To avoid the
need to duplicate .inc files, a .SECONDEXPANSION rules is adeed for
the gen-libm-test.py generation.
New tests should be added on the new rules
'libm-test-funcs-auto-static', 'libm-test-funcs-noauto-static', and
'libm-test-funcs-narrow-static'; similar to the non-static
counterparts.
---
math/Makefile | 103 +++++++++++++++++++++++++++++++++++-
math/test-double-static.h | 1 +
math/test-float-static.h | 1 +
math/test-float128-static.h | 1 +
math/test-float32-static.h | 1 +
math/test-float32x-static.h | 1 +
math/test-float64-static.h | 1 +
math/test-float64x-static.h | 1 +
math/test-ibm128-static.h | 1 +
math/test-ldouble-static.h | 1 +
10 files changed, 110 insertions(+), 2 deletions(-)
create mode 100644 math/test-double-static.h
create mode 100644 math/test-float-static.h
create mode 100644 math/test-float128-static.h
create mode 100644 math/test-float32-static.h
create mode 100644 math/test-float32x-static.h
create mode 100644 math/test-float64-static.h
create mode 100644 math/test-float64x-static.h
create mode 100644 math/test-ibm128-static.h
create mode 100644 math/test-ldouble-static.h
diff --git a/math/Makefile b/math/Makefile
index 79ef4ebb65..fb537955fb 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -274,8 +274,10 @@ endif
libm-vec-tests = $(addprefix test-,$(libmvec-tests))
libm-test-support = $(foreach t,$(test-types),libm-test-support-$(t))
-test-extras += $(libm-test-support)
-extra-test-objs += $(addsuffix .o, $(libm-test-support))
+libm-test-support-static = $(foreach t,$(test-types),libm-test-support-$(t)-static)
+test-extras += $(libm-test-support) $(libm-test-support-static)
+extra-test-objs += $(addsuffix .o, $(libm-test-support)) \
+ $(addsuffix .o, $(libm-test-support-static))
libm-vec-test-wrappers = $(addsuffix -wrappers, $(libm-vec-tests))
test-extras += $(libm-vec-test-wrappers)
extra-test-objs += $(addsuffix .o, $(libm-vec-test-wrappers))
@@ -364,6 +366,63 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
$(make-target-directory)
$(PYTHON) gen-libm-test.py -c $< -a auto-libm-test-out$* -C $@
+
+libm-test-funcs-auto-static =
+libm-test-funcs-noauto-static =
+libm-test-funcs-narrow-static =
+libm-test-funcs-all-static = $(libm-test-funcs-auto-static) $(libm-test-funcs-noauto-static)
+
+libm-test-c-auto-static = $(foreach f,$(libm-test-funcs-auto-static),libm-test-$(f)-static.c)
+libm-test-c-noauto-static = $(foreach f,$(libm-test-funcs-noauto-static),libm-test-$(f)-static.c)
+libm-test-c-narrow-static = $(foreach f,$(libm-test-funcs-narrow-static),\
+ libm-test-narrow-$(f)-static.c)
+generated += $(libm-test-c-auto-static) $(libm-test-c-noauto-static) $(libm-test-c-narrow-static)
+
+libm-tests-normal-static = $(foreach t,$(libm-tests-base-normal),\
+ $(foreach f,$(libm-test-funcs-all-static),\
+ $(t)-$(f)-static))
+libm-tests-narrow-static = $(foreach t,$(libm-tests-base-narrow-static),\
+ $(foreach f,$(libm-test-funcs-narrow-static),\
+ $(t)-$(f)-static))
+libm-tests-vector-static = $(foreach t,$(libmvec-tests-static),\
+ $(foreach f,$($(t)-funcs),test-$(t)-$(f)-static))
+libm-tests-static = $(libm-tests-normal-static) $(libm-tests-narrow-static) $(libm-tests-vector-static)
+libm-tests-for-type-static = $(foreach f,$(libm-test-funcs-all-static),\
+ test-$(1)-$(f)-static test-i$(1)-$(f)-static) \
+ $(filter test-$(1)-%,$(libm-tests-vector-static) \
+ $(libm-tests-narrow-static))
+
+libm-tests.o += $(addsuffix .o,$(libm-tests-static))
+
+tests-static += $(libm-tests-static)
+generated += $(addsuffix .c,$(libm-tests)) \
+ $(foreach t,$(test-types),libm-test-support-$(t)-static.c)
+
+libm-test-c-auto-obj-static = $(addprefix $(objpfx),$(libm-test-c-auto-static))
+libm-test-c-noauto-obj-static = $(addprefix $(objpfx),$(libm-test-c-noauto-static))
+libm-test-c-narrow-obj-static = $(addprefix $(objpfx),$(libm-test-c-narrow-static))
+
+# Use the same input test definitions for both dynamic and static tests.
+.SECONDEXPANSION:
+$(libm-test-c-noauto-obj-static): $(objpfx)libm-test%.c: libm-test$$(subst -static,,%).inc \
+ gen-libm-test.py
+ $(make-target-directory)
+ $(PYTHON) gen-libm-test.py -c $< -a /dev/null -C $@
+
+.SECONDEXPANSION:
+$(libm-test-c-auto-obj-static): $(objpfx)libm-test%.c: libm-test$$(subst -static,,%).inc \
+ gen-libm-test.py \
+ auto-libm-test-out$$(subst -static,,%)
+ $(make-target-directory)
+ $(PYTHON) gen-libm-test.py -c $< -a auto-libm-test-out`echo $* | sed 's/-static//'` -C $@
+
+.SECONDEXPANSION:
+$(libm-test-c-narrow-obj-static): $(objpfx)libm-test%.c: libm-test$$(subst -static,,%).inc \
+ gen-libm-test.py \
+ auto-libm-test-out$$(subst -static,,%)
+ $(make-target-directory)
+ $(PYTHON) gen-libm-test.py -c $< -a auto-libm-test-out`echo $* | sed 's/-static//'` -C $@
+
# Tests for totalorder compat symbols reuse the table of tests as
# processed by gen-libm-test.py, so add dependencies on the generated
# .c files.
@@ -505,6 +564,18 @@ $(foreach t,$(libm-tests-normal),$(objpfx)$(t).c): $(objpfx)test-%.c:
echo "#include <libm-test-$$func.c>"; \
) > $@
+$(foreach t,$(libm-tests-normal-static),$(objpfx)$(t).c): $(objpfx)test-%.c:
+ type_func=$*; \
+ type=$${type_func%%-*}; \
+ func=$${type_func#*-}; \
+ ( \
+ echo "#include <test-$$type.h>"; \
+ echo "#include <test-math-exceptions.h>"; \
+ echo "#include <test-math-errno.h>"; \
+ echo "#include <test-math-scalar.h>"; \
+ echo "#include <libm-test-$$func.c>"; \
+ ) > $@
+
$(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c): $(objpfx)test-%.c:
type_pair_func=$*; \
type_pair=$${type_pair_func%-*}; \
@@ -539,6 +610,13 @@ $(foreach t,$(test-types),\
echo "#include <libm-test-support.c>"; \
) > $@
+$(foreach t,$(test-types),\
+ $(objpfx)libm-test-support-$(t)-static.c): $(objpfx)libm-test-support-%.c:
+ ( \
+ echo "#include <test-$*.h>"; \
+ echo "#include <libm-test-support.c>"; \
+ ) > $@
+
$(addprefix $(objpfx), $(libm-tests.o)): $(objpfx)libm-test-ulps.h
define o-iterator-doit
@@ -548,6 +626,13 @@ endef
object-suffixes-left := $(libm-tests-base)
include $(o-iterator)
+define o-iterator-doit
+$(foreach f,$(libm-test-funcs-all-static),\
+ $(objpfx)$(o)-$(f)-static.o): $(objpfx)$(o)%.o: $(objpfx)libm-test%.c
+endef
+object-suffixes-left := $(libm-tests-base)
+include $(o-iterator)
+
define o-iterator-doit
$(foreach f,$(libm-test-funcs-narrow),\
$(objpfx)$(o)-$(f).o): $(objpfx)$(o)%.o: \
@@ -563,6 +648,13 @@ endef
object-suffixes-left := $(libm-tests-base-normal)
include $(o-iterator)
+define o-iterator-doit
+$(foreach f,$(libm-test-funcs-all-static),\
+ $(objpfx)$(o)-$(f)-static.o): CFLAGS += $(libm-test-no-inline-cflags)
+endef
+object-suffixes-left := $(libm-tests-base-normal)
+include $(o-iterator)
+
define o-iterator-doit
$(foreach f,$(libm-test-funcs-narrow),\
$(objpfx)$(o)-$(f).o): CFLAGS += $(libm-test-no-inline-cflags)
@@ -584,6 +676,13 @@ endef
object-suffixes-left := $(test-types)
include $(o-iterator)
+define o-iterator-doit
+$(addprefix $(objpfx),\
+ $(call libm-tests-for-type-static,$(o))): $(objpfx)libm-test-support-$(o)-static.o
+endef
+object-suffixes-left := $(test-types)
+include $(o-iterator)
+
define o-iterator-doit
$(objpfx)libm-test-support-$(o).o: CFLAGS += $(libm-test-no-inline-cflags)
endef
diff --git a/math/test-double-static.h b/math/test-double-static.h
new file mode 100644
index 0000000000..d53f46819f
--- /dev/null
+++ b/math/test-double-static.h
@@ -0,0 +1 @@
+#include "test-double.h"
diff --git a/math/test-float-static.h b/math/test-float-static.h
new file mode 100644
index 0000000000..7834c9e1f1
--- /dev/null
+++ b/math/test-float-static.h
@@ -0,0 +1 @@
+#include "test-float.h"
diff --git a/math/test-float128-static.h b/math/test-float128-static.h
new file mode 100644
index 0000000000..5f8206456a
--- /dev/null
+++ b/math/test-float128-static.h
@@ -0,0 +1 @@
+#include "test-float128.h"
diff --git a/math/test-float32-static.h b/math/test-float32-static.h
new file mode 100644
index 0000000000..2df27d1ca0
--- /dev/null
+++ b/math/test-float32-static.h
@@ -0,0 +1 @@
+#include "test-float32.h"
diff --git a/math/test-float32x-static.h b/math/test-float32x-static.h
new file mode 100644
index 0000000000..62f78b49d8
--- /dev/null
+++ b/math/test-float32x-static.h
@@ -0,0 +1 @@
+#include "test-float32x.h"
diff --git a/math/test-float64-static.h b/math/test-float64-static.h
new file mode 100644
index 0000000000..807c174df1
--- /dev/null
+++ b/math/test-float64-static.h
@@ -0,0 +1 @@
+#include "test-float64.h"
diff --git a/math/test-float64x-static.h b/math/test-float64x-static.h
new file mode 100644
index 0000000000..a7801dbc10
--- /dev/null
+++ b/math/test-float64x-static.h
@@ -0,0 +1 @@
+#include "test-float64x.h"
diff --git a/math/test-ibm128-static.h b/math/test-ibm128-static.h
new file mode 100644
index 0000000000..b66a57050b
--- /dev/null
+++ b/math/test-ibm128-static.h
@@ -0,0 +1 @@
+#include "test-ibm128.h"
diff --git a/math/test-ldouble-static.h b/math/test-ldouble-static.h
new file mode 100644
index 0000000000..beabedb817
--- /dev/null
+++ b/math/test-ldouble-static.h
@@ -0,0 +1 @@
+#include "test-ldouble.h"
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 02/15] math: Fix i386 and m68k fmod/fmodf on static build (BZ 31488)
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 01/15] math: Add support for auto static math tests Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 03/15] i386: Use generic fmod Adhemerval Zanella
` (12 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The commit 16439f419b removed the static fmod/fmodf on i386 and m68k
with and empty w_fmod.c (required for the ABIs that uses the newly
implementation). This patch fixes by adding the required symbols on
the arch-specific w_fmod{f}_compat.c implementation.
To statically build fmod fails on some ABI (alpha, s390, sparc) because
it does not export the ldexpf128, this is also fixed by this patch.
Checked on i686-linux-gnu and with a build for m68k-linux-gnu.
---
math/Makefile | 4 +++-
sysdeps/i386/fpu/w_fmod_compat.c | 7 ++++---
sysdeps/i386/fpu/w_fmodf_compat.c | 7 ++++---
sysdeps/ieee754/ldbl-opt/s_ldexpl.c | 4 ++--
sysdeps/m68k/m680x0/fpu/w_fmod_compat.c | 5 +++--
sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c | 7 ++++---
6 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index fb537955fb..964bf2be71 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -368,7 +368,9 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
libm-test-funcs-auto-static =
-libm-test-funcs-noauto-static =
+libm-test-funcs-noauto-static = \
+ fmod \
+ # libm-test-funcs-noauto-static
libm-test-funcs-narrow-static =
libm-test-funcs-all-static = $(libm-test-funcs-auto-static) $(libm-test-funcs-noauto-static)
diff --git a/sysdeps/i386/fpu/w_fmod_compat.c b/sysdeps/i386/fpu/w_fmod_compat.c
index 5ac9995ffd..528bfc2a13 100644
--- a/sysdeps/i386/fpu/w_fmod_compat.c
+++ b/sysdeps/i386/fpu/w_fmod_compat.c
@@ -7,8 +7,9 @@
# define LIBM_SVID_COMPAT 1
# undef compat_symbol
# define compat_symbol(a, b, c, d)
-#endif
-#include <math/w_fmod_compat.c>
-#ifdef SHARED
+# include <math/w_fmod_compat.c>
libm_alias_double (__fmod_compat, fmod)
+#else
+#include <math-type-macros-double.h>
+#include <w_fmod_template.c>
#endif
diff --git a/sysdeps/i386/fpu/w_fmodf_compat.c b/sysdeps/i386/fpu/w_fmodf_compat.c
index cc417e07d3..5a61693e51 100644
--- a/sysdeps/i386/fpu/w_fmodf_compat.c
+++ b/sysdeps/i386/fpu/w_fmodf_compat.c
@@ -7,8 +7,9 @@
# define LIBM_SVID_COMPAT 1
# undef compat_symbol
# define compat_symbol(a, b, c, d)
-#endif
-#include <math/w_fmodf_compat.c>
-#ifdef SHARED
+# include <math/w_fmodf_compat.c>
libm_alias_float (__fmod_compat, fmod)
+#else
+#include <math-type-macros-float.h>
+#include <w_fmod_template.c>
#endif
diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
index 1afbe7d8ad..932cc4341c 100644
--- a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
+++ b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
@@ -17,13 +17,13 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
# define declare_mgen_alias(f,t)
#endif
#include <math-type-macros-ldouble.h>
#include <s_ldexp_template.c>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
long_double_symbol (libc, __ldexpl, ldexpl);
long_double_symbol (libc, __wrap_scalbnl, scalbnl);
#endif
diff --git a/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c b/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c
index 527d4fbed2..57f38091e6 100644
--- a/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c
+++ b/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c
@@ -7,8 +7,9 @@
# define LIBM_SVID_COMPAT 1
# undef compat_symbol
# define compat_symbol(a, b, c, d)
-#endif
#include <math/w_fmod_compat.c>
-#ifdef SHARED
libm_alias_double (__fmod_compat, fmod)
+#else
+#include <math-type-macros-double.h>
+#include <w_fmod_template.c>
#endif
diff --git a/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c b/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c
index 5043586b91..88db07f443 100644
--- a/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c
+++ b/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c
@@ -7,8 +7,9 @@
# define LIBM_SVID_COMPAT 1
# undef compat_symbol
# define compat_symbol(a, b, c, d)
-#endif
-#include <math/w_fmodf_compat.c>
-#ifdef SHARED
+# include <math/w_fmodf_compat.c>
libm_alias_float (__fmod_compat, fmod)
+#else
+#include <math-type-macros-float.h>
+#include <w_fmod_template.c>
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 03/15] i386: Use generic fmod
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 01/15] math: Add support for auto static math tests Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 02/15] math: Fix i386 and m68k fmod/fmodf on static build (BZ 31488) Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 04/15] i386: Use generic fmodf Adhemerval Zanella
` (11 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The benchtest results shows a slight improvement (Ryzen 5900, gcc
13.2.1):
* sysdeps/i386/fpu/e_fmod.S:
"fmod": {
"subnormals": {
"duration": 3.68855e+09,
"iterations": 2.12608e+08,
"max": 62.012,
"min": 16.798,
"mean": 17.349
},
"normal": {
"duration": 3.88459e+09,
"iterations": 7.168e+06,
"max": 2879.12,
"min": 16.909,
"mean": 541.934
},
"close-exponents": {
"duration": 3.692e+09,
"iterations": 1.96608e+08,
"max": 66.452,
"min": 16.835,
"mean": 18.7785
}
}
* generic
"fmod": {
"subnormals": {
"duration": 3.68645e+09,
"iterations": 2.2848e+08,
"max": 66.896,
"min": 15.91,
"mean": 16.1347
},
"normal": {
"duration": 4.1455e+09,
"iterations": 8.192e+06,
"max": 3376.18,
"min": 15.873,
"mean": 506.043
},
"close-exponents": {
"duration": 3.70197e+09,
"iterations": 2.08896e+08,
"max": 69.597,
"min": 15.947,
"mean": 17.7216
}
}
---
sysdeps/i386/fpu/Versions | 4 ++++
sysdeps/i386/fpu/e_fmod.S | 18 ------------------
sysdeps/i386/fpu/e_fmod.c | 2 ++
sysdeps/i386/fpu/math_err.c | 1 -
sysdeps/i386/fpu/w_fmod_compat.c | 15 ---------------
sysdeps/ieee754/dbl-64/e_fmod.c | 5 ++++-
sysdeps/mach/hurd/i386/libm.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 1 +
8 files changed, 12 insertions(+), 35 deletions(-)
delete mode 100644 sysdeps/i386/fpu/e_fmod.S
create mode 100644 sysdeps/i386/fpu/e_fmod.c
delete mode 100644 sysdeps/i386/fpu/math_err.c
delete mode 100644 sysdeps/i386/fpu/w_fmod_compat.c
diff --git a/sysdeps/i386/fpu/Versions b/sysdeps/i386/fpu/Versions
index a2eec371f1..d37bc1eae6 100644
--- a/sysdeps/i386/fpu/Versions
+++ b/sysdeps/i386/fpu/Versions
@@ -3,4 +3,8 @@ libm {
# functions used in inline functions or macros
__expl; __expm1l;
}
+ GLIBC_2.40 {
+ # No SVID compatible error handling.
+ fmod;
+ }
}
diff --git a/sysdeps/i386/fpu/e_fmod.S b/sysdeps/i386/fpu/e_fmod.S
deleted file mode 100644
index 86ac1bcfaf..0000000000
--- a/sysdeps/i386/fpu/e_fmod.S
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Public domain.
- */
-
-#include <machine/asm.h>
-#include <libm-alias-finite.h>
-
-ENTRY(__ieee754_fmod)
- fldl 12(%esp)
- fldl 4(%esp)
-1: fprem
- fstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- ret
-END (__ieee754_fmod)
-libm_alias_finite (__ieee754_fmod, __fmod)
diff --git a/sysdeps/i386/fpu/e_fmod.c b/sysdeps/i386/fpu/e_fmod.c
new file mode 100644
index 0000000000..3625758f97
--- /dev/null
+++ b/sysdeps/i386/fpu/e_fmod.c
@@ -0,0 +1,2 @@
+#define FMOD_VERSION GLIBC_2_40
+#include <sysdeps/ieee754/dbl-64/e_fmod.c>
diff --git a/sysdeps/i386/fpu/math_err.c b/sysdeps/i386/fpu/math_err.c
deleted file mode 100644
index 1cc8931700..0000000000
--- a/sysdeps/i386/fpu/math_err.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Not needed. */
diff --git a/sysdeps/i386/fpu/w_fmod_compat.c b/sysdeps/i386/fpu/w_fmod_compat.c
deleted file mode 100644
index 528bfc2a13..0000000000
--- a/sysdeps/i386/fpu/w_fmod_compat.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* i386 provides an optimized __ieee752_fmod. */
-#include <math-svid-compat.h>
-#ifdef SHARED
-# undef SHLIB_COMPAT
-# define SHLIB_COMPAT(a, b, c) 1
-# undef LIBM_SVID_COMPAT
-# define LIBM_SVID_COMPAT 1
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-# include <math/w_fmod_compat.c>
-libm_alias_double (__fmod_compat, fmod)
-#else
-#include <math-type-macros-double.h>
-#include <w_fmod_template.c>
-#endif
diff --git a/sysdeps/ieee754/dbl-64/e_fmod.c b/sysdeps/ieee754/dbl-64/e_fmod.c
index b33cfb1223..7651cd212a 100644
--- a/sysdeps/ieee754/dbl-64/e_fmod.c
+++ b/sysdeps/ieee754/dbl-64/e_fmod.c
@@ -175,7 +175,10 @@ __fmod (double x, double y)
strong_alias (__fmod, __ieee754_fmod)
libm_alias_finite (__ieee754_fmod, __fmod)
#if LIBM_SVID_COMPAT
-versioned_symbol (libm, __fmod, fmod, GLIBC_2_38);
+# ifndef FMOD_VERSION
+# define FMOD_VERSION GLIBC_2_38
+# endif
+versioned_symbol (libm, __fmod, fmod, FMOD_VERSION);
libm_alias_double_other (__fmod, fmod)
#else
libm_alias_double (__fmod, fmod)
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 8f40ddb150..30665f8b1a 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1181,3 +1181,4 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.40 fmod F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 5d89aaa08e..44932f111d 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1188,3 +1188,4 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.40 fmod F
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 04/15] i386: Use generic fmodf
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (2 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 03/15] i386: Use generic fmod Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 05/15] math: Fix i386 and m68k exp10 on static build Adhemerval Zanella
` (10 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The resulting performance is similiar (Ryzen 5900, gcc 13.2.1):
* sysdeps/i386/fpu/e_fmodf.S
"fmodf": {
"subnormals": {
"duration": 3.68732e+09,
"iterations": 2.2912e+08,
"max": 71.447,
"min": 15.836,
"mean": 16.0934
},
"normal": {
"duration": 3.75848e+09,
"iterations": 5.5296e+07,
"max": 273.208,
"min": 15.725,
"mean": 67.9702
},
"close-exponents": {
"duration": 3.69035e+09,
"iterations": 2.07872e+08,
"max": 64.454,
"min": 15.762,
"mean": 17.753
}
}
* master
"fmodf": {
"subnormals": {
"duration": 3.6863e+09,
"iterations": 2.23616e+08,
"max": 65.453,
"min": 16.243,
"mean": 16.485
},
"normal": {
"duration": 3.71129e+09,
"iterations": 5.3248e+07,
"max": 281.57,
"min": 16.169,
"mean": 69.6983
},
"close-exponents": {
"duration": 3.70274e+09,
"iterations": 2.03776e+08,
"max": 81.474,
"min": 16.206,
"mean": 18.1706
}
}
---
sysdeps/i386/fpu/Versions | 2 +-
sysdeps/i386/fpu/e_fmodf.S | 18 ------------------
sysdeps/i386/fpu/e_fmodf.c | 2 ++
sysdeps/i386/fpu/w_fmodf_compat.c | 15 ---------------
sysdeps/ieee754/flt-32/e_fmodf.c | 5 ++++-
sysdeps/mach/hurd/i386/libm.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 1 +
7 files changed, 9 insertions(+), 35 deletions(-)
delete mode 100644 sysdeps/i386/fpu/e_fmodf.S
create mode 100644 sysdeps/i386/fpu/e_fmodf.c
delete mode 100644 sysdeps/i386/fpu/w_fmodf_compat.c
diff --git a/sysdeps/i386/fpu/Versions b/sysdeps/i386/fpu/Versions
index d37bc1eae6..9509f9b7c7 100644
--- a/sysdeps/i386/fpu/Versions
+++ b/sysdeps/i386/fpu/Versions
@@ -5,6 +5,6 @@ libm {
}
GLIBC_2.40 {
# No SVID compatible error handling.
- fmod;
+ fmod; fmodf;
}
}
diff --git a/sysdeps/i386/fpu/e_fmodf.S b/sysdeps/i386/fpu/e_fmodf.S
deleted file mode 100644
index f73ce9da1e..0000000000
--- a/sysdeps/i386/fpu/e_fmodf.S
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Public domain.
- */
-
-#include <machine/asm.h>
-#include <libm-alias-finite.h>
-
-ENTRY(__ieee754_fmodf)
- flds 8(%esp)
- flds 4(%esp)
-1: fprem
- fstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- ret
-END(__ieee754_fmodf)
-libm_alias_finite (__ieee754_fmodf, __fmodf)
diff --git a/sysdeps/i386/fpu/e_fmodf.c b/sysdeps/i386/fpu/e_fmodf.c
new file mode 100644
index 0000000000..15a0f960bf
--- /dev/null
+++ b/sysdeps/i386/fpu/e_fmodf.c
@@ -0,0 +1,2 @@
+#define FMODF_VERSION GLIBC_2_40
+#include <sysdeps/ieee754/flt-32/e_fmodf.c>
diff --git a/sysdeps/i386/fpu/w_fmodf_compat.c b/sysdeps/i386/fpu/w_fmodf_compat.c
deleted file mode 100644
index 5a61693e51..0000000000
--- a/sysdeps/i386/fpu/w_fmodf_compat.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* i386 provides an optimized __ieee752_fmodf. */
-#include <math-svid-compat.h>
-#ifdef SHARED
-# undef SHLIB_COMPAT
-# define SHLIB_COMPAT(a, b, c) 1
-# undef LIBM_SVID_COMPAT
-# define LIBM_SVID_COMPAT 1
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-# include <math/w_fmodf_compat.c>
-libm_alias_float (__fmod_compat, fmod)
-#else
-#include <math-type-macros-float.h>
-#include <w_fmod_template.c>
-#endif
diff --git a/sysdeps/ieee754/flt-32/e_fmodf.c b/sysdeps/ieee754/flt-32/e_fmodf.c
index ef95c05800..78071df756 100644
--- a/sysdeps/ieee754/flt-32/e_fmodf.c
+++ b/sysdeps/ieee754/flt-32/e_fmodf.c
@@ -173,7 +173,10 @@ __fmodf (float x, float y)
}
strong_alias (__fmodf, __ieee754_fmodf)
#if LIBM_SVID_COMPAT
-versioned_symbol (libm, __fmodf, fmodf, GLIBC_2_38);
+# ifndef FMODF_VERSION
+# define FMODF_VERSION GLIBC_2_38
+# endif
+versioned_symbol (libm, __fmodf, fmodf, FMODF_VERSION);
libm_alias_float_other (__fmod, fmod)
#else
libm_alias_float (__fmod, fmod)
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 30665f8b1a..88e7538e51 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1182,3 +1182,4 @@ GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
GLIBC_2.40 fmod F
+GLIBC_2.40 fmodf F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 44932f111d..c99c60161d 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1189,3 +1189,4 @@ GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
GLIBC_2.40 fmod F
+GLIBC_2.40 fmodf F
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 05/15] math: Fix i386 and m68k exp10 on static build
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (3 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 04/15] i386: Use generic fmodf Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 06/15] i386: Use generic exp10 Adhemerval Zanella
` (9 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The commit 08ddd26814 removed the static exp10 on i386 and m68k with an
empty w_exp10.c (required for the ABIs that uses the newly
implementation). This patch fixes by adding the required symbols on the
arch-specific w_exp{f}_compat.c implementation.
Checked on i686-linux-gnu and with a build for m68k-linux-gnu.
---
math/Makefile | 4 +++-
sysdeps/i386/fpu/w_exp10_compat.c | 9 +++++++--
sysdeps/m68k/m680x0/fpu/w_exp10_compat.c | 9 +++++++--
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 964bf2be71..f1d210797d 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -367,7 +367,9 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
$(PYTHON) gen-libm-test.py -c $< -a auto-libm-test-out$* -C $@
-libm-test-funcs-auto-static =
+libm-test-funcs-auto-static = \
+ exp10 \
+ # libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
fmod \
# libm-test-funcs-noauto-static
diff --git a/sysdeps/i386/fpu/w_exp10_compat.c b/sysdeps/i386/fpu/w_exp10_compat.c
index b53455386e..49a0e03385 100644
--- a/sysdeps/i386/fpu/w_exp10_compat.c
+++ b/sysdeps/i386/fpu/w_exp10_compat.c
@@ -1,3 +1,8 @@
/* i386 provides an optimized __ieee754_exp10. */
-#define NO_COMPAT_NEEDED 1
-#include <math/w_exp10_compat.c>
+#ifdef SHARED
+# define NO_COMPAT_NEEDED 1
+# include <math/w_exp10_compat.c>
+#else
+# include <math-type-macros-double.h>
+# include <w_exp10_template.c>
+#endif
diff --git a/sysdeps/m68k/m680x0/fpu/w_exp10_compat.c b/sysdeps/m68k/m680x0/fpu/w_exp10_compat.c
index 0d3e718626..350f2e4b4d 100644
--- a/sysdeps/m68k/m680x0/fpu/w_exp10_compat.c
+++ b/sysdeps/m68k/m680x0/fpu/w_exp10_compat.c
@@ -1,3 +1,8 @@
/* m68k provides an optimized __ieee754_exp10. */
-#define NO_COMPAT_NEEDED 1
-#include <math/w_exp10_compat.c>
+#ifdef SHARED
+# define NO_COMPAT_NEEDED 1
+# include <math/w_exp10_compat.c>
+#else
+# include <math-type-macros-double.h>
+# include <w_exp10_template.c>
+#endif
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 06/15] i386: Use generic exp10
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (4 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 05/15] math: Fix i386 and m68k exp10 on static build Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 07/15] math: Fix isnanf128 static build Adhemerval Zanella
` (8 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The resulting performance is slight better (Ryzen 5900, gcc 13.2.1):
* master
"exp10": {
"": {
"duration": 3.70091e+09,
"iterations": 5.8534e+07,
"max": 91.279,
"min": 62.6225,
"mean": 63.2267
}
}
* patch
"exp10": {
"": {
"duration": 3.70793e+09,
"iterations": 6.328e+07,
"max": 259.592,
"min": 52.1145,
"mean": 58.5957
}
}
Checked on i686-linux-gnu.
---
sysdeps/i386/fpu/Versions | 1 +
sysdeps/i386/fpu/e_exp10.S | 51 -----------------------
sysdeps/i386/fpu/e_exp10.c | 2 +
sysdeps/i386/fpu/e_exp_data.c | 1 -
sysdeps/i386/fpu/w_exp10_compat.c | 8 ----
sysdeps/ieee754/dbl-64/e_exp10.c | 7 +++-
sysdeps/mach/hurd/i386/libm.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 1 +
8 files changed, 10 insertions(+), 62 deletions(-)
delete mode 100644 sysdeps/i386/fpu/e_exp10.S
create mode 100644 sysdeps/i386/fpu/e_exp10.c
delete mode 100644 sysdeps/i386/fpu/e_exp_data.c
delete mode 100644 sysdeps/i386/fpu/w_exp10_compat.c
diff --git a/sysdeps/i386/fpu/Versions b/sysdeps/i386/fpu/Versions
index 9509f9b7c7..7326f25583 100644
--- a/sysdeps/i386/fpu/Versions
+++ b/sysdeps/i386/fpu/Versions
@@ -5,6 +5,7 @@ libm {
}
GLIBC_2.40 {
# No SVID compatible error handling.
+ exp10;
fmod; fmodf;
}
}
diff --git a/sysdeps/i386/fpu/e_exp10.S b/sysdeps/i386/fpu/e_exp10.S
deleted file mode 100644
index 902f70b77f..0000000000
--- a/sysdeps/i386/fpu/e_exp10.S
+++ /dev/null
@@ -1,51 +0,0 @@
-
-#include <machine/asm.h>
-#include <i386-math-asm.h>
-#include <libm-alias-finite.h>
-
-DEFINE_DBL_MIN
-
-#ifdef PIC
-# define MO(op) op##@GOTOFF(%ecx)
-#else
-# define MO(op) op
-#endif
-
- .text
-/* 10^x = 2^(x * log2(10)) */
-ENTRY(__ieee754_exp10)
-#ifdef PIC
- LOAD_PIC_REG (cx)
-#endif
- fldl 4(%esp)
-/* I added the following ugly construct because exp(+-Inf) resulted
- in NaN. The ugliness results from the bright minds at Intel.
- For the i686 the code can be written better.
- -- drepper@cygnus.com. */
- fxam /* Is NaN or +-Inf? */
- fstsw %ax
- movb $0x45, %dh
- andb %ah, %dh
- cmpb $0x05, %dh
- je 1f /* Is +-Inf, jump. */
- fldl2t
- fmulp /* x * log2(10) */
- fld %st
- frndint /* int(x * log2(10)) */
- fsubr %st,%st(1) /* fract(x * log2(10)) */
- fxch
- f2xm1 /* 2^(fract(x * log2(10))) - 1 */
- fld1
- faddp /* 2^(fract(x * log2(10))) */
- fscale /* e^x */
- fstp %st(1)
- DBL_NARROW_EVAL_UFLOW_NONNEG_NAN
- ret
-
-1: testl $0x200, %eax /* Test sign. */
- jz 2f /* If positive, jump. */
- fstp %st
- fldz /* Set result to 0. */
-2: ret
-END (__ieee754_exp10)
-libm_alias_finite (__ieee754_exp10, __exp10)
diff --git a/sysdeps/i386/fpu/e_exp10.c b/sysdeps/i386/fpu/e_exp10.c
new file mode 100644
index 0000000000..340254fc6e
--- /dev/null
+++ b/sysdeps/i386/fpu/e_exp10.c
@@ -0,0 +1,2 @@
+#define EXP10_VERSION GLIBC_2_40
+#include <sysdeps/ieee754/dbl-64/e_exp10.c>
diff --git a/sysdeps/i386/fpu/e_exp_data.c b/sysdeps/i386/fpu/e_exp_data.c
deleted file mode 100644
index 1cc8931700..0000000000
--- a/sysdeps/i386/fpu/e_exp_data.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Not needed. */
diff --git a/sysdeps/i386/fpu/w_exp10_compat.c b/sysdeps/i386/fpu/w_exp10_compat.c
deleted file mode 100644
index 49a0e03385..0000000000
--- a/sysdeps/i386/fpu/w_exp10_compat.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* i386 provides an optimized __ieee754_exp10. */
-#ifdef SHARED
-# define NO_COMPAT_NEEDED 1
-# include <math/w_exp10_compat.c>
-#else
-# include <math-type-macros-double.h>
-# include <w_exp10_template.c>
-#endif
diff --git a/sysdeps/ieee754/dbl-64/e_exp10.c b/sysdeps/ieee754/dbl-64/e_exp10.c
index 225fc74c4c..c63b852f72 100644
--- a/sysdeps/ieee754/dbl-64/e_exp10.c
+++ b/sysdeps/ieee754/dbl-64/e_exp10.c
@@ -99,7 +99,7 @@ __exp10 (double x)
/* Reduce x: z = x * N / log10(2), k = round(z). */
double_t z = __exp_data.invlog10_2N * x;
- double_t kd;
+ double kd;
int64_t ki;
#if TOINT_INTRINSICS
kd = roundtoint (z);
@@ -147,7 +147,10 @@ __exp10 (double x)
strong_alias (__exp10, __ieee754_exp10)
libm_alias_finite (__ieee754_exp10, __exp10)
#if LIBM_SVID_COMPAT
-versioned_symbol (libm, __exp10, exp10, GLIBC_2_39);
+# ifndef EXP10_VERSION
+# define EXP10_VERSION GLIBC_2_39
+# endif
+versioned_symbol (libm, __exp10, exp10, EXP10_VERSION);
libm_alias_double_other (__exp10, exp10)
#else
libm_alias_double (__exp10, exp10)
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 88e7538e51..01c5633663 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1181,5 +1181,6 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.40 exp10 F
GLIBC_2.40 fmod F
GLIBC_2.40 fmodf F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index c99c60161d..3413cfdbe7 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1188,5 +1188,6 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.40 exp10 F
GLIBC_2.40 fmod F
GLIBC_2.40 fmodf F
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 07/15] math: Fix isnanf128 static build
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (5 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 06/15] i386: Use generic exp10 Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 08/15] math: Provided copysignf128 for static libm on alpha, s390, and sparcv9 Adhemerval Zanella
` (7 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
Some static implementation of float128 routines might call __isnanf128,
which is not provided by the static object.
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
sysdeps/ieee754/float128/float128_private.h | 2 +-
sysdeps/ieee754/float128/s_isnanf128.c | 4 ++++
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/math/Makefile b/math/Makefile
index f1d210797d..516fa72a26 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -372,6 +372,7 @@ libm-test-funcs-auto-static = \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
fmod \
+ isnan \
# libm-test-funcs-noauto-static
libm-test-funcs-narrow-static =
libm-test-funcs-all-static = $(libm-test-funcs-auto-static) $(libm-test-funcs-noauto-static)
diff --git a/sysdeps/ieee754/float128/float128_private.h b/sysdeps/ieee754/float128/float128_private.h
index 38a8bdd0fe..672bf3cccf 100644
--- a/sysdeps/ieee754/float128/float128_private.h
+++ b/sysdeps/ieee754/float128/float128_private.h
@@ -352,7 +352,7 @@
#define frexpl frexpf128
#define getpayloadl getpayloadf128
#define isinfl isinff128_do_not_use
-#define isnanl isnanf128_do_not_use
+#define isnanl isnanf128
#define ldexpl ldexpf128
#define llrintl llrintf128
#define llroundl llroundf128
diff --git a/sysdeps/ieee754/float128/s_isnanf128.c b/sysdeps/ieee754/float128/s_isnanf128.c
index 59f71533ce..b73a4e80d7 100644
--- a/sysdeps/ieee754/float128/s_isnanf128.c
+++ b/sysdeps/ieee754/float128/s_isnanf128.c
@@ -11,7 +11,11 @@
#include "../ldbl-128/s_isnanl.c"
#if !IS_IN (libm)
#include <float128-abi.h>
+#ifdef SHARED
hidden_ver (__isnanf128_impl, __isnanf128)
+#else
+strong_alias (__isnanf128_impl, __isnanf128)
+#endif
_weak_alias (__isnanf128_impl, isnanl)
versioned_symbol (libc, __isnanf128_impl, __isnanf128, GLIBC_2_34);
#if (SHLIB_COMPAT (libc, FLOAT128_VERSION_M, GLIBC_2_34))
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 08/15] math: Provided copysignf128 for static libm on alpha, s390, and sparcv9
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (6 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 07/15] math: Fix isnanf128 static build Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 09/15] math: Provide frexpf128 " Adhemerval Zanella
` (6 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
Checked with a static build for the affected ABIs.
---
math/Makefile | 1 +
sysdeps/ieee754/ldbl-64-128/s_copysignl.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 516fa72a26..61736159d1 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -371,6 +371,7 @@ libm-test-funcs-auto-static = \
exp10 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
+ copysign \
fmod \
isnan \
# libm-test-funcs-noauto-static
diff --git a/sysdeps/ieee754/ldbl-64-128/s_copysignl.c b/sysdeps/ieee754/ldbl-64-128/s_copysignl.c
index 11b42d04ba..80137847d3 100644
--- a/sysdeps/ieee754/ldbl-64-128/s_copysignl.c
+++ b/sysdeps/ieee754/ldbl-64-128/s_copysignl.c
@@ -1,10 +1,10 @@
#include <math_ldbl_opt.h>
#include <libm-alias-ldouble.h>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
# undef libm_alias_ldouble
# define libm_alias_ldouble(from, to)
#endif
#include <sysdeps/ieee754/ldbl-128/s_copysignl.c>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
long_double_symbol (libc, __copysignl, copysignl);
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 09/15] math: Provide frexpf128 for static libm on alpha, s390, and sparcv9
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (7 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 08/15] math: Provided copysignf128 for static libm on alpha, s390, and sparcv9 Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 10/15] math: Provide modf128 " Adhemerval Zanella
` (5 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
hecked with a build for the affected ABIs.
---
math/Makefile | 1 +
sysdeps/ieee754/ldbl-64-128/s_frexpl.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 61736159d1..655f6ed4e3 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -373,6 +373,7 @@ libm-test-funcs-auto-static = \
libm-test-funcs-noauto-static = \
copysign \
fmod \
+ frexp \
isnan \
# libm-test-funcs-noauto-static
libm-test-funcs-narrow-static =
diff --git a/sysdeps/ieee754/ldbl-64-128/s_frexpl.c b/sysdeps/ieee754/ldbl-64-128/s_frexpl.c
index 73ac41e40c..f5f7d349f7 100644
--- a/sysdeps/ieee754/ldbl-64-128/s_frexpl.c
+++ b/sysdeps/ieee754/ldbl-64-128/s_frexpl.c
@@ -1,10 +1,10 @@
#include <math_ldbl_opt.h>
#include <libm-alias-ldouble.h>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
# undef libm_alias_ldouble
# define libm_alias_ldouble(from, to)
#endif
#include <sysdeps/ieee754/ldbl-128/s_frexpl.c>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
long_double_symbol (libc, __frexpl, frexpl);
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 10/15] math: Provide modf128 for static libm on alpha, s390, and sparcv9
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (8 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 09/15] math: Provide frexpf128 " Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 11/15] math: Fix acos template for arguments greater than 1 Adhemerval Zanella
` (4 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
Checked with a build for the affected ABIs
---
math/Makefile | 1 +
sysdeps/ieee754/ldbl-64-128/s_modfl.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 655f6ed4e3..af1909d0c7 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -375,6 +375,7 @@ libm-test-funcs-noauto-static = \
fmod \
frexp \
isnan \
+ modf \
# libm-test-funcs-noauto-static
libm-test-funcs-narrow-static =
libm-test-funcs-all-static = $(libm-test-funcs-auto-static) $(libm-test-funcs-noauto-static)
diff --git a/sysdeps/ieee754/ldbl-64-128/s_modfl.c b/sysdeps/ieee754/ldbl-64-128/s_modfl.c
index 7d7aeae111..ba3d31334a 100644
--- a/sysdeps/ieee754/ldbl-64-128/s_modfl.c
+++ b/sysdeps/ieee754/ldbl-64-128/s_modfl.c
@@ -1,10 +1,10 @@
#include <math_ldbl_opt.h>
#include <libm-alias-ldouble.h>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
# undef libm_alias_ldouble
# define libm_alias_ldouble(from, to)
#endif
#include <sysdeps/ieee754/ldbl-128/s_modfl.c>
-#if IS_IN (libc)
+#if IS_IN (libc) && defined SHARED
long_double_symbol (libc, __modfl, modfl);
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 11/15] math: Fix acos template for arguments greater than 1
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (9 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 10/15] math: Provide modf128 " Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 17:14 ` Joseph Myers
2024-03-27 16:45 ` [PATCH 12/15] math: Fix log10 template for inputs less than 0 Adhemerval Zanella
` (3 subsequent siblings)
14 siblings, 1 reply; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The template is used by some ABsI for static build, and it fails set
the expected floating exceptions if the argument is outside of the
range (on x86_64 this triggers an overflow calculation in
__ieee754_acos).
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
math/w_acos_template.c | 9 +++++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index af1909d0c7..2b2683a9fa 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -368,6 +368,7 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
libm-test-funcs-auto-static = \
+ acos \
exp10 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
diff --git a/math/w_acos_template.c b/math/w_acos_template.c
index fe6d6c01db..f4b0e91ae1 100644
--- a/math/w_acos_template.c
+++ b/math/w_acos_template.c
@@ -30,8 +30,13 @@ FLOAT
M_DECL_FUNC (__acos) (FLOAT x)
{
if (__glibc_unlikely (isgreater (M_FABS (x), M_LIT (1.0))))
- /* Domain error: acos(|x|>1). */
- __set_errno (EDOM);
+ {
+ /* Domain error: acos(|x|>1). */
+ __feraiseexcept (FE_INVALID);
+ __set_errno (EDOM);
+ return __builtin_nanl ("");
+ }
+
return M_SUF (__ieee754_acos) (x);
}
declare_mgen_alias (__acos, acos)
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 12/15] math: Fix log10 template for inputs less than 0
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (10 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 11/15] math: Fix acos template for arguments greater than 1 Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 13/15] math: Fix log2 " Adhemerval Zanella
` (2 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The template is used by some ABIs for the static build, and it
fails to correct set the floating exceptions if the argument is
less than 0.
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
math/w_log10_template.c | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 2b2683a9fa..aa57171f77 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -370,6 +370,7 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
libm-test-funcs-auto-static = \
acos \
exp10 \
+ log10 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
copysign \
diff --git a/math/w_log10_template.c b/math/w_log10_template.c
index aca38d4e1e..cc7b503f01 100644
--- a/math/w_log10_template.c
+++ b/math/w_log10_template.c
@@ -32,11 +32,19 @@ M_DECL_FUNC (__log10) (FLOAT x)
if (__glibc_unlikely (islessequal (x, M_LIT (0.0))))
{
if (x == 0)
- /* Pole error: log10(0). */
- __set_errno (ERANGE);
+ {
+ /* Pole error: log10(0). */
+ __feraiseexcept (FE_DIVBYZERO);
+ __set_errno (ERANGE);
+ return -INFINITY;
+ }
else
- /* Domain error: log10(<0). */
- __set_errno (EDOM);
+ {
+ /* Domain error: log10(<0). */
+ __feraiseexcept (FE_INVALID);
+ __set_errno (EDOM);
+ return NAN;
+ }
}
return M_SUF (__ieee754_log10) (x);
}
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 13/15] math: Fix log2 template for inputs less than 0
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (11 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 12/15] math: Fix log10 template for inputs less than 0 Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 14/15] math: Fix y0 template for arguments less/equal " Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 15/15] math: Fix y1 " Adhemerval Zanella
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The template is used by some ABIs for the static build, and it
fails to correctly set the floating exceptions if the argument
is less than 0.
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
math/w_log2_template.c | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index aa57171f77..7391f2bd41 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -370,6 +370,7 @@ $(libm-test-c-narrow-obj): $(objpfx)libm-test%.c: libm-test%.inc \
libm-test-funcs-auto-static = \
acos \
exp10 \
+ log2 \
log10 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
diff --git a/math/w_log2_template.c b/math/w_log2_template.c
index f3ac0aab49..8933f2cd62 100644
--- a/math/w_log2_template.c
+++ b/math/w_log2_template.c
@@ -32,11 +32,19 @@ M_DECL_FUNC (__log2) (FLOAT x)
if (__glibc_unlikely (islessequal (x, M_LIT (0.0))))
{
if (x == 0)
- /* Pole error: log2(0). */
- __set_errno (ERANGE);
+ {
+ /* Pole error: log2(0). */
+ __feraiseexcept (FE_DIVBYZERO);
+ __set_errno (ERANGE);
+ return -INFINITY;
+ }
else
- /* Domain error: log2(<0). */
- __set_errno (EDOM);
+ {
+ /* Domain error: log2(<0). */
+ __feraiseexcept (FE_INVALID);
+ __set_errno (EDOM);
+ return NAN;
+ }
}
return M_SUF (__ieee754_log2) (x);
}
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 14/15] math: Fix y0 template for arguments less/equal than 0
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (12 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 13/15] math: Fix log2 " Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 15/15] math: Fix y1 " Adhemerval Zanella
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The template is used by some ABI for the static build, and it
fails to correct return if the argument is less/equal than 0
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
math/w_j0_template.c | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 7391f2bd41..5807e949d7 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -372,6 +372,7 @@ libm-test-funcs-auto-static = \
exp10 \
log2 \
log10 \
+ y0 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
copysign \
diff --git a/math/w_j0_template.c b/math/w_j0_template.c
index 1822fc8213..afa2056f96 100644
--- a/math/w_j0_template.c
+++ b/math/w_j0_template.c
@@ -39,11 +39,19 @@ M_DECL_FUNC (__y0) (FLOAT x)
if (__glibc_unlikely (islessequal (x, M_LIT (0.0))))
{
if (x < 0)
- /* Domain error: y0(x<0). */
- __set_errno (EDOM);
+ {
+ /* Domain error: y0(x<0). */
+ __feraiseexcept (FE_INVALID);
+ __set_errno (EDOM);
+ return NAN;
+ }
else if (x == 0)
- /* Pole error: y0(0). */
- __set_errno (ERANGE);
+ {
+ /* Pole error: y0(0). */
+ __feraiseexcept (FE_DIVBYZERO);
+ __set_errno (ERANGE);
+ return -INFINITY;
+ }
}
return M_SUF (__ieee754_y0) (x);
}
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 15/15] math: Fix y1 template for arguments less/equal than 0
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
` (13 preceding siblings ...)
2024-03-27 16:45 ` [PATCH 14/15] math: Fix y0 template for arguments less/equal " Adhemerval Zanella
@ 2024-03-27 16:45 ` Adhemerval Zanella
14 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2024-03-27 16:45 UTC (permalink / raw)
To: libc-alpha; +Cc: Joseph Myers, Florian Weimer, H . J . Lu
The template is used by some ABI for the static build, and it
fails to correct return if the argument is less/equal than 0
Checked on x86_64-linux-gnu.
---
math/Makefile | 1 +
math/w_j1_template.c | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/math/Makefile b/math/Makefile
index 5807e949d7..b58fca85e4 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -373,6 +373,7 @@ libm-test-funcs-auto-static = \
log2 \
log10 \
y0 \
+ y1 \
# libm-test-funcs-auto-static
libm-test-funcs-noauto-static = \
copysign \
diff --git a/math/w_j1_template.c b/math/w_j1_template.c
index 0a97cf9219..addcf4fac9 100644
--- a/math/w_j1_template.c
+++ b/math/w_j1_template.c
@@ -39,11 +39,19 @@ M_DECL_FUNC (__y1) (FLOAT x)
if (__glibc_unlikely (islessequal (x, M_LIT (0.0))))
{
if (x < 0)
- /* Domain error: y1(x<0). */
- __set_errno (EDOM);
+ {
+ /* Domain error: y1(x<0). */
+ __feraiseexcept (FE_INVALID);
+ __set_errno (EDOM);
+ return NAN;
+ }
else if (x == 0)
- /* Pole error: y1(0). */
- __set_errno (ERANGE);
+ {
+ /* Pole error: y1(0). */
+ __feraiseexcept (FE_DIVBYZERO);
+ __set_errno (ERANGE);
+ return -INFINITY;
+ }
}
return M_SUF (__ieee754_y1) (x);
}
--
2.34.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/15] math: Fix acos template for arguments greater than 1
2024-03-27 16:45 ` [PATCH 11/15] math: Fix acos template for arguments greater than 1 Adhemerval Zanella
@ 2024-03-27 17:14 ` Joseph Myers
2024-03-27 17:58 ` Adhemerval Zanella Netto
0 siblings, 1 reply; 20+ messages in thread
From: Joseph Myers @ 2024-03-27 17:14 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha, Florian Weimer, H . J . Lu
On Wed, 27 Mar 2024, Adhemerval Zanella wrote:
> The template is used by some ABsI for static build, and it fails set
> the expected floating exceptions if the argument is outside of the
> range (on x86_64 this triggers an overflow calculation in
> __ieee754_acos).
Patches 11 through 15 all seem incorrect; it's the responsibility of the
__ieee754_* functions to raise the correct exceptions, not of the
wrappers. Please make sure you don't have a compiler with a bug like
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95115 miscompiling those
__ieee754_* functions.
--
Joseph S. Myers
josmyers@redhat.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/15] math: Fix acos template for arguments greater than 1
2024-03-27 17:14 ` Joseph Myers
@ 2024-03-27 17:58 ` Adhemerval Zanella Netto
2024-03-27 19:04 ` Joseph Myers
0 siblings, 1 reply; 20+ messages in thread
From: Adhemerval Zanella Netto @ 2024-03-27 17:58 UTC (permalink / raw)
To: Joseph Myers; +Cc: libc-alpha, Florian Weimer, H . J . Lu
On 27/03/24 14:14, Joseph Myers wrote:
> On Wed, 27 Mar 2024, Adhemerval Zanella wrote:
>
>> The template is used by some ABsI for static build, and it fails set
>> the expected floating exceptions if the argument is outside of the
>> range (on x86_64 this triggers an overflow calculation in
>> __ieee754_acos).
>
> Patches 11 through 15 all seem incorrect; it's the responsibility of the
> __ieee754_* functions to raise the correct exceptions, not of the
> wrappers. Please make sure you don't have a compiler with a bug like
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95115 miscompiling those
> __ieee754_* functions.
>
The failures are both:
math/test-float64x-acos-static
math/test-ldouble-acos-static
$ cat math/test-ldouble-acos-static.out
testing long double (without inline functions)
Failure: acos (max_value): Exception "Overflow" set
Failure: acos (-max_value): Exception "Overflow" set
Failure: acos_downward (max_value): Exception "Overflow" set
Failure: acos_downward (-max_value): Exception "Overflow" set
Failure: acos_towardzero (max_value): Exception "Overflow" set
Failure: acos_towardzero (-max_value): Exception "Overflow" set
Failure: acos_upward (max_value): Exception "Overflow" set
Failure: acos_upward (-max_value): Exception "Overflow" set
Test suite completed:
452 test cases plus 448 tests for exception flags and
448 tests for errno executed.
8 errors occurred.
And I think it is unrelated to gcc PR95115 because x86_64/i686 will use
and specific sysdeps/i386/fpu/e_acosl.c that explicit does not handle this
input case for overflow exceptions. For shared build this case is
handle by w_acosl_compat.c:
if (__builtin_expect (isgreater (fabsl (x), 1.0L), 0)
&& _LIB_VERSION != _IEEE_)
{
/* acos(|x|>1) */
feraiseexcept (FE_INVALID);
return __kernel_standard_l (x, x, 201);
}
And that's why I though following the same logic on template would be
better. But I think maybe we should fix on x86_64 implementation instead.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/15] math: Fix acos template for arguments greater than 1
2024-03-27 17:58 ` Adhemerval Zanella Netto
@ 2024-03-27 19:04 ` Joseph Myers
2024-03-27 19:31 ` Adhemerval Zanella Netto
0 siblings, 1 reply; 20+ messages in thread
From: Joseph Myers @ 2024-03-27 19:04 UTC (permalink / raw)
To: Adhemerval Zanella Netto; +Cc: libc-alpha, Florian Weimer, H . J . Lu
On Wed, 27 Mar 2024, Adhemerval Zanella Netto wrote:
> And I think it is unrelated to gcc PR95115 because x86_64/i686 will use
> and specific sysdeps/i386/fpu/e_acosl.c that explicit does not handle this
> input case for overflow exceptions. For shared build this case is
> handle by w_acosl_compat.c:
>
> if (__builtin_expect (isgreater (fabsl (x), 1.0L), 0)
> && _LIB_VERSION != _IEEE_)
> {
> /* acos(|x|>1) */
> feraiseexcept (FE_INVALID);
> return __kernel_standard_l (x, x, 201);
> }
The compat code is dealing with the possibility of SVID exceptions, which
isn't relevant here.
> And that's why I though following the same logic on template would be
> better. But I think maybe we should fix on x86_64 implementation instead.
Yes, we should fix the x86_64 implementation.
Such issues in dbl-64, flt-32 or ldbl-128 sources would largely have been
fixed (modulo compiler bugs) when we started adding new architectures
after new architectures stopped using the compat wrappers - but any issues
for ldbl-128ibm, ldbl-96 or architecture-specific sources wouldn't have
been detected then.
--
Joseph S. Myers
josmyers@redhat.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/15] math: Fix acos template for arguments greater than 1
2024-03-27 19:04 ` Joseph Myers
@ 2024-03-27 19:31 ` Adhemerval Zanella Netto
0 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella Netto @ 2024-03-27 19:31 UTC (permalink / raw)
To: Joseph Myers; +Cc: libc-alpha, Florian Weimer, H . J . Lu
On 27/03/24 16:04, Joseph Myers wrote:
> On Wed, 27 Mar 2024, Adhemerval Zanella Netto wrote:
>
>> And I think it is unrelated to gcc PR95115 because x86_64/i686 will use
>> and specific sysdeps/i386/fpu/e_acosl.c that explicit does not handle this
>> input case for overflow exceptions. For shared build this case is
>> handle by w_acosl_compat.c:
>>
>> if (__builtin_expect (isgreater (fabsl (x), 1.0L), 0)
>> && _LIB_VERSION != _IEEE_)
>> {
>> /* acos(|x|>1) */
>> feraiseexcept (FE_INVALID);
>> return __kernel_standard_l (x, x, 201);
>> }
>
> The compat code is dealing with the possibility of SVID exceptions, which
> isn't relevant here.
I meant that __ieee754_acosl in being called in both code paths, but
the compat code returns early without calling __ieee754_acosl for the
possible problematic code path.
>
>> And that's why I though following the same logic on template would be
>> better. But I think maybe we should fix on x86_64 implementation instead.
>
> Yes, we should fix the x86_64 implementation.
>
> Such issues in dbl-64, flt-32 or ldbl-128 sources would largely have been
> fixed (modulo compiler bugs) when we started adding new architectures
> after new architectures stopped using the compat wrappers - but any issues
> for ldbl-128ibm, ldbl-96 or architecture-specific sources wouldn't have
> been detected then.
>
I will drop this change and rather focus on the original issues on missing
symbols. I will open some bug against the x86 implementation so we keep
track of these issues with static linkage.
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2024-03-27 19:31 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-27 16:45 [PATCH 00/15] Fix some libm static issues Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 01/15] math: Add support for auto static math tests Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 02/15] math: Fix i386 and m68k fmod/fmodf on static build (BZ 31488) Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 03/15] i386: Use generic fmod Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 04/15] i386: Use generic fmodf Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 05/15] math: Fix i386 and m68k exp10 on static build Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 06/15] i386: Use generic exp10 Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 07/15] math: Fix isnanf128 static build Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 08/15] math: Provided copysignf128 for static libm on alpha, s390, and sparcv9 Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 09/15] math: Provide frexpf128 " Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 10/15] math: Provide modf128 " Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 11/15] math: Fix acos template for arguments greater than 1 Adhemerval Zanella
2024-03-27 17:14 ` Joseph Myers
2024-03-27 17:58 ` Adhemerval Zanella Netto
2024-03-27 19:04 ` Joseph Myers
2024-03-27 19:31 ` Adhemerval Zanella Netto
2024-03-27 16:45 ` [PATCH 12/15] math: Fix log10 template for inputs less than 0 Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 13/15] math: Fix log2 " Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 14/15] math: Fix y0 template for arguments less/equal " Adhemerval Zanella
2024-03-27 16:45 ` [PATCH 15/15] math: Fix y1 " Adhemerval Zanella
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).