Commit d2ac256b by Kyrylo Tkachov Committed by Kyrylo Tkachov

[AArch64] Properly cost MNEG/[SU]MNEGL patterns

	* config/aarch64/aarch64.c (aarch64_rtx_mult_cost): Handle MNEG
	and [SU]MNEGL patterns.

From-SVN: r222627
parent ec3fba51
2015-04-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2015-04-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_rtx_mult_cost): Handle MNEG
and [SU]MNEGL patterns.
2015-04-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_shift_p): New function. * config/aarch64/aarch64.c (aarch64_shift_p): New function.
(aarch64_rtx_mult_cost): Update comment to reflect that it also handles (aarch64_rtx_mult_cost): Update comment to reflect that it also handles
combined arithmetic-shift ops. Properly handle all shift and extend combined arithmetic-shift ops. Properly handle all shift and extend
......
...@@ -5229,6 +5229,15 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed) ...@@ -5229,6 +5229,15 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed)
return cost; return cost;
} }
/* MNEG or [US]MNEGL. Extract the NEG operand and indicate that it's a
compound and let the below cases handle it. After all, MNEG is a
special-case alias of MSUB. */
if (GET_CODE (op0) == NEG)
{
op0 = XEXP (op0, 0);
compound_p = true;
}
/* Integer multiplies or FMAs have zero/sign extending variants. */ /* Integer multiplies or FMAs have zero/sign extending variants. */
if ((GET_CODE (op0) == ZERO_EXTEND if ((GET_CODE (op0) == ZERO_EXTEND
&& GET_CODE (op1) == ZERO_EXTEND) && GET_CODE (op1) == ZERO_EXTEND)
...@@ -5241,7 +5250,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed) ...@@ -5241,7 +5250,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed)
if (speed) if (speed)
{ {
if (compound_p) if (compound_p)
/* MADD/SMADDL/UMADDL. */ /* SMADDL/UMADDL/UMSUBL/SMSUBL. */
cost += extra_cost->mult[0].extend_add; cost += extra_cost->mult[0].extend_add;
else else
/* MUL/SMULL/UMULL. */ /* MUL/SMULL/UMULL. */
...@@ -5251,7 +5260,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed) ...@@ -5251,7 +5260,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed)
return cost; return cost;
} }
/* This is either an integer multiply or an FMA. In both cases /* This is either an integer multiply or a MADD. In both cases
we want to recurse and cost the operands. */ we want to recurse and cost the operands. */
cost += rtx_cost (op0, MULT, 0, speed) cost += rtx_cost (op0, MULT, 0, speed)
+ rtx_cost (op1, MULT, 1, speed); + rtx_cost (op1, MULT, 1, speed);
...@@ -5259,7 +5268,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed) ...@@ -5259,7 +5268,7 @@ aarch64_rtx_mult_cost (rtx x, int code, int outer, bool speed)
if (speed) if (speed)
{ {
if (compound_p) if (compound_p)
/* MADD. */ /* MADD/MSUB. */
cost += extra_cost->mult[mode == DImode].add; cost += extra_cost->mult[mode == DImode].add;
else else
/* MUL. */ /* MUL. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment