xref: /aosp_15_r20/external/llvm/utils/Target/ARM/analyze-match-table.py (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdef analyze_match_table(path):
4*9880d681SAndroid Build Coastguard Worker    # Extract the instruction table.
5*9880d681SAndroid Build Coastguard Worker    data = open(path).read()
6*9880d681SAndroid Build Coastguard Worker    start = data.index("static const MatchEntry MatchTable")
7*9880d681SAndroid Build Coastguard Worker    end = data.index("\n};\n", start)
8*9880d681SAndroid Build Coastguard Worker    lines = data[start:end].split("\n")[1:]
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker    # Parse the instructions.
11*9880d681SAndroid Build Coastguard Worker    insns = []
12*9880d681SAndroid Build Coastguard Worker    for ln in lines:
13*9880d681SAndroid Build Coastguard Worker        ln = ln.split("{", 1)[1]
14*9880d681SAndroid Build Coastguard Worker        ln = ln.rsplit("}", 1)[0]
15*9880d681SAndroid Build Coastguard Worker        a,bc = ln.split("{", 1)
16*9880d681SAndroid Build Coastguard Worker        b,c = bc.split("}", 1)
17*9880d681SAndroid Build Coastguard Worker        code, string, converter, _ = [s.strip()
18*9880d681SAndroid Build Coastguard Worker                                      for s in a.split(",")]
19*9880d681SAndroid Build Coastguard Worker        items = [s.strip() for s in b.split(",")]
20*9880d681SAndroid Build Coastguard Worker        _,features = [s.strip() for s in c.split(",")]
21*9880d681SAndroid Build Coastguard Worker        assert string[0] == string[-1] == '"'
22*9880d681SAndroid Build Coastguard Worker        string = string[1:-1]
23*9880d681SAndroid Build Coastguard Worker        insns.append((code,string,converter,items,features))
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker    # For every mnemonic, compute whether or not it can have a carry setting
26*9880d681SAndroid Build Coastguard Worker    # operand and whether or not it can have a predication code.
27*9880d681SAndroid Build Coastguard Worker    mnemonic_flags = {}
28*9880d681SAndroid Build Coastguard Worker    for insn in insns:
29*9880d681SAndroid Build Coastguard Worker        mnemonic = insn[1]
30*9880d681SAndroid Build Coastguard Worker        items = insn[3]
31*9880d681SAndroid Build Coastguard Worker        flags = mnemonic_flags[mnemonic] = mnemonic_flags.get(mnemonic, set())
32*9880d681SAndroid Build Coastguard Worker        flags.update(items)
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker    mnemonics = set(mnemonic_flags)
35*9880d681SAndroid Build Coastguard Worker    ccout_mnemonics = set(m for m in mnemonics
36*9880d681SAndroid Build Coastguard Worker                          if 'MCK_CCOut' in mnemonic_flags[m])
37*9880d681SAndroid Build Coastguard Worker    condcode_mnemonics = set(m for m in mnemonics
38*9880d681SAndroid Build Coastguard Worker                             if 'MCK_CondCode' in mnemonic_flags[m])
39*9880d681SAndroid Build Coastguard Worker    noncondcode_mnemonics = mnemonics - condcode_mnemonics
40*9880d681SAndroid Build Coastguard Worker    print ' || '.join('Mnemonic == "%s"' % m
41*9880d681SAndroid Build Coastguard Worker                      for m in ccout_mnemonics)
42*9880d681SAndroid Build Coastguard Worker    print ' || '.join('Mnemonic == "%s"' % m
43*9880d681SAndroid Build Coastguard Worker                      for m in noncondcode_mnemonics)
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdef main():
46*9880d681SAndroid Build Coastguard Worker    import sys
47*9880d681SAndroid Build Coastguard Worker    if len(sys.argv) == 1:
48*9880d681SAndroid Build Coastguard Worker        import os
49*9880d681SAndroid Build Coastguard Worker        from lit.Util import capture
50*9880d681SAndroid Build Coastguard Worker        llvm_obj_root = capture(["llvm-config", "--obj-root"])
51*9880d681SAndroid Build Coastguard Worker        file = os.path.join(llvm_obj_root,
52*9880d681SAndroid Build Coastguard Worker                            "lib/Target/ARM/ARMGenAsmMatcher.inc")
53*9880d681SAndroid Build Coastguard Worker    elif len(sys.argv) == 2:
54*9880d681SAndroid Build Coastguard Worker        file = sys.argv[1]
55*9880d681SAndroid Build Coastguard Worker    else:
56*9880d681SAndroid Build Coastguard Worker        raise NotImplementedError
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker    analyze_match_table(file)
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerif __name__ == '__main__':
61*9880d681SAndroid Build Coastguard Worker    main()
62