import sys
import typing
+from _typing_backports import assert_never
from flags import InstructionFlags, variable_used
from formatting import prettify_filename, UNUSED
from instructions import (
self.pseudos[name] = thing
self.everything.append(thing)
case _:
- typing.assert_never(thing)
+ assert_never(thing)
if not psr.eof():
raise psr.make_syntax_error(f"Extra stuff at the end of {filename}")
# SAVE_IP in a macro is a no-op in Tier 1
flags.add(instr.instr_flags)
case _:
- typing.assert_never(component)
+ assert_never(component)
format = "IB" if flags.HAS_ARG_FLAG else "IX"
if offset:
format += "C" + "0" * (offset - 1)
case parsing.CacheEffect():
components.append(uop)
case _:
- typing.assert_never(uop)
+ assert_never(uop)
return components
from collections.abc import Iterator
import stacking # Early import to avoid circular import
+from _typing_backports import assert_never
from analysis import Analyzer
from formatting import Formatter, list_effect_size
from flags import InstructionFlags, variable_used
class Generator(Analyzer):
def get_stack_effect_info(
self, thing: parsing.InstDef | parsing.Macro | parsing.Pseudo
- ) -> tuple[AnyInstruction | None, str | None, str | None]:
+ ) -> tuple[AnyInstruction | None, str, str]:
def effect_str(effects: list[StackEffect]) -> str:
n_effect, sym_effect = list_effect_size(effects)
if sym_effect:
return str(n_effect)
instr: AnyInstruction | None
- popped: str | None
- pushed: str | None
match thing:
case parsing.InstDef():
if thing.kind != "op" or self.instrs[thing.name].is_viable_uop():
popped, pushed = stacking.get_stack_effect_info_for_macro(instr)
case parsing.Pseudo():
instr = self.pseudo_instrs[thing.name]
- popped = pushed = None
# Calculate stack effect, and check that it's the the same
# for all targets.
- for target in self.pseudos[thing.name].targets:
+ for idx, target in enumerate(self.pseudos[thing.name].targets):
target_instr = self.instrs.get(target)
# Currently target is always an instr. This could change
# in the future, e.g., if we have a pseudo targetting a
assert target_instr
target_popped = effect_str(target_instr.input_effects)
target_pushed = effect_str(target_instr.output_effects)
- if pushed is None:
- assert popped is None
+ if idx == 0:
popped, pushed = target_popped, target_pushed
else:
assert popped == target_popped
assert pushed == target_pushed
case _:
- typing.assert_never(thing)
+ assert_never(thing)
return instr, popped, pushed
@contextlib.contextmanager
continue
instr, popped, pushed = self.get_stack_effect_info(thing)
if instr is not None:
- assert popped is not None and pushed is not None
popped_data.append((instr, popped))
pushed_data.append((instr, pushed))
# Compute the set of all instruction formats.
all_formats: set[str] = set()
for thing in self.everything:
- format: str | None
match thing:
case OverriddenInstructionPlaceHolder():
continue
case parsing.Macro():
format = self.macro_instrs[thing.name].instr_fmt
case parsing.Pseudo():
- format = None
- for target in self.pseudos[thing.name].targets:
+ for idx, target in enumerate(self.pseudos[thing.name].targets):
target_instr = self.instrs.get(target)
assert target_instr
- if format is None:
+ if idx == 0:
format = target_instr.instr_fmt
else:
assert format == target_instr.instr_fmt
- assert format is not None
case _:
- typing.assert_never(thing)
+ assert_never(thing)
all_formats.add(format)
# Turn it into a sorted list of enum values.
self.pseudo_instrs[thing.name]
)
case _:
- typing.assert_never(thing)
+ assert_never(thing)
with self.metadata_item(
"const struct opcode_macro_expansion "
case parsing.Pseudo():
pass
case _:
- typing.assert_never(thing)
+ assert_never(thing)
with self.metadata_item(
"const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE]", "=", ";"
case parsing.Pseudo():
pass
case _:
- typing.assert_never(thing)
+ assert_never(thing)
print(
f"Wrote {n_instrs} instructions and {n_macros} macros "
case parsing.Pseudo():
pass
case _:
- typing.assert_never(thing)
+ assert_never(thing)
print(
f"Wrote {n_instrs} instructions and {n_uops} ops to {executor_filename}",
file=sys.stderr,
case parsing.Pseudo():
pass
case _:
- typing.assert_never(thing)
+ assert_never(thing)
print(
f"Wrote some stuff to {abstract_interpreter_filename}",
file=sys.stderr,