blob: bc9b445d5d02d652a5b4cfe7055a6849e4ae1997 [file] [log] [blame]
Chris Lattner56e91662002-08-12 21:25:05 +00001//===-- SparcRegClassInfo.h - Register class def'ns for Sparc ----*- C++ -*--=//
2//
3// This file defines the register classes used by the Sparc target description.
4//
5//===----------------------------------------------------------------------===//
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00006
Chris Lattner56e91662002-08-12 21:25:05 +00007#ifndef SPARC_REG_CLASS_INFO_H
8#define SPARC_REG_CLASS_INFO_H
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00009
Chris Lattnerf9781b52002-12-29 03:13:05 +000010#include "llvm/Target/TargetRegInfo.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000011#include "llvm/CodeGen/IGNode.h"
12
13//-----------------------------------------------------------------------------
14// Integer Register Class
15//-----------------------------------------------------------------------------
16
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000017
Chris Lattnerf9781b52002-12-29 03:13:05 +000018struct SparcIntRegClass : public TargetRegClassInfo {
Chris Lattner56e91662002-08-12 21:25:05 +000019 SparcIntRegClass(unsigned ID)
Chris Lattnerf9781b52002-12-29 03:13:05 +000020 : TargetRegClassInfo(ID, NumOfAvailRegs, NumOfAllRegs) { }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000021
Chris Lattner56e91662002-08-12 21:25:05 +000022 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000023
Chris Lattner56e91662002-08-12 21:25:05 +000024 inline bool isRegVolatile(int Reg) const {
25 return (Reg < (int)StartOfNonVolatileRegs);
26 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000027
Chris Lattner56e91662002-08-12 21:25:05 +000028 enum { // colors possible for a LR (in preferred order)
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000029 // --- following colors are volatile across function calls
30 // %g0 can't be used for coloring - always 0
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000031 o0, o1, o2, o3, o4, o5, o7, // %o0-%o5,
32
33 // %o6 is sp,
34 // all %0's can get modified by a call
35
36 // --- following colors are NON-volatile across function calls
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000037 l0, l1, l2, l3, l4, l5, l6, l7, // %l0-%l7
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +000038 i0, i1, i2, i3, i4, i5, // %i0-%i5: i's need not be preserved
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000039
40 // %i6 is the fp - so not allocated
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +000041 // %i7 is the ret address by convention - can be used for others
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000042
43 // max # of colors reg coloring can allocate (NumOfAvailRegs)
44
45 // --- following colors are not available for allocation within this phase
46 // --- but can appear for pre-colored ranges
47
Chris Lattner56e91662002-08-12 21:25:05 +000048 i6, i7, g0, g1, g2, g3, g4, g5, g6, g7, o6,
49
50 NumOfAllRegs, // Must be first AFTER registers...
Vikram S. Adve5462dca2001-10-22 13:43:08 +000051
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +000052 //*** NOTE: If we decide to use some %g regs, they are volatile
53 // (see sparc64ABI)
54 // Move the %g regs from the end of the enumeration to just above the
55 // enumeration of %o0 (change StartOfAllRegs below)
56 // change isRegVloatile method below
57 // Also change IntRegNames above.
Chris Lattner56e91662002-08-12 21:25:05 +000058
59 // max # of colors reg coloring can allocate
60 NumOfAvailRegs = i6,
61
62 StartOfNonVolatileRegs = l0,
63 StartOfAllRegs = o0,
Chris Lattner5216cc52002-02-04 05:59:25 +000064 };
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000065
Vikram S. Adve8adb9942003-05-27 00:02:22 +000066 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000067};
68
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +000069
70
71
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000072//-----------------------------------------------------------------------------
73// Float Register Class
74//-----------------------------------------------------------------------------
75
Chris Lattnerf9781b52002-12-29 03:13:05 +000076class SparcFloatRegClass : public TargetRegClassInfo {
Chris Lattner56e91662002-08-12 21:25:05 +000077 int findFloatColor(const LiveRange *LR, unsigned Start,
78 unsigned End, std::vector<bool> &IsColorUsedArr) const;
79public:
80 SparcFloatRegClass(unsigned ID)
Chris Lattnerf9781b52002-12-29 03:13:05 +000081 : TargetRegClassInfo(ID, NumOfAvailRegs, NumOfAllRegs) {}
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000082
Chris Lattner56e91662002-08-12 21:25:05 +000083 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000084
Chris Lattner56e91662002-08-12 21:25:05 +000085 // according to Sparc 64 ABI, all %fp regs are volatile
86 inline bool isRegVolatile(int Reg) const { return true; }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000087
Chris Lattner56e91662002-08-12 21:25:05 +000088 enum {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000089 f0, f1, f2, f3, f4, f5, f6, f7, f8, f9,
90 f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
91 f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
92 f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
93 f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
94 f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
Chris Lattner56e91662002-08-12 21:25:05 +000095 f60, f61, f62, f63,
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000096
Chris Lattner56e91662002-08-12 21:25:05 +000097 // there are 64 regs alltogether but only 32 regs can be allocated at
98 // a time.
99 //
100 NumOfAvailRegs = 32,
101 NumOfAllRegs = 64,
102
103 StartOfNonVolatileRegs = f32,
104 StartOfAllRegs = f0,
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000105 };
106
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000107 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000108};
109
110
111
112
113//-----------------------------------------------------------------------------
114// Int CC Register Class
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000115// Only one integer cc register is available. However, this register is
116// referred to as %xcc when instructions like subcc are executed but
117// referred to as %ccr (i.e., %xcc + %icc") when this register is moved
118// into an integer register using RD or WR instrcutions. So, two ids are
119// allocated for two names.
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000120//-----------------------------------------------------------------------------
121
Chris Lattnerf9781b52002-12-29 03:13:05 +0000122struct SparcIntCCRegClass : public TargetRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000123 SparcIntCCRegClass(unsigned ID)
Chris Lattnerf9781b52002-12-29 03:13:05 +0000124 : TargetRegClassInfo(ID, 1, 2) { }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000125
Chris Lattnerabe98192002-05-23 15:50:03 +0000126 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000127 if (IsColorUsedArr[0])
128 Node->getParentLR()->markForSpill();
129 else
130 Node->setColor(0); // only one int cc reg is available
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000131 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000132
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000133 // according to Sparc 64 ABI, %ccr is volatile
134 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000135 inline bool isRegVolatile(int Reg) const { return true; }
Chris Lattner56e91662002-08-12 21:25:05 +0000136
137 enum {
138 xcc, ccr // only one is available - see the note above
139 };
140
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000141 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000142};
143
144
145
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000146
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000147//-----------------------------------------------------------------------------
148// Float CC Register Class
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000149// Only 4 Float CC registers are available for allocation.
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000150//-----------------------------------------------------------------------------
151
Chris Lattnerf9781b52002-12-29 03:13:05 +0000152struct SparcFloatCCRegClass : public TargetRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000153 SparcFloatCCRegClass(unsigned ID)
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000154 : TargetRegClassInfo(ID, 4, 5) { }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000155
Chris Lattnerabe98192002-05-23 15:50:03 +0000156 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
157 for(unsigned c = 0; c != 4; ++c)
158 if (!IsColorUsedArr[c]) { // find unused color
159 Node->setColor(c);
160 return;
161 }
162
163 Node->getParentLR()->markForSpill();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000164 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000165
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000166 // according to Sparc 64 ABI, all %fp CC regs are volatile
167 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000168 inline bool isRegVolatile(int Reg) const { return true; }
Chris Lattner56e91662002-08-12 21:25:05 +0000169
170 enum {
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000171 fcc0, fcc1, fcc2, fcc3, fsr // fsr is not used in allocation
172 }; // but has a name in getRegName()
173
174 const char * const getRegName(unsigned reg) const;
175};
176
177//-----------------------------------------------------------------------------
178// Sparc special register class. These registers are not used for allocation
179// but are used as arguments of some instructions.
180//-----------------------------------------------------------------------------
181
182struct SparcSpecialRegClass : public TargetRegClassInfo {
183 SparcSpecialRegClass(unsigned ID)
184 : TargetRegClassInfo(ID, 0, 1) { }
185
186 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
187 assert(0 && "SparcSpecialRegClass should never be used for allocation");
188 }
189
190 // all currently included special regs are volatile
191 inline bool isRegVolatile(int Reg) const { return true; }
192
193 enum {
194 fsr // floating point state register
Chris Lattner56e91662002-08-12 21:25:05 +0000195 };
196
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000197 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000198};
199
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000200#endif