clang  3.7.0
Classes | Macros | Enumerations | Functions | Variables
CGBuiltin.cpp File Reference
#include "CodeGenFunction.h"
#include "CGCXXABI.h"
#include "CGObjCRuntime.h"
#include "CodeGenModule.h"
#include "TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/Basic/TargetBuiltins.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Intrinsics.h"
#include <sstream>
Include dependency graph for CGBuiltin.cpp:

Go to the source code of this file.

Classes

struct  NeonIntrinsicInfo
 

Macros

#define NEONMAP0(NameBase)   { NEON::BI__builtin_neon_ ## NameBase, 0, 0, #NameBase, 0 }
 
#define NEONMAP1(NameBase, LLVMIntrinsic, TypeModifier)
 
#define NEONMAP2(NameBase, LLVMIntrinsic, AltLLVMIntrinsic, TypeModifier)
 
#define INTRINSIC_WITH_CC(NAME)
 

Enumerations

enum  {
  AddRetType = (1 << 0), Add1ArgType = (1 << 1), Add2ArgTypes = (1 << 2), VectorizeRetType = (1 << 3),
  VectorizeArgTypes = (1 << 4), InventFloatType = (1 << 5), UnsignedAlts = (1 << 6), Use64BitVectors = (1 << 7),
  Use128BitVectors = (1 << 8), Vectorize1ArgType = Add1ArgType | VectorizeArgTypes, VectorRet = AddRetType | VectorizeRetType, VectorRetGetArgs01,
  FpCmpzModifiers
}
 

Functions

static ValueEmitToInt (CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::IntegerType *IntType)
 
static ValueEmitFromInt (CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::Type *ResultType)
 
static ValueMakeBinaryAtomicValue (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E)
 
static RValue EmitBinaryAtomic (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E)
 
static RValue EmitBinaryAtomicPost (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, Instruction::BinaryOps Op, bool Invert=false)
 
static ValueMakeAtomicCmpXchgValue (CodeGenFunction &CGF, const CallExpr *E, bool ReturnBool)
 Utility to insert an atomic cmpxchg instruction. More...
 
static ValueEmitFAbs (CodeGenFunction &CGF, Value *V)
 EmitFAbs - Emit a call to .fabs(). More...
 
static ValueEmitSignBit (CodeGenFunction &CGF, Value *V)
 
static RValue emitLibraryCall (CodeGenFunction &CGF, const FunctionDecl *Fn, const CallExpr *E, llvm::Value *calleeValue)
 
static llvm::ValueEmitOverflowIntrinsic (CodeGenFunction &CGF, const llvm::Intrinsic::ID IntrinsicID, llvm::Value *X, llvm::Value *Y, llvm::Value *&Carry)
 Emit a call to llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* depending on IntrinsicID. More...
 
static llvm::VectorType * GetNeonType (CodeGenFunction *CGF, NeonTypeFlags TypeFlags, bool V1Ty=false)
 
static const NeonIntrinsicInfofindNeonIntrinsicInMap (ArrayRef< NeonIntrinsicInfo > IntrinsicMap, unsigned BuiltinID, bool &MapProvenSorted)
 
static ValueEmitCommonNeonSISDBuiltinExpr (CodeGenFunction &CGF, const NeonIntrinsicInfo &SISDInfo, SmallVectorImpl< Value * > &Ops, const CallExpr *E)
 
static ValuepackTBLDVectorList (CodeGenFunction &CGF, ArrayRef< Value * > Ops, Value *ExtOp, Value *IndexOp, llvm::Type *ResTy, unsigned IntID, const char *Name)
 
static ValueEmitSpecialRegisterBuiltin (CodeGenFunction &CGF, const CallExpr *E, llvm::Type *RegisterType, llvm::Type *ValueType, bool IsRead)
 
static bool HasExtraNeonArgument (unsigned BuiltinID)
 
static ValueEmitAArch64TblBuiltinExpr (CodeGenFunction &CGF, unsigned BuiltinID, const CallExpr *E, SmallVectorImpl< Value * > &Ops)
 
static ValueemitUnaryFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
 
static ValueemitTernaryFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
 
static ValueemitFPIntBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID)
 
static ValueEmitSystemZIntrinsicWithCC (CodeGenFunction &CGF, unsigned IntrinsicID, const CallExpr *E)
 

Variables

static NeonIntrinsicInfo ARMSIMDIntrinsicMap []
 
static NeonIntrinsicInfo AArch64SIMDIntrinsicMap []
 
static NeonIntrinsicInfo AArch64SISDIntrinsicMap []
 
