Commit d06b3326 authored by Joseph Myers's avatar Joseph Myers Committed by Scott Wood

math-emu: fix floating-point to integer overflow detection

On overflow, the math-emu macro _FP_TO_INT_ROUND tries to saturate its
result (subject to the value of rsigned specifying the desired
overflow semantics).  However, if the rounding step has the effect of
increasing the exponent so as to cause overflow (if the rounded result
is 1 larger than the largest positive value with the given number of
bits, allowing for signedness), the overflow does not get detected,
meaning that for unsigned results 0 is produced instead of the maximum
unsigned integer with the give number of bits, without an exception
being raised for overflow, and that for signed results the minimum
(negative) value is produced instead of the maximum (positive) value,
again without an exception.  This patch makes the code check for
rounding increasing the exponent and adjusts the exponent value as
needed for the overflow check.
Signed-off-by: 's avatarJoseph Myers <joseph@codesourcery.com>
Signed-off-by: 's avatarScott Wood <scottwood@freescale.com>
parent 4f6db5ef
...@@ -743,12 +743,17 @@ do { \ ...@@ -743,12 +743,17 @@ do { \
} \ } \
else \ else \
{ \ { \
int _lz0, _lz1; \
if (X##_e <= -_FP_WORKBITS - 1) \ if (X##_e <= -_FP_WORKBITS - 1) \
_FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \ _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \
else \ else \
_FP_FRAC_SRS_##wc(X, _FP_FRACBITS_##fs - 1 - X##_e, \ _FP_FRAC_SRS_##wc(X, _FP_FRACBITS_##fs - 1 - X##_e, \
_FP_WFRACBITS_##fs); \ _FP_WFRACBITS_##fs); \
_FP_FRAC_CLZ_##wc(_lz0, X); \
_FP_ROUND(wc, X); \ _FP_ROUND(wc, X); \
_FP_FRAC_CLZ_##wc(_lz1, X); \
if (_lz1 < _lz0) \
X##_e++; /* For overflow detection. */ \
_FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \ _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
_FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \ _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \
} \ } \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment