|  | #!/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() |