blob: ab5b35c8010e0c92cfbd724621092225834ab897 [file] [log] [blame]
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001/* Title: SparcRegClassInfo.h -*- C++ -*-
2 Author: Ruchira Sasanka
3 Date: Aug 20, 01
4 Purpose: Contains the description of integer register class of Sparc
5*/
6
7
8#ifndef SPARC_REG_INFO_CLASS_H
9#define SPARC_REG_INFO_CLASS_H
10
11#include "llvm/Target/MachineRegInfo.h"
12#include "llvm/CodeGen/IGNode.h"
13
14//-----------------------------------------------------------------------------
15// Integer Register Class
16//-----------------------------------------------------------------------------
17
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000018// Int register names in same order as enum in class SparcIntRegOrder
19
Chris Lattner5216cc52002-02-04 05:59:25 +000020static const std::string IntRegNames[] = {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000021 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
22 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +000023 "i0", "i1", "i2", "i3", "i4", "i5",
Vikram S. Adve5462dca2001-10-22 13:43:08 +000024 "i6", "i7",
Ruchira Sasanka990d8fb2001-10-09 23:36:13 +000025 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
Chris Lattner5216cc52002-02-04 05:59:25 +000026 "o6"
27};
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000028
29
30
Chris Lattner5216cc52002-02-04 05:59:25 +000031struct SparcIntRegOrder {
32 enum RegsInPrefOrder { // colors possible for a LR (in preferred order)
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000033 // --- following colors are volatile across function calls
34 // %g0 can't be used for coloring - always 0
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000035 o0, o1, o2, o3, o4, o5, o7, // %o0-%o5,
36
37 // %o6 is sp,
38 // all %0's can get modified by a call
39
40 // --- following colors are NON-volatile across function calls
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000041 l0, l1, l2, l3, l4, l5, l6, l7, // %l0-%l7
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +000042 i0, i1, i2, i3, i4, i5, // %i0-%i5: i's need not be preserved
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000043
44 // %i6 is the fp - so not allocated
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +000045 // %i7 is the ret address by convention - can be used for others
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000046
47 // max # of colors reg coloring can allocate (NumOfAvailRegs)
48
49 // --- following colors are not available for allocation within this phase
50 // --- but can appear for pre-colored ranges
51
Vikram S. Adve5462dca2001-10-22 13:43:08 +000052 i6, i7, g0, g1, g2, g3, g4, g5, g6, g7, o6
53
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +000054 //*** NOTE: If we decide to use some %g regs, they are volatile
55 // (see sparc64ABI)
56 // Move the %g regs from the end of the enumeration to just above the
57 // enumeration of %o0 (change StartOfAllRegs below)
58 // change isRegVloatile method below
59 // Also change IntRegNames above.
Chris Lattner5216cc52002-02-04 05:59:25 +000060 };
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000061
62 // max # of colors reg coloring can allocate
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +000063 static unsigned int const NumOfAvailRegs = i6;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000064
65 static unsigned int const StartOfNonVolatileRegs = l0;
Ruchira Sasanka990d8fb2001-10-09 23:36:13 +000066 static unsigned int const StartOfAllRegs = o0;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000067 static unsigned int const NumOfAllRegs = o6 + 1;
68
69
Chris Lattner5216cc52002-02-04 05:59:25 +000070 static const std::string getRegName(unsigned reg) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000071 assert( reg < NumOfAllRegs );
72 return IntRegNames[reg];
73 }
74
75};
76
77
78
Chris Lattner5216cc52002-02-04 05:59:25 +000079struct SparcIntRegClass : public MachineRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000080 SparcIntRegClass(unsigned ID)
81 : MachineRegClassInfo(ID,
82 SparcIntRegOrder::NumOfAvailRegs,
Chris Lattner5216cc52002-02-04 05:59:25 +000083 SparcIntRegOrder::NumOfAllRegs) { }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000084
Chris Lattner5216cc52002-02-04 05:59:25 +000085 void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000086
Chris Lattner5216cc52002-02-04 05:59:25 +000087 inline bool isRegVolatile(int Reg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +000088 return (Reg < (int) SparcIntRegOrder::StartOfNonVolatileRegs);
89 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000090};
91
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +000092
93
94
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000095//-----------------------------------------------------------------------------
96// Float Register Class
97//-----------------------------------------------------------------------------
98
Chris Lattner7f74a562002-01-20 22:54:45 +000099static const std::string FloatRegNames[] =
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000100 {
101 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
102 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
103 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
104 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
105 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
106 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
107 "f60", "f61", "f62", "f63"
108 };
109
110
111class SparcFloatRegOrder{
112
113 public:
114
115 enum RegsInPrefOrder {
116
117 f0, f1, f2, f3, f4, f5, f6, f7, f8, f9,
118 f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
119 f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
120 f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
121 f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
122 f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
123 f60, f61, f62, f63
124
125 };
126
127 // there are 64 regs alltogether but only 32 regs can be allocated at
128 // a time.
129
130 static unsigned int const NumOfAvailRegs = 32;
131 static unsigned int const NumOfAllRegs = 64;
132
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000133 static unsigned int const StartOfNonVolatileRegs = f32;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000134 static unsigned int const StartOfAllRegs = f0;
135
136
Chris Lattner5216cc52002-02-04 05:59:25 +0000137 static const std::string getRegName(unsigned reg) {
138 assert (reg < NumOfAllRegs);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000139 return FloatRegNames[reg];
140 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000141};
142
143
144
Chris Lattner5216cc52002-02-04 05:59:25 +0000145class SparcFloatRegClass : public MachineRegClassInfo {
146 int findFloatColor(const LiveRange *LR, unsigned Start,
147 unsigned End, bool IsColorUsedArr[]) const;
148public:
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000149 SparcFloatRegClass(unsigned ID)
150 : MachineRegClassInfo(ID,
151 SparcFloatRegOrder::NumOfAvailRegs,
Chris Lattner5216cc52002-02-04 05:59:25 +0000152 SparcFloatRegOrder::NumOfAllRegs) {}
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000153
Chris Lattner5216cc52002-02-04 05:59:25 +0000154 void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000155
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000156 // according to Sparc 64 ABI, all %fp regs are volatile
Chris Lattner5216cc52002-02-04 05:59:25 +0000157 inline bool isRegVolatile(int Reg) const { return true; }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000158};
159
160
161
162
163//-----------------------------------------------------------------------------
164// Int CC Register Class
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000165// Only one integer cc register is available. However, this register is
166// referred to as %xcc when instructions like subcc are executed but
167// referred to as %ccr (i.e., %xcc + %icc") when this register is moved
168// into an integer register using RD or WR instrcutions. So, two ids are
169// allocated for two names.
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000170//-----------------------------------------------------------------------------
171
172
Chris Lattner5216cc52002-02-04 05:59:25 +0000173static const std::string IntCCRegNames[] = {
174 "xcc", "ccr"
175};
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000176
177
Chris Lattner5216cc52002-02-04 05:59:25 +0000178struct SparcIntCCRegOrder {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000179 enum RegsInPrefOrder {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000180 xcc, ccr // only one is available - see the note above
181 };
182
Chris Lattner5216cc52002-02-04 05:59:25 +0000183 static const std::string getRegName(unsigned reg) {
184 assert(reg < 2);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000185 return IntCCRegNames[reg];
186 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000187};
188
189
190
Chris Lattner5216cc52002-02-04 05:59:25 +0000191struct SparcIntCCRegClass : public MachineRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000192 SparcIntCCRegClass(unsigned ID)
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000193 : MachineRegClassInfo(ID, 1, 2) { }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000194
Chris Lattner5216cc52002-02-04 05:59:25 +0000195 inline void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000196 if (IsColorUsedArr[0])
197 Node->getParentLR()->markForSpill();
198 else
199 Node->setColor(0); // only one int cc reg is available
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000200 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000201
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000202 // according to Sparc 64 ABI, %ccr is volatile
203 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000204 inline bool isRegVolatile(int Reg) const { return true; }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000205};
206
207
208
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000209
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000210//-----------------------------------------------------------------------------
211// Float CC Register Class
212// Only 4 Float CC registers are available
213//-----------------------------------------------------------------------------
214
Chris Lattner5216cc52002-02-04 05:59:25 +0000215static const std::string FloatCCRegNames[] = {
216 "fcc0", "fcc1", "fcc2", "fcc3"
217};
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000218
Chris Lattner5216cc52002-02-04 05:59:25 +0000219struct SparcFloatCCRegOrder{
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000220 enum RegsInPrefOrder {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000221 fcc0, fcc1, fcc2, fcc3
222 };
223
Chris Lattner5216cc52002-02-04 05:59:25 +0000224 static const std::string getRegName(unsigned reg) {
225 assert (reg < 4);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000226 return FloatCCRegNames[reg];
227 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000228};
229
Chris Lattner5216cc52002-02-04 05:59:25 +0000230struct SparcFloatCCRegClass : public MachineRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000231 SparcFloatCCRegClass(unsigned ID)
232 : MachineRegClassInfo(ID, 4, 4) { }
233
Chris Lattner5216cc52002-02-04 05:59:25 +0000234 void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000235 int c;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000236 for(c=0; c < 4 && IsColorUsedArr[c] ; ++c) ; // find unused color
237 if (c < 4)
238 Node->setColor(c);
239 else
240 Node->getParentLR()->markForSpill();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000241 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000242
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000243 // according to Sparc 64 ABI, all %fp CC regs are volatile
244 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000245 inline bool isRegVolatile(int Reg) const { return true; }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000246};
247
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000248#endif