aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/AutoUpgrade.cpp
diff options
context:
space:
mode:
authorYael Tsafrir <yael.tsafrir@intel.com>2017-09-12 07:50:35 +0000
committerYael Tsafrir <yael.tsafrir@intel.com>2017-09-12 07:50:35 +0000
commit47668b5e03321b28d2e85d8d35b9935cae889efa (patch)
tree3db2437d0cf9a0b70ea707a8574a9aa9f5fa7123 /llvm/lib/IR/AutoUpgrade.cpp
parentac920f7716ef410e77af39824f26464b6ec855ef (diff)
downloadllvm-47668b5e03321b28d2e85d8d35b9935cae889efa.zip
llvm-47668b5e03321b28d2e85d8d35b9935cae889efa.tar.gz
llvm-47668b5e03321b28d2e85d8d35b9935cae889efa.tar.bz2
[X86] Lower _mm[256|512]_[mask[z]]_avg_epu[8|16] intrinsics to native llvm IR
Differential Revision: https://reviews.llvm.org/D37560 llvm-svn: 313013
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 6184ce5..4e0712b 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -252,7 +252,10 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
Name.startswith("avx512.mask.move.s") || // Added in 4.0
Name.startswith("avx512.cvtmask2") || // Added in 5.0
(Name.startswith("xop.vpcom") && // Added in 3.2
- F->arg_size() == 2))
+ F->arg_size() == 2) ||
+ Name.startswith("sse2.pavg") || // Added in 6.0
+ Name.startswith("avx2.pavg") || // Added in 6.0
+ Name.startswith("avx512.mask.pavg")) // Added in 6.0
return true;
return false;
@@ -1972,6 +1975,25 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
LoadInst *LI = Builder.CreateAlignedLoad(BC, VTy->getBitWidth() / 8);
LI->setMetadata(M->getMDKindID("nontemporal"), Node);
Rep = LI;
+ } else if (IsX86 &&
+ (Name.startswith("sse2.pavg") || Name.startswith("avx2.pavg") ||
+ Name.startswith("avx512.mask.pavg"))) {
+ // llvm.x86.sse2.pavg.b/w, llvm.x86.avx2.pavg.b/w,
+ // llvm.x86.avx512.mask.pavg.b/w
+ Value *A = CI->getArgOperand(0);
+ Value *B = CI->getArgOperand(1);
+ VectorType *ZextType = VectorType::getExtendedElementVectorType(
+ cast<VectorType>(A->getType()));
+ Value *ExtendedA = Builder.CreateZExt(A, ZextType);
+ Value *ExtendedB = Builder.CreateZExt(B, ZextType);
+ Value *Sum = Builder.CreateAdd(ExtendedA, ExtendedB);
+ Value *AddOne = Builder.CreateAdd(Sum, ConstantInt::get(ZextType, 1));
+ Value *ShiftR = Builder.CreateLShr(AddOne, ConstantInt::get(ZextType, 1));
+ Rep = Builder.CreateTrunc(ShiftR, A->getType());
+ if (CI->getNumArgOperands() > 2) {
+ Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep,
+ CI->getArgOperand(2));
+ }
} else if (IsNVVM && (Name == "abs.i" || Name == "abs.ll")) {
Value *Arg = CI->getArgOperand(0);
Value *Neg = Builder.CreateNeg(Arg, "neg");