real.c (real_to_decimal): Crop trailing zeros for DIGITS < 0.
authorRichard Henderson <rth@redhat.com>
Wed, 2 Oct 2002 02:38:02 +0000 (19:38 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 2 Oct 2002 02:38:02 +0000 (19:38 -0700)
        * 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

gcc/ChangeLog
gcc/print-rtl.c
gcc/real.c

index 55764a2ebb7558ecc7d2bc6c48098e357c66ea88..b50421956edd880c81ae157db05edb42426de6c6 100644 (file)
@@ -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.
index 1364e9498ddb58f4731145a09991d074393d151b..ebebf8586720a7a6ff29f274b706a7eb68941d2d 100644 (file)
@@ -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;
index 891be811d0361c1023b9f32b13f02462b6b67018..4ce60d9ad163983cd404487a7485d9bf5b36f195 100644 (file)
@@ -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);
 }