Commit c54293c6 by Alan Modra Committed by Alan Modra

re PR target/21017 (ppc 64bit target not using rlwinm)

	PR target/21017
	* combine.c (simplify_logical <IOR>): Simplify more patterns to
	rotates.

From-SVN: r107873
parent 815eb8f0
2005-12-02 Alan Modra <amodra@bigpond.net.au> 2005-12-02 Alan Modra <amodra@bigpond.net.au>
PR target/21017
* combine.c (simplify_logical <IOR>): Simplify more patterns to
rotates.
2005-12-02 Alan Modra <amodra@bigpond.net.au>
PR middle-end/25176 PR middle-end/25176
* function.c (expand_function_end): Emit blockage for unwinder * function.c (expand_function_end): Emit blockage for unwinder
after return label. after return label.
......
...@@ -5597,7 +5597,7 @@ simplify_logical (rtx x) ...@@ -5597,7 +5597,7 @@ simplify_logical (rtx x)
enum machine_mode mode = GET_MODE (x); enum machine_mode mode = GET_MODE (x);
rtx op0 = XEXP (x, 0); rtx op0 = XEXP (x, 0);
rtx op1 = XEXP (x, 1); rtx op1 = XEXP (x, 1);
rtx reversed; rtx tmp, reversed;
switch (GET_CODE (x)) switch (GET_CODE (x))
{ {
...@@ -5724,16 +5724,37 @@ simplify_logical (rtx x) ...@@ -5724,16 +5724,37 @@ simplify_logical (rtx x)
/* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
mode size to (rotate A CX). */ mode size to (rotate A CX). */
if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT) if (GET_CODE (op1) == ASHIFT
|| (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT)) || GET_CODE (op1) == SUBREG)
tmp = op1, op1 = op0, op0 = tmp;
if (GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT
&& rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0)) && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
&& GET_CODE (XEXP (op0, 1)) == CONST_INT && GET_CODE (XEXP (op0, 1)) == CONST_INT
&& GET_CODE (XEXP (op1, 1)) == CONST_INT && GET_CODE (XEXP (op1, 1)) == CONST_INT
&& (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1)) && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
== GET_MODE_BITSIZE (mode))) == GET_MODE_BITSIZE (mode)))
return gen_rtx_ROTATE (mode, XEXP (op0, 0), return gen_rtx_ROTATE (mode, XEXP (op1, 0), XEXP (op0, 1));
(GET_CODE (op0) == ASHIFT
? XEXP (op0, 1) : XEXP (op1, 1))); /* Same, but for ashift that has been "simplified" to a wider mode
by simplify_shift_const. */
if (GET_CODE (op0) == SUBREG
&& GET_CODE (SUBREG_REG (op0)) == ASHIFT
&& GET_CODE (op1) == LSHIFTRT
&& GET_CODE (XEXP (op1, 0)) == SUBREG
&& GET_MODE (op0) == GET_MODE (XEXP (op1, 0))
&& SUBREG_BYTE (op0) == SUBREG_BYTE (XEXP (op1, 0))
&& (GET_MODE_SIZE (GET_MODE (op0))
< GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
&& rtx_equal_p (XEXP (SUBREG_REG (op0), 0),
SUBREG_REG (XEXP (op1, 0)))
&& GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
&& GET_CODE (XEXP (op1, 1)) == CONST_INT
&& (INTVAL (XEXP (SUBREG_REG (op0), 1)) + INTVAL (XEXP (op1, 1))
== GET_MODE_BITSIZE (mode)))
return gen_rtx_ROTATE (mode, XEXP (op1, 0),
XEXP (SUBREG_REG (op0), 1));
/* If OP0 is (ashiftrt (plus ...) C), it might actually be /* If OP0 is (ashiftrt (plus ...) C), it might actually be
a (sign_extend (plus ...)). If so, OP1 is a CONST_INT, and the PLUS a (sign_extend (plus ...)). If so, OP1 is a CONST_INT, and the PLUS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment