From b3b099af0356831530f553934cdd90716137b1a3 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 4 Dec 2012 14:39:24 +0000 Subject: [PATCH] Fix powl inaccuracy for ldbl-128ibm (bug 14914). --- ChangeLog | 7 +++++++ NEWS | 2 +- sysdeps/ieee754/ldbl-128ibm/e_powl.c | 14 +++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index cab8d1b..3338301 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 744df37..24f6302 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 8216c49..8bd35d0 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; -- 2.7.4