static bool NEONSIMDIntrinsicsProvenSorted = false
 
static bool AArch64SIMDIntrinsicsProvenSorted = false
 
static bool AArch64SISDIntrinsicsProvenSorted = false
 

Macro Definition Documentation

#define INTRINSIC_WITH_CC (   NAME)
Value:
case SystemZ::BI__builtin_##NAME: \
return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
static Value * EmitSystemZIntrinsicWithCC(CodeGenFunction &CGF, unsigned IntrinsicID, const CallExpr *E)
Definition: CGBuiltin.cpp:6842
return(x >> y)|(x<< (32-y))

Referenced by clang::CodeGen::CodeGenFunction::EmitSystemZBuiltinExpr().

#define NEONMAP0 (   NameBase)    { NEON::BI__builtin_neon_ ## NameBase, 0, 0, #NameBase, 0 }

Definition at line 2071 of file CGBuiltin.cpp.

#define NEONMAP1 (   NameBase,
  LLVMIntrinsic,
  TypeModifier 
)
Value:
{ NEON:: BI__builtin_neon_ ## NameBase, \
Intrinsic::LLVMIntrinsic, 0, #NameBase, TypeModifier }

Definition at line 2074 of file CGBuiltin.cpp.

#define NEONMAP2 (   NameBase,
  LLVMIntrinsic,
  AltLLVMIntrinsic,
  TypeModifier 
)
Value:
{ NEON:: BI__builtin_neon_ ## NameBase, \
Intrinsic::LLVMIntrinsic, Intrinsic::AltLLVMIntrinsic, \
#NameBase, TypeModifier }

Definition at line 2078 of file CGBuiltin.cpp.

Enumeration Type Documentation

anonymous enum
Enumerator
AddRetType 
Add1ArgType 
Add2ArgTypes 
VectorizeRetType 
VectorizeArgTypes 
InventFloatType 
UnsignedAlts 
Use64BitVectors 
Use128BitVectors 
Vectorize1ArgType 
VectorRet 
VectorRetGetArgs01 
FpCmpzModifiers 

Definition at line 2037 of file CGBuiltin.cpp.

Function Documentation

static Value* EmitAArch64TblBuiltinExpr ( CodeGenFunction CGF,
unsigned  BuiltinID,
const CallExpr E,
SmallVectorImpl< Value * > &  Ops 
)
static
static RValue EmitBinaryAtomic ( CodeGenFunction CGF,
llvm::AtomicRMWInst::BinOp  Kind,
const CallExpr E 
)
static

Definition at line 114 of file CGBuiltin.cpp.

References clang::CodeGen::RValue::get(), and MakeBinaryAtomicValue().

static RValue EmitBinaryAtomicPost ( CodeGenFunction CGF,
llvm::AtomicRMWInst::BinOp  Kind,
const CallExpr E,
Instruction::BinaryOps  Op,
bool  Invert = false 
)
static
static Value* EmitCommonNeonSISDBuiltinExpr ( CodeGenFunction CGF,
const NeonIntrinsicInfo SISDInfo,
SmallVectorImpl< Value * > &  Ops,
const CallExpr E 
)
static
static Value* EmitFAbs ( CodeGenFunction CGF,
Value V 
)
static
static Value* emitFPIntBuiltin ( CodeGenFunction CGF,
const CallExpr E,
unsigned  IntrinsicID 
)
static
static Value* EmitFromInt ( CodeGenFunction CGF,
llvm::Value V,
QualType  T,
llvm::Type *  ResultType 
)
static
static RValue emitLibraryCall ( CodeGenFunction CGF,
const FunctionDecl Fn,
const CallExpr E,
llvm::Value calleeValue 
)
static
static llvm::Value* EmitOverflowIntrinsic ( CodeGenFunction CGF,
const llvm::Intrinsic::ID  IntrinsicID,
llvm::Value X,
llvm::Value Y,
llvm::Value *&  Carry 
)
static

Emit a call to llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* depending on IntrinsicID.

  • CGF The current codegen function.
  • IntrinsicID The ID for the Intrinsic we wish to generate.
  • X The first argument to the llvm.*.with.overflow.*.
  • Y The second argument to the llvm.*.with.overflow.*.
  • Carry The carry returned by the llvm.*.with.overflow.*.
    Returns
    The result (i.e. sum/product) returned by the intrinsic.

Definition at line 244 of file CGBuiltin.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::getIntrinsic(), and X.

static Value* EmitSignBit ( CodeGenFunction CGF,
Value V 
)
static

Emit the computation of the sign bit for a floating point value. Returns the i1 sign bit value.

Definition at line 210 of file CGBuiltin.cpp.

References clang::CodeGen::CodeGenFunction::Builder, AttributeLangSupport::C, clang::CodeGen::CodeGenFunction::CGM, and clang::CodeGen::CodeGenModule::getLLVMContext().

static Value* EmitSpecialRegisterBuiltin ( CodeGenFunction CGF,
const CallExpr E,
llvm::Type *  RegisterType,
llvm::Type *  ValueType,
bool  IsRead 
)
static
static Value* EmitSystemZIntrinsicWithCC ( CodeGenFunction CGF,
unsigned  IntrinsicID,
const CallExpr E 
)
static

Handle a SystemZ function in which the final argument is a pointer to an int that receives the post-instruction CC value. At the LLVM level this is represented as a function that returns a {result, cc} pair.

Definition at line 6842 of file CGBuiltin.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CallExpr::getArg(), clang::CodeGen::CodeGenModule::getIntrinsic(), and clang::CallExpr::getNumArgs().

static Value* emitTernaryFPBuiltin ( CodeGenFunction CGF,
const CallExpr E,
unsigned  IntrinsicID 
)
static
static Value* EmitToInt ( CodeGenFunction CGF,
llvm::Value V,
QualType  T,
llvm::IntegerType *  IntType 
)
static

Emit the conversions required to turn the given value into an integer of the given size.

Definition at line 61 of file CGBuiltin.cpp.

References clang::CodeGen::CodeGenFunction::Builder, and clang::CodeGen::CodeGenFunction::EmitToMemory().

Referenced by EmitBinaryAtomicPost(), MakeAtomicCmpXchgValue(), and MakeBinaryAtomicValue().

static Value* emitUnaryFPBuiltin ( CodeGenFunction CGF,
const CallExpr E,
unsigned  IntrinsicID 
)
static
static const NeonIntrinsicInfo* findNeonIntrinsicInMap ( ArrayRef< NeonIntrinsicInfo IntrinsicMap,
unsigned  BuiltinID,
bool MapProvenSorted 
)
static
static llvm::VectorType* GetNeonType ( CodeGenFunction CGF,
NeonTypeFlags  TypeFlags,
bool  V1Ty = false 
)
static
static bool HasExtraNeonArgument ( unsigned  BuiltinID)
static

Return true if BuiltinID is an overloaded Neon intrinsic with an extra argument that specifies the vector type.

Definition at line 3346 of file CGBuiltin.cpp.

Referenced by clang::CodeGen::CodeGenFunction::EmitARMBuiltinExpr().

static Value* MakeAtomicCmpXchgValue ( CodeGenFunction CGF,
const CallExpr E,
bool  ReturnBool 
)
static

Utility to insert an atomic cmpxchg instruction.

Parameters
CGFThe current codegen function.
EBuiltin call expression to convert to cmpxchg. arg0 - address to operate on arg1 - value to compare with arg2 - new value
ReturnBoolSpecifies whether to return success flag of cmpxchg result or the old value.
Returns
result of cmpxchg, according to ReturnBool

Definition at line 170 of file CGBuiltin.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::ConvertType(), EmitFromInt(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), EmitToInt(), clang::CallExpr::getArg(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Expr::getType(), and clang::ASTContext::getTypeSize().

Referenced by clang::CodeGen::CodeGenFunction::EmitNVPTXBuiltinExpr().

static Value* MakeBinaryAtomicValue ( CodeGenFunction CGF,
llvm::AtomicRMWInst::BinOp  Kind,
const CallExpr E 
)
static
static Value* packTBLDVectorList ( CodeGenFunction CGF,
ArrayRef< Value * >  Ops,
Value ExtOp,
Value IndexOp,
llvm::Type *  ResTy,
unsigned  IntID,
const char *  Name 
)
static

Variable Documentation

NeonIntrinsicInfo AArch64SIMDIntrinsicMap[]
static

Definition at line 2300 of file CGBuiltin.cpp.

bool AArch64SIMDIntrinsicsProvenSorted = false
static

Definition at line 2616 of file CGBuiltin.cpp.

NeonIntrinsicInfo AArch64SISDIntrinsicMap[]
static

Definition at line 2415 of file CGBuiltin.cpp.

bool AArch64SISDIntrinsicsProvenSorted = false
static

Definition at line 2617 of file CGBuiltin.cpp.

NeonIntrinsicInfo ARMSIMDIntrinsicMap[]
static

Definition at line 2083 of file CGBuiltin.cpp.

bool NEONSIMDIntrinsicsProvenSorted = false
static

Definition at line 2614 of file CGBuiltin.cpp.