summaryrefslogtreecommitdiff
path: root/config/math.m4
blob: e1e88d075edeec4ac7eb731878750596b14dc37c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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])