+@_dataclasses.dataclass(eq=True, frozen=True)
+class Specifier:
+ record: Record
+
+ @classmethod
+ def match(cls, desc, record):
+ raise NotImplementedError
+
+ def assemble(self, insn):
+ raise NotImplementedError
+
+
+@_dataclasses.dataclass(eq=True, frozen=True)
+class SpecifierWidth(Specifier):
+ mode: str
+ value: int
+
+ @classmethod
+ def match(cls, desc, record):
+ (mode, _, value) = desc.partition("=")
+ mode = mode.strip()
+ value = value.strip()
+ if mode not in ("w", "sw", "dw"):
+ return None
+ if value not in ("8", "16", "32"):
+ raise ValueError(value)
+
+ value = {"8": 3, "16": 2, "32": 1}[value]
+
+ return cls(record=record, mode=mode, value=value)
+
+ def assemble(self, insn):
+ if self.mode == "sw":
+ insn.prefix.rm.ewsrc = self.value
+ elif self.mode == "dw":
+ insn.prefix.rm.elwidth = self.value
+ else:
+ insn.prefix.rm.ewsrc = self.value
+ insn.prefix.rm.elwidth = self.value
+
+