[AArch64] Handle fcvta[su] and frint in RTX cost function.

* config/aarch64/aarch64.c (aarch64_frint_unspec_p): New function.
	(aarch64_rtx_costs): Handle FIX, UNSIGNED_FIX, UNSPEC.

From-SVN: r212753
This commit is contained in:
Kyrylo Tkachov 2014-07-17 10:37:48 +00:00 committed by Kyrylo Tkachov
parent ec45448361
commit 61263118ae
2 changed files with 66 additions and 7 deletions

View File

@ -1,3 +1,8 @@
2014-07-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_frint_unspec_p): New function.
(aarch64_rtx_costs): Handle FIX, UNSIGNED_FIX, UNSPEC.
2014-07-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/arm_neon.h (vmlal_high_lane_s16): Fix type.

View File

@ -4838,6 +4838,25 @@ aarch64_rtx_arith_op_extract_p (rtx x, enum machine_mode mode)
return false;
}
static bool
aarch64_frint_unspec_p (unsigned int u)
{
switch (u)
{
case UNSPEC_FRINTZ:
case UNSPEC_FRINTP:
case UNSPEC_FRINTM:
case UNSPEC_FRINTA:
case UNSPEC_FRINTN:
case UNSPEC_FRINTX:
case UNSPEC_FRINTI:
return true;
default:
return false;
}
}
/* Calculate the cost of calculating (if_then_else (OP0) (OP1) (OP2)),
storing it in *COST. Result is true if the total cost of the operation
has now been calculated. */
@ -5018,7 +5037,7 @@ aarch64_rtx_costs (rtx x, int code, int outer ATTRIBUTE_UNUSED,
default:
/* We can't make sense of this, assume default cost. */
*cost = COSTS_N_INSNS (1);
break;
return false;
}
return false;
@ -5716,6 +5735,29 @@ cost_plus:
*cost += extra_cost->fp[mode == DFmode].narrow;
return false;
case FIX:
case UNSIGNED_FIX:
x = XEXP (x, 0);
/* Strip the rounding part. They will all be implemented
by the fcvt* family of instructions anyway. */
if (GET_CODE (x) == UNSPEC)
{
unsigned int uns_code = XINT (x, 1);
if (uns_code == UNSPEC_FRINTA
|| uns_code == UNSPEC_FRINTM
|| uns_code == UNSPEC_FRINTN
|| uns_code == UNSPEC_FRINTP
|| uns_code == UNSPEC_FRINTZ)
x = XVECEXP (x, 0, 0);
}
if (speed)
*cost += extra_cost->fp[GET_MODE (x) == DFmode].toint;
*cost += rtx_cost (x, (enum rtx_code) code, 0, speed);
return true;
case ABS:
if (GET_MODE_CLASS (mode) == MODE_FLOAT)
{
@ -5745,6 +5787,17 @@ cost_plus:
}
return false;
case UNSPEC:
/* The floating point round to integer frint* instructions. */
if (aarch64_frint_unspec_p (XINT (x, 1)))
{
if (speed)
*cost += extra_cost->fp[mode == DFmode].roundint;
return false;
}
break;
case TRUNCATE:
/* Decompose <su>muldi3_highpart. */
@ -5779,13 +5832,14 @@ cost_plus:
/* Fall through. */
default:
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"\nFailed to cost RTX. Assuming default cost.\n");
return true;
break;
}
return false;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"\nFailed to cost RTX. Assuming default cost.\n");
return true;
}
/* Wrapper around aarch64_rtx_costs, dumps the partial, or total cost