From: Kyrylo Tkachov Date: Wed, 23 Apr 2014 15:17:54 +0000 (+0000) Subject: [ARM] Handle FMA code in rtx costs. X-Git-Tag: releases/gcc-5.1.0~7976 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba9b1a639fb8dfcf7d54700905fd1ba58d20f739;p=thirdparty%2Fgcc.git [ARM] Handle FMA code in rtx costs. * config/arm/arm.c (arm_new_rtx_costs): Handle FMA. From-SVN: r209701 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c79f26ab7fc8..5f86e3ec1557 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2014-04-23 Kyrylo Tkachov + + * config/arm/arm.c (arm_new_rtx_costs): Handle FMA. + 2014-04-23 Richard Biener * Makefile.in (OBJS): Remove loop-unswitch.o. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 88d957a21f6d..42df6fe0aa21 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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)