summaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
authorJina Nahias <jina.nahias@intel.com>2017-12-05 15:42:56 +0000
committerJina Nahias <jina.nahias@intel.com>2017-12-05 15:42:56 +0000
commit03b74e4166fa8ee509d46f542734f08c3c0dd72a (patch)
tree8eaf6bc9f6133b65220d9be0b9e1ab599730b6b9 /lib/IR
parent263cd359c3d2db7ad8a5a4fc99203f8c71020458 (diff)
[x86][AVX512] Lowering kunpack intrinsics to LLVM IR
This patch, together with a matching clang patch (https://reviews.llvm.org/D39719), implements the lowering of X86 kunpack intrinsics to IR. Differential Revision: https://reviews.llvm.org/D39720 Change-Id: I4088d9428478f9457f6afddc90bd3d66b3daf0a1 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319778 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/AutoUpgrade.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/IR/AutoUpgrade.cpp b/lib/IR/AutoUpgrade.cpp
index afbe4eb9543..76af9a16f0c 100644
--- a/lib/IR/AutoUpgrade.cpp
+++ b/lib/IR/AutoUpgrade.cpp
@@ -78,6 +78,7 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
Name=="ssse3.pabs.d.128" || // Added in 6.0
Name.startswith("avx512.mask.shuf.i") || // Added in 6.0
Name.startswith("avx512.mask.shuf.f") || // Added in 6.0
+ Name.startswith("avx512.kunpck") || //added in 6.0
Name.startswith("avx2.pabs.") || // Added in 6.0
Name.startswith("avx512.mask.pabs.") || // Added in 6.0
Name.startswith("avx512.broadcastm") || // Added in 6.0
@@ -1065,6 +1066,12 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
Rep = Builder.CreateVectorSplat(NumElts, CI->getArgOperand(0));
Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep,
CI->getArgOperand(1));
+ } else if (IsX86 && (Name.startswith("avx512.kunpck"))) {
+ uint64_t Shift = CI->getType()->getScalarSizeInBits() / 2;
+ uint64_t And = (1 << Shift) - 1;
+ Value* LowBits = Builder.CreateAnd(CI->getArgOperand(0), And);
+ Value* HighBits = Builder.CreateShl(CI->getArgOperand(1), Shift);
+ Rep = Builder.CreateOr(LowBits, HighBits);
} else if (IsX86 && (Name == "sse.add.ss" || Name == "sse2.add.sd")) {
Type *I32Ty = Type::getInt32Ty(C);
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),