Fix powl inaccuracy for ldbl-128ibm (bug 14914).

This commit is contained in:
Joseph Myers 2012-12-04 14:39:24 +00:00
parent a915e17fe7
commit b3b099af03
3 changed files with 15 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2012-12-04 Joseph Myers <joseph@codesourcery.com>
[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 <allan@archlinux.org>
* manual/stdio.texi (Predefined Printf Handlers): Remove

2
NEWS
View File

@ -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).

View File

@ -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;