mirror of git://sourceware.org/git/glibc.git
Fix missing truncation UNDERFLOW.
This commit is contained in:
parent
640ac3f1bf
commit
47594329a9
|
@ -1,3 +1,10 @@
|
||||||
|
2012-11-13 Marcus Shawcroft <marcus.shawcroft@linaro.org>
|
||||||
|
|
||||||
|
* soft-fp/op-common.h (_FP_PACK_SEMIRAW): Move underflow
|
||||||
|
detection to immediately after _FP_ROUND().
|
||||||
|
* soft-fp/soft-fp.h (_FP_ROUND): Don't round if working
|
||||||
|
bits are 0.
|
||||||
|
|
||||||
2012-11-11 David S. Miller <davem@davemloft.net>
|
2012-11-11 David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c: Include
|
* sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c: Include
|
||||||
|
|
|
@ -134,6 +134,12 @@ do { \
|
||||||
#define _FP_PACK_SEMIRAW(fs, wc, X) \
|
#define _FP_PACK_SEMIRAW(fs, wc, X) \
|
||||||
do { \
|
do { \
|
||||||
_FP_ROUND(wc, X); \
|
_FP_ROUND(wc, X); \
|
||||||
|
if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
|
{ \
|
||||||
|
if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) \
|
||||||
|
|| (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)) \
|
||||||
|
FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
|
||||||
|
} \
|
||||||
if (_FP_FRAC_HIGH_##fs(X) \
|
if (_FP_FRAC_HIGH_##fs(X) \
|
||||||
& (_FP_OVERFLOW_##fs >> 1)) \
|
& (_FP_OVERFLOW_##fs >> 1)) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -143,24 +149,15 @@ do { \
|
||||||
_FP_OVERFLOW_SEMIRAW(fs, wc, X); \
|
_FP_OVERFLOW_SEMIRAW(fs, wc, X); \
|
||||||
} \
|
} \
|
||||||
_FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
|
_FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
|
||||||
if (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X)) \
|
if (X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
{ \
|
{ \
|
||||||
if (X##_e == 0) \
|
if (!_FP_KEEPNANFRACP) \
|
||||||
{ \
|
{ \
|
||||||
if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) \
|
_FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \
|
||||||
|| (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)) \
|
X##_s = _FP_NANSIGN_##fs; \
|
||||||
FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
|
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
_FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
|
||||||
if (!_FP_KEEPNANFRACP) \
|
|
||||||
{ \
|
|
||||||
_FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \
|
|
||||||
X##_s = _FP_NANSIGN_##fs; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
_FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
|
@ -158,22 +158,24 @@ do { \
|
||||||
#define _FP_ROUND(wc, X) \
|
#define _FP_ROUND(wc, X) \
|
||||||
do { \
|
do { \
|
||||||
if (_FP_FRAC_LOW_##wc(X) & 7) \
|
if (_FP_FRAC_LOW_##wc(X) & 7) \
|
||||||
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
{ \
|
||||||
switch (FP_ROUNDMODE) \
|
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
||||||
{ \
|
switch (FP_ROUNDMODE) \
|
||||||
case FP_RND_NEAREST: \
|
{ \
|
||||||
_FP_ROUND_NEAREST(wc,X); \
|
case FP_RND_NEAREST: \
|
||||||
break; \
|
_FP_ROUND_NEAREST(wc,X); \
|
||||||
case FP_RND_ZERO: \
|
break; \
|
||||||
_FP_ROUND_ZERO(wc,X); \
|
case FP_RND_ZERO: \
|
||||||
break; \
|
_FP_ROUND_ZERO(wc,X); \
|
||||||
case FP_RND_PINF: \
|
break; \
|
||||||
_FP_ROUND_PINF(wc,X); \
|
case FP_RND_PINF: \
|
||||||
break; \
|
_FP_ROUND_PINF(wc,X); \
|
||||||
case FP_RND_MINF: \
|
break; \
|
||||||
_FP_ROUND_MINF(wc,X); \
|
case FP_RND_MINF: \
|
||||||
break; \
|
_FP_ROUND_MINF(wc,X); \
|
||||||
} \
|
break; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_CLS_NORMAL 0
|
#define FP_CLS_NORMAL 0
|
||||||
|
|
Loading…
Reference in New Issue