|
|
@ -52,8 +52,8 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c glibc-2.17- |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
@@ -56,11 +56,15 @@ |
|
|
|
@@ -56,11 +56,15 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
long double z; |
|
|
|
long double z; |
|
|
|
int64_t k,m,hx,hy,ix,iy; |
|
|
|
int64_t k,m,hx,hy,ix,iy; |
|
|
|
- u_int64_t lx,ly; |
|
|
|
- u_int64_t lx,ly; |
|
|
|
+ uint64_t lx; |
|
|
|
+ uint64_t lx; |
|
|
|
+ double xhi, xlo, yhi; |
|
|
|
+ double xhi, xlo, yhi; |
|
|
@ -62,31 +62,31 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_atan2l.c glibc-2.17- |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
ix = hx&0x7fffffffffffffffLL; |
|
|
|
ix = hx&0x7fffffffffffffffLL; |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
iy = hy&0x7fffffffffffffffLL; |
|
|
|
iy = hy&0x7fffffffffffffffLL; |
|
|
|
if(((ix)>0x7ff0000000000000LL)|| |
|
|
|
if(((ix)>0x7ff0000000000000LL)|| |
|
|
|
((iy)>0x7ff0000000000000LL)) /* x or y is NaN */ |
|
|
|
((iy)>0x7ff0000000000000LL)) /* x or y is NaN */ |
|
|
|
@@ -70,7 +74,7 @@ |
|
|
|
@@ -70,7 +74,7 @@ |
|
|
|
m = ((hy>>63)&1)|((hx>>62)&2); /* 2*sign(x)+sign(y) */ |
|
|
|
m = ((hy>>63)&1)|((hx>>62)&2); /* 2*sign(x)+sign(y) */ |
|
|
|
|
|
|
|
|
|
|
|
/* when y = 0 */ |
|
|
|
/* when y = 0 */ |
|
|
|
- if((iy|(ly&0x7fffffffffffffffLL))==0) { |
|
|
|
- if((iy|(ly&0x7fffffffffffffffLL))==0) { |
|
|
|
+ if(iy==0) { |
|
|
|
+ if(iy==0) { |
|
|
|
switch(m) { |
|
|
|
switch(m) { |
|
|
|
case 0: |
|
|
|
case 0: |
|
|
|
case 1: return y; /* atan(+-0,+anything)=+-0 */ |
|
|
|
case 1: return y; /* atan(+-0,+anything)=+-0 */ |
|
|
|
@@ -79,7 +83,7 @@ |
|
|
|
@@ -79,7 +83,7 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/* when x = 0 */ |
|
|
|
/* when x = 0 */ |
|
|
|
- if((ix|(lx&0x7fffffffffffffff))==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; |
|
|
|
- if((ix|(lx&0x7fffffffffffffff))==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; |
|
|
|
+ if(ix==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; |
|
|
|
+ if(ix==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; |
|
|
|
|
|
|
|
|
|
|
|
/* when x is INF */ |
|
|
|
/* when x is INF */ |
|
|
|
if(ix==0x7ff0000000000000LL) { |
|
|
|
if(ix==0x7ff0000000000000LL) { |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
@ -115,34 +115,34 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_ilogbl.c glibc-2.17- |
|
|
|
{ |
|
|
|
{ |
|
|
|
- int64_t hx,lx; |
|
|
|
- int64_t hx,lx; |
|
|
|
+ int64_t hx; |
|
|
|
+ int64_t hx; |
|
|
|
int ix; |
|
|
|
int ix; |
|
|
|
+ double xhi; |
|
|
|
+ double xhi; |
|
|
|
|
|
|
|
|
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
hx &= 0x7fffffffffffffffLL; |
|
|
|
hx &= 0x7fffffffffffffffLL; |
|
|
|
if(hx <= 0x0010000000000000LL) { |
|
|
|
if(hx <= 0x0010000000000000LL) { |
|
|
|
- if((hx|(lx&0x7fffffffffffffffLL))==0) |
|
|
|
- if((hx|(lx&0x7fffffffffffffffLL))==0) |
|
|
|
+ if(hx==0) |
|
|
|
+ if(hx==0) |
|
|
|
return FP_ILOGB0; /* ilogbl(0) = FP_ILOGB0 */ |
|
|
|
return FP_ILOGB0; /* ilogbl(0) = FP_ILOGB0 */ |
|
|
|
else /* subnormal x */ |
|
|
|
else /* subnormal x */ |
|
|
|
- if(hx==0) { |
|
|
|
- if(hx==0) { |
|
|
|
- for (ix = -1043; lx>0; lx<<=1) ix -=1; |
|
|
|
- for (ix = -1043; lx>0; lx<<=1) ix -=1; |
|
|
|
- } else { |
|
|
|
- } else { |
|
|
|
- for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; |
|
|
|
- for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; |
|
|
|
- } |
|
|
|
- } |
|
|
|
+ for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; |
|
|
|
+ for (ix = -1022, hx<<=11; hx>0; hx<<=1) ix -=1; |
|
|
|
return ix; |
|
|
|
return ix; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (hx<0x7ff0000000000000LL) return (hx>>52)-0x3ff; |
|
|
|
else if (hx<0x7ff0000000000000LL) return (hx>>52)-0x3ff; |
|
|
|
else if (FP_ILOGBNAN != INT_MAX) { |
|
|
|
else if (FP_ILOGBNAN != INT_MAX) { |
|
|
|
/* ISO C99 requires ilogbl(+-Inf) == INT_MAX. */ |
|
|
|
/* ISO C99 requires ilogbl(+-Inf) == INT_MAX. */ |
|
|
|
- if (((hx^0x7ff0000000000000LL)|lx) == 0) |
|
|
|
- if (((hx^0x7ff0000000000000LL)|lx) == 0) |
|
|
|
+ if (hx==0x7ff0000000000000LL) |
|
|
|
+ if (hx==0x7ff0000000000000LL) |
|
|
|
return INT_MAX; |
|
|
|
return INT_MAX; |
|
|
|
} |
|
|
|
} |
|
|
|
return FP_ILOGBNAN; |
|
|
|
return FP_ILOGBNAN; |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
@ -175,7 +175,7 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c75 |
|
|
|
- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 |
|
|
|
- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 |
|
|
|
- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) |
|
|
|
- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) != 0) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) != 0) |
|
|
|
return x + x; |
|
|
|
return x + x; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@@ -298,21 +297,20 @@ |
|
|
|
@@ -298,21 +297,20 @@ |
|
|
@ -202,7 +202,7 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c75 |
|
|
|
- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 |
|
|
|
- if ((u.parts32.w0 & 0xfffff) | u.parts32.w1 |
|
|
|
- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) |
|
|
|
- | (u.parts32.w2 & 0x7fffffff) | u.parts32.w3) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) != 0) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) != 0) |
|
|
|
return x + x; |
|
|
|
return x + x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (x <= 0.0L) |
|
|
|
if (x <= 0.0L) |
|
|
|
@@ -377,14 +375,16 @@ |
|
|
|
@@ -377,14 +375,16 @@ |
|
|
@ -215,16 +215,16 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_jnl.c glibc-2.17-c75 |
|
|
|
+ GET_HIGH_WORD (se, xhi); |
|
|
|
+ GET_HIGH_WORD (se, xhi); |
|
|
|
+ se &= 0xfff00000; |
|
|
|
+ se &= 0xfff00000; |
|
|
|
for (i = 1; i < n && se != 0xfff00000; i++) |
|
|
|
for (i = 1; i < n && se != 0xfff00000; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
temp = b; |
|
|
|
temp = b; |
|
|
|
b = ((long double) (i + i) / x) * b - a; |
|
|
|
b = ((long double) (i + i) / x) * b - a; |
|
|
|
- u.value = b; |
|
|
|
- u.value = b; |
|
|
|
- se = u.parts32.w0 & 0xfff00000; |
|
|
|
- se = u.parts32.w0 & 0xfff00000; |
|
|
|
+ xhi = ldbl_high (b); |
|
|
|
+ xhi = ldbl_high (b); |
|
|
|
+ GET_HIGH_WORD (se, xhi); |
|
|
|
+ GET_HIGH_WORD (se, xhi); |
|
|
|
+ se &= 0xfff00000; |
|
|
|
+ se &= 0xfff00000; |
|
|
|
a = temp; |
|
|
|
a = temp; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_log10l.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
@ -285,35 +285,35 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_logl.c glibc-2.17-c7 |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
@@ -233,10 +235,8 @@ |
|
|
|
@@ -233,10 +235,8 @@ |
|
|
|
k = (m - 0xff000) >> 13; |
|
|
|
k = (m - 0xff000) >> 13; |
|
|
|
/* t is the argument 0.5 + (k+26)/128 |
|
|
|
/* t is the argument 0.5 + (k+26)/128 |
|
|
|
of the nearest item to u in the lookup table. */ |
|
|
|
of the nearest item to u in the lookup table. */ |
|
|
|
- t.parts32.w0 = 0x3ff00000 + (k << 13); |
|
|
|
- t.parts32.w0 = 0x3ff00000 + (k << 13); |
|
|
|
- t.parts32.w1 = 0; |
|
|
|
- t.parts32.w1 = 0; |
|
|
|
- t.parts32.w2 = 0; |
|
|
|
- t.parts32.w2 = 0; |
|
|
|
- t.parts32.w3 = 0; |
|
|
|
- t.parts32.w3 = 0; |
|
|
|
+ INSERT_WORDS (xhi, 0x3ff00000 + (k << 13), 0); |
|
|
|
+ INSERT_WORDS (xhi, 0x3ff00000 + (k << 13), 0); |
|
|
|
+ t = xhi; |
|
|
|
+ t = xhi; |
|
|
|
w0 += 0x100000; |
|
|
|
w0 += 0x100000; |
|
|
|
e -= 1; |
|
|
|
e -= 1; |
|
|
|
k += 64; |
|
|
|
k += 64; |
|
|
|
@@ -244,17 +244,15 @@ |
|
|
|
@@ -244,17 +244,15 @@ |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
k = (m - 0xfe000) >> 14; |
|
|
|
k = (m - 0xfe000) >> 14; |
|
|
|
- t.parts32.w0 = 0x3fe00000 + (k << 14); |
|
|
|
- t.parts32.w0 = 0x3fe00000 + (k << 14); |
|
|
|
- t.parts32.w1 = 0; |
|
|
|
- t.parts32.w1 = 0; |
|
|
|
- t.parts32.w2 = 0; |
|
|
|
- t.parts32.w2 = 0; |
|
|
|
- t.parts32.w3 = 0; |
|
|
|
- t.parts32.w3 = 0; |
|
|
|
+ INSERT_WORDS (xhi, 0x3fe00000 + (k << 14), 0); |
|
|
|
+ INSERT_WORDS (xhi, 0x3fe00000 + (k << 14), 0); |
|
|
|
+ t = xhi; |
|
|
|
+ t = xhi; |
|
|
|
} |
|
|
|
} |
|
|
|
- u.value = __scalbnl (u.value, ((int) ((w0 - u.parts32.w0) * 2)) >> 21); |
|
|
|
- u.value = __scalbnl (u.value, ((int) ((w0 - u.parts32.w0) * 2)) >> 21); |
|
|
|
+ x = __scalbnl (x, ((int) ((w0 - hx) * 2)) >> 21); |
|
|
|
+ x = __scalbnl (x, ((int) ((w0 - hx) * 2)) >> 21); |
|
|
|
/* log(u) = log( t u/t ) = log(t) + log(u/t) |
|
|
|
/* log(u) = log( t u/t ) = log(t) + log(u/t) |
|
|
|
log(t) is tabulated in the lookup table. |
|
|
|
log(t) is tabulated in the lookup table. |
|
|
|
Express log(u/t) = log(1+z), where z = u/t - 1 = (u-t)/t. |
|
|
|
Express log(u/t) = log(1+z), where z = u/t - 1 = (u-t)/t. |
|
|
|
cf. Cody & Waite. */ |
|
|
|
cf. Cody & Waite. */ |
|
|
|
- z = (u.value - t.value) / t.value; |
|
|
|
- z = (u.value - t.value) / t.value; |
|
|
|
+ z = (x - t) / t; |
|
|
|
+ z = (x - t) / t; |
|
|
|
} |
|
|
|
} |
|
|
@ -390,11 +390,11 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
+ |
|
|
|
+ |
|
|
|
+ GET_HIGH_WORD (low_ye, ylo); |
|
|
|
+ GET_HIGH_WORD (low_ye, ylo); |
|
|
|
+ if ((low_ye & 0x7fffffff) >= 0x43400000) /* Low part >= 2^53 */ |
|
|
|
+ if ((low_ye & 0x7fffffff) >= 0x43400000) /* Low part >= 2^53 */ |
|
|
|
yisint = 2; /* even integer y */ |
|
|
|
yisint = 2; /* even integer y */ |
|
|
|
else if (iy >= 0x3ff00000) /* 1.0 */ |
|
|
|
else if (iy >= 0x3ff00000) /* 1.0 */ |
|
|
|
{ |
|
|
|
{ |
|
|
|
@@ -207,42 +205,43 @@ |
|
|
|
@@ -207,42 +205,43 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
+ ax = fabsl (x); |
|
|
|
+ ax = fabsl (x); |
|
|
@ -405,18 +405,18 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
{ |
|
|
|
{ |
|
|
|
- if (iy == 0x7ff00000 && q.parts32.w1 == 0) /* y is +-inf */ |
|
|
|
- if (iy == 0x7ff00000 && q.parts32.w1 == 0) /* y is +-inf */ |
|
|
|
+ if (iy == 0x7ff00000) /* y is +-inf */ |
|
|
|
+ if (iy == 0x7ff00000) /* y is +-inf */ |
|
|
|
{ |
|
|
|
{ |
|
|
|
- if (((ix - 0x3ff00000) | p.parts32.w1 |
|
|
|
- if (((ix - 0x3ff00000) | p.parts32.w1 |
|
|
|
- | (p.parts32.w2 & 0x7fffffff) | p.parts32.w3) == 0) |
|
|
|
- | (p.parts32.w2 & 0x7fffffff) | p.parts32.w3) == 0) |
|
|
|
- return y - y; /* inf**+-1 is NaN */ |
|
|
|
- return y - y; /* inf**+-1 is NaN */ |
|
|
|
- else if (ix > 0x3ff00000 || fabsl (x) > 1.0L) |
|
|
|
- else if (ix > 0x3ff00000 || fabsl (x) > 1.0L) |
|
|
|
+ if (ax > one) |
|
|
|
+ if (ax > one) |
|
|
|
/* (|x|>1)**+-inf = inf,0 */ |
|
|
|
/* (|x|>1)**+-inf = inf,0 */ |
|
|
|
return (hy >= 0) ? y : zero; |
|
|
|
return (hy >= 0) ? y : zero; |
|
|
|
else |
|
|
|
else |
|
|
|
/* (|x|<1)**-,+inf = inf,0 */ |
|
|
|
/* (|x|<1)**-,+inf = inf,0 */ |
|
|
|
return (hy < 0) ? -y : zero; |
|
|
|
return (hy < 0) ? -y : zero; |
|
|
|
} |
|
|
|
} |
|
|
|
- if (iy == 0x3ff00000) |
|
|
|
- if (iy == 0x3ff00000) |
|
|
|
- { /* y is +-1 */ |
|
|
|
- { /* y is +-1 */ |
|
|
|
- if (hy < 0) |
|
|
|
- if (hy < 0) |
|
|
@ -446,7 +446,7 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
+ if (hx >= 0) /* x >= +0 */ |
|
|
|
+ if (hx >= 0) /* x >= +0 */ |
|
|
|
+ return __ieee754_sqrtl (x); |
|
|
|
+ return __ieee754_sqrtl (x); |
|
|
|
+ } |
|
|
|
+ } |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
- ax = fabsl (x); |
|
|
|
- ax = fabsl (x); |
|
|
@ -456,9 +456,9 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
{ |
|
|
|
{ |
|
|
|
- if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) |
|
|
|
- if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) |
|
|
|
+ if (ix == 0x7ff00000 || ix == 0 || (ix == 0x3ff00000 && xlo == 0.0)) |
|
|
|
+ if (ix == 0x7ff00000 || ix == 0 || (ix == 0x3ff00000 && xlo == 0.0)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
z = ax; /*x is +-0,+-inf,+-1 */ |
|
|
|
z = ax; /*x is +-0,+-inf,+-1 */ |
|
|
|
if (hy < 0) |
|
|
|
if (hy < 0) |
|
|
|
@@ -294,8 +293,8 @@ |
|
|
|
@@ -294,8 +293,8 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
ax *= two113; |
|
|
|
ax *= two113; |
|
|
@ -559,9 +559,9 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
- if (((j - 0x40d00000) | o.parts32.w1 |
|
|
|
- if (((j - 0x40d00000) | o.parts32.w1 |
|
|
|
- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) |
|
|
|
- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) |
|
|
|
+ if (((j - 0x40d00000) | lj) != 0) |
|
|
|
+ if (((j - 0x40d00000) | lj) != 0) |
|
|
|
return s * huge * huge; /* overflow */ |
|
|
|
return s * huge * huge; /* overflow */ |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
@@ -399,8 +377,7 @@ |
|
|
|
@@ -399,8 +377,7 @@ |
|
|
|
else if ((j & 0x7fffffff) >= 0x40d01b90) /* z <= -16495 */ |
|
|
|
else if ((j & 0x7fffffff) >= 0x40d01b90) /* z <= -16495 */ |
|
|
|
{ |
|
|
|
{ |
|
|
@ -569,9 +569,9 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/e_powl.c glibc-2.17-c7 |
|
|
|
- if (((j - 0xc0d01bc0) | o.parts32.w1 |
|
|
|
- if (((j - 0xc0d01bc0) | o.parts32.w1 |
|
|
|
- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) |
|
|
|
- | (o.parts32.w2 & 0x7fffffff) | o.parts32.w3) != 0) |
|
|
|
+ if (((j - 0xc0d01bc0) | lj) != 0) |
|
|
|
+ if (((j - 0xc0d01bc0) | lj) != 0) |
|
|
|
return s * tiny * tiny; /* underflow */ |
|
|
|
return s * tiny * tiny; /* underflow */ |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
@@ -419,10 +396,7 @@ |
|
|
|
@@ -419,10 +396,7 @@ |
|
|
|
p_h -= t; |
|
|
|
p_h -= t; |
|
|
|
} |
|
|
|
} |
|
|
@ -610,21 +610,21 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/k_tanl.c glibc-2.17-c7 |
|
|
|
+ if ((int) x == 0) /* generate inexact */ |
|
|
|
+ if ((int) x == 0) /* generate inexact */ |
|
|
|
+ { |
|
|
|
+ { |
|
|
|
+ if ((ix | lx | (iy + 1)) == 0) |
|
|
|
+ if ((ix | lx | (iy + 1)) == 0) |
|
|
|
return one / fabs (x); |
|
|
|
return one / fabs (x); |
|
|
|
else |
|
|
|
else |
|
|
|
return (iy == 1) ? x : -one / x; |
|
|
|
return (iy == 1) ? x : -one / x; |
|
|
|
@@ -103,7 +103,7 @@ |
|
|
|
@@ -103,7 +103,7 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
if (ix >= 0x3fe59420) /* |x| >= 0.6743316650390625 */ |
|
|
|
if (ix >= 0x3fe59420) /* |x| >= 0.6743316650390625 */ |
|
|
|
{ |
|
|
|
{ |
|
|
|
- if ((u.parts32.w0 & 0x80000000) != 0) |
|
|
|
- if ((u.parts32.w0 & 0x80000000) != 0) |
|
|
|
+ if ((hx & 0x80000000) != 0) |
|
|
|
+ if ((hx & 0x80000000) != 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
x = -x; |
|
|
|
x = -x; |
|
|
|
y = -y; |
|
|
|
y = -y; |
|
|
|
@@ -139,15 +139,13 @@ |
|
|
|
@@ -139,15 +139,13 @@ |
|
|
|
{ /* if allow error up to 2 ulp, |
|
|
|
{ /* if allow error up to 2 ulp, |
|
|
|
simply return -1.0/(x+r) here */ |
|
|
|
simply return -1.0/(x+r) here */ |
|
|
|
/* compute -1.0/(x+r) accurately */ |
|
|
|
/* compute -1.0/(x+r) accurately */ |
|
|
|
- u1.value = w; |
|
|
|
- u1.value = w; |
|
|
|
- u1.parts32.w2 = 0; |
|
|
|
- u1.parts32.w2 = 0; |
|
|
@ -670,9 +670,9 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_expm1l.c glibc-2.17- |
|
|
|
/* Infinity. */ |
|
|
|
/* Infinity. */ |
|
|
|
- if (((ix & 0xfffff) | u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0) |
|
|
|
- if (((ix & 0xfffff) | u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) == 0) |
|
|
|
+ if (((ix - 0x7ff00000) | lx) == 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (sign) |
|
|
|
if (sign) |
|
|
|
return -1.0L; |
|
|
|
return -1.0L; |
|
|
|
@@ -116,7 +116,7 @@ |
|
|
|
@@ -116,7 +116,7 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -691,44 +691,44 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_frexpl.c glibc-2.17- |
|
|
|
{ |
|
|
|
{ |
|
|
|
- u_int64_t hx, lx, ix, ixl; |
|
|
|
- u_int64_t hx, lx, ix, ixl; |
|
|
|
+ uint64_t hx, lx, ix, ixl; |
|
|
|
+ uint64_t hx, lx, ix, ixl; |
|
|
|
int64_t explo; |
|
|
|
int64_t explo; |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
+ double xhi, xlo; |
|
|
|
+ double xhi, xlo; |
|
|
|
+ |
|
|
|
+ |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
ixl = 0x7fffffffffffffffULL&lx; |
|
|
|
ixl = 0x7fffffffffffffffULL&lx; |
|
|
|
ix = 0x7fffffffffffffffULL&hx; |
|
|
|
ix = 0x7fffffffffffffffULL&hx; |
|
|
|
*eptr = 0; |
|
|
|
*eptr = 0; |
|
|
|
- if(ix>=0x7ff0000000000000ULL||((ix|ixl)==0)) return x; /* 0,inf,nan */ |
|
|
|
- if(ix>=0x7ff0000000000000ULL||((ix|ixl)==0)) return x; /* 0,inf,nan */ |
|
|
|
+ if(ix>=0x7ff0000000000000ULL||ix==0) return x; /* 0,inf,nan */ |
|
|
|
+ if(ix>=0x7ff0000000000000ULL||ix==0) return x; /* 0,inf,nan */ |
|
|
|
if (ix<0x0010000000000000ULL) { /* subnormal */ |
|
|
|
if (ix<0x0010000000000000ULL) { /* subnormal */ |
|
|
|
x *= two107; |
|
|
|
x *= two107; |
|
|
|
- GET_LDOUBLE_MSW64(hx,x); |
|
|
|
- GET_LDOUBLE_MSW64(hx,x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
ix = hx&0x7fffffffffffffffULL; |
|
|
|
ix = hx&0x7fffffffffffffffULL; |
|
|
|
*eptr = -107; |
|
|
|
*eptr = -107; |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -54,7 +59,7 @@ |
|
|
|
@@ -54,7 +59,7 @@ |
|
|
|
if (ixl != 0ULL) { |
|
|
|
if (ixl != 0ULL) { |
|
|
|
explo = (ixl>>52) - (ix>>52) + 0x3fe; |
|
|
|
explo = (ixl>>52) - (ix>>52) + 0x3fe; |
|
|
|
if ((ixl&0x7ff0000000000000ULL) == 0LL) { |
|
|
|
if ((ixl&0x7ff0000000000000ULL) == 0LL) { |
|
|
|
- /* the lower double is a denomal so we need to correct its |
|
|
|
- /* the lower double is a denomal so we need to correct its |
|
|
|
+ /* the lower double is a denormal so we need to correct its |
|
|
|
+ /* the lower double is a denormal so we need to correct its |
|
|
|
mantissa and perhaps its exponent. */ |
|
|
|
mantissa and perhaps its exponent. */ |
|
|
|
int cnt; |
|
|
|
int cnt; |
|
|
|
|
|
|
|
|
|
|
|
@@ -73,7 +78,9 @@ |
|
|
|
@@ -73,7 +78,9 @@ |
|
|
|
lx = 0ULL; |
|
|
|
lx = 0ULL; |
|
|
|
|
|
|
|
|
|
|
|
hx = (hx&0x800fffffffffffffULL) | 0x3fe0000000000000ULL; |
|
|
|
hx = (hx&0x800fffffffffffffULL) | 0x3fe0000000000000ULL; |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef IS_IN_libm |
|
|
|
#ifdef IS_IN_libm |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c |
|
|
@ -828,67 +828,67 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c glibc-2.17-c |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_modfl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
@@ -37,43 +37,54 @@ |
|
|
|
@@ -37,43 +37,54 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64_t i0,i1,j0; |
|
|
|
int64_t i0,i1,j0; |
|
|
|
u_int64_t i; |
|
|
|
u_int64_t i; |
|
|
|
- GET_LDOUBLE_WORDS64(i0,i1,x); |
|
|
|
- GET_LDOUBLE_WORDS64(i0,i1,x); |
|
|
|
+ double xhi, xlo; |
|
|
|
+ double xhi, xlo; |
|
|
|
+ |
|
|
|
+ |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ EXTRACT_WORDS64 (i0, xhi); |
|
|
|
+ EXTRACT_WORDS64 (i0, xhi); |
|
|
|
+ EXTRACT_WORDS64 (i1, xlo); |
|
|
|
+ EXTRACT_WORDS64 (i1, xlo); |
|
|
|
i1 &= 0x000fffffffffffffLL; |
|
|
|
i1 &= 0x000fffffffffffffLL; |
|
|
|
j0 = ((i0>>52)&0x7ff)-0x3ff; /* exponent of x */ |
|
|
|
j0 = ((i0>>52)&0x7ff)-0x3ff; /* exponent of x */ |
|
|
|
if(j0<52) { /* integer part in high x */ |
|
|
|
if(j0<52) { /* integer part in high x */ |
|
|
|
if(j0<0) { /* |x|<1 */ |
|
|
|
if(j0<0) { /* |x|<1 */ |
|
|
|
/* *iptr = +-0 */ |
|
|
|
/* *iptr = +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0&0x8000000000000000ULL,0); |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0&0x8000000000000000ULL,0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ *iptr = xhi; |
|
|
|
+ *iptr = xhi; |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
i = (0x000fffffffffffffLL)>>j0; |
|
|
|
i = (0x000fffffffffffffLL)>>j0; |
|
|
|
if(((i0&i)|(i1&0x7fffffffffffffffLL))==0) { /* x is integral */ |
|
|
|
if(((i0&i)|(i1&0x7fffffffffffffffLL))==0) { /* x is integral */ |
|
|
|
*iptr = x; |
|
|
|
*iptr = x; |
|
|
|
/* return +-0 */ |
|
|
|
/* return +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ x = xhi; |
|
|
|
+ x = xhi; |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0&(~i),0); |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0&(~i),0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&(~i)); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&(~i)); |
|
|
|
+ *iptr = xhi; |
|
|
|
+ *iptr = xhi; |
|
|
|
return x - *iptr; |
|
|
|
return x - *iptr; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (j0>103) { /* no fraction part */ |
|
|
|
} else if (j0>103) { /* no fraction part */ |
|
|
|
*iptr = x*one; |
|
|
|
*iptr = x*one; |
|
|
|
/* We must handle NaNs separately. */ |
|
|
|
/* We must handle NaNs separately. */ |
|
|
|
- if (j0 == 0x400 && ((i0 & 0x000fffffffffffffLL) | i1)) |
|
|
|
- if (j0 == 0x400 && ((i0 & 0x000fffffffffffffLL) | i1)) |
|
|
|
+ if ((i0 & 0x7fffffffffffffffLL) > 0x7ff0000000000000LL) |
|
|
|
+ if ((i0 & 0x7fffffffffffffffLL) > 0x7ff0000000000000LL) |
|
|
|
return x*one; |
|
|
|
return x*one; |
|
|
|
/* return +-0 */ |
|
|
|
/* return +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ x = xhi; |
|
|
|
+ x = xhi; |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} else { /* fraction part in low x */ |
|
|
|
} else { /* fraction part in low x */ |
|
|
|
i = -1ULL>>(j0-52); |
|
|
|
i = -1ULL>>(j0-52); |
|
|
|
if((i1&i)==0) { /* x is integral */ |
|
|
|
if((i1&i)==0) { /* x is integral */ |
|
|
|
*iptr = x; |
|
|
|
*iptr = x; |
|
|
|
/* return +-0 */ |
|
|
|
/* return +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
- SET_LDOUBLE_WORDS64(x,i0&0x8000000000000000ULL,0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ INSERT_WORDS64 (xhi, i0&0x8000000000000000ULL); |
|
|
|
+ x = xhi; |
|
|
|
+ x = xhi; |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0,i1&(~i)); |
|
|
|
- SET_LDOUBLE_WORDS64(*iptr,i0,i1&(~i)); |
|
|
|
+ INSERT_WORDS64 (xhi, i0); |
|
|
|
+ INSERT_WORDS64 (xhi, i0); |
|
|
|
+ INSERT_WORDS64 (xlo, i1&(~i)); |
|
|
|
+ INSERT_WORDS64 (xlo, i1&(~i)); |
|
|
|
+ *iptr = ldbl_pack (xhi, xlo); |
|
|
|
+ *iptr = ldbl_pack (xhi, xlo); |
|
|
|
return x - *iptr; |
|
|
|
return x - *iptr; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
@ -910,9 +910,9 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2 |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
ihx = hx&0x7fffffffffffffffLL; /* |hx| */ |
|
|
|
ihx = hx&0x7fffffffffffffffLL; /* |hx| */ |
|
|
|
- ilx = lx&0x7fffffffffffffffLL; /* |lx| */ |
|
|
|
- ilx = lx&0x7fffffffffffffffLL; /* |lx| */ |
|
|
|
ihy = hy&0x7fffffffffffffffLL; /* |hy| */ |
|
|
|
ihy = hy&0x7fffffffffffffffLL; /* |hy| */ |
|
|
|
|
|
|
|
|
|
|
|
- if((((ihx&0x7ff0000000000000LL)==0x7ff0000000000000LL)&& |
|
|
|
- if((((ihx&0x7ff0000000000000LL)==0x7ff0000000000000LL)&& |
|
|
|
- ((ihx&0x000fffffffffffffLL)!=0)) || /* x is nan */ |
|
|
|
- ((ihx&0x000fffffffffffffLL)!=0)) || /* x is nan */ |
|
|
@ -920,138 +920,138 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c glibc-2 |
|
|
|
- ((ihy&0x000fffffffffffffLL)!=0))) /* y is nan */ |
|
|
|
- ((ihy&0x000fffffffffffffLL)!=0))) /* y is nan */ |
|
|
|
+ if((ihx>0x7ff0000000000000LL) || /* x is nan */ |
|
|
|
+ if((ihx>0x7ff0000000000000LL) || /* x is nan */ |
|
|
|
+ (ihy>0x7ff0000000000000LL)) /* y is nan */ |
|
|
|
+ (ihy>0x7ff0000000000000LL)) /* y is nan */ |
|
|
|
return x+y; /* signal the nan */ |
|
|
|
return x+y; /* signal the nan */ |
|
|
|
if(x==y) |
|
|
|
if(x==y) |
|
|
|
return y; /* x=y, return y */ |
|
|
|
return y; /* x=y, return y */ |
|
|
|
- if(ihx == 0 && ilx == 0) { /* x == 0 */ |
|
|
|
- if(ihx == 0 && ilx == 0) { /* x == 0 */ |
|
|
|
- long double u; |
|
|
|
- long double u; |
|
|
|
+ if(ihx == 0) { /* x == 0 */ |
|
|
|
+ if(ihx == 0) { /* x == 0 */ |
|
|
|
+ long double u; /* return +-minsubnormal */ |
|
|
|
+ long double u; /* return +-minsubnormal */ |
|
|
|
hy = (hy & 0x8000000000000000ULL) | 1; |
|
|
|
hy = (hy & 0x8000000000000000ULL) | 1; |
|
|
|
- SET_LDOUBLE_WORDS64(x,hy,0ULL);/* return +-minsubnormal */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,hy,0ULL);/* return +-minsubnormal */ |
|
|
|
+ INSERT_WORDS64 (yhi, hy); |
|
|
|
+ INSERT_WORDS64 (yhi, hy); |
|
|
|
+ x = yhi; |
|
|
|
+ x = yhi; |
|
|
|
u = math_opt_barrier (x); |
|
|
|
u = math_opt_barrier (x); |
|
|
|
u = u * u; |
|
|
|
u = u * u; |
|
|
|
math_force_eval (u); /* raise underflow flag */ |
|
|
|
math_force_eval (u); /* raise underflow flag */ |
|
|
|
@@ -59,10 +60,16 @@ |
|
|
|
@@ -59,10 +60,16 @@ |
|
|
|
|
|
|
|
|
|
|
|
long double u; |
|
|
|
long double u; |
|
|
|
if(x > y) { /* x > y, x -= ulp */ |
|
|
|
if(x > y) { /* x > y, x -= ulp */ |
|
|
|
+ /* This isn't the largest magnitude correctly rounded |
|
|
|
+ /* This isn't the largest magnitude correctly rounded |
|
|
|
+ long double as you can see from the lowest mantissa |
|
|
|
+ long double as you can see from the lowest mantissa |
|
|
|
+ bit being zero. It is however the largest magnitude |
|
|
|
+ bit being zero. It is however the largest magnitude |
|
|
|
+ long double with a 106 bit mantissa, and nextafterl |
|
|
|
+ long double with a 106 bit mantissa, and nextafterl |
|
|
|
+ is insane with variable precision. So to make |
|
|
|
+ is insane with variable precision. So to make |
|
|
|
+ nextafterl sane we assume 106 bit precision. */ |
|
|
|
+ nextafterl sane we assume 106 bit precision. */ |
|
|
|
if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) |
|
|
|
if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) |
|
|
|
return x+x; /* overflow, return -inf */ |
|
|
|
return x+x; /* overflow, return -inf */ |
|
|
|
if (hx >= 0x7ff0000000000000LL) { |
|
|
|
if (hx >= 0x7ff0000000000000LL) { |
|
|
|
- SET_LDOUBLE_WORDS64(u,0x7fefffffffffffffLL,0x7c8ffffffffffffeLL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,0x7fefffffffffffffLL,0x7c8ffffffffffffeLL); |
|
|
|
+ u = 0x1.fffffffffffff7ffffffffffff8p+1023L; |
|
|
|
+ u = 0x1.fffffffffffff7ffffffffffff8p+1023L; |
|
|
|
return u; |
|
|
|
return u; |
|
|
|
} |
|
|
|
} |
|
|
|
if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ |
|
|
|
if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ |
|
|
|
@@ -77,16 +84,19 @@ |
|
|
|
@@ -77,16 +84,19 @@ |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ |
|
|
|
if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); |
|
|
|
+ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); |
|
|
|
+ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); |
|
|
|
+ u = yhi; |
|
|
|
+ u = yhi; |
|
|
|
u *= 0x1.0000000000000p-105L; |
|
|
|
u *= 0x1.0000000000000p-105L; |
|
|
|
- } else |
|
|
|
- } else |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); |
|
|
|
+ } else { |
|
|
|
+ } else { |
|
|
|
+ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); |
|
|
|
+ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); |
|
|
|
+ u = yhi; |
|
|
|
+ u = yhi; |
|
|
|
+ } |
|
|
|
+ } |
|
|
|
return x - u; |
|
|
|
return x - u; |
|
|
|
} else { /* x < y, x += ulp */ |
|
|
|
} else { /* x < y, x += ulp */ |
|
|
|
if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) |
|
|
|
if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) |
|
|
|
return x+x; /* overflow, return +inf */ |
|
|
|
return x+x; /* overflow, return +inf */ |
|
|
|
- if ((u_int64_t) hx >= 0xfff0000000000000ULL) { |
|
|
|
- if ((u_int64_t) hx >= 0xfff0000000000000ULL) { |
|
|
|
- SET_LDOUBLE_WORDS64(u,0xffefffffffffffffLL,0xfc8ffffffffffffeLL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,0xffefffffffffffffLL,0xfc8ffffffffffffeLL); |
|
|
|
+ if ((uint64_t) hx >= 0xfff0000000000000ULL) { |
|
|
|
+ if ((uint64_t) hx >= 0xfff0000000000000ULL) { |
|
|
|
+ u = -0x1.fffffffffffff7ffffffffffff8p+1023L; |
|
|
|
+ u = -0x1.fffffffffffff7ffffffffffff8p+1023L; |
|
|
|
return u; |
|
|
|
return u; |
|
|
|
} |
|
|
|
} |
|
|
|
if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ |
|
|
|
if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ |
|
|
|
@@ -103,10 +113,13 @@ |
|
|
|
@@ -103,10 +113,13 @@ |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ |
|
|
|
if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); |
|
|
|
+ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); |
|
|
|
+ INSERT_WORDS64 (yhi, hx & (0x7ffLL<<52)); |
|
|
|
+ u = yhi; |
|
|
|
+ u = yhi; |
|
|
|
u *= 0x1.0000000000000p-105L; |
|
|
|
u *= 0x1.0000000000000p-105L; |
|
|
|
- } else |
|
|
|
- } else |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); |
|
|
|
- SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); |
|
|
|
+ } else { |
|
|
|
+ } else { |
|
|
|
+ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); |
|
|
|
+ INSERT_WORDS64 (yhi, (hx & (0x7ffLL<<52))-(0x069LL<<52)); |
|
|
|
+ u = yhi; |
|
|
|
+ u = yhi; |
|
|
|
+ } |
|
|
|
+ } |
|
|
|
return x + u; |
|
|
|
return x + u; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:10:26.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c 2014-05-27 23:10:26.000000000 -0500 |
|
|
|
@@ -34,23 +34,23 @@ |
|
|
|
@@ -34,23 +34,23 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
int32_t hx,ix; |
|
|
|
int32_t hx,ix; |
|
|
|
int64_t hy,iy; |
|
|
|
int64_t hy,iy; |
|
|
|
- u_int32_t lx; |
|
|
|
- u_int32_t lx; |
|
|
|
- u_int64_t ly,uly; |
|
|
|
- u_int64_t ly,uly; |
|
|
|
+ uint32_t lx; |
|
|
|
+ uint32_t lx; |
|
|
|
+ double yhi; |
|
|
|
+ double yhi; |
|
|
|
+ |
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
EXTRACT_WORDS(hx,lx,x); |
|
|
|
EXTRACT_WORDS(hx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ EXTRACT_WORDS64(hy,yhi); |
|
|
|
+ EXTRACT_WORDS64(hy,yhi); |
|
|
|
ix = hx&0x7fffffff; /* |x| */ |
|
|
|
ix = hx&0x7fffffff; /* |x| */ |
|
|
|
iy = hy&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
iy = hy&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
- uly = ly&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
- uly = ly&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
|
|
|
|
|
|
|
|
if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ |
|
|
|
if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ |
|
|
|
- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) |
|
|
|
- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) |
|
|
|
- /* y is nan */ |
|
|
|
- /* y is nan */ |
|
|
|
+ iy>0x7ff0000000000000LL) /* y is nan */ |
|
|
|
+ iy>0x7ff0000000000000LL) /* y is nan */ |
|
|
|
return x+y; |
|
|
|
return x+y; |
|
|
|
if((long double) x==y) return y; /* x=y, return y */ |
|
|
|
if((long double) x==y) return y; /* x=y, return y */ |
|
|
|
if((ix|lx)==0) { /* x == 0 */ |
|
|
|
if((ix|lx)==0) { /* x == 0 */ |
|
|
|
double u; |
|
|
|
double u; |
|
|
|
- INSERT_WORDS(x,(u_int32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ |
|
|
|
- INSERT_WORDS(x,(u_int32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ |
|
|
|
+ INSERT_WORDS(x,(uint32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ |
|
|
|
+ INSERT_WORDS(x,(uint32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ |
|
|
|
u = math_opt_barrier (x); |
|
|
|
u = math_opt_barrier (x); |
|
|
|
u = u * u; |
|
|
|
u = u * u; |
|
|
|
math_force_eval (u); /* raise underflow flag */ |
|
|
|
math_force_eval (u); /* raise underflow flag */ |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
@@ -27,16 +27,16 @@ |
|
|
|
@@ -27,16 +27,16 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
int32_t hx,ix; |
|
|
|
int32_t hx,ix; |
|
|
|
int64_t hy,iy; |
|
|
|
int64_t hy,iy; |
|
|
|
- u_int64_t ly, uly; |
|
|
|
- u_int64_t ly, uly; |
|
|
|
+ double yhi; |
|
|
|
+ double yhi; |
|
|
|
|
|
|
|
|
|
|
|
GET_FLOAT_WORD(hx,x); |
|
|
|
GET_FLOAT_WORD(hx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
- GET_LDOUBLE_WORDS64(hy,ly,y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ yhi = ldbl_high (y); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
+ EXTRACT_WORDS64 (hy, yhi); |
|
|
|
ix = hx&0x7fffffff; /* |x| */ |
|
|
|
ix = hx&0x7fffffff; /* |x| */ |
|
|
|
iy = hy&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
iy = hy&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
- uly = ly&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
- uly = ly&0x7fffffffffffffffLL; /* |y| */ |
|
|
|
|
|
|
|
|
|
|
|
if((ix>0x7f800000) || /* x is nan */ |
|
|
|
if((ix>0x7f800000) || /* x is nan */ |
|
|
|
- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) |
|
|
|
- ((iy>=0x7ff0000000000000LL)&&((iy-0x7ff0000000000000LL)|uly)!=0)) |
|
|
|
+ (iy>0x7ff0000000000000LL)) |
|
|
|
+ (iy>0x7ff0000000000000LL)) |
|
|
|
/* y is nan */ |
|
|
|
/* y is nan */ |
|
|
|
return x+y; |
|
|
|
return x+y; |
|
|
|
if((long double) x==y) return y; /* x=y, return y */ |
|
|
|
if((long double) x==y) return y; /* x=y, return y */ |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_remquol.c 2014-05-27 23:05:55.000000000 -0500 |
|
|
@ -1090,53 +1090,53 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c glibc-2.1 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c 2014-05-27 23:15:30.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalblnl.c 2014-05-27 23:15:30.000000000 -0500 |
|
|
|
@@ -41,11 +41,15 @@ |
|
|
|
@@ -41,11 +41,15 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64_t k,l,hx,lx; |
|
|
|
int64_t k,l,hx,lx; |
|
|
|
union { int64_t i; double d; } u; |
|
|
|
union { int64_t i; double d; } u; |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
+ double xhi, xlo; |
|
|
|
+ double xhi, xlo; |
|
|
|
+ |
|
|
|
+ |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
k = (hx>>52)&0x7ff; /* extract exponent */ |
|
|
|
k = (hx>>52)&0x7ff; /* extract exponent */ |
|
|
|
l = (lx>>52)&0x7ff; |
|
|
|
l = (lx>>52)&0x7ff; |
|
|
|
if (k==0) { /* 0 or subnormal x */ |
|
|
|
if (k==0) { /* 0 or subnormal x */ |
|
|
|
- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
+ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
+ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
u.i = hx; |
|
|
|
u.i = hx; |
|
|
|
u.d *= two54; |
|
|
|
u.d *= two54; |
|
|
|
hx = u.i; |
|
|
|
hx = u.i; |
|
|
|
@@ -61,7 +65,9 @@ |
|
|
|
@@ -61,7 +65,9 @@ |
|
|
|
if (k > 0) { /* normal result */ |
|
|
|
if (k > 0) { /* normal result */ |
|
|
|
hx = (hx&0x800fffffffffffffULL)|(k<<52); |
|
|
|
hx = (hx&0x800fffffffffffffULL)|(k<<52); |
|
|
|
if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ |
|
|
|
if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (l == 0) { /* low part subnormal */ |
|
|
|
if (l == 0) { /* low part subnormal */ |
|
|
|
@@ -81,14 +87,19 @@ |
|
|
|
@@ -81,14 +87,19 @@ |
|
|
|
u.d *= twom54; |
|
|
|
u.d *= twom54; |
|
|
|
lx = u.i; |
|
|
|
lx = u.i; |
|
|
|
} |
|
|
|
} |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (k <= -54) |
|
|
|
if (k <= -54) |
|
|
|
return tiny*__copysignl(tiny,x); /*underflow*/ |
|
|
|
return tiny*__copysignl(tiny,x); /*underflow*/ |
|
|
|
k += 54; /* subnormal result */ |
|
|
|
k += 54; /* subnormal result */ |
|
|
|
lx &= 0x8000000000000000ULL; |
|
|
|
lx &= 0x8000000000000000ULL; |
|
|
|
- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); |
|
|
|
+ hx &= 0x800fffffffffffffULL; |
|
|
|
+ hx &= 0x800fffffffffffffULL; |
|
|
|
+ INSERT_WORDS64 (xhi, hx|(k<<52)); |
|
|
|
+ INSERT_WORDS64 (xhi, hx|(k<<52)); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x*twolm54; |
|
|
|
return x*twolm54; |
|
|
|
} |
|
|
|
} |
|
|
|
long_double_symbol (libm, __scalblnl, scalblnl); |
|
|
|
long_double_symbol (libm, __scalblnl, scalblnl); |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c |
|
|
@ -1144,53 +1144,53 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c glibc-2.17 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c 2014-05-27 23:16:25.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c 2014-05-27 23:16:25.000000000 -0500 |
|
|
|
@@ -41,11 +41,15 @@ |
|
|
|
@@ -41,11 +41,15 @@ |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64_t k,l,hx,lx; |
|
|
|
int64_t k,l,hx,lx; |
|
|
|
union { int64_t i; double d; } u; |
|
|
|
union { int64_t i; double d; } u; |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(hx,lx,x); |
|
|
|
+ double xhi, xlo; |
|
|
|
+ double xhi, xlo; |
|
|
|
+ |
|
|
|
+ |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ ldbl_unpack (x, &xhi, &xlo); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (hx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
+ EXTRACT_WORDS64 (lx, xlo); |
|
|
|
k = (hx>>52)&0x7ff; /* extract exponent */ |
|
|
|
k = (hx>>52)&0x7ff; /* extract exponent */ |
|
|
|
l = (lx>>52)&0x7ff; |
|
|
|
l = (lx>>52)&0x7ff; |
|
|
|
if (k==0) { /* 0 or subnormal x */ |
|
|
|
if (k==0) { /* 0 or subnormal x */ |
|
|
|
- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
- if (((hx|lx)&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
+ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
+ if ((hx&0x7fffffffffffffffULL)==0) return x; /* +-0 */ |
|
|
|
u.i = hx; |
|
|
|
u.i = hx; |
|
|
|
u.d *= two54; |
|
|
|
u.d *= two54; |
|
|
|
hx = u.i; |
|
|
|
hx = u.i; |
|
|
|
@@ -61,7 +65,9 @@ |
|
|
|
@@ -61,7 +65,9 @@ |
|
|
|
if (k > 0) { /* normal result */ |
|
|
|
if (k > 0) { /* normal result */ |
|
|
|
hx = (hx&0x800fffffffffffffULL)|(k<<52); |
|
|
|
hx = (hx&0x800fffffffffffffULL)|(k<<52); |
|
|
|
if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ |
|
|
|
if ((lx & 0x7fffffffffffffffULL) == 0) { /* low part +-0 */ |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (l == 0) { /* low part subnormal */ |
|
|
|
if (l == 0) { /* low part subnormal */ |
|
|
|
@@ -81,14 +87,19 @@ |
|
|
|
@@ -81,14 +87,19 @@ |
|
|
|
u.d *= twom54; |
|
|
|
u.d *= twom54; |
|
|
|
lx = u.i; |
|
|
|
lx = u.i; |
|
|
|
} |
|
|
|
} |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,hx,lx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xhi, hx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x; |
|
|
|
return x; |
|
|
|
} |
|
|
|
} |
|
|
|
if (k <= -54) |
|
|
|
if (k <= -54) |
|
|
|
return tiny*__copysignl(tiny,x); /*underflow*/ |
|
|
|
return tiny*__copysignl(tiny,x); /*underflow*/ |
|
|
|
k += 54; /* subnormal result */ |
|
|
|
k += 54; /* subnormal result */ |
|
|
|
lx &= 0x8000000000000000ULL; |
|
|
|
lx &= 0x8000000000000000ULL; |
|
|
|
- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); |
|
|
|
- SET_LDOUBLE_WORDS64(x,(hx&0x800fffffffffffffULL)|(k<<52),lx); |
|
|
|
+ hx &= 0x800fffffffffffffULL; |
|
|
|
+ hx &= 0x800fffffffffffffULL; |
|
|
|
+ INSERT_WORDS64 (xhi, hx|(k<<52)); |
|
|
|
+ INSERT_WORDS64 (xhi, hx|(k<<52)); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ INSERT_WORDS64 (xlo, lx); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
+ x = ldbl_pack (xhi, xlo); |
|
|
|
return x*twolm54; |
|
|
|
return x*twolm54; |
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef IS_IN_libm |
|
|
|
#ifdef IS_IN_libm |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c |
|
|
@ -1199,7 +1199,7 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c glibc-2.17-c |
|
|
|
@@ -47,10 +47,12 @@ |
|
|
|
@@ -47,10 +47,12 @@ |
|
|
|
long double __tanhl(long double x) |
|
|
|
long double __tanhl(long double x) |
|
|
|
{ |
|
|
|
{ |
|
|
|
long double t,z; |
|
|
|
long double t,z; |
|
|
|
- int64_t jx,ix,lx; |
|
|
|
- int64_t jx,ix,lx; |
|
|
|
+ int64_t jx,ix; |
|
|
|
+ int64_t jx,ix; |
|
|
|
+ double xhi; |
|
|
|
+ double xhi; |
|
|
@ -1208,18 +1208,18 @@ diff -urN glibc-2.17-c758a686/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c glibc-2.17-c |
|
|
|
- GET_LDOUBLE_WORDS64(jx,lx,x); |
|
|
|
- GET_LDOUBLE_WORDS64(jx,lx,x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ xhi = ldbl_high (x); |
|
|
|
+ EXTRACT_WORDS64 (jx, xhi); |
|
|
|
+ EXTRACT_WORDS64 (jx, xhi); |
|
|
|
ix = jx&0x7fffffffffffffffLL; |
|
|
|
ix = jx&0x7fffffffffffffffLL; |
|
|
|
|
|
|
|
|
|
|
|
/* x is INF or NaN */ |
|
|
|
/* x is INF or NaN */ |
|
|
|
@@ -61,7 +63,7 @@ |
|
|
|
@@ -61,7 +63,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
/* |x| < 22 */ |
|
|
|
/* |x| < 22 */ |
|
|
|
if (ix < 0x4036000000000000LL) { /* |x|<22 */ |
|
|
|
if (ix < 0x4036000000000000LL) { /* |x|<22 */ |
|
|
|
- if ((ix | (lx&0x7fffffffffffffffLL)) == 0) |
|
|
|
- if ((ix | (lx&0x7fffffffffffffffLL)) == 0) |
|
|
|
+ if (ix == 0) |
|
|
|
+ if (ix == 0) |
|
|
|
return x; /* x == +-0 */ |
|
|
|
return x; /* x == +-0 */ |
|
|
|
if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ |
|
|
|
if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ |
|
|
|
return x*(one+x); /* tanh(small) = small */ |
|
|
|
return x*(one+x); /* tanh(small) = small */ |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps |
|
|
|
diff -urN glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps |
|
|
|
--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
--- glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:05:51.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:08:26.000000000 -0500 |
|
|
|
+++ glibc-2.17-c758a686/sysdeps/powerpc/fpu/libm-test-ulps 2014-05-27 23:08:26.000000000 -0500 |
|
|
|