diff options
author | Richard Henderson <rth@cygnus.com> | 1998-07-06 15:40:02 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-07-06 16:40:02 -0600 |
commit | 800d5c9e172776de4ad5875559d83049263005a2 (patch) | |
tree | ef4e4031500c7bf6540c60822a29018f4e226818 /gcc | |
parent | 4051959be99ddba084673788892d3e26bac13621 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/print-rtl.c | 10 | ||||
-rw-r--r-- | gcc/real.h | 42 | ||||
-rw-r--r-- | gcc/varasm.c | 2 |
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; } @@ -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); |