From 7e65c779b367025ac57db99cec3d745350a6783a Mon Sep 17 00:00:00 2001 From: fxcoudert Date: Thu, 9 Sep 2010 18:47:11 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164119 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgfortran/ChangeLog | 15 +++ libgfortran/acinclude.m4 | 113 -------------------- libgfortran/config.h.in | 9 -- libgfortran/configure | 182 --------------------------------- libgfortran/configure.ac | 9 -- libgfortran/intrinsics/c99_functions.c | 3 +- libgfortran/io/write_float.def | 2 +- libgfortran/libgfortran.h | 48 +++------ 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 + + * 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 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 -#include -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 -#include -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 -#include -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 -#include -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 -#include -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 -#include -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)) -- 2.7.4