aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <erich@gnu.org>1996-02-19 11:57:13 +0000
committerRichard Earnshaw <erich@gnu.org>1996-02-19 11:57:13 +0000
commita5559dbc829b3c8e1ea5a7120f3c14397e547ecf (patch)
tree095251b7affbbbbb96a1f553708dc2613a58d652
parent4ae27eb62f59baed4be6cc11d154ac24db4a235d (diff)
downloadgcc-a5559dbc829b3c8e1ea5a7120f3c14397e547ecf.zip
gcc-a5559dbc829b3c8e1ea5a7120f3c14397e547ecf.tar.gz
gcc-a5559dbc829b3c8e1ea5a7120f3c14397e547ecf.tar.bz2
(operand_subword): For 32-bit targets, return
the appropriate subword of extended precision CONST_DOUBLEs. From-SVN: r11300
-rw-r--r--gcc/emit-rtl.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 748bb29..f04ba5f 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1157,6 +1157,20 @@ operand_subword (op, i, validate_address, mode)
else
abort ();
}
+ else if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
+ && GET_MODE_CLASS (mode) == MODE_FLOAT
+ && GET_MODE_BITSIZE (mode) > 64
+ && GET_CODE (op) == CONST_DOUBLE)
+ {
+ long k[4];
+ REAL_VALUE_TYPE rv;
+
+ REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
+
+ if (BITS_PER_WORD == 32)
+ return GEN_INT ((HOST_WIDE_INT) k[i]);
+ }
#else /* no REAL_ARITHMETIC */
if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
&& HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)