diff --git a/parseinstrs.py b/parseinstrs.py index aa721ec..647b4ce 100644 --- a/parseinstrs.py +++ b/parseinstrs.py @@ -460,11 +460,14 @@ class Trie: if elem is not None: value = elem[1] << 2 if elem[0].is_instr else offsets[elem[1]] data[i] = (value << 1) | (elem[0].value & 7) - - stats = {k: len(v) for k, v in self.kindmap.items()} - print("%d bytes" % (2*len(data)), stats) return tuple(data), [offsets[v] for _, v in self.trie[0]] + @property + def stats(self): + return {k.name: sum(self.trie[e] is not None for e in v) + for k, v in self.kindmap.items()} + + def superstring(strs): # This faces the "shortest superstring" problem, which is NP-hard. # Preprocessing: remove any strings which are already completely covered @@ -524,6 +527,10 @@ def decode_table(entries, modes): .lower() for m in mnems] mnemonics_str = superstring(mnemonics_intel) + print(f"Stats: Descs -- {len(descs)} ({8*len(descs)} bytes);", + f"Trie -- {2*len(table_data)} bytes, {trie.stats};" + f"Mnems -- {len(mnemonics_str)} + {3*len(mnemonics_intel)} bytes") + defines = ["FD_TABLE_OFFSET_%d %d\n"%k for k in zip(modes, root_offsets)] return "".join(decode_mnems_lines), f"""// Auto-generated file -- do not modify!