Adds an experimental intrinsic new ISD node to replicate a scalar value across all
all elements of a vector. This is needed for scalable vectors, since
BUILD_VECTOR cannot be used.
Adds code to SelectionDAGBuilder to use this for IR splats using
zeroinitializer and shufflevector (and deliberately asserting in
cases we have not handled yet -- variable shuffles will be handled
later in a separate patch)t present I only use this node for scalable vectors; although the default expand works and generates a build vector with the appropriate value, some backends expect a different canonical form in SDag for a splat. I suspect the code to generate those shuffles will need to be replicated in the expansion (or possibly moved to a shared function) before this can be used by default for all backends.
Adds a variant of 'getShuffleMask' which can take Value for a mask
instead of a constant. If the VectorType of the mask is scalable or
if the mask value is not a constant, this returns false to indicate
the calling code must handle the shuffle differently. If it is
constant and non scalable, then it calls the existing 'getShuffleMask'
with the given arguments then returns true.
Adds code to lower and legalize the intrinsic in the AArch64 for
integer element types (other than i1, which will be handled later).
Adds a simple unit test for the "mov" alias of the SVE "dup" instruction.
Part of the initial SVE codegen series, rfc will be posted soon. Note: this patch is currently just to support the scalable vector codegen rfc, and does not need a full review yetI've only added legalization for i8/i16/i32/i64 types in AArch64 for now.