X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fremainder.m4;h=8a9fee713469b06b4bb89a355a07f2cc75b683dc;hb=46f5f314f34a08c9305758482d7d2fdb0e999d09;hp=6cc0001b5ffb96a8994e94e482f53adf71901e7f;hpb=59cd972bd4e6d5a53e31ed175779f24c63d4b6c4;p=gnulib.git diff --git a/m4/remainder.m4 b/m4/remainder.m4 index 6cc0001b5..8a9fee713 100644 --- a/m4/remainder.m4 +++ b/m4/remainder.m4 @@ -1,11 +1,12 @@ -# remainder.m4 serial 1 -dnl Copyright (C) 2012 Free Software Foundation, Inc. +# remainder.m4 serial 4 +dnl Copyright (C) 2012-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_REMAINDER], [ + m4_divert_text([DEFAULTS], [gl_remainder_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) dnl Test whether remainder() is declared. On IRIX 5.3 it is not declared. @@ -50,22 +51,84 @@ AC_DEFUN([gl_FUNC_REMAINDER], REMAINDER_LIBM=-lm fi fi - if test $gl_cv_func_remainder_no_libm = no \ - && test $gl_cv_func_remainder_in_libm = no; then + if test $gl_cv_func_remainder_no_libm = yes \ + || test $gl_cv_func_remainder_in_libm = yes; then + : + m4_ifdef([gl_FUNC_REMAINDER_IEEE], [ + if test $gl_remainder_required = ieee && test $REPLACE_REMAINDER = 0; then + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether remainder works according to ISO C 99 with IEC 60559], + [gl_cv_func_remainder_ieee], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $REMAINDER_LIBM" + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#ifndef __NO_MATH_INLINES +# define __NO_MATH_INLINES 1 /* for glibc */ +#endif +#include +/* Compare two numbers with ==. + This is a separate function because IRIX 6.5 "cc -O" miscompiles an + 'x == x' test. */ +static int +numeric_equal (double x, double y) +{ + return x == y; +} +static double dummy (double x, double y) { return 0; } +int main (int argc, char *argv[]) +{ + double (*my_remainder) (double, double) = argc ? remainder : dummy; + double f; + /* Test remainder(...,0.0). + This test fails on OSF/1 5.1. */ + f = my_remainder (2.0, 0.0); + if (numeric_equal (f, f)) + return 1; + return 0; +} + ]])], + [gl_cv_func_remainder_ieee=yes], + [gl_cv_func_remainder_ieee=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu*) gl_cv_func_remainder_ieee="guessing yes" ;; + # If we don't know, assume the worst. + *) gl_cv_func_remainder_ieee="guessing no" ;; + esac + ]) + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_remainder_ieee" in + *yes) ;; + *) REPLACE_REMAINDER=1 ;; + esac + fi + ]) + else HAVE_REMAINDER=0 + fi + if test $HAVE_REMAINDER = 0 || test $REPLACE_REMAINDER = 1; then dnl Find libraries needed to link lib/remainder.c. - AC_REQUIRE([gl_FUNC_ROUND]) - AC_REQUIRE([gl_FUNC_FMA]) + AC_REQUIRE([gl_FUNC_FABS]) + AC_REQUIRE([gl_FUNC_FMOD]) + AC_REQUIRE([gl_FUNC_ISNAND]) REMAINDER_LIBM= - dnl Append $ROUND_LIBM to REMAINDER_LIBM, avoiding gratuitous duplicates. + dnl Append $FABS_LIBM to REMAINDER_LIBM, avoiding gratuitous duplicates. + case " $REMAINDER_LIBM " in + *" $FABS_LIBM "*) ;; + *) REMAINDER_LIBM="$REMAINDER_LIBM $FABS_LIBM" ;; + esac + dnl Append $FMOD_LIBM to REMAINDER_LIBM, avoiding gratuitous duplicates. case " $REMAINDER_LIBM " in - *" $ROUND_LIBM "*) ;; - *) REMAINDER_LIBM="$REMAINDER_LIBM $ROUND_LIBM" ;; + *" $FMOD_LIBM "*) ;; + *) REMAINDER_LIBM="$REMAINDER_LIBM $FMOD_LIBM" ;; esac - dnl Append $FMA_LIBM to REMAINDER_LIBM, avoiding gratuitous duplicates. + dnl Append $ISNAND_LIBM to REMAINDER_LIBM, avoiding gratuitous duplicates. case " $REMAINDER_LIBM " in - *" $FMA_LIBM "*) ;; - *) REMAINDER_LIBM="$REMAINDER_LIBM $FMA_LIBM" ;; + *" $ISNAND_LIBM "*) ;; + *) REMAINDER_LIBM="$REMAINDER_LIBM $ISNAND_LIBM" ;; esac fi AC_SUBST([REMAINDER_LIBM])