aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Simoes Dias Vieira <andre.simoesdiasvieira@arm.com>2020-04-07 15:08:46 +0100
committerAndre Vieira <andre.simoesdiasvieira@arm.com>2020-04-07 15:44:51 +0100
commit094bc16bb4181a02177e1e14187b4c1c48bef0d5 (patch)
treee8a7cb86fe68ca84dfb745855ac1d986ab1b93d5 /gcc
parent9ce780efc4a8f47cf1fbba8e0494e65e87b0749c (diff)
downloadgcc-094bc16bb4181a02177e1e14187b4c1c48bef0d5.zip
gcc-094bc16bb4181a02177e1e14187b4c1c48bef0d5.tar.gz
gcc-094bc16bb4181a02177e1e14187b4c1c48bef0d5.tar.bz2
arm: MVE Don't use lsll for 32-bit shifts scalar
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/arm/arm.md3
2 files changed, 6 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 48c9c48a..45825a8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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.
* config/arm/mve/md: Fix v[id]wdup patterns.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 1a7ea0d..6d55603 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -4422,7 +4422,8 @@
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]));