When zero extending a 32-bit value to 64 bits, there should always be a
SET operation on the outside, according to the patterns in aarch64.md.
However, the mid-end can also ask for the cost of a made-up instruction,
where the zero-extend is part of another operation, not SET.

In this case we currently cost the zero extend operation as a uxtb/uxth.
Instead, cost it the same way we cost "normal" 32-to-64-bit zero
extends: as a "mov" or the cost of the inner operation.

Bootstrapped and tested on aarch64-none-elf.

2016-07-19  Kristina Martsenko  <kristina.martse...@arm.com>

        * config/aarch64/aarch64.c (aarch64_rtx_costs): Fix cost of zero extend.

---
 gcc/config/aarch64/aarch64.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 
bddffc3ab28cde3a996fd13c060de36227315fb5..a2621313d3278d39db0f1d5640b33201efefac21
 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -6421,12 +6421,11 @@ cost_plus:
         a 'w' register implicitly zeroes the upper bits of an 'x'
         register.  However, if this is
 
-          (set (reg) (zero_extend (reg)))
+          (zero_extend (reg))
 
         we must cost the explicit register move.  */
       if (mode == DImode
-         && GET_MODE (op0) == SImode
-         && outer == SET)
+         && GET_MODE (op0) == SImode)
        {
          int op_cost = rtx_cost (op0, VOIDmode, ZERO_EXTEND, 0, speed);
 
-- 
2.1.4



Reply via email to