about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-12-10 04:41:46 +0000
committerUlrich Drepper <drepper@redhat.com>2004-12-10 04:41:46 +0000
commit66ebe46c7d7bdc586f0f74ebcbb1e60864634364 (patch)
treead0339c1fb9eae8aae03028f5283e3219b263f8b
parent5cf1ec52565b19d68c3c0fbd853c0b5de26b27b2 (diff)
downloadglibc-66ebe46c7d7bdc586f0f74ebcbb1e60864634364.tar.gz
glibc-66ebe46c7d7bdc586f0f74ebcbb1e60864634364.tar.xz
glibc-66ebe46c7d7bdc586f0f74ebcbb1e60864634364.zip
2004-11-29  Jakub Jelinek  <jakub@redhat.com>

	* stdlib/strtod_l.c (INTERNAL (__STRTOF)): If densize > 2
	and numsize < densize, always shift num up by empty + 1 limbs.
-rw-r--r--ChangeLog5
-rw-r--r--stdlib/strtod_l.c16
2 files changed, 10 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 6841abec3b..b89cecfc68 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-29  Jakub Jelinek  <jakub@redhat.com>
+
+	* stdlib/strtod_l.c (INTERNAL (__STRTOF)): If densize > 2
+	and numsize < densize, always shift num up by empty + 1 limbs.
+
 2004-12-07  Paolo Bonzini  <bonzini@gnu.org>
 
 	* posix/regexec.c (proceed_next_node): Simplify treatment of epsilon
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index dce65cb83c..a656789f4c 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -1442,15 +1442,10 @@ INTERNAL (__STRTOF) (nptr, endptr, group, loc)
 	  if (numsize < densize)
 	    {
 	      mp_size_t empty = densize - numsize;
+	      register int i;
 
 	      if (bits <= 0)
-		{
-		  register int i;
-		  for (i = numsize; i > 0; --i)
-		    num[i + empty] = num[i - 1];
-		  MPN_ZERO (num, empty + 1);
-		  exponent -= empty * BITS_PER_MP_LIMB;
-		}
+		exponent -= empty * BITS_PER_MP_LIMB;
 	      else
 		{
 		  if (bits + empty * BITS_PER_MP_LIMB <= MANT_DIG)
@@ -1459,7 +1454,6 @@ INTERNAL (__STRTOF) (nptr, endptr, group, loc)
 			 cannot optimize the `else' case that good and
 			 this reflects all currently used FLOAT types
 			 and GMP implementations.  */
-		      register int i;
 #if RETURN_LIMB_SIZE <= 2
 		      assert (empty == 1);
 		      __mpn_lshift_1 (retval, RETURN_LIMB_SIZE,
@@ -1470,9 +1464,6 @@ INTERNAL (__STRTOF) (nptr, endptr, group, loc)
 		      while (i >= 0)
 			retval[i--] = 0;
 #endif
-		      for (i = numsize; i > 0; --i)
-			num[i + empty] = num[i - 1];
-		      MPN_ZERO (num, empty + 1);
 		    }
 		  else
 		    {
@@ -1492,6 +1483,9 @@ INTERNAL (__STRTOF) (nptr, endptr, group, loc)
 		    }
 		  bits += empty * BITS_PER_MP_LIMB;
 		}
+	      for (i = numsize; i > 0; --i)
+		num[i + empty] = num[i - 1];
+	      MPN_ZERO (num, empty + 1);
 	    }
 	  else
 	    {