summaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2005-11-24 09:48:43 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2005-11-24 09:48:43 +0000
commit665d18c65493ef30af79535e796a54b0dca93a1d (patch)
treedfd8dbaa4d426d5823ffc5325193e8adf7210b6d /gcc/optabs.c
parent9063128058ba5d3323a02f897f75c8818863430d (diff)
downloadgcc-665d18c65493ef30af79535e796a54b0dca93a1d.tar.gz
optabs.c (expand_binop): Use swap_commutative_operands_with_target to order operands.
2005-11-24 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: r107457
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index b01b3dea8ad..2b0e02c8601 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -998,6 +998,30 @@ expand_simple_binop (enum machine_mode mode, enum rtx_code code, rtx op0,
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 or a pseudo 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 it is better if the
+ first operand is TARGET, or if both TARGET and OP0 are pseudos. */
+ if (target == 0 || REG_P (target))
+ return (REG_P (op1) && !REG_P (op0)) || target == op1;
+ else
+ return rtx_equal_p (op1, target);
+}
+
+
/* Generate code to perform an operation specified by BINOPTAB
on operands OP0 and OP1, with result having machine-mode MODE.
@@ -1073,12 +1097,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
{
commutative_op = 1;
- if (((target == 0 || REG_P (target))
- ? ((REG_P (op1)
- && !REG_P (op0))
- || target == op1)
- : rtx_equal_p (op1, target))
- || GET_CODE (op0) == CONST_INT)
+ if (swap_commutative_operands_with_target (target, op0, op1))
{
temp = op1;
op1 = op0;