diff options
author | Craig Topper <craig.topper@gmail.com> | 2016-09-13 07:40:53 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2016-09-13 07:40:53 +0000 |
commit | 4619c9e6a8849163ef3fc812e832de0ae8c8e23f (patch) | |
tree | f4b219e625f902bd27a2cb56dad1f825d1295212 /llvm/lib/IR/AutoUpgrade.cpp | |
parent | 3f029ae6e1df90f2504d12ec15cca9fc98e3c0dc (diff) | |
download | bcm5719-llvm-4619c9e6a8849163ef3fc812e832de0ae8c8e23f.tar.gz bcm5719-llvm-4619c9e6a8849163ef3fc812e832de0ae8c8e23f.zip |
[X86] Remove masked shufpd/shufps intrinsics and autoupgrade to native vector shuffles. They were removed from clang previously but accidentally left in the backend.
llvm-svn: 281300
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 79a8d18126d..96c34c0ad8c 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -256,6 +256,7 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { Name.startswith("avx512.mask.pshuf.d.") || Name.startswith("avx512.mask.pshufl.w.") || Name.startswith("avx512.mask.pshufh.w.") || + Name.startswith("avx512.mask.shuf.p") || Name.startswith("avx512.mask.vpermil.p") || Name.startswith("avx512.mask.perm.df.") || Name.startswith("avx512.mask.perm.di.") || @@ -1149,6 +1150,31 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { if (CI->getNumArgOperands() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); + } else if (IsX86 && Name.startswith("avx512.mask.shuf.p")) { + Value *Op0 = CI->getArgOperand(0); + Value *Op1 = CI->getArgOperand(1); + unsigned Imm = cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue(); + unsigned NumElts = CI->getType()->getVectorNumElements(); + + unsigned NumLaneElts = 128/CI->getType()->getScalarSizeInBits(); + unsigned HalfLaneElts = NumLaneElts / 2; + + SmallVector<uint32_t, 16> Idxs(NumElts); + for (unsigned i = 0; i != NumElts; ++i) { + // Base index is the starting element of the lane. + Idxs[i] = i - (i % NumLaneElts); + // If we are half way through the lane switch to the other source. + if ((i % NumLaneElts) >= HalfLaneElts) + Idxs[i] += NumElts; + // Now select the specific element. By adding HalfLaneElts bits from + // the immediate. Wrapping around the immediate every 8-bits. + Idxs[i] += (Imm >> ((i * HalfLaneElts) % 8)) & ((1 << HalfLaneElts) - 1); + } + + Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs); + + Rep = EmitX86Select(Builder, CI->getArgOperand(4), Rep, + CI->getArgOperand(3)); } else if (IsX86 && (Name.startswith("avx512.mask.movddup") || Name.startswith("avx512.mask.movshdup") || Name.startswith("avx512.mask.movsldup"))) { |