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_32_hi_phony : SubRegIndex<32,32>; 19def sub_64 : SubRegIndex<64>; 20def sub_vsx0 : SubRegIndex<128>; 21def sub_vsx1 : SubRegIndex<128, 128>; 22def sub_gp8_x0 : SubRegIndex<64>; 23def sub_gp8_x1 : SubRegIndex<64, 64>; 24def sub_fp0 : SubRegIndex<64>; 25def sub_fp1 : SubRegIndex<64, 64>; 26} 27 28 29class PPCReg<string n> : Register<n> { 30 let Namespace = "PPC"; 31} 32 33// We identify all our registers with a 5-bit ID, for consistency's sake. 34 35// GPR - One of the 32 32-bit general-purpose registers 36class GPR<bits<5> num, string n> : PPCReg<n> { 37 let HWEncoding{4-0} = num; 38} 39 40// GP8 - One of the 32 64-bit general-purpose registers 41class GP8<GPR SubReg, string n> : PPCReg<n> { 42 let HWEncoding = SubReg.HWEncoding; 43 let SubRegs = [SubReg]; 44 let SubRegIndices = [sub_32]; 45} 46 47class SPE<string n, bits<5> Enc, list<Register> subregs = []> : PPCReg<n> { 48 let HWEncoding{4-0} = Enc; 49 let SubRegs = subregs; 50 let SubRegIndices = [sub_32, sub_32_hi_phony]; 51 let CoveredBySubRegs = 1; 52} 53// SPR - One of the 32-bit special-purpose registers 54class SPR<bits<10> num, string n> : PPCReg<n> { 55 let HWEncoding{9-0} = num; 56} 57 58// FPR - One of the 32 64-bit floating-point registers 59class FPR<bits<5> num, string n> : PPCReg<n> { 60 let HWEncoding{4-0} = num; 61} 62 63// FPPair - A pair of 64-bit floating-point registers. 64class FPPair<string n, bits<5> EvenIndex> : PPCReg<n> { 65 assert !eq(EvenIndex{0}, 0), "Index should be even."; 66 let HWEncoding{4-0} = EvenIndex; 67 let SubRegs = [!cast<FPR>("F"#EvenIndex), !cast<FPR>("F"#!add(EvenIndex, 1))]; 68 let DwarfNumbers = [-1, -1]; 69 let SubRegIndices = [sub_fp0, sub_fp1]; 70} 71 72// VF - One of the 32 64-bit floating-point subregisters of the vector 73// registers (used by VSX). 74class VF<bits<5> num, string n> : PPCReg<n> { 75 let HWEncoding{4-0} = num; 76 let HWEncoding{5} = 1; 77} 78 79// VR - One of the 32 128-bit vector registers 80class VR<VF SubReg, string n> : PPCReg<n> { 81 let HWEncoding{4-0} = SubReg.HWEncoding{4-0}; 82 let HWEncoding{5} = 0; 83 let SubRegs = [SubReg]; 84 let SubRegIndices = [sub_64]; 85} 86 87// VSRL - One of the 32 128-bit VSX registers that overlap with the scalar 88// floating-point registers. 89class VSRL<FPR SubReg, string n> : PPCReg<n> { 90 let HWEncoding = SubReg.HWEncoding; 91 let SubRegs = [SubReg]; 92 let SubRegIndices = [sub_64]; 93} 94 95// VSXReg - One of the VSX registers in the range vs32-vs63 with numbering 96// and encoding to match. 97class VSXReg<bits<6> num, string n> : PPCReg<n> { 98 let HWEncoding{5-0} = num; 99} 100 101// CR - One of the 8 4-bit condition registers 102class CR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 103 let HWEncoding{2-0} = num; 104 let SubRegs = subregs; 105} 106 107// CRBIT - One of the 32 1-bit condition register fields 108class CRBIT<bits<5> num, string n> : PPCReg<n> { 109 let HWEncoding{4-0} = num; 110} 111 112// VSR Pairs - One of the 32 paired even-odd consecutive VSRs. 113class VSRPair<bits<5> num, string n, list<Register> subregs> : PPCReg<n> { 114 let HWEncoding{4-0} = num; 115 let SubRegs = subregs; 116} 117 118// GP8Pair - Consecutive even-odd paired GP8. 119class GP8Pair<string n, bits<5> EvenIndex> : PPCReg<n> { 120 assert !eq(EvenIndex{0}, 0), "Index should be even."; 121 let HWEncoding{4-0} = EvenIndex; 122 let SubRegs = [!cast<GP8>("X"#EvenIndex), !cast<GP8>("X"#!add(EvenIndex, 1))]; 123 let DwarfNumbers = [-1, -1]; 124 let SubRegIndices = [sub_gp8_x0, sub_gp8_x1]; 125} 126 127// General-purpose registers 128foreach Index = 0-31 in { 129 def R#Index : GPR<Index, "r"#Index>, DwarfRegNum<[-2, Index]>; 130} 131 132let isArtificial = 1 in { 133 foreach Index = 0-31 in { 134 def H#Index : GPR<-1,"">; 135 } 136} 137 138// 64-bit General-purpose registers 139foreach Index = 0-31 in { 140 def X#Index : GP8<!cast<GPR>("R"#Index), "r"#Index>, 141 DwarfRegNum<[Index, -2]>; 142} 143 144// SPE registers 145foreach Index = 0-31 in { 146 def S#Index : SPE<"r"#Index, Index, [!cast<GPR>("R"#Index), !cast<GPR>("H"#Index)]>, 147 DwarfRegNum<[!add(Index, 1200), !add(Index, 1200)]>; 148 149} 150 151 152// Floating-point registers 153foreach Index = 0-31 in { 154 def F#Index : FPR<Index, "f"#Index>, 155 DwarfRegNum<[!add(Index, 32), !add(Index, 32)]>; 156} 157 158// Floating-point pair registers 159foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 160 def Fpair#Index : FPPair<"fp"#Index, Index>; 161} 162 163// 64-bit Floating-point subregisters of Altivec registers 164// Note: the register names are v0-v31 or vs32-vs63 depending on the use. 165// Custom C++ code is used to produce the correct name and encoding. 166foreach Index = 0-31 in { 167 def VF#Index : VF<Index, "v" #Index>, 168 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>; 169} 170 171// Vector registers 172foreach Index = 0-31 in { 173 def V#Index : VR<!cast<VF>("VF"#Index), "v"#Index>, 174 DwarfRegNum<[!add(Index, 77), !add(Index, 77)]>; 175} 176 177// VSX registers 178foreach Index = 0-31 in { 179 def VSL#Index : VSRL<!cast<FPR>("F"#Index), "vs"#Index>, 180 DwarfRegAlias<!cast<FPR>("F"#Index)>; 181} 182 183// Dummy VSX registers, this defines string: "vs32"-"vs63", and is only used for 184// asm printing. 185foreach Index = 32-63 in { 186 def VSX#Index : VSXReg<Index, "vs"#Index>; 187} 188 189let SubRegIndices = [sub_vsx0, sub_vsx1] in { 190 // VSR pairs 0 - 15 (corresponding to VSRs 0 - 30 paired with 1 - 31). 191 foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 192 def VSRp#!srl(Index, 1) : VSRPair<!srl(Index, 1), "vsp"#Index, 193 [!cast<VSRL>("VSL"#Index), !cast<VSRL>("VSL"#!add(Index, 1))]>, 194 DwarfRegNum<[-1, -1]>; 195 } 196 197 // VSR pairs 16 - 31 (corresponding to VSRs 32 - 62 paired with 33 - 63). 198 foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 199 def VSRp#!add(!srl(Index, 1), 16) : 200 VSRPair<!add(!srl(Index, 1), 16), "vsp"#!add(Index, 32), 201 [!cast<VR>("V"#Index), !cast<VR>("V"#!add(Index, 1))]>, 202 DwarfRegNum<[-1, -1]>; 203 } 204} 205 206// 16 paired even-odd consecutive GP8s. 207foreach Index = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 } in { 208 def G8p#!srl(Index, 1) : GP8Pair<"r"#Index, Index>; 209} 210 211// The representation of r0 when treated as the constant 0. 212let isConstant = true in { 213def ZERO : GPR<0, "0">, DwarfRegAlias<R0>; 214def ZERO8 : GP8<ZERO, "0">, DwarfRegAlias<X0>; 215} // isConstant = true 216 217// Representations of the frame pointer used by ISD::FRAMEADDR. 218def FP : GPR<0 /* arbitrary */, "**FRAME POINTER**">; 219def FP8 : GP8<FP, "**FRAME POINTER**">; 220 221// Representations of the base pointer used by setjmp. 222def BP : GPR<0 /* arbitrary */, "**BASE POINTER**">; 223def BP8 : GP8<BP, "**BASE POINTER**">; 224 225// Condition register bits 226def CR0LT : CRBIT< 0, "0">; 227def CR0GT : CRBIT< 1, "1">; 228def CR0EQ : CRBIT< 2, "2">; 229def CR0UN : CRBIT< 3, "3">; 230def CR1LT : CRBIT< 4, "4">; 231def CR1GT : CRBIT< 5, "5">; 232def CR1EQ : CRBIT< 6, "6">; 233def CR1UN : CRBIT< 7, "7">; 234def CR2LT : CRBIT< 8, "8">; 235def CR2GT : CRBIT< 9, "9">; 236def CR2EQ : CRBIT<10, "10">; 237def CR2UN : CRBIT<11, "11">; 238def CR3LT : CRBIT<12, "12">; 239def CR3GT : CRBIT<13, "13">; 240def CR3EQ : CRBIT<14, "14">; 241def CR3UN : CRBIT<15, "15">; 242def CR4LT : CRBIT<16, "16">; 243def CR4GT : CRBIT<17, "17">; 244def CR4EQ : CRBIT<18, "18">; 245def CR4UN : CRBIT<19, "19">; 246def CR5LT : CRBIT<20, "20">; 247def CR5GT : CRBIT<21, "21">; 248def CR5EQ : CRBIT<22, "22">; 249def CR5UN : CRBIT<23, "23">; 250def CR6LT : CRBIT<24, "24">; 251def CR6GT : CRBIT<25, "25">; 252def CR6EQ : CRBIT<26, "26">; 253def CR6UN : CRBIT<27, "27">; 254def CR7LT : CRBIT<28, "28">; 255def CR7GT : CRBIT<29, "29">; 256def CR7EQ : CRBIT<30, "30">; 257def CR7UN : CRBIT<31, "31">; 258 259// Condition registers 260let SubRegIndices = [sub_lt, sub_gt, sub_eq, sub_un] in { 261def CR0 : CR<0, "cr0", [CR0LT, CR0GT, CR0EQ, CR0UN]>, DwarfRegNum<[68, 68]>; 262def CR1 : CR<1, "cr1", [CR1LT, CR1GT, CR1EQ, CR1UN]>, DwarfRegNum<[69, 69]>; 263def CR2 : CR<2, "cr2", [CR2LT, CR2GT, CR2EQ, CR2UN]>, DwarfRegNum<[70, 70]>; 264def CR3 : CR<3, "cr3", [CR3LT, CR3GT, CR3EQ, CR3UN]>, DwarfRegNum<[71, 71]>; 265def CR4 : CR<4, "cr4", [CR4LT, CR4GT, CR4EQ, CR4UN]>, DwarfRegNum<[72, 72]>; 266def CR5 : CR<5, "cr5", [CR5LT, CR5GT, CR5EQ, CR5UN]>, DwarfRegNum<[73, 73]>; 267def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>; 268def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>; 269} 270 271// Link register 272def LR : SPR<8, "lr">, DwarfRegNum<[-2, 65]>; 273//let Aliases = [LR] in 274def LR8 : SPR<8, "lr">, DwarfRegNum<[65, -2]>; 275 276// Count register 277def CTR : SPR<9, "ctr">, DwarfRegNum<[-2, 66]>; 278def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66, -2]>; 279 280// VRsave register 281def VRSAVE: SPR<256, "vrsave">, DwarfRegNum<[109]>; 282 283// SPE extra registers 284def SPEFSCR: SPR<512, "spefscr">, DwarfRegNum<[612, 112]>; 285 286def XER: SPR<1, "xer">, DwarfRegNum<[76]>; 287 288// Carry bit. In the architecture this is really bit 0 of the XER register 289// (which really is SPR register 1); this is the only bit interesting to a 290// compiler. 291def CARRY: SPR<1, "xer">, DwarfRegNum<[76]> { 292 let Aliases = [XER]; 293} 294 295// FP rounding mode: bits 30 and 31 of the FP status and control register 296// This is not allocated as a normal register; it appears only in 297// Uses and Defs. The ABI says it needs to be preserved by a function, 298// but this is not achieved by saving and restoring it as with 299// most registers, it has to be done in code; to make this work all the 300// return and call instructions are described as Uses of RM, so instructions 301// that do nothing but change RM will not get deleted. 302def RM: PPCReg<"**ROUNDING MODE**">; 303 304let isAllocatable = 0 in 305def GPRC32 : RegisterClass<"PPC", [i32,f32], 32, (add (sequence "H%u", 2, 12), 306 (sequence "H%u", 30, 13), 307 H31, H0, H1)>; 308 309/// Register classes 310// Allocate volatiles first 311// then nonvolatiles in reverse order since stmw/lmw save from rN to r31 312def GPRC : RegisterClass<"PPC", [i32,f32], 32, (add (sequence "R%u", 2, 12), 313 (sequence "R%u", 30, 13), 314 R31, R0, R1, FP, BP)> { 315 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 316 // put it at the end of the list. 317 // On AIX, CSRs are allocated starting from R31 according to: 318 // https://www.ibm.com/docs/en/ssw_aix_72/assembler/assembler_pdf.pdf. 319 // This also helps setting the correct `NumOfGPRsSaved' in traceback table. 320 let AltOrders = [(add (sub GPRC, R2), R2), 321 (add (sequence "R%u", 2, 12), 322 (sequence "R%u", 31, 13), R0, R1, FP, BP)]; 323 let AltOrderSelect = [{ 324 return MF.getSubtarget<PPCSubtarget>().getGPRAllocationOrderIdx(); 325 }]; 326} 327 328def G8RC : RegisterClass<"PPC", [i64], 64, (add (sequence "X%u", 2, 12), 329 (sequence "X%u", 30, 14), 330 X31, X13, X0, X1, FP8, BP8)> { 331 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 332 // put it at the end of the list. 333 let AltOrders = [(add (sub G8RC, X2), X2), 334 (add (sequence "X%u", 2, 12), 335 (sequence "X%u", 31, 13), X0, X1, FP8, BP8)]; 336 let AltOrderSelect = [{ 337 return MF.getSubtarget<PPCSubtarget>().getGPRAllocationOrderIdx(); 338 }]; 339} 340 341// For some instructions r0 is special (representing the value 0 instead of 342// the value in the r0 register), and we use these register subclasses to 343// prevent r0 from being allocated for use by those instructions. 344def GPRC_NOR0 : RegisterClass<"PPC", [i32,f32], 32, (add (sub GPRC, R0), ZERO)> { 345 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 346 // put it at the end of the list. 347 let AltOrders = [(add (sub GPRC_NOR0, R2), R2), 348 (add (sequence "R%u", 2, 12), 349 (sequence "R%u", 31, 13), R1, FP, BP, ZERO)]; 350 let AltOrderSelect = [{ 351 return MF.getSubtarget<PPCSubtarget>().getGPRAllocationOrderIdx(); 352 }]; 353} 354 355def G8RC_NOX0 : RegisterClass<"PPC", [i64], 64, (add (sub G8RC, X0), ZERO8)> { 356 // On non-Darwin PPC64 systems, R2 can be allocated, but must be restored, so 357 // put it at the end of the list. 358 let AltOrders = [(add (sub G8RC_NOX0, X2), X2), 359 (add (sequence "X%u", 2, 12), 360 (sequence "X%u", 31, 13), X1, FP8, BP8, ZERO8)]; 361 let AltOrderSelect = [{ 362 return MF.getSubtarget<PPCSubtarget>().getGPRAllocationOrderIdx(); 363 }]; 364} 365 366def SPERC : RegisterClass<"PPC", [f64], 64, (add (sequence "S%u", 2, 12), 367 (sequence "S%u", 30, 13), 368 S31, S0, S1)>; 369 370// Allocate volatiles first, then non-volatiles in reverse order. With the SVR4 371// ABI the size of the Floating-point register save area is determined by the 372// allocated non-volatile register with the lowest register number, as FP 373// register N is spilled to offset 8 * (32 - N) below the back chain word of the 374// previous stack frame. By allocating non-volatiles in reverse order we make 375// sure that the Floating-point register save area is always as small as 376// possible because there aren't any unused spill slots. 377def F8RC : RegisterClass<"PPC", [f64], 64, (add (sequence "F%u", 0, 13), 378 (sequence "F%u", 31, 14))>; 379def F4RC : RegisterClass<"PPC", [f32], 32, (add F8RC)>; 380 381// Floating point pair registers. 382// Note that the type used for this register class is ppcf128. This is not 383// completely correct. However, since we are not pattern matching any 384// instructions for these registers and we are not register allocating or 385// scheduling any of these instructions it should be safe to do this. 386// The reason we didn't use the correct type (Decimal Floating Point) is that 387// at the time of this implementation the correct type was not available. 388def FpRC : 389 RegisterClass<"PPC", [ppcf128], 128, 390 (add Fpair0, Fpair2, Fpair4, Fpair6, Fpair8, Fpair10, Fpair12, 391 Fpair14, Fpair16, Fpair18, Fpair20, Fpair22, Fpair24, 392 Fpair26, Fpair28, Fpair30)> { 393 let Size = 128; 394} 395 396def VRRC : RegisterClass<"PPC", 397 [v16i8,v8i16,v4i32,v2i64,v1i128,v4f32,v2f64, f128], 398 128, 399 (add V2, V3, V4, V5, V0, V1, V6, V7, V8, V9, V10, V11, 400 V12, V13, V14, V15, V16, V17, V18, V19, V31, V30, 401 V29, V28, V27, V26, V25, V24, V23, V22, V21, V20)>; 402 403// VSX register classes (the allocation order mirrors that of the corresponding 404// subregister classes). 405def VSLRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 406 (add (sequence "VSL%u", 0, 13), 407 (sequence "VSL%u", 31, 14))>; 408def VSRC : RegisterClass<"PPC", [v4i32,v4f32,v2f64,v2i64], 128, 409 (add VSLRC, VRRC)>; 410 411// Register classes for the 64-bit "scalar" VSX subregisters. 412def VFRC : RegisterClass<"PPC", [f64], 64, 413 (add VF2, VF3, VF4, VF5, VF0, VF1, VF6, VF7, 414 VF8, VF9, VF10, VF11, VF12, VF13, VF14, 415 VF15, VF16, VF17, VF18, VF19, VF31, VF30, 416 VF29, VF28, VF27, VF26, VF25, VF24, VF23, 417 VF22, VF21, VF20)>; 418def VSFRC : RegisterClass<"PPC", [f64], 64, (add F8RC, VFRC)>; 419 420// Allow spilling GPR's into caller-saved VSR's. 421def SPILLTOVSRRC : RegisterClass<"PPC", [i64, f64], 64, (add G8RC, (sub VSFRC, 422 (sequence "VF%u", 31, 20), 423 (sequence "F%u", 31, 14)))>; 424 425// Register class for single precision scalars in VSX registers 426def VSSRC : RegisterClass<"PPC", [f32], 32, (add VSFRC)>; 427 428def CRBITRC : RegisterClass<"PPC", [i1], 32, 429 (add CR2LT, CR2GT, CR2EQ, CR2UN, 430 CR3LT, CR3GT, CR3EQ, CR3UN, 431 CR4LT, CR4GT, CR4EQ, CR4UN, 432 CR5LT, CR5GT, CR5EQ, CR5UN, 433 CR6LT, CR6GT, CR6EQ, CR6UN, 434 CR7LT, CR7GT, CR7EQ, CR7UN, 435 CR1LT, CR1GT, CR1EQ, CR1UN, 436 CR0LT, CR0GT, CR0EQ, CR0UN)> { 437 let Size = 32; 438 let AltOrders = [(sub CRBITRC, CR2LT, CR2GT, CR2EQ, CR2UN, CR3LT, CR3GT, 439 CR3EQ, CR3UN, CR4LT, CR4GT, CR4EQ, CR4UN)]; 440 let AltOrderSelect = [{ 441 return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() && 442 MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled(); 443 }]; 444} 445 446def CRRC : RegisterClass<"PPC", [i32], 32, 447 (add CR0, CR1, CR5, CR6, 448 CR7, CR2, CR3, CR4)> { 449 let AltOrders = [(sub CRRC, CR2, CR3, CR4)]; 450 let AltOrderSelect = [{ 451 return MF.getSubtarget<PPCSubtarget>().isELFv2ABI() && 452 MF.getInfo<PPCFunctionInfo>()->isNonVolatileCRDisabled(); 453 }]; 454} 455// The CTR registers are not allocatable because they're used by the 456// decrement-and-branch instructions, and thus need to stay live across 457// multiple basic blocks. 458def CTRRC : RegisterClass<"PPC", [i32], 32, (add CTR)> { 459 let isAllocatable = 0; 460} 461def CTRRC8 : RegisterClass<"PPC", [i64], 64, (add CTR8)> { 462 let isAllocatable = 0; 463} 464 465def LRRC : RegisterClass<"PPC", [i32], 32, (add LR)> { 466 let isAllocatable = 0; 467} 468def LR8RC : RegisterClass<"PPC", [i64], 64, (add LR8)> { 469 let isAllocatable = 0; 470} 471 472def VRSAVERC : RegisterClass<"PPC", [i32], 32, (add VRSAVE)>; 473def CARRYRC : RegisterClass<"PPC", [i32], 32, (add CARRY, XER)> { 474 let CopyCost = -1; 475} 476 477// Make AllocationOrder as similar as G8RC's to avoid potential spilling. 478// Similarly, we have an AltOrder for 64-bit ELF ABI which r2 is allocated 479// at last. 480def G8pRC : 481 RegisterClass<"PPC", [i128], 128, 482 (add (sequence "G8p%u", 1, 5), 483 (sequence "G8p%u", 14, 7), 484 G8p15, G8p6, G8p0)> { 485 let AltOrders = [(add (sub G8pRC, G8p1), G8p1)]; 486 let AltOrderSelect = [{ 487 return MF.getSubtarget<PPCSubtarget>().is64BitELFABI(); 488 }]; 489 let Size = 128; 490} 491 492include "PPCRegisterInfoMMA.td" 493include "PPCRegisterInfoDMR.td" 494 495//===----------------------------------------------------------------------===// 496// PowerPC Operand Definitions. 497 498// In the default PowerPC assembler syntax, registers are specified simply 499// by number, so they cannot be distinguished from immediate values (without 500// looking at the opcode). This means that the default operand matching logic 501// for the asm parser does not work, and we need to specify custom matchers. 502// Since those can only be specified with RegisterOperand classes and not 503// directly on the RegisterClass, all instructions patterns used by the asm 504// parser need to use a RegisterOperand (instead of a RegisterClass) for 505// all their register operands. 506// For this purpose, we define one RegisterOperand for each RegisterClass, 507// using the same name as the class, just in lower case. 508 509def PPCRegGPRCAsmOperand : AsmOperandClass { 510 let Name = "RegGPRC"; let PredicateMethod = "isRegNumber"; 511} 512def gprc : RegisterOperand<GPRC> { 513 let ParserMatchClass = PPCRegGPRCAsmOperand; 514} 515def PPCRegG8RCAsmOperand : AsmOperandClass { 516 let Name = "RegG8RC"; let PredicateMethod = "isRegNumber"; 517} 518def g8rc : RegisterOperand<G8RC> { 519 let ParserMatchClass = PPCRegG8RCAsmOperand; 520} 521def PPCRegG8pRCAsmOperand : AsmOperandClass { 522 let Name = "RegG8pRC"; let PredicateMethod = "isEvenRegNumber"; 523} 524def g8prc : RegisterOperand<G8pRC> { 525 let ParserMatchClass = PPCRegG8pRCAsmOperand; 526} 527def PPCRegGPRCNoR0AsmOperand : AsmOperandClass { 528 let Name = "RegGPRCNoR0"; let PredicateMethod = "isRegNumber"; 529} 530def gprc_nor0 : RegisterOperand<GPRC_NOR0> { 531 let ParserMatchClass = PPCRegGPRCNoR0AsmOperand; 532} 533def PPCRegG8RCNoX0AsmOperand : AsmOperandClass { 534 let Name = "RegG8RCNoX0"; let PredicateMethod = "isRegNumber"; 535} 536def g8rc_nox0 : RegisterOperand<G8RC_NOX0> { 537 let ParserMatchClass = PPCRegG8RCNoX0AsmOperand; 538} 539def PPCRegF8RCAsmOperand : AsmOperandClass { 540 let Name = "RegF8RC"; let PredicateMethod = "isRegNumber"; 541} 542def f8rc : RegisterOperand<F8RC> { 543 let ParserMatchClass = PPCRegF8RCAsmOperand; 544} 545def PPCRegF4RCAsmOperand : AsmOperandClass { 546 let Name = "RegF4RC"; let PredicateMethod = "isRegNumber"; 547} 548def f4rc : RegisterOperand<F4RC> { 549 let ParserMatchClass = PPCRegF4RCAsmOperand; 550} 551def PPCRegFpRCAsmOperand : AsmOperandClass { 552 let Name = "RegFpRC"; let PredicateMethod = "isEvenRegNumber"; 553} 554def fpairrc : RegisterOperand<FpRC> { 555 let ParserMatchClass = PPCRegFpRCAsmOperand; 556} 557def PPCRegVRRCAsmOperand : AsmOperandClass { 558 let Name = "RegVRRC"; let PredicateMethod = "isRegNumber"; 559} 560def vrrc : RegisterOperand<VRRC> { 561 let ParserMatchClass = PPCRegVRRCAsmOperand; 562} 563def PPCRegVFRCAsmOperand : AsmOperandClass { 564 let Name = "RegVFRC"; let PredicateMethod = "isRegNumber"; 565} 566def vfrc : RegisterOperand<VFRC> { 567 let ParserMatchClass = PPCRegVFRCAsmOperand; 568} 569def PPCRegCRBITRCAsmOperand : AsmOperandClass { 570 let Name = "RegCRBITRC"; let PredicateMethod = "isCRBitNumber"; 571} 572def crbitrc : RegisterOperand<CRBITRC> { 573 let ParserMatchClass = PPCRegCRBITRCAsmOperand; 574} 575def PPCRegCRRCAsmOperand : AsmOperandClass { 576 let Name = "RegCRRC"; let PredicateMethod = "isCCRegNumber"; 577} 578def crrc : RegisterOperand<CRRC> { 579 let ParserMatchClass = PPCRegCRRCAsmOperand; 580} 581def PPCRegSPERCAsmOperand : AsmOperandClass { 582 let Name = "RegSPERC"; let PredicateMethod = "isRegNumber"; 583} 584def sperc : RegisterOperand<SPERC> { 585 let ParserMatchClass = PPCRegSPERCAsmOperand; 586} 587def PPCRegSPE4RCAsmOperand : AsmOperandClass { 588 let Name = "RegSPE4RC"; let PredicateMethod = "isRegNumber"; 589} 590def spe4rc : RegisterOperand<GPRC> { 591 let ParserMatchClass = PPCRegSPE4RCAsmOperand; 592} 593 594def PPCU1ImmAsmOperand : AsmOperandClass { 595 let Name = "U1Imm"; let PredicateMethod = "isU1Imm"; 596 let RenderMethod = "addImmOperands"; 597} 598def u1imm : Operand<i32> { 599 let PrintMethod = "printU1ImmOperand"; 600 let ParserMatchClass = PPCU1ImmAsmOperand; 601 let DecoderMethod = "decodeUImmOperand<1>"; 602 let OperandType = "OPERAND_IMMEDIATE"; 603} 604 605def PPCU2ImmAsmOperand : AsmOperandClass { 606 let Name = "U2Imm"; let PredicateMethod = "isU2Imm"; 607 let RenderMethod = "addImmOperands"; 608} 609def u2imm : Operand<i32> { 610 let PrintMethod = "printU2ImmOperand"; 611 let ParserMatchClass = PPCU2ImmAsmOperand; 612 let DecoderMethod = "decodeUImmOperand<2>"; 613 let OperandType = "OPERAND_IMMEDIATE"; 614} 615 616def PPCATBitsAsHintAsmOperand : AsmOperandClass { 617 let Name = "ATBitsAsHint"; let PredicateMethod = "isATBitsAsHint"; 618 let RenderMethod = "addImmOperands"; // Irrelevant, predicate always fails. 619} 620def atimm : Operand<i32> { 621 let PrintMethod = "printATBitsAsHint"; 622 let ParserMatchClass = PPCATBitsAsHintAsmOperand; 623 let OperandType = "OPERAND_IMMEDIATE"; 624} 625 626def PPCU3ImmAsmOperand : AsmOperandClass { 627 let Name = "U3Imm"; let PredicateMethod = "isU3Imm"; 628 let RenderMethod = "addImmOperands"; 629} 630def u3imm : Operand<i32> { 631 let PrintMethod = "printU3ImmOperand"; 632 let ParserMatchClass = PPCU3ImmAsmOperand; 633 let DecoderMethod = "decodeUImmOperand<3>"; 634 let OperandType = "OPERAND_IMMEDIATE"; 635} 636 637def PPCU4ImmAsmOperand : AsmOperandClass { 638 let Name = "U4Imm"; let PredicateMethod = "isU4Imm"; 639 let RenderMethod = "addImmOperands"; 640} 641def u4imm : Operand<i32> { 642 let PrintMethod = "printU4ImmOperand"; 643 let ParserMatchClass = PPCU4ImmAsmOperand; 644 let DecoderMethod = "decodeUImmOperand<4>"; 645 let OperandType = "OPERAND_IMMEDIATE"; 646} 647def PPCS5ImmAsmOperand : AsmOperandClass { 648 let Name = "S5Imm"; let PredicateMethod = "isS5Imm"; 649 let RenderMethod = "addImmOperands"; 650} 651def s5imm : Operand<i32> { 652 let PrintMethod = "printS5ImmOperand"; 653 let ParserMatchClass = PPCS5ImmAsmOperand; 654 let DecoderMethod = "decodeSImmOperand<5>"; 655 let OperandType = "OPERAND_IMMEDIATE"; 656} 657def PPCU5ImmAsmOperand : AsmOperandClass { 658 let Name = "U5Imm"; let PredicateMethod = "isU5Imm"; 659 let RenderMethod = "addImmOperands"; 660} 661def u5imm : Operand<i32> { 662 let PrintMethod = "printU5ImmOperand"; 663 let ParserMatchClass = PPCU5ImmAsmOperand; 664 let DecoderMethod = "decodeUImmOperand<5>"; 665 let OperandType = "OPERAND_IMMEDIATE"; 666} 667def PPCU6ImmAsmOperand : AsmOperandClass { 668 let Name = "U6Imm"; let PredicateMethod = "isU6Imm"; 669 let RenderMethod = "addImmOperands"; 670} 671def u6imm : Operand<i32> { 672 let PrintMethod = "printU6ImmOperand"; 673 let ParserMatchClass = PPCU6ImmAsmOperand; 674 let DecoderMethod = "decodeUImmOperand<6>"; 675 let OperandType = "OPERAND_IMMEDIATE"; 676} 677def PPCU7ImmAsmOperand : AsmOperandClass { 678 let Name = "U7Imm"; let PredicateMethod = "isU7Imm"; 679 let RenderMethod = "addImmOperands"; 680} 681def u7imm : Operand<i32> { 682 let PrintMethod = "printU7ImmOperand"; 683 let ParserMatchClass = PPCU7ImmAsmOperand; 684 let DecoderMethod = "decodeUImmOperand<7>"; 685 let OperandType = "OPERAND_IMMEDIATE"; 686} 687def PPCU8ImmAsmOperand : AsmOperandClass { 688 let Name = "U8Imm"; let PredicateMethod = "isU8Imm"; 689 let RenderMethod = "addImmOperands"; 690} 691def u8imm : Operand<i32> { 692 let PrintMethod = "printU8ImmOperand"; 693 let ParserMatchClass = PPCU8ImmAsmOperand; 694 let DecoderMethod = "decodeUImmOperand<8>"; 695 let OperandType = "OPERAND_IMMEDIATE"; 696} 697def PPCU10ImmAsmOperand : AsmOperandClass { 698 let Name = "U10Imm"; let PredicateMethod = "isU10Imm"; 699 let RenderMethod = "addImmOperands"; 700} 701def u10imm : Operand<i32> { 702 let PrintMethod = "printU10ImmOperand"; 703 let ParserMatchClass = PPCU10ImmAsmOperand; 704 let DecoderMethod = "decodeUImmOperand<10>"; 705 let OperandType = "OPERAND_IMMEDIATE"; 706} 707def PPCU12ImmAsmOperand : AsmOperandClass { 708 let Name = "U12Imm"; let PredicateMethod = "isU12Imm"; 709 let RenderMethod = "addImmOperands"; 710} 711def u12imm : Operand<i32> { 712 let PrintMethod = "printU12ImmOperand"; 713 let ParserMatchClass = PPCU12ImmAsmOperand; 714 let DecoderMethod = "decodeUImmOperand<12>"; 715 let OperandType = "OPERAND_IMMEDIATE"; 716} 717def PPCS16ImmAsmOperand : AsmOperandClass { 718 let Name = "S16Imm"; let PredicateMethod = "isS16Imm"; 719 let RenderMethod = "addS16ImmOperands"; 720} 721def s16imm : Operand<i32> { 722 let PrintMethod = "printS16ImmOperand"; 723 let EncoderMethod = "getImm16Encoding"; 724 let ParserMatchClass = PPCS16ImmAsmOperand; 725 let DecoderMethod = "decodeSImmOperand<16>"; 726 let OperandType = "OPERAND_IMMEDIATE"; 727} 728def PPCU16ImmAsmOperand : AsmOperandClass { 729 let Name = "U16Imm"; let PredicateMethod = "isU16Imm"; 730 let RenderMethod = "addU16ImmOperands"; 731} 732def u16imm : Operand<i32> { 733 let PrintMethod = "printU16ImmOperand"; 734 let EncoderMethod = "getImm16Encoding"; 735 let ParserMatchClass = PPCU16ImmAsmOperand; 736 let DecoderMethod = "decodeUImmOperand<16>"; 737 let OperandType = "OPERAND_IMMEDIATE"; 738} 739def PPCS17ImmAsmOperand : AsmOperandClass { 740 let Name = "S17Imm"; let PredicateMethod = "isS17Imm"; 741 let RenderMethod = "addS16ImmOperands"; 742} 743def s17imm : Operand<i32> { 744 // This operand type is used for addis/lis to allow the assembler parser 745 // to accept immediates in the range -65536..65535 for compatibility with 746 // the GNU assembler. The operand is treated as 16-bit otherwise. 747 let PrintMethod = "printS16ImmOperand"; 748 let EncoderMethod = "getImm16Encoding"; 749 let ParserMatchClass = PPCS17ImmAsmOperand; 750 let DecoderMethod = "decodeSImmOperand<16>"; 751 let OperandType = "OPERAND_IMMEDIATE"; 752} 753def PPCS34ImmAsmOperand : AsmOperandClass { 754 let Name = "S34Imm"; 755 let PredicateMethod = "isS34Imm"; 756 let RenderMethod = "addImmOperands"; 757} 758def s34imm : Operand<i64> { 759 let PrintMethod = "printS34ImmOperand"; 760 let EncoderMethod = "getImm34EncodingNoPCRel"; 761 let ParserMatchClass = PPCS34ImmAsmOperand; 762 let DecoderMethod = "decodeSImmOperand<34>"; 763 let OperandType = "OPERAND_IMMEDIATE"; 764} 765def s34imm_pcrel : Operand<i64> { 766 let PrintMethod = "printS34ImmOperand"; 767 let EncoderMethod = "getImm34EncodingPCRel"; 768 let ParserMatchClass = PPCS34ImmAsmOperand; 769 let DecoderMethod = "decodeSImmOperand<34>"; 770 let OperandType = "OPERAND_IMMEDIATE"; 771} 772def PPCImmZeroAsmOperand : AsmOperandClass { 773 let Name = "ImmZero"; 774 let PredicateMethod = "isImmZero"; 775 let RenderMethod = "addImmOperands"; 776} 777def immZero : Operand<i32> { 778 let PrintMethod = "printImmZeroOperand"; 779 let ParserMatchClass = PPCImmZeroAsmOperand; 780 let DecoderMethod = "decodeImmZeroOperand"; 781 let OperandType = "OPERAND_IMMEDIATE"; 782} 783 784def fpimm0 : PatLeaf<(fpimm), [{ return N->isExactlyValue(+0.0); }]>; 785def fpimm0neg : PatLeaf<(fpimm), [{return N->isExactlyValue(-0.0);}]>; 786 787def PPCDirectBrAsmOperand : AsmOperandClass { 788 let Name = "DirectBr"; let PredicateMethod = "isDirectBr"; 789 let RenderMethod = "addBranchTargetOperands"; 790} 791def directbrtarget : Operand<OtherVT> { 792 let PrintMethod = "printBranchOperand"; 793 let EncoderMethod = "getDirectBrEncoding"; 794 let DecoderMethod = "decodeDirectBrTarget"; 795 let ParserMatchClass = PPCDirectBrAsmOperand; 796 let OperandType = "OPERAND_PCREL"; 797} 798def absdirectbrtarget : Operand<OtherVT> { 799 let PrintMethod = "printAbsBranchOperand"; 800 let EncoderMethod = "getAbsDirectBrEncoding"; 801 let DecoderMethod = "decodeDirectBrTarget"; 802 let ParserMatchClass = PPCDirectBrAsmOperand; 803} 804def PPCCondBrAsmOperand : AsmOperandClass { 805 let Name = "CondBr"; let PredicateMethod = "isCondBr"; 806 let RenderMethod = "addBranchTargetOperands"; 807} 808def condbrtarget : Operand<OtherVT> { 809 let PrintMethod = "printBranchOperand"; 810 let EncoderMethod = "getCondBrEncoding"; 811 let DecoderMethod = "decodeCondBrTarget"; 812 let ParserMatchClass = PPCCondBrAsmOperand; 813 let OperandType = "OPERAND_PCREL"; 814} 815def abscondbrtarget : Operand<OtherVT> { 816 let PrintMethod = "printAbsBranchOperand"; 817 let EncoderMethod = "getAbsCondBrEncoding"; 818 let DecoderMethod = "decodeCondBrTarget"; 819 let ParserMatchClass = PPCCondBrAsmOperand; 820} 821def calltarget : Operand<iPTR> { 822 let PrintMethod = "printBranchOperand"; 823 let EncoderMethod = "getDirectBrEncoding"; 824 let DecoderMethod = "decodeDirectBrTarget"; 825 let ParserMatchClass = PPCDirectBrAsmOperand; 826 let OperandType = "OPERAND_PCREL"; 827} 828def abscalltarget : Operand<iPTR> { 829 let PrintMethod = "printAbsBranchOperand"; 830 let EncoderMethod = "getAbsDirectBrEncoding"; 831 let DecoderMethod = "decodeDirectBrTarget"; 832 let ParserMatchClass = PPCDirectBrAsmOperand; 833} 834def PPCCRBitMaskOperand : AsmOperandClass { 835 let Name = "CRBitMask"; let PredicateMethod = "isCRBitMask"; 836} 837def crbitm: Operand<i8> { 838 let PrintMethod = "printcrbitm"; 839 let EncoderMethod = "get_crbitm_encoding"; 840 let DecoderMethod = "decodeCRBitMOperand"; 841 let ParserMatchClass = PPCCRBitMaskOperand; 842} 843// Address operands 844// A version of ptr_rc which excludes R0 (or X0 in 64-bit mode). 845def PPCRegGxRCNoR0Operand : AsmOperandClass { 846 let Name = "RegGxRCNoR0"; let PredicateMethod = "isRegNumber"; 847} 848def ptr_rc_nor0 : Operand<iPTR>, PointerLikeRegClass<1> { 849 let ParserMatchClass = PPCRegGxRCNoR0Operand; 850} 851 852// New addressing modes with 34 bit immediates. 853def PPCDispRI34Operand : AsmOperandClass { 854 let Name = "DispRI34"; let PredicateMethod = "isS34Imm"; 855 let RenderMethod = "addImmOperands"; 856} 857def dispRI34 : Operand<iPTR> { 858 let ParserMatchClass = PPCDispRI34Operand; 859 let EncoderMethod = "getDispRI34Encoding"; 860 let DecoderMethod = "decodeSImmOperand<34>"; 861} 862def dispRI34_pcrel : Operand<iPTR> { 863 let ParserMatchClass = PPCDispRI34Operand; 864 let EncoderMethod = "getDispRI34PCRelEncoding"; 865 let DecoderMethod = "decodeSImmOperand<34>"; 866} 867def memri34 : Operand<iPTR> { // memri, imm is a 34-bit value. 868 let PrintMethod = "printMemRegImm34"; 869 let MIOperandInfo = (ops dispRI34:$imm, ptr_rc_nor0:$reg); 870} 871// memri, imm is a 34-bit value for pc-relative instructions where 872// base register is set to zero. 873def memri34_pcrel : Operand<iPTR> { // memri, imm is a 34-bit value. 874 let PrintMethod = "printMemRegImm34PCRel"; 875 let MIOperandInfo = (ops dispRI34_pcrel:$imm, immZero:$reg); 876} 877 878// A version of ptr_rc usable with the asm parser. 879def PPCRegGxRCOperand : AsmOperandClass { 880 let Name = "RegGxRC"; let PredicateMethod = "isRegNumber"; 881} 882def ptr_rc_idx : Operand<iPTR>, PointerLikeRegClass<0> { 883 let ParserMatchClass = PPCRegGxRCOperand; 884} 885 886def PPCDispRIOperand : AsmOperandClass { 887 let Name = "DispRI"; let PredicateMethod = "isS16Imm"; 888 let RenderMethod = "addS16ImmOperands"; 889} 890def dispRI : Operand<iPTR> { 891 let ParserMatchClass = PPCDispRIOperand; 892 let EncoderMethod = "getDispRIEncoding"; 893} 894def PPCDispRIXOperand : AsmOperandClass { 895 let Name = "DispRIX"; let PredicateMethod = "isS16ImmX4"; 896 let RenderMethod = "addS16ImmOperands"; 897} 898def dispRIX : Operand<iPTR> { 899 let ParserMatchClass = PPCDispRIXOperand; 900 let EncoderMethod = "getDispRIXEncoding"; 901 let DecoderMethod = "decodeDispRIXOperand"; 902} 903def PPCDispRIHashOperand : AsmOperandClass { 904 let Name = "DispRIHash"; let PredicateMethod = "isHashImmX8"; 905 let RenderMethod = "addImmOperands"; 906} 907def dispRIHash : Operand<iPTR> { 908 let ParserMatchClass = PPCDispRIHashOperand; 909 let EncoderMethod = "getDispRIHashEncoding"; 910 let DecoderMethod = "decodeDispRIHashOperand"; 911} 912def PPCDispRIX16Operand : AsmOperandClass { 913 let Name = "DispRIX16"; let PredicateMethod = "isS16ImmX16"; 914 let RenderMethod = "addS16ImmOperands"; 915} 916def dispRIX16 : Operand<iPTR> { 917 let ParserMatchClass = PPCDispRIX16Operand; 918 let EncoderMethod = "getDispRIX16Encoding"; 919 let DecoderMethod = "decodeDispRIX16Operand"; 920 921} 922def PPCDispSPE8Operand : AsmOperandClass { 923 let Name = "DispSPE8"; let PredicateMethod = "isU8ImmX8"; 924 let RenderMethod = "addImmOperands"; 925} 926def dispSPE8 : Operand<iPTR> { 927 let ParserMatchClass = PPCDispSPE8Operand; 928 let DecoderMethod = "decodeDispSPE8Operand"; 929 let EncoderMethod = "getDispSPE8Encoding"; 930} 931def PPCDispSPE4Operand : AsmOperandClass { 932 let Name = "DispSPE4"; let PredicateMethod = "isU7ImmX4"; 933 let RenderMethod = "addImmOperands"; 934} 935def dispSPE4 : Operand<iPTR> { 936 let ParserMatchClass = PPCDispSPE4Operand; 937 let DecoderMethod = "decodeDispSPE4Operand"; 938 let EncoderMethod = "getDispSPE4Encoding"; 939} 940def PPCDispSPE2Operand : AsmOperandClass { 941 let Name = "DispSPE2"; let PredicateMethod = "isU6ImmX2"; 942 let RenderMethod = "addImmOperands"; 943} 944def dispSPE2 : Operand<iPTR> { 945 let ParserMatchClass = PPCDispSPE2Operand; 946 let DecoderMethod = "decodeDispSPE2Operand"; 947 let EncoderMethod = "getDispSPE2Encoding"; 948} 949 950def memri : Operand<iPTR> { 951 let PrintMethod = "printMemRegImm"; 952 let MIOperandInfo = (ops dispRI:$imm, ptr_rc_nor0:$reg); 953 let OperandType = "OPERAND_MEMORY"; 954} 955def memrr : Operand<iPTR> { 956 let PrintMethod = "printMemRegReg"; 957 let MIOperandInfo = (ops ptr_rc_nor0:$ptrreg, ptr_rc_idx:$offreg); 958 let OperandType = "OPERAND_MEMORY"; 959} 960def memrix : Operand<iPTR> { // memri where the imm is 4-aligned. 961 let PrintMethod = "printMemRegImm"; 962 let MIOperandInfo = (ops dispRIX:$imm, ptr_rc_nor0:$reg); 963 let OperandType = "OPERAND_MEMORY"; 964} 965def memrihash : Operand<iPTR> { 966 // memrihash 8-aligned for ROP Protection Instructions. 967 let PrintMethod = "printMemRegImmHash"; 968 let MIOperandInfo = (ops dispRIHash:$imm, ptr_rc_nor0:$reg); 969 let OperandType = "OPERAND_MEMORY"; 970} 971def memrix16 : Operand<iPTR> { // memri, imm is 16-aligned, 12-bit, Inst{16:27} 972 let PrintMethod = "printMemRegImm"; 973 let MIOperandInfo = (ops dispRIX16:$imm, ptr_rc_nor0:$reg); 974 let OperandType = "OPERAND_MEMORY"; 975} 976def spe8dis : Operand<iPTR> { // SPE displacement where the imm is 8-aligned. 977 let PrintMethod = "printMemRegImm"; 978 let MIOperandInfo = (ops dispSPE8:$imm, ptr_rc_nor0:$reg); 979 let OperandType = "OPERAND_MEMORY"; 980} 981def spe4dis : Operand<iPTR> { // SPE displacement where the imm is 4-aligned. 982 let PrintMethod = "printMemRegImm"; 983 let MIOperandInfo = (ops dispSPE4:$imm, ptr_rc_nor0:$reg); 984 let OperandType = "OPERAND_MEMORY"; 985} 986def spe2dis : Operand<iPTR> { // SPE displacement where the imm is 2-aligned. 987 let PrintMethod = "printMemRegImm"; 988 let MIOperandInfo = (ops dispSPE2:$imm, ptr_rc_nor0:$reg); 989 let OperandType = "OPERAND_MEMORY"; 990} 991 992// A single-register address. This is used with the SjLj 993// pseudo-instructions which translates to LD/LWZ. These instructions requires 994// G8RC_NOX0 registers. 995def memr : Operand<iPTR> { 996 let MIOperandInfo = (ops ptr_rc_nor0:$ptrreg); 997 let OperandType = "OPERAND_MEMORY"; 998} 999def PPCTLSRegOperand : AsmOperandClass { 1000 let Name = "TLSReg"; let PredicateMethod = "isTLSReg"; 1001 let RenderMethod = "addTLSRegOperands"; 1002} 1003def tlsreg32 : Operand<i32> { 1004 let EncoderMethod = "getTLSRegEncoding"; 1005 let ParserMatchClass = PPCTLSRegOperand; 1006} 1007def tlsgd32 : Operand<i32> {} 1008def tlscall32 : Operand<i32> { 1009 let PrintMethod = "printTLSCall"; 1010 let MIOperandInfo = (ops calltarget:$func, tlsgd32:$sym); 1011 let EncoderMethod = "getTLSCallEncoding"; 1012} 1013 1014// PowerPC Predicate operand. 1015def pred : Operand<OtherVT> { 1016 let PrintMethod = "printPredicateOperand"; 1017 let MIOperandInfo = (ops i32imm:$bibo, crrc:$reg); 1018} 1019 1020def PPCRegVSRCAsmOperand : AsmOperandClass { 1021 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber"; 1022} 1023def vsrc : RegisterOperand<VSRC> { 1024 let ParserMatchClass = PPCRegVSRCAsmOperand; 1025} 1026 1027def PPCRegVSFRCAsmOperand : AsmOperandClass { 1028 let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber"; 1029} 1030def vsfrc : RegisterOperand<VSFRC> { 1031 let ParserMatchClass = PPCRegVSFRCAsmOperand; 1032} 1033 1034def PPCRegVSSRCAsmOperand : AsmOperandClass { 1035 let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber"; 1036} 1037def vssrc : RegisterOperand<VSSRC> { 1038 let ParserMatchClass = PPCRegVSSRCAsmOperand; 1039} 1040 1041def PPCRegSPILLTOVSRRCAsmOperand : AsmOperandClass { 1042 let Name = "RegSPILLTOVSRRC"; let PredicateMethod = "isVSRegNumber"; 1043} 1044 1045def spilltovsrrc : RegisterOperand<SPILLTOVSRRC> { 1046 let ParserMatchClass = PPCRegSPILLTOVSRRCAsmOperand; 1047} 1048 1049def PPCRegVSRpRCAsmOperand : AsmOperandClass { 1050 let Name = "RegVSRpRC"; let PredicateMethod = "isVSRpEvenRegNumber"; 1051} 1052 1053def vsrprc : RegisterOperand<VSRpRC> { 1054 let ParserMatchClass = PPCRegVSRpRCAsmOperand; 1055} 1056 1057def PPCRegVSRpEvenRCAsmOperand : AsmOperandClass { 1058 let Name = "RegVSRpEvenRC"; let PredicateMethod = "isVSRpEvenRegNumber"; 1059} 1060 1061def vsrpevenrc : RegisterOperand<VSRpRC> { 1062 let ParserMatchClass = PPCRegVSRpEvenRCAsmOperand; 1063 let EncoderMethod = "getVSRpEvenEncoding"; 1064 let DecoderMethod = "decodeVSRpEvenOperands"; 1065} 1066 1067def PPCRegACCRCAsmOperand : AsmOperandClass { 1068 let Name = "RegACCRC"; let PredicateMethod = "isACCRegNumber"; 1069} 1070 1071def acc : RegisterOperand<ACCRC> { 1072 let ParserMatchClass = PPCRegACCRCAsmOperand; 1073} 1074 1075def uacc : RegisterOperand<UACCRC> { 1076 let ParserMatchClass = PPCRegACCRCAsmOperand; 1077} 1078 1079// DMR Register Operands 1080def PPCRegDMRROWRCAsmOperand : AsmOperandClass { 1081 let Name = "RegDMRROWRC"; 1082 let PredicateMethod = "isDMRROWRegNumber"; 1083} 1084 1085def dmrrow : RegisterOperand<DMRROWRC> { 1086 let ParserMatchClass = PPCRegDMRROWRCAsmOperand; 1087} 1088 1089def PPCRegDMRROWpRCAsmOperand : AsmOperandClass { 1090 let Name = "RegDMRROWpRC"; 1091 let PredicateMethod = "isDMRROWpRegNumber"; 1092} 1093 1094def dmrrowp : RegisterOperand<DMRROWpRC> { 1095 let ParserMatchClass = PPCRegDMRROWpRCAsmOperand; 1096} 1097 1098def wacc : RegisterOperand<WACCRC> { 1099 let ParserMatchClass = PPCRegACCRCAsmOperand; 1100} 1101 1102def wacc_hi : RegisterOperand<WACC_HIRC> { 1103 let ParserMatchClass = PPCRegACCRCAsmOperand; 1104} 1105 1106def PPCRegDMRRCAsmOperand : AsmOperandClass { 1107 let Name = "RegDMRRC"; 1108 let PredicateMethod = "isDMRRegNumber"; 1109} 1110 1111def dmr : RegisterOperand<DMRRC> { 1112 let ParserMatchClass = PPCRegDMRRCAsmOperand; 1113} 1114 1115def PPCRegDMRpRCAsmOperand : AsmOperandClass { 1116 let Name = "RegDMRpRC"; 1117 let PredicateMethod = "isDMRpRegNumber"; 1118} 1119 1120def dmrp : RegisterOperand<DMRpRC> { 1121 let ParserMatchClass = PPCRegDMRpRCAsmOperand; 1122} 1123