5de29b
# commit 4cf69995e26e16005d4e3843ad4d18c75cf21a04
5de29b
# Author: Alan Modra <amodra@gmail.com>
5de29b
# Date:   Sat Aug 17 18:19:44 2013 +0930
5de29b
# 
5de29b
#     Fix for [BZ #15680] IBM long double inaccuracy
5de29b
#     http://sourceware.org/ml/libc-alpha/2013-06/msg00919.html
5de29b
#     
5de29b
#     I discovered a number of places where denormals and other corner cases
5de29b
#     were being handled wrongly.
5de29b
#     
5de29b
#     - printf_fphex.c: Testing for the low double exponent being zero is
5de29b
#     unnecessary.  If the difference in exponents is less than 53 then the
5de29b
#     high double exponent must be nearing the low end of its range, and the
5de29b
#     low double exponent hit rock bottom.
5de29b
#     
5de29b
#     - ldbl2mpn.c: A denormal (ie. exponent of zero) value is treated as
5de29b
#     if the exponent was one, so shift mantissa left by one.  Code handling
5de29b
#     normalisation of the low double mantissa lacked a test for shift count
5de29b
#     greater than bits in type being shifted, and lacked anything to handle
5de29b
#     the case where the difference in exponents is less than 53 as in
5de29b
#     printf_fphex.c.
5de29b
#     
5de29b
#     - math_ldbl.h (ldbl_extract_mantissa): Same as above, but worse, with
5de29b
#     code testing for exponent > 1 for some reason, probably a typo for >= 1.
5de29b
#     
5de29b
#     - math_ldbl.h (ldbl_insert_mantissa): Round the high double as per
5de29b
#     mpn2ldbl.c (hi is odd or explicit mantissas non-zero) so that the
5de29b
#     number we return won't change when applying ldbl_canonicalize().
5de29b
#     Add missing overflow checks and normalisation of high mantissa.
5de29b
#     Correct misleading comment: "The hidden bit of the lo mantissa is
5de29b
#     zero" is not always true as can be seen from the code rounding the hi
5de29b
#     mantissa.  Also by inspection, lzcount can never be less than zero so
5de29b
#     remove that test.  Lastly, masking bitfields to their widths can be
5de29b
#     left to the compiler.
5de29b
#     
5de29b
#     - mpn2ldbl.c: The overflow checks here on rounding of high double were
5de29b
#     just plain wrong.  Incrementing the exponent must be accompanied by a
5de29b
#     shift right of the mantissa to keep the value unchanged.  Above notes
5de29b
#     for ldbl_insert_mantissa are also relevant.
5de29b
#     
5de29b
#         [BZ #15680]
5de29b
#         * sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c: Comment fix.
5de29b
#         * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
5de29b
#         (PRINT_FPHEX_LONG_DOUBLE): Tidy code by moving -53 into ediff
5de29b
#         calculation.  Remove unnecessary test for denormal exponent.
5de29b
#         * sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c (__mpn_extract_long_double):
5de29b
#         Correct handling of denormals.  Avoid undefined shift behaviour.
5de29b
#         Correct normalisation of low mantissa when low double is denormal.
5de29b
#         * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h
5de29b
#         (ldbl_extract_mantissa): Likewise.  Comment.  Use uint64_t* for hi64.
5de29b
#         (ldbl_insert_mantissa): Make both hi64 and lo64 parms uint64_t.
5de29b
#         Correct normalisation of low mantissa.  Test for overflow of high
5de29b
#         mantissa and normalise.
5de29b
#         (ldbl_nearbyint): Use more readable constant for two52.
5de29b
#         * sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
5de29b
#         (__mpn_construct_long_double): Fix test for overflow of high
5de29b
#         mantissa and correct normalisation.  Avoid undefined shift.
5de29b
# 
12745e
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c
12745e
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c	2014-05-27 19:13:56.000000000 -0500
12745e
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_rem_pio2l.c	2014-05-27 19:14:45.000000000 -0500
5de29b
@@ -243,7 +243,7 @@
5de29b
      We split the 113 bits of the mantissa into 5 24bit integers
5de29b
      stored in a double array.  */
5de29b
   /* Make the IBM extended format 105 bit mantissa look like the ieee854 112
5de29b
-     bit mantissa so the next operatation will give the correct result.  */
5de29b
+     bit mantissa so the next operation will give the correct result.  */
5de29b
   ldbl_extract_mantissa (&ixd, &lxd, &exp, x);
