mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-06-06 18:31:03 +00:00
1180 lines
28 KiB
Python
1180 lines
28 KiB
Python
![]() |
#!/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];
|
||
|
}
|
||
|
""")
|
||
|
|