Refactor encoding of bit field
This commit is contained in:
@@ -16,11 +16,12 @@ def bitstruct(name, fields):
|
|||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
for name in names:
|
for name in names:
|
||||||
setattr(self, name, kwargs.get(name, 0))
|
setattr(self, name, kwargs.get(name, 0))
|
||||||
def _encode(self):
|
def _encode(self, length):
|
||||||
return sum((getattr(self, name) & ((1 << size) - 1)) << offset
|
enc = 0
|
||||||
for name, size, offset in zip(names, sizes, offsets))
|
for name, size, offset in zip(names, sizes, offsets):
|
||||||
|
enc += (getattr(self, name) & ((1 << size) - 1)) << offset
|
||||||
|
return enc.to_bytes(length, "little")
|
||||||
__class.__name__ = name
|
__class.__name__ = name
|
||||||
__class._encode_size = offsets[-1]
|
|
||||||
return __class
|
return __class
|
||||||
|
|
||||||
InstrFlags = bitstruct("InstrFlags", [
|
InstrFlags = bitstruct("InstrFlags", [
|
||||||
@@ -40,7 +41,6 @@ InstrFlags = bitstruct("InstrFlags", [
|
|||||||
"lock:1",
|
"lock:1",
|
||||||
"vsib:1",
|
"vsib:1",
|
||||||
])
|
])
|
||||||
assert InstrFlags._encode_size <= 32
|
|
||||||
|
|
||||||
ENCODINGS = {
|
ENCODINGS = {
|
||||||
"NP": InstrFlags(),
|
"NP": InstrFlags(),
|
||||||
@@ -119,9 +119,9 @@ class InstrDesc(namedtuple("InstrDesc", "mnemonic,flags,encoding")):
|
|||||||
if "LOCK" in desc[6:]: flags.lock = 1
|
if "LOCK" in desc[6:]: flags.lock = 1
|
||||||
if "VSIB" in desc[6:]: flags.vsib = 1
|
if "VSIB" in desc[6:]: flags.vsib = 1
|
||||||
|
|
||||||
return cls(desc[5], frozenset(desc[6:]), flags._encode())
|
return cls(desc[5], frozenset(desc[6:]), flags._encode(6))
|
||||||
def encode(self, mnemonics_lut):
|
def encode(self, mnemonics_lut):
|
||||||
return struct.pack("<HL", mnemonics_lut[self.mnemonic], self.encoding)
|
return struct.pack("<H", mnemonics_lut[self.mnemonic]) + self.encoding
|
||||||
|
|
||||||
class EntryKind(Enum):
|
class EntryKind(Enum):
|
||||||
NONE = 0
|
NONE = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user