[AArch64 costs 11/18] Improve costs for rotate and shift operations. 75/41175/1
authorjgreenhalgh <jgreenhalgh@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 May 2014 09:03:19 +0000 (09:03 +0000)
committerNikolai Bozhenov <n.bozhenov@samsung.com>
Thu, 11 Jun 2015 11:06:39 +0000 (14:06 +0300)
git cherry-pick 8982100

* config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for
rotates and shifts.

Change-Id: Id504035623b9bdbf61b22b807f7bf2e94bd92b89
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210503 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index fdb5795..b318f21 100644 (file)
@@ -1,6 +1,12 @@
 2014-05-16  James Greenhalgh  <james.greenhalgh@arm.com>
            Philipp Tomsich  <philipp.tomsich@theobroma-systems.com>
 
+       * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for
+       rotates and shifts.
+
+2014-05-16  James Greenhalgh  <james.greenhalgh@arm.com>
+           Philipp Tomsich  <philipp.tomsich@theobroma-systems.com>
+
        * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost
        ZERO_EXTEND and SIGN_EXTEND better.
 
index a56cb88..ac7de2d 100644 (file)
@@ -5271,21 +5271,59 @@ cost_minus:
        *cost += extra_cost->alu.extend;
       return false;
 
+    case ASHIFT:
+      op0 = XEXP (x, 0);
+      op1 = XEXP (x, 1);
+
+      if (CONST_INT_P (op1))
+        {
+         /* LSL (immediate), UBMF, UBFIZ and friends.  These are all
+            aliases.  */
+         if (speed)
+           *cost += extra_cost->alu.shift;
+
+          /* We can incorporate zero/sign extend for free.  */
+          if (GET_CODE (op0) == ZERO_EXTEND
+              || GET_CODE (op0) == SIGN_EXTEND)
+            op0 = XEXP (op0, 0);
+
+          *cost += rtx_cost (op0, ASHIFT, 0, speed);
+          return true;
+        }
+      else
+        {
+         /* LSLV.  */
+         if (speed)
+           *cost += extra_cost->alu.shift_reg;
+
+         return false;  /* All arguments need to be in registers.  */
+        }
+
     case ROTATE:
-      if (!CONST_INT_P (XEXP (x, 1)))
-       *cost += COSTS_N_INSNS (2);
-      /* Fall through.  */
     case ROTATERT:
     case LSHIFTRT:
-    case ASHIFT:
     case ASHIFTRT:
+      op0 = XEXP (x, 0);
+      op1 = XEXP (x, 1);
 
-      /* Shifting by a register often takes an extra cycle.  */
-      if (speed && !CONST_INT_P (XEXP (x, 1)))
-       *cost += extra_cost->alu.arith_shift_reg;
+      if (CONST_INT_P (op1))
+       {
+         /* ASR (immediate) and friends.  */
+         if (speed)
+           *cost += extra_cost->alu.shift;
 
-      *cost += rtx_cost (XEXP (x, 0), ASHIFT, 0, speed);
-      return true;
+         *cost += rtx_cost (op0, (enum rtx_code) code, 0, speed);
+         return true;
+       }
+      else
+       {
+
+         /* ASR (register) and friends.  */
+         if (speed)
+           *cost += extra_cost->alu.shift_reg;
+
+         return false;  /* All arguments need to be in registers.  */
+       }
 
     case HIGH:
       if (!CONSTANT_P (XEXP (x, 0)))