diff options
Diffstat (limited to 'clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp')
-rw-r--r-- | clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp b/clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp new file mode 100644 index 0000000..32ec59f --- /dev/null +++ b/clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp @@ -0,0 +1,42 @@ +//===--------- BuiltinDirectX.cpp - Emit LLVM Code for builtins -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This contains code to emit Builtin calls as LLVM code. +// +//===----------------------------------------------------------------------===// + +#include "CGHLSLRuntime.h" +#include "CodeGenFunction.h" +#include "clang/Basic/TargetBuiltins.h" +#include "llvm/IR/Intrinsics.h" + +using namespace clang; +using namespace CodeGen; +using namespace llvm; + +Value *CodeGenFunction::EmitDirectXBuiltinExpr(unsigned BuiltinID, + const CallExpr *E) { + switch (BuiltinID) { + case DirectX::BI__builtin_dx_dot2add: { + Value *A = EmitScalarExpr(E->getArg(0)); + Value *B = EmitScalarExpr(E->getArg(1)); + Value *Acc = EmitScalarExpr(E->getArg(2)); + + Value *AX = Builder.CreateExtractElement(A, Builder.getSize(0)); + Value *AY = Builder.CreateExtractElement(A, Builder.getSize(1)); + Value *BX = Builder.CreateExtractElement(B, Builder.getSize(0)); + Value *BY = Builder.CreateExtractElement(B, Builder.getSize(1)); + + Intrinsic::ID ID = llvm ::Intrinsic::dx_dot2add; + return Builder.CreateIntrinsic( + /*ReturnType=*/Acc->getType(), ID, + ArrayRef<Value *>{Acc, AX, AY, BX, BY}, nullptr, "dx.dot2add"); + } + } + return nullptr; +} |