Added virtual function to generate an instruction sequence to
[oota-llvm.git] / include / llvm / CodeGen / MachineRegInfo.h
1 /* Title:   MachineRegInfo.h
2    Author:  Ruchira Sasanka
3    Date:    Aug 20, 01
4    Purpose: Contains the description of machine register classes.
5
6    Notes:
7
8    A machine will have several register classes. For each register class, the
9    machine has to provide a class which is derived class of the virtual class
10    MachineRegClass. This virtual class itself is machine independent but 
11    the derived classes are all machine dependent.
12 */
13
14
15 #ifndef MACHINE_REG_INFO_H
16 #define MACHINE_REG_INFO_H
17
18 #include "llvm/CodeGen/MachineInstr.h"
19
20
21
22 // This is the virtual class which must be subclassed by all machine specific
23 // register classes.
24
25   unsigned RegClassID;        // integer ID of a reg class
26   unsigned NumOfAvailRegs;    // # of avail for coloring (without SP, g0 etc)
27   unsigned NumOfAllRegs;      // # of all registers (including SP, g0 etc
28
29
30 class MachineRegClass 
31 {
32
33  private:
34   const unsigned RegClassID;
35
36  public:
37
38   virtual unsigned getRegClassID() const = 0;
39
40   // Number of registes available for coloring (e.g., without SP, g0 etc)
41   virtual unsigned getNumOfAvailRegs() const = 0;
42
43   // Number of all registers (e.g., including SP, g0 etc)
44   virtual unsigned getNumOfAllRegs() const = 0;
45
46   // This method should find a color which is not used by neighbors
47   // (i.e., a false position in IsColorUsedArr) and 
48   virtual void colorIGNode(IGNode * Node, bool IsColorUsedArr[] ) const = 0;
49
50
51   MachineRegClass(const unsigned ID) : RegClassID(ID) { }
52
53
54 };
55
56
57 // include .h files that describes machine reg classes here
58
59 #include "RegAlloc/Sparc/SparcIntRegClass.h"
60
61 typedef vector<const MachineRegClass *> MachineRegClassArrayType;
62
63
64
65 class MachineRegInfo
66 {
67  private:
68
69   // A vector of all machine register classes
70   MachineRegClassArrayType MachineRegClassArr;
71
72
73  public:
74
75   MachineRegInfo() : MachineRegClassArr() { 
76
77     MachineRegClassArr.push_back( new SparcIntRegClass(0) );
78     // RegClassArr.pushback( new SparcFloatRegClass(1) );
79     // RegClassArr.pushback( new SparcFloatCCRegClass(2) );
80
81     if(DEBUG_RA)
82       cout << "Created machine register classes." << endl;
83
84   }
85
86
87   inline unsigned int getNumOfRegClasses() const { 
88     return MachineRegClassArr.size(); 
89   }  
90
91   unsigned getRegClassIDOfValue (const Value *const Val) const ;
92
93   const MachineRegClass *const getMachineRegClass(unsigned i) const { 
94     return MachineRegClassArr[i]; 
95   }
96
97   inline bool isCallInst(const MachineInstr *const MI) const {
98     MachineOpCode Op = MI->getOpCode();
99     return false; // ########################################
100     // return (Op == CALL || Op == JMPL);
101   }
102
103 };
104
105
106 // This function should detrmine the register class of a value. This can be 
107 // done on type information in the value class. The register class returned 
108 // must be same as  the array index of RegClassArr.
109
110 unsigned MachineRegInfo::getRegClassIDOfValue (const Value *const Val) const
111 {
112   
113   return 0;
114   
115 }
116
117
118
119
120 #endif
121