1# ldexpl.m4 serial 16
2dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_FUNC_LDEXPL],
8[
9  AC_REQUIRE([gl_MATH_H_DEFAULTS])
10  AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
11  AC_REQUIRE([gl_FUNC_ISNANL]) dnl for ISNANL_LIBM
12
13  dnl Persuade glibc <math.h> to declare ldexpl().
14  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
15
16  dnl Check whether it's declared.
17  dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
18  AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include <math.h>]])
19
20  LDEXPL_LIBM=
21  if test $HAVE_DECL_LDEXPL = 1; then
22    gl_CHECK_LDEXPL_NO_LIBM
23    if test $gl_cv_func_ldexpl_no_libm = no; then
24      AC_CACHE_CHECK([whether ldexpl() can be used with libm],
25        [gl_cv_func_ldexpl_in_libm],
26        [
27          save_LIBS="$LIBS"
28          LIBS="$LIBS -lm"
29          AC_LINK_IFELSE(
30            [AC_LANG_PROGRAM(
31               [[#include <math.h>
32                 long double x;]],
33               [[return ldexpl (x, -1) > 0;]])],
34            [gl_cv_func_ldexpl_in_libm=yes],
35            [gl_cv_func_ldexpl_in_libm=no])
36          LIBS="$save_LIBS"
37        ])
38      if test $gl_cv_func_ldexpl_in_libm = yes; then
39        LDEXPL_LIBM=-lm
40      fi
41    fi
42    if test $gl_cv_func_ldexpl_no_libm = yes \
43       || test $gl_cv_func_ldexpl_in_libm = yes; then
44      save_LIBS="$LIBS"
45      LIBS="$LIBS $LDEXPL_LIBM"
46      gl_FUNC_LDEXPL_WORKS
47      LIBS="$save_LIBS"
48      case "$gl_cv_func_ldexpl_works" in
49        *yes) gl_func_ldexpl=yes ;;
50        *)    gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
51      esac
52    else
53      gl_func_ldexpl=no
54    fi
55    if test $gl_func_ldexpl = yes; then
56      AC_DEFINE([HAVE_LDEXPL], [1],
57        [Define if the ldexpl() function is available.])
58    fi
59  fi
60  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
61    dnl Find libraries needed to link lib/ldexpl.c.
62    if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
63      AC_REQUIRE([gl_FUNC_LDEXP])
64      LDEXPL_LIBM="$LDEXP_LIBM"
65    else
66      LDEXPL_LIBM="$ISNANL_LIBM"
67    fi
68  fi
69  AC_SUBST([LDEXPL_LIBM])
70])
71
72dnl Test whether ldexpl() can be used without linking with libm.
73dnl Set gl_cv_func_ldexpl_no_libm to 'yes' or 'no' accordingly.
74AC_DEFUN([gl_CHECK_LDEXPL_NO_LIBM],
75[
76  AC_CACHE_CHECK([whether ldexpl() can be used without linking with libm],
77    [gl_cv_func_ldexpl_no_libm],
78    [
79      AC_LINK_IFELSE(
80        [AC_LANG_PROGRAM(
81           [[#include <math.h>
82             long double x;]],
83           [[return ldexpl (x, -1) > 0;]])],
84        [gl_cv_func_ldexpl_no_libm=yes],
85        [gl_cv_func_ldexpl_no_libm=no])
86    ])
87])
88
89dnl Test whether ldexpl() works on finite numbers (this fails on AIX 5.1
90dnl and Mac OS X 10.4/PowerPC).
91AC_DEFUN([gl_FUNC_LDEXPL_WORKS],
92[
93  AC_REQUIRE([AC_PROG_CC])
94  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
95  AC_CACHE_CHECK([whether ldexpl works], [gl_cv_func_ldexpl_works],
96    [
97      AC_RUN_IFELSE(
98        [AC_LANG_SOURCE([[
99#include <math.h>
100extern
101#ifdef __cplusplus
102"C"
103#endif
104long double ldexpl (long double, int);
105int main()
106{
107  int result = 0;
108  {
109    volatile long double x = 1.0;
110    volatile long double y = ldexpl (x, -1);
111    if (y != 0.5L)
112      result |= 1;
113  }
114  {
115    volatile long double x = 1.73205L;
116    volatile long double y = ldexpl (x, 0);
117    if (y != x)
118      result |= 2;
119  }
120  return result;
121}]])],
122        [gl_cv_func_ldexpl_works=yes],
123        [gl_cv_func_ldexpl_works=no],
124        [
125changequote(,)dnl
126         case "$host_os" in
127           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no";;
128           *)               gl_cv_func_ldexpl_works="guessing yes";;
129         esac
130changequote([,])dnl
131        ])
132    ])
133])
134