Patchwork [ARM] Handle FMA code in rtx costs.

login
register
mail settings
Submitter Kyrylo Tkachov
Date March 24, 2014, 5:15 p.m.
Message ID <5330683B.5020807@arm.com>
Download mbox | patch
Permalink /patch/333101/
State New
Headers show

Comments

Kyrylo Tkachov - March 24, 2014, 5:15 p.m.
Hi all,

This patch adds proper rtx costing logic for floating point fma operations on 
arm. It also handles the fma+neg combinations that can be expressed with 
vfms,vfnma or vfnms instructions.
Not much else to say here...

Tested and boostrapped on arm-none-linux-gnueabihf.

Ok for next stage1?

Thanks,
Kyrill

2014-03-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.
Richard Earnshaw - March 25, 2014, 3:51 p.m.
On 24/03/14 17:15, Kyrill Tkachov wrote:
> Hi all,
> 
> This patch adds proper rtx costing logic for floating point fma operations on 
> arm. It also handles the fma+neg combinations that can be expressed with 
> vfms,vfnma or vfnms instructions.
> Not much else to say here...
> 
> Tested and boostrapped on arm-none-linux-gnueabihf.
> 
> Ok for next stage1?
> 
> Thanks,
> Kyrill
> 
> 2014-03-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
> 
>      * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.
> 
> 
> arm-fma-costs.patch
> 
> 
> commit 9cebc525c432e4a87ead5b513b70c99dff6628c8
> Author: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
> Date:   Thu Mar 20 09:13:06 2014 +0000
> 
>     [ARM] Cost FMA operations properly.
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index 5619ebd..e7a0530 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -10673,6 +10673,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 (1);

This should be LIBCALL_COST (3) (there are 3 arguments to the operation).

Otherwise OK.

R.

Patch

commit 9cebc525c432e4a87ead5b513b70c99dff6628c8
Author: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Date:   Thu Mar 20 09:13:06 2014 +0000

    [ARM] Cost FMA operations properly.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 5619ebd..e7a0530 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -10673,6 +10673,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 (1);
+      return false;
+
     case FIX:
     case UNSIGNED_FIX:
       if (TARGET_HARD_FLOAT)