aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-11-16 17:40:22 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1996-11-16 17:40:22 -0500
commite01a2cecba12c077b614d2369bf67dddafe54bc7 (patch)
tree4db2b21f3c9733690fe014edbe287be02a908d09
parent60814f4054d231c3eb7ca1bb1854851b8e57cd81 (diff)
downloadgcc-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.c17
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.