""" Scrapes xenia-canary's emit files for the location of each instruction's semantic implementation function `InstrEmit_`. The files are: src/xenia/cpu/ppc/ppc_emit_alu.cc (integer ALU) src/xenia/cpu/ppc/ppc_emit_memory.cc (loads/stores/cache/sync) src/xenia/cpu/ppc/ppc_emit_altivec.cc (VMX + VMX128) src/xenia/cpu/ppc/ppc_emit_fpu.cc (floating-point) src/xenia/cpu/ppc/ppc_emit_control.cc (branch/CR/SPR/syscall/trap) Returns, for each mnemonic, the relative file path and the starting line of the `int InstrEmit_(...)` definition. """ from __future__ import annotations from dataclasses import dataclass from pathlib import Path import re CXX_EMIT_FILES = [ "src/xenia/cpu/ppc/ppc_emit_alu.cc", "src/xenia/cpu/ppc/ppc_emit_memory.cc", "src/xenia/cpu/ppc/ppc_emit_altivec.cc", "src/xenia/cpu/ppc/ppc_emit_fpu.cc", "src/xenia/cpu/ppc/ppc_emit_control.cc", ] @dataclass class CxxRef: mnem: str emit_file: str | None = None # relative to xenia-canary/ emit_line: int | None = None def _cxx_ident(mnem: str) -> str: """Canary maps '.' in the mnemonic to a trailing 'x' in the C++ symbol (e.g. addic. → InstrEmit_addicx).""" return mnem.replace(".", "x") class CxxScraper: def __init__(self, repo_root: Path): self.canary_root = repo_root / "xenia-canary" self._index: dict[str, tuple[str, int]] = {} fn_pat = re.compile(r"^\s*int\s+InstrEmit_([A-Za-z_][A-Za-z0-9_]*)\s*\(") for rel in CXX_EMIT_FILES: path = self.canary_root / rel if not path.is_file(): continue for i, line in enumerate(path.read_text(encoding="utf-8").splitlines(), start=1): m = fn_pat.match(line) if not m: continue name = m.group(1) self._index.setdefault(name, (rel, i)) def lookup(self, mnem: str) -> CxxRef: ident = _cxx_ident(mnem) hit = self._index.get(ident) if hit is None: return CxxRef(mnem=mnem) return CxxRef(mnem=mnem, emit_file=hit[0], emit_line=hit[1]) if __name__ == "__main__": root = Path(__file__).resolve().parent.parent.parent s = CxxScraper(root) for m in ("addx", "addic.", "lwz", "bclrx", "mfspr", "stvx", "vaddfp", "vaddfp128", "faddx", "lvsl"): r = s.lookup(m) print(f"{m:12s} {r.emit_file}:{r.emit_line}")