aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-10-01 19:38:02 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-10-01 19:38:02 -0700
commit69bd00e68103821a2729b05613509bfb04231693 (patch)
tree0d5a4dfe098881e5af5eb6426ef98c6dd45f8b3c /gcc
parentebc4cdc1358433015a3acdbacda4880b8968804e (diff)
downloadgcc-69bd00e68103821a2729b05613509bfb04231693.zip
gcc-69bd00e68103821a2729b05613509bfb04231693.tar.gz
gcc-69bd00e68103821a2729b05613509bfb04231693.tar.bz2
real.c (real_to_decimal): Crop trailing zeros for DIGITS < 0.
* real.c (real_to_decimal): Crop trailing zeros for DIGITS < 0. (real_to_hexadecimal): Likewise. * print-rtl.c (print_rtx): If we are linked with real.c, don't dump the XWINT fields of a floating point CONST_DOUBLE. From-SVN: r57719
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/print-rtl.c12
-rw-r--r--gcc/real.c24
3 files changed, 35 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55764a2..b504219 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2002-10-01 Richard Henderson <rth@redhat.com>
+
+ * real.c (real_to_decimal): Crop trailing zeros for DIGITS < 0.
+ (real_to_hexadecimal): Likewise.
+ * print-rtl.c (print_rtx): If we are linked with real.c, don't
+ dump the XWINT fields of a floating point CONST_DOUBLE.
+
2002-10-01 Jason Thorpe <thorpej@wasabisystems.com>
* config/vax/elf.h (FUNCTION_PROFILER): Fix __mcount call.
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index 1364e94..ebebf85 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -195,6 +195,11 @@ print_rtx (in_rtx)
}
}
+#ifndef GENERATOR_FILE
+ if (GET_CODE (in_rtx) == CONST_DOUBLE && FLOAT_MODE_P (GET_MODE (in_rtx)))
+ i = 5;
+#endif
+
/* Get the format string and skip the first elements if we have handled
them already. */
format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
@@ -517,11 +522,12 @@ print_rtx (in_rtx)
case CONST_DOUBLE:
if (FLOAT_MODE_P (GET_MODE (in_rtx)))
{
- REAL_VALUE_TYPE val;
char s[30];
- REAL_VALUE_FROM_CONST_DOUBLE (val, in_rtx);
- REAL_VALUE_TO_DECIMAL (val, s, -1);
+ real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx), -1);
+ fprintf (outfile, " %s", s);
+
+ real_to_hexadecimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx), -1);
fprintf (outfile, " [%s]", s);
}
break;
diff --git a/gcc/real.c b/gcc/real.c
index 891be81..4ce60d9 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -1388,9 +1388,9 @@ real_to_integer2 (plow, phigh, r)
*phigh = high;
}
-/* Render R as a decimal floating point constant. Emit DIGITS
- significant digits in the result. If DIGITS <= 0, choose the
- maximum for the representation. */
+/* Render R as a decimal floating point constant. Emit DIGITS significant
+ digits in the result. If DIGITS <= 0, choose the maximum for the
+ representation. If DIGITS < 0, strip trailing zeros. */
#define M_LOG10_2 0.30102999566398119521
@@ -1405,6 +1405,7 @@ real_to_decimal (str, r_orig, digits)
int dec_exp, max_digits, d, cmp_half;
char *p, *first, *last;
bool sign;
+ bool crop_trailing_zeros;
r = *r_orig;
switch (r.class)
@@ -1426,6 +1427,7 @@ real_to_decimal (str, r_orig, digits)
}
max_digits = SIGNIFICAND_BITS * M_LOG10_2;
+ crop_trailing_zeros = digits < 0;
if (digits <= 0 || digits > max_digits)
digits = max_digits;
@@ -1514,12 +1516,16 @@ real_to_decimal (str, r_orig, digits)
first[0] = first[1];
first[1] = '.';
+ if (crop_trailing_zeros)
+ while (last > first + 3 && last[-1] == '0')
+ last--;
+
sprintf (last, "e%+d", dec_exp);
}
/* Render R as a hexadecimal floating point constant. Emit DIGITS
significant digits in the result. If DIGITS <= 0, choose the maximum
- for the representation. */
+ for the representation. If DIGITS < 0, strip trailing zeros. */
void
real_to_hexadecimal (str, r, digits)
@@ -1528,7 +1534,8 @@ real_to_hexadecimal (str, r, digits)
int digits;
{
int i, j, exp = r->exp;
- char *p;
+ char *p, *first;
+ bool crop_trailing_zeros;
switch (r->class)
{
@@ -1548,6 +1555,7 @@ real_to_hexadecimal (str, r, digits)
abort ();
}
+ crop_trailing_zeros = digits < 0;
if (digits <= 0)
digits = SIGNIFICAND_BITS / 4;
@@ -1558,6 +1566,7 @@ real_to_hexadecimal (str, r, digits)
*p++ = 'x';
*p++ = '0';
*p++ = '.';
+ first = p;
for (i = SIGSZ - 1; i >= 0; --i)
for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
@@ -1566,7 +1575,12 @@ real_to_hexadecimal (str, r, digits)
if (--digits == 0)
goto out;
}
+
out:
+ if (crop_trailing_zeros)
+ while (p > first + 2 && p[-1] == '0')
+ p--;
+
sprintf (p, "p%+d", exp);
}