brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 074e984 Raw
87 lines · plain
1// RUN: llvm-tblgen -gen-asm-matcher -I %p/../../include %s | FileCheck %s2 3// Check that MatchRegisterName and MatchRegisterAltName are generated4// correctly when multiple registers are defined with the same name and5// AllowDuplicateRegisterNames is set.6 7include "llvm/Target/Target.td"8 9def ArchInstrInfo : InstrInfo;10 11def ArchAsmParser : AsmParser {12  let AllowDuplicateRegisterNames = 1;13  let ShouldEmitMatchRegisterAltName = 1;14}15 16def Arch : Target {17  let InstructionSet = ArchInstrInfo;18  let AssemblyParsers = [ArchAsmParser];19}20 21let Namespace = "Arch" in {22class ArchReg<string n, list <string> alt, list <RegAltNameIndex> altidx>23    : Register<n> {24  let AltNames = alt;25  let RegAltNameIndices = altidx;26}27 28def ABIRegAltName : RegAltNameIndex;29 30foreach i = 0...3 in {31  def R#i#_32 : ArchReg<"r"#i, ["x"#i], [ABIRegAltName]>;32  def R#i#_64 : ArchReg<"r"#i, ["x"#i], [ABIRegAltName]>;33}34} // Namespace = "Arch"35 36def GPR32 : RegisterClass<"Arch", [i32], 32, (add37    (sequence "R%u_32", 0, 3)38)>;39 40def GPR64 : RegisterClass<"Arch", [i64], 64, (add41    (sequence "R%u_64", 0, 3)42)>;43 44// CHECK: static MCRegister MatchRegisterName(StringRef Name) {45// CHECK:   switch (Name.size()) {46// CHECK:   default: break;47// CHECK:   case 2:  // 8 strings to match.48// CHECK:     if (Name[0] != 'r')49// CHECK:       break;50// CHECK:     switch (Name[1]) {51// CHECK:     default: break;52// CHECK:     case '0':  // 2 strings to match.53// CHECK:       return Arch::R0_32;  // "r0"54// CHECK:     case '1':  // 2 strings to match.55// CHECK:       return Arch::R1_32;  // "r1"56// CHECK:     case '2':  // 2 strings to match.57// CHECK:       return Arch::R2_32;  // "r2"58// CHECK:     case '3':  // 2 strings to match.59// CHECK:       return Arch::R3_32;  // "r3"60// CHECK:     }61// CHECK:     break;62// CHECK:   }63// CHECK:   return Arch::NoRegister;64// CHECK: }65 66// CHECK: static MCRegister MatchRegisterAltName(StringRef Name) {67// CHECK:   switch (Name.size()) {68// CHECK:   default: break;69// CHECK:   case 2:  // 8 strings to match.70// CHECK:     if (Name[0] != 'x')71// CHECK:       break;72// CHECK:     switch (Name[1]) {73// CHECK:     default: break;74// CHECK:     case '0':  // 2 strings to match.75// CHECK:       return Arch::R0_32;  // "x0"76// CHECK:     case '1':  // 2 strings to match.77// CHECK:       return Arch::R1_32;  // "x1"78// CHECK:     case '2':  // 2 strings to match.79// CHECK:       return Arch::R2_32;  // "x2"80// CHECK:     case '3':  // 2 strings to match.81// CHECK:       return Arch::R3_32;  // "x3"82// CHECK:     }83// CHECK:     break;84// CHECK:   }85// CHECK:   return Arch::NoRegister;86// CHECK: }87