aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>1999-10-14 08:18:30 +0000
committerJeff Law <law@gcc.gnu.org>1999-10-14 02:18:30 -0600
commit0918eca0642ecac8d0617d4db57ec90d79eeda42 (patch)
treea57a6263d78a465f5a2317e71c41d41a97c8f3fa /gcc
parent866623d4d176f5c3b068ecafd97df3c4e1cf4f7f (diff)
downloadgcc-0918eca0642ecac8d0617d4db57ec90d79eeda42.zip
gcc-0918eca0642ecac8d0617d4db57ec90d79eeda42.tar.gz
gcc-0918eca0642ecac8d0617d4db57ec90d79eeda42.tar.bz2
combine.c (simplify_logical): Recognize xor pattern that encodes rotation.
* combine.c (simplify_logical): Recognize xor pattern that encodes rotation. From-SVN: r29965
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/combine.c15
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99b1d1f..14cae90 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/combine.c b/gcc/combine.c
index c63bf39..a7b9c0c 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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: