# Parts of the underlying instruction definition
inst: parser.InstDef
- kind: typing.Literal["inst", "op", "legacy"] # Legacy means no (input -- output)
+ kind: typing.Literal["inst", "op"]
name: str
block: parser.Block
block_text: list[str] # Block.text, less curlies, less PREDICT() calls
self, thing: parser.InstDef | parser.Macro | parser.Pseudo
) -> tuple[AnyInstruction | None, str, str]:
def effect_str(effects: list[StackEffect]) -> str:
- if getattr(thing, "kind", None) == "legacy":
- return str(-1)
n_effect, sym_effect = list_effect_size(effects)
if sym_effect:
return f"{sym_effect} + {n_effect}" if n_effect else sym_effect
class InstHeader(Node):
override: bool
register: bool
- kind: Literal["inst", "op", "legacy"] # Legacy means no (inputs -- outputs)
+ kind: Literal["inst", "op"]
name: str
inputs: list[InputEffect]
outputs: list[OutputEffect]
class InstDef(Node):
override: bool
register: bool
- kind: Literal["inst", "op", "legacy"]
+ kind: Literal["inst", "op"]
name: str
inputs: list[InputEffect]
outputs: list[OutputEffect]
if self.expect(lx.RPAREN):
if (tkn := self.peek()) and tkn.kind == lx.LBRACE:
return InstHeader(override, register, kind, name, inp, outp)
- elif self.expect(lx.RPAREN) and kind == "inst":
- # No legacy stack effect if kind is "op".
- return InstHeader(override, register, "legacy", name, [], [])
return None
def io_effect(self) -> tuple[list[InputEffect], list[OutputEffect]]: