aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-07-06 15:40:02 -0700
committerJeff Law <law@gcc.gnu.org>1998-07-06 16:40:02 -0600
commit800d5c9e172776de4ad5875559d83049263005a2 (patch)
treeef4e4031500c7bf6540c60822a29018f4e226818 /gcc
parent4051959be99ddba084673788892d3e26bac13621 (diff)
downloadgcc-800d5c9e172776de4ad5875559d83049263005a2.zip
gcc-800d5c9e172776de4ad5875559d83049263005a2.tar.gz
gcc-800d5c9e172776de4ad5875559d83049263005a2.tar.bz2
print-rtl.c (print_rtx): Display the real-value equivalent of a const_double when easy.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/print-rtl.c10
-rw-r--r--gcc/real.h42
-rw-r--r--gcc/varasm.c2
4 files changed, 46 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 872e982..191f402 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index ef25e7e..893c001 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -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;
}
diff --git a/gcc/real.h b/gcc/real.h
index 848ef18..0719c26 100644
--- a/gcc/real.h
+++ b/gcc/real.h
@@ -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 */
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 4ba0e08..39e09c7 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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);