diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-06-08 02:50:59 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-06-08 02:50:59 +0000 |
commit | 835abc5c0dfd1ba8aabeb52d46793b13702c708b (patch) | |
tree | 8863a99b99c334da2e2fe77459acca76dbac5ef0 /sysdeps/i386 | |
parent | 43b768284325b7e7d2ec3fc3dcac13a35c378c95 (diff) | |
download | glibc-835abc5c0dfd1ba8aabeb52d46793b13702c708b.tar glibc-835abc5c0dfd1ba8aabeb52d46793b13702c708b.tar.gz glibc-835abc5c0dfd1ba8aabeb52d46793b13702c708b.tar.bz2 glibc-835abc5c0dfd1ba8aabeb52d46793b13702c708b.zip |
[BZ #4586]
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.
Diffstat (limited to 'sysdeps/i386')
-rw-r--r-- | sysdeps/i386/ldbl2mpn.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sysdeps/i386/ldbl2mpn.c b/sysdeps/i386/ldbl2mpn.c index bf4e4ff43f..01be777270 100644 --- a/sysdeps/i386/ldbl2mpn.c +++ b/sysdeps/i386/ldbl2mpn.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 2000, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -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; } |