aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/TargetMachine/TargetMachine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/TargetMachine/TargetMachine.cpp')
-rw-r--r--lib/CodeGen/TargetMachine/TargetMachine.cpp76
1 files changed, 72 insertions, 4 deletions
diff --git a/lib/CodeGen/TargetMachine/TargetMachine.cpp b/lib/CodeGen/TargetMachine/TargetMachine.cpp
index 653f0217cd..03819099bf 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 @@ 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;
+}
+
//---------------------------------------------------------------------------