aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPat Haugen <pthaugen@us.ibm.com>2004-10-18 18:46:06 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-10-18 14:46:06 -0400
commitb757b9f8b210b691f72fe418db8c0767bda54cb7 (patch)
tree4c36b35633d0f938381ebc4187f4b32439f4546d
parent1a1804c27017289c540fd8b193209a8598af858a (diff)
downloadgcc-b757b9f8b210b691f72fe418db8c0767bda54cb7.zip
gcc-b757b9f8b210b691f72fe418db8c0767bda54cb7.tar.gz
gcc-b757b9f8b210b691f72fe418db8c0767bda54cb7.tar.bz2
simplify-rtx.c (mode_signbit_p): Externalize function...
2004-10-18 Pat Haugen <pthaugen@us.ibm.com> * simplify-rtx.c (mode_signbit_p): Externalize function... * rtl.h (mode_signbit_p): ... to here. * combine.c (simplify_shift_const): Recognize PLUS signbit as canonical form of XOR signbit and move to outer op. From-SVN: r89235
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c20
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/simplify-rtx.c3
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fe4213b..7e1ab3c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-18 Pat Haugen <pthaugen@us.ibm.com>
+
+ * simplify-rtx.c (mode_signbit_p): Externalize function...
+ * rtl.h (mode_signbit_p): ... to here.
+ * combine.c (simplify_shift_const): Recognize PLUS signbit as
+ canonical form of XOR signbit and move to outer op.
+
2004-10-18 Diego Novillo <dnovillo@redhat.com>
* tree-cfg.c (bsi_for_stmt): Rename from stmt_for_bsi.
diff --git a/gcc/combine.c b/gcc/combine.c
index 559ee15..98efe3e 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -9022,6 +9022,26 @@ simplify_shift_const (rtx x, enum rtx_code code,
varop = XEXP (varop, 0);
continue;
}
+
+ /* Check for 'PLUS signbit', which is the canonical form of 'XOR
+ signbit', and attempt to change the PLUS to an XOR and move it to
+ the outer operation as is done above in the AND/IOR/XOR case
+ leg for shift(logical). See details in logical handling above
+ for reasoning in doing so. */
+ if (code == LSHIFTRT
+ && GET_CODE (XEXP (varop, 1)) == CONST_INT
+ && mode_signbit_p (result_mode, XEXP (varop, 1))
+ && (new = simplify_binary_operation (code, result_mode,
+ XEXP (varop, 1),
+ GEN_INT (count))) != 0
+ && GET_CODE (new) == CONST_INT
+ && merge_outer_ops (&outer_op, &outer_const, XOR,
+ INTVAL (new), result_mode, &complement_p))
+ {
+ varop = XEXP (varop, 0);
+ continue;
+ }
+
break;
case MINUS:
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 3ebf4aa..ca2a017 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1570,6 +1570,7 @@ extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
extern rtx simplify_replace_rtx (rtx, rtx, rtx);
extern rtx simplify_rtx (rtx);
extern rtx avoid_constant_pool_reference (rtx);
+extern bool mode_signbit_p (enum machine_mode, rtx);
/* In regclass.c */
extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 7236bbf..4af468a 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -50,7 +50,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
((((HOST_WIDE_INT) low) < 0) ? ((HOST_WIDE_INT) -1) : ((HOST_WIDE_INT) 0))
static rtx neg_const_int (enum machine_mode, rtx);
-static bool mode_signbit_p (enum machine_mode, rtx);
static int simplify_plus_minus_op_data_cmp (const void *, const void *);
static rtx simplify_plus_minus (enum rtx_code, enum machine_mode, rtx,
rtx, int);
@@ -72,7 +71,7 @@ neg_const_int (enum machine_mode mode, rtx i)
/* Test whether expression, X, is an immediate constant that represents
the most significant bit of machine mode MODE. */
-static bool
+bool
mode_signbit_p (enum machine_mode mode, rtx x)
{
unsigned HOST_WIDE_INT val;