1868599f8d
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.
115 lines
3.0 KiB
Plaintext
115 lines
3.0 KiB
Plaintext
dnl GCC_CHECK_LIBM
|
|
dnl
|
|
dnl Check whether -lm is available. This is a pre-requisite for
|
|
dnl GCC_CHECK_MATH_FUNC so that it will link with -lm.
|
|
AC_DEFUN([GCC_CHECK_LIBM],
|
|
[AC_CHECK_LIB([m],[sin])])
|
|
|
|
dnl GCC_CHECK_MATH_HEADERS
|
|
dnl
|
|
dnl Check for math.h and complex.h. This is a pre-requisite for
|
|
dnl GCC_CHECK_MATH_FUNC so that it includes the right headers.
|
|
dnl (Some systems, such as AIX or OpenVMS may define macro for math
|
|
dnl functions).
|
|
AC_DEFUN([GCC_CHECK_MATH_HEADERS],
|
|
[AC_CHECK_HEADERS_ONCE(math.h complex.h)])
|
|
|
|
dnl GCC_CHECK_MATH_FUNC([name])
|
|
dnl
|
|
dnl Check whether math function NAME is available on the system (by compiling
|
|
dnl and linking a C program) and run define HAVE_name on success.
|
|
dnl
|
|
dnl Note that OpenVMS system insists on including complex.h before math.h
|
|
AC_DEFUN([GCC_CHECK_MATH_FUNC],
|
|
[
|
|
AC_REQUIRE([GCC_CHECK_LIBM])
|
|
AC_REQUIRE([GCC_CHECK_MATH_HEADERS])
|
|
AC_CACHE_CHECK([for $1], [gcc_cv_math_func_$1],
|
|
[AC_LINK_IFELSE([AC_LANG_SOURCE([
|
|
#ifdef HAVE_COMPLEX_H
|
|
#include <complex.h>
|
|
#endif
|
|
#ifdef HAVE_MATH_H
|
|
#include <math.h>
|
|
#endif
|
|
|
|
int (*ptr)() = (int (*)())$1;
|
|
|
|
int
|
|
main ()
|
|
{
|
|
return 0;
|
|
}
|
|
])],
|
|
[gcc_cv_math_func_$1=yes],
|
|
[gcc_cv_math_func_$1=no])])
|
|
if test $gcc_cv_math_func_$1 = yes; then
|
|
AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_$1),[1],
|
|
[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])
|