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