1// RUN: llvm-tblgen -gen-asm-matcher -I %p/../../include %s | FileCheck %s --check-prefix=MATCHER
2// RUN: llvm-tblgen -gen-asm-writer -I %p/../../include %s | FileCheck %s --check-prefix=WRITER
3// RUN: llvm-tblgen -gen-asm-matcher -I %p/../../include %s | FileCheck %s --check-prefix=ALIAS
4
5// Check that an instruction that uses mixed upper/lower case in its mnemonic
6// is printed as-is, and is parsed in its "canonicalized" lowercase form.
7
8include "llvm/Target/Target.td"
9
10def ArchInstrInfo : InstrInfo { }
11
12def Arch : Target {
13  let InstructionSet = ArchInstrInfo;
14}
15
16def Reg : Register<"reg">;
17def RegClass : RegisterClass<"foo", [i32], 0, (add Reg)>;
18
19// Define instructions that demonstrate case-insensitivity.
20// In case-sensitive ASCII order, "BInst" < "aInst".
21// In case-insensitive order, "aInst" < "BInst".
22// If the matcher really treats the mnemonics in a case-insensitive way,
23// then we should see "aInst" appearing before "BInst", despite the
24// fact that "BInst" would appear before "aInst" in ASCIIbetical order.
25def AlphabeticallySecondInst : Instruction {
26  let Size = 2;
27  let OutOperandList = (outs);
28  let InOperandList = (ins);
29  let AsmString = "BInst";
30}
31
32def AlphabeticallyFirstInst : Instruction {
33  let Size = 2;
34  let OutOperandList = (outs);
35  let InOperandList = (ins);
36  let AsmString = "aInst";
37}
38
39def :MnemonicAlias<"Insta", "aInst">;
40def :MnemonicAlias<"InstB", "BInst">;
41
42// Check that the matcher lower()s the mnemonics it matches.
43// MATCHER: static const char *const MnemonicTable =
44// MATCHER-NEXT: "\005ainst\005binst";
45
46// Check that aInst appears before BInst in the match table.
47// This shows that the mnemonics are sorted in a case-insensitive way,
48// since otherwise "B" would be less than "a" by ASCII order.
49// MATCHER:      static const MatchEntry MatchTable0[] = {
50// MATCHER-NEXT:     /* aInst */, ::AlphabeticallyFirstInst
51// MATCHER-NEXT:     /* BInst */, ::AlphabeticallySecondInst
52// MATCHER-NEXT: };
53
54// Check that the writer preserves the case of the mnemonics.
55// WRITER:      static const char AsmStrs[] = {
56// WRITER:        "BInst\0"
57// WRITER-NEXT:   "aInst\0"
58// WRITER-NEXT: };
59
60// ALIAS: static void applyMnemonicAliases(StringRef &Mnemonic, const FeatureBitset &Features, unsigned VariantID) {
61// ALIAS-NEXT  switch (VariantID) {
62// ALIAS-NEXT  case 0:
63// ALIAS-NEXT      switch (Mnemonic.size()) {
64// ALIAS-NEXT      default: break;
65// ALIAS-NEXT      case 5:	 // 2 strings to match.
66// ALIAS-NEXT        if (memcmp(Mnemonic.data()+0, "inst", 4) != 0)
67// ALIAS-NEXT          break;
68// ALIAS-NEXT        switch (Mnemonic[4]) {
69// ALIAS-NEXT        default: break;
70// ALIAS-NEXT        case 'a':	 // 1 string to match.
71// ALIAS-NEXT          Mnemonic = "ainst";	 // "insta"
72// ALIAS-NEXT          return;
73// ALIAS-NEXT        case 'b':	 // 1 string to match.
74// ALIAS-NEXT          Mnemonic = "binst";	 // "instb"
75// ALIAS-NEXT          return;
76
77