print-rtl.c (print_rtx): Display the real-value equivalent of a const_double when...
authorRichard Henderson <rth@cygnus.com>
Mon, 6 Jul 1998 22:40:02 +0000 (15:40 -0700)
committerJeff Law <law@gcc.gnu.org>
Mon, 6 Jul 1998 22:40:02 +0000 (16:40 -0600)
        * print-rtl.c (print_rtx): Display the real-value equivalent of
        a const_double when easy.
        * real.h (REAL_VALUE_TO_TARGET_SINGLE): Use a union to pun types.
        Zero memory first for predictability.
        (REAL_VALUE_TO_TARGET_DOUBLE): Likewise.
        * varasm.c (immed_real_const_1): Notice width of H_W_I == double.

From-SVN: r20972

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

index 872e982ed1cdea9d5f9a1730a6b9505be256aac3..191f40277694f284e1aef619b7f93eea1c61aaa3 100644 (file)
@@ -29,6 +29,14 @@ Mon Jul  6 22:17:19 1998  Alasdair Baird     <alasdair@wildcat.demon.co.uk>
 
 Mon Jul  6 22:14:31 1998  Richard Henderson  (rth@cygnus.com)
 
+       * print-rtl.c (print_rtx): Display the real-value equivalent of
+       a const_double when easy.
+
+       * real.h (REAL_VALUE_TO_TARGET_SINGLE): Use a union to pun types.
+       Zero memory first for predictability.
+       (REAL_VALUE_TO_TARGET_DOUBLE): Likewise.
+       * varasm.c (immed_real_const_1): Notice width of H_W_I == double.
+
        * regclass.c (allocate_reg_info): Initialize the entire reg_data
        virtual array.
 
index ef25e7e6ebe7f7023b9530a8e952e3845b994807..893c0018b58bf6c230b557a5eb8066806e5603d6 100644 (file)
@@ -23,6 +23,7 @@ Boston, MA 02111-1307, USA.  */
 #include "system.h"
 #include "rtl.h"
 #include "bitmap.h"
+#include "real.h"
 
 
 /* How to print out a register name.
@@ -268,6 +269,15 @@ print_rtx (in_rtx)
        abort ();
       }
 
+#if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
+  if (GET_CODE (in_rtx) == CONST_DOUBLE && FLOAT_MODE_P (GET_MODE (in_rtx)))
+    {
+      double val;
+      REAL_VALUE_FROM_CONST_DOUBLE (val, in_rtx);
+      fprintf (outfile, " [%.16g]", val);
+    }
+#endif
+
   fprintf (outfile, ")");
   sawclose = 1;
 }
index 848ef184f2f72fc53dc1b66a1d307761da7f8241..0719c26654d1c4672cabc4970645a8e947db3e65 100644 (file)
@@ -264,10 +264,18 @@ typedef struct {
    value in host format and then to a single type `long' value which
    is the bitwise equivalent of the `float' value.  */
 #ifndef REAL_VALUE_TO_TARGET_SINGLE
-#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT)                           \
-do { float f = (float) (IN);                                           \
-     (OUT) = *(long *) &f;                                             \
-   } while (0)
+#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT)           \
+do {                                                   \
+  union {                                              \
+    float f;                                           \
+    HOST_WIDE_INT l;                                   \
+  } u;                                                 \
+  if (sizeof(HOST_WIDE_INT) < sizeof(float))           \
+    abort();                                           \
+  u.l = 0;                                             \
+  u.f = (IN);                                          \
+  (OUT) = u.l;                                         \
+} while (0)
 #endif
 
 /* Convert a type `double' value in host format to a pair of type `long'
@@ -275,18 +283,20 @@ do { float f = (float) (IN);                                              \
    proper word order for the target.  */
 #ifndef REAL_VALUE_TO_TARGET_DOUBLE
 #define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT)                           \
-do { REAL_VALUE_TYPE in = (IN);  /* Make sure it's not in a register.  */\
-     if (HOST_FLOAT_WORDS_BIG_ENDIAN == FLOAT_WORDS_BIG_ENDIAN)                \
-       {                                                               \
-        (OUT)[0] = ((long *) &in)[0];                                  \
-        (OUT)[1] = ((long *) &in)[1];                                  \
-       }                                                               \
-     else                                                              \
-       {                                                               \
-        (OUT)[1] = ((long *) &in)[0];                                  \
-        (OUT)[0] = ((long *) &in)[1];                                  \
-       }                                                               \
-   } while (0)
+do {                                                                   \
+  union {                                                              \
+    REAL_VALUE_TYPE f;                                                 \
+    HOST_WIDE_INT l[2];                                                        \
+  } u;                                                                 \
+  if (sizeof(HOST_WIDE_INT) * 2 < sizeof(REAL_VALUE_TYPE))             \
+    abort();                                                           \
+  u.l[0] = u.l[1] = 0;                                                 \
+  u.f = (IN);                                                          \
+  if (HOST_FLOAT_WORDS_BIG_ENDIAN == FLOAT_WORDS_BIG_ENDIAN)           \
+    (OUT)[0] = u.l[0], (OUT)[1] = u.l[1];                              \
+  else                                                                 \
+    (OUT)[1] = u.l[0], (OUT)[0] = u.l[1];                              \
+} while (0)
 #endif
 #endif /* HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT */
 
index 4ba0e08d187b80a428af63df5fbe4753fd56fd6d..39e09c76f22c97e5da27079652766dad23ab6669 100644 (file)
@@ -2070,6 +2070,8 @@ immed_real_const_1 (d, mode)
   else if (! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d))
     return CONST1_RTX (mode);
 
+  if (sizeof u == sizeof (HOST_WIDE_INT))
+    return immed_double_const (u.i[0], 0, mode);
   if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
     return immed_double_const (u.i[0], u.i[1], mode);