The shortlist points at VU microcode; the decomp extents are unverified

391 candidates on correct bytes, 73 under 16 immediates. The densest, 0x2dca20,
164 bytes with three distinct immediates, disassembles through tools/overlay-anchors
as:

    xori.b $w0, $w0, 0xa2
    ext    $v0, $s0, 0, 1
    addu   $a2, $v0, $a2

xori.b and ext are VU1 mnemonics and three-operand addu is not MIPS32. Capstone is
decoding COP2: 0x2dca20 is VU microcode. Same answer 0x2ee138 gave.

That calls the frequency result into question more seriously than the displacement
did. The measurement filtered on opcodes excluding COP2, so VU cannot explain the
391 counts directly -- but the function extents come from the decomp's CPU
analysis, and if an extent spans a VU region the window scanned is mixed and the
immediate set attributed to that function is not a function's.

Status: the enrichment is real as a measurement of those windows; what the windows
are is now doubtful.

Next: verify decomp extents land on CPU code before trusting any of them -- decode
a sample and require a plausible prologue. Same shape as the cd16485 check, and the
fourth time a 'real shortlist' has needed one more verification first.

286 passing with the disc present, clippy clean.
This commit is contained in:
2026-10-14 06:27:05 +02:00
parent 36d8d2b00c
commit 91b09955c8
+47
View File
@@ -2541,3 +2541,50 @@ and reported every one with the same confidence as the kind that does.
are a legitimate shortlist -- but the disassembly that would consume them must go
through `tools/overlay-anchors`, whose output has now been checked against a word
the build pins.
### The shortlist points at VU microcode, not CPU code
391 candidates on correct bytes, 73 with fewer than 16 immediates. The densest is
`0x2dca20` -- 164 bytes, **three** distinct immediates, one of which is `0xc0`.
Disassembled through `tools/overlay-anchors`:
0x2dca20: bnel $a1, $fp, 0x2dca38
0x2dca24: lbu $a2, ($s7)
0x2dca28: xori.b $w0, $w0, 0xa2 <-- VU
0x2dca2c: ext $v0, $s0, 0, 1 <-- VU
0x2dca30: b 0x2dcac8
0x2dca38: sll $a1, $a1, 4
0x2dca40: .word 0x0200202d
0x2dca48: addu $a2, $v0, $a2 <-- 3-operand: MIPS-III, not MIPS32
`xori.b` and `ext` are VU1 mnemonics and the three-operand `addu` is not MIPS32 at
all. **Capstone is decoding COP2.** So `0x2dca20` is VU microcode, not a CPU
function.
That is the same answer `0x2ee138` gave. Two of the densest candidates in the
"moby_classes offset" shortlist are vector-unit code.
**This calls the frequency result into question again, and more seriously than
the displacement did.** The enrichment measured 391 CPU functions carrying
immediate `0x00c0` at 11x-45x over neighbours, and that measurement filtered on
opcodes 0x09/0x0d/0x0f/0x0c/0x05/0x06 -- which **excludes COP2**. So VU code
cannot explain those counts directly. But the *function extents* come from the
decomp's CPU analysis, and if any extent spans a VU region then the window being
scanned is mixed, and the immediate set attributed to that "function" is not a
function's.
**Honest status:** the enrichment is real as a measurement of those windows. What
those windows are is now doubtful, because the decomp's extents have not been
verified to land on CPU code, and two independent spot-checks of the densest
candidates landed in VU microcode.
**What this needs before it can be used:** verify that a known CPU function's decomp
extent actually contains CPU instructions -- same shape as the `cd16485` check.
Decode a handful of extents and require them to begin with a plausible prologue
(`addiu $sp, $sp, -N` or `lui $gp`). Any extent that does not is a mis-bound or
VU-overlapping window, and the 391 has to be recomputed over the survivors.
That check is cheap, it is the same check that would have caught this six commits
ago, and it is the honest next step. It is also, at this point, the fourth time a
"real shortlist" has turned out to need one more verification first.