[AArch64] Improve regmove_costs for 128-bit types.
2014-09-24 Wilco Dijkstra <wdijkstr@arm.com> gcc/ * config/aarch64/aarch64.c (aarch64_register_move_cost): Add register move costs for 128-bit types. From-SVN: r215562
This commit is contained in:
parent
6fe4595534
commit
8919453c16
|
@ -1,3 +1,8 @@
|
|||
2014-09-24 Wilco Dijkstra <wilco.dijkstra@arm.com>
|
||||
|
||||
* config/aarch64/aarch64.c (aarch64_register_move_cost): Add register
|
||||
move costs for 128-bit types.
|
||||
|
||||
2014-09-24 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
* ipa-prop.c (ipa_edge_duplication_hook): Update controlled_use_count
|
||||
|
|
|
@ -5986,6 +5986,27 @@ aarch64_register_move_cost (enum machine_mode mode,
|
|||
return aarch64_register_move_cost (mode, from, GENERAL_REGS)
|
||||
+ aarch64_register_move_cost (mode, GENERAL_REGS, to);
|
||||
|
||||
if (GET_MODE_SIZE (mode) == 16)
|
||||
{
|
||||
/* 128-bit operations on general registers require 2 instructions. */
|
||||
if (from == GENERAL_REGS && to == GENERAL_REGS)
|
||||
return regmove_cost->GP2GP * 2;
|
||||
else if (from == GENERAL_REGS)
|
||||
return regmove_cost->GP2FP * 2;
|
||||
else if (to == GENERAL_REGS)
|
||||
return regmove_cost->FP2GP * 2;
|
||||
|
||||
/* When AdvSIMD instructions are disabled it is not possible to move
|
||||
a 128-bit value directly between Q registers. This is handled in
|
||||
secondary reload. A general register is used as a scratch to move
|
||||
the upper DI value and the lower DI value is moved directly,
|
||||
hence the cost is the sum of three moves. */
|
||||
if (! TARGET_SIMD)
|
||||
return regmove_cost->GP2FP + regmove_cost->FP2GP + regmove_cost->FP2FP;
|
||||
|
||||
return regmove_cost->FP2FP;
|
||||
}
|
||||
|
||||
if (from == GENERAL_REGS && to == GENERAL_REGS)
|
||||
return regmove_cost->GP2GP;
|
||||
else if (from == GENERAL_REGS)
|
||||
|
@ -5993,14 +6014,6 @@ aarch64_register_move_cost (enum machine_mode mode,
|
|||
else if (to == GENERAL_REGS)
|
||||
return regmove_cost->FP2GP;
|
||||
|
||||
/* When AdvSIMD instructions are disabled it is not possible to move
|
||||
a 128-bit value directly between Q registers. This is handled in
|
||||
secondary reload. A general register is used as a scratch to move
|
||||
the upper DI value and the lower DI value is moved directly,
|
||||
hence the cost is the sum of three moves. */
|
||||
if (! TARGET_SIMD && GET_MODE_SIZE (mode) == 16)
|
||||
return regmove_cost->GP2FP + regmove_cost->FP2GP + regmove_cost->FP2FP;
|
||||
|
||||
return regmove_cost->FP2FP;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue