Added MachineInstrInfo class and moved instruction-related members there.
Added several fields to MachineInstrDescriptor (and renamed it from
MachineInstrInfo. Latency fields are to support scheduling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/TargetMachine/TargetMachine.cpp b/lib/CodeGen/TargetMachine/TargetMachine.cpp
index 653f021..0381909 100644
--- a/lib/CodeGen/TargetMachine/TargetMachine.cpp
+++ b/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 @@
}
}
+
+// 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 @@
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;
+}
+
//---------------------------------------------------------------------------