1# log1pf.m4 serial 3
2dnl Copyright (C) 2012-2014 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_LOG1PF],
8[
9  m4_divert_text([DEFAULTS], [gl_log1pf_required=plain])
10  AC_REQUIRE([gl_MATH_H_DEFAULTS])
11  AC_REQUIRE([gl_FUNC_LOG1P])
12
13  dnl Persuade glibc <math.h> to declare log1pf().
14  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
15
16  dnl Test whether log1pf() exists. Assume that log1pf(), if it exists, is
17  dnl defined in the same library as log1p().
18  save_LIBS="$LIBS"
19  LIBS="$LIBS $LOG1P_LIBM"
20  AC_CHECK_FUNCS([log1pf])
21  LIBS="$save_LIBS"
22  if test $ac_cv_func_log1pf = yes; then
23    LOG1PF_LIBM="$LOG1P_LIBM"
24
25    save_LIBS="$LIBS"
26    LIBS="$LIBS $LOG1PF_LIBM"
27    gl_FUNC_LOG1PF_WORKS
28    LIBS="$save_LIBS"
29    case "$gl_cv_func_log1pf_works" in
30      *yes) ;;
31      *) REPLACE_LOG1PF=1 ;;
32    esac
33
34    m4_ifdef([gl_FUNC_LOG1PF_IEEE], [
35      if test $gl_log1pf_required = ieee && test $REPLACE_LOG1PF = 0; then
36        AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
37        AC_CACHE_CHECK([whether log1pf works according to ISO C 99 with IEC 60559],
38          [gl_cv_func_log1pf_ieee],
39          [
40            save_LIBS="$LIBS"
41            LIBS="$LIBS $LOG1PF_LIBM"
42            AC_RUN_IFELSE(
43              [AC_LANG_SOURCE([[
44#ifndef __NO_MATH_INLINES
45# define __NO_MATH_INLINES 1 /* for glibc */
46#endif
47#include <math.h>
48]gl_FLOAT_MINUS_ZERO_CODE[
49]gl_FLOAT_SIGNBIT_CODE[
50static float dummy (float x) { return 0; }
51int main (int argc, char *argv[])
52{
53  float (*my_log1pf) (float) = argc ? log1pf : dummy;
54  /* This test fails on OpenBSD 4.9, AIX 7.1.  */
55  float y = my_log1pf (minus_zerof);
56  if (!(y == 0.0f) || (signbitf (minus_zerof) && !signbitf (y)))
57    return 1;
58  return 0;
59}
60              ]])],
61              [gl_cv_func_log1pf_ieee=yes],
62              [gl_cv_func_log1pf_ieee=no],
63              [case "$host_os" in
64                         # Guess yes on glibc systems.
65                 *-gnu*) gl_cv_func_log1pf_ieee="guessing yes" ;;
66                         # If we don't know, assume the worst.
67                 *)      gl_cv_func_log1pf_ieee="guessing no" ;;
68               esac
69              ])
70            LIBS="$save_LIBS"
71          ])
72        case "$gl_cv_func_log1pf_ieee" in
73          *yes) ;;
74          *) REPLACE_LOG1PF=1 ;;
75        esac
76      fi
77    ])
78  else
79    HAVE_LOG1PF=0
80  fi
81  if test $HAVE_LOG1PF = 0 || test $REPLACE_LOG1PF = 1; then
82    dnl Find libraries needed to link lib/log1pf.c.
83    LOG1PF_LIBM="$LOG1P_LIBM"
84  fi
85  AC_SUBST([LOG1PF_LIBM])
86])
87
88dnl Test whether log1pf() works.
89dnl On IRIX 6.5, log1pf(-1.0f) returns +Infinity instead of -Infinity.
90AC_DEFUN([gl_FUNC_LOG1PF_WORKS],
91[
92  AC_REQUIRE([AC_PROG_CC])
93  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
94  AC_CACHE_CHECK([whether log1pf works], [gl_cv_func_log1pf_works],
95    [
96      AC_RUN_IFELSE(
97        [AC_LANG_SOURCE([[
98#include <math.h>
99volatile float x;
100float y;
101int main ()
102{
103  x = -1.0f;
104  y = log1pf (x);
105  if (!(y + y == y && y < 0.0f))
106    return 1;
107  return 0;
108}
109]])],
110        [gl_cv_func_log1pf_works=yes],
111        [gl_cv_func_log1pf_works=no],
112        [case "$host_os" in
113           irix*) gl_cv_func_log1pf_works="guessing no";;
114           *)     gl_cv_func_log1pf_works="guessing yes";;
115         esac
116        ])
117    ])
118])
119