brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 667bce8 Raw
106 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H10#define LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H11 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 type60// matching the argument type. It is assumed that only the first argument is61// 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->getArg(I)));71  llvm::Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Args[0]->getType());72  return CGF.Builder.CreateCall(F, Args, Name);73}74 75llvm::Value *emitUnaryMaybeConstrainedFPBuiltin(clang::CodeGen::CodeGenFunction &CGF,76                                                const clang::CallExpr *E,77                                                unsigned IntrinsicID,78                                                unsigned ConstrainedIntrinsicID);79 80llvm::Value *EmitToInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,81                       clang::QualType T, llvm::IntegerType *IntType);82 83llvm::Value *EmitFromInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,84                         clang::QualType T, llvm::Type *ResultType);85 86clang::CodeGen::Address CheckAtomicAlignment(clang::CodeGen::CodeGenFunction &CGF,87                                             const clang::CallExpr *E);88 89llvm::Value *MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF,90                                   llvm::AtomicRMWInst::BinOp Kind,91                                   const clang::CallExpr *E,92                                   llvm::AtomicOrdering Ordering =93                                      llvm::AtomicOrdering::SequentiallyConsistent);94 95llvm::Value *EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF,96                                   const llvm::Intrinsic::ID IntrinsicID,97                                   llvm::Value *X,98                                   llvm::Value *Y,99                                   llvm::Value *&Carry);100 101llvm::Value *MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF,102                                    const clang::CallExpr *E,103                                    bool ReturnBool);104 105#endif106