diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe4213bd8c7..7e1ab3c3f18 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-10-18 Pat Haugen + + * 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 * tree-cfg.c (bsi_for_stmt): Rename from stmt_for_bsi. diff --git a/gcc/combine.c b/gcc/combine.c index 559ee153136..98efe3eb147 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 3ebf4aa7a17..ca2a0174ae5 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 7236bbfc064..4af468a40ca 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;