diff options
author | Craig Topper <craig.topper@gmail.com> | 2016-06-06 06:13:01 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2016-06-06 06:13:01 +0000 |
commit | f51cc07719f3004979d64767f79268080feb052f (patch) | |
tree | 30f60013460d61ce5d87f18a0f0486338bf78628 /clang/lib/CodeGen/CGBuiltin.cpp | |
parent | 33350cc40699eafbc95d8d9fb0cbfa11974d6653 (diff) | |
download | bcm5719-llvm-f51cc07719f3004979d64767f79268080feb052f.tar.gz bcm5719-llvm-f51cc07719f3004979d64767f79268080feb052f.zip |
[AVX512] Convert masked palignr builtins directly to native IR similar to the other palignr builtins, but with a select to handle masking.
llvm-svn: 271873
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 914c1c1cd24..b79a9a4a21d 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -6653,7 +6653,10 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]); } case X86::BI__builtin_ia32_palignr128: - case X86::BI__builtin_ia32_palignr256: { + case X86::BI__builtin_ia32_palignr256: + case X86::BI__builtin_ia32_palignr128_mask: + case X86::BI__builtin_ia32_palignr256_mask: + case X86::BI__builtin_ia32_palignr512_mask: { unsigned ShiftVal = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); unsigned NumElts = @@ -6673,7 +6676,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType()); } - int Indices[32]; + int Indices[64]; // 256-bit palignr operates on 128-bit lanes so we need to handle that for (unsigned l = 0; l != NumElts; l += 16) { for (unsigned i = 0; i != 16; ++i) { @@ -6684,10 +6687,25 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, } } - return Builder.CreateShuffleVector(Ops[1], Ops[0], - makeArrayRef(Indices, NumElts), - "palignr"); + Value *Align = Builder.CreateShuffleVector(Ops[1], Ops[0], + makeArrayRef(Indices, NumElts), + "palignr"); + + // If this isn't a masked builtin, just return the align operation. + if (Ops.size() == 3) + return Align; + + // If the mask is all ones just emit the align operation. + if (const auto *C = dyn_cast<Constant>(Ops[4])) + if (C->isAllOnesValue()) + return Align; + + llvm::VectorType *MaskTy = llvm::VectorType::get(Builder.getInt1Ty(), + NumElts); + llvm::Value *Mask = Builder.CreateBitCast(Ops[4], MaskTy, "cast"); + return Builder.CreateSelect(Mask, Align, Ops[3]); } + case X86::BI__builtin_ia32_pslldqi256: { // Shift value is in bits so divide by 8. unsigned shiftVal = cast<llvm::ConstantInt>(Ops[1])->getZExtValue() >> 3; |