blob: 50cccb662146d1aaeeaadfd71496bf3dcbbd6b57 [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
Vikram S. Adved09c4c32003-07-06 20:13:59 +0000116// referred to as %xcc or %icc 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, three ids are
119// allocated for the three 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)
Vikram S. Adved09c4c32003-07-06 20:13:59 +0000124 : TargetRegClassInfo(ID, 1, 3) { }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000125
Vikram S. Adved09c4c32003-07-06 20:13:59 +0000126 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const;
127
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000128 // according to Sparc 64 ABI, %ccr is volatile
129 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000130 inline bool isRegVolatile(int Reg) const { return true; }
Chris Lattner56e91662002-08-12 21:25:05 +0000131
132 enum {
Vikram S. Adved09c4c32003-07-06 20:13:59 +0000133 xcc, icc, ccr // only one is available - see the note above
Chris Lattner56e91662002-08-12 21:25:05 +0000134 };
135
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000136 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000137};
138
139
140
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000141
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000142//-----------------------------------------------------------------------------
143// Float CC Register Class
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000144// Only 4 Float CC registers are available for allocation.
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000145//-----------------------------------------------------------------------------
146
Chris Lattnerf9781b52002-12-29 03:13:05 +0000147struct SparcFloatCCRegClass : public TargetRegClassInfo {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000148 SparcFloatCCRegClass(unsigned ID)
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000149 : TargetRegClassInfo(ID, 4, 5) { }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000150
Chris Lattnerabe98192002-05-23 15:50:03 +0000151 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
152 for(unsigned c = 0; c != 4; ++c)
153 if (!IsColorUsedArr[c]) { // find unused color
154 Node->setColor(c);
155 return;
156 }
157
158 Node->getParentLR()->markForSpill();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000159 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000160
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +0000161 // according to Sparc 64 ABI, all %fp CC regs are volatile
162 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000163 inline bool isRegVolatile(int Reg) const { return true; }
Chris Lattner56e91662002-08-12 21:25:05 +0000164
165 enum {
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000166 fcc0, fcc1, fcc2, fcc3, fsr // fsr is not used in allocation
167 }; // but has a name in getRegName()
168
169 const char * const getRegName(unsigned reg) const;
170};
171
172//-----------------------------------------------------------------------------
173// Sparc special register class. These registers are not used for allocation
174// but are used as arguments of some instructions.
175//-----------------------------------------------------------------------------
176
177struct SparcSpecialRegClass : public TargetRegClassInfo {
178 SparcSpecialRegClass(unsigned ID)
179 : TargetRegClassInfo(ID, 0, 1) { }
180
181 void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
182 assert(0 && "SparcSpecialRegClass should never be used for allocation");
183 }
184
185 // all currently included special regs are volatile
186 inline bool isRegVolatile(int Reg) const { return true; }
187
188 enum {
189 fsr // floating point state register
Chris Lattner56e91662002-08-12 21:25:05 +0000190 };
191
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000192 const char * const getRegName(unsigned reg) const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000193};
194
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000195#endif