summaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-10-14 08:18:30 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-10-14 08:18:30 +0000
commit93b11250496f27bbded48d72acfd9072991877b4 (patch)
treea57a6263d78a465f5a2317e71c41d41a97c8f3fa /gcc/combine.c
parentb95894dcc2ace59c30f151287cf1f44ce2dbba35 (diff)
downloadgcc-93b11250496f27bbded48d72acfd9072991877b4.tar.gz
* combine.c (simplify_logical): Recognize xor pattern that encodes
rotation. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29965 138bc75d-0d04-0410-961f-82ee72b054a4
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 c63bf3998b0..a7b9c0c6d4a 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: