parseinstrs: Minor refactoring of trie entries
This commit is contained in:
@@ -333,8 +333,8 @@ class EntryKind(Enum):
|
|||||||
TABLE_VEX = 6
|
TABLE_VEX = 6
|
||||||
TABLE_ROOT = -1
|
TABLE_ROOT = -1
|
||||||
@property
|
@property
|
||||||
def is_instr(self):
|
def is_table(self):
|
||||||
return self == EntryKind.INSTR or self == EntryKind.WEAKINSTR
|
return self != EntryKind.INSTR and self != EntryKind.WEAKINSTR
|
||||||
|
|
||||||
opcode_regex = re.compile(
|
opcode_regex = re.compile(
|
||||||
r"^(?:(?P<prefixes>(?P<vex>E?VEX\.)?(?P<legacy>NP|66|F2|F3|NFx)\." +
|
r"^(?:(?P<prefixes>(?P<vex>E?VEX\.)?(?P<legacy>NP|66|F2|F3|NFx)\." +
|
||||||
@@ -471,7 +471,7 @@ class Trie:
|
|||||||
return len(self.trie) - 1
|
return len(self.trie) - 1
|
||||||
|
|
||||||
def _clone(self, elem):
|
def _clone(self, elem):
|
||||||
if not elem or elem[0].is_instr:
|
if not elem or not elem[0].is_table:
|
||||||
return elem
|
return elem
|
||||||
new_num = self._add_table(elem[0])
|
new_num = self._add_table(elem[0])
|
||||||
self.trie[new_num] = [self._clone(e) for e in self.trie[elem[1]]]
|
self.trie[new_num] = [self._clone(e) for e in self.trie[elem[1]]]
|
||||||
@@ -534,7 +534,7 @@ class Trie:
|
|||||||
entry = self.trie[entry_num]
|
entry = self.trie[entry_num]
|
||||||
if not entry[entry_idx] or entry[entry_idx][0] == EntryKind.WEAKINSTR:
|
if not entry[entry_idx] or entry[entry_idx][0] == EntryKind.WEAKINSTR:
|
||||||
kind = EntryKind.INSTR if not weak else EntryKind.WEAKINSTR
|
kind = EntryKind.INSTR if not weak else EntryKind.WEAKINSTR
|
||||||
entry[entry_idx] = kind, descidx
|
entry[entry_idx] = kind, descidx << 3
|
||||||
elif not weak:
|
elif not weak:
|
||||||
raise Exception(f"redundant non-weak {opcode}")
|
raise Exception(f"redundant non-weak {opcode}")
|
||||||
|
|
||||||
@@ -546,7 +546,7 @@ class Trie:
|
|||||||
# Replace previous synonyms
|
# Replace previous synonyms
|
||||||
entry = self.trie[num]
|
entry = self.trie[num]
|
||||||
for i, elem in enumerate(entry):
|
for i, elem in enumerate(entry):
|
||||||
if elem and not elem[0].is_instr and elem[1] in synonyms:
|
if elem and elem[0].is_table and elem[1] in synonyms:
|
||||||
entry[i] = synonyms[elem[1]]
|
entry[i] = synonyms[elem[1]]
|
||||||
|
|
||||||
unique_entry = tuple(entry)
|
unique_entry = tuple(entry)
|
||||||
@@ -578,8 +578,8 @@ class Trie:
|
|||||||
continue
|
continue
|
||||||
for i, elem in enumerate(entry, start=off):
|
for i, elem in enumerate(entry, start=off):
|
||||||
if elem is not None:
|
if elem is not None:
|
||||||
value = elem[1] << 2 if elem[0].is_instr else offsets[elem[1]]
|
value = (offsets[elem[1]] << 1) if elem[0].is_table else elem[1]
|
||||||
data[i] = (value << 1) | (elem[0].value & 7)
|
data[i] = value | (elem[0].value & 7)
|
||||||
return tuple(data), [offsets[v] for _, v in self.trie[0]]
|
return tuple(data), [offsets[v] for _, v in self.trie[0]]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
Reference in New Issue
Block a user