aboutsummaryrefslogtreecommitdiffstats
path: root/capstone/suite/synctools/systemoperand.py
diff options
context:
space:
mode:
Diffstat (limited to 'capstone/suite/synctools/systemoperand.py')
-rwxr-xr-xcapstone/suite/synctools/systemoperand.py987
1 files changed, 987 insertions, 0 deletions
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];
+}
+""")
+