unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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 related	[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:32 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).