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