aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp')
-rw-r--r--clang/lib/CodeGen/TargetBuiltins/BuiltinDirectX.cpp42
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;
+}