McARM: Write a silly Python script to compute some hard coded info from the
authorDaniel Dunbar <daniel@zuster.org>
Tue, 11 Jan 2011 19:06:26 +0000 (19:06 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 11 Jan 2011 19:06:26 +0000 (19:06 +0000)
generated ARM match table, which is substantially more efficient than dealing
with tblgen.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123252 91177308-0d34-0410-b5e6-96231b3b80d8

utils/Target/ARM/analyze-match-table.py [new file with mode: 0644]

diff --git a/utils/Target/ARM/analyze-match-table.py b/utils/Target/ARM/analyze-match-table.py
new file mode 100644 (file)
index 0000000..aa952d4
--- /dev/null
@@ -0,0 +1,61 @@
+#!/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()