mirror of git://sourceware.org/git/glibc.git
[BZ #22244] Fix yn(n,0) without SVID wrapper
Without SVID compat wrapper yn(n,0) and ynf(n,0) does not raise the divide-by-zero excpetion and it may return inf with the wrong sign for n < 0. [BZ #22244] * sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_yn): Fix x == 0 case. * sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_ynf): Likewise.
This commit is contained in:
parent
8f8f8ef7ab
commit
86c27ade1e
|
@ -1,3 +1,9 @@
|
||||||
|
2017-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
|
||||||
|
[BZ #22244]
|
||||||
|
* sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_yn): Fix x == 0 case.
|
||||||
|
* sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_ynf): Likewise.
|
||||||
|
|
||||||
2017-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
2017-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
|
||||||
[BZ #22243]
|
[BZ #22243]
|
||||||
|
|
|
@ -268,11 +268,6 @@ __ieee754_yn (int n, double x)
|
||||||
/* if Y(n,NaN) is NaN */
|
/* if Y(n,NaN) is NaN */
|
||||||
if (__glibc_unlikely ((ix | ((uint32_t) (lx | -lx)) >> 31) > 0x7ff00000))
|
if (__glibc_unlikely ((ix | ((uint32_t) (lx | -lx)) >> 31) > 0x7ff00000))
|
||||||
return x + x;
|
return x + x;
|
||||||
if (__glibc_unlikely ((ix | lx) == 0))
|
|
||||||
return -HUGE_VAL + x;
|
|
||||||
/* -inf and overflow exception. */;
|
|
||||||
if (__glibc_unlikely (hx < 0))
|
|
||||||
return zero / (zero * x);
|
|
||||||
sign = 1;
|
sign = 1;
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
|
@ -281,6 +276,11 @@ __ieee754_yn (int n, double x)
|
||||||
}
|
}
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
return (__ieee754_y0 (x));
|
return (__ieee754_y0 (x));
|
||||||
|
if (__glibc_unlikely ((ix | lx) == 0))
|
||||||
|
return -sign / zero;
|
||||||
|
/* -inf and overflow exception. */;
|
||||||
|
if (__glibc_unlikely (hx < 0))
|
||||||
|
return zero / (zero * x);
|
||||||
{
|
{
|
||||||
SET_RESTORE_ROUND (FE_TONEAREST);
|
SET_RESTORE_ROUND (FE_TONEAREST);
|
||||||
if (n == 1)
|
if (n == 1)
|
||||||
|
|
|
@ -194,15 +194,15 @@ __ieee754_ynf(int n, float x)
|
||||||
ix = 0x7fffffff&hx;
|
ix = 0x7fffffff&hx;
|
||||||
/* if Y(n,NaN) is NaN */
|
/* if Y(n,NaN) is NaN */
|
||||||
if(__builtin_expect(ix>0x7f800000, 0)) return x+x;
|
if(__builtin_expect(ix>0x7f800000, 0)) return x+x;
|
||||||
if(__builtin_expect(ix==0, 0))
|
|
||||||
return -HUGE_VALF+x; /* -inf and overflow exception. */
|
|
||||||
if(__builtin_expect(hx<0, 0)) return zero/(zero*x);
|
|
||||||
sign = 1;
|
sign = 1;
|
||||||
if(n<0){
|
if(n<0){
|
||||||
n = -n;
|
n = -n;
|
||||||
sign = 1 - ((n&1)<<1);
|
sign = 1 - ((n&1)<<1);
|
||||||
}
|
}
|
||||||
if(n==0) return(__ieee754_y0f(x));
|
if(n==0) return(__ieee754_y0f(x));
|
||||||
|
if(__builtin_expect(ix==0, 0))
|
||||||
|
return -sign/zero;
|
||||||
|
if(__builtin_expect(hx<0, 0)) return zero/(zero*x);
|
||||||
SET_RESTORE_ROUNDF (FE_TONEAREST);
|
SET_RESTORE_ROUNDF (FE_TONEAREST);
|
||||||
if(n==1) {
|
if(n==1) {
|
||||||
ret = sign*__ieee754_y1f(x);
|
ret = sign*__ieee754_y1f(x);
|
||||||
|
|
Loading…
Reference in New Issue