5de29b
   exp = exp - 23;
5de29b
   /* This is faster than doing this in floating point, because we
12745e
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c
12745e
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c	2014-05-27 19:13:56.000000000 -0500
12745e
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/ldbl2mpn.c	2014-05-27 19:14:45.000000000 -0500
5de29b
@@ -36,6 +36,7 @@
5de29b
   union ibm_extended_long_double u;
5de29b
   unsigned long long hi, lo;
5de29b
   int ediff;
5de29b
+
5de29b
   u.ld = value;
5de29b
 
5de29b
   *is_neg = u.d[0].ieee.negative;
5de29b
@@ -43,27 +44,36 @@
5de29b
 
5de29b
   lo = ((long long) u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1;
5de29b
   hi = ((long long) u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1;
5de29b
-  /* If the lower double is not a denomal or zero then set the hidden
5de29b
+
5de29b
+  /* If the lower double is not a denormal or zero then set the hidden
5de29b
      53rd bit.  */
5de29b
-  if (u.d[1].ieee.exponent > 0)
5de29b
-    {
5de29b
-      lo |= 1LL << 52;
5de29b
+  if (u.d[1].ieee.exponent != 0)
5de29b
+    lo |= 1ULL << 52;
5de29b
+  else
5de29b
+    lo = lo << 1;
5de29b
 
5de29b
-      /* The lower double is normalized separately from the upper.  We may
5de29b
-	 need to adjust the lower manitissa to reflect this.  */
5de29b
-      ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent;
5de29b
-      if (ediff > 53)
5de29b
-	lo = lo >> (ediff-53);
5de29b
+  /* The lower double is normalized separately from the upper.  We may
5de29b
+     need to adjust the lower manitissa to reflect this.  */
5de29b
+  ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53;
5de29b
+  if (ediff > 0)
5de29b
+    {
5de29b
+      if (ediff < 64)
5de29b
+	lo = lo >> ediff;
5de29b
+      else
5de29b
+	lo = 0;
5de29b
     }
5de29b
+  else if (ediff < 0)
5de29b
+    lo = lo << -ediff;
5de29b
+
5de29b
   /* The high double may be rounded and the low double reflects the
5de29b
      difference between the long double and the rounded high double
5de29b
      value.  This is indicated by a differnce between the signs of the
5de29b
      high and low doubles.  */
5de29b
-  if ((u.d[0].ieee.negative != u.d[1].ieee.negative)
5de29b
-      && ((u.d[1].ieee.exponent != 0) && (lo != 0L)))
5de29b
+  if (u.d[0].ieee.negative != u.d[1].ieee.negative
5de29b
+      && lo != 0)
5de29b
     {
5de29b
       lo = (1ULL << 53) - lo;
5de29b
-      if (hi == 0LL)
5de29b
+      if (hi == 0)
5de29b
 	{
5de29b
 	  /* we have a borrow from the hidden bit, so shift left 1.  */
5de29b
 	  hi = 0x0ffffffffffffeLL | (lo >> 51);
12745e
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h
12745e
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h	2014-05-27 19:13:56.000000000 -0500
12745e
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h	2014-05-27 19:51:13.000000000 -0500
5de29b
@@ -13,77 +13,118 @@
5de29b
      the number before the decimal point and the second implicit bit
5de29b
      as bit 53 of the mantissa.  */
5de29b
   uint64_t hi, lo;
5de29b
-  int ediff;
5de29b
   union ibm_extended_long_double u;
5de29b
+
5de29b
   u.ld = x;
5de29b
   *exp = u.d[0].ieee.exponent - IEEE754_DOUBLE_BIAS;
5de29b
 
5de29b
   lo = ((uint64_t)u.d[1].ieee.mantissa0 << 32) | u.d[1].ieee.mantissa1;
5de29b
   hi = ((uint64_t)u.d[0].ieee.mantissa0 << 32) | u.d[0].ieee.mantissa1;
5de29b
-  /* If the lower double is not a denomal or zero then set the hidden
5de29b
-     53rd bit.  */
5de29b
-  if (u.d[1].ieee.exponent > 0x001)
5de29b
-    {
5de29b
-      lo |= (1ULL << 52);
5de29b
-      lo = lo << 7; /* pre-shift lo to match ieee854.  */
5de29b
-      /* The lower double is normalized separately from the upper.  We
5de29b
-	 may need to adjust the lower manitissa to reflect this.  */
5de29b
-      ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent;
5de29b
-      if (ediff > 53)
5de29b
-	lo = lo >> (ediff-53);
5de29b
-      hi |= (1ULL << 52);
5de29b
-    }
5de29b
   
5de29b
-  if ((u.d[0].ieee.negative != u.d[1].ieee.negative)
5de29b
-      && ((u.d[1].ieee.exponent != 0) && (lo != 0LL)))
5de29b
+  if (u.d[0].ieee.exponent != 0)
5de29b
     {
5de29b
-      hi--;
5de29b
-      lo = (1ULL << 60) - lo;
5de29b
-      if (hi < (1ULL << 52))
5de29b
+      int ediff;
5de29b
+
5de29b
+      /* If not a denormal or zero then we have an implicit 53rd bit.  */
5de29b
+      hi |= (uint64_t) 1 << 52;
5de29b
+
5de29b
+      if (u.d[1].ieee.exponent != 0)
5de29b
+	lo |= (uint64_t) 1 << 52;
5de29b
+      else
5de29b
+	/* A denormal is to be interpreted as having a biased exponent
5de29b
+	   of 1.  */
5de29b
+	lo = lo << 1;
5de29b
+
5de29b
+      /* We are going to shift 4 bits out of hi later, because we only
5de29b
+	 want 48 bits in *hi64.  That means we want 60 bits in lo, but
5de29b
+	 we currently only have 53.  Shift the value up.  */
5de29b
+      lo = lo << 7;
5de29b
+
5de29b
+      /* The lower double is normalized separately from the upper.
5de29b
+	 We may need to adjust the lower mantissa to reflect this.
5de29b
+	 The difference between the exponents can be larger than 53
5de29b
+	 when the low double is much less than 1ULP of the upper
5de29b
+	 (in which case there are significant bits, all 0's or all
5de29b
+	 1's, between the two significands).  The difference between
5de29b
+	 the exponents can be less than 53 when the upper double
5de29b
+	 exponent is nearing its minimum value (in which case the low
5de29b
+	 double is denormal ie. has an exponent of zero).  */
5de29b
+      ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53;
5de29b
+      if (ediff > 0)
5de29b
 	{
5de29b
-	  /* we have a borrow from the hidden bit, so shift left 1.  */
5de29b
-	  hi = (hi << 1) | (lo >> 59);
5de29b
-	  lo = 0xfffffffffffffffLL & (lo << 1);
5de29b
-	  *exp = *exp - 1;
5de29b
+	  if (ediff < 64)
5de29b
+	    lo = lo >> ediff;
5de29b
+	  else
5de29b
+	    lo = 0;
5de29b
+	}
5de29b
+      else if (ediff < 0)
5de29b
+	lo = lo << -ediff;
5de29b
+
5de29b
+      if (u.d[0].ieee.negative != u.d[1].ieee.negative
5de29b
+	  && lo != 0)
5de29b
+	{
5de29b
+	  hi--;
5de29b
+	  lo = ((uint64_t) 1 << 60) - lo;
5de29b
+	  if (hi < (uint64_t) 1 << 52)
5de29b
+	    {
5de29b
+	      /* We have a borrow from the hidden bit, so shift left 1.  */
5de29b
+	      hi = (hi << 1) | (lo >> 59);
5de29b
+	      lo = (((uint64_t) 1 << 60) - 1) & (lo << 1);
5de29b
+	      *exp = *exp - 1;
5de29b
+	    }
5de29b
 	}
5de29b
     }
5de29b
+  else
5de29b
+    /* If the larger magnitude double is denormal then the smaller
5de29b
+       one must be zero.  */
5de29b
+    hi = hi << 1;
5de29b
+
5de29b
   *lo64 = (hi << 60) | lo;
5de29b
   *hi64 = hi >> 4;
5de29b
 }
5de29b
 
5de29b
 static inline long double
5de29b
-ldbl_insert_mantissa (int sign, int exp, int64_t hi64, u_int64_t lo64)
5de29b
+ldbl_insert_mantissa (int sign, int exp, int64_t hi64, uint64_t lo64)
5de29b
 {
5de29b
   union ibm_extended_long_double u;
5de29b
-  unsigned long hidden2, lzcount;
5de29b
-  unsigned long long hi, lo;
5de29b
+  int expnt2;
5de29b
+  uint64_t hi, lo;
5de29b
 
5de29b
   u.d[0].ieee.negative = sign;
5de29b
   u.d[1].ieee.negative = sign;
5de29b
   u.d[0].ieee.exponent = exp + IEEE754_DOUBLE_BIAS;
5de29b
-  u.d[1].ieee.exponent = exp-53 + IEEE754_DOUBLE_BIAS;
5de29b
+  u.d[1].ieee.exponent = 0;
5de29b
+  expnt2 = exp - 53 + IEEE754_DOUBLE_BIAS;
5de29b
+ 
5de29b
   /* Expect 113 bits (112 bits + hidden) right justified in two longs.
5de29b
      The low order 53 bits (52 + hidden) go into the lower double */ 
5de29b
-  lo = (lo64 >> 7)& ((1ULL << 53) - 1);
5de29b
-  hidden2 = (lo64 >> 59) &  1ULL;
5de29b
+  lo = (lo64 >> 7) & (((uint64_t) 1 << 53) - 1);
5de29b
   /* The high order 53 bits (52 + hidden) go into the upper double */
5de29b
-  hi = (lo64 >> 60) & ((1ULL << 11) - 1);
5de29b
-  hi |= (hi64 << 4);
5de29b
+  hi = lo64 >> 60;
5de29b
+  hi |= hi64 << 4;
5de29b
 
5de29b
-  if (lo != 0LL)
5de29b
+  if (lo != 0)
5de29b
     {
5de29b
-      /* hidden2 bit of low double controls rounding of the high double.
5de29b
-	 If hidden2 is '1' then round up hi and adjust lo (2nd mantissa)
5de29b
+      int lzcount;
5de29b
+
5de29b
+      /* hidden bit of low double controls rounding of the high double.
5de29b
+	 If hidden is '1' and either the explicit mantissa is non-zero
5de29b
+	 or hi is odd, then round up hi and adjust lo (2nd mantissa)
5de29b
 	 plus change the sign of the low double to compensate.  */
5de29b
-      if (hidden2)
5de29b
+      if ((lo & ((uint64_t) 1 << 52)) != 0
5de29b
+	  && ((hi & 1) != 0 || (lo & (((uint64_t) 1 << 52) - 1)) != 0))
5de29b
 	{
5de29b
 	  hi++;
5de29b
+	  if ((hi & ((uint64_t) 1 << 53)) != 0)
5de29b
+	    {
5de29b
+	      hi = hi >> 1;
5de29b
+	      u.d[0].ieee.exponent++;
5de29b
+	    }
5de29b
 	  u.d[1].ieee.negative = !sign;
5de29b
-	  lo = (1ULL << 53) - lo;
5de29b
+	  lo = ((uint64_t) 1 << 53) - lo;
5de29b
 	}
5de29b
-      /* The hidden bit of the lo mantissa is zero so we need to
5de29b
-	 normalize the it for the low double.  Shift it left until the
5de29b
-	 hidden bit is '1' then adjust the 2nd exponent accordingly.  */ 
5de29b
+      /* Normalize the low double.  Shift the mantissa left until
5de29b
+	 the hidden bit is '1' and adjust the exponent accordingly.  */
5de29b
 
5de29b
       if (sizeof (lo) == sizeof (long))
5de29b
 	lzcount = __builtin_clzl (lo);
5de29b
@@ -91,34 +132,30 @@
5de29b
 	lzcount = __builtin_clzl ((long) (lo >> 32));
5de29b
       else
5de29b
 	lzcount = __builtin_clzl ((long) lo) + 32;
5de29b
-      lzcount = lzcount - 11;
5de29b
-      if (lzcount > 0)
5de29b
+      lzcount = lzcount - (64 - 53);
5de29b
+      lo <<= lzcount;
5de29b
+      expnt2 -= lzcount;
5de29b
+
5de29b
+      if (expnt2 >= 1)
5de29b
+	/* Not denormal.  */
5de29b
+	u.d[1].ieee.exponent = expnt2;
5de29b
+      else
5de29b
 	{
5de29b
-	  int expnt2 = u.d[1].ieee.exponent - lzcount;
5de29b
-	  if (expnt2 >= 1)
5de29b
-	    {
5de29b
-	      /* Not denormal.  Normalize and set low exponent.  */
5de29b
-	      lo = lo << lzcount;
5de29b
-	      u.d[1].ieee.exponent = expnt2;
5de29b
-	    }
5de29b
+	  /* Is denormal.  Note that biased exponent of 0 is treated
5de29b
+	     as if it was 1, hence the extra shift.  */
5de29b
+	  if (expnt2 > -53)
5de29b
+	    lo >>= 1 - expnt2;
5de29b
 	  else
5de29b
-	    {
5de29b
-	      /* Is denormal.  */
5de29b
-	      lo = lo << (lzcount + expnt2);
5de29b
-	      u.d[1].ieee.exponent = 0;
5de29b
-	    }
5de29b
+	    lo = 0;
5de29b
 	}
5de29b
     }
5de29b
   else
5de29b
-    {
5de29b
-      u.d[1].ieee.negative = 0;
5de29b
-      u.d[1].ieee.exponent = 0;
5de29b
-    }
5de29b
+    u.d[1].ieee.negative = 0;
5de29b
 
5de29b
-  u.d[1].ieee.mantissa1 = lo & ((1ULL << 32) - 1);
5de29b
-  u.d[1].ieee.mantissa0 = (lo >> 32) & ((1ULL << 20) - 1);
5de29b
-  u.d[0].ieee.mantissa1 = hi & ((1ULL << 32) - 1);
5de29b
-  u.d[0].ieee.mantissa0 = (hi >> 32) & ((1ULL << 20) - 1);
5de29b
+  u.d[1].ieee.mantissa1 = lo;
5de29b
+  u.d[1].ieee.mantissa0 = lo >> 32;
5de29b
+  u.d[0].ieee.mantissa1 = hi;
5de29b
+  u.d[0].ieee.mantissa0 = hi >> 32;
5de29b
   return u.ld;
5de29b
 }
5de29b
   
5de29b
@@ -133,6 +170,10 @@
5de29b
   return u.ld;
5de29b
 }
5de29b
 
5de29b
+/* To suit our callers we return *hi64 and *lo64 as if they came from
5de29b
+   an ieee854 112 bit mantissa, that is, 48 bits in *hi64 (plus one
5de29b
+   implicit bit) and 64 bits in *lo64.  */
5de29b
+
5de29b
 static inline void
5de29b
 default_ldbl_unpack (long double l, double *a, double *aa)
5de29b
 {
5de29b
@@ -162,13 +203,13 @@
5de29b
   *aa = xl;
5de29b
 }
5de29b
 
5de29b
-/* Simple inline nearbyint (double) function .
5de29b
+/* Simple inline nearbyint (double) function.
5de29b
    Only works in the default rounding mode
5de29b
    but is useful in long double rounding functions.  */
5de29b
 static inline double
5de29b
 ldbl_nearbyint (double a)
5de29b
 {
5de29b
-  double two52 = 0x10000000000000LL;
5de29b
+  double two52 = 0x1p52;
5de29b
 
5de29b
   if (__builtin_expect ((__builtin_fabs (a) < two52), 1))
5de29b
     {
12745e
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
12745e
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c	2014-05-27 19:13:56.000000000 -0500
12745e
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c	2014-05-27 19:14:45.000000000 -0500
5de29b
@@ -70,9 +70,9 @@
5de29b
       else
5de29b
 	lzcount = __builtin_clzl ((long) val) + 32;
5de29b
       if (hi)
5de29b
-	lzcount = lzcount - 11;
5de29b
+	lzcount = lzcount - (64 - 53);
5de29b
       else
5de29b
-	lzcount = lzcount + 42;
5de29b
+	lzcount = lzcount + 53 - (64 - 53);
5de29b
 
5de29b
       if (lzcount > u.d[0].ieee.exponent)
5de29b
 	{
5de29b
@@ -98,29 +98,27 @@
5de29b
 	}
5de29b
     }
5de29b
 
5de29b
-  if (lo != 0L)
5de29b
+  if (lo != 0)
5de29b
     {
5de29b
-      /* hidden2 bit of low double controls rounding of the high double.
5de29b
-	 If hidden2 is '1' and either the explicit mantissa is non-zero
5de29b
+      /* hidden bit of low double controls rounding of the high double.
5de29b
+	 If hidden is '1' and either the explicit mantissa is non-zero
5de29b
 	 or hi is odd, then round up hi and adjust lo (2nd mantissa)
5de29b
 	 plus change the sign of the low double to compensate.  */
5de29b
       if ((lo & (1LL << 52)) != 0
5de29b
-	  && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1))))
5de29b
+	  && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1)) != 0))
5de29b
 	{
5de29b
 	  hi++;
5de29b
-	  if ((hi & ((1LL << 52) - 1)) == 0)
5de29b
+	  if ((hi & (1LL << 53)) != 0)
5de29b
 	    {
5de29b
-	      if ((hi & (1LL << 53)) != 0)
5de29b
-		hi -= 1LL << 52;
5de29b
+	      hi >>= 1;
5de29b
 	      u.d[0].ieee.exponent++;
5de29b
 	    }
5de29b
 	  u.d[1].ieee.negative = !sign;
5de29b
 	  lo = (1LL << 53) - lo;
5de29b
 	}
