# HG changeset patch # User Eric Blake # Date 1197398155 25200 # Node ID 9e072640eeefc00bd8a18933818684f9240d1fea # Parent bd320f5f460290920c22961764415b3448d4a871 Detect pseudo-denormals on x86 even when cross-compiling. * lib/isnan.c (rpl_isnanl) [!KNOWN_EXPBIT0_LOCATION && USE_LONG_DOUBLE && x86]: Add one more check to filter out invalid bit patterns that happen to satisfy ==. Signed-off-by: Eric Blake diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2007-12-11 Eric Blake + Detect pseudo-denormals on x86 even when cross-compiling. + * lib/isnan.c (rpl_isnanl) [!KNOWN_EXPBIT0_LOCATION + && USE_LONG_DOUBLE && x86]: Add one more check to filter out + invalid bit patterns that happen to satisfy ==. + Avoid link failures with separate libtests.a. * gnulib-tool (func_emit_tests_Makefile_am): Also list local_ldadd last, to satisfy circular dependencies. diff --git a/lib/isnan.c b/lib/isnan.c --- a/lib/isnan.c +++ b/lib/isnan.c @@ -140,7 +140,19 @@ /* The configuration did not find sufficient information. Give up about the signaling NaNs, handle only the quiet NaNs. */ if (x == x) - return 0; + { +# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) + /* Detect any special bit patterns that pass ==; see comment above. */ + memory_double m1; + memory_double m2; + + m1.value = x; + m2.value = x + 0; + if (memcmp (&m1.value, &m2.value, SIZE) != 0) + return 1; +# endif + return 0; + } else return 1; #endif