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