Commit b1012ca4 by Francois-Xavier Coudert Committed by François-Xavier Coudert

acinclude.m4 (LIBGFOR_CHECK_FOR_BROKEN_ISFINITE, [...]): Remove.

	* acinclude.m4 (LIBGFOR_CHECK_FOR_BROKEN_ISFINITE,
	LIBGFOR_CHECK_FOR_BROKEN_ISNAN,
	LIBGFOR_CHECK_FOR_BROKEN_FPCLASSIFY): Remove.
	* configure.ac: Remove above checks.
	* libgfortran.h: Define isnan, isinf, isfinite, isnormal and
	signbit in terms of the respective built-ins.
	* io/write_float.def (WRITE_FLOAT): Use signbit() instead of
	__builtin_signbit().
	* intrinsics/c99_functions.c (tgamma): Use isnan() instead of
	__builtin_isnan().
	* config.h.in: Regenerate.
	* configure: Regenerate.

From-SVN: r164119
parent 82916e7e
2010-09-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* acinclude.m4 (LIBGFOR_CHECK_FOR_BROKEN_ISFINITE,
LIBGFOR_CHECK_FOR_BROKEN_ISNAN,
LIBGFOR_CHECK_FOR_BROKEN_FPCLASSIFY): Remove.
* configure.ac: Remove above checks.
* libgfortran.h: Define isnan, isinf, isfinite, isnormal and
signbit in terms of the respective built-ins.
* io/write_float.def (WRITE_FLOAT): Use signbit() instead of
__builtin_signbit().
* intrinsics/c99_functions.c (tgamma): Use isnan() instead of
__builtin_isnan().
* config.h.in: Regenerate.
* configure: Regenerate.
2010-09-06 Tobias Burnus <burnus@net-b.de> 2010-09-06 Tobias Burnus <burnus@net-b.de>
PR fortran/38282 PR fortran/38282
......
...@@ -196,119 +196,6 @@ if test x"$libgfor_cv_have_crlf" = xyes; then ...@@ -196,119 +196,6 @@ if test x"$libgfor_cv_have_crlf" = xyes; then
AC_DEFINE(HAVE_CRLF, 1, [Define if CRLF is line terminator.]) AC_DEFINE(HAVE_CRLF, 1, [Define if CRLF is line terminator.])
fi]) fi])
dnl Check whether isfinite is broken.
dnl The most common problem is that it does not work on long doubles.
AC_DEFUN([LIBGFOR_CHECK_FOR_BROKEN_ISFINITE], [
AC_CACHE_CHECK([whether isfinite is broken],
libgfor_cv_have_broken_isfinite, [
libgfor_check_for_broken_isfinite_save_LIBS=$LIBS
LIBS="$LIBS -lm"
AC_TRY_RUN([
#include <math.h>
#include <float.h>
int main ()
{
#ifdef isfinite
#ifdef LDBL_MAX
if (!isfinite(LDBL_MAX)) return 1;
#endif
#ifdef DBL_MAX
if (!isfinite(DBL_MAX)) return 1;
#endif
#endif
return 0;
}], libgfor_cv_have_broken_isfinite=no, libgfor_cv_have_broken_isfinite=yes, [
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_isfinite=yes ;;
*) libgfor_cv_have_broken_isfinite=no ;;
esac])]
LIBS=$libgfor_check_for_broken_isfinite_save_LIBS)
if test x"$libgfor_cv_have_broken_isfinite" = xyes; then
AC_DEFINE(HAVE_BROKEN_ISFINITE, 1, [Define if isfinite is broken.])
fi])
dnl Check whether isnan is broken.
dnl The most common problem is that it does not work on long doubles.
AC_DEFUN([LIBGFOR_CHECK_FOR_BROKEN_ISNAN], [
AC_CACHE_CHECK([whether isnan is broken],
libgfor_cv_have_broken_isnan, [
libgfor_check_for_broken_isnan_save_LIBS=$LIBS
LIBS="$LIBS -lm"
AC_TRY_RUN([
#include <math.h>
#include <float.h>
int main ()
{
#ifdef isnan
#ifdef LDBL_MAX
{
long double x;
x = __builtin_nanl ("");
if (!isnan(x)) return 1;
if (isnan(LDBL_MAX)) return 1;
#ifdef NAN
x = (long double) NAN;
if (!isnan(x)) return 1;
#endif
}
#endif
#ifdef DBL_MAX
{
double y;
y = __builtin_nan ("");
if (!isnan(y)) return 1;
if (isnan(DBL_MAX)) return 1;
#ifdef NAN
y = (double) NAN;
if (!isnan(y)) return 1;
#endif
}
#endif
#endif
return 0;
}], libgfor_cv_have_broken_isnan=no, libgfor_cv_have_broken_isnan=yes, [
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_isnan=yes ;;
*) libgfor_cv_have_broken_isnan=no ;;
esac])]
LIBS=$libgfor_check_for_broken_isnan_save_LIBS)
if test x"$libgfor_cv_have_broken_isnan" = xyes; then
AC_DEFINE(HAVE_BROKEN_ISNAN, 1, [Define if isnan is broken.])
fi])
dnl Check whether fpclassify is broken.
dnl The most common problem is that it does not work on long doubles.
AC_DEFUN([LIBGFOR_CHECK_FOR_BROKEN_FPCLASSIFY], [
AC_CACHE_CHECK([whether fpclassify is broken],
libgfor_cv_have_broken_fpclassify, [
libgfor_check_for_broken_fpclassify_save_LIBS=$LIBS
LIBS="$LIBS -lm"
AC_TRY_RUN([
#include <math.h>
#include <float.h>
int main ()
{
#ifdef fpclassify
#ifdef LDBL_MAX
if (fpclassify(LDBL_MAX) == FP_NAN
|| fpclassify(LDBL_MAX) == FP_INFINITE) return 1;
#endif
#ifdef DBL_MAX
if (fpclassify(DBL_MAX) == FP_NAN
|| fpclassify(DBL_MAX) == FP_INFINITE) return 1;
#endif
#endif
return 0;
}], libgfor_cv_have_broken_fpclassify=no, libgfor_cv_have_broken_fpclassify=yes, [
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_fpclassify=yes ;;
*) libgfor_cv_have_broken_fpclassify=no ;;
esac])]
LIBS=$libgfor_check_for_broken_fpclassify_save_LIBS)
if test x"$libgfor_cv_have_broken_fpclassify" = xyes; then
AC_DEFINE(HAVE_BROKEN_FPCLASSIFY, 1, [Define if fpclassify is broken.])
fi])
dnl Check whether the st_ino and st_dev stat fields taken together uniquely dnl Check whether the st_ino and st_dev stat fields taken together uniquely
dnl identify the file within the system. This is should be true for POSIX dnl identify the file within the system. This is should be true for POSIX
dnl systems; it is known to be false on mingw32. dnl systems; it is known to be false on mingw32.
......
...@@ -87,15 +87,6 @@ ...@@ -87,15 +87,6 @@
/* Define to 1 if you have the `backtrace_symbols' function. */ /* Define to 1 if you have the `backtrace_symbols' function. */
#undef HAVE_BACKTRACE_SYMBOLS #undef HAVE_BACKTRACE_SYMBOLS
/* Define if fpclassify is broken. */
#undef HAVE_BROKEN_FPCLASSIFY
/* Define if isfinite is broken. */
#undef HAVE_BROKEN_ISFINITE
/* Define if isnan is broken. */
#undef HAVE_BROKEN_ISNAN
/* Define if powf is broken. */ /* Define if powf is broken. */
#undef HAVE_BROKEN_POWF #undef HAVE_BROKEN_POWF
......
...@@ -24162,188 +24162,6 @@ $as_echo "#define HAVE_CLOG 1" >>confdefs.h ...@@ -24162,188 +24162,6 @@ $as_echo "#define HAVE_CLOG 1" >>confdefs.h
fi fi
# Check for a isfinite macro that works on long doubles.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isfinite is broken" >&5
$as_echo_n "checking whether isfinite is broken... " >&6; }
if test "${libgfor_cv_have_broken_isfinite+set}" = set; then :
$as_echo_n "(cached) " >&6
else
libgfor_check_for_broken_isfinite_save_LIBS=$LIBS
LIBS="$LIBS -lm"
if test "$cross_compiling" = yes; then :
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_isfinite=yes ;;
*) libgfor_cv_have_broken_isfinite=no ;;
esac
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <math.h>
#include <float.h>
int main ()
{
#ifdef isfinite
#ifdef LDBL_MAX
if (!isfinite(LDBL_MAX)) return 1;
#endif
#ifdef DBL_MAX
if (!isfinite(DBL_MAX)) return 1;
#endif
#endif
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
libgfor_cv_have_broken_isfinite=no
else
libgfor_cv_have_broken_isfinite=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
LIBS=$libgfor_check_for_broken_isfinite_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgfor_cv_have_broken_isfinite" >&5
$as_echo "$libgfor_cv_have_broken_isfinite" >&6; }
if test x"$libgfor_cv_have_broken_isfinite" = xyes; then
$as_echo "#define HAVE_BROKEN_ISFINITE 1" >>confdefs.h
fi
# Check for a isnan macro that works on long doubles.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan is broken" >&5
$as_echo_n "checking whether isnan is broken... " >&6; }
if test "${libgfor_cv_have_broken_isnan+set}" = set; then :
$as_echo_n "(cached) " >&6
else
libgfor_check_for_broken_isnan_save_LIBS=$LIBS
LIBS="$LIBS -lm"
if test "$cross_compiling" = yes; then :
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_isnan=yes ;;
*) libgfor_cv_have_broken_isnan=no ;;
esac
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <math.h>
#include <float.h>
int main ()
{
#ifdef isnan
#ifdef LDBL_MAX
{
long double x;
x = __builtin_nanl ("");
if (!isnan(x)) return 1;
if (isnan(LDBL_MAX)) return 1;
#ifdef NAN
x = (long double) NAN;
if (!isnan(x)) return 1;
#endif
}
#endif
#ifdef DBL_MAX
{
double y;
y = __builtin_nan ("");
if (!isnan(y)) return 1;
if (isnan(DBL_MAX)) return 1;
#ifdef NAN
y = (double) NAN;
if (!isnan(y)) return 1;
#endif
}
#endif
#endif
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
libgfor_cv_have_broken_isnan=no
else
libgfor_cv_have_broken_isnan=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
LIBS=$libgfor_check_for_broken_isnan_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgfor_cv_have_broken_isnan" >&5
$as_echo "$libgfor_cv_have_broken_isnan" >&6; }
if test x"$libgfor_cv_have_broken_isnan" = xyes; then
$as_echo "#define HAVE_BROKEN_ISNAN 1" >>confdefs.h
fi
# Check for a fpclassify macro that works on long doubles.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fpclassify is broken" >&5
$as_echo_n "checking whether fpclassify is broken... " >&6; }
if test "${libgfor_cv_have_broken_fpclassify+set}" = set; then :
$as_echo_n "(cached) " >&6
else
libgfor_check_for_broken_fpclassify_save_LIBS=$LIBS
LIBS="$LIBS -lm"
if test "$cross_compiling" = yes; then :
case "${target}" in
hppa*-*-hpux*) libgfor_cv_have_broken_fpclassify=yes ;;
*) libgfor_cv_have_broken_fpclassify=no ;;
esac
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <math.h>
#include <float.h>
int main ()
{
#ifdef fpclassify
#ifdef LDBL_MAX
if (fpclassify(LDBL_MAX) == FP_NAN
|| fpclassify(LDBL_MAX) == FP_INFINITE) return 1;
#endif
#ifdef DBL_MAX
if (fpclassify(DBL_MAX) == FP_NAN
|| fpclassify(DBL_MAX) == FP_INFINITE) return 1;
#endif
#endif
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
libgfor_cv_have_broken_fpclassify=no
else
libgfor_cv_have_broken_fpclassify=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
LIBS=$libgfor_check_for_broken_fpclassify_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgfor_cv_have_broken_fpclassify" >&5
$as_echo "$libgfor_cv_have_broken_fpclassify" >&6; }
if test x"$libgfor_cv_have_broken_fpclassify" = xyes; then
$as_echo "#define HAVE_BROKEN_FPCLASSIFY 1" >>confdefs.h
fi
# Check whether the system has a working stat() # Check whether the system has a working stat()
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target stat is reliable" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target stat is reliable" >&5
......
...@@ -450,15 +450,6 @@ AC_CHECK_LIB([m],[catanl],[AC_DEFINE([HAVE_CATANL],[1],[libm includes catanl])]) ...@@ -450,15 +450,6 @@ AC_CHECK_LIB([m],[catanl],[AC_DEFINE([HAVE_CATANL],[1],[libm includes catanl])])
# On AIX, clog is present in libm as __clog # On AIX, clog is present in libm as __clog
AC_CHECK_LIB([m],[__clog],[AC_DEFINE([HAVE_CLOG],[1],[libm includes clog])]) AC_CHECK_LIB([m],[__clog],[AC_DEFINE([HAVE_CLOG],[1],[libm includes clog])])
# Check for a isfinite macro that works on long doubles.
LIBGFOR_CHECK_FOR_BROKEN_ISFINITE
# Check for a isnan macro that works on long doubles.
LIBGFOR_CHECK_FOR_BROKEN_ISNAN
# Check for a fpclassify macro that works on long doubles.
LIBGFOR_CHECK_FOR_BROKEN_FPCLASSIFY
# Check whether the system has a working stat() # Check whether the system has a working stat()
LIBGFOR_CHECK_WORKING_STAT LIBGFOR_CHECK_WORKING_STAT
......
...@@ -558,7 +558,6 @@ powf (float x, float y) ...@@ -558,7 +558,6 @@ powf (float x, float y)
} }
#endif #endif
/* Note that if fpclassify is not defined, then NaN is not handled */
/* Algorithm by Steven G. Kargl. */ /* Algorithm by Steven G. Kargl. */
...@@ -1854,7 +1853,7 @@ tgamma (double x) ...@@ -1854,7 +1853,7 @@ tgamma (double x)
n = 0; n = 0;
y = x; y = x;
if (__builtin_isnan (x)) if (isnan (x))
return x; return x;
if (y <= 0) if (y <= 0)
......
...@@ -977,7 +977,7 @@ sprintf (buffer, "%+-#" STR(MIN_FIELD_WIDTH) ".*" \ ...@@ -977,7 +977,7 @@ sprintf (buffer, "%+-#" STR(MIN_FIELD_WIDTH) ".*" \
{\ {\
GFC_REAL_ ## x tmp;\ GFC_REAL_ ## x tmp;\
tmp = * (GFC_REAL_ ## x *)source;\ tmp = * (GFC_REAL_ ## x *)source;\
sign_bit = __builtin_signbit (tmp);\ sign_bit = signbit (tmp);\
if (!isfinite (tmp))\ if (!isfinite (tmp))\
{ \ { \
write_infnan (dtp, f, isnan (tmp), sign_bit);\ write_infnan (dtp, f, isnan (tmp), sign_bit);\
......
...@@ -221,42 +221,24 @@ extern int __mingw_snprintf (char *, size_t, const char *, ...) ...@@ -221,42 +221,24 @@ extern int __mingw_snprintf (char *, size_t, const char *, ...)
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
#endif #endif
/* The isfinite macro is only available with C99, but some non-C99 /* The C99 classification macros isfinite, isinf, isnan, isnormal
systems still provide fpclassify, and there is a `finite' function and signbit are broken or inconsistent on quite a few targets.
in BSD. So, we use GCC's builtins instead.
Also, isfinite is broken on Cygwin. Another advantage for GCC's builtins for these type-generic macros
is that it handles floating-point types that the system headers
may not support (like __float128). */
When isfinite is not available, try to use one of the
alternatives, or bail out. */
#if defined(HAVE_BROKEN_ISFINITE) || defined(__CYGWIN__)
#undef isfinite
#endif
#if defined(HAVE_BROKEN_ISNAN)
#undef isnan #undef isnan
#endif #define isnan(x) __builtin_isnan(x)
#undef isfinite
#if defined(HAVE_BROKEN_FPCLASSIFY) #define isfinite(x) __builtin_isfinite(x)
#undef fpclassify #undef isinf
#endif #define isinf(x) __builtin_isinf(x)
#undef isnormal
#if !defined(isfinite) #define isnormal(x) __builtin_isnormal(x)
#if !defined(fpclassify) #undef signbit
#define isfinite(x) ((x) - (x) == 0) #define signbit(x) __builtin_signbit(x)
#else
#define isfinite(x) (fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)
#endif /* !defined(fpclassify) */
#endif /* !defined(isfinite) */
#if !defined(isnan)
#if !defined(fpclassify)
#define isnan(x) ((x) != (x))
#else
#define isnan(x) (fpclassify(x) == FP_NAN)
#endif /* !defined(fpclassify) */
#endif /* !defined(isfinite) */
/* TODO: find the C99 version of these an move into above ifdef. */ /* TODO: find the C99 version of these an move into above ifdef. */
#define REALPART(z) (__real__(z)) #define REALPART(z) (__real__(z))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment