From 0918eca0642ecac8d0617d4db57ec90d79eeda42 Mon Sep 17 00:00:00 2001 From: Marc Espie Date: Thu, 14 Oct 1999 08:18:30 +0000 Subject: [PATCH] combine.c (simplify_logical): Recognize xor pattern that encodes rotation. * combine.c (simplify_logical): Recognize xor pattern that encodes rotation. From-SVN: r29965 --- gcc/ChangeLog | 5 +++++ gcc/combine.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+) 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 + + * combine.c (simplify_logical): Recognize xor pattern that encodes + rotation. + Wed Oct 13 23:23:45 1999 Franz Sirl * 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: -- 2.7.4