aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1998-01-01 12:55:19 +0000
committerJeff Law <law@gcc.gnu.org>1998-01-01 05:55:19 -0700
commitaa2ae67960340d03f93f8030a53fc6b7ae65dba5 (patch)
tree4c94ec9ba03228f14d55272aa91426ed89173a2e
parent9f1ff8e8ea908339ff7b3941adb53948c63e2c69 (diff)
downloadgcc-aa2ae67960340d03f93f8030a53fc6b7ae65dba5.zip
gcc-aa2ae67960340d03f93f8030a53fc6b7ae65dba5.tar.gz
gcc-aa2ae67960340d03f93f8030a53fc6b7ae65dba5.tar.bz2
emit-rtl.c (operand_subword): Correctly handle extracting a word from a CONST_DOUBLE for 16bit targets with...
* emit-rtl.c (operand_subword): Correctly handle extracting a word from a CONST_DOUBLE for 16bit targets with !WORDS_BIG_ENDIAN. From-SVN: r17276
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/emit-rtl.c9
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6a453b..4f0f0e8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
Thu Jan 1 10:49:12 1998 Jeffrey A Law (law@cygnus.com)
+ * emit-rtl.c (operand_subword): Correctly handle extracting a word
+ from a CONST_DOUBLE for 16bit targets with !WORDS_BIG_ENDIAN.
+
* mn10200.md (tstxx, cmpxx): Use "nonimmediate_operand" as predicate
for first argument.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index c93c3ea..7b114d6 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1208,7 +1208,7 @@ operand_subword (op, i, validate_address, mode)
{
long value;
value = k[i >> 1];
- if ((i & 0x1) == 0)
+ if ((i & 0x1) == !WORDS_BIG_ENDIAN)
value >>= 16;
value &= 0xffff;
return GEN_INT ((HOST_WIDE_INT) value);
@@ -1265,6 +1265,13 @@ operand_subword (op, i, validate_address, mode)
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
REAL_VALUE_TO_TARGET_SINGLE (rv, l);
+
+ if (BITS_PER_WORD == 16)
+ {
+ if ((i & 0x1) == !WORDS_BIG_ENDIAN)
+ l >>= 16;
+ l &= 0xffff;
+ }
return GEN_INT ((HOST_WIDE_INT) l);
}
#else