Add handle to TargetMachine object in all Machine...Info classes.
[oota-llvm.git] / lib / Target / TargetMachine.cpp
1 //===-- TargetMachine.cpp - General Target Information ---------------------==//
2 //
3 // This file describes the general parts of a Target machine.
4 // This file also implements the InstInfo interface as well...
5 //
6 //===----------------------------------------------------------------------===//
7
8 #include "llvm/Target/MachineInstrInfo.h"
9 #include "llvm/DerivedTypes.h"
10
11 //---------------------------------------------------------------------------
12 // class TargetMachine
13 // 
14 // Purpose:
15 //   Machine description.
16 // 
17 //---------------------------------------------------------------------------
18
19
20 // function TargetMachine::findOptimalStorageSize 
21 // 
22 // Purpose:
23 //   This default implementation assumes that all sub-word data items use
24 //   space equal to optSizeForSubWordData, and all other primitive data
25 //   items use space according to the type.
26 //   
27 unsigned int
28 TargetMachine::findOptimalStorageSize(const Type* ty) const
29 {
30   switch(ty->getPrimitiveID())
31     {
32     case Type::BoolTyID:
33     case Type::UByteTyID:
34     case Type::SByteTyID:     
35     case Type::UShortTyID:
36     case Type::ShortTyID:     
37       return optSizeForSubWordData;
38     
39     default:
40       return DataLayout.getTypeSize(ty);
41     }
42 }
43
44
45 //---------------------------------------------------------------------------
46 // class MachineInstructionInfo
47 //      Interface to description of machine instructions
48 //---------------------------------------------------------------------------
49
50
51 /*ctor*/
52 MachineInstrInfo::MachineInstrInfo(const TargetMachine& tgt,
53                                    const MachineInstrDescriptor* _desc,
54                                    unsigned int _descSize,
55                                    unsigned int _numRealOpCodes)
56   : target(tgt),
57     desc(_desc), descSize(_descSize), numRealOpCodes(_numRealOpCodes)
58 {
59   // FIXME: TargetInstrDescriptors should not be global
60   assert(TargetInstrDescriptors == NULL && desc != NULL);
61   TargetInstrDescriptors = desc;        // initialize global variable
62 }  
63
64
65 MachineInstrInfo::~MachineInstrInfo()
66 {
67   TargetInstrDescriptors = NULL;        // reset global variable
68 }
69
70
71 bool
72 MachineInstrInfo::constantFitsInImmedField(MachineOpCode opCode,
73                                            int64_t intValue) const
74 {
75   // First, check if opCode has an immed field.
76   bool isSignExtended;
77   uint64_t maxImmedValue = maxImmedConstant(opCode, isSignExtended);
78   if (maxImmedValue != 0)
79     {
80       // Now check if the constant fits
81       if (intValue <= (int64_t) maxImmedValue &&
82           intValue >= -((int64_t) maxImmedValue+1))
83         return true;
84     }
85   
86   return false;
87 }