Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.0.0git
Execution.cpp File Reference

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "interpreter"
#define IMPLEMENT_BINARY_OPERATOR(OP, TY)
#define IMPLEMENT_INTEGER_ICMP(OP, TY)
#define IMPLEMENT_VECTOR_INTEGER_ICMP(OP, TY)
#define IMPLEMENT_POINTER_ICMP(OP)
#define IMPLEMENT_FCMP(OP, TY)
#define IMPLEMENT_VECTOR_FCMP_T(OP, TY)
#define IMPLEMENT_VECTOR_FCMP(OP)
#define IMPLEMENT_SCALAR_NANS(TY, X, Y)
#define MASK_VECTOR_NANS_T(X, Y, TZ, FLAG)
#define MASK_VECTOR_NANS(TY, X, Y, FLAG)
#define IMPLEMENT_UNORDERED(TY, X, Y)
#define IMPLEMENT_VECTOR_UNORDERED(TY, X, Y, FUNC)
#define INTEGER_VECTOR_OPERATION(OP)
#define INTEGER_VECTOR_FUNCTION(OP)
#define FLOAT_VECTOR_FUNCTION(OP, TY)
#define FLOAT_VECTOR_OP(OP)
#define IMPLEMENT_VAARG(TY)

Functions

 STATISTIC (NumDynamicInsts, "Number of dynamic instructions executed")
static void SetValue (Value *V, GenericValue Val, ExecutionContext &SF)
static void executeFNegInst (GenericValue &Dest, GenericValue Src, Type *Ty)
static void executeFAddInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
static void executeFSubInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
static void executeFMulInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
static void executeFDivInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
static void executeFRemInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_EQ (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_NE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_ULT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_SLT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_UGT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_SGT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_ULE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_SLE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_UGE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeICMP_SGE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_OEQ (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_ONE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_OLE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_OGE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_OLT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_OGT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_UEQ (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_UNE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_ULE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_UGE (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_ULT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_UGT (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_ORD (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_UNO (GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeFCMP_BOOL (GenericValue Src1, GenericValue Src2, Type *Ty, const bool val)
static GenericValue executeSelectInst (GenericValue Src1, GenericValue Src2, GenericValue Src3, Type *Ty)
static unsigned getShiftAmount (uint64_t orgShiftAmount, llvm::APInt valueToShift)

Variables

static cl::opt< boolPrintVolatile ("interpreter-print-volatile", cl::Hidden, cl::desc("make the interpreter print every volatile load and store"))

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "interpreter"

Definition at line 30 of file Execution.cpp.

◆ FLOAT_VECTOR_FUNCTION

#define FLOAT_VECTOR_FUNCTION ( OP,
TY )
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].TY = \
Src1.AggregateVal[i].TY OP Src2.AggregateVal[i].TY;
#define OP(OPC)
Definition Instruction.h:46

◆ FLOAT_VECTOR_OP

#define FLOAT_VECTOR_OP ( OP)
Value:
{ \
if (cast<VectorType>(Ty)->getElementType()->isFloatTy()) \
FLOAT_VECTOR_FUNCTION(OP, FloatVal) \
else { \
if (cast<VectorType>(Ty)->getElementType()->isDoubleTy()) \
FLOAT_VECTOR_FUNCTION(OP, DoubleVal) \
else { \
dbgs() << "Unhandled type for OP instruction: " << *Ty << "\n"; \
llvm_unreachable(0); \
} \
} \
}
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565

Referenced by llvm::Interpreter::visitBinaryOperator().

◆ IMPLEMENT_BINARY_OPERATOR

#define IMPLEMENT_BINARY_OPERATOR ( OP,
TY )
Value:
case Type::TY##TyID: \
Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; \
break

Definition at line 103 of file Execution.cpp.

Referenced by executeFAddInst(), executeFDivInst(), executeFMulInst(), and executeFSubInst().

◆ IMPLEMENT_FCMP

#define IMPLEMENT_FCMP ( OP,
TY )
Value:
case Type::TY##TyID: \
Dest.IntVal = APInt(1,Src1.TY##Val OP Src2.TY##Val); \
break
Class for arbitrary precision integers.
Definition APInt.h:78

Definition at line 358 of file Execution.cpp.

Referenced by executeFCMP_OEQ(), executeFCMP_OGE(), executeFCMP_OGT(), executeFCMP_OLE(), executeFCMP_OLT(), and executeFCMP_ONE().

◆ IMPLEMENT_INTEGER_ICMP

#define IMPLEMENT_INTEGER_ICMP ( OP,
TY )
Value:
case Type::IntegerTyID: \
Dest.IntVal = APInt(1,Src1.IntVal.OP(Src2.IntVal)); \
break;

Definition at line 167 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

◆ IMPLEMENT_POINTER_ICMP

#define IMPLEMENT_POINTER_ICMP ( OP)
Value:
case Type::PointerTyID: \
Dest.IntVal = APInt(1,(void*)(intptr_t)Src1.PointerVal OP \
(void*)(intptr_t)Src2.PointerVal); \
break;

Definition at line 186 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

◆ IMPLEMENT_SCALAR_NANS

#define IMPLEMENT_SCALAR_NANS ( TY,
X,
Y )
Value:
if (TY->isFloatTy()) { \
if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
Dest.IntVal = APInt(1,false); \
return Dest; \
} \
} else { \
if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
Dest.IntVal = APInt(1,false); \
return Dest; \
} \
}
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")

