Add comments to the level2 hash tables concatenation.

The large LEVEL2 table consists on multiple concatenated constant hash tables.
Add comments to the generated output delineating the individual tables.
This commit is contained in:
Jakob Stoklund Olesen
2016-08-29 08:43:33 -07:00
parent 0357ffe670
commit dcf0b49b07

View File

@@ -216,7 +216,7 @@ class Level2Table(object):
def __iter__(self): def __iter__(self):
return iter(self.lists.values()) return iter(self.lists.values())
def layout_hashtable(self, level2_hashtables): def layout_hashtable(self, level2_hashtables, level2_doc):
""" """
Compute the hash table mapping opcode -> enclist. Compute the hash table mapping opcode -> enclist.
@@ -229,6 +229,11 @@ class Level2Table(object):
self.hash_table_offset = len(level2_hashtables) self.hash_table_offset = len(level2_hashtables)
self.hash_table_len = len(hash_table) self.hash_table_len = len(hash_table)
level2_doc[self.hash_table_offset].append(
'{:06x}: {}, {} entries'.format(
self.hash_table_offset,
self.ty.name,
self.hash_table_len))
level2_hashtables.extend(hash_table) level2_hashtables.extend(hash_table)
@@ -289,12 +294,12 @@ def emit_enclists(seq_table, doc_table, fmt):
fmt.line(line) fmt.line(line)
def encode_level2_hashtables(level1, level2_hashtables): def encode_level2_hashtables(level1, level2_hashtables, level2_doc):
for level2 in level1: for level2 in level1:
level2.layout_hashtable(level2_hashtables) level2.layout_hashtable(level2_hashtables, level2_doc)
def emit_level2_hashtables(level2_hashtables, fmt): def emit_level2_hashtables(level2_hashtables, level2_doc, fmt):
""" """
Emit the big concatenation of level 2 hash tables. Emit the big concatenation of level 2 hash tables.
""" """
@@ -302,7 +307,10 @@ def emit_level2_hashtables(level2_hashtables, fmt):
'const LEVEL2: [(Opcode, u32); {}] = [' 'const LEVEL2: [(Opcode, u32); {}] = ['
.format(len(level2_hashtables)), .format(len(level2_hashtables)),
'];'): '];'):
for entry in level2_hashtables: for offset, entry in enumerate(level2_hashtables):
if offset in level2_doc:
for doc in level2_doc[offset]:
fmt.comment(doc)
if entry: if entry:
fmt.line( fmt.line(
'(Opcode::{}, {:#08x}),' '(Opcode::{}, {:#08x}),'
@@ -322,14 +330,16 @@ def gen_isa(isa, fmt):
# Single table containing all the level2 hash tables. # Single table containing all the level2 hash tables.
level2_hashtables = list() level2_hashtables = list()
level2_doc = defaultdict(list)
for cpumode in isa.cpumodes: for cpumode in isa.cpumodes:
level2_doc[len(level2_hashtables)].append(cpumode.name)
level1 = make_tables(cpumode) level1 = make_tables(cpumode)
encode_enclists(level1, seq_table, doc_table) encode_enclists(level1, seq_table, doc_table)
encode_level2_hashtables(level1, level2_hashtables) encode_level2_hashtables(level1, level2_hashtables, level2_doc)
emit_enclists(seq_table, doc_table, fmt) emit_enclists(seq_table, doc_table, fmt)
emit_level2_hashtables(level2_hashtables, fmt) emit_level2_hashtables(level2_hashtables, level2_doc, fmt)
def generate(isas, out_dir): def generate(isas, out_dir):