[ARM] One-off identity shuffle
authorDavid Green <david.green@arm.com>
Mon, 8 Feb 2021 21:24:32 +0000 (21:24 +0000)
committerDavid Green <david.green@arm.com>
Mon, 8 Feb 2021 21:24:32 +0000 (21:24 +0000)
commit0c7e044a7f62bba3fb43bf9e5fa7f31289d7e216
treecae336f2dd6e42e75681c74d0bb6f27640209979
parent0eda4547969e0f5c12af6b4e26afd34ff8c95015
[ARM] One-off identity shuffle

A One-Off Identity mask is a shuffle that is mostly an identity mask
from as single source but contains a single element out-of-place, either
from a different vector or from another position in the same vector. As
opposed to lowering this via a ARMISD::BUILD_VECTOR we can generate an
extract/insert pair directly. Under ARM with individually accessible
lane elements this often becomes a simple lane move.

This also alters the LowerVECTOR_SHUFFLEUsingMovs code to use v4f32 (not
v4i32), a more natural type for lane moves.

Differential Revision: https://reviews.llvm.org/D95551
llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/Thumb2/mve-float16regloops.ll
llvm/test/CodeGen/Thumb2/mve-shuffle.ll
llvm/test/CodeGen/Thumb2/mve-vld3.ll
llvm/test/CodeGen/Thumb2/mve-vst3.ll
llvm/test/CodeGen/Thumb2/mve-vst4.ll