Definition at line 394 of file Execution.cpp.

Referenced by executeFCMP_ONE().

◆ IMPLEMENT_UNORDERED

#define IMPLEMENT_UNORDERED ( TY,
X,
Y )
Value:
if (TY->isFloatTy()) { \
if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
Dest.IntVal = APInt(1,true); \
return Dest; \
} \
} else if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
Dest.IntVal = APInt(1,true); \
return Dest; \
}

Definition at line 512 of file Execution.cpp.

Referenced by executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

◆ IMPLEMENT_VAARG

#define IMPLEMENT_VAARG ( TY)
Value:
case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break

Definition at line 1726 of file Execution.cpp.

Referenced by llvm::Interpreter::visitVAArgInst().

◆ IMPLEMENT_VECTOR_FCMP

#define IMPLEMENT_VECTOR_FCMP ( OP)
Value:
case Type::FixedVectorTyID: \
case Type::ScalableVectorTyID: \
if (cast<VectorType>(Ty)->getElementType()->isFloatTy()) { \
IMPLEMENT_VECTOR_FCMP_T(OP, Float); \
} else { \
IMPLEMENT_VECTOR_FCMP_T(OP, Double); \
}

Definition at line 371 of file Execution.cpp.

Referenced by executeFCMP_OEQ(), executeFCMP_OGE(), executeFCMP_OGT(), executeFCMP_OLE(), executeFCMP_OLT(), and executeFCMP_ONE().

◆ IMPLEMENT_VECTOR_FCMP_T

#define IMPLEMENT_VECTOR_FCMP_T ( OP,
TY )
Value:
assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
Dest.AggregateVal.resize( Src1.AggregateVal.size() ); \
for( uint32_t _i=0;_i<Src1.AggregateVal.size();_i++) \
Dest.AggregateVal[_i].IntVal = APInt(1, \
Src1.AggregateVal[_i].TY##Val OP Src2.AggregateVal[_i].TY##Val);\
break;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

Definition at line 363 of file Execution.cpp.

◆ IMPLEMENT_VECTOR_INTEGER_ICMP

#define IMPLEMENT_VECTOR_INTEGER_ICMP ( OP,
TY )
Value:
case Type::FixedVectorTyID: \
case Type::ScalableVectorTyID: { \
assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
Dest.AggregateVal.resize(Src1.AggregateVal.size()); \
for (uint32_t _i = 0; _i < Src1.AggregateVal.size(); _i++) \
Dest.AggregateVal[_i].IntVal = APInt( \
1, Src1.AggregateVal[_i].IntVal.OP(Src2.AggregateVal[_i].IntVal)); \
} break;

Definition at line 172 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

◆ IMPLEMENT_VECTOR_UNORDERED

#define IMPLEMENT_VECTOR_UNORDERED ( TY,
X,
Y,
FUNC )
Value:
if (TY->isVectorTy()) { \
GenericValue DestMask = Dest; \
Dest = FUNC(Src1, Src2, Ty); \
for (size_t _i = 0; _i < Src1.AggregateVal.size(); _i++) \
if (DestMask.AggregateVal[_i].IntVal == true) \
Dest.AggregateVal[_i].IntVal = APInt(1, true); \
return Dest; \
}
std::vector< GenericValue > AggregateVal

Definition at line 523 of file Execution.cpp.

Referenced by executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

◆ INTEGER_VECTOR_FUNCTION

