Blame m4/isnanf.m4

Packit 8f70b4
# isnanf.m4 serial 15
Packit 8f70b4
dnl Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit 8f70b4
dnl This file is free software; the Free Software Foundation
Packit 8f70b4
dnl gives unlimited permission to copy and/or distribute it,
Packit 8f70b4
dnl with or without modifications, as long as this notice is preserved.
Packit 8f70b4
Packit 8f70b4
dnl Check how to get or define isnanf().
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([gl_FUNC_ISNANF],
Packit 8f70b4
[
Packit 8f70b4
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
Packit 8f70b4
  ISNANF_LIBM=
Packit 8f70b4
  gl_HAVE_ISNANF_NO_LIBM
Packit 8f70b4
  if test $gl_cv_func_isnanf_no_libm = no; then
Packit 8f70b4
    gl_HAVE_ISNANF_IN_LIBM
Packit 8f70b4
    if test $gl_cv_func_isnanf_in_libm = yes; then
Packit 8f70b4
      ISNANF_LIBM=-lm
Packit 8f70b4
    fi
Packit 8f70b4
  fi
Packit 8f70b4
  dnl The variable gl_func_isnanf set here is used by isnan.m4.
Packit 8f70b4
  if test $gl_cv_func_isnanf_no_libm = yes \
Packit 8f70b4
     || test $gl_cv_func_isnanf_in_libm = yes; then
Packit 8f70b4
    save_LIBS="$LIBS"
Packit 8f70b4
    LIBS="$LIBS $ISNANF_LIBM"
Packit 8f70b4
    gl_ISNANF_WORKS
Packit 8f70b4
    LIBS="$save_LIBS"
Packit 8f70b4
    case "$gl_cv_func_isnanf_works" in
Packit 8f70b4
      *yes) gl_func_isnanf=yes ;;
Packit 8f70b4
      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
Packit 8f70b4
    esac
Packit 8f70b4
  else
Packit 8f70b4
    gl_func_isnanf=no
Packit 8f70b4
  fi
Packit 8f70b4
  if test $gl_func_isnanf != yes; then
Packit 8f70b4
    HAVE_ISNANF=0
Packit 8f70b4
  fi
Packit 8f70b4
  AC_SUBST([ISNANF_LIBM])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Check how to get or define isnanf() without linking with libm.
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([gl_FUNC_ISNANF_NO_LIBM],
Packit 8f70b4
[
Packit 8f70b4
  gl_HAVE_ISNANF_NO_LIBM
Packit 8f70b4
  if test $gl_cv_func_isnanf_no_libm = yes; then
Packit 8f70b4
    gl_ISNANF_WORKS
Packit 8f70b4
  fi
Packit 8f70b4
  if test $gl_cv_func_isnanf_no_libm = yes \
Packit 8f70b4
     && { case "$gl_cv_func_isnanf_works" in
Packit 8f70b4
            *yes) true;;
Packit 8f70b4
            *) false;;
Packit 8f70b4
          esac
Packit 8f70b4
        }; then
Packit 8f70b4
    gl_func_isnanf_no_libm=yes
Packit 8f70b4
    AC_DEFINE([HAVE_ISNANF_IN_LIBC], [1],
Packit 8f70b4
      [Define if the isnan(float) function is available in libc.])
Packit 8f70b4
  else
Packit 8f70b4
    gl_func_isnanf_no_libm=no
Packit 8f70b4
  fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Prerequisites of replacement isnanf definition. It does not need -lm.
Packit 8f70b4
AC_DEFUN([gl_PREREQ_ISNANF],
Packit 8f70b4
[
Packit 8f70b4
  gl_FLOAT_EXPONENT_LOCATION
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Test whether isnanf() can be used without libm.
Packit 8f70b4
AC_DEFUN([gl_HAVE_ISNANF_NO_LIBM],
Packit 8f70b4
[
Packit 8f70b4
  AC_CACHE_CHECK([whether isnan(float) can be used without linking with libm],
Packit 8f70b4
    [gl_cv_func_isnanf_no_libm],
Packit 8f70b4
    [
Packit 8f70b4
      AC_LINK_IFELSE(
Packit 8f70b4
        [AC_LANG_PROGRAM(
Packit 8f70b4
           [[#include <math.h>
Packit 8f70b4
             #if __GNUC__ >= 4
Packit 8f70b4
             # undef isnanf
Packit 8f70b4
             # define isnanf(x) __builtin_isnanf ((float)(x))
Packit 8f70b4
             #elif defined isnan
Packit 8f70b4
             # undef isnanf
Packit 8f70b4
             # define isnanf(x) isnan ((float)(x))
Packit 8f70b4
             #endif
Packit 8f70b4
             float x;]],
Packit 8f70b4
           [[return isnanf (x);]])],
Packit 8f70b4
        [gl_cv_func_isnanf_no_libm=yes],
Packit 8f70b4
        [gl_cv_func_isnanf_no_libm=no])
Packit 8f70b4
    ])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Test whether isnanf() can be used with libm.
Packit 8f70b4
AC_DEFUN([gl_HAVE_ISNANF_IN_LIBM],
Packit 8f70b4
[
Packit 8f70b4
  AC_CACHE_CHECK([whether isnan(float) can be used with libm],
Packit 8f70b4
    [gl_cv_func_isnanf_in_libm],
Packit 8f70b4
    [
Packit 8f70b4
      save_LIBS="$LIBS"
Packit 8f70b4
      LIBS="$LIBS -lm"
Packit 8f70b4
      AC_LINK_IFELSE(
Packit 8f70b4
        [AC_LANG_PROGRAM(
Packit 8f70b4
           [[#include <math.h>
Packit 8f70b4
             #if __GNUC__ >= 4
Packit 8f70b4
             # undef isnanf
Packit 8f70b4
             # define isnanf(x) __builtin_isnanf ((float)(x))
Packit 8f70b4
             #elif defined isnan
Packit 8f70b4
             # undef isnanf
Packit 8f70b4
             # define isnanf(x) isnan ((float)(x))
Packit 8f70b4
             #endif
Packit 8f70b4
             float x;]],
Packit 8f70b4
           [[return isnanf (x);]])],
Packit 8f70b4
        [gl_cv_func_isnanf_in_libm=yes],
Packit 8f70b4
        [gl_cv_func_isnanf_in_libm=no])
Packit 8f70b4
      LIBS="$save_LIBS"
Packit 8f70b4
    ])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Test whether isnanf() rejects Infinity (this fails on Solaris 2.5.1),
Packit 8f70b4
dnl recognizes a NaN (this fails on IRIX 6.5 with cc), and recognizes a NaN
Packit 8f70b4
dnl with in-memory representation 0x7fbfffff (this fails on IRIX 6.5).
Packit 8f70b4
AC_DEFUN([gl_ISNANF_WORKS],
Packit 8f70b4
[
Packit 8f70b4
  AC_REQUIRE([AC_PROG_CC])
Packit 8f70b4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit 8f70b4
  AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION])
Packit 8f70b4
  AC_CACHE_CHECK([whether isnan(float) works], [gl_cv_func_isnanf_works],
Packit 8f70b4
    [
Packit 8f70b4
      AC_RUN_IFELSE(
Packit 8f70b4
        [AC_LANG_SOURCE([[
Packit 8f70b4
#include <math.h>
Packit 8f70b4
#if __GNUC__ >= 4
Packit 8f70b4
# undef isnanf
Packit 8f70b4
# define isnanf(x) __builtin_isnanf ((float)(x))
Packit 8f70b4
#elif defined isnan
Packit 8f70b4
# undef isnanf
Packit 8f70b4
# define isnanf(x) isnan ((float)(x))
Packit 8f70b4
#endif
Packit 8f70b4
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
Packit 8f70b4
#ifdef __DECC
Packit 8f70b4
static float
Packit 8f70b4
NaN ()
Packit 8f70b4
{
Packit 8f70b4
  static float zero = 0.0f;
Packit 8f70b4
  return zero / zero;
Packit 8f70b4
}
Packit 8f70b4
#else
Packit 8f70b4
# define NaN() (0.0f / 0.0f)
Packit 8f70b4
#endif
Packit 8f70b4
#define NWORDS \
Packit 8f70b4
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
Packit 8f70b4
typedef union { unsigned int word[NWORDS]; float value; } memory_float;
Packit 8f70b4
int main()
Packit 8f70b4
{
Packit 8f70b4
  int result = 0;
Packit 8f70b4
Packit 8f70b4
  if (isnanf (1.0f / 0.0f))
Packit 8f70b4
    result |= 1;
Packit 8f70b4
Packit 8f70b4
  if (!isnanf (NaN ()))
Packit 8f70b4
    result |= 2;
Packit 8f70b4
Packit 8f70b4
#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
Packit 8f70b4
  /* The isnanf function should be immune against changes in the sign bit and
Packit 8f70b4
     in the mantissa bits.  The xor operation twiddles a bit that can only be
Packit 8f70b4
     a sign bit or a mantissa bit.  */
Packit 8f70b4
  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
Packit 8f70b4
    {
Packit 8f70b4
      memory_float m;
Packit 8f70b4
Packit 8f70b4
      m.value = NaN ();
Packit 8f70b4
      /* Set the bits below the exponent to 01111...111.  */
Packit 8f70b4
      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
Packit 8f70b4
      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
Packit 8f70b4
      if (!isnanf (m.value))
Packit 8f70b4
        result |= 4;
Packit 8f70b4
    }
Packit 8f70b4
#endif
Packit 8f70b4
Packit 8f70b4
  return result;
Packit 8f70b4
}]])],
Packit 8f70b4
        [gl_cv_func_isnanf_works=yes],
Packit 8f70b4
        [gl_cv_func_isnanf_works=no],
Packit 8f70b4
        [case "$host_os" in
Packit 8f70b4
           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
Packit 8f70b4
           mingw*) # Guess yes on mingw, no on MSVC.
Packit 8f70b4
             AC_EGREP_CPP([Known], [
Packit 8f70b4
#ifdef __MINGW32__
Packit 8f70b4
 Known
Packit 8f70b4
#endif
Packit 8f70b4
               ],
Packit 8f70b4
               [gl_cv_func_isnanf_works="guessing yes"],
Packit 8f70b4
               [gl_cv_func_isnanf_works="guessing no"])
Packit 8f70b4
             ;;
Packit 8f70b4
           *) gl_cv_func_isnanf_works="guessing yes" ;;
Packit 8f70b4
         esac
Packit 8f70b4
        ])
Packit 8f70b4
    ])
Packit 8f70b4
])