diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-04-22 19:17:15 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-04-22 21:34:19 +0200 |
commit | 1868599f8daf7798018ce8a8f314015f5a2ac520 (patch) | |
tree | 4a9e4d8e1017d6bc4c3f1de3eaff89af049d9c90 /config/math.m4 | |
parent | 545f1addf7247a800bbb943650efaa4c35d3bd1d (diff) | |
download | gcc-1868599f8daf7798018ce8a8f314015f5a2ac520.zip gcc-1868599f8daf7798018ce8a8f314015f5a2ac520.tar.gz gcc-1868599f8daf7798018ce8a8f314015f5a2ac520.tar.bz2 |
libgfortran: Provide some further math library fallbacks [PR94694]
The following patch provides some further math library fallbacks.
fmaf can be implemented using fma if available, fma and fmal can use
x * y + z as fallback, it is not perfect, but e.g. glibc on various arches
has been using that as fallback for many years,
and copysign/copysignl/fabs/fabsl can be implemented using corresponding
__builtin_* if we make sure that gcc expands it inline instead of using
a library call (these days it is expanded inline on most targets).
2020-04-22 Jakub Jelinek <jakub@redhat.com>
PR libfortran/94694
PR libfortran/94586
* configure.ac: Add math func checks for fmaf, fma and fmal. Add
HAVE_INLINE_BUILTIN_COPYSIGN check.
* c99_protos.h (copysign, fmaf, fma, fmal): Provide fallback
prototypes.
(HAVE_COPYSIGN, HAVE_FMAF, HAVE_FMA, HAVE_FMAL): Define if not
defined and fallback version is provided.
* intrinsics/c99_functions.c (copysign, fmaf, fma, fmal): Provide
fallback implementations if possible
* configure: Regenerated.
* config.h.in: Regenerated.
* math.m4 (GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK1,
GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK2): New.
Diffstat (limited to 'config/math.m4')
-rw-r--r-- | config/math.m4 | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/config/math.m4 b/config/math.m4 index 155967e..e1e88d0 100644 --- a/config/math.m4 +++ b/config/math.m4 @@ -48,3 +48,67 @@ main () [Define to 1 if you have the `$1' function.]) fi ]) + +dnl GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK1([name], [type]) +dnl +dnl Check if math function NAME fallback for function with single +dnl TYPE argument and TYPE result can be implemented using +dnl __builtin_NAME expanded inline without needing unavailable math +dnl library function. +AC_DEFUN([GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK1], +[ + AC_REQUIRE([GCC_CHECK_LIBM]) +if test $gcc_cv_math_func_$1 = no; then + AC_CACHE_CHECK([for inline __builtin_$1], [gcc_cv_math_inline_builtin_$1], + [AC_LINK_IFELSE([AC_LANG_SOURCE([ +$2 +$1_fallback ($2 x) +{ + return __builtin_$1 (x); +} + +int +main () +{ + return 0; +} +])], +[gcc_cv_math_inline_builtin_$1=yes], +[gcc_cv_math_inline_builtin_$1=no])]) + if test $gcc_cv_math_inline_builtin_$1 = yes; then + AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_INLINE_BUILTIN_$1),[1], + [Define to 1 if `__builtin_$1' is expanded inline.]) + fi +fi]) + +dnl GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK2([name], [type]) +dnl +dnl Check if math function NAME fallback for function with two +dnl TYPE arguments and TYPE result can be implemented using +dnl __builtin_NAME expanded inline without needing unavailable math +dnl library function. +AC_DEFUN([GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK2], +[ + AC_REQUIRE([GCC_CHECK_LIBM]) +if test $gcc_cv_math_func_$1 = no; then + AC_CACHE_CHECK([for inline __builtin_$1], [gcc_cv_math_inline_builtin_$1], + [AC_LINK_IFELSE([AC_LANG_SOURCE([ +$2 +$1_fallback ($2 x, $2 y) +{ + return __builtin_$1 (x, y); +} + +int +main () +{ + return 0; +} +])], +[gcc_cv_math_inline_builtin_$1=yes], +[gcc_cv_math_inline_builtin_$1=no])]) + if test $gcc_cv_math_inline_builtin_$1 = yes; then + AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_INLINE_BUILTIN_$1),[1], + [Define to 1 if `__builtin_$1' is expanded inline.]) + fi +fi]) |