| #!/usr/bin/env python | |
| def analyze_match_table(path): | |
| # Extract the instruction table. | |
| data = open(path).read() | |
| start = data.index("static const MatchEntry MatchTable") | |
| end = data.index("\n};\n", start) | |
| lines = data[start:end].split("\n")[1:] | |
| # Parse the instructions. | |
| insns = [] | |
| for ln in lines: | |
| ln = ln.split("{", 1)[1] | |
| ln = ln.rsplit("}", 1)[0] | |
| a,bc = ln.split("{", 1) | |
| b,c = bc.split("}", 1) | |
| code, string, converter, _ = [s.strip() | |
| for s in a.split(",")] | |
| items = [s.strip() for s in b.split(",")] | |
| _,features = [s.strip() for s in c.split(",")] | |
| assert string[0] == string[-1] == '"' | |
| string = string[1:-1] | |
| insns.append((code,string,converter,items,features)) | |
| # For every mnemonic, compute whether or not it can have a carry setting | |
| # operand and whether or not it can have a predication code. | |
| mnemonic_flags = {} | |
| for insn in insns: | |
| mnemonic = insn[1] | |
| items = insn[3] | |
| flags = mnemonic_flags[mnemonic] = mnemonic_flags.get(mnemonic, set()) | |
| flags.update(items) | |
| mnemonics = set(mnemonic_flags) | |
| ccout_mnemonics = set(m for m in mnemonics | |
| if 'MCK_CCOut' in mnemonic_flags[m]) | |
| condcode_mnemonics = set(m for m in mnemonics | |
| if 'MCK_CondCode' in mnemonic_flags[m]) | |
| noncondcode_mnemonics = mnemonics - condcode_mnemonics | |
| print ' || '.join('Mnemonic == "%s"' % m | |
| for m in ccout_mnemonics) | |
| print ' || '.join('Mnemonic == "%s"' % m | |
| for m in noncondcode_mnemonics) | |
| def main(): | |
| import sys | |
| if len(sys.argv) == 1: | |
| import os | |
| from lit.Util import capture | |
| llvm_obj_root = capture(["llvm-config", "--obj-root"]) | |
| file = os.path.join(llvm_obj_root, | |
| "lib/Target/ARM/ARMGenAsmMatcher.inc") | |
| elif len(sys.argv) == 2: | |
| file = sys.argv[1] | |
| else: | |
| raise NotImplementedError | |
| analyze_match_table(file) | |
| if __name__ == '__main__': | |
| main() |