summaryrefslogtreecommitdiff
path: root/lib/isnan.c
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2007-12-11 11:35:55 -0700
committerEric Blake <ebb9@byu.net>2007-12-11 11:35:55 -0700
commit8e04e14294e7ce756738625c3be1183be4b0c4eb (patch)
treea94853cda240a29de99926e77ab0b42da53fcdf4 /lib/isnan.c
parent41cb56c49a82c2363b7290e17ade4eb6a42360a4 (diff)
downloadgnulib-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.c14
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