| // RUN: llvm-tblgen -gen-asm-matcher -I %p/../../include %s | FileCheck %s | |
| // RUN: llvm-tblgen -gen-asm-matcher -DDUPLICATES -I %p/../../include %s | FileCheck %s | |
| include "llvm/Target/Target.td" | |
| def ArchInstrInfo : InstrInfo; | |
| def ArchAsmParser : AsmParser { | |
| let ShouldEmitMatchRegisterName = false; | |
| let ShouldEmitMatchRegisterAltNameWithIndex = true; | |
| #ifdef DUPLICATES | |
| let AllowDuplicateRegisterNames = true; | |
| #endif | |
| } | |
| def Arch : Target { | |
| let InstructionSet = ArchInstrInfo; | |
| let AssemblyParsers = [ArchAsmParser]; | |
| } | |
| let Namespace = "Arch" in { | |
| def ABI0 : RegAltNameIndex; | |
| let FallbackRegAltNameIndex = ABI0 in | |
| def ABI1 : RegAltNameIndex; | |
| class ArchReg<string name, list<string> names, | |
| list<RegAltNameIndex> indices = [ABI0, ABI1]> : Register<name> { | |
| let AltNames = names; | |
| let RegAltNameIndices = indices; | |
| } | |
| // Shared spellings select different registers by index. | |
| def R0 : ArchReg<"r0", ["arg", "tmp"]>; | |
| def R1 : ArchReg<"r1", ["tmp", "arg"]>; | |
| // Ignore empty and unindexed names. | |
| def R2 : ArchReg<"r2", ["", "extra", "unindexed"]>; | |
| // Allow multiple names per index. | |
| def R3 : ArchReg<"r3", ["alias0", "alias1"], [ABI0, ABI0]>; | |
| #ifdef DUPLICATES | |
| def R0_64 : ArchReg<"r0", ["arg", "tmp"]>; | |
| #endif | |
| } | |
| def GPR : RegisterClass<"Arch", [i32], 32, (add R0, R1, R2, R3)>; | |
| // CHECK-LABEL: static MCRegister MatchRegisterAltName(StringRef Name, unsigned AltIdx) { | |
| // CHECK-NEXT: switch (AltIdx) { | |
| // CHECK-NEXT: default: break; | |
| // CHECK: case Arch::ABI0: { | |
| // CHECK-DAG: return Arch::R0; // "arg" | |
| // CHECK-DAG: return Arch::R1; // "tmp" | |
| // CHECK-DAG: return Arch::R3; // "alias0" | |
| // CHECK-DAG: return Arch::R3; // "alias1" | |
| // CHECK-NOT: return Arch::R2; | |
| // CHECK: case Arch::ABI1: { | |
| // CHECK-DAG: return Arch::R0; // "tmp" | |
| // CHECK-DAG: return Arch::R1; // "arg" | |
| // CHECK-DAG: return Arch::R2; // "extra" | |
| // CHECK-NOT: return Arch::R3; | |
| // CHECK-NOT: MatchRegisterAltName(Name, | |
| // CHECK: return Arch::NoRegister; | |
| // CHECK-NEXT: } |