[ARM] Handle FMA code in rtx costs.
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Wed, 23 Apr 2014 15:17:54 +0000 (15:17 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Wed, 23 Apr 2014 15:17:54 +0000 (15:17 +0000)
       * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.

From-SVN: r209701

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

index c79f26a..5f86e3e 100644 (file)
@@ -1,3 +1,7 @@
+2014-04-23  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.
+
 2014-04-23  Richard Biener  <rguenther@suse.de>
 
        * Makefile.in (OBJS): Remove loop-unswitch.o.
index 88d957a..42df6fe 100644 (file)
@@ -10635,6 +10635,36 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
       *cost = LIBCALL_COST (1);
       return false;
 
+    case FMA:
+      if (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA)
+        {
+          rtx op0 = XEXP (x, 0);
+          rtx op1 = XEXP (x, 1);
+          rtx op2 = XEXP (x, 2);
+
+          *cost = COSTS_N_INSNS (1);
+
+          /* vfms or vfnma.  */
+          if (GET_CODE (op0) == NEG)
+            op0 = XEXP (op0, 0);
+
+          /* vfnms or vfnma.  */
+          if (GET_CODE (op2) == NEG)
+            op2 = XEXP (op2, 0);
+
+          *cost += rtx_cost (op0, FMA, 0, speed_p);
+          *cost += rtx_cost (op1, FMA, 1, speed_p);
+          *cost += rtx_cost (op2, FMA, 2, speed_p);
+
+          if (speed_p)
+            *cost += extra_cost->fp[mode ==DFmode].fma;
+
+          return true;
+        }
+
+      *cost = LIBCALL_COST (3);
+      return false;
+
     case FIX:
     case UNSIGNED_FIX:
       if (TARGET_HARD_FLOAT)