aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-09-29 23:04:16 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-09-29 23:04:16 -0700
commit98ee7e6caa96e4fe7ef50d0db29f5dd8ccbc0c59 (patch)
tree3a446a9049cc5952eced61f2dc460d2614aba10b /gcc
parentd3cc3f10dac7b93c7b62d7e30b15f171fec3e8a5 (diff)
downloadgcc-98ee7e6caa96e4fe7ef50d0db29f5dd8ccbc0c59.zip
gcc-98ee7e6caa96e4fe7ef50d0db29f5dd8ccbc0c59.tar.gz
gcc-98ee7e6caa96e4fe7ef50d0db29f5dd8ccbc0c59.tar.bz2
* real.c (real_from_string): Apply sign last. Tidy exponent handling.
From-SVN: r57637
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/real.c39
2 files changed, 25 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e0d7735..6bd1e0e 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 f5e6cb0..891be81 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;
}