mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 18:06:49 +00:00
The VTBL (and VTBX) instructions are rather permissive concerning the masks they
accept. If a value in the mask is out of range, it uses the value 0, for VTBL, or leaves the value unchanged, for VTBX. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127700 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
13ba2527f7
commit
0d4c9d94f6
@ -3541,6 +3541,13 @@ static bool isVREVMask(const SmallVectorImpl<int> &M, EVT VT,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool isVTBLMask(const SmallVectorImpl<int> &M, EVT VT) {
|
||||
// We can handle <8 x i8> vector shuffles. If the index in the mask is out of
|
||||
// range, then 0 is placed into the resulting vector. So pretty much any mask
|
||||
// of 8 elements can work here.
|
||||
return VT == MVT::v8i8 && M.size() == 8;
|
||||
}
|
||||
|
||||
static bool isVTRNMask(const SmallVectorImpl<int> &M, EVT VT,
|
||||
unsigned &WhichResult) {
|
||||
unsigned EltSz = VT.getVectorElementType().getSizeInBits();
|
||||
@ -3980,6 +3987,7 @@ ARMTargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &M,
|
||||
isVREVMask(M, VT, 32) ||
|
||||
isVREVMask(M, VT, 16) ||
|
||||
isVEXTMask(M, VT, ReverseVEXT, Imm) ||
|
||||
isVTBLMask(M, VT) ||
|
||||
isVTRNMask(M, VT, WhichResult) ||
|
||||
isVUZPMask(M, VT, WhichResult) ||
|
||||
isVZIPMask(M, VT, WhichResult) ||
|
||||
|
Loading…
Reference in New Issue
Block a user