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