From 6f7c009282a5f7129e359c9ba8556e7e3ac229ec Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 12 Dec 2017 23:34:05 +0000 Subject: [PATCH] Add sysdeps/ieee754/soft-fp. The default sysdeps/ieee754 fma implementations rely on exceptions and rounding modes to achieve correct results through internal use of round-to-odd. Thus, glibc configurations without support for exceptions and rounding modes instead need to use implementations of fma based on soft-fp. At present, this is achieved via having implementation files in soft-fp/ that are #included by sysdeps files for each glibc configuration that needs them. In general this means such a configuration has its own s_fma.c and s_fmaf.c. TS 18661-1 adds functions that do an operation (+ - * / sqrt fma) on arguments wider than the return type, with a single rounding of the infinite-precision result to that return type. These are also naturally implemented using round-to-odd on platforms with hardware support for rounding modes and exceptions but lacking hardware support for these narrowing operations themselves. (Platforms that have direct hardware support for such narrowing operations include at least ia64, and Power ISA 2.07 or later, which I think means POWER8 or later.) So adding the remaining TS 18661-1 functions would mean at least six narrowing function implementations (fadd fsub fmul fdiv ffma fsqrt), with aliases for other types and further implementations in some configurations, that need to be overridden for configurations lacking hardware exceptions and rounding modes. Requiring all such configurations (currently seven of them) to have their own source files for all those functions seems undesirable. Thus, this patch adds a directory sysdeps/ieee754/soft-fp to contain libm function implementations based on soft-fp. This directory is then used via Implies from all the configurations that need it, so no more files need adding to every such configuration when adding more functions with soft-fp implementations. A configuration can still selectively #include a particular file from this directory if desired; thus, the MIPS #include of the fmal implementation is retained, since that's appropriate even for hard float (because long double is always implementated in software for MIPS64, so the soft-fp implementation of fmal is better than the ldbl-128 one). This also provides additional motivation for my recent patch removing --with-fp / --without-fp: previously there was no need for correct use of --without-fp for no-FPU ARM or SH3, and now we have autodetection nofpu/ sysdeps directories can be used by this patch for those configurations without imposing any new requirements on how glibc is configured. (The mips64/*/fpu/s_fma.c files added by this patch are needed to keep the dbl-64 version of fma for double, rather than the ldbl-128 one, used in that case.) Tested with build-many-glibcs.py that installed stripped shared libraries are unchanged by this patch. * soft-fp/fmadf4.c: Move to .... * sysdeps/ieee754/soft-fp/s_fma.c: ... here. * soft-fp/fmasf4.c: Move to .... * sysdeps/ieee754/soft-fp/s_fmaf.c: ... here. * soft-fp/fmatf4.c: Move to .... * sysdeps/ieee754/soft-fp/s_fmal.c: ... here. * sysdeps/ieee754/soft-fp/Makefile: New file. * sysdeps/arm/preconfigure.ac: Define with_fp_cond. * sysdeps/arm/preconfigure: Regenerated. * sysdeps/arm/nofpu/Implies: New file. * sysdeps/arm/s_fma.c: Remove file. * sysdeps/arm/s_fmaf.c: Likewise. * sysdeps/m68k/coldfire/nofpu/Implies: New file. * sysdeps/m68k/coldfire/nofpu/s_fma.c: Remove file. * sysdeps/m68k/coldfire/nofpu/s_fmaf.c: Likewise. * sysdeps/microblaze/Implies: Add ieee754/soft-fp. * sysdeps/microblaze/s_fma.c: Remove file. * sysdeps/microblaze/s_fmaf.c: Likewise. * sysdeps/mips/mips32/nofpu/Implies: New file. * sysdeps/mips/mips64/n32/fpu/s_fma.c: Likewise. * sysdeps/mips/mips64/n32/nofpu/Implies: Likewise. * sysdeps/mips/mips64/n64/fpu/s_fma.c: Likewise. * sysdeps/mips/mips64/n64/nofpu/Implies: Likewise. * sysdeps/mips/ieee754/s_fma.c: Remove file. * sysdeps/mips/ieee754/s_fmaf.c: Likewise. * sysdeps/mips/ieee754/s_fmal.c: Update include for move of fmal implementation. * sysdeps/nios2/Implies: Add ieee754/soft-fp. * sysdeps/nios2/s_fma.c: Remove file. * sysdeps/nios2/s_fmaf.c: Likewise. * sysdeps/sh/nofpu/Implies: New file. * sysdeps/sh/s_fma.c: Remove file. * sysdeps/sh/s_fmaf.c: Likewise. * sysdeps/tile/Implies: Add ieee754/soft-fp. * sysdeps/tile/s_fma.c: Remove file. * sysdeps/tile/s_fmaf.c: Likewise. --- ChangeLog | 39 +++++++++++++++++++ sysdeps/arm/nofpu/Implies | 1 + sysdeps/arm/preconfigure | 1 + sysdeps/arm/preconfigure.ac | 1 + sysdeps/arm/s_fma.c | 5 --- sysdeps/arm/s_fmaf.c | 5 --- sysdeps/ieee754/soft-fp/Makefile | 3 ++ .../ieee754/soft-fp/s_fma.c | 0 .../ieee754/soft-fp/s_fmaf.c | 0 .../ieee754/soft-fp/s_fmal.c | 0 sysdeps/m68k/coldfire/nofpu/Implies | 1 + sysdeps/m68k/coldfire/nofpu/s_fma.c | 1 - sysdeps/m68k/coldfire/nofpu/s_fmaf.c | 1 - sysdeps/microblaze/Implies | 1 + sysdeps/microblaze/s_fma.c | 1 - sysdeps/microblaze/s_fmaf.c | 1 - sysdeps/mips/ieee754/s_fma.c | 5 --- sysdeps/mips/ieee754/s_fmaf.c | 5 --- sysdeps/mips/ieee754/s_fmal.c | 2 +- sysdeps/mips/mips32/nofpu/Implies | 1 + sysdeps/mips/mips64/n32/fpu/s_fma.c | 1 + sysdeps/mips/mips64/n32/nofpu/Implies | 1 + sysdeps/mips/mips64/n64/fpu/s_fma.c | 1 + sysdeps/mips/mips64/n64/nofpu/Implies | 1 + sysdeps/nios2/Implies | 1 + sysdeps/nios2/s_fma.c | 1 - sysdeps/nios2/s_fmaf.c | 1 - sysdeps/sh/nofpu/Implies | 1 + sysdeps/sh/s_fma.c | 5 --- sysdeps/sh/s_fmaf.c | 5 --- sysdeps/tile/Implies | 1 + sysdeps/tile/s_fma.c | 1 - sysdeps/tile/s_fmaf.c | 1 - 33 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 sysdeps/arm/nofpu/Implies delete mode 100644 sysdeps/arm/s_fma.c delete mode 100644 sysdeps/arm/s_fmaf.c create mode 100644 sysdeps/ieee754/soft-fp/Makefile rename soft-fp/fmadf4.c => sysdeps/ieee754/soft-fp/s_fma.c (100%) rename soft-fp/fmasf4.c => sysdeps/ieee754/soft-fp/s_fmaf.c (100%) rename soft-fp/fmatf4.c => sysdeps/ieee754/soft-fp/s_fmal.c (100%) create mode 100644 sysdeps/m68k/coldfire/nofpu/Implies delete mode 100644 sysdeps/m68k/coldfire/nofpu/s_fma.c delete mode 100644 sysdeps/m68k/coldfire/nofpu/s_fmaf.c delete mode 100644 sysdeps/microblaze/s_fma.c delete mode 100644 sysdeps/microblaze/s_fmaf.c delete mode 100644 sysdeps/mips/ieee754/s_fma.c delete mode 100644 sysdeps/mips/ieee754/s_fmaf.c create mode 100644 sysdeps/mips/mips32/nofpu/Implies create mode 100644 sysdeps/mips/mips64/n32/fpu/s_fma.c create mode 100644 sysdeps/mips/mips64/n32/nofpu/Implies create mode 100644 sysdeps/mips/mips64/n64/fpu/s_fma.c create mode 100644 sysdeps/mips/mips64/n64/nofpu/Implies delete mode 100644 sysdeps/nios2/s_fma.c delete mode 100644 sysdeps/nios2/s_fmaf.c create mode 100644 sysdeps/sh/nofpu/Implies delete mode 100644 sysdeps/sh/s_fma.c delete mode 100644 sysdeps/sh/s_fmaf.c delete mode 100644 sysdeps/tile/s_fma.c delete mode 100644 sysdeps/tile/s_fmaf.c diff --git a/ChangeLog b/ChangeLog index 2ceae53f87..f560b2a832 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,42 @@ +2017-12-12 Joseph Myers + + * soft-fp/fmadf4.c: Move to .... + * sysdeps/ieee754/soft-fp/s_fma.c: ... here. + * soft-fp/fmasf4.c: Move to .... + * sysdeps/ieee754/soft-fp/s_fmaf.c: ... here. + * soft-fp/fmatf4.c: Move to .... + * sysdeps/ieee754/soft-fp/s_fmal.c: ... here. + * sysdeps/ieee754/soft-fp/Makefile: New file. + * sysdeps/arm/preconfigure.ac: Define with_fp_cond. + * sysdeps/arm/preconfigure: Regenerated. + * sysdeps/arm/nofpu/Implies: New file. + * sysdeps/arm/s_fma.c: Remove file. + * sysdeps/arm/s_fmaf.c: Likewise. + * sysdeps/m68k/coldfire/nofpu/Implies: New file. + * sysdeps/m68k/coldfire/nofpu/s_fma.c: Remove file. + * sysdeps/m68k/coldfire/nofpu/s_fmaf.c: Likewise. + * sysdeps/microblaze/Implies: Add ieee754/soft-fp. + * sysdeps/microblaze/s_fma.c: Remove file. + * sysdeps/microblaze/s_fmaf.c: Likewise. + * sysdeps/mips/mips32/nofpu/Implies: New file. + * sysdeps/mips/mips64/n32/fpu/s_fma.c: Likewise. + * sysdeps/mips/mips64/n32/nofpu/Implies: Likewise. + * sysdeps/mips/mips64/n64/fpu/s_fma.c: Likewise. + * sysdeps/mips/mips64/n64/nofpu/Implies: Likewise. + * sysdeps/mips/ieee754/s_fma.c: Remove file. + * sysdeps/mips/ieee754/s_fmaf.c: Likewise. + * sysdeps/mips/ieee754/s_fmal.c: Update include for move of fmal + implementation. + * sysdeps/nios2/Implies: Add ieee754/soft-fp. + * sysdeps/nios2/s_fma.c: Remove file. + * sysdeps/nios2/s_fmaf.c: Likewise. + * sysdeps/sh/nofpu/Implies: New file. + * sysdeps/sh/s_fma.c: Remove file. + * sysdeps/sh/s_fmaf.c: Likewise. + * sysdeps/tile/Implies: Add ieee754/soft-fp. + * sysdeps/tile/s_fma.c: Remove file. + * sysdeps/tile/s_fmaf.c: Likewise. + 2017-12-12 H.J. Lu * sysdeps/x86_64/fpu/multiarch/Makefile (libm-sysdep_routines): diff --git a/sysdeps/arm/nofpu/Implies b/sysdeps/arm/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/arm/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/arm/preconfigure b/sysdeps/arm/preconfigure index 33e9501c4f..d803256d9f 100644 --- a/sysdeps/arm/preconfigure +++ b/sysdeps/arm/preconfigure @@ -52,4 +52,5 @@ $as_echo "$as_me: WARNING: arm/preconfigure: Did not find ARM architecture type; esac machine=arm/$machine + with_fp_cond="!defined __SOFTFP__" esac diff --git a/sysdeps/arm/preconfigure.ac b/sysdeps/arm/preconfigure.ac index 20de5bcfea..43d014031d 100644 --- a/sysdeps/arm/preconfigure.ac +++ b/sysdeps/arm/preconfigure.ac @@ -47,4 +47,5 @@ arm*) esac machine=arm/$machine + with_fp_cond="!defined __SOFTFP__" esac diff --git a/sysdeps/arm/s_fma.c b/sysdeps/arm/s_fma.c deleted file mode 100644 index dc4e27bfc1..0000000000 --- a/sysdeps/arm/s_fma.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __SOFTFP__ -# include -#else -# include -#endif diff --git a/sysdeps/arm/s_fmaf.c b/sysdeps/arm/s_fmaf.c deleted file mode 100644 index 550d8b85d3..0000000000 --- a/sysdeps/arm/s_fmaf.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __SOFTFP__ -# include -#else -# include -#endif diff --git a/sysdeps/ieee754/soft-fp/Makefile b/sysdeps/ieee754/soft-fp/Makefile new file mode 100644 index 0000000000..ada13e8b70 --- /dev/null +++ b/sysdeps/ieee754/soft-fp/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),math) +CPPFLAGS += -I../soft-fp +endif diff --git a/soft-fp/fmadf4.c b/sysdeps/ieee754/soft-fp/s_fma.c similarity index 100% rename from soft-fp/fmadf4.c rename to sysdeps/ieee754/soft-fp/s_fma.c diff --git a/soft-fp/fmasf4.c b/sysdeps/ieee754/soft-fp/s_fmaf.c similarity index 100% rename from soft-fp/fmasf4.c rename to sysdeps/ieee754/soft-fp/s_fmaf.c diff --git a/soft-fp/fmatf4.c b/sysdeps/ieee754/soft-fp/s_fmal.c similarity index 100% rename from soft-fp/fmatf4.c rename to sysdeps/ieee754/soft-fp/s_fmal.c diff --git a/sysdeps/m68k/coldfire/nofpu/Implies b/sysdeps/m68k/coldfire/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/m68k/coldfire/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/m68k/coldfire/nofpu/s_fma.c b/sysdeps/m68k/coldfire/nofpu/s_fma.c deleted file mode 100644 index d9613fa67c..0000000000 --- a/sysdeps/m68k/coldfire/nofpu/s_fma.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/m68k/coldfire/nofpu/s_fmaf.c b/sysdeps/m68k/coldfire/nofpu/s_fmaf.c deleted file mode 100644 index aa5c9b2d91..0000000000 --- a/sysdeps/m68k/coldfire/nofpu/s_fmaf.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/microblaze/Implies b/sysdeps/microblaze/Implies index 73c766c52e..746b21ad66 100644 --- a/sysdeps/microblaze/Implies +++ b/sysdeps/microblaze/Implies @@ -1,4 +1,5 @@ wordsize-32 # MicroBlaze uses IEEE 754 floating point. +ieee754/soft-fp ieee754/flt-32 ieee754/dbl-64 diff --git a/sysdeps/microblaze/s_fma.c b/sysdeps/microblaze/s_fma.c deleted file mode 100644 index d9613fa67c..0000000000 --- a/sysdeps/microblaze/s_fma.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/microblaze/s_fmaf.c b/sysdeps/microblaze/s_fmaf.c deleted file mode 100644 index aa5c9b2d91..0000000000 --- a/sysdeps/microblaze/s_fmaf.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/mips/ieee754/s_fma.c b/sysdeps/mips/ieee754/s_fma.c deleted file mode 100644 index 574141416b..0000000000 --- a/sysdeps/mips/ieee754/s_fma.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __mips_hard_float -# include -#else -# include -#endif diff --git a/sysdeps/mips/ieee754/s_fmaf.c b/sysdeps/mips/ieee754/s_fmaf.c deleted file mode 100644 index 30bcdae620..0000000000 --- a/sysdeps/mips/ieee754/s_fmaf.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __mips_hard_float -# include -#else -# include -#endif diff --git a/sysdeps/mips/ieee754/s_fmal.c b/sysdeps/mips/ieee754/s_fmal.c index 6b83e914fe..c52331967d 100644 --- a/sysdeps/mips/ieee754/s_fmal.c +++ b/sysdeps/mips/ieee754/s_fmal.c @@ -4,4 +4,4 @@ # error "long double fma being compiled for o32 ABI" #endif -#include +#include diff --git a/sysdeps/mips/mips32/nofpu/Implies b/sysdeps/mips/mips32/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/mips/mips32/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/mips/mips64/n32/fpu/s_fma.c b/sysdeps/mips/mips64/n32/fpu/s_fma.c new file mode 100644 index 0000000000..b61fa643de --- /dev/null +++ b/sysdeps/mips/mips64/n32/fpu/s_fma.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/mips/mips64/n32/nofpu/Implies b/sysdeps/mips/mips64/n32/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/mips/mips64/n32/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/mips/mips64/n64/fpu/s_fma.c b/sysdeps/mips/mips64/n64/fpu/s_fma.c new file mode 100644 index 0000000000..b61fa643de --- /dev/null +++ b/sysdeps/mips/mips64/n64/fpu/s_fma.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/mips/mips64/n64/nofpu/Implies b/sysdeps/mips/mips64/n64/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/mips/mips64/n64/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/nios2/Implies b/sysdeps/nios2/Implies index 387a0ca052..7d69983412 100644 --- a/sysdeps/nios2/Implies +++ b/sysdeps/nios2/Implies @@ -1,3 +1,4 @@ wordsize-32 +ieee754/soft-fp ieee754/dbl-64 ieee754/flt-32 diff --git a/sysdeps/nios2/s_fma.c b/sysdeps/nios2/s_fma.c deleted file mode 100644 index d9613fa67c..0000000000 --- a/sysdeps/nios2/s_fma.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/nios2/s_fmaf.c b/sysdeps/nios2/s_fmaf.c deleted file mode 100644 index aa5c9b2d91..0000000000 --- a/sysdeps/nios2/s_fmaf.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/sh/nofpu/Implies b/sysdeps/sh/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/sh/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/sh/s_fma.c b/sysdeps/sh/s_fma.c deleted file mode 100644 index d92438d448..0000000000 --- a/sysdeps/sh/s_fma.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __SH_FPU_ANY__ -# include -#else -# include -#endif diff --git a/sysdeps/sh/s_fmaf.c b/sysdeps/sh/s_fmaf.c deleted file mode 100644 index 3b811ae6da..0000000000 --- a/sysdeps/sh/s_fmaf.c +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef __SH_FPU_ANY__ -# include -#else -# include -#endif diff --git a/sysdeps/tile/Implies b/sysdeps/tile/Implies index 5b29b26128..1cbc053905 100644 --- a/sysdeps/tile/Implies +++ b/sysdeps/tile/Implies @@ -1,2 +1,3 @@ +ieee754/soft-fp ieee754/dbl-64 ieee754/flt-32 diff --git a/sysdeps/tile/s_fma.c b/sysdeps/tile/s_fma.c deleted file mode 100644 index d9613fa67c..0000000000 --- a/sysdeps/tile/s_fma.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/tile/s_fmaf.c b/sysdeps/tile/s_fmaf.c deleted file mode 100644 index aa5c9b2d91..0000000000 --- a/sysdeps/tile/s_fmaf.c +++ /dev/null @@ -1 +0,0 @@ -#include