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