From: Joseph Myers Date: Wed, 15 Sep 2021 22:57:35 +0000 (+0000) Subject: Redirect fma calls to __fma in libm X-Git-Tag: glibc-2.35~518 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4b6574a6f63b6c766f27be4a0b4c9376a35a4bd5;p=thirdparty%2Fglibc.git Redirect fma calls to __fma in libm include/math.h has a mechanism to redirect internal calls to various libm functions, that can often be inlined by the compiler, to call non-exported __* names for those functions in the case when the calls aren't inlined, with the redirection being disabled when NO_MATH_REDIRECT. Add fma to the functions to which this mechanism is applied. At present, libm-internal fma calls (generally to __builtin_fma* functions) are only done when it's known the call will be inlined, with alternative code not relying on an fma operation being used in the caller otherwise. This patch is in preparation for adding the TS 18661 / C2X narrowing fma functions to glibc; it will be natural for the narrowing function implementations to call the underlying fma functions unconditionally, with this either being inlined or resulting in an __fma* call. (Using two levels of round-to-odd computation like that, in the case where there isn't an fma hardware instruction, isn't optimal but is certainly a lot simpler for the initial implementation than writing different narrowing fma implementations for all the various pairs of formats.) Tested with build-many-glibcs.py that installed stripped shared libraries are unchanged by the patch (using to fix installed library stripping in build-many-glibcs.py). Also tested for x86_64. --- diff --git a/include/math.h b/include/math.h index b4772d3d3b7..fa11a710a6c 100644 --- a/include/math.h +++ b/include/math.h @@ -155,6 +155,7 @@ fabsf128 (_Float128 x) # endif # define MATH_REDIRECT_UNARY_ARGS(TYPE) TYPE # define MATH_REDIRECT_BINARY_ARGS(TYPE) TYPE, TYPE +# define MATH_REDIRECT_TERNARY_ARGS(TYPE) TYPE, TYPE, TYPE MATH_REDIRECT (sqrt, "__ieee754_", MATH_REDIRECT_UNARY_ARGS) MATH_REDIRECT (ceil, "__", MATH_REDIRECT_UNARY_ARGS) MATH_REDIRECT (floor, "__", MATH_REDIRECT_UNARY_ARGS) @@ -163,6 +164,7 @@ MATH_REDIRECT (rint, "__", MATH_REDIRECT_UNARY_ARGS) MATH_REDIRECT (trunc, "__", MATH_REDIRECT_UNARY_ARGS) MATH_REDIRECT (round, "__", MATH_REDIRECT_UNARY_ARGS) MATH_REDIRECT (copysign, "__", MATH_REDIRECT_BINARY_ARGS) +MATH_REDIRECT (fma, "__", MATH_REDIRECT_TERNARY_ARGS) # endif # endif diff --git a/math/s_fma.c b/math/s_fma.c index 5b0afde6b84..2dc5c5d2cb0 100644 --- a/math/s_fma.c +++ b/math/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include diff --git a/math/s_fmaf.c b/math/s_fmaf.c index 401f0fc5aef..f1ba0a0c49c 100644 --- a/math/s_fmaf.c +++ b/math/s_fmaf.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include diff --git a/math/s_fmal.c b/math/s_fmal.c index 6b13ea1d5fb..47a68ed235f 100644 --- a/math/s_fmal.c +++ b/math/s_fmal.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include diff --git a/sysdeps/i386/i686/multiarch/s_fma.c b/sysdeps/i386/i686/multiarch/s_fma.c index 7d66aaef7a5..229f6c6526e 100644 --- a/sysdeps/i386/i686/multiarch/s_fma.c +++ b/sysdeps/i386/i686/multiarch/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include diff --git a/sysdeps/i386/i686/multiarch/s_fmaf.c b/sysdeps/i386/i686/multiarch/s_fmaf.c index b8394d05d0c..97123235f9b 100644 --- a/sysdeps/i386/i686/multiarch/s_fmaf.c +++ b/sysdeps/i386/i686/multiarch/s_fmaf.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c index 55ccf46c9a2..aa4336387a8 100644 --- a/sysdeps/ieee754/dbl-64/s_fma.c +++ b/sysdeps/ieee754/dbl-64/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/dbl-64/s_fmaf.c b/sysdeps/ieee754/dbl-64/s_fmaf.c index 2b4da8b7638..2eb9a50d94b 100644 --- a/sysdeps/ieee754/dbl-64/s_fmaf.c +++ b/sysdeps/ieee754/dbl-64/s_fmaf.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/float128/s_fmaf128.c b/sysdeps/ieee754/float128/s_fmaf128.c index 6497895c8d5..a900af6e3c7 100644 --- a/sysdeps/ieee754/float128/s_fmaf128.c +++ b/sysdeps/ieee754/float128/s_fmaf128.c @@ -1,2 +1,3 @@ +#define NO_MATH_REDIRECT #include #include "../ldbl-128/s_fmal.c" diff --git a/sysdeps/ieee754/ldbl-128/s_fma.c b/sysdeps/ieee754/ldbl-128/s_fma.c index 47673da3d78..4795e717e8a 100644 --- a/sysdeps/ieee754/ldbl-128/s_fma.c +++ b/sysdeps/ieee754/ldbl-128/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/ldbl-128/s_fmal.c b/sysdeps/ieee754/ldbl-128/s_fmal.c index 0f5f5f1d74f..aff9efca8c3 100644 --- a/sysdeps/ieee754/ldbl-128/s_fmal.c +++ b/sysdeps/ieee754/ldbl-128/s_fmal.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c index f1b36c46425..a989f4cb205 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/ldbl-96/s_fma.c b/sysdeps/ieee754/ldbl-96/s_fma.c index 8ad7e4dc64b..417c27e5349 100644 --- a/sysdeps/ieee754/ldbl-96/s_fma.c +++ b/sysdeps/ieee754/ldbl-96/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/ldbl-96/s_fmal.c b/sysdeps/ieee754/ldbl-96/s_fmal.c index fad8450b29f..cd83df451b4 100644 --- a/sysdeps/ieee754/ldbl-96/s_fmal.c +++ b/sysdeps/ieee754/ldbl-96/s_fmal.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/soft-fp/s_fma.c b/sysdeps/ieee754/soft-fp/s_fma.c index 9fd8ddb6835..4b0d6b50aab 100644 --- a/sysdeps/ieee754/soft-fp/s_fma.c +++ b/sysdeps/ieee754/soft-fp/s_fma.c @@ -25,6 +25,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/soft-fp/s_fmaf.c b/sysdeps/ieee754/soft-fp/s_fmaf.c index 2abb8c7f59f..bed5990f062 100644 --- a/sysdeps/ieee754/soft-fp/s_fmaf.c +++ b/sysdeps/ieee754/soft-fp/s_fmaf.c @@ -25,6 +25,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/ieee754/soft-fp/s_fmal.c b/sysdeps/ieee754/soft-fp/s_fmal.c index 0a364f46528..aecec139235 100644 --- a/sysdeps/ieee754/soft-fp/s_fmal.c +++ b/sysdeps/ieee754/soft-fp/s_fmal.c @@ -25,6 +25,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/riscv/rvd/s_fma.c b/sysdeps/riscv/rvd/s_fma.c index 70c0cbc0727..7f39cefc711 100644 --- a/sysdeps/riscv/rvd/s_fma.c +++ b/sysdeps/riscv/rvd/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library. If not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/riscv/rvf/s_fmaf.c b/sysdeps/riscv/rvf/s_fmaf.c index cb972fbf2fd..6057a009db2 100644 --- a/sysdeps/riscv/rvf/s_fmaf.c +++ b/sysdeps/riscv/rvf/s_fmaf.c @@ -16,6 +16,7 @@ License along with the GNU C Library. If not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c index 804272ff8ea..95f2cea66cb 100644 --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c @@ -1,3 +1,4 @@ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c index e82c4a4031d..cc7caa7cd28 100644 --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c @@ -1,3 +1,4 @@ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c index 34b4f45150b..44066eed464 100644 --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c @@ -1,3 +1,4 @@ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c index 08f71c8bbab..3d243424543 100644 --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c @@ -1,3 +1,4 @@ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/x86_64/fpu/multiarch/s_fma.c b/sysdeps/x86_64/fpu/multiarch/s_fma.c index 8ebf72103f7..89389dd77f4 100644 --- a/sysdeps/x86_64/fpu/multiarch/s_fma.c +++ b/sysdeps/x86_64/fpu/multiarch/s_fma.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include diff --git a/sysdeps/x86_64/fpu/multiarch/s_fmaf.c b/sysdeps/x86_64/fpu/multiarch/s_fmaf.c index c6738265632..8c1934685d8 100644 --- a/sysdeps/x86_64/fpu/multiarch/s_fmaf.c +++ b/sysdeps/x86_64/fpu/multiarch/s_fmaf.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see . */ +#define NO_MATH_REDIRECT #include #include #include