From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001
From: Angelos Mouzakitis <a.mouzakitis@virtualopensystems.com>
Date: Tue, 10 Oct 2023 14:33:42 +0000
Subject: Add submodule dependency files

Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
---
 capstone/suite/synctools/systemoperand.py | 987 ++++++++++++++++++++++++++++++
 1 file changed, 987 insertions(+)
 create mode 100755 capstone/suite/synctools/systemoperand.py

(limited to 'capstone/suite/synctools/systemoperand.py')

diff --git a/capstone/suite/synctools/systemoperand.py b/capstone/suite/synctools/systemoperand.py
new file mode 100755
index 000000000..cd462af7f
--- /dev/null
+++ b/capstone/suite/synctools/systemoperand.py
@@ -0,0 +1,987 @@
+#!/usr/bin/python
+# convert LLVM GenSystemOperands.inc of AArch64 for Capstone disassembler.
+# by Nguyen Anh Quynh, 2019
+
+import sys
+
+if len(sys.argv) == 1:
+    print("Syntax: %s <GenSystemOperands.inc> <GenSystemOperands.inc> <GenSystemOperands_enum.inc>" %sys.argv[0])
+    sys.exit(1)
+
+f = open(sys.argv[1])
+lines = f.readlines()
+f.close()
+
+f1 = open(sys.argv[2], 'w+')
+
+f2 = open(sys.argv[3], 'w+')
+
+f1.write("/* Capstone Disassembly Engine, http://www.capstone-engine.org */\n")
+f1.write("/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */\n")
+f1.write("\n")
+
+f2.write("/* Capstone Disassembly Engine, http://www.capstone-engine.org */\n")
+f2.write("/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */\n")
+f2.write("\n")
+
+# extract PStateValues enum
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'enum PStateValues {':
+        count += 1
+        f2.write(line.strip() + "\n")
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            f2.write(line + "\n")
+            f2.write("\n")
+            break
+        else:
+            # skip pseudo instructions
+            f2.write("  AArch64PState_%s\n" %(line))
+
+def print_line(line):
+    f1.write(line + "\n")
+
+# extract ExactFPImmValues enum
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'enum ExactFPImmValues {':
+        count += 1
+        f2.write(line.strip() + "\n")
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            f2.write(line + "\n")
+            f2.write("\n")
+            break
+        else:
+            # skip pseudo instructions
+            f2.write("  AArch64ExactFPImm_%s\n" %(line))
+
+# extract ATsList[]
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const AT ATsList[] = {':
+        count += 1
+        print_line('static const AT ATsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            c += 1
+
+# lookupATByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupATByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const AT *lookupATByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &ATsList[Index[i].index];
+}
+""")
+
+
+# extract DBsList[]
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const DB DBsList[] = {':
+        count += 1
+        print_line('static const DB DBsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            print_line("  %s" %(line))
+
+# lookupDBByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupDBByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const DB *lookupDBByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &DBsList[Index[i].index];
+}
+""")
+
+
+# extract DCsList[]
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const DC DCsList[] = {':
+        count += 1
+        print_line('static const DC DCsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            c += 1
+
+# lookupDCByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupDCByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const DC *lookupDCByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &DCsList[Index[i].index];
+}
+""")
+
+
+# extract ICsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const IC ICsList[] = {':
+        count += 1
+        print_line('static const IC ICsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            #tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupICByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupICByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const IC *lookupICByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &ICsList[Index[i].index];
+}
+""")
+
+
+# extract TLBIsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const TLBI TLBIsList[] = {':
+        count += 1
+        print_line('static const TLBI TLBIsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s, %s }, // %u" %(tmp[0].lower(), tmp[1], tmp[2], c))
+            #print_line("  %s" %line.lower())
+            c += 1
+
+# lookupTLBIByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupTLBIByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const TLBI *lookupTLBIByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &TLBIsList[Index[i].index];
+}
+""")
+
+# extract SVEPRFMsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const SVEPRFM SVEPRFMsList[] = {':
+        count += 1
+        print_line('static const SVEPRFM SVEPRFMsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            #print_line("  %s" %line.lower())
+            c += 1
+
+# lookupSVEPRFMByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupSVEPRFMByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const SVEPRFM *lookupSVEPRFMByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &SVEPRFMsList[Index[i].index];
+}
+""")
+
+
+# extract PRFMsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const PRFM PRFMsList[] = {':
+        count += 1
+        print_line('static const PRFM PRFMsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            #tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupPRFMByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupPRFMByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const PRFM *lookupPRFMByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &PRFMsList[Index[i].index];
+}
+""")
+
+
+# extract PSBsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const PSB PSBsList[] = {':
+        count += 1
+        print_line('static const PSB PSBsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            #tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupPSBByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupPSBByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const PSB *AArch64PSBHint_lookupPSBByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &PSBsList[Index[i].index];
+}
+""")
+
+
+# extract ISBsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const ISB ISBsList[] = {':
+        count += 1
+        print_line('static const ISB ISBsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            #tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupISBByName
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupISBByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const ISB *lookupISBByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &ISBsList[Index[i].index];
+}
+""")
+
+
+# extract TSBsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const TSB TSBsList[] = {':
+        count += 1
+        print_line('static const TSB TSBsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            #print_line("  %s" %line.lower())
+            c += 1
+
+# lookupTSBByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupTSBByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const TSB *lookupTSBByEncoding(uint16_t Encoding)\n{')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  if (Encoding >= ARR_SIZE(TSBsList))
+    return NULL;
+  else
+    return &TSBsList[Index[Encoding].index];
+}
+""")
+
+
+# extract SysRegsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const SysReg SysRegsList[] = {':
+        count += 1
+        print_line('static const SysReg SysRegsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s, %s, %s }, // %u" %(tmp[0].lower(), tmp[1], tmp[2], tmp[3], c))
+            #print_line("  %s" %line.lower())
+            c += 1
+
+# lookupSysRegByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupSysRegByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const SysReg *lookupSysRegByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &SysRegsList[Index[i].index];
+}
+""")
+
+# extract PStatesList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const PState PStatesList[] = {':
+        count += 1
+        print_line('static const PState PStatesList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            #print_line("  %s" %line.lower())
+            c += 1
+
+# lookupPStateByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupPStateByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const PState *lookupPStateByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &PStatesList[Index[i].index];
+}
+""")
+
+# extract SVEPREDPATsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const SVEPREDPAT SVEPREDPATsList[] = {':
+        count += 1
+        print_line('static const SVEPREDPAT SVEPREDPATsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupSVEPREDPATByEncoding
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupSVEPREDPATByEncoding' in line and '{' in line:
+        count += 1
+        print_line('const SVEPREDPAT *lookupSVEPREDPATByEncoding(uint16_t Encoding)\n{')
+        print_line('  unsigned int i;')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
+  if (i == -1)
+    return NULL;
+  else
+    return &SVEPREDPATsList[Index[i].index];
+}
+""")
+
+
+# extract ExactFPImmsList
+count = 0
+c = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if line.strip() == 'const ExactFPImm ExactFPImmsList[] = {':
+        count += 1
+        print_line('static const ExactFPImm ExactFPImmsList[] = {')
+        continue
+
+    line = line.strip()
+    if count == 1:
+        if line == '};':
+            # done with first enum
+            print_line('};\n')
+            break
+        else:
+            # skip pseudo instructions
+            line = line.replace('::', '_')
+            #line = line.replace('{}', '{ 0 }')
+            line = line.replace('{}', '')
+            tmp = line.split(',')
+            #print_line("  %s, %s }, // %u" %(tmp[0].lower(), tmp[1], c))
+            print_line("  %s" %line.lower())
+            c += 1
+
+# lookupExactFPImmByEnum
+count = 0
+for line in lines:
+    line = line.rstrip()
+
+    if len(line.strip()) == 0:
+        continue
+
+    if 'lookupExactFPImmByEnum' in line and '{' in line:
+        count += 1
+        print_line('const ExactFPImm *lookupExactFPImmByEnum(uint16_t Encoding)\n{')
+        continue
+
+    if count == 1 and 'IndexType Index[] = {' in line:
+        count += 1
+
+    if count == 2:
+        if line.strip() == '};':
+            # done with array, or this function?
+            print_line(line)
+            break
+        else:
+            # enum items
+            print_line(line)
+
+print_line("""
+  if (Encoding >= ARR_SIZE(ExactFPImmsList))
+    return NULL;
+  else
+    return &ExactFPImmsList[Index[Encoding].index];
+}
+""")
+
-- 
cgit