OSDN Git Service

PR c++/20293
[pf3gnuchains/gcc-fork.git] / gcc / optabs.c
index bc85920..d3e1db6 100644 (file)
@@ -998,28 +998,6 @@ 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 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
    on operands OP0 and OP1, with result having machine-mode MODE.
 
@@ -1049,7 +1027,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
                  || binoptab->code == ROTATERT);
   rtx entry_last = get_last_insn ();
   rtx last;
-  bool first_pass_p;
+  bool first_pass_p = true;
 
   class = GET_MODE_CLASS (mode);
 
@@ -1083,7 +1061,10 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
   /* Record where to delete back to if we backtrack.  */
   last = get_last_insn ();
 
-  /* If operation is commutative, canonicalize the order of the operands.  */
+  /* If operation is commutative,
+     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
       || binoptab == smul_widen_optab
       || binoptab == umul_widen_optab
@@ -1091,7 +1072,13 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
       || binoptab == umul_highpart_optab)
     {
       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;
          op1 = op0;
@@ -2447,7 +2434,9 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target,
 
            if (temp)
              {
-               if (class != MODE_INT)
+               if (class != MODE_INT
+                   || !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
+                                              GET_MODE_BITSIZE (wider_mode)))
                  {
                    if (target == 0)
                      target = gen_reg_rtx (mode);