Re: [PATCH][ARM] Handle FMA code in rtx costs.
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.tkac...@arm.com * config/arm/arm.c (arm_new_rtx_costs): Handle FMA. arm-fma-costs.patch commit 9cebc525c432e4a87ead5b513b70c99dff6628c8 Author: Kyrylo Tkachov kyrylo.tkac...@arm.com Date: Thu Mar 20 09:13:06 2014 + [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][ARM] Handle FMA code in rtx costs.
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.tkac...@arm.com * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.commit 9cebc525c432e4a87ead5b513b70c99dff6628c8 Author: Kyrylo Tkachov kyrylo.tkac...@arm.com Date: Thu Mar 20 09:13:06 2014 + [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)