arm: MVE Don't use lsll for 32-bit shifts scalar
authorAndre Simoes Dias Vieira <andre.simoesdiasvieira@arm.com>
Tue, 7 Apr 2020 14:08:46 +0000 (15:08 +0100)
committerAndre Vieira <andre.simoesdiasvieira@arm.com>
Tue, 7 Apr 2020 14:44:51 +0000 (15:44 +0100)
After fixing the v[id]wdups using the "moving the wrap parameter" into the
top-end of a DImode operand using a shift, I noticed we were using lsll for
32-bit shifts in scalars, where we don't need to, as we can simply do a move,
  which is much better if we don't need to use the bottom part.

We can solve this in a better way, but for now this will do.

gcc/ChangeLog:
2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>

* config/arm/arm.d (ashldi3): Don't use lsll for constant 32-bit shifts.

gcc/ChangeLog
gcc/config/arm/arm.md

index 48c9c48aad6517d505bc27d6f5d8b376d591454d..45825a881ba77ce2d45d539bf4d6c557f620ab3e 100644 (file)
@@ -1,3 +1,7 @@
+2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+       * config/arm/arm.d (ashldi3): Don't use lsll for constant 32-bit shifts.
+
 2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        * config/arm/arm_mve.h: Fix v[id]wdup intrinsics.
index 1a7ea0d701e5677965574d877d0fe4b2f5bc149f..6d5560398dae3d0ace0342b4907542d2a6865f70 100644 (file)
         operands[2] = force_reg (SImode, operands[2]);
 
       /* Armv8.1-M Mainline double shifts are not expanded.  */
-      if (arm_reg_or_long_shift_imm (operands[2], GET_MODE (operands[2])))
+      if (arm_reg_or_long_shift_imm (operands[2], GET_MODE (operands[2]))
+         && (REG_P (operands[2]) || INTVAL(operands[2]) != 32))
         {
          if (!reg_overlap_mentioned_p(operands[0], operands[1]))
            emit_insn (gen_movdi (operands[0], operands[1]));