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