diff options
author | ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-17 10:37:48 +0000 |
---|---|---|
committer | ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-17 10:37:48 +0000 |
commit | fb53b6aa6f411546086989431d4406f4efb65677 (patch) | |
tree | a11c795e6fb0d1725bfe6995f6303f2d10ce8f81 | |
parent | f70f57eb5b3ccd95974d71a5bf1f1dd4c67dd709 (diff) | |
download | gcc-fb53b6aa6f411546086989431d4406f4efb65677.tar.gz |
[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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212753 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 68 |
2 files changed, 66 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eede13a920a..335dfc13b04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 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. (vmlal_high_lane_s32): Likewise. (vmlal_high_lane_u16): Likewise. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 4c65bb1dbc1..5f8db1dc01e 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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 |