aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-11-22 23:56:34 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-11-22 23:56:34 +0000
commit54f3b5c2f14c4041de7a05c245988a2a5e17fb14 (patch)
treeb53937dbff310868363d7902d40a1327a0ded2f2 /gcc/combine.c
parentb49df33399b7267485bf2b6f519e32e1b3443d9f (diff)
downloadgcc-54f3b5c2f14c4041de7a05c245988a2a5e17fb14.zip
gcc-54f3b5c2f14c4041de7a05c245988a2a5e17fb14.tar.gz
gcc-54f3b5c2f14c4041de7a05c245988a2a5e17fb14.tar.bz2
combine.c (combine_simplify_rtx): When handling a SUBREG, take SUBREG_WORD into account.
* combine.c (combine_simplify_rtx): When handling a SUBREG, take SUBREG_WORD into account. (if_then_else_cond): Likewise. From-SVN: r30623
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 4a1cb0e..a853129 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3698,7 +3698,12 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
since we are saying that the high bits don't matter. */
if (CONSTANT_P (SUBREG_REG (x)) && GET_MODE (SUBREG_REG (x)) == VOIDmode
&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (op0_mode))
- return SUBREG_REG (x);
+ {
+ if (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) > UNITS_PER_WORD
+ && (WORDS_BIG_ENDIAN || SUBREG_WORD (x) != 0))
+ return operand_subword (SUBREG_REG (x), SUBREG_WORD (x), 0, mode);
+ return SUBREG_REG (x);
+ }
/* Note that we cannot do any narrowing for non-constants since
we might have been counting on using the fact that some bits were
@@ -7112,6 +7117,12 @@ if_then_else_cond (x, ptrue, pfalse)
&& 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
&true0, &false0)))
{
+ if (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) > UNITS_PER_WORD
+ && (WORDS_BIG_ENDIAN || SUBREG_WORD (x) != 0))
+ {
+ true0 = operand_subword (true0, SUBREG_WORD (x), 0, mode);
+ false0 = operand_subword (false0, SUBREG_WORD (x), 0, mode);
+ }
*ptrue = force_to_mode (true0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
*pfalse
= force_to_mode (false0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);