1//===-- PPCRegisterInfo.td - The PowerPC Register File -----*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// 10//===----------------------------------------------------------------------===// 11 12let Namespace = "PPC" in { 13def sub_lt : SubRegIndex<1>; 14def sub_gt : SubRegIndex<1, 1>; 15def sub_eq : SubRegIndex<1, 2>; 16def sub_un : SubRegIndex<1, 3>; 17def sub_32 : SubRegIndex<32>; 18def sub_64 : SubRegIndex<64>; 19def sub_vsx0 : SubRegIndex<128>; 20def sub_vsx1 : SubRegIndex<128, 128>; 21def sub_pair0 : SubRegIndex<256>; 22def sub_pair1 : SubRegIndex<256, 256>; 23} 24 25 26class PPCReg<string n> : Register<n> { 27 let Namespace = "PPC"; 28} 29 30// We identify all our registers with a 5-bit ID, for consistency's sake. 31 32// GPR - One of the 32 32-bit general-purpose registers 33class GPR<bits<5> num, string n> : PPCReg<n> { 34 let HWEncoding{4-0} = num; 35} 36 37// GP8 - One of the 32 64-bit general-purpose registers 38class GP8<GPR SubReg, string n> : PPCReg<n> { 39 let HWEncoding = SubReg.HWEncoding; 40 let SubRegs = [SubReg]; 41 let SubRegIndices = [sub_32]; 42} 43 44// SPE - One of the 32 64-bit general-purpose registers (SPE) 45class SPE<GPR SubReg, string n> : PPCReg<n> { 46 let HWEncoding = SubReg.HWEncoding; 47 let SubRegs = [SubReg]; 48 let SubRegIndices = [sub_32]; 49} 50 51// SPR - One of the 32-bit special-purpose registers 52class SPR<bits<10> num, string n> : PPCReg<n> { 53 let HWEncoding{9-0} = num; 54} 55 56// FPR - One of the 32 64-bit floating-point registers 57class FPR<bits<5> num, string n> : PPCReg<n> { 58 let HWEncoding{4-0} = num; 59} 60 61// VF - One of the 32 64-bit floating-point subregisters of the vector 62// registers (used by VSX). 63class VF<bits<5> num, string n> : PPCReg<n> { 64 let HWEncoding{4-0} = num; 65 let HWEncoding{5} = 1; 66} 67 68// VR - One of the 32 128-bit vector registers 69class VR<VF SubReg, string n> : PPCReg<n> { 70 let HWEncoding{4-0} = SubReg.HWEncoding{4-0}; 71 let HWEncoding{5} = 0; 72 let SubRegs = [SubReg]; 73 let SubRegIndices = [sub_64]; 74} 75 76// VSRL - One of the 32 128-bit VSX registers that overlap with the scalar 77// floating-point registers. 78class VSRL<FPR SubReg, string n> : PPCReg<n> { 79 let HWEncoding = SubReg.HWEncoding; 80 let SubRegs = [SubReg]; 81 let SubRegIndices = [sub_64]; 82} 83 84// VSXReg - One of the VSX registers in the range vs32-vs63 with numbering 85// and encoding to match. 86class VSXReg<bits<6> num, string n> : PPCReg<n> { 87 let HWEncoding{5-0} = num; 88} 89 90// CR - One of the 8 4-bit condition registers 91class CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 92 let HWEncoding{2-0} = num; 93 let SubRegs = subregs; 94} 95 96// CRBIT - One of the 32 1-bit condition register fields 97class CRBIT<bits<5> num, string n> : PPCReg<n> { 98 let HWEncoding{4-0} = num; 99} 100 101// ACC - One of the 8 512-bit VSX accumulators. 102class ACC<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 103 let HWEncoding{2-0} = num; 104 let SubRegs = subregs; 105} 106 107// UACC - One of the 8 512-bit VSX accumulators prior to being primed. 108// Without using this register class, the register allocator has no way to 109// differentiate a primed accumulator from an unprimed accumulator. 110// This may result in invalid copies between primed and unprimed accumulators. 111class UACC<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 112 let HWEncoding{2-0} = num; 113 let SubRegs = subregs; 114} 115 116// VSR Pairs - One of the 32 paired even-odd consecutive VSRs. 117class VSRPair<bits<5> num, string n, list<Register> subregs> : PPCReg<n> { 118 let HWEncoding{4-0} = num; 119 let SubRegs = subregs; 120} 121 122// General-purpose registers 123foreach Index = 0-31 in { 124 def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>; 125} 126 127// 64-bit General-purpose registers 128foreach Index = 0-31 in { 129 def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>, 130 DwarfRegNum<[Index, -2]>; 131} 132 133// SPE registers 134foreach Index = 0-31 in { 135 def S#Index : SPE<!cast<GPR>("R"#Index), "r"#Index>, 136 DwarfRegNum<[!add(Index, 1200), !add(Index, 1200)]>; 137} 138 139// Floating-point registers 140foreach Index = 0-31 in { 141 def F#Index : FPR<Index, "f"#Index>, 142 DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>; 143} 144 145// 64-bit Floating-point subregisters of Altivec registers 146// Note: the register names are v0-v31 or vs32-vs63 depending on the use. 147// Custom C++ code is used to produce the correct name and encoding. 148foreach Index = 0-31 in { 149 def VF#Index : VF<Index, "v" #Index>, 150 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>; 151} 152 153// Vector registers 154foreach Index = 0-31 in { 155 def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>, 156 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>; 157} 158 159// VSX registers 160foreach Index = 0-31 in { 161 def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>, 162 DwarfRegAlias<!cast<FPR>("F"#Index)>; 163} 164 165// Dummy VSX registers, this defines string: "vs32"-"vs63", and is only used for 166// asm printing. 167foreach Index = 32-63 in { 168 def VSX#Index : VSXReg<Index, "vs"#Index>; 169} 170 171let SubRegIndices = [sub_vsx0, sub_vsx1] in { 172 // VSR pairs 0 - 15 (corresponding to VSRs 0 - 30 paired with 1 - 31). 173 foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 174 def VSRp#!srl(Index, 1) : VSRPair<!srl(Index, 1), "vsp"#Index, 175 [!cast<VSRL>("VSL"#Index), !cast<VSRL>("VSL"#!add(Index, 1))]>, 176 DwarfRegNum<[0, 0]>; 177 } 178 179 // VSR pairs 16 - 31 (corresponding to VSRs 32 - 62 paired with 33 - 63). 180 foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 181 def VSRp#!add(!srl(Index, 1), 16) : 182 VSRPair<!add(!srl(Index, 1), 16), "vsp"#!add(Index, 32), 183 [!cast<VR>("V"#Index), !cast<VR>("V"#!add(Index, 1))]>, 184 DwarfRegNum<[0, 0]>; 185 } 186} 187 188// The representation of r0 when treated as the constant 0. 189def ZERO : GPR<0, "0">, DwarfRegAlias<R0>; 190def ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>; 191 192// Representations of the frame pointer used by ISD::FRAMEADDR. 193def FP : GPR<0 /* arbitrary */, "**FRAME POINTER**">; 194def FP8 : GP8<FP, "**FRAME POINTER**">; 195 196// Representations of the base pointer used by setjmp. 197def BP : GPR<0 /* arbitrary */, "**BASE POINTER**">; 198def BP8 : GP8<BP, "**BASE POINTER**">; 199 200// Condition register bits 201def CR0LT : CRBIT< 0, "0">; 202def CR0GT : CRBIT< 1, "1">; 203def CR0EQ : CRBIT< 2, "2">; 204def CR0UN : CRBIT< 3, "3">; 205def CR1LT : CRBIT< 4, "4">; 206def CR1GT : CRBIT< 5, "5">; 207def CR1EQ : CRBIT< 6, "6">; 208def CR1UN : CRBIT< 7, "7">; 209def CR2LT : CRBIT< 8, "8">; 210def CR2GT : CRBIT< 9, "9">; 211def CR2EQ : CRBIT<10, "10">; 212def CR2UN : CRBIT<11, "11">; 213def CR3LT : CRBIT<12, "12">; 214def CR3GT : CRBIT<13, "13">; 215def CR3EQ : CRBIT<14, "14">; 216def CR3UN : CRBIT<15, "15">; 217def CR4LT : CRBIT<16, "16">; 218def CR4GT : CRBIT<17, "17">; 219def CR4EQ : CRBIT<18, "18">; 220def CR4UN : CRBIT<19, "19">; 221def CR5LT : CRBIT<20, "20">; 222def CR5GT : CRBIT<21, "21">; 223def CR5EQ : CRBIT<22, "22">; 224def CR5UN : CRBIT<23, "23">; 225def CR6LT : CRBIT<24, "24">; 226def CR6GT : CRBIT<25, "25">; 227def CR6EQ : CRBIT<26, "26">; 228def CR6UN : CRBIT<27, "27">; 229def CR7LT : CRBIT<28, "28">; 230def CR7GT : CRBIT<29, "29">; 231def CR7EQ : CRBIT<30, "30">; 232def CR7UN : CRBIT<31, "31">; 233 234// Condition registers 235let SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in { 236def CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>; 237def CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>; 238def CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>; 239def CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>; 240def CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>; 241def CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>; 242def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>; 243def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>; 244} 245 246// Link register 247def LR : SPR<8, "lr">, DwarfRegNum<[-2, 65]>; 248//let Aliases = [LR] in 249def LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>; 250 251// Count register 252def CTR : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>; 253def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>; 254 255// VRsave register 256def VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>; 257 258// SPE extra registers 259// SPE Accumulator for multiply-accumulate SPE operations. Never directly 260// accessed, so there's no real encoding for it. 261def SPEACC: DwarfRegNum<[99, 111]>; 262def SPEFSCR: SPR<512, "spefscr">, DwarfRegNum<[612, 112]>; 263 264def XER: SPR<1, "xer">, DwarfRegNum<[76]>; 265 266// Carry bit. In the architecture this is really bit 0 of the XER register 267// (which really is SPR register 1); this is the only bit interesting to a 268// compiler. 269def CARRY: SPR<1, "xer">, DwarfRegNum<[76]> { 270 let Aliases = [XER]; 271} 272 273// FP rounding mode: bits 30 and 31 of the FP status and control register 274// This is not allocated as a normal register; it appears only in 275// Uses and Defs. The ABI says it needs to be preserved by a function, 276// but this is not achieved by saving and restoring it as with 277// most registers, it has to be done in code; to make this work all the 278// return and call instructions are described as Uses of RM, so instructions 279// that do nothing but change RM will not get deleted. 280def RM: PPCReg<"**ROUNDING MODE**">; 281 282/// Register classes 283// Allocate volatiles first 284// then nonvolatiles in reverse order since stmw/lmw save from rN to r31 285def GPRC : RegisterClass<"PPC", [i32,f32], 32, (add (sequence "R%u", 2, 12), 286 (sequence "R%u", 30, 13), 287 R31, R0, R1, FP, BP)> { 288 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 289 // put it at the end of the list. 290 let AltOrders = [(add (sub GPRC, R2), R2)]; 291 let AltOrderSelect = [{ 292 return MF.getSubtarget<PPCSubtarget>().is64BitELFABI(); 293 }]; 294} 295 296def G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12), 297 (sequence "X%u", 30, 14), 298 X31, X13, X0, X1, FP8, BP8)> { 299 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 300 // put it at the end of the list. 301 let AltOrders = [(add (sub G8RC, X2), X2)]; 302 let AltOrderSelect = [{ 303 return MF.getSubtarget<PPCSubtarget>().is64BitELFABI(); 304 }]; 305} 306 307// For some instructions r0 is special (representing the value 0 instead of 308// the value in the r0 register), and we use these register subclasses to 309// prevent r0 from being allocated for use by those instructions. 310def GPRC_NOR0 : RegisterClass<"PPC", [i32,f32], 32, (add (sub GPRC, R0), ZERO)> { 311 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 312 // put it at the end of the list. 313 let AltOrders = [(add (sub GPRC_NOR0, R2), R2)]; 314 let AltOrderSelect = [{ 315 return MF.getSubtarget<PPCSubtarget>().is64BitELFABI(); 316 }]; 317} 318 319def G8RC_NOX0 : RegisterClass<"PPC", [i64], 64, (add (sub G8RC, X0), ZERO8)> { 320 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 321 // put it at the end of the list. 322 let AltOrders = [(add (sub G8RC_NOX0, X2), X2)]; 323 let AltOrderSelect = [{ 324 return MF.getSubtarget<PPCSubtarget>().is64BitELFABI(); 325 }]; 326} 327 328def SPERC : RegisterClass<"PPC", [f64], 64, (add (sequence "S%u", 2, 12), 329 (sequence "S%u", 30, 13), 330 S31, S0, S1)>; 331 332// Allocate volatiles first, then non-volatiles in reverse order. With the SVR4 333// ABI the size of the Floating-point register save area is determined by the 334// allocated non-volatile register with the lowest register number, as FP 335// register N is spilled to offset 8 * (32 - N) below the back chain word of the 336// previous stack frame. By allocating non-volatiles in reverse order we make 337// sure that the Floating-point register save area is always as small as 338// possible because there aren't any unused spill slots. 339def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13), 340 (sequence "F%u", 31, 14))>; 341def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>; 342 343def VRRC : RegisterClass<"PPC", 344 [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32,v2f64, f128], 345 128, 346 (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11, 347 V12, V13, V14, V15, V16, V17, V18, V19, V31, V30, 348 V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>; 349 350// VSX register classes (the allocation order mirrors that of the corresponding 351// subregister classes). 352def VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 353 (add (sequence "VSL%u", 0, 13), 354 (sequence "VSL%u", 31, 14))>; 355def VSRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 356 (add VSLRC, VRRC)>; 357 358// Register classes for the 64-bit "scalar" VSX subregisters. 359def VFRC : RegisterClass<"PPC", [f64], 64, 360 (add VF2, VF3, VF4, VF5, VF0, VF1, VF6, VF7, 361 VF8, VF9, VF10, VF11, VF12, VF13, VF14, 362 VF15, VF16, VF17, VF18, VF19, VF31, VF30, 363 VF29, VF28, VF27, VF26, VF25, VF24, VF23, 364 VF22, VF21, VF20)>; 365def VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>; 366 367// Allow spilling GPR's into caller-saved VSR's. 368def SPILLTOVSRRC : RegisterClass<"PPC", [i64, f64], 64, (add G8RC, (sub VSFRC, 369 (sequence "VF%u", 31, 20), 370 (sequence "F%u", 31, 14)))>; 371 372// Register class for single precision scalars in VSX registers 373def VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>; 374 375def CRBITRC : RegisterClass<"PPC", [i1], 32, 376 (add CR2LT, CR2GT, CR2EQ, CR2UN, 377 CR3LT, CR3GT, CR3EQ, CR3UN, 378 CR4LT, CR4GT, CR4EQ, CR4UN, 379 CR5LT, CR5GT, CR5EQ, CR5UN, 380 CR6LT, CR6GT, CR6EQ, CR6UN, 381 CR7LT, CR7GT, CR7EQ, CR7UN, 382 CR1LT, CR1GT, CR1EQ, CR1UN, 383 CR0LT, CR0GT, CR0EQ, CR0UN)> { 384 let Size = 32; 385 let AltOrders = [(sub CRBITRC, CR2LT, CR2GT, CR2EQ, CR2UN, CR3LT, CR3GT, 386 CR3EQ, CR3UN, CR4LT, CR4GT, CR4EQ, CR4UN)]; 387 let AltOrderSelect = [{ 388 return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() && 389 MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled(); 390 }]; 391} 392 393def CRRC : RegisterClass<"PPC", [i32], 32, 394 (add CR0, CR1, CR5, CR6, 395 CR7, CR2, CR3, CR4)> { 396 let AltOrders = [(sub CRRC, CR2, CR3, CR4)]; 397 let AltOrderSelect = [{ 398 return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() && 399 MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled(); 400 }]; 401} 402// The CTR registers are not allocatable because they're used by the 403// decrement-and-branch instructions, and thus need to stay live across 404// multiple basic blocks. 405def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> { 406 let isAllocatable = 0; 407} 408def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> { 409 let isAllocatable = 0; 410} 411 412def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>; 413def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY, XER)> { 414 let CopyCost = -1; 415} 416 417let SubRegIndices = [sub_pair0, sub_pair1] in { 418 def ACC0 : ACC<0, "acc0", [VSRp0, VSRp1]>, DwarfRegNum<[0, 0]>; 419 def ACC1 : ACC<1, "acc1", [VSRp2, VSRp3]>, DwarfRegNum<[0, 0]>; 420 def ACC2 : ACC<2, "acc2", [VSRp4, VSRp5]>, DwarfRegNum<[0, 0]>; 421 def ACC3 : ACC<3, "acc3", [VSRp6, VSRp7]>, DwarfRegNum<[0, 0]>; 422 def ACC4 : ACC<4, "acc4", [VSRp8, VSRp9]>, DwarfRegNum<[0, 0]>; 423 def ACC5 : ACC<5, "acc5", [VSRp10, VSRp11]>, DwarfRegNum<[0, 0]>; 424 def ACC6 : ACC<6, "acc6", [VSRp12, VSRp13]>, DwarfRegNum<[0, 0]>; 425 def ACC7 : ACC<7, "acc7", [VSRp14, VSRp15]>, DwarfRegNum<[0, 0]>; 426} 427def ACCRC : RegisterClass<"PPC", [v512i1], 128, (add ACC0, ACC1, ACC2, ACC3, 428 ACC4, ACC5, ACC6, ACC7)> { 429 let Size = 512; 430} 431 432let SubRegIndices = [sub_pair0, sub_pair1] in { 433 def UACC0 : UACC<0, "acc0", [VSRp0, VSRp1]>, DwarfRegNum<[0, 0]>; 434 def UACC1 : UACC<1, "acc1", [VSRp2, VSRp3]>, DwarfRegNum<[0, 0]>; 435 def UACC2 : UACC<2, "acc2", [VSRp4, VSRp5]>, DwarfRegNum<[0, 0]>; 436 def UACC3 : UACC<3, "acc3", [VSRp6, VSRp7]>, DwarfRegNum<[0, 0]>; 437 def UACC4 : UACC<4, "acc4", [VSRp8, VSRp9]>, DwarfRegNum<[0, 0]>; 438 def UACC5 : UACC<5, "acc5", [VSRp10, VSRp11]>, DwarfRegNum<[0, 0]>; 439 def UACC6 : UACC<6, "acc6", [VSRp12, VSRp13]>, DwarfRegNum<[0, 0]>; 440 def UACC7 : UACC<7, "acc7", [VSRp14, VSRp15]>, DwarfRegNum<[0, 0]>; 441} 442def UACCRC : RegisterClass<"PPC", [v512i1], 128, 443 (add UACC0, UACC1, UACC2, UACC3, 444 UACC4, UACC5, UACC6, UACC7)> { 445 let Size = 512; 446} 447 448// Allocate in the same order as the underlying VSX registers. 449def VSRpRC : 450 RegisterClass<"PPC", [v256i1], 128, 451 (add (sequence "VSRp%u", 0, 6), 452 (sequence "VSRp%u", 15, 7), VSRp17, VSRp18, 453 VSRp16, VSRp19, VSRp20, VSRp21, VSRp22, VSRp23, 454 VSRp24, VSRp25, VSRp31, VSRp30, VSRp29, VSRp28, 455 VSRp27, VSRp26)> { 456 let Size = 256; 457} 458