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
This commit is contained in:
Pat Haugen 2004-10-18 18:46:06 +00:00 committed by David Edelsohn
parent 1a1804c270
commit b757b9f8b2
4 changed files with 29 additions and 2 deletions

View File

@ -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.

View File

@ -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:

View File

@ -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,

View File

@ -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;