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