mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 00:17:01 +00:00
Revert r199628: "[AArch64 NEON] Fix a bug caused by undef lane when generating VEXT."
This test fails the newly added regression tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199631 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -4654,28 +4654,22 @@ AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
|
||||
// it into NEON_VEXTRACT.
|
||||
if (V1EltNum == Length) {
|
||||
// Check if the shuffle mask is sequential.
|
||||
int SkipUndef = 0;
|
||||
while (ShuffleMask[SkipUndef] == -1) {
|
||||
SkipUndef++;
|
||||
bool IsSequential = true;
|
||||
int CurMask = ShuffleMask[0];
|
||||
for (int I = 0; I < Length; ++I) {
|
||||
if (ShuffleMask[I] != CurMask) {
|
||||
IsSequential = false;
|
||||
break;
|
||||
}
|
||||
CurMask++;
|
||||
}
|
||||
int CurMask = ShuffleMask[SkipUndef];
|
||||
if (CurMask >= SkipUndef) {
|
||||
bool IsSequential = true;
|
||||
for (int I = SkipUndef; I < Length; ++I) {
|
||||
if (ShuffleMask[I] != -1 && ShuffleMask[I] != CurMask) {
|
||||
IsSequential = false;
|
||||
break;
|
||||
}
|
||||
CurMask++;
|
||||
}
|
||||
if (IsSequential) {
|
||||
assert((EltSize % 8 == 0) && "Bitsize of vector element is incorrect");
|
||||
unsigned VecSize = EltSize * V1EltNum;
|
||||
unsigned Index = (EltSize / 8) * (ShuffleMask[SkipUndef] - SkipUndef);
|
||||
if (VecSize == 64 || VecSize == 128)
|
||||
return DAG.getNode(AArch64ISD::NEON_VEXTRACT, dl, VT, V1, V2,
|
||||
DAG.getConstant(Index, MVT::i64));
|
||||
}
|
||||
if (IsSequential) {
|
||||
assert((EltSize % 8 == 0) && "Bitsize of vector element is incorrect");
|
||||
unsigned VecSize = EltSize * V1EltNum;
|
||||
unsigned Index = (EltSize/8) * ShuffleMask[0];
|
||||
if (VecSize == 64 || VecSize == 128)
|
||||
return DAG.getNode(AArch64ISD::NEON_VEXTRACT, dl, VT, V1, V2,
|
||||
DAG.getConstant(Index, MVT::i64));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user