Commit 9026e8d4 by Paolo Bonzini Committed by Paolo Bonzini

optabs.c (expand_binop): Use swap_commutative_operands_with_target to order operands.

2005-09-15  Paolo Bonzini  <bonzini@gnu.org>

	* optabs.c (expand_binop): Use swap_commutative_operands_with_target
	to order operands.
	(swap_commutative_operands_with_target): New.

From-SVN: r104324
parent befd7575
2005-09-15 Paolo Bonzini <bonzini@gnu.org>
* optabs.c (expand_binop): Use swap_commutative_operands_with_target
to order operands.
(swap_commutative_operands_with_target): New.
2005-09-15 Daniel Berlin <dberlin@dberlin.org> 2005-09-15 Daniel Berlin <dberlin@dberlin.org>
* tree-data-ref.c (analyze_array_indexes): Add estimate_only * tree-data-ref.c (analyze_array_indexes): Add estimate_only
......
...@@ -998,6 +998,28 @@ expand_simple_binop (enum machine_mode mode, enum rtx_code code, rtx op0, ...@@ -998,6 +998,28 @@ expand_simple_binop (enum machine_mode mode, enum rtx_code code, rtx op0,
return expand_binop (mode, binop, op0, op1, target, unsignedp, methods); return expand_binop (mode, binop, op0, op1, target, unsignedp, methods);
} }
/* Return whether OP0 and OP1 should be swapped when expanding a commutative
binop. Order them according to commutative_operand_precedence and, if
possible, try to put TARGET first. */
static bool
swap_commutative_operands_with_target (rtx target, rtx op0, rtx op1)
{
int op0_prec = commutative_operand_precedence (op0);
int op1_prec = commutative_operand_precedence (op1);
if (op0_prec < op1_prec)
return true;
if (op0_prec > op1_prec)
return false;
/* With equal precedence, both orders are ok, but try to put the
target first. */
return target && rtx_equal_p (op1, target);
}
/* Generate code to perform an operation specified by BINOPTAB /* Generate code to perform an operation specified by BINOPTAB
on operands OP0 and OP1, with result having machine-mode MODE. on operands OP0 and OP1, with result having machine-mode MODE.
...@@ -1060,10 +1082,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, ...@@ -1060,10 +1082,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
/* Record where to delete back to if we backtrack. */ /* Record where to delete back to if we backtrack. */
last = get_last_insn (); last = get_last_insn ();
/* If operation is commutative, /* If operation is commutative, canonicalize the order of the operands. */
try to make the first operand a register.
Even better, try to make it the same as the target.
Also try to make the last operand a constant. */
if (GET_RTX_CLASS (binoptab->code) == RTX_COMM_ARITH if (GET_RTX_CLASS (binoptab->code) == RTX_COMM_ARITH
|| binoptab == smul_widen_optab || binoptab == smul_widen_optab
|| binoptab == umul_widen_optab || binoptab == umul_widen_optab
...@@ -1071,13 +1090,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, ...@@ -1071,13 +1090,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
|| binoptab == umul_highpart_optab) || binoptab == umul_highpart_optab)
{ {
commutative_op = 1; commutative_op = 1;
if (swap_commutative_operands_with_target (target, op0, op1))
if (((target == 0 || REG_P (target))
? ((REG_P (op1)
&& !REG_P (op0))
|| target == op1)
: rtx_equal_p (op1, target))
|| GET_CODE (op0) == CONST_INT)
{ {
temp = op1; temp = op1;
op1 = op0; op1 = op0;
......
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