log1pf.m4 3.65 KB
Newer Older
1
# log1pf.m4 serial 5
2
dnl Copyright (C) 2012-2018 Free Software Foundation, Inc.
Bruno Haible's avatar
Bruno Haible committed
3 4 5 6 7 8
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

AC_DEFUN([gl_FUNC_LOG1PF],
[
9
  m4_divert_text([DEFAULTS], [gl_log1pf_required=plain])
Bruno Haible's avatar
Bruno Haible committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
  AC_REQUIRE([gl_FUNC_LOG1P])

  dnl Persuade glibc <math.h> to declare log1pf().
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])

  dnl Test whether log1pf() exists. Assume that log1pf(), if it exists, is
  dnl defined in the same library as log1p().
  save_LIBS="$LIBS"
  LIBS="$LIBS $LOG1P_LIBM"
  AC_CHECK_FUNCS([log1pf])
  LIBS="$save_LIBS"
  if test $ac_cv_func_log1pf = yes; then
    LOG1PF_LIBM="$LOG1P_LIBM"

    save_LIBS="$LIBS"
    LIBS="$LIBS $LOG1PF_LIBM"
    gl_FUNC_LOG1PF_WORKS
    LIBS="$save_LIBS"
    case "$gl_cv_func_log1pf_works" in
      *yes) ;;
      *) REPLACE_LOG1PF=1 ;;
    esac
33 34 35

    m4_ifdef([gl_FUNC_LOG1PF_IEEE], [
      if test $gl_log1pf_required = ieee && test $REPLACE_LOG1PF = 0; then
36
        AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
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
        AC_CACHE_CHECK([whether log1pf works according to ISO C 99 with IEC 60559],
          [gl_cv_func_log1pf_ieee],
          [
            save_LIBS="$LIBS"
            LIBS="$LIBS $LOG1PF_LIBM"
            AC_RUN_IFELSE(
              [AC_LANG_SOURCE([[
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES 1 /* for glibc */
#endif
#include <math.h>
]gl_FLOAT_MINUS_ZERO_CODE[
]gl_FLOAT_SIGNBIT_CODE[
static float dummy (float x) { return 0; }
int main (int argc, char *argv[])
{
  float (*my_log1pf) (float) = argc ? log1pf : dummy;
  /* This test fails on OpenBSD 4.9, AIX 7.1.  */
  float y = my_log1pf (minus_zerof);
  if (!(y == 0.0f) || (signbitf (minus_zerof) && !signbitf (y)))
    return 1;
  return 0;
}
              ]])],
              [gl_cv_func_log1pf_ieee=yes],
              [gl_cv_func_log1pf_ieee=no],
63
              [case "$host_os" in
64 65 66 67 68 69
                                # Guess yes on glibc systems.
                 *-gnu* | gnu*) gl_cv_func_log1pf_ieee="guessing yes" ;;
                                # Guess yes on native Windows.
                 mingw*)        gl_cv_func_log1pf_ieee="guessing yes" ;;
                                # If we don't know, assume the worst.
                 *)             gl_cv_func_log1pf_ieee="guessing no" ;;
70 71
               esac
              ])
72 73 74 75 76 77 78 79
            LIBS="$save_LIBS"
          ])
        case "$gl_cv_func_log1pf_ieee" in
          *yes) ;;
          *) REPLACE_LOG1PF=1 ;;
        esac
      fi
    ])
Bruno Haible's avatar
Bruno Haible committed
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
  else
    HAVE_LOG1PF=0
  fi
  if test $HAVE_LOG1PF = 0 || test $REPLACE_LOG1PF = 1; then
    dnl Find libraries needed to link lib/log1pf.c.
    LOG1PF_LIBM="$LOG1P_LIBM"
  fi
  AC_SUBST([LOG1PF_LIBM])
])

dnl Test whether log1pf() works.
dnl On IRIX 6.5, log1pf(-1.0f) returns +Infinity instead of -Infinity.
AC_DEFUN([gl_FUNC_LOG1PF_WORKS],
[
  AC_REQUIRE([AC_PROG_CC])
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
  AC_CACHE_CHECK([whether log1pf works], [gl_cv_func_log1pf_works],
    [
      AC_RUN_IFELSE(
        [AC_LANG_SOURCE([[
#include <math.h>
volatile float x;
float y;
int main ()
{
  x = -1.0f;
  y = log1pf (x);
  if (!(y + y == y && y < 0.0f))
    return 1;
  return 0;
}
]])],
        [gl_cv_func_log1pf_works=yes],
        [gl_cv_func_log1pf_works=no],
        [case "$host_os" in
115 116 117 118
           irix*)  gl_cv_func_log1pf_works="guessing no" ;;
                   # Guess yes on native Windows.
           mingw*) gl_cv_func_log1pf_works="guessing yes" ;;
           *)      gl_cv_func_log1pf_works="guessing yes" ;;
Bruno Haible's avatar
Bruno Haible committed
119 120 121 122
         esac
        ])
    ])
])