From: Joseph Myers Date: Tue, 4 Dec 2012 14:39:24 +0000 (+0000) Subject: Fix powl inaccuracy for ldbl-128ibm (bug 14914). X-Git-Tag: glibc-2.17~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3b099af0356831530f553934cdd90716137b1a3;p=thirdparty%2Fglibc.git Fix powl inaccuracy for ldbl-128ibm (bug 14914). --- diff --git a/ChangeLog b/ChangeLog index cab8d1bb29f..3338301a2e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-12-04 Joseph Myers + + [BZ #14914] + * sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Clear + whole low double instead of just low 47 bits when splitting values + into two parts. + 2012-12-03 Allan McRae * manual/stdio.texi (Predefined Printf Handlers): Remove diff --git a/NEWS b/NEWS index 744df378337..24f6302dfac 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ Version 2.17 14661, 14669, 14672, 14683, 14694, 14716, 14719, 14743, 14767, 14783, 14784, 14785, 14793, 14796, 14797, 14801, 14803, 14805, 14807, 14811, 14815, 14821, 14822, 14824, 14828, 14831, 14835, 14838, 14856, 14863, - 14865, 14866, 14868, 14869, 14871, 14879, 14889, 14893. + 14865, 14866, 14868, 14869, 14871, 14879, 14889, 14893, 14914. * CVE-2011-4609 svc_run() produces high cpu usage when accept fails with EMFILE has been fixed (Bugzilla #14889). diff --git a/sysdeps/ieee754/ldbl-128ibm/e_powl.c b/sysdeps/ieee754/ldbl-128ibm/e_powl.c index 8216c4906b7..8bd35d0c889 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_powl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_powl.c @@ -324,13 +324,13 @@ __ieee754_powl (long double x, long double y) o.value = s_h; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; s_h = o.value; /* t_h=ax+bp[k] High */ t_h = ax + bp[k]; o.value = t_h; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; t_h = o.value; t_l = ax - (t_h - bp[k]); s_l = v * ((u - s_h * t_h) - s_h * t_l); @@ -344,7 +344,7 @@ __ieee754_powl (long double x, long double y) t_h = 3.0 + s2 + r; o.value = t_h; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; t_h = o.value; t_l = r - ((t_h - 3.0) - s2); /* u+v = s*(1+...) */ @@ -354,7 +354,7 @@ __ieee754_powl (long double x, long double y) p_h = u + v; o.value = p_h; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; p_h = o.value; p_l = v - (p_h - u); z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ @@ -364,7 +364,7 @@ __ieee754_powl (long double x, long double y) t1 = (((z_h + z_l) + dp_h[k]) + t); o.value = t1; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; t1 = o.value; t2 = z_l - (((t1 - t) - dp_h[k]) - z_h); @@ -377,7 +377,7 @@ __ieee754_powl (long double x, long double y) y1 = y; o.value = y1; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; y1 = o.value; p_l = (y - y1) * t1 + y * t2; p_h = y1 * t1; @@ -421,7 +421,7 @@ __ieee754_powl (long double x, long double y) t = p_l + p_h; o.value = t; o.parts32.w3 = 0; - o.parts32.w2 &= 0xffff8000; + o.parts32.w2 = 0; t = o.value; u = t * lg2_h; v = (p_l - (t - p_h)) * lg2 + t * lg2_l;