diff options
author | Tomasz Krupa <tomasz.krupa@intel.com> | 2018-06-14 17:36:23 +0000 |
---|---|---|
committer | Tomasz Krupa <tomasz.krupa@intel.com> | 2018-06-14 17:36:23 +0000 |
commit | 82aa42af4971e3cb0e31bed874c8d5f7c8d3737c (patch) | |
tree | ff8564703b8f37d960d586e9926ca3899b31b43a /clang/lib/CodeGen/CGBuiltin.cpp | |
parent | d8d66a6b285b7c9ee7a9040550a52953336d9337 (diff) | |
download | bcm5719-llvm-82aa42af4971e3cb0e31bed874c8d5f7c8d3737c.tar.gz bcm5719-llvm-82aa42af4971e3cb0e31bed874c8d5f7c8d3737c.zip |
[X86] Lowering Mask Scalar intrinsics to native IR (Clang part)
Summary: Lowering add, sub, mul, and div mask scalar intrinsic calls
to native IR.
Reviewers: craig.topper, RKSimon, spatel, sroland
Reviewed By: craig.topper
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D47979
llvm-svn: 334741
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 3c4184d8f32..08175b3dfc4 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -9982,6 +9982,35 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_pternlogq256_maskz: return EmitX86Ternlog(*this, /*ZeroMask*/true, Ops); + case X86::BI__builtin_ia32_divss_round_mask: + case X86::BI__builtin_ia32_divsd_round_mask: { + Intrinsic::ID ID; + switch (BuiltinID) { + default: llvm_unreachable("Unsupported intrinsic!"); + case X86::BI__builtin_ia32_divss_round_mask: + ID = Intrinsic::x86_avx512_mask_div_ss_round; break; + case X86::BI__builtin_ia32_divsd_round_mask: + ID = Intrinsic::x86_avx512_mask_div_sd_round; break; + } + Function *Intr = CGM.getIntrinsic(ID); + + // If round parameter is not _MM_FROUND_CUR_DIRECTION, don't lower. + if (cast<llvm::ConstantInt>(Ops[4])->getZExtValue() != (uint64_t)4) + return Builder.CreateCall(Intr, Ops); + + Value *A = Builder.CreateExtractElement(Ops[0], (uint64_t)0); + Value *B = Builder.CreateExtractElement(Ops[1], (uint64_t)0); + Value *C = Builder.CreateExtractElement(Ops[2], (uint64_t)0); + Value *Mask = Ops[3]; + Value *Div = Builder.CreateFDiv(A, B); + llvm::VectorType *MaskTy = llvm::VectorType::get(Builder.getInt1Ty(), + cast<IntegerType>(Mask->getType())->getBitWidth()); + Mask = Builder.CreateBitCast(Mask, MaskTy); + Mask = Builder.CreateExtractElement(Mask, (uint64_t)0); + Value *Select = Builder.CreateSelect(Mask, Div, C); + return Builder.CreateInsertElement(Ops[0], Select, (uint64_t)0); + } + // 3DNow! case X86::BI__builtin_ia32_pswapdsf: case X86::BI__builtin_ia32_pswapdsi: { |