summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-07 19:59:56 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-07 19:59:56 +0000
commit32c2052cf06910f6a275223d12391807033d549b (patch)
tree9616f2b29e48c9a85c88f7999dc2ef8e50e158d3
parent4021079f5eb0ac9b1a0f3d791c628d7ce665ee57 (diff)
[BZ #4586]
* sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat pseudo-zeros as zero. * sysdeps/x86_64/ldbl2mpn.c: New file. * sysdeps/ia64/ldbl2mpn.c: New file.
-rw-r--r--ChangeLog8
-rw-r--r--sysdeps/i386/ldbl2mpn.c11
-rw-r--r--sysdeps/ia64/ldbl2mpn.c1
-rw-r--r--sysdeps/x86_64/ldbl2mpn.c1
4 files changed, 19 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d75047cdd..386ff108e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4586]
+ * sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat
+ pseudo-zeros as zero.
+ * sysdeps/x86_64/ldbl2mpn.c: New file.
+ * sysdeps/ia64/ldbl2mpn.c: New file.
+
2007-07-01 Jakub Jelinek <jakub@redhat.com>
* elf/dl-sysdep.c (_dl_important_hwcaps): Add integer overflow check.
diff --git a/sysdeps/i386/ldbl2mpn.c b/sysdeps/i386/ldbl2mpn.c
index bf4e4ff43f..b0543b7845 100644
--- a/sysdeps/i386/ldbl2mpn.c
+++ b/sysdeps/i386/ldbl2mpn.c
@@ -19,7 +19,7 @@
#include "gmp.h"
#include "gmp-impl.h"
#include "longlong.h"
-#include "ieee754.h"
+#include <ieee754.h>
#include <float.h>
#include <stdlib.h>
@@ -46,7 +46,7 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
#elif BITS_PER_MP_LIMB == 64
/* Hopefully the compiler will combine the two bitfield extracts
and this composition into just the original quadword extract. */
- res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
+ res_ptr[0] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
#define N 1
#else
#error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
@@ -109,6 +109,13 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
}
}
}
+ else if (u.ieee.exponent < 0x7fff
+#if N == 2
+ && res_ptr[0] == 0
+#endif
+ && res_ptr[N - 1] == 0)
+ /* Pseudo zero. */
+ *expt = 0;
return N;
}
diff --git a/sysdeps/ia64/ldbl2mpn.c b/sysdeps/ia64/ldbl2mpn.c
new file mode 100644
index 0000000000..641b789cd4
--- /dev/null
+++ b/sysdeps/ia64/ldbl2mpn.c
@@ -0,0 +1 @@
+#include "../i386/ldbl2mpn.c"
diff --git a/sysdeps/x86_64/ldbl2mpn.c b/sysdeps/x86_64/ldbl2mpn.c
new file mode 100644
index 0000000000..641b789cd4
--- /dev/null
+++ b/sysdeps/x86_64/ldbl2mpn.c
@@ -0,0 +1 @@
+#include "../i386/ldbl2mpn.c"