diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetMachine')
| -rw-r--r-- | llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp | 76 | 
1 files changed, 72 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp b/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp index 653f0217cd8..03819099bf2 100644 --- a/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp +++ b/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp @@ -15,18 +15,36 @@  #include "llvm/CodeGen/TargetMachine.h"  #include "llvm/DerivedTypes.h" +//************************ Exported Constants ******************************/ + + +// External object describing the machine instructions +// Initialized only when the TargetMachine class is created +// and reset when that class is destroyed. +//  +const MachineInstrDescriptor* TargetInstrDescriptors = NULL; +  //************************ Class Implementations **************************/  //--------------------------------------------------------------------------- -// function TargetMachine::findOptimalMemberOffsets  +// class TargetMachine  //   // Purpose: -//   Compute optimal offsets for the members of a structure. -//   Returns a vector of unsigned ints, one per member. -//   Caller is responsible for freeing the vector. +//   Machine description. +//   //--------------------------------------------------------------------------- + +// function TargetMachine::findOptimalStorageSize  +//  +// Purpose: +//   Compute optimal storage size for a structure, based on +//   the optimal member offsets. +//   This default implementation assumes that all sub-word data items use +//   space equal to optSizeForSubWordData, and all other primitive data +//   items use space according to the type. +//     unsigned int  TargetMachine::findOptimalStorageSize(const Type* ty) const  { @@ -87,6 +105,14 @@ TargetMachine::findOptimalStorageSize(const Type* ty) const      }  } + +// function TargetMachine::findOptimalMemberOffsets  +//  +// Purpose: +//   Compute optimal offsets for the members of a structure. +//   Returns a vector of unsigned ints, one per member. +//   Caller is responsible for freeing the vector. +  unsigned int*  TargetMachine::findOptimalMemberOffsets(const StructType* stype) const  { @@ -102,4 +128,46 @@ TargetMachine::findOptimalMemberOffsets(const StructType* stype) const    return offsetVec;  } + +//--------------------------------------------------------------------------- +// class MachineInstructionInfo +//	Interface to description of machine instructions +//--------------------------------------------------------------------------- + + +/*ctor*/ +MachineInstrInfo::MachineInstrInfo(const MachineInstrDescriptor* _desc, +				   unsigned int _descSize) +  : desc(_desc), descSize(_descSize) +{ +  assert(TargetInstrDescriptors == NULL && desc != NULL); +  TargetInstrDescriptors = desc;	// initialize global variable +}   + + +/*dtor*/ +MachineInstrInfo::~MachineInstrInfo() +{ +  TargetInstrDescriptors = NULL;	// reset global variable +} + + +bool +MachineInstrInfo::constantFitsInImmedField(MachineOpCode opCode, +					   int64_t intValue) const +{ +  // First, check if opCode has an immed field. +  bool isSignExtended; +  uint64_t maxImmedValue = this->maxImmedConstant(opCode, isSignExtended); +  if (maxImmedValue != 0) +    { +      // Now check if the constant fits +      if (intValue <= (int64_t) maxImmedValue && +	  intValue >= -((int64_t) maxImmedValue+1)) +	return true; +    } +   +  return false; +} +  //---------------------------------------------------------------------------  | 