5de29b
 
5de29b
-      /* The hidden bit of the lo mantissa is zero so we need to normalize
5de29b
-	 it for the low double.  Shift it left until the hidden bit is '1'
5de29b
-	 then adjust the 2nd exponent accordingly.  */
5de29b
+      /* Normalize the low double.  Shift the mantissa left until
5de29b
+	 the hidden bit is '1' and adjust the exponent accordingly.  */
5de29b
 
5de29b
       if (sizeof (lo) == sizeof (long))
5de29b
 	lzcount = __builtin_clzl (lo);
5de29b
@@ -128,24 +126,24 @@
5de29b
 	lzcount = __builtin_clzl ((long) (lo >> 32));
5de29b
       else
5de29b
 	lzcount = __builtin_clzl ((long) lo) + 32;
5de29b
-      lzcount = lzcount - 11;
5de29b
-      if (lzcount > 0)
5de29b
-	{
5de29b
-	  lo = lo << lzcount;
5de29b
-	  exponent2 = exponent2 - lzcount;
5de29b
-	}
5de29b
+      lzcount = lzcount - (64 - 53);
5de29b
+      lo <<= lzcount;
5de29b
+      exponent2 -= lzcount;
5de29b
+
5de29b
       if (exponent2 > 0)
5de29b
 	u.d[1].ieee.exponent = exponent2;
