[AArch64] PR target/66731 Fix fnmul insn with -frounding-math (rtx costs)
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Tue, 4 Aug 2015 16:22:32 +0000 (16:22 +0000)
committerSzabolcs Nagy <nsz@gcc.gnu.org>
Tue, 4 Aug 2015 16:22:32 +0000 (16:22 +0000)
2015-08-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>

PR target/66731
* config/aarch64/aarch64.c (aarch64_rtx_costs): Fix NEG cost for FNMUL.
(aarch64_rtx_mult_cost): Fix MULT cost with -frounding-math.

From-SVN: r226586

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

index c6dc552e7556a9b38484bc099e42888d1d8003a9..7a3bf601828d07319b1347d16341a958547209f4 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR target/66731
+       * config/aarch64/aarch64.c (aarch64_rtx_costs): Fix NEG cost for FNMUL.
+       (aarch64_rtx_mult_cost): Fix MULT cost with -frounding-math.
+
 2015-08-04  Richard Biener  <rguenther@suse.de>
 
        * genmatch.c (dt_node::gen_kids_1): Use gassign and gcall in
index a91fda8db3d11450919fe84a98dfd6f138fcb84c..1394ed7deccf2c1e08c9757f738237e75fb64301 100644 (file)
@@ -5465,11 +5465,17 @@ aarch64_rtx_mult_cost (rtx x, enum rtx_code code, int outer, bool speed)
       if (speed)
        {
          /* Floating-point FMA/FMUL can also support negations of the
-            operands.  */
-         if (GET_CODE (op0) == NEG)
-           op0 = XEXP (op0, 0);
-         if (GET_CODE (op1) == NEG)
-           op1 = XEXP (op1, 0);
+            operands, unless the rounding mode is upward or downward in
+            which case FNMUL is different than FMUL with operand negation.  */
+         bool neg0 = GET_CODE (op0) == NEG;
+         bool neg1 = GET_CODE (op1) == NEG;
+         if (compound_p || !flag_rounding_math || (neg0 && neg1))
+           {
+             if (neg0)
+               op0 = XEXP (op0, 0);
+             if (neg1)
+               op1 = XEXP (op1, 0);
+           }
 
          if (compound_p)
            /* FMADD/FNMADD/FNMSUB/FMSUB.  */
@@ -5991,6 +5997,12 @@ aarch64_rtx_costs (rtx x, machine_mode mode, int outer ATTRIBUTE_UNUSED,
              *cost = rtx_cost (op0, mode, NEG, 0, speed);
               return true;
             }
+         if (GET_CODE (op0) == MULT)
+           {
+             /* FNMUL.  */
+             *cost = rtx_cost (op0, mode, NEG, 0, speed);
+             return true;
+           }
          if (speed)
            /* FNEG.  */
            *cost += extra_cost->fp[mode == DFmode].neg;