mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
soft-fp: Fix _FP_TO_INT latent bug in overflow handling.
This patch fixes a latent bug in _FP_TO_INT regarding handling of arguments with maximum exponent (infinities and NaNs). If the maximum exponent is below that calculated as an overflow threshold, such values would incorrectly be treated as normal values for the purposes of the conversion. This could not occur for any of the conversions actually occurring in glibc, libgcc or the Linux kernel (the maximum exponent for float is, just, big enough to ensure overflow for unsigned __int128), but would apply if soft-fp were used for IEEE binary16. Appropriate checks are inserted to ensure that the maximum exponent is always treated as an overflowing exponent, and never as a normal one. Tested for powerpc-nofpu that the disassembly of installed shared libraries is unchanged by this patch. * soft-fp/op-common.h (_FP_TO_INT): Ensure maximum exponent is treated as invalid conversion, not as normal exponent.
This commit is contained in:
parent
73e28d9c88
commit
0022e688d0
@ -1,5 +1,8 @@
|
|||||||
2014-10-09 Joseph Myers <joseph@codesourcery.com>
|
2014-10-09 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* soft-fp/op-common.h (_FP_TO_INT): Ensure maximum exponent is
|
||||||
|
treated as invalid conversion, not as normal exponent.
|
||||||
|
|
||||||
* soft-fp/op-common.h (_FP_CMP_CHECK_NAN): New macro.
|
* soft-fp/op-common.h (_FP_CMP_CHECK_NAN): New macro.
|
||||||
(_FP_CMP): Add extra argument EX. Call _FP_CMP_CHECK_NAN.
|
(_FP_CMP): Add extra argument EX. Call _FP_CMP_CHECK_NAN.
|
||||||
(_FP_CMP_EQ): Likewise.
|
(_FP_CMP_EQ): Likewise.
|
||||||
|
@ -1368,7 +1368,9 @@
|
|||||||
else \
|
else \
|
||||||
FP_SET_EXCEPTION (FP_EX_INEXACT); \
|
FP_SET_EXCEPTION (FP_EX_INEXACT); \
|
||||||
} \
|
} \
|
||||||
else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s) \
|
else if (X##_e >= (_FP_EXPMAX_##fs < _FP_EXPBIAS_##fs + rsize \
|
||||||
|
? _FP_EXPMAX_##fs \
|
||||||
|
: _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s)) \
|
||||||
|| (!rsigned && X##_s)) \
|
|| (!rsigned && X##_s)) \
|
||||||
{ \
|
{ \
|
||||||
/* Overflow or converting to the most negative integer. */ \
|
/* Overflow or converting to the most negative integer. */ \
|
||||||
@ -1385,7 +1387,10 @@
|
|||||||
r = ~r; \
|
r = ~r; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1) \
|
if (_FP_EXPBIAS_##fs + rsize - 1 < _FP_EXPMAX_##fs \
|
||||||
|
&& rsigned \
|
||||||
|
&& X##_s \
|
||||||
|
&& X##_e == _FP_EXPBIAS_##fs + rsize - 1) \
|
||||||
{ \
|
{ \
|
||||||
/* Possibly converting to most negative integer; check the \
|
/* Possibly converting to most negative integer; check the \
|
||||||
mantissa. */ \
|
mantissa. */ \
|
||||||
|
Loading…
Reference in New Issue
Block a user