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;
+}
+
 //---------------------------------------------------------------------------