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// CR - One of the 8 4-bit condition registers
89class CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> {
90  let HWEncoding{2-0} = num;
91  let SubRegs = subregs;
92}
93
94// CRBIT - One of the 32 1-bit condition register fields
95class CRBIT<bits<5> num, string n> : PPCReg<n> {
96  let HWEncoding{4-0} = num;
97}
98
99// General-purpose registers
100foreach Index = 0-31 in {
101  def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>;
102}
103
104// 64-bit General-purpose registers
105foreach Index = 0-31 in {
106  def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>,
107                    DwarfRegNum<[Index, -2]>;
108}
109
110// SPE registers
111foreach Index = 0-31 in {
112  def S#Index : SPE<!cast<GPR>("R"#Index), "r"#Index>,
113                    DwarfRegNum<[!add(Index, 1200), !add(Index, 1200)]>;
114}
115
116// Floating-point registers
117foreach Index = 0-31 in {
118  def F#Index : FPR<Index, "f"#Index>,
119                DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>;
120}
121
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.
125foreach Index = 0-31 in {
126  def VF#Index : VF<Index, "v" #Index>,
127                 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
128}
129
130// QPX Floating-point registers
131foreach Index = 0-31 in {
132  def QF#Index : QFPR<!cast<FPR>("F"#Index), "q"#Index>,
133                 DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>;
134}
135
136// Vector registers
137foreach Index = 0-31 in {
138  def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>,
139                DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
140}
141
142// VSX registers
143foreach Index = 0-31 in {
144  def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>,
145                  DwarfRegAlias<!cast<FPR>("F"#Index)>;
146}
147
148// Dummy VSX registers, this defines string: "vs32"-"vs63", and is only used for
149// asm printing.
150foreach Index = 32-63 in {
151  def VSX#Index : PPCReg<"vs"#Index>;
152}
153
154// The reprsentation of r0 when treated as the constant 0.
155def ZERO  : GPR<0, "0">,    DwarfRegAlias<R0>;
156def ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>;
157
158// Representations of the frame pointer used by ISD::FRAMEADDR.
159def FP   : GPR<0 /* arbitrary */, "**FRAME POINTER**">;
160def FP8  : GP8<FP, "**FRAME POINTER**">;
161
162// Representations of the base pointer used by setjmp.
163def BP   : GPR<0 /* arbitrary */, "**BASE POINTER**">;
164def BP8  : GP8<BP, "**BASE POINTER**">;
165
166// Condition register bits
167def CR0LT : CRBIT< 0, "0">;
168def CR0GT : CRBIT< 1, "1">;
169def CR0EQ : CRBIT< 2, "2">;
170def CR0UN : CRBIT< 3, "3">;
171def CR1LT : CRBIT< 4, "4">;
172def CR1GT : CRBIT< 5, "5">;
173def CR1EQ : CRBIT< 6, "6">;
174def CR1UN : CRBIT< 7, "7">;
175def CR2LT : CRBIT< 8, "8">;
176def CR2GT : CRBIT< 9, "9">;
177def CR2EQ : CRBIT<10, "10">;
178def CR2UN : CRBIT<11, "11">;
179def CR3LT : CRBIT<12, "12">;
180def CR3GT : CRBIT<13, "13">;
181def CR3EQ : CRBIT<14, "14">;
182def CR3UN : CRBIT<15, "15">;
183def CR4LT : CRBIT<16, "16">;
184def CR4GT : CRBIT<17, "17">;
185def CR4EQ : CRBIT<18, "18">;
186def CR4UN : CRBIT<19, "19">;
187def CR5LT : CRBIT<20, "20">;
188def CR5GT : CRBIT<21, "21">;
189def CR5EQ : CRBIT<22, "22">;
190def CR5UN : CRBIT<23, "23">;
191def CR6LT : CRBIT<24, "24">;
192def CR6GT : CRBIT<25, "25">;
193def CR6EQ : CRBIT<26, "26">;
194def CR6UN : CRBIT<27, "27">;
195def CR7LT : CRBIT<28, "28">;
196def CR7GT : CRBIT<29, "29">;
197def CR7EQ : CRBIT<30, "30">;
198def CR7UN : CRBIT<31, "31">;
199
200// Condition registers
201let SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in {
202def CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>;
203def CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>;
204def CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>;
205def CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>;
206def CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>;
207def CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>;
208def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>;
209def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>;
210}
211
212// Link register
213def LR  : SPR<8, "lr">, DwarfRegNum<[-2, 65]>;
214//let Aliases = [LR] in
215def LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>;
216
217// Count register
218def CTR  : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>;
219def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>;
220
221// VRsave register
222def VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>;
223
224// SPE extra registers
225// SPE Accumulator for multiply-accumulate SPE operations.  Never directly
226// accessed, so there's no real encoding for it.
227def SPEACC: DwarfRegNum<[99, 111]>;
228def SPEFSCR: SPR<512, "spefscr">, DwarfRegNum<[612, 112]>;
229
230def XER: SPR<1, "xer">, DwarfRegNum<[76]>;
231
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
234// compiler.
235def CARRY: SPR<1, "xer">, DwarfRegNum<[76]> {
236  let Aliases = [XER];
237}
238
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.
246def RM: PPCReg<"**ROUNDING MODE**">;
247
248/// Register classes
249// Allocate volatiles first
250// then nonvolatiles in reverse order since stmw/lmw save from rN to r31
251def 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();
260  }];
261}
262
263def 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();
272  }];
273}
274
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.
278def 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();
285  }];
286}
287
288def 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();
295  }];
296}
297
298def SPERC : RegisterClass<"PPC", [f64], 64, (add (sequence "S%u", 2, 12),
299                                                (sequence "S%u", 30, 13),
300                                                S31, S0, S1)>;
301
302def SPE4RC : RegisterClass<"PPC", [f32], 32, (add GPRC)>;
303
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.
311def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13),
312                                                (sequence "F%u", 31, 14))>;
313def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>;
314
315def VRRC : RegisterClass<"PPC",
316                         [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32,v2f64, f128],
317                         128,
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)>;
321
322// VSX register classes (the allocation order mirrors that of the corresponding
323// subregister classes).
324def VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
325                          (add (sequence "VSL%u", 0, 13),
326                               (sequence "VSL%u", 31, 14))>;
327def VSRC  : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
328                          (add VSLRC, VRRC)>;
329
330// Register classes for the 64-bit "scalar" VSX subregisters.
331def 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,
336                               VF22, VF21, VF20)>;
337def VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>;
338
339// Allow spilling GPR's into caller-saved VSR's.
340def SPILLTOVSRRC : RegisterClass<"PPC", [i64, f64], 64, (add G8RC, (sub VSFRC,
341				(sequence "VF%u", 31, 20),
342				(sequence "F%u", 31, 14)))>;
343
344// Register class for single precision scalars in VSX registers
345def VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>;
346
347// For QPX
348def QFRC : RegisterClass<"PPC", [v4f64], 256, (add (sequence "QF%u", 0, 13),
349                                                (sequence "QF%u", 31, 14))>;
350def QSRC : RegisterClass<"PPC", [v4f32], 128, (add QFRC)>;
351def 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.
354  let Size = 256;
355}
356
357def 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)> {
366  let Size = 32;
367}
368
369def CRRC : RegisterClass<"PPC", [i32], 32, (add CR0, CR1, CR5, CR6,
370                                                CR7, CR2, CR3, CR4)>;
371
372def CRRC0 : RegisterClass<"PPC", [i32], 32, (add CR0)>;
373
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.
377def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> {
378  let isAllocatable = 0;
379}
380def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> {
381  let isAllocatable = 0;
382}
383
384def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>;
385def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY, XER)> {
386  let CopyCost = -1;
387}
388
389