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