combine.c (simplify_rtx): Recognize another case of a synthesized sign extension.
authorJeffrey A Law <law@cygnus.com>
Thu, 2 Sep 1999 09:02:33 +0000 (09:02 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 2 Sep 1999 09:02:33 +0000 (03:02 -0600)
        * combine.c (simplify_rtx): Recognize another case of a synthesized
        sign extension.

From-SVN: r29055

gcc/ChangeLog
gcc/combine.c

index 1a63096..42f596b 100644 (file)
@@ -13,6 +13,9 @@ Thu Sep  2 00:43:59 1999  Finn Hakansson  <finn@axis.com>
 
 Thu Sep  2 00:06:43 1999  Jeffrey A Law  (law@cygnus.com)
 
+       * combine.c (simplify_rtx): Recognize another case of a synthesized
+       sign extension.
+
        * varasm.c (mark_constant_pool): When marking indirect references,
        only look at SYMBOL_REFs.
 
index 6886ba7..01703ba 100644 (file)
@@ -3913,12 +3913,14 @@ simplify_rtx (x, op0_mode, last, in_dest)
       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
         when c is (const_int (pow2 + 1) / 2) is a sign extension of a
         bit-field and can be replaced by either a sign_extend or a
-        sign_extract.  The `and' may be a zero_extend.  */
+        sign_extract.  The `and' may be a zero_extend and the two
+        <c>, -<c> constants may be reversed.  */
       if (GET_CODE (XEXP (x, 0)) == XOR
          && GET_CODE (XEXP (x, 1)) == CONST_INT
          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
          && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1))
-         && (i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
+         && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
+             || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
          && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
          && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
               && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT