summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBuiltin.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-07-06 07:14:47 +0000
committerCraig Topper <craig.topper@intel.com>2018-07-06 07:14:47 +0000
commitbe4c2933a2c370d292122fc2187d75436aeaea83 (patch)
treede0c24b661056a87eeb5ecd1dd2317468679d400 /clang/lib/CodeGen/CGBuiltin.cpp
parentc60e1807b3f099d67a3ed7ceb77dd4257c6d61b6 (diff)
downloadbcm5719-llvm-be4c2933a2c370d292122fc2187d75436aeaea83.tar.gz
bcm5719-llvm-be4c2933a2c370d292122fc2187d75436aeaea83.zip
[X86] Implement _builtin_ia32_vfmaddss and _builtin_ia32_vfmaddsd with native IR using llvm.fma intrinsic.
This generates some extra zeroing currently, but we should be able to quickly address that with some isel patterns. llvm-svn: 336417
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 56cf6a99524..f2efca8cc9c 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -9134,6 +9134,16 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
Value *Res = Builder.CreateCall(FMA, {A, B, C} );
return Builder.CreateInsertElement(Ops[0], Res, (uint64_t)0);
}
+ case X86::BI__builtin_ia32_vfmaddss:
+ case X86::BI__builtin_ia32_vfmaddsd: {
+ 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);
+ Function *FMA = CGM.getIntrinsic(Intrinsic::fma, A->getType());
+ Value *Res = Builder.CreateCall(FMA, {A, B, C} );
+ Value *Zero = Constant::getNullValue(Ops[0]->getType());
+ return Builder.CreateInsertElement(Zero, Res, (uint64_t)0);
+ }
case X86::BI__builtin_ia32_vfmaddps:
case X86::BI__builtin_ia32_vfmaddpd:
case X86::BI__builtin_ia32_vfmaddps256:
OpenPOWER on IntegriCloud