1 //===-- PPCRegisterInfo.td - The PowerPC Register File -----*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
13 let Namespace = "PPC" in {
14 def sub_lt : SubRegIndex<1>;
15 def sub_gt : SubRegIndex<1, 1>;
16 def sub_eq : SubRegIndex<1, 2>;
17 def sub_un : SubRegIndex<1, 3>;
18 def sub_32 : SubRegIndex<32>;
19 def sub_64 : SubRegIndex<64>;
23 class PPCReg<string n> : Register<n> {
24 let Namespace = "PPC";
27 // We identify all our registers with a 5-bit ID, for consistency's sake.
29 // GPR - One of the 32 32-bit general-purpose registers
30 class GPR<bits<5> num, string n> : PPCReg<n> {
31 let HWEncoding{4-0} = num;
34 // GP8 - One of the 32 64-bit general-purpose registers
35 class GP8<GPR SubReg, string n> : PPCReg<n> {
36 let HWEncoding = SubReg.HWEncoding;
37 let SubRegs = [SubReg];
38 let SubRegIndices = [sub_32];
41 // SPE - One of the 32 64-bit general-purpose registers (SPE)
42 class SPE<GPR SubReg, string n> : PPCReg<n> {
43 let HWEncoding = SubReg.HWEncoding;
44 let SubRegs = [SubReg];
45 let SubRegIndices = [sub_32];
48 // SPR - One of the 32-bit special-purpose registers
49 class SPR<bits<10> num, string n> : PPCReg<n> {
50 let HWEncoding{9-0} = num;
53 // FPR - One of the 32 64-bit floating-point registers
54 class FPR<bits<5> num, string n> : PPCReg<n> {
55 let HWEncoding{4-0} = num;
58 // QFPR - One of the 32 256-bit floating-point vector registers (used for QPX)
59 class QFPR<FPR SubReg, string n> : PPCReg<n> {
60 let HWEncoding = SubReg.HWEncoding;
61 let SubRegs = [SubReg];
62 let SubRegIndices = [sub_64];
65 // VF - One of the 32 64-bit floating-point subregisters of the vector
66 // registers (used by VSX).
67 class VF<bits<5> num, string n> : PPCReg<n> {
68 let HWEncoding{4-0} = num;
69 let HWEncoding{5} = 1;
72 // VR - One of the 32 128-bit vector registers
73 class VR<VF SubReg, string n> : PPCReg<n> {
74 let HWEncoding{4-0} = SubReg.HWEncoding{4-0};
75 let HWEncoding{5} = 0;
76 let SubRegs = [SubReg];
77 let SubRegIndices = [sub_64];
80 // VSRL - One of the 32 128-bit VSX registers that overlap with the scalar
81 // floating-point registers.
82 class VSRL<FPR SubReg, string n> : PPCReg<n> {
83 let HWEncoding = SubReg.HWEncoding;
84 let SubRegs = [SubReg];
85 let SubRegIndices = [sub_64];
88 // CR - One of the 8 4-bit condition registers
89 class CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> {
90 let HWEncoding{2-0} = num;
91 let SubRegs = subregs;
94 // CRBIT - One of the 32 1-bit condition register fields
95 class CRBIT<bits<5> num, string n> : PPCReg<n> {
96 let HWEncoding{4-0} = num;
99 // General-purpose registers
100 foreach Index = 0-31 in {
101 def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>;
104 // 64-bit General-purpose registers
105 foreach Index = 0-31 in {
106 def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>,
107 DwarfRegNum<[Index, -2]>;
111 foreach Index = 0-31 in {
112 def S#Index : SPE<!cast<GPR>("R"#Index), "r"#Index>,
113 DwarfRegNum<[!add(Index, 1200), !add(Index, 1200)]>;
116 // Floating-point registers
117 foreach Index = 0-31 in {
118 def F#Index : FPR<Index, "f"#Index>,
119 DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>;
122 // 64-bit Floating-point subregisters of Altivec registers
123 // Note: the register names are v0-v31 or vs32-vs63 depending on the use.
124 // Custom C++ code is used to produce the correct name and encoding.
125 foreach Index = 0-31 in {
126 def VF#Index : VF<Index, "v" #Index>,
127 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
130 // QPX Floating-point registers
131 foreach Index = 0-31 in {
132 def QF#Index : QFPR<!cast<FPR>("F"#Index), "q"#Index>,
133 DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>;
137 foreach Index = 0-31 in {
138 def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>,
139 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
143 foreach Index = 0-31 in {
144 def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>,
145 DwarfRegAlias<!cast<FPR>("F"#Index)>;
148 // Dummy VSX registers, this defines string: "vs32"-"vs63", and is only used for
150 foreach Index = 32-63 in {
151 def VSX#Index : PPCReg<"vs"#Index>;
154 // The reprsentation of r0 when treated as the constant 0.
155 def ZERO : GPR<0, "0">, DwarfRegAlias<R0>;
156 def ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>;
158 // Representations of the frame pointer used by ISD::FRAMEADDR.
159 def FP : GPR<0 /* arbitrary */, "**FRAME POINTER**">;
160 def FP8 : GP8<FP, "**FRAME POINTER**">;
162 // Representations of the base pointer used by setjmp.
163 def BP : GPR<0 /* arbitrary */, "**BASE POINTER**">;
164 def BP8 : GP8<BP, "**BASE POINTER**">;
166 // Condition register bits
167 def CR0LT : CRBIT< 0, "0">;
168 def CR0GT : CRBIT< 1, "1">;
169 def CR0EQ : CRBIT< 2, "2">;
170 def CR0UN : CRBIT< 3, "3">;
171 def CR1LT : CRBIT< 4, "4">;
172 def CR1GT : CRBIT< 5, "5">;
173 def CR1EQ : CRBIT< 6, "6">;
174 def CR1UN : CRBIT< 7, "7">;
175 def CR2LT : CRBIT< 8, "8">;
176 def CR2GT : CRBIT< 9, "9">;
177 def CR2EQ : CRBIT<10, "10">;
178 def CR2UN : CRBIT<11, "11">;
179 def CR3LT : CRBIT<12, "12">;
180 def CR3GT : CRBIT<13, "13">;
181 def CR3EQ : CRBIT<14, "14">;
182 def CR3UN : CRBIT<15, "15">;
183 def CR4LT : CRBIT<16, "16">;
184 def CR4GT : CRBIT<17, "17">;
185 def CR4EQ : CRBIT<18, "18">;
186 def CR4UN : CRBIT<19, "19">;
187 def CR5LT : CRBIT<20, "20">;
188 def CR5GT : CRBIT<21, "21">;
189 def CR5EQ : CRBIT<22, "22">;
190 def CR5UN : CRBIT<23, "23">;
191 def CR6LT : CRBIT<24, "24">;
192 def CR6GT : CRBIT<25, "25">;
193 def CR6EQ : CRBIT<26, "26">;
194 def CR6UN : CRBIT<27, "27">;
195 def CR7LT : CRBIT<28, "28">;
196 def CR7GT : CRBIT<29, "29">;
197 def CR7EQ : CRBIT<30, "30">;
198 def CR7UN : CRBIT<31, "31">;
200 // Condition registers
201 let SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in {
202 def CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>;
203 def CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>;
204 def CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>;
205 def CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>;
206 def CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>;
207 def CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>;
208 def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>;
209 def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>;
213 def LR : SPR<8, "lr">, DwarfRegNum<[-2, 65]>;
214 //let Aliases = [LR] in
215 def LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>;
218 def CTR : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>;
219 def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>;
222 def VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>;
224 // SPE extra registers
225 // SPE Accumulator for multiply-accumulate SPE operations. Never directly
226 // accessed, so there's no real encoding for it.
227 def SPEACC: DwarfRegNum<[99, 111]>;
228 def SPEFSCR: SPR<512, "spefscr">, DwarfRegNum<[612, 112]>;
230 def XER: SPR<1, "xer">, DwarfRegNum<[76]>;
232 // Carry bit. In the architecture this is really bit 0 of the XER register
233 // (which really is SPR register 1); this is the only bit interesting to a
235 def CARRY: SPR<1, "xer">, DwarfRegNum<[76]> {
239 // FP rounding mode: bits 30 and 31 of the FP status and control register
240 // This is not allocated as a normal register; it appears only in
241 // Uses and Defs. The ABI says it needs to be preserved by a function,
242 // but this is not achieved by saving and restoring it as with
243 // most registers, it has to be done in code; to make this work all the
244 // return and call instructions are described as Uses of RM, so instructions
245 // that do nothing but change RM will not get deleted.
246 def RM: PPCReg<"**ROUNDING MODE**">;
249 // Allocate volatiles first
250 // then nonvolatiles in reverse order since stmw/lmw save from rN to r31
251 def GPRC : RegisterClass<"PPC", [i32], 32, (add (sequence "R%u", 2, 12),
252 (sequence "R%u", 30, 13),
253 R31, R0, R1, FP, BP)> {
254 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
255 // put it at the end of the list.
256 let AltOrders = [(add (sub GPRC, R2), R2)];
257 let AltOrderSelect = [{
258 const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>();
259 return S.isPPC64() && S.isSVR4ABI();
263 def G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12),
264 (sequence "X%u", 30, 14),
265 X31, X13, X0, X1, FP8, BP8)> {
266 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
267 // put it at the end of the list.
268 let AltOrders = [(add (sub G8RC, X2), X2)];
269 let AltOrderSelect = [{
270 const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>();
271 return S.isPPC64() && S.isSVR4ABI();
275 // For some instructions r0 is special (representing the value 0 instead of
276 // the value in the r0 register), and we use these register subclasses to
277 // prevent r0 from being allocated for use by those instructions.
278 def GPRC_NOR0 : RegisterClass<"PPC", [i32], 32, (add (sub GPRC, R0), ZERO)> {
279 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
280 // put it at the end of the list.
281 let AltOrders = [(add (sub GPRC_NOR0, R2), R2)];
282 let AltOrderSelect = [{
283 const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>();
284 return S.isPPC64() && S.isSVR4ABI();
288 def G8RC_NOX0 : RegisterClass<"PPC", [i64], 64, (add (sub G8RC, X0), ZERO8)> {
289 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
290 // put it at the end of the list.
291 let AltOrders = [(add (sub G8RC_NOX0, X2), X2)];
292 let AltOrderSelect = [{
293 const PPCSubtarget &S = MF.getSubtarget<PPCSubtarget>();
294 return S.isPPC64() && S.isSVR4ABI();
298 def SPERC : RegisterClass<"PPC", [f64], 64, (add (sequence "S%u", 2, 12),
299 (sequence "S%u", 30, 13),
302 def SPE4RC : RegisterClass<"PPC", [f32], 32, (add GPRC)>;
304 // Allocate volatiles first, then non-volatiles in reverse order. With the SVR4
305 // ABI the size of the Floating-point register save area is determined by the
306 // allocated non-volatile register with the lowest register number, as FP
307 // register N is spilled to offset 8 * (32 - N) below the back chain word of the
308 // previous stack frame. By allocating non-volatiles in reverse order we make
309 // sure that the Floating-point register save area is always as small as
310 // possible because there aren't any unused spill slots.
311 def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13),
312 (sequence "F%u", 31, 14))>;
313 def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>;
315 def VRRC : RegisterClass<"PPC",
316 [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32,v2f64, f128],
318 (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11,
319 V12, V13, V14, V15, V16, V17, V18, V19, V31, V30,
320 V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>;
322 // VSX register classes (the allocation order mirrors that of the corresponding
323 // subregister classes).
324 def VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
325 (add (sequence "VSL%u", 0, 13),
326 (sequence "VSL%u", 31, 14))>;
327 def VSRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
330 // Register classes for the 64-bit "scalar" VSX subregisters.
331 def VFRC : RegisterClass<"PPC", [f64], 64,
332 (add VF2, VF3, VF4, VF5, VF0, VF1, VF6, VF7,
333 VF8, VF9, VF10, VF11, VF12, VF13, VF14,
334 VF15, VF16, VF17, VF18, VF19, VF31, VF30,
335 VF29, VF28, VF27, VF26, VF25, VF24, VF23,
337 def VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>;
339 // Allow spilling GPR's into caller-saved VSR's.
340 def SPILLTOVSRRC : RegisterClass<"PPC", [i64, f64], 64, (add G8RC, (sub VSFRC,
341 (sequence "VF%u", 31, 20),
342 (sequence "F%u", 31, 14)))>;
344 // Register class for single precision scalars in VSX registers
345 def VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>;
348 def QFRC : RegisterClass<"PPC", [v4f64], 256, (add (sequence "QF%u", 0, 13),
349 (sequence "QF%u", 31, 14))>;
350 def QSRC : RegisterClass<"PPC", [v4f32], 128, (add QFRC)>;
351 def QBRC : RegisterClass<"PPC", [v4i1], 256, (add QFRC)> {
352 // These are actually stored as floating-point values where a positive
353 // number is true and anything else (including NaN) is false.
357 def CRBITRC : RegisterClass<"PPC", [i1], 32,
358 (add CR2LT, CR2GT, CR2EQ, CR2UN,
359 CR3LT, CR3GT, CR3EQ, CR3UN,
360 CR4LT, CR4GT, CR4EQ, CR4UN,
361 CR5LT, CR5GT, CR5EQ, CR5UN,
362 CR6LT, CR6GT, CR6EQ, CR6UN,
363 CR7LT, CR7GT, CR7EQ, CR7UN,
364 CR1LT, CR1GT, CR1EQ, CR1UN,
365 CR0LT, CR0GT, CR0EQ, CR0UN)> {
369 def CRRC : RegisterClass<"PPC", [i32], 32, (add CR0, CR1, CR5, CR6,
370 CR7, CR2, CR3, CR4)>;
372 def CRRC0 : RegisterClass<"PPC", [i32], 32, (add CR0)>;
374 // The CTR registers are not allocatable because they're used by the
375 // decrement-and-branch instructions, and thus need to stay live across
376 // multiple basic blocks.
377 def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> {
378 let isAllocatable = 0;
380 def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> {
381 let isAllocatable = 0;
384 def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>;
385 def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY, XER)> {