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
13class PPCReg<string n> : Register<n> {
14  let Namespace = "PPC";
15}
16
17// We identify all our registers with a 5-bit ID, for consistency's sake.
18
19// GPR - One of the 32 32-bit general-purpose registers
20class GPR<bits<5> num, string n> : PPCReg<n> {
21  field bits<5> Num = num;
22}
23
24// GP8 - One of the 32 64-bit general-purpose registers
25class GP8<GPR SubReg, string n> : PPCReg<n> {
26  field bits<5> Num = SubReg.Num;
27  let SubRegs = [SubReg];
28}
29
30// SPR - One of the 32-bit special-purpose registers
31class SPR<bits<10> num, string n> : PPCReg<n> {
32  field bits<10> Num = num;
33}
34
35// FPR - One of the 32 64-bit floating-point registers
36class FPR<bits<5> num, string n> : PPCReg<n> {
37  field bits<5> Num = num;
38}
39
40// VR - One of the 32 128-bit vector registers
41class VR<bits<5> num, string n> : PPCReg<n> {
42  field bits<5> Num = num;
43}
44
45// CR - One of the 8 4-bit condition registers
46class CR<bits<3> num, string n> : PPCReg<n> {
47  field bits<3> Num = num;
48}
49
50// CRBIT - One of the 32 1-bit condition register fields
51class CRBIT<bits<5> num, string n> : PPCReg<n> {
52  field bits<5> Num = num;
53}
54
55
56// General-purpose registers
57def R0  : GPR< 0,  "r0">, DwarfRegNum<[0]>;
58def R1  : GPR< 1,  "r1">, DwarfRegNum<[1]>;
59def R2  : GPR< 2,  "r2">, DwarfRegNum<[2]>;
60def R3  : GPR< 3,  "r3">, DwarfRegNum<[3]>;
61def R4  : GPR< 4,  "r4">, DwarfRegNum<[4]>;
62def R5  : GPR< 5,  "r5">, DwarfRegNum<[5]>;
63def R6  : GPR< 6,  "r6">, DwarfRegNum<[6]>;
64def R7  : GPR< 7,  "r7">, DwarfRegNum<[7]>;
65def R8  : GPR< 8,  "r8">, DwarfRegNum<[8]>;
66def R9  : GPR< 9,  "r9">, DwarfRegNum<[9]>;
67def R10 : GPR<10, "r10">, DwarfRegNum<[10]>;
68def R11 : GPR<11, "r11">, DwarfRegNum<[11]>;
69def R12 : GPR<12, "r12">, DwarfRegNum<[12]>;
70def R13 : GPR<13, "r13">, DwarfRegNum<[13]>;
71def R14 : GPR<14, "r14">, DwarfRegNum<[14]>;
72def R15 : GPR<15, "r15">, DwarfRegNum<[15]>;
73def R16 : GPR<16, "r16">, DwarfRegNum<[16]>;
74def R17 : GPR<17, "r17">, DwarfRegNum<[17]>;
75def R18 : GPR<18, "r18">, DwarfRegNum<[18]>;
76def R19 : GPR<19, "r19">, DwarfRegNum<[19]>;
77def R20 : GPR<20, "r20">, DwarfRegNum<[20]>;
78def R21 : GPR<21, "r21">, DwarfRegNum<[21]>;
79def R22 : GPR<22, "r22">, DwarfRegNum<[22]>;
80def R23 : GPR<23, "r23">, DwarfRegNum<[23]>;
81def R24 : GPR<24, "r24">, DwarfRegNum<[24]>;
82def R25 : GPR<25, "r25">, DwarfRegNum<[25]>;
83def R26 : GPR<26, "r26">, DwarfRegNum<[26]>;
84def R27 : GPR<27, "r27">, DwarfRegNum<[27]>;
85def R28 : GPR<28, "r28">, DwarfRegNum<[28]>;
86def R29 : GPR<29, "r29">, DwarfRegNum<[29]>;
87def R30 : GPR<30, "r30">, DwarfRegNum<[30]>;
88def R31 : GPR<31, "r31">, DwarfRegNum<[31]>;
89
90// 64-bit General-purpose registers
91def X0  : GP8< R0,  "r0">, DwarfRegNum<[0]>;
92def X1  : GP8< R1,  "r1">, DwarfRegNum<[1]>;
93def X2  : GP8< R2,  "r2">, DwarfRegNum<[2]>;
94def X3  : GP8< R3,  "r3">, DwarfRegNum<[3]>;
95def X4  : GP8< R4,  "r4">, DwarfRegNum<[4]>;
96def X5  : GP8< R5,  "r5">, DwarfRegNum<[5]>;
97def X6  : GP8< R6,  "r6">, DwarfRegNum<[6]>;
98def X7  : GP8< R7,  "r7">, DwarfRegNum<[7]>;
99def X8  : GP8< R8,  "r8">, DwarfRegNum<[8]>;
100def X9  : GP8< R9,  "r9">, DwarfRegNum<[9]>;
101def X10 : GP8<R10, "r10">, DwarfRegNum<[10]>;
102def X11 : GP8<R11, "r11">, DwarfRegNum<[11]>;
103def X12 : GP8<R12, "r12">, DwarfRegNum<[12]>;
104def X13 : GP8<R13, "r13">, DwarfRegNum<[13]>;
105def X14 : GP8<R14, "r14">, DwarfRegNum<[14]>;
106def X15 : GP8<R15, "r15">, DwarfRegNum<[15]>;
107def X16 : GP8<R16, "r16">, DwarfRegNum<[16]>;
108def X17 : GP8<R17, "r17">, DwarfRegNum<[17]>;
109def X18 : GP8<R18, "r18">, DwarfRegNum<[18]>;
110def X19 : GP8<R19, "r19">, DwarfRegNum<[19]>;
111def X20 : GP8<R20, "r20">, DwarfRegNum<[20]>;
112def X21 : GP8<R21, "r21">, DwarfRegNum<[21]>;
113def X22 : GP8<R22, "r22">, DwarfRegNum<[22]>;
114def X23 : GP8<R23, "r23">, DwarfRegNum<[23]>;
115def X24 : GP8<R24, "r24">, DwarfRegNum<[24]>;
116def X25 : GP8<R25, "r25">, DwarfRegNum<[25]>;
117def X26 : GP8<R26, "r26">, DwarfRegNum<[26]>;
118def X27 : GP8<R27, "r27">, DwarfRegNum<[27]>;
119def X28 : GP8<R28, "r28">, DwarfRegNum<[28]>;
120def X29 : GP8<R29, "r29">, DwarfRegNum<[29]>;
121def X30 : GP8<R30, "r30">, DwarfRegNum<[30]>;
122def X31 : GP8<R31, "r31">, DwarfRegNum<[31]>;
123
124// Floating-point registers
125def F0  : FPR< 0,  "f0">, DwarfRegNum<[32]>;
126def F1  : FPR< 1,  "f1">, DwarfRegNum<[33]>;
127def F2  : FPR< 2,  "f2">, DwarfRegNum<[34]>;
128def F3  : FPR< 3,  "f3">, DwarfRegNum<[35]>;
129def F4  : FPR< 4,  "f4">, DwarfRegNum<[36]>;
130def F5  : FPR< 5,  "f5">, DwarfRegNum<[37]>;
131def F6  : FPR< 6,  "f6">, DwarfRegNum<[38]>;
132def F7  : FPR< 7,  "f7">, DwarfRegNum<[39]>;
133def F8  : FPR< 8,  "f8">, DwarfRegNum<[40]>;
134def F9  : FPR< 9,  "f9">, DwarfRegNum<[41]>;
135def F10 : FPR<10, "f10">, DwarfRegNum<[42]>;
136def F11 : FPR<11, "f11">, DwarfRegNum<[43]>;
137def F12 : FPR<12, "f12">, DwarfRegNum<[44]>;
138def F13 : FPR<13, "f13">, DwarfRegNum<[45]>;
139def F14 : FPR<14, "f14">, DwarfRegNum<[46]>;
140def F15 : FPR<15, "f15">, DwarfRegNum<[47]>;
141def F16 : FPR<16, "f16">, DwarfRegNum<[48]>;
142def F17 : FPR<17, "f17">, DwarfRegNum<[49]>;
143def F18 : FPR<18, "f18">, DwarfRegNum<[50]>;
144def F19 : FPR<19, "f19">, DwarfRegNum<[51]>;
145def F20 : FPR<20, "f20">, DwarfRegNum<[52]>;
146def F21 : FPR<21, "f21">, DwarfRegNum<[53]>;
147def F22 : FPR<22, "f22">, DwarfRegNum<[54]>;
148def F23 : FPR<23, "f23">, DwarfRegNum<[55]>;
149def F24 : FPR<24, "f24">, DwarfRegNum<[56]>;
150def F25 : FPR<25, "f25">, DwarfRegNum<[57]>;
151def F26 : FPR<26, "f26">, DwarfRegNum<[58]>;
152def F27 : FPR<27, "f27">, DwarfRegNum<[59]>;
153def F28 : FPR<28, "f28">, DwarfRegNum<[60]>;
154def F29 : FPR<29, "f29">, DwarfRegNum<[61]>;
155def F30 : FPR<30, "f30">, DwarfRegNum<[62]>;
156def F31 : FPR<31, "f31">, DwarfRegNum<[63]>;
157
158// Vector registers
159def V0  : VR< 0,  "v0">, DwarfRegNum<[77]>;
160def V1  : VR< 1,  "v1">, DwarfRegNum<[78]>;
161def V2  : VR< 2,  "v2">, DwarfRegNum<[79]>;
162def V3  : VR< 3,  "v3">, DwarfRegNum<[80]>;
163def V4  : VR< 4,  "v4">, DwarfRegNum<[81]>;
164def V5  : VR< 5,  "v5">, DwarfRegNum<[82]>;
165def V6  : VR< 6,  "v6">, DwarfRegNum<[83]>;
166def V7  : VR< 7,  "v7">, DwarfRegNum<[84]>;
167def V8  : VR< 8,  "v8">, DwarfRegNum<[85]>;
168def V9  : VR< 9,  "v9">, DwarfRegNum<[86]>;
169def V10 : VR<10, "v10">, DwarfRegNum<[87]>;
170def V11 : VR<11, "v11">, DwarfRegNum<[88]>;
171def V12 : VR<12, "v12">, DwarfRegNum<[89]>;
172def V13 : VR<13, "v13">, DwarfRegNum<[90]>;
173def V14 : VR<14, "v14">, DwarfRegNum<[91]>;
174def V15 : VR<15, "v15">, DwarfRegNum<[92]>;
175def V16 : VR<16, "v16">, DwarfRegNum<[93]>;
176def V17 : VR<17, "v17">, DwarfRegNum<[94]>;
177def V18 : VR<18, "v18">, DwarfRegNum<[95]>;
178def V19 : VR<19, "v19">, DwarfRegNum<[96]>;
179def V20 : VR<20, "v20">, DwarfRegNum<[97]>;
180def V21 : VR<21, "v21">, DwarfRegNum<[98]>;
181def V22 : VR<22, "v22">, DwarfRegNum<[99]>;
182def V23 : VR<23, "v23">, DwarfRegNum<[100]>;
183def V24 : VR<24, "v24">, DwarfRegNum<[101]>;
184def V25 : VR<25, "v25">, DwarfRegNum<[102]>;
185def V26 : VR<26, "v26">, DwarfRegNum<[103]>;
186def V27 : VR<27, "v27">, DwarfRegNum<[104]>;
187def V28 : VR<28, "v28">, DwarfRegNum<[105]>;
188def V29 : VR<29, "v29">, DwarfRegNum<[106]>;
189def V30 : VR<30, "v30">, DwarfRegNum<[107]>;
190def V31 : VR<31, "v31">, DwarfRegNum<[108]>;
191
192// Condition registers
193def CR0 : CR<0, "cr0">, DwarfRegNum<[68]>;
194def CR1 : CR<1, "cr1">, DwarfRegNum<[69]>;
195def CR2 : CR<2, "cr2">, DwarfRegNum<[70]>;
196def CR3 : CR<3, "cr3">, DwarfRegNum<[71]>;
197def CR4 : CR<4, "cr4">, DwarfRegNum<[72]>;
198def CR5 : CR<5, "cr5">, DwarfRegNum<[73]>;
199def CR6 : CR<6, "cr6">, DwarfRegNum<[74]>;
200def CR7 : CR<7, "cr7">, DwarfRegNum<[75]>;
201
202// Condition register bits
203def CR0LT : CRBIT< 0, "0">, DwarfRegNum<[0]>;
204def CR0GT : CRBIT< 1, "1">, DwarfRegNum<[0]>;
205def CR0EQ : CRBIT< 2, "2">, DwarfRegNum<[0]>;
206def CR0UN : CRBIT< 3, "3">, DwarfRegNum<[0]>;
207def CR1LT : CRBIT< 4, "4">, DwarfRegNum<[0]>;
208def CR1GT : CRBIT< 5, "5">, DwarfRegNum<[0]>;
209def CR1EQ : CRBIT< 6, "6">, DwarfRegNum<[0]>;
210def CR1UN : CRBIT< 7, "7">, DwarfRegNum<[0]>;
211def CR2LT : CRBIT< 8, "8">, DwarfRegNum<[0]>;
212def CR2GT : CRBIT< 9, "9">, DwarfRegNum<[0]>;
213def CR2EQ : CRBIT<10, "10">, DwarfRegNum<[0]>;
214def CR2UN : CRBIT<11, "11">, DwarfRegNum<[0]>;
215def CR3LT : CRBIT<12, "12">, DwarfRegNum<[0]>;
216def CR3GT : CRBIT<13, "13">, DwarfRegNum<[0]>;
217def CR3EQ : CRBIT<14, "14">, DwarfRegNum<[0]>;
218def CR3UN : CRBIT<15, "15">, DwarfRegNum<[0]>;
219def CR4LT : CRBIT<16, "16">, DwarfRegNum<[0]>;
220def CR4GT : CRBIT<17, "17">, DwarfRegNum<[0]>;
221def CR4EQ : CRBIT<18, "18">, DwarfRegNum<[0]>;
222def CR4UN : CRBIT<19, "19">, DwarfRegNum<[0]>;
223def CR5LT : CRBIT<20, "20">, DwarfRegNum<[0]>;
224def CR5GT : CRBIT<21, "21">, DwarfRegNum<[0]>;
225def CR5EQ : CRBIT<22, "22">, DwarfRegNum<[0]>;
226def CR5UN : CRBIT<23, "23">, DwarfRegNum<[0]>;
227def CR6LT : CRBIT<24, "24">, DwarfRegNum<[0]>;
228def CR6GT : CRBIT<25, "25">, DwarfRegNum<[0]>;
229def CR6EQ : CRBIT<26, "26">, DwarfRegNum<[0]>;
230def CR6UN : CRBIT<27, "27">, DwarfRegNum<[0]>;
231def CR7LT : CRBIT<28, "28">, DwarfRegNum<[0]>;
232def CR7GT : CRBIT<29, "29">, DwarfRegNum<[0]>;
233def CR7EQ : CRBIT<30, "30">, DwarfRegNum<[0]>;
234def CR7UN : CRBIT<31, "31">, DwarfRegNum<[0]>;
235
236def : SubRegSet<1, [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7],
237                   [CR0LT, CR1LT, CR2LT, CR3LT, CR4LT, CR5LT, CR6LT, CR7LT]>;
238def : SubRegSet<2, [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7],
239                   [CR0GT, CR1GT, CR2GT, CR3GT, CR4GT, CR5GT, CR6GT, CR7GT]>;
240def : SubRegSet<3, [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7],
241                   [CR0EQ, CR1EQ, CR2EQ, CR3EQ, CR4EQ, CR5EQ, CR6EQ, CR7EQ]>;
242def : SubRegSet<4, [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7],
243                   [CR0UN, CR1UN, CR2UN, CR3UN, CR4UN, CR5UN, CR6UN, CR7UN]>;
244
245// Link register
246def LR  : SPR<8, "lr">, DwarfRegNum<[65]>;
247//let Aliases = [LR] in
248def LR8 : SPR<8, "lr">, DwarfRegNum<[65]>;
249
250// Count register
251def CTR  : SPR<9, "ctr">, DwarfRegNum<[66]>;
252def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66]>;
253
254// VRsave register
255def VRSAVE: SPR<256, "VRsave">, DwarfRegNum<[107]>;
256
257// FP rounding mode:  bits 30 and 31 of the FP status and control register
258// This is not allocated as a normal register; it appears only in
259// Uses and Defs.  The ABI says it needs to be preserved by a function,
260// but this is not achieved by saving and restoring it as with
261// most registers, it has to be done in code; to make this work all the
262// return and call instructions are described as Uses of RM, so instructions
263// that do nothing but change RM will not get deleted.
264// Also, in the architecture it is not really a SPR; 512 is arbitrary.
265def RM: SPR<512, "**ROUNDING MODE**">, DwarfRegNum<[0]>;
266
267/// Register classes
268// Allocate volatiles first
269// then nonvolatiles in reverse order since stmw/lmw save from rN to r31
270def GPRC : RegisterClass<"PPC", [i32], 32,
271     [R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12,
272      R30, R29, R28, R27, R26, R25, R24, R23, R22, R21, R20, R19, R18, R17,
273      R16, R15, R14, R13, R31, R0, R1, LR]>
274{
275  let MethodProtos = [{
276    iterator allocation_order_begin(const MachineFunction &MF) const;
277    iterator allocation_order_end(const MachineFunction &MF) const;
278  }];
279  let MethodBodies = [{
280    GPRCClass::iterator
281    GPRCClass::allocation_order_begin(const MachineFunction &MF) const {
282      // In Linux, r2 is reserved for the OS.
283      if (!MF.getTarget().getSubtarget<PPCSubtarget>().isDarwin())
284        return begin()+1;
285
286      return begin();
287    }
288    GPRCClass::iterator
289    GPRCClass::allocation_order_end(const MachineFunction &MF) const {
290      // On PPC64, r13 is the thread pointer.  Never allocate this register.
291      // Note that this is overconservative, as it also prevents allocation of
292      // R31 when the FP is not needed.
293      if (MF.getTarget().getSubtarget<PPCSubtarget>().isPPC64())
294        return end()-5;  // don't allocate R13, R31, R0, R1, LR
295
296      if (needsFP(MF))
297        return end()-4;  // don't allocate R31, R0, R1, LR
298      else
299        return end()-3;  // don't allocate R0, R1, LR
300    }
301  }];
302}
303def G8RC : RegisterClass<"PPC", [i64], 64,
304     [X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12,
305      X30, X29, X28, X27, X26, X25, X24, X23, X22, X21, X20, X19, X18, X17,
306      X16, X15, X14, X31, X13, X0, X1, LR8]>
307{
308  let MethodProtos = [{
309    iterator allocation_order_begin(const MachineFunction &MF) const;
310    iterator allocation_order_end(const MachineFunction &MF) const;
311  }];
312  let MethodBodies = [{
313    G8RCClass::iterator
314    G8RCClass::allocation_order_begin(const MachineFunction &MF) const {
315      return begin();
316    }
317    G8RCClass::iterator
318    G8RCClass::allocation_order_end(const MachineFunction &MF) const {
319      if (needsFP(MF))
320        return end()-5;
321      else
322        return end()-4;
323    }
324  }];
325}
326
327
328
329def F8RC : RegisterClass<"PPC", [f64], 64, [F0, F1, F2, F3, F4, F5, F6, F7,
330  F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21,
331  F22, F23, F24, F25, F26, F27, F28, F29, F30, F31]>;
332def F4RC : RegisterClass<"PPC", [f32], 32, [F0, F1, F2, F3, F4, F5, F6, F7,
333  F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21,
334  F22, F23, F24, F25, F26, F27, F28, F29, F30, F31]>;
335
336def VRRC : RegisterClass<"PPC", [v16i8,v8i16,v4i32,v4f32], 128,
337 [V2, V3, V4, V5, V0, V1,
338  V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21,
339  V22, V23, V24, V25, V26, V27, V28, V29, V30, V31]>;
340
341def CRRC : RegisterClass<"PPC", [i32], 32, [CR0, CR1, CR5, CR6, CR7, CR2,
342  CR3, CR4]>;
343
344def CRBITRC : RegisterClass<"PPC", [i32], 32,
345  [CR0LT, CR0GT, CR0EQ, CR0UN,
346   CR1LT, CR1GT, CR1EQ, CR1UN,
347   CR2LT, CR2GT, CR2EQ, CR2UN,
348   CR3LT, CR3GT, CR3EQ, CR3UN,
349   CR4LT, CR4GT, CR4EQ, CR4UN,
350   CR5LT, CR5GT, CR5EQ, CR5UN,
351   CR6LT, CR6GT, CR6EQ, CR6UN,
352   CR7LT, CR7GT, CR7EQ, CR7UN
353  ]>
354{
355  let CopyCost = -1;
356}
357
358
359def CTRRC : RegisterClass<"PPC", [i32], 32, [CTR]>;
360def CTRRC8 : RegisterClass<"PPC", [i64], 64, [CTR8]>;
361