[AArch64 costs 17/18] Cost for SYMBOL_REF, HIGH and LO_SUM
authorJames Greenhalgh <james.greenhalgh@arm.com>
Fri, 16 May 2014 09:25:48 +0000 (09:25 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Fri, 16 May 2014 09:25:48 +0000 (09:25 +0000)
gcc/

* config/aarch64/aarch64.c (aarch64_rtx_costs): Cost SYMBOL_REF,
HIGH, LO_SUM.

From-SVN: r210509

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

index 3515c6c..5e7c085 100644 (file)
@@ -1,4 +1,9 @@
 2014-05-16  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost SYMBOL_REF,
+       HIGH, LO_SUM.
+
+2014-05-16  James Greenhalgh  <james.greenhalgh@arm.com>
            Philipp Tomsich  <philipp.tomsich@theobroma-systems.com>
 
        * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost TRUNCATE.
index 58627b5..9eff2fd 100644 (file)
@@ -5508,15 +5508,44 @@ cost_plus:
          return false;  /* All arguments need to be in registers.  */
        }
 
-    case HIGH:
-      if (!CONSTANT_P (XEXP (x, 0)))
-       *cost += rtx_cost (XEXP (x, 0), HIGH, 0, speed);
+    case SYMBOL_REF:
+
+      if (aarch64_cmodel == AARCH64_CMODEL_LARGE)
+       {
+         /* LDR.  */
+         if (speed)
+           *cost += extra_cost->ldst.load;
+       }
+      else if (aarch64_cmodel == AARCH64_CMODEL_SMALL
+              || aarch64_cmodel == AARCH64_CMODEL_SMALL_PIC)
+       {
+         /* ADRP, followed by ADD.  */
+         *cost += COSTS_N_INSNS (1);
+         if (speed)
+           *cost += 2 * extra_cost->alu.arith;
+       }
+      else if (aarch64_cmodel == AARCH64_CMODEL_TINY
+              || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC)
+       {
+         /* ADR.  */
+         if (speed)
+           *cost += extra_cost->alu.arith;
+       }
+
+      if (flag_pic)
+       {
+         /* One extra load instruction, after accessing the GOT.  */
+         *cost += COSTS_N_INSNS (1);
+         if (speed)
+           *cost += extra_cost->ldst.load;
+       }
       return true;
 
+    case HIGH:
     case LO_SUM:
-      if (!CONSTANT_P (XEXP (x, 1)))
-       *cost += rtx_cost (XEXP (x, 1), LO_SUM, 1, speed);
-      *cost += rtx_cost (XEXP (x, 0), LO_SUM, 0, speed);
+      /* ADRP/ADD (immediate).  */
+      if (speed)
+       *cost += extra_cost->alu.arith;
       return true;
 
     case ZERO_EXTRACT: