combine.c (combine_simplify_rtx): When handling a SUBREG, take SUBREG_WORD into account.
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Mon, 22 Nov 1999 23:56:34 +0000 (23:56 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Mon, 22 Nov 1999 23:56:34 +0000 (23:56 +0000)
* combine.c (combine_simplify_rtx): When handling a SUBREG,
take SUBREG_WORD into account.
(if_then_else_cond): Likewise.

From-SVN: r30623

gcc/ChangeLog
gcc/combine.c

index 9adf365e72f04c088820ce3986a105a6cda6e891..82f73ada28ecd5f2a1840f73513b03a3b14c03a7 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 22 23:53:50 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * combine.c (combine_simplify_rtx): When handling a SUBREG,
+       take SUBREG_WORD into account.
+       (if_then_else_cond): Likewise.
+
 1999-11-22  Jason Merrill  <jason@casey.cygnus.com>
 
        * gmon.c, i386/gmon-sol2.c, sparc/gmon-sol2.c: Remove advertising 
index 4a1cb0ee62c8d36d4722e349572719debee561d2..a853129da8f2db140628c53ec819bdb4aa878e8b 100644 (file)
@@ -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);