5de29b
-      else
5de29b
+      else if (exponent2 > -53)
5de29b
 	lo >>= 1 - exponent2;
5de29b
+      else
5de29b
+	lo = 0;
5de29b
     }
5de29b
   else
5de29b
     u.d[1].ieee.negative = 0;
5de29b
 
5de29b
-  u.d[1].ieee.mantissa1 = lo & 0xffffffffLL;
5de29b
-  u.d[1].ieee.mantissa0 = (lo >> 32) & 0xfffff;
5de29b
-  u.d[0].ieee.mantissa1 = hi & 0xffffffffLL;
5de29b
-  u.d[0].ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1);
5de29b
+  u.d[1].ieee.mantissa1 = lo;
5de29b
+  u.d[1].ieee.mantissa0 = lo >> 32;
5de29b
+  u.d[0].ieee.mantissa1 = hi;
5de29b
+  u.d[0].ieee.mantissa0 = hi >> 32;
5de29b
 
5de29b
   return u.ld;
5de29b
 }
12745e
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
12745e
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c	2014-05-27 19:13:56.000000000 -0500
12745e
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c	2014-05-27 19:14:45.000000000 -0500
5de29b
@@ -43,15 +43,15 @@
5de29b
 	lo <<= 1;							      \
5de29b
       /* The lower double is normalized separately from the upper.  We	      \
5de29b
 	 may need to adjust the lower manitissa to reflect this.  */	      \
5de29b
-      ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent;		      \
5de29b
-      if (ediff > 53 + 63)						      \
5de29b
+      ediff = u.d[0].ieee.exponent - u.d[1].ieee.exponent - 53;		      \
5de29b
+      if (ediff > 63)							      \
5de29b
 	lo = 0;								      \
5de29b
-      else if (ediff > 53)						      \
5de29b
-	lo = lo >> (ediff - 53);					      \
5de29b
-      else if (u.d[1].ieee.exponent == 0 && ediff < 53)			      \
5de29b
-	lo = lo << (53 - ediff);					      \
5de29b
+      else if (ediff > 0)						      \
5de29b
+	lo = lo >> ediff;						      \
5de29b
+      else if (ediff < 0)						      \
5de29b
+	lo = lo << -ediff;						      \
5de29b
       if (u.d[0].ieee.negative != u.d[1].ieee.negative			      \
5de29b
-	  && (u.d[1].ieee.exponent != 0 || lo != 0L))			      \
5de29b
+	  && lo != 0)							      \
5de29b
 	{								      \
5de29b
 	  lo = (1ULL << 60) - lo;					      \
5de29b
 	  if (hi == 0L)							      \