• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//===-- PPCRegisterInfo.td - The PowerPC Register File -----*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9//
10//===----------------------------------------------------------------------===//
11
12let Namespace = "PPC" in {
13def sub_lt : SubRegIndex<1>;
14def sub_gt : SubRegIndex<1, 1>;
15def sub_eq : SubRegIndex<1, 2>;
16def sub_un : SubRegIndex<1, 3>;
17def sub_32 : SubRegIndex<32>;
18def sub_64 : SubRegIndex<64>;
19def sub_vsx0 : SubRegIndex<128>;
20def sub_vsx1 : SubRegIndex<128, 128>;
21def sub_pair0 : SubRegIndex<256>;
22def sub_pair1 : SubRegIndex<256, 256>;
23}
24
25
26class PPCReg<string n> : Register<n> {
27  let Namespace = "PPC";
28}
29
30// We identify all our registers with a 5-bit ID, for consistency's sake.
31
32// GPR - One of the 32 32-bit general-purpose registers
33class GPR<bits<5> num, string n> : PPCReg<n> {
34  let HWEncoding{4-0} = num;
35}
36
37// GP8 - One of the 32 64-bit general-purpose registers
38class GP8<GPR SubReg, string n> : PPCReg<n> {
39  let HWEncoding = SubReg.HWEncoding;
40  let SubRegs = [SubReg];
41  let SubRegIndices = [sub_32];
42}
43
44// SPE - One of the 32 64-bit general-purpose registers (SPE)
45class SPE<GPR SubReg, string n> : PPCReg<n> {
46  let HWEncoding = SubReg.HWEncoding;
47  let SubRegs = [SubReg];
48  let SubRegIndices = [sub_32];
49}
50
51// SPR - One of the 32-bit special-purpose registers
52class SPR<bits<10> num, string n> : PPCReg<n> {
53  let HWEncoding{9-0} = num;
54}
55
56// FPR - One of the 32 64-bit floating-point registers
57class FPR<bits<5> num, string n> : PPCReg<n> {
58  let HWEncoding{4-0} = num;
59}
60
61// VF - One of the 32 64-bit floating-point subregisters of the vector
62// registers (used by VSX).
63class VF<bits<5> num, string n> : PPCReg<n> {
64  let HWEncoding{4-0} = num;
65  let HWEncoding{5} = 1;
66}
67
68// VR - One of the 32 128-bit vector registers
69class VR<VF SubReg, string n> : PPCReg<n> {
70  let HWEncoding{4-0} = SubReg.HWEncoding{4-0};
71  let HWEncoding{5} = 0;
72  let SubRegs = [SubReg];
73  let SubRegIndices = [sub_64];
74}
75
76// VSRL - One of the 32 128-bit VSX registers that overlap with the scalar
77// floating-point registers.
78class VSRL<FPR SubReg, string n> : PPCReg<n> {
79  let HWEncoding = SubReg.HWEncoding;
80  let SubRegs = [SubReg];
81  let SubRegIndices = [sub_64];
82}
83
84// VSXReg - One of the VSX registers in the range vs32-vs63 with numbering
85// and encoding to match.
86class VSXReg<bits<6> num, string n> : PPCReg<n> {
87  let HWEncoding{5-0} = num;
88}
89
90// CR - One of the 8 4-bit condition registers
91class CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> {
92  let HWEncoding{2-0} = num;
93  let SubRegs = subregs;
94}
95
96// CRBIT - One of the 32 1-bit condition register fields
97class CRBIT<bits<5> num, string n> : PPCReg<n> {
98  let HWEncoding{4-0} = num;
99}
100
101// ACC - One of the 8 512-bit VSX accumulators.
102class ACC<bits<3> num, string n, list<Register> subregs> : PPCReg<n> {
103  let HWEncoding{2-0} = num;
104  let SubRegs = subregs;
105}
106
107// UACC - One of the 8 512-bit VSX accumulators prior to being primed.
108// Without using this register class, the register allocator has no way to
109// differentiate a primed accumulator from an unprimed accumulator.
110// This may result in invalid copies between primed and unprimed accumulators.
111class UACC<bits<3> num, string n, list<Register> subregs> : PPCReg<n> {
112  let HWEncoding{2-0} = num;
113  let SubRegs = subregs;
114}
115
116// VSR Pairs - One of the 32 paired even-odd consecutive VSRs.
117class VSRPair<bits<5> num, string n, list<Register> subregs> : PPCReg<n> {
118  let HWEncoding{4-0} = num;
119  let SubRegs = subregs;
120}
121
122// General-purpose registers
123foreach Index = 0-31 in {
124  def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>;
125}
126
127// 64-bit General-purpose registers
128foreach Index = 0-31 in {
129  def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>,
130                    DwarfRegNum<[Index, -2]>;
131}
132
133// SPE registers
134foreach Index = 0-31 in {
135  def S#Index : SPE<!cast<GPR>("R"#Index), "r"#Index>,
136                    DwarfRegNum<[!add(Index, 1200), !add(Index, 1200)]>;
137}
138
139// Floating-point registers
140foreach Index = 0-31 in {
141  def F#Index : FPR<Index, "f"#Index>,
142                DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>;
143}
144
145// 64-bit Floating-point subregisters of Altivec registers
146// Note: the register names are v0-v31 or vs32-vs63 depending on the use.
147//       Custom C++ code is used to produce the correct name and encoding.
148foreach Index = 0-31 in {
149  def VF#Index : VF<Index, "v" #Index>,
150                 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
151}
152
153// Vector registers
154foreach Index = 0-31 in {
155  def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>,
156                DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>;
157}
158
159// VSX registers
160foreach Index = 0-31 in {
161  def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>,
162                  DwarfRegAlias<!cast<FPR>("F"#Index)>;
163}
164
165// Dummy VSX registers, this defines string: "vs32"-"vs63", and is only used for
166// asm printing.
167foreach Index = 32-63 in {
168  def VSX#Index : VSXReg<Index, "vs"#Index>;
169}
170
171let SubRegIndices = [sub_vsx0, sub_vsx1] in {
172  // VSR pairs 0 - 15 (corresponding to VSRs 0 - 30 paired with 1 - 31).
173  foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in {
174    def VSRp#!srl(Index, 1) : VSRPair<!srl(Index, 1), "vsp"#Index,
175                                      [!cast<VSRL>("VSL"#Index), !cast<VSRL>("VSL"#!add(Index, 1))]>,
176                              DwarfRegNum<[0, 0]>;
177  }
178
179  // VSR pairs 16 - 31 (corresponding to VSRs 32 - 62 paired with 33 - 63).
180  foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in {
181    def VSRp#!add(!srl(Index, 1), 16) :
182      VSRPair<!add(!srl(Index, 1), 16), "vsp"#!add(Index, 32),
183              [!cast<VR>("V"#Index), !cast<VR>("V"#!add(Index, 1))]>,
184      DwarfRegNum<[0, 0]>;
185  }
186}
187
188// The representation of r0 when treated as the constant 0.
189def ZERO  : GPR<0, "0">,    DwarfRegAlias<R0>;
190def ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>;
191
192// Representations of the frame pointer used by ISD::FRAMEADDR.
193def FP   : GPR<0 /* arbitrary */, "**FRAME POINTER**">;
194def FP8  : GP8<FP, "**FRAME POINTER**">;
195
196// Representations of the base pointer used by setjmp.
197def BP   : GPR<0 /* arbitrary */, "**BASE POINTER**">;
198def BP8  : GP8<BP, "**BASE POINTER**">;
199
200// Condition register bits
201def CR0LT : CRBIT< 0, "0">;
202def CR0GT : CRBIT< 1, "1">;
203def CR0EQ : CRBIT< 2, "2">;
204def CR0UN : CRBIT< 3, "3">;
205def CR1LT : CRBIT< 4, "4">;
206def CR1GT : CRBIT< 5, "5">;
207def CR1EQ : CRBIT< 6, "6">;
208def CR1UN : CRBIT< 7, "7">;
209def CR2LT : CRBIT< 8, "8">;
210def CR2GT : CRBIT< 9, "9">;
211def CR2EQ : CRBIT<10, "10">;
212def CR2UN : CRBIT<11, "11">;
213def CR3LT : CRBIT<12, "12">;
214def CR3GT : CRBIT<13, "13">;
215def CR3EQ : CRBIT<14, "14">;
216def CR3UN : CRBIT<15, "15">;
217def CR4LT : CRBIT<16, "16">;
218def CR4GT : CRBIT<17, "17">;
219def CR4EQ : CRBIT<18, "18">;
220def CR4UN : CRBIT<19, "19">;
221def CR5LT : CRBIT<20, "20">;
222def CR5GT : CRBIT<21, "21">;
223def CR5EQ : CRBIT<22, "22">;
224def CR5UN : CRBIT<23, "23">;
225def CR6LT : CRBIT<24, "24">;
226def CR6GT : CRBIT<25, "25">;
227def CR6EQ : CRBIT<26, "26">;
228def CR6UN : CRBIT<27, "27">;
229def CR7LT : CRBIT<28, "28">;
230def CR7GT : CRBIT<29, "29">;
231def CR7EQ : CRBIT<30, "30">;
232def CR7UN : CRBIT<31, "31">;
233
234// Condition registers
235let SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in {
236def CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>;
237def CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>;
238def CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>;
239def CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>;
240def CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>;
241def CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>;
242def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>;
243def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>;
244}
245
246// Link register
247def LR  : SPR<8, "lr">, DwarfRegNum<[-2, 65]>;
248//let Aliases = [LR] in
249def LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>;
250
251// Count register
252def CTR  : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>;
253def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>;
254
255// VRsave register
256def VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>;
257
258// SPE extra registers
259// SPE Accumulator for multiply-accumulate SPE operations.  Never directly
260// accessed, so there's no real encoding for it.
261def SPEACC: DwarfRegNum<[99, 111]>;
262def SPEFSCR: SPR<512, "spefscr">, DwarfRegNum<[612, 112]>;
263
264def XER: SPR<1, "xer">, DwarfRegNum<[76]>;
265
266// Carry bit.  In the architecture this is really bit 0 of the XER register
267// (which really is SPR register 1);  this is the only bit interesting to a
268// compiler.
269def CARRY: SPR<1, "xer">, DwarfRegNum<[76]> {
270  let Aliases = [XER];
271}
272
273// FP rounding mode:  bits 30 and 31 of the FP status and control register
274// This is not allocated as a normal register; it appears only in
275// Uses and Defs.  The ABI says it needs to be preserved by a function,
276// but this is not achieved by saving and restoring it as with
277// most registers, it has to be done in code; to make this work all the
278// return and call instructions are described as Uses of RM, so instructions
279// that do nothing but change RM will not get deleted.
280def RM: PPCReg<"**ROUNDING MODE**">;
281
282/// Register classes
283// Allocate volatiles first
284// then nonvolatiles in reverse order since stmw/lmw save from rN to r31
285def GPRC : RegisterClass<"PPC", [i32,f32], 32, (add (sequence "R%u", 2, 12),
286                                                    (sequence "R%u", 30, 13),
287                                                    R31, R0, R1, FP, BP)> {
288  // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
289  // put it at the end of the list.
290  let AltOrders = [(add (sub GPRC, R2), R2)];
291  let AltOrderSelect = [{
292    return MF.getSubtarget<PPCSubtarget>().is64BitELFABI();
293  }];
294}
295
296def G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12),
297                                                (sequence "X%u", 30, 14),
298                                                X31, X13, X0, X1, FP8, BP8)> {
299  // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
300  // put it at the end of the list.
301  let AltOrders = [(add (sub G8RC, X2), X2)];
302  let AltOrderSelect = [{
303    return MF.getSubtarget<PPCSubtarget>().is64BitELFABI();
304  }];
305}
306
307// For some instructions r0 is special (representing the value 0 instead of
308// the value in the r0 register), and we use these register subclasses to
309// prevent r0 from being allocated for use by those instructions.
310def GPRC_NOR0 : RegisterClass<"PPC", [i32,f32], 32, (add (sub GPRC, R0), ZERO)> {
311  // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
312  // put it at the end of the list.
313  let AltOrders = [(add (sub GPRC_NOR0, R2), R2)];
314  let AltOrderSelect = [{
315    return MF.getSubtarget<PPCSubtarget>().is64BitELFABI();
316  }];
317}
318
319def G8RC_NOX0 : RegisterClass<"PPC", [i64], 64, (add (sub G8RC, X0), ZERO8)> {
320  // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so
321  // put it at the end of the list.
322  let AltOrders = [(add (sub G8RC_NOX0, X2), X2)];
323  let AltOrderSelect = [{
324    return MF.getSubtarget<PPCSubtarget>().is64BitELFABI();
325  }];
326}
327
328def SPERC : RegisterClass<"PPC", [f64], 64, (add (sequence "S%u", 2, 12),
329                                                (sequence "S%u", 30, 13),
330                                                S31, S0, S1)>;
331
332// Allocate volatiles first, then non-volatiles in reverse order. With the SVR4
333// ABI the size of the Floating-point register save area is determined by the
334// allocated non-volatile register with the lowest register number, as FP
335// register N is spilled to offset 8 * (32 - N) below the back chain word of the
336// previous stack frame. By allocating non-volatiles in reverse order we make
337// sure that the Floating-point register save area is always as small as
338// possible because there aren't any unused spill slots.
339def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13),
340                                                (sequence "F%u", 31, 14))>;
341def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>;
342
343def VRRC : RegisterClass<"PPC",
344                         [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32,v2f64, f128],
345                         128,
346                         (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11,
347                             V12, V13, V14, V15, V16, V17, V18, V19, V31, V30,
348                             V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>;
349
350// VSX register classes (the allocation order mirrors that of the corresponding
351// subregister classes).
352def VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
353                          (add (sequence "VSL%u", 0, 13),
354                               (sequence "VSL%u", 31, 14))>;
355def VSRC  : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128,
356                          (add VSLRC, VRRC)>;
357
358// Register classes for the 64-bit "scalar" VSX subregisters.
359def VFRC :  RegisterClass<"PPC", [f64], 64,
360                          (add VF2, VF3, VF4, VF5, VF0, VF1, VF6, VF7,
361                               VF8, VF9, VF10, VF11, VF12, VF13, VF14,
362                               VF15, VF16, VF17, VF18, VF19, VF31, VF30,
363                               VF29, VF28, VF27, VF26, VF25, VF24, VF23,
364                               VF22, VF21, VF20)>;
365def VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>;
366
367// Allow spilling GPR's into caller-saved VSR's.
368def SPILLTOVSRRC : RegisterClass<"PPC", [i64, f64], 64, (add G8RC, (sub VSFRC,
369				(sequence "VF%u", 31, 20),
370				(sequence "F%u", 31, 14)))>;
371
372// Register class for single precision scalars in VSX registers
373def VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>;
374
375def CRBITRC : RegisterClass<"PPC", [i1], 32,
376  (add CR2LT, CR2GT, CR2EQ, CR2UN,
377       CR3LT, CR3GT, CR3EQ, CR3UN,
378       CR4LT, CR4GT, CR4EQ, CR4UN,
379       CR5LT, CR5GT, CR5EQ, CR5UN,
380       CR6LT, CR6GT, CR6EQ, CR6UN,
381       CR7LT, CR7GT, CR7EQ, CR7UN,
382       CR1LT, CR1GT, CR1EQ, CR1UN,
383       CR0LT, CR0GT, CR0EQ, CR0UN)> {
384  let Size = 32;
385  let AltOrders = [(sub CRBITRC, CR2LT, CR2GT, CR2EQ, CR2UN, CR3LT, CR3GT,
386                        CR3EQ, CR3UN, CR4LT, CR4GT, CR4EQ, CR4UN)];
387  let AltOrderSelect = [{
388    return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() &&
389           MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled();
390  }];
391}
392
393def CRRC : RegisterClass<"PPC", [i32], 32,
394  (add CR0, CR1, CR5, CR6,
395       CR7, CR2, CR3, CR4)> {
396  let AltOrders = [(sub CRRC, CR2, CR3, CR4)];
397  let AltOrderSelect = [{
398    return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() &&
399           MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled();
400  }];
401}
402// The CTR registers are not allocatable because they're used by the
403// decrement-and-branch instructions, and thus need to stay live across
404// multiple basic blocks.
405def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> {
406  let isAllocatable = 0;
407}
408def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> {
409  let isAllocatable = 0;
410}
411
412def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>;
413def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY, XER)> {
414  let CopyCost = -1;
415}
416
417let SubRegIndices = [sub_pair0, sub_pair1] in {
418  def ACC0 : ACC<0, "acc0", [VSRp0, VSRp1]>, DwarfRegNum<[0, 0]>;
419  def ACC1 : ACC<1, "acc1", [VSRp2, VSRp3]>, DwarfRegNum<[0, 0]>;
420  def ACC2 : ACC<2, "acc2", [VSRp4, VSRp5]>, DwarfRegNum<[0, 0]>;
421  def ACC3 : ACC<3, "acc3", [VSRp6, VSRp7]>, DwarfRegNum<[0, 0]>;
422  def ACC4 : ACC<4, "acc4", [VSRp8, VSRp9]>, DwarfRegNum<[0, 0]>;
423  def ACC5 : ACC<5, "acc5", [VSRp10, VSRp11]>, DwarfRegNum<[0, 0]>;
424  def ACC6 : ACC<6, "acc6", [VSRp12, VSRp13]>, DwarfRegNum<[0, 0]>;
425  def ACC7 : ACC<7, "acc7", [VSRp14, VSRp15]>, DwarfRegNum<[0, 0]>;
426}
427def ACCRC : RegisterClass<"PPC", [v512i1], 128, (add ACC0, ACC1, ACC2, ACC3,
428                                                      ACC4, ACC5, ACC6, ACC7)> {
429  let Size = 512;
430}
431
432let SubRegIndices = [sub_pair0, sub_pair1] in {
433  def UACC0 : UACC<0, "acc0", [VSRp0, VSRp1]>, DwarfRegNum<[0, 0]>;
434  def UACC1 : UACC<1, "acc1", [VSRp2, VSRp3]>, DwarfRegNum<[0, 0]>;
435  def UACC2 : UACC<2, "acc2", [VSRp4, VSRp5]>, DwarfRegNum<[0, 0]>;
436  def UACC3 : UACC<3, "acc3", [VSRp6, VSRp7]>, DwarfRegNum<[0, 0]>;
437  def UACC4 : UACC<4, "acc4", [VSRp8, VSRp9]>, DwarfRegNum<[0, 0]>;
438  def UACC5 : UACC<5, "acc5", [VSRp10, VSRp11]>, DwarfRegNum<[0, 0]>;
439  def UACC6 : UACC<6, "acc6", [VSRp12, VSRp13]>, DwarfRegNum<[0, 0]>;
440  def UACC7 : UACC<7, "acc7", [VSRp14, VSRp15]>, DwarfRegNum<[0, 0]>;
441}
442def UACCRC : RegisterClass<"PPC", [v512i1], 128,
443                           (add UACC0, UACC1, UACC2, UACC3,
444                                UACC4, UACC5, UACC6, UACC7)> {
445  let Size = 512;
446}
447
448// Allocate in the same order as the underlying VSX registers.
449def VSRpRC :
450  RegisterClass<"PPC", [v256i1], 128,
451                (add (sequence "VSRp%u", 0, 6),
452                     (sequence "VSRp%u", 15, 7), VSRp17, VSRp18,
453                     VSRp16, VSRp19, VSRp20, VSRp21, VSRp22, VSRp23,
454                     VSRp24, VSRp25, VSRp31, VSRp30, VSRp29, VSRp28,
455                     VSRp27, VSRp26)> {
456  let Size = 256;
457}
458