diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-11-16 17:40:22 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-11-16 17:40:22 -0500 |
commit | e01a2cecba12c077b614d2369bf67dddafe54bc7 (patch) | |
tree | 4db2b21f3c9733690fe014edbe287be02a908d09 | |
parent | 60814f4054d231c3eb7ca1bb1854851b8e57cd81 (diff) | |
download | gcc-e01a2cecba12c077b614d2369bf67dddafe54bc7.zip gcc-e01a2cecba12c077b614d2369bf67dddafe54bc7.tar.gz gcc-e01a2cecba12c077b614d2369bf67dddafe54bc7.tar.bz2 |
(operand_subword): Avoid confusion if sizeof (float) is less than a
full word.
From-SVN: r13194
-rw-r--r-- | gcc/emit-rtl.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index f328d7a..2036ca7 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1254,6 +1254,7 @@ operand_subword (op, i, validate_address, mode) if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) || flag_pretend_float) + && sizeof (float) * 8 == HOST_BITS_PER_WIDE_INT && GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE_SIZE (mode) == UNITS_PER_WORD && GET_CODE (op) == CONST_DOUBLE) @@ -1266,6 +1267,22 @@ operand_subword (op, i, validate_address, mode) u.f = d; return GEN_INT (u.i); } + if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT + && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) + || flag_pretend_float) + && sizeof (double) * 8 == HOST_BITS_PER_WIDE_INT + && GET_MODE_CLASS (mode) == MODE_FLOAT + && GET_MODE_SIZE (mode) == UNITS_PER_WORD + && GET_CODE (op) == CONST_DOUBLE) + { + double d; + union {double d; HOST_WIDE_INT i; } u; + + REAL_VALUE_FROM_CONST_DOUBLE (d, op); + + u.d = d; + return GEN_INT (u.i); + } #endif /* no REAL_ARITHMETIC */ /* The only remaining cases that we can handle are integers. |