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