capstone/suite/synctools/systemoperand.py
Finn Wilkinson 3ef5bb6b79 Updated synctool scripts to extract new functions and match type/formatting changes in LLVM 14.0.5 tablegen files.
- asmwriter.py : As well as new functions, recognition of new SME index printing was added. The printAliasInstr function also required a re-write to match its counter-part and changes in logic in LLVM 14.0.5
 - disassemblertables-arch.py : Minor type changes for some functions, as well as adding support for new SME decode functions.
 - mapping_insn-arch.py : Minor change to correct incorrect instruction aliasing in generated AArch64MappingInsn.inc etc.
 - registerinfo.py : minor change to reflect change in LLVM 14.0.5
 - systemoperand.py : corrected minor type changes made in LLVM 14.0.5 and added extraction of SVCR, BTI, DBnXS lists and encoding functions.
2022-09-30 15:34:50 +01:00

1180 lines
28 KiB
Python
Executable File

#!/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() == 'constexpr 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() == 'constexpr 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() == 'constexpr 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() == 'constexpr 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() == 'constexpr TLBI TLBITable[] = {':
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() == 'constexpr 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() == 'constexpr 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() == 'constexpr 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 *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() == 'constexpr 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() == 'constexpr 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() == 'constexpr 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[2], tmp[3], tmp[4], 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() == 'constexpr 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() == 'constexpr 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 SVCRsList
count = 0
c = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'constexpr SVCR SVCRsList[] = {':
count += 1
print_line('static const SVCR SVCRsList[] = {')
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
# lookupSVCRByEncoding
count = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if 'lookupSVCRByEncoding' in line and '{' in line:
count += 1
print_line('const SVCR *lookupSVCRByEncoding(uint8_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 &SVCRsList[Index[i].index];
}
""")
# extract BTIsList
count = 0
c = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'constexpr BTI BTIsList[] = {':
count += 1
print_line('static const BTI BTIsList[] = {')
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
# lookupBTIByEncoding
count = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if 'lookupBTIByEncoding' in line and '{' in line:
count += 1
print_line('const BTI *lookupBTIByEncoding(uint8_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 &BTIsList[Index[i].index];
}
""")
# extract DBnXSsList
count = 0
c = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'constexpr DBnXS DBnXSsList[] = {':
count += 1
print_line('static const DBnXS DBnXSsList[] = {')
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))
c += 1
# lookupDBnXSByEncoding
count = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if 'lookupDBnXSByEncoding' in line and '{' in line:
count += 1
print_line('const DBnXS *lookupDBnXSByEncoding(uint8_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 &DBnXSsList[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() == 'constexpr 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];
}
""")