Commit 98ee7e6c by Richard Henderson Committed by Richard Henderson

* real.c (real_from_string): Apply sign last. Tidy exponent handling.

From-SVN: r57637
parent d3cc3f10
2002-09-29 Richard Henderson <rth@redhat.com> 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 * combine.c (force_to_mode): Handle FLOAT_MODE destinations
for CONST_INT. for CONST_INT.
......
...@@ -1579,12 +1579,13 @@ real_from_string (r, str) ...@@ -1579,12 +1579,13 @@ real_from_string (r, str)
const char *str; const char *str;
{ {
int exp = 0; int exp = 0;
bool sign = false;
get_zero (r, 0); get_zero (r, 0);
if (*str == '-') if (*str == '-')
{ {
r->sign = 1; sign = true;
str++; str++;
} }
else if (*str == '+') else if (*str == '+')
...@@ -1616,6 +1617,11 @@ real_from_string (r, str) ...@@ -1616,6 +1617,11 @@ real_from_string (r, str)
if (*str == '.') if (*str == '.')
{ {
str++; str++;
if (pos == SIGNIFICAND_BITS - 4)
{
while (*str == '0')
str++, exp -= 4;
}
while (1) while (1)
{ {
d = hex_value (*str); d = hex_value (*str);
...@@ -1632,12 +1638,12 @@ real_from_string (r, str) ...@@ -1632,12 +1638,12 @@ real_from_string (r, str)
} }
if (*str == 'p' || *str == 'P') if (*str == 'p' || *str == 'P')
{ {
int exp_neg = 0; bool exp_neg = false;
str++; str++;
if (*str == '-') if (*str == '-')
{ {
exp_neg = 1; exp_neg = true;
str++; str++;
} }
else if (*str == '+') else if (*str == '+')
...@@ -1646,10 +1652,9 @@ real_from_string (r, str) ...@@ -1646,10 +1652,9 @@ real_from_string (r, str)
d = 0; d = 0;
while (ISDIGIT (*str)) while (ISDIGIT (*str))
{ {
int t = d;
d *= 10; d *= 10;
d += *str - '0'; d += *str - '0';
if (d < t) if (d > MAX_EXP)
{ {
/* Overflowed the exponent. */ /* Overflowed the exponent. */
if (exp_neg) if (exp_neg)
...@@ -1667,13 +1672,6 @@ real_from_string (r, str) ...@@ -1667,13 +1672,6 @@ real_from_string (r, str)
r->class = rvc_normal; r->class = rvc_normal;
r->exp = exp; r->exp = exp;
if (r->exp != exp)
{
if (exp < 0)
goto underflow;
else
goto overflow;
}
normalize (r); normalize (r);
} }
...@@ -1695,6 +1693,11 @@ real_from_string (r, str) ...@@ -1695,6 +1693,11 @@ real_from_string (r, str)
if (*str == '.') if (*str == '.')
{ {
str++; str++;
if (r->class == rvc_zero)
{
while (*str == '0')
str++, exp--;
}
while (ISDIGIT (*str)) while (ISDIGIT (*str))
{ {
d = *str++ - '0'; d = *str++ - '0';
...@@ -1707,12 +1710,12 @@ real_from_string (r, str) ...@@ -1707,12 +1710,12 @@ real_from_string (r, str)
if (*str == 'e' || *str == 'E') if (*str == 'e' || *str == 'E')
{ {
int exp_neg = 0; bool exp_neg = false;
str++; str++;
if (*str == '-') if (*str == '-')
{ {
exp_neg = 1; exp_neg = true;
str++; str++;
} }
else if (*str == '+') else if (*str == '+')
...@@ -1721,10 +1724,9 @@ real_from_string (r, str) ...@@ -1721,10 +1724,9 @@ real_from_string (r, str)
d = 0; d = 0;
while (ISDIGIT (*str)) while (ISDIGIT (*str))
{ {
int t = d;
d *= 10; d *= 10;
d += *str - '0'; d += *str - '0';
if (d < t) if (d > MAX_EXP)
{ {
/* Overflowed the exponent. */ /* Overflowed the exponent. */
if (exp_neg) if (exp_neg)
...@@ -1754,14 +1756,15 @@ real_from_string (r, str) ...@@ -1754,14 +1756,15 @@ real_from_string (r, str)
} }
} }
r->sign = sign;
return; return;
underflow: underflow:
get_zero (r, r->sign); get_zero (r, sign);
return; return;
overflow: overflow:
get_inf (r, r->sign); get_inf (r, sign);
return; return;
} }
......
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