Bug fix: incorrect SAVE instruction when using register for stack size.
[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 MachineInstrInfo and MachineCacheInfo.
5 //
6 //===----------------------------------------------------------------------===//
7
8 #include "llvm/Target/TargetMachine.h"
9 #include "llvm/Target/MachineInstrInfo.h"
10 #include "llvm/Target/MachineCacheInfo.h"
11 #include "llvm/DerivedTypes.h"
12
13 //---------------------------------------------------------------------------
14 // class TargetMachine
15 // 
16 // Purpose:
17 //   Machine description.
18 // 
19 //---------------------------------------------------------------------------
20
21
22 // function TargetMachine::findOptimalStorageSize 
23 // 
24 // Purpose:
25 //   This default implementation assumes that all sub-word data items use
26 //   space equal to optSizeForSubWordData, and all other primitive data
27 //   items use space according to the type.
28 //   
29 unsigned int
30 TargetMachine::findOptimalStorageSize(const Type* ty) const
31 {
32   switch(ty->getPrimitiveID())
33     {
34     case Type::BoolTyID:
35     case Type::UByteTyID:
36     case Type::SByteTyID:     
37     case Type::UShortTyID:
38     case Type::ShortTyID:     
39       return optSizeForSubWordData;
40     
41     default:
42       return DataLayout.getTypeSize(ty);
43     }
44 }
45
46
47 //---------------------------------------------------------------------------
48 // class MachineInstructionInfo
49 //      Interface to description of machine instructions
50 //---------------------------------------------------------------------------
51
52
53 /*ctor*/
54 MachineInstrInfo::MachineInstrInfo(const TargetMachine& tgt,
55                                    const MachineInstrDescriptor* _desc,
56                                    unsigned int _descSize,
57                                    unsigned int _numRealOpCodes)
58   : target(tgt),
59     desc(_desc), descSize(_descSize), numRealOpCodes(_numRealOpCodes)
60 {
61   // FIXME: TargetInstrDescriptors should not be global
62   assert(TargetInstrDescriptors == NULL && desc != NULL);
63   TargetInstrDescriptors = desc;        // initialize global variable
64 }  
65
66
67 MachineInstrInfo::~MachineInstrInfo()
68 {
69   TargetInstrDescriptors = NULL;        // reset global variable
70 }
71
72
73 bool
74 MachineInstrInfo::constantFitsInImmedField(MachineOpCode opCode,
75                                            int64_t intValue) const
76 {
77   // First, check if opCode has an immed field.
78   bool isSignExtended;
79   uint64_t maxImmedValue = maxImmedConstant(opCode, isSignExtended);
80   if (maxImmedValue != 0)
81     {
82       // Now check if the constant fits
83       if (intValue <= (int64_t) maxImmedValue &&
84           intValue >= -((int64_t) maxImmedValue+1))
85         return true;
86     }
87   
88   return false;
89 }
90
91
92 //---------------------------------------------------------------------------
93 // class MachineCacheInfo 
94 // 
95 // Purpose:
96 //   Describes properties of the target cache architecture.
97 //---------------------------------------------------------------------------
98
99 /*ctor*/
100 MachineCacheInfo::MachineCacheInfo(const TargetMachine& tgt)
101   : target(tgt)
102 {
103   Initialize();
104 }
105
106 void
107 MachineCacheInfo::Initialize()
108 {
109   numLevels = 2;
110   cacheLineSizes.push_back(16);  cacheLineSizes.push_back(32); 
111   cacheSizes.push_back(1 << 15); cacheSizes.push_back(1 << 20);
112   cacheAssoc.push_back(1);       cacheAssoc.push_back(4);
113 }