xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
1 //===--------- DirectX.cpp - Emit LLVM Code for builtins ------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This contains code to emit Builtin calls as LLVM code.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "CGHLSLRuntime.h"
14 #include "CodeGenFunction.h"
15 #include "clang/Basic/TargetBuiltins.h"
16 #include "llvm/IR/Intrinsics.h"
17 
18 using namespace clang;
19 using namespace CodeGen;
20 using namespace llvm;
21 
22 Value *CodeGenFunction::EmitDirectXBuiltinExpr(unsigned BuiltinID,
23                                                const CallExpr *E) {
24   switch (BuiltinID) {
25   case DirectX::BI__builtin_dx_dot2add: {
26     Value *A = EmitScalarExpr(E->getArg(0));
27     Value *B = EmitScalarExpr(E->getArg(1));
28     Value *Acc = EmitScalarExpr(E->getArg(2));
29 
30     Value *AX = Builder.CreateExtractElement(A, Builder.getSize(0));
31     Value *AY = Builder.CreateExtractElement(A, Builder.getSize(1));
32     Value *BX = Builder.CreateExtractElement(B, Builder.getSize(0));
33     Value *BY = Builder.CreateExtractElement(B, Builder.getSize(1));
34 
35     Intrinsic::ID ID = llvm ::Intrinsic::dx_dot2add;
36     return Builder.CreateIntrinsic(
37         /*ReturnType=*/Acc->getType(), ID,
38         ArrayRef<Value *>{Acc, AX, AY, BX, BY}, nullptr, "dx.dot2add");
39   }
40   }
41   return nullptr;
42 }
43