mirror of
https://github.com/odin-lang/Odin.git
synced 2026-08-04 13:18:31 +00:00
The MIPS decode tables are universal — every variant (MIPS I..64/R6, the PS1 GTE, PS2 MMI/VU, PSP VFPU) shares one table. Some primary opcodes collide across variants: most visibly 0x37 is `LD` on 64-bit MIPS but `vfim.s` on the PSP Allegrex VFPU. The decoder took the first table match, so `LD $ra, 0($sp)` (0xdfbf0000) mis-decoded as `vfim.s $31, 0`. Each Decode_Entry already carries a `feature`; the decoder just ignored it. `decode` now takes a `features: Feature_Set` (a bit_set over `Feature`), defaulting to `FEATURES_ALL` so existing callers are unchanged, and skips an entry whose feature isn't enabled — the first ENABLED match wins, preserving the most-specific-mask-first order. Added `FEATURES_MIPS_III` (MIPS I/II/III + COP0 + FPU — the VR4300 / classic 64-bit baseline) for N64/MIPS-III consumers. decode_smoke: opcode 0x37 decodes as LD under FEATURES_MIPS_III and (still) as the PSP VFPU entry under FEATURES_ALL. 65 decoder checks pass.