diff options
author | Eric Blake <ebb9@byu.net> | 2007-12-11 11:35:55 -0700 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2007-12-11 11:35:55 -0700 |
commit | 8e04e14294e7ce756738625c3be1183be4b0c4eb (patch) | |
tree | a94853cda240a29de99926e77ab0b42da53fcdf4 /lib/isnan.c | |
parent | 41cb56c49a82c2363b7290e17ade4eb6a42360a4 (diff) | |
download | gnulib-8e04e14294e7ce756738625c3be1183be4b0c4eb.tar.gz |
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 <ebb9@byu.net>
Diffstat (limited to 'lib/isnan.c')
-rw-r--r-- | lib/isnan.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/isnan.c b/lib/isnan.c index 4add6a2eb5..182a7bd5f5 100644 --- a/lib/isnan.c +++ b/lib/isnan.c @@ -140,7 +140,19 @@ FUNC (DOUBLE x) /* 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 |