Hi, This patch adjusts the generic move costs to better reflect the INT<->FP move costs used in the various core specific cost tables.
The intention of these generic costs is that they provide reasonable performance across a range of cores without unduly pessimizing any one specific core. This adjustment is sufficient to prevent the register allocator inserting huge amounts of unnecessary int<->FP moves. The GP2FP/FP2GP costs must be larger than the memory cost to avoid the worst of this issue. In sha2 this replaces all 642 redundant fp moves with 35 load and 7 store spills. OK for commit? ChangeLog: 2014-11-14 Wilco Dijkstra <wdijk...@arm.com> * gcc/config/aarch64/aarch64.c (generic_regmove_cost): Increase FP move cost. --- gcc/config/aarch64/aarch64.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index de53c94..cd30724 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -218,8 +218,10 @@ __extension__ static const struct cpu_regmove_cost generic_regmove_cost = { NAMED_PARAM (GP2GP, 1), - NAMED_PARAM (GP2FP, 2), - NAMED_PARAM (FP2GP, 2), + /* Avoid the use of slow int<->fp moves for spilling by setting + their cost higher than memmov_cost. */ + NAMED_PARAM (GP2FP, 5), + NAMED_PARAM (FP2GP, 5), NAMED_PARAM (FP2FP, 2) }; -- 1.9.1