//===--------- DirectX.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{Acc, AX, AY, BX, BY}, nullptr, "dx.dot2add"); } } return nullptr; }