diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-30 06:04:16 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-30 06:04:16 +0000 |
commit | a730f650572d207341371a7b360dd38c6e8f57de (patch) | |
tree | 3a446a9049cc5952eced61f2dc460d2614aba10b /gcc | |
parent | b1e50a255783d7f2222d896af5e958cdaed0daf1 (diff) | |
download | gcc-a730f650572d207341371a7b360dd38c6e8f57de.tar.gz |
* real.c (real_from_string): Apply sign last. Tidy exponent handling.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57637 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/real.c | 39 |
2 files changed, 25 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0d7735f116..6bd1e0e1cc9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2002-09-29 Richard Henderson <rth@redhat.com> + * real.c (real_from_string): Apply sign last. Tidy exponent handling. + +2002-09-29 Richard Henderson <rth@redhat.com> + * combine.c (force_to_mode): Handle FLOAT_MODE destinations for CONST_INT. diff --git a/gcc/real.c b/gcc/real.c index f5e6cb01db2..891be811d03 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; } |