From: ebotcazou Date: Sat, 21 May 2005 06:44:50 +0000 (+0000) Subject: * configure.ac: Check for trunc and truncf in libm. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=50f0ca0a0d7f9b6a4e94b4c42f59f4cee2c1a7f1;ds=sidebyside * configure.ac: Check for trunc and truncf in libm. * configure: Regenerate. * config.h.in: Likewise. * intrinsics/c99_functions.c (trunc, truncf): New functions. * c99_protos.h (trunc, truncf): Declare them. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100040 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 89a0b787966..7e34ec86483 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2005-05-21 Eric Botcazou + + * configure.ac: Check for trunc and truncf in libm. + * configure: Regenerate. + * config.h.in: Likewise. + * intrinsics/c99_functions.c (trunc, truncf): New functions. + * c99_protos.h (trunc, truncf): Declare them. + 2005-05-18 Thomas Koenig PR libfortran/21127 diff --git a/libgfortran/c99_protos.h b/libgfortran/c99_protos.h index 99d61725cbf..521f205399a 100644 --- a/libgfortran/c99_protos.h +++ b/libgfortran/c99_protos.h @@ -113,6 +113,14 @@ extern float tanf(float); extern float tanhf(float); #endif +#ifndef HAVE_TRUNC +extern double trunc(double x); +#endif + +#ifndef HAVE_TRUNCF +extern float truncf(float x); +#endif + #ifndef HAVE_NEXTAFTERF extern float nextafterf(float, float); #endif diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in index 0cdd2aadbf1..f1a5628a020 100644 --- a/libgfortran/config.h.in +++ b/libgfortran/config.h.in @@ -264,6 +264,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H +/* libm includes trunc */ +#undef HAVE_TRUNC + +/* libm includes truncf */ +#undef HAVE_TRUNCF + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H diff --git a/libgfortran/configure b/libgfortran/configure index da18e6881ab..463791ed4b5 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -2937,7 +2937,7 @@ if test "x$GCC" = "xyes"; then AM_FCFLAGS="-Wall" ## We like to use C99 routines when available. This makes sure that ## __STDC_VERSION__ is set such that libc includes make them available. - AM_CFLAGS="-std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings" + AM_CFLAGS="-std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings" fi @@ -9570,6 +9570,150 @@ _ACEOF fi +echo "$as_me:$LINENO: checking for trunc in -lm" >&5 +echo $ECHO_N "checking for trunc in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_trunc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char trunc (); +int +main () +{ +trunc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_trunc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_trunc=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_trunc" >&5 +echo "${ECHO_T}$ac_cv_lib_m_trunc" >&6 +if test $ac_cv_lib_m_trunc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TRUNC 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for truncf in -lm" >&5 +echo $ECHO_N "checking for truncf in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_truncf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char truncf (); +int +main () +{ +truncf (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_truncf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_truncf=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_truncf" >&5 +echo "${ECHO_T}$ac_cv_lib_m_truncf" >&6 +if test $ac_cv_lib_m_truncf = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TRUNCF 1 +_ACEOF + +fi + echo "$as_me:$LINENO: checking for erf in -lm" >&5 echo $ECHO_N "checking for erf in -lm... $ECHO_C" >&6 if test "${ac_cv_lib_m_erf+set}" = set; then diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index e4b5d917581..efda28009d2 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -206,6 +206,8 @@ AC_CHECK_LIB([m],[sinhf],[AC_DEFINE([HAVE_SINHF],[1],[libm includes sinhf])]) AC_CHECK_LIB([m],[sqrtf],[AC_DEFINE([HAVE_SQRTF],[1],[libm includes sqrtf])]) AC_CHECK_LIB([m],[tanf],[AC_DEFINE([HAVE_TANF],[1],[libm includes tanf])]) AC_CHECK_LIB([m],[tanhf],[AC_DEFINE([HAVE_TANHF],[1],[libm includes tanhf])]) +AC_CHECK_LIB([m],[trunc],[AC_DEFINE([HAVE_TRUNC],[1],[libm includes trunc])]) +AC_CHECK_LIB([m],[truncf],[AC_DEFINE([HAVE_TRUNCF],[1],[libm includes truncf])]) AC_CHECK_LIB([m],[erf],[AC_DEFINE([HAVE_ERF],[1],[libm includes erf])]) AC_CHECK_LIB([m],[erfc],[AC_DEFINE([HAVE_ERFC],[1],[libm includes erfc])]) AC_CHECK_LIB([m],[erfcf],[AC_DEFINE([HAVE_ERFCF],[1],[libm includes erfcf])]) diff --git a/libgfortran/intrinsics/c99_functions.c b/libgfortran/intrinsics/c99_functions.c index f7dc9777dd8..6296904b56d 100644 --- a/libgfortran/intrinsics/c99_functions.c +++ b/libgfortran/intrinsics/c99_functions.c @@ -202,6 +202,28 @@ tanhf(float x) } #endif +#ifndef HAVE_TRUNC +double +trunc(double x) +{ + if (!isfinite (x)) + return x; + + if (x < 0.0) + return - floor (-x); + else + return floor (x); +} +#endif + +#ifndef HAVE_TRUNCF +float +truncf(float x) +{ + return (float) trunc (x); +} +#endif + #ifndef HAVE_NEXTAFTERF /* This is a portable implementation of nextafterf that is intended to be independent of the floating point format or its in memory representation.