LLVM API Documentation

Defines | Functions | Variables
Execution.cpp File Reference
#include "Interpreter.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <cmath>
Include dependency graph for Execution.cpp:

Go to the source code of this file.

Defines

#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)   case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break

Functions

 STATISTIC (NumDynamicInsts,"Number of dynamic instructions executed")
static void SetValue (Value *V, GenericValue Val, ExecutionContext &SF)
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, const Type *Ty, const bool val)
static GenericValue executeCmpInst (unsigned predicate, GenericValue Src1, GenericValue Src2, Type *Ty)
static GenericValue executeSelectInst (GenericValue Src1, GenericValue Src2, GenericValue Src3, const 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"))

Define Documentation

#define DEBUG_TYPE   "interpreter"

Definition at line 30 of file Execution.cpp.

#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 FLOAT_VECTOR_OP (   OP)
Value:
{                                         \
  if (dyn_cast<VectorType>(Ty)->getElementType()->isFloatTy())        \
    FLOAT_VECTOR_FUNCTION(OP, FloatVal)                               \
  else {                                                              \
    if (dyn_cast<VectorType>(Ty)->getElementType()->isDoubleTy())     \
      FLOAT_VECTOR_FUNCTION(OP, DoubleVal)                            \
    else {                                                            \
      dbgs() << "Unhandled type for OP instruction: " << *Ty << "\n"; \
      llvm_unreachable(0);                                            \
    }                                                                 \
  }                                                                   \
}

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

#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 49 of file Execution.cpp.

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

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

Definition at line 303 of file Execution.cpp.

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

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

Definition at line 113 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().

#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 131 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().

#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;                                                          \
    }                                                                       \
  }

Definition at line 338 of file Execution.cpp.

Referenced by executeFCMP_ONE().

#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 456 of file Execution.cpp.

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

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

Definition at line 1714 of file Execution.cpp.

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

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

Definition at line 316 of file Execution.cpp.

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

#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;

Definition at line 308 of file Execution.cpp.

#define IMPLEMENT_VECTOR_INTEGER_ICMP (   OP,
  TY 
)
Value:
case Type::VectorTyID: {                                           \
    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 118 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().

#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;                                                       \
  }

Definition at line 467 of file Execution.cpp.

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

#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().

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().

#define MASK_VECTOR_NANS (   TY,
  X,
  Y,
  FLAG 
)
Value:
if (TY->isVectorTy()) {                                                   \
    if (dyn_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 363 of file Execution.cpp.

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

#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 351 of file Execution.cpp.


Function Documentation

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

Variable Documentation

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