1//===------ CGBuiltin.h - 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#ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H
10#define LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H
11
12#include "CodeGenFunction.h"
13
14// Many of MSVC builtins are on x64, ARM and AArch64; to avoid repeating code,
15// we handle them here.
16enum class clang::CodeGen::CodeGenFunction::MSVCIntrin {
17 _BitScanForward,
18 _BitScanReverse,
19 _InterlockedAnd,
20 _InterlockedCompareExchange,
21 _InterlockedDecrement,
22 _InterlockedExchange,
23 _InterlockedExchangeAdd,
24 _InterlockedExchangeSub,
25 _InterlockedIncrement,
26 _InterlockedOr,
27 _InterlockedXor,
28 _InterlockedExchangeAdd_acq,
29 _InterlockedExchangeAdd_rel,
30 _InterlockedExchangeAdd_nf,
31 _InterlockedExchange_acq,
32 _InterlockedExchange_rel,
33 _InterlockedExchange_nf,
34 _InterlockedCompareExchange_acq,
35 _InterlockedCompareExchange_rel,
36 _InterlockedCompareExchange_nf,
37 _InterlockedCompareExchange128,
38 _InterlockedCompareExchange128_acq,
39 _InterlockedCompareExchange128_rel,
40 _InterlockedCompareExchange128_nf,
41 _InterlockedOr_acq,
42 _InterlockedOr_rel,
43 _InterlockedOr_nf,
44 _InterlockedXor_acq,
45 _InterlockedXor_rel,
46 _InterlockedXor_nf,
47 _InterlockedAnd_acq,
48 _InterlockedAnd_rel,
49 _InterlockedAnd_nf,
50 _InterlockedIncrement_acq,
51 _InterlockedIncrement_rel,
52 _InterlockedIncrement_nf,
53 _InterlockedDecrement_acq,
54 _InterlockedDecrement_rel,
55 _InterlockedDecrement_nf,
56 __fastfail,
57};
58
59// Emit a simple intrinsic that has N scalar arguments and a return type
60// matching the argument type. It is assumed that only the first argument is
61// overloaded.
62template <unsigned N>
63llvm::Value *emitBuiltinWithOneOverloadedType(clang::CodeGen::CodeGenFunction &CGF,
64 const clang::CallExpr *E,
65 unsigned IntrinsicID,
66 llvm::StringRef Name = "") {
67 static_assert(N, "expect non-empty argument");
68 clang::SmallVector<llvm::Value *, N> Args;
69 for (unsigned I = 0; I < N; ++I)
70 Args.push_back(CGF.EmitScalarExpr(E: E->getArg(Arg: I)));
71 llvm::Function *F = CGF.CGM.getIntrinsic(IID: IntrinsicID, Tys: Args[0]->getType());
72 return CGF.Builder.CreateCall(F, Args, Name);
73}
74
75// Fills in the trailing parameters of an intrinsic that the builtin does not
76// expose, using the values declared via ImmArg<..., DefaultValue<...>>.
77void appendDefaultIntrinsicArgs(llvm::SmallVectorImpl<llvm::Value *> &Args,
78 llvm::Function *F);
79
80llvm::Value *emitUnaryMaybeConstrainedFPBuiltin(clang::CodeGen::CodeGenFunction &CGF,
81 const clang::CallExpr *E,
82 unsigned IntrinsicID,
83 unsigned ConstrainedIntrinsicID);
84
85llvm::Value *EmitToInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
86 clang::QualType T, llvm::IntegerType *IntType);
87
88llvm::Value *EmitFromInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
89 clang::QualType T, llvm::Type *ResultType);
90
91clang::CodeGen::Address CheckAtomicAlignment(clang::CodeGen::CodeGenFunction &CGF,
92 const clang::CallExpr *E);
93
94llvm::Value *MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF,
95 llvm::AtomicRMWInst::BinOp Kind,
96 const clang::CallExpr *E,
97 llvm::AtomicOrdering Ordering =
98 llvm::AtomicOrdering::SequentiallyConsistent);
99
100llvm::Value *EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF,
101 const llvm::Intrinsic::ID IntrinsicID,
102 llvm::Value *X,
103 llvm::Value *Y,
104 llvm::Value *&Carry);
105
106llvm::Value *MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF,
107 const clang::CallExpr *E, bool ReturnBool,
108 llvm::AtomicOrdering SuccessOrdering,
109 llvm::AtomicOrdering FailureOrdering);
110
111#endif
112