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