aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2010-09-09 18:47:11 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2010-09-09 18:47:11 +0000
commitb1012ca4be23e00404c49f8520196af908110a10 (patch)
treeb0229dad035aa2b5e40711de60b627e662093e81 /libgfortran
parent82916e7e24ad8ce033780aa3217de74c0c4f58f9 (diff)
downloadgcc-b1012ca4be23e00404c49f8520196af908110a10.zip
gcc-b1012ca4be23e00404c49f8520196af908110a10.tar.gz
gcc-b1012ca4be23e00404c49f8520196af908110a10.tar.bz2
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
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog15
-rw-r--r--libgfortran/acinclude.m4113
-rw-r--r--libgfortran/config.h.in9
-rwxr-xr-xlibgfortran/configure182
-rw-r--r--libgfortran/configure.ac9
-rw-r--r--libgfortran/intrinsics/c99_functions.c3
-rw-r--r--libgfortran/io/write_float.def2
-rw-r--r--libgfortran/libgfortran.h48
8 files changed, 32 insertions, 349 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index e21064e..913c0e5 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,18 @@
+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>
PR fortran/38282
diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4
index 3355287..09cd292 100644
--- a/libgfortran/acinclude.m4
+++ b/libgfortran/acinclude.m4
@@ -196,119 +196,6 @@ if test x"$libgfor_cv_have_crlf" = xyes; then
AC_DEFINE(HAVE_CRLF, 1, [Define if CRLF is line terminator.])
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 identify the file within the system. This is should be true for POSIX
dnl systems; it is known to be false on mingw32.
diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in
index bdf3b4a..f5f367f 100644
--- a/libgfortran/config.h.in
+++ b/libgfortran/config.h.in
@@ -87,15 +87,6 @@
/* Define to 1 if you have the `backtrace_symbols' function. */
#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. */
#undef HAVE_BROKEN_POWF
diff --git a/libgfortran/configure b/libgfortran/configure
index bc4a25b..cf2b587 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -24162,188 +24162,6 @@ $as_echo "#define HAVE_CLOG 1" >>confdefs.h
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()
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target stat is reliable" >&5
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index 8b9ac74..e5517a1 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -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
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()
LIBGFOR_CHECK_WORKING_STAT
diff --git a/libgfortran/intrinsics/c99_functions.c b/libgfortran/intrinsics/c99_functions.c
index 03bcbfe..20fc7e0 100644
--- a/libgfortran/intrinsics/c99_functions.c
+++ b/libgfortran/intrinsics/c99_functions.c
@@ -558,7 +558,6 @@ powf (float x, float y)
}
#endif
-/* Note that if fpclassify is not defined, then NaN is not handled */
/* Algorithm by Steven G. Kargl. */
@@ -1854,7 +1853,7 @@ tgamma (double x)
n = 0;
y = x;
- if (__builtin_isnan (x))
+ if (isnan (x))
return x;
if (y <= 0)
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
index 776e591..b9157df 100644
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -977,7 +977,7 @@ sprintf (buffer, "%+-#" STR(MIN_FIELD_WIDTH) ".*" \
{\
GFC_REAL_ ## x tmp;\
tmp = * (GFC_REAL_ ## x *)source;\
- sign_bit = __builtin_signbit (tmp);\
+ sign_bit = signbit (tmp);\
if (!isfinite (tmp))\
{ \
write_infnan (dtp, f, isnan (tmp), sign_bit);\
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index 99f7342..8c08c7b 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -221,42 +221,24 @@ extern int __mingw_snprintf (char *, size_t, const char *, ...)
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
#endif
-/* The isfinite macro is only available with C99, but some non-C99
- systems still provide fpclassify, and there is a `finite' function
- in BSD.
+/* The C99 classification macros isfinite, isinf, isnan, isnormal
+ and signbit are broken or inconsistent on quite a few targets.
+ 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
-#endif
-
-#if defined(HAVE_BROKEN_FPCLASSIFY)
-#undef fpclassify
-#endif
-
-#if !defined(isfinite)
-#if !defined(fpclassify)
-#define isfinite(x) ((x) - (x) == 0)
-#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) */
+#define isnan(x) __builtin_isnan(x)
+#undef isfinite
+#define isfinite(x) __builtin_isfinite(x)
+#undef isinf
+#define isinf(x) __builtin_isinf(x)
+#undef isnormal
+#define isnormal(x) __builtin_isnormal(x)
+#undef signbit
+#define signbit(x) __builtin_signbit(x)
/* TODO: find the C99 version of these an move into above ifdef. */
#define REALPART(z) (__real__(z))