From 98ee7e6caa96e4fe7ef50d0db29f5dd8ccbc0c59 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 29 Sep 2002 23:04:16 -0700 Subject: [PATCH] * real.c (real_from_string): Apply sign last. Tidy exponent handling. From-SVN: r57637 --- gcc/ChangeLog | 4 ++++ gcc/real.c | 39 +++++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0d7735f1166..6bd1e0e1cc97 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2002-09-29 Richard Henderson + + * real.c (real_from_string): Apply sign last. Tidy exponent handling. + 2002-09-29 Richard Henderson * combine.c (force_to_mode): Handle FLOAT_MODE destinations diff --git a/gcc/real.c b/gcc/real.c index f5e6cb01db2b..891be811d036 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -1579,12 +1579,13 @@ real_from_string (r, str) const char *str; { int exp = 0; + bool sign = false; get_zero (r, 0); if (*str == '-') { - r->sign = 1; + sign = true; str++; } else if (*str == '+') @@ -1616,6 +1617,11 @@ real_from_string (r, str) if (*str == '.') { str++; + if (pos == SIGNIFICAND_BITS - 4) + { + while (*str == '0') + str++, exp -= 4; + } while (1) { d = hex_value (*str); @@ -1632,12 +1638,12 @@ real_from_string (r, str) } if (*str == 'p' || *str == 'P') { - int exp_neg = 0; + bool exp_neg = false; str++; if (*str == '-') { - exp_neg = 1; + exp_neg = true; str++; } else if (*str == '+') @@ -1646,10 +1652,9 @@ real_from_string (r, str) d = 0; while (ISDIGIT (*str)) { - int t = d; d *= 10; d += *str - '0'; - if (d < t) + if (d > MAX_EXP) { /* Overflowed the exponent. */ if (exp_neg) @@ -1667,13 +1672,6 @@ real_from_string (r, str) r->class = rvc_normal; r->exp = exp; - if (r->exp != exp) - { - if (exp < 0) - goto underflow; - else - goto overflow; - } normalize (r); } @@ -1695,6 +1693,11 @@ real_from_string (r, str) if (*str == '.') { str++; + if (r->class == rvc_zero) + { + while (*str == '0') + str++, exp--; + } while (ISDIGIT (*str)) { d = *str++ - '0'; @@ -1707,12 +1710,12 @@ real_from_string (r, str) if (*str == 'e' || *str == 'E') { - int exp_neg = 0; + bool exp_neg = false; str++; if (*str == '-') { - exp_neg = 1; + exp_neg = true; str++; } else if (*str == '+') @@ -1721,10 +1724,9 @@ real_from_string (r, str) d = 0; while (ISDIGIT (*str)) { - int t = d; d *= 10; d += *str - '0'; - if (d < t) + if (d > MAX_EXP) { /* Overflowed the exponent. */ if (exp_neg) @@ -1754,14 +1756,15 @@ real_from_string (r, str) } } + r->sign = sign; return; underflow: - get_zero (r, r->sign); + get_zero (r, sign); return; overflow: - get_inf (r, r->sign); + get_inf (r, sign); return; }