diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-10-14 08:18:30 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-10-14 08:18:30 +0000 |
commit | 93b11250496f27bbded48d72acfd9072991877b4 (patch) | |
tree | a57a6263d78a465f5a2317e71c41d41a97c8f3fa /gcc/combine.c | |
parent | b95894dcc2ace59c30f151287cf1f44ce2dbba35 (diff) | |
download | gcc-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.c | 15 |
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: |