[llvm-commits] [llvm] r123252 - in /llvm/trunk/utils/Target: ./ ARM/ ARM/analyze-match-table.py

Daniel Dunbar daniel at zuster.org
Tue Jan 11 11:06:26 PST 2011


Author: ddunbar
Date: Tue Jan 11 13:06:26 2011
New Revision: 123252

URL: http://llvm.org/viewvc/llvm-project?rev=123252&view=rev
Log:
McARM: Write a silly Python script to compute some hard coded info from the
generated ARM match table, which is substantially more efficient than dealing
with tblgen.

Added:
    llvm/trunk/utils/Target/
    llvm/trunk/utils/Target/ARM/
    llvm/trunk/utils/Target/ARM/analyze-match-table.py

Added: llvm/trunk/utils/Target/ARM/analyze-match-table.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/Target/ARM/analyze-match-table.py?rev=123252&view=auto
==============================================================================
--- llvm/trunk/utils/Target/ARM/analyze-match-table.py (added)
+++ llvm/trunk/utils/Target/ARM/analyze-match-table.py Tue Jan 11 13:06:26 2011
@@ -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()





More information about the llvm-commits mailing list