aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
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/combine.c
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/combine.c')
-rw-r--r--gcc/combine.c15
1 files changed, 15 insertions, 0 deletions
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: