mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-02 15:51:54 +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. llvm-svn: 127700
This commit is contained in:
parent
26ac368165
commit
c12aadb9b6
@ -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…
x
Reference in New Issue
Block a user