#define INTEGER_VECTOR_FUNCTION ( OP)
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].IntVal = \
Src1.AggregateVal[i].IntVal.OP(Src2.AggregateVal[i].IntVal);

Referenced by llvm::Interpreter::visitBinaryOperator().

◆ INTEGER_VECTOR_OPERATION

#define INTEGER_VECTOR_OPERATION ( OP)
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].IntVal = \
Src1.AggregateVal[i].IntVal OP Src2.AggregateVal[i].IntVal;

Referenced by llvm::Interpreter::visitBinaryOperator().

◆ MASK_VECTOR_NANS

#define MASK_VECTOR_NANS ( TY,
X,
Y,
FLAG )
Value:
if (TY->isVectorTy()) { \
if (cast<VectorType>(TY)->getElementType()->isFloatTy()) { \
MASK_VECTOR_NANS_T(X, Y, Float, FLAG) \
} else { \
MASK_VECTOR_NANS_T(X, Y, Double, FLAG) \
} \
} \

Definition at line 419 of file Execution.cpp.

Referenced by executeFCMP_ONE(), executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

◆ MASK_VECTOR_NANS_T

#define MASK_VECTOR_NANS_T ( X,
Y,
TZ,
FLAG )
Value:
assert(X.AggregateVal.size() == Y.AggregateVal.size()); \
Dest.AggregateVal.resize( X.AggregateVal.size() ); \
for( uint32_t _i=0;_i<X.AggregateVal.size();_i++) { \
if (X.AggregateVal[_i].TZ##Val != X.AggregateVal[_i].TZ##Val || \
Y.AggregateVal[_i].TZ##Val != Y.AggregateVal[_i].TZ##Val) \
Dest.AggregateVal[_i].IntVal = APInt(1,FLAG); \
else { \
Dest.AggregateVal[_i].IntVal = APInt(1,!FLAG); \
} \
}

Definition at line 407 of file Execution.cpp.

Function Documentation

◆ executeFAddInst()

void executeFAddInst ( GenericValue & Dest,
GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_BOOL()

GenericValue executeFCMP_BOOL ( GenericValue Src1,
GenericValue Src2,
Type * Ty,
const bool val )
static

◆ executeFCMP_OEQ()

GenericValue executeFCMP_OEQ ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_OGE()

GenericValue executeFCMP_OGE ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_OGT()

GenericValue executeFCMP_OGT ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_OLE()

GenericValue executeFCMP_OLE ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_OLT()

GenericValue executeFCMP_OLT ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_ONE()

◆ executeFCMP_ORD()

◆ executeFCMP_UEQ()

GenericValue executeFCMP_UEQ ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_UGE()

GenericValue executeFCMP_UGE ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_UGT()

GenericValue executeFCMP_UGT ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_ULE()

GenericValue executeFCMP_ULE ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_ULT()

GenericValue executeFCMP_ULT ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_UNE()

GenericValue executeFCMP_UNE ( GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFCMP_UNO()

◆ executeFDivInst()

void executeFDivInst ( GenericValue & Dest,
GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFMulInst()

void executeFMulInst ( GenericValue & Dest,
GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeFNegInst()

◆ executeFRemInst()

◆ executeFSubInst()

void executeFSubInst ( GenericValue & Dest,
GenericValue Src1,
GenericValue Src2,
Type * Ty )
static

◆ executeICMP_EQ()

◆ executeICMP_NE()

◆ executeICMP_SGE()

◆ executeICMP_SGT()

◆ executeICMP_SLE()

◆ executeICMP_SLT()

◆ executeICMP_UGE()

◆ executeICMP_UGT()

◆ executeICMP_ULE()

◆ executeICMP_ULT()

◆ executeSelectInst()

GenericValue executeSelectInst ( GenericValue Src1,
GenericValue Src2,
GenericValue Src3,
Type * Ty )
static

◆ getShiftAmount()

unsigned getShiftAmount ( uint64_t orgShiftAmount,
llvm::APInt valueToShift )
static

◆ SetValue()

◆ STATISTIC()

STATISTIC ( NumDynamicInsts ,
"Number of dynamic instructions executed"  )

Variable Documentation

◆ PrintVolatile

cl::opt< bool > PrintVolatile("interpreter-print-volatile", cl::Hidden, cl::desc("make the interpreter print every volatile load and store")) ( "interpreter-print-volatile" ,
cl::Hidden ,
cl::desc("make the interpreter print every volatile load and store")  )
static