* combine.c (simplify_logical): Recognize xor pattern that encodes
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 1999 08:18:30 +0000 (08:18 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 1999 08:18:30 +0000 (08:18 +0000)
        rotation.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29965 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c

index 99b1d1f..14cae90 100644 (file)
@@ -1,3 +1,8 @@
+Thu Oct 14 02:18:19 1999  Marc Espie <espie@cvs.openbsd.org>
+
+       * combine.c (simplify_logical): Recognize xor pattern that encodes
+       rotation.
+
 Wed Oct 13 23:23:45 1999  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
 
        * rs6000.c (expand_block_move): Use INTVAL, not XINT to access
index c63bf39..a7b9c0c 100644 (file)
@@ -5231,6 +5231,21 @@ simplify_logical (x, last)
          && reversible_comparison_p (op0))
        return gen_rtx_combine (reverse_condition (GET_CODE (op0)),
                                mode, XEXP (op0, 0), XEXP (op0, 1));
+
+      /* Convert (xor (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
+        mode size to (rotate A CX).  */
+
+      if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
+          || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
+         && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
+         && GET_CODE (XEXP (op0, 1)) == CONST_INT
+         && GET_CODE (XEXP (op1, 1)) == CONST_INT
+         && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
+             == GET_MODE_BITSIZE (mode)))
+       return gen_rtx_ROTATE (mode, XEXP (op0, 0),
+                              (GET_CODE (op0) == ASHIFT
+                               ? XEXP (op0, 1) : XEXP (op1, 1)));
+
       break;
 
     default: