arm.c (arm_rtx_costs_1): Treat a minus with a shift the same as a minus without a...
authorKazu Hirata <kazu@codesourcery.com>
Tue, 14 Apr 2009 17:30:37 +0000 (17:30 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 14 Apr 2009 17:30:37 +0000 (17:30 +0000)
* config/arm/arm.c (arm_rtx_costs_1): Treat a minus with a shift
the same as a minus without a shift.

From-SVN: r146055

gcc/ChangeLog
gcc/config/arm/arm.c

index d637606..7712ee7 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-14  Kazu Hirata  <kazu@codesourcery.com>
+
+       * config/arm/arm.c (arm_rtx_costs_1): Treat a minus with a shift
+       the same as a minus without a shift.
+
 2009-04-14  Nick Clifton  <nickc@redhat.com>
 
        * config/stormy16/stormy16.md (ineqbranch_1): Do not assume that
index e24f3c7..9bd9624 100644 (file)
@@ -5139,6 +5139,17 @@ arm_rtx_costs_1 (rtx x, enum rtx_code outer, int* total, bool speed)
          return true;
        }
 
+      /* A shift as a part of RSB costs no more than RSB itself.  */
+      if (GET_CODE (XEXP (x, 0)) == MULT
+         && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
+         && ((INTVAL (XEXP (XEXP (x, 0), 1))
+              & (INTVAL (XEXP (XEXP (x, 0), 1)) - 1)) == 0))
+       {
+         *total += rtx_cost (XEXP (XEXP (x, 0), 0), code, speed);
+         *total += rtx_cost (XEXP (x, 1), code, speed);
+         return true;
+       }
+
       if (subcode == MULT
          && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
          && ((INTVAL (XEXP (XEXP (x, 1), 1)) &