[ARM] MVE Vector Shifts
commitda0d3e17551d507ec8149bda60b6fc538bb72d6b
authorDavid Green <david.green@arm.com>
Mon, 15 Jul 2019 11:35:39 +0000 (15 11:35 +0000)
committerDavid Green <david.green@arm.com>
Mon, 15 Jul 2019 11:35:39 +0000 (15 11:35 +0000)
tree8f0c921c11646ee99d69ac326d729fc7d44c64db
parent86b4972a7026ac350fe1066ef2b6495bb2a6fbcc
[ARM] MVE Vector Shifts

This adds basic lowering for MVE shifts. There are many shifts in MVE, but the
instructions handled here are:
 VSHL (imm)
 VSHRu (imm)
 VSHRs (imm)
 VSHL (vector)
 VSHL (register)

MVE, like NEON before it, doesn't have shift right by a vector (or register).
We instead have to negate the amount and shift in the opposite direction. This
means we have to convert any SHR's into a form of SHL (that is still signed or
unsigned) with a negated condition and selecting from there. MVE still does
have shifting by an immediate for SHL, ASR and LSR.

This adds lowering for these and for register forms, which work well for shift
lefts but may require an extra fold of neg(vdup(x)) -> vdup(neg(x)) to potentially
work optimally for right shifts.

Differential Revision: https://reviews.llvm.org/D64212

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366056 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/ARMInstrMVE.td
lib/Target/ARM/ARMInstrNEON.td
test/CodeGen/Thumb2/mve-shifts.ll [new file with mode: 0644]