268 a register __asm__ pin on a call-clobbered register is honored EXACTLY when the
pinned range crosses no call — turning 257-2's 'pins are silently ignored' into a
rule with a precondition, and explaining both faces: a pin that does nothing
(range crosses a jal, gcc silently falls back) and a pin that fixes a REGALLOC
residual in a function that has calls (range sits between them). Three A/B'd cards.
269 ten addenda, plus the 266 solo-lever sweep table.
THE HEADLINE IS THE INERT-RIDER RATE. 19 strip-tests across 13 banked bodies: 6 of 19
credited levers are byte-inert (32%), against 4 of 8 last batch. One in three 'this is
what made it match' claims credits something that changes nothing — and one whole
proposed section dissolved under its own strip test. 67 of 82 candidates (81.7%) were
already covered, matching the previous batch's re-derivation rate.
40 KiB
Distillation — waves ax · bm (batch .run/distill_inflight/axbm.json)
PROPOSED ONLY — nothing here has been applied to docs/matching-cookbook.md or docs/cookbook-index.md.
Reviewer lands the sections. All A/B evidence lives under .run/s59_distill2/ — every variant file
re-runnable via tools/match_one.py <fn> --c <file> --asm-subdir <the card's own asm dir> (the
homonym trap bit this review's own harness once: find-first-hit returned ov_SC06_030's
func_80181164.s, 265 ins — always pass the card's exact subdir).
0. The ledger — counts first (R41: every number's denominator stated)
82 candidate notes read — all of them — from 2 files: ax 41, bm 41 (matches the batch
manifest's novel: 82).
| disposition (primary, one per candidate) | rows | of 82 |
|---|---|---|
| Already covered (cited § per row below) | 67 | 81.7% |
| Feed a proposed addendum (ADD-1…ADD-10 below) | 9 | 11.0% |
| Feed the proposed new law §268 | 2 | 2.4% |
Refuted (6 distinct claims; 4 by live match_one A/B, 1 by artifact, 1 definitional) |
4 | 4.9% |
§266 sweep (the mandated inert-rider audit): 19 solo-lever verdicts across 13 banked functions,
34 valid match_one runs (13 baselines — all reproduced MATCH — plus 21 variants). 6 of 19 levers
are INERT RIDERS; 13 are load-bearing. Full table in part 1a. Two standing §257 dead-end-ledger rows
acquired byte-proven bounds out of this sweep (§257-2, §257-8).
Batch-hygiene notes for the campaign:
- Wave
axis dominated by the gate-null/integration era: ~20 of its 41 rows are §259-4/§236 process reports ("body byte-exact, fault outside the card") from the wave-revert period, and at least five re-mine functions the cookbook already cites BY NAME (func_8017ECA8→§236-6,func_8017FE54→its at-wave verdict,func_8017F10C→§257-6,func_8018944C→§254,func_801853F0→§224-addendum-4). A dedup guard keyed function→cookbook-exemplar would have shrunkaxby a third. - One non-MATCH card leaked through the "byte-gate ACCEPTED" filter: the ax
func_8017FB04note is a LENGTH-DRIFT/−4 residual report — and it analyzes the HANDWRITTEN ov_SC03_030 homonym for the second consecutive batch (previous batch's REF-3; §265's cautionary tale). Harvester should gate candidate rows on the verdict column, not just the wave file. func_8017F328appears in BOTH waves (same function, consistent notes) — counted once per wave per the manifest, distilled once here.
0a. Per-candidate disposition (one line each; spot-check any row)
Verdicts: cov §X = already covered (drop; ⊕ = also a cross-confirmation card worth appending per
§259's standing instruction — collected in ADD-10). ADD-n = feeds proposed addendum n. §268 =
feeds the proposed new law. REF = refuted (part 3).
Wave ax (41):
| fn | verdict |
|---|---|
| func_801A23CC | cov §14b (leaf = true gate) + §167-27 + §259-4 (residual points at sibling stubs) |
| func_800CF010 | cov §51/§166/§259-4 (self-cited; gate-null) |
| func_8017FB04 | REF-1 — analyzes the HANDWRITTEN ov_SC03_030 homonym again (prev. REF-3, §265); note is not even a MATCH |
| func_801824E4 | ADD-2 (silent-splice decl default: () beats fleet-vote) + cov §255-1 (its empty-case lever cited there by name) + §165-36 decoy warning |
| func_8017F10C | cov §257-6 — cited there by name ("two independent notes") + §249 (volatile self-copy) + §21/L1844 (u16* → ori) ⊕ |
| func_8017FCBC | cov §150-B-data + §250 (array-vs-scalar) + §238 (re-read the destination before re-deriving) ⊕; corroborates ADD-2 |
| func_800CF078 | cov §259-4 + §261/§18-P29 (-O0 carve fragility) |
| func_801A06AC | cov §259-4 (wave revert semantics); cites line numbers s1144/s1284 → §14/§14d (gap #5) |
| func_8017EF50 | cov §236-2 + §103 (file→block scope move) |
| func_80185760 | cov §214 (0.69 twin misdirect) + §194-E (in-TU dispatchers are the real relatives) |
| func_801A23A8 | cov §259-4 + §28 + §236-family (duplicate inline defs in TU = infra fault) |
| func_8017ECA8 | cov §236-6 — its own exemplar, re-noted verbatim |
| func_800CEFBC | cov §259-4 (the "undocumented class" IS documented: §236 + §259-4 — gap #6) |
| func_80181D20 | cov §28 (cited as line §2329) + §43/§94 block-scope practice (gap #5) |
| func_800CF370 | ADD-3 (cross-binary same-name DIFFERENT-body defs; resident.c:281 verified) |
| func_8017DBD8 | cov §238 (wrong-function Ghidra seed) + §217 (stack-arg decode) |
| func_801884F4 | cov §259-4 |
| func_8018944C | cov §254 — cited there by name (3-arg, a1/a2 dead, caller-pinned arity) + §259-11/§236-4 (standalone include fact) |
| func_80180CE0 | cov §164-74 (self-cited) + §150-B (non-authoritative fleet row → ground-truth the callee's own .s) ⊕ |
| func_80180634 | cov §259-4 (session cut at submit boundary) |
| func_80180D14 | cov §259-4 |
| func_80183038 | cov §259-4 (unswapped INCLUDE_ASM slot = the revert face; splice never landed) |
| func_80181A98 | cov §259-4 + §215-9 (checked, inapplicable) |
| func_80180EE0 | cov §259-4 + §3-T4 (pre-if temp hoist is standard) |
| func_801820B0 | cov §251-2 (&= ~0x10 → addiu -0x11) + §213/§226 (u16[3] as three statements) + §3-T2 |
| func_80182CF4 | cov §236-2 ⊕ (strongest DATA-symbol card: two incompatible block-scope decls + a file-scope third kills the TU; block-scope move cures) |
| func_8017E4D0 | cov §236-PROCEDURE (its 4-point checklist is §236's procedure) + §259-4 |
| func_801856C0 | cov §217 + §252-reading + §3-T4 + §239 (the "operand-swapped *8+base" = §239's plus-tree operand order) |
| func_80183BA0 | cov §164-59 (self-cited: callee return parked in mult→mfhi window) ⊕ |
| func_8017E0C0 | cov §259-4 |
| func_8018ACD4 | cov §162d1/§165-19 (named single-set temps; barrier-blocks-sink = §257-8 family) ⊕ |
| func_8017FE54 | cov §164-57/§195-F + §211 — same function, same verdict as the previous batch (dup re-mine) |
| func_800CEED0 | ADD-1 (volatile REQUIRED on the head-interposed asm — bounds §257-8; A/B-proven this review) |
| func_8017F328 (ax) | ADD-9 (case-body source order probed on the 29-case tree) + cov §55a/§222/§224 |
| func_8017F964 | §268 card 1 (pins on $4/$2 honored — non-call-crossing ranges; strip = 14-mismatch) |
| func_801853F0 | cov §224-addendum-4 — cited there by name (goto target = innermost else-arm label) |
| func_801811D0 | cov §235 + caution: deliberate probe constant in a submission = §235's blind spot weaponized (banked tree carries the true 0x7FFFFFFF — line 4535) |
| func_80180AE0 | cov law 2/§194-E (same-TU twin style cloning) |
| func_801A06E8 | cov §193-A/§194-E + §259-4 |
| func_801A9FA8 | cov §193-A + §259-4 ("len-vein" is card jargon, not a cookbook term — no gap) |
| func_80183740 | cov §165-17-correction (L19102: the temp's TYPE is the sched dial — u8 retype fixed the swap) + §194-D |
Wave bm (41):
| fn | verdict |
|---|---|
| func_8017F0A8 | ADD-5 (s16 sign-test face; 3 rider components refuted by 4-way A/B — REF-5) + cov §222-add-1/§255 (3-case switch) + §224 (inline increment per case) + §76-family (named boolean) |
| func_801810CC | cov §237-escape-2 (def-side asm-label alias "ALSO FOR A RETURN-TYPE CLASH" — the exact cure) + §43-L3217 (pedwarn drop) + §85/§73 + §236-8 ⊕; gap #2 (cited §2535 = §38's line) |
| func_80181164 | ADD-4 (§167-37 companion row: store INSIDE the arm — both alternatives measure 2-mismatch, A/B'd) |
| func_801A6A38 | cov §257-6/-9 (unpin first) + §229 ⊕ (negative face: plain store reorder does NOT drag the la) + §162c/§251(3) + §250 |
| func_8017D164 | ADD-8 (§30a third column: p++ vs cast-PLUS vs p[k]; bare-index A/B = 16-mismatch WIDTH/lhu!=lui) |
| func_8018BAC4 | REF-2 (volatile-load lever inert by A/B) · pins load-bearing → §268 corroboration · select shape cov §194-B family |
| func_8017FDC4 | cov §176-B3 (self-cited) + §220-addendum (named temp bought a second s-reg) + §223 (j-rejoins-tail read) |
| func_8017DB9C | cov §193-A + §229 (&D passed by address) — self-declared no-gap |
| func_8017F2A4 | cov §238 (wrong-binary .s path) + §165-36 step-0 + §225-family grouping |
| func_8017E448 | cov §238 (wrong .s path — ov_SC07_001 homonym trusted half a session) + §211-addendum-4 (descending init = emission order) + §214 (twin literals never transfer) |
| func_80182AC4 | ADD-7 (named single-set loop constant pins the prologue init order; literal = 4-mismatch cse profile, A/B'd) |
| func_8018A0E0 | cov §236 + §37 (block-scope asm aliases) + §259-4 |
| func_801F0D88 | REF-4 (byte-offset-IV spelling inert by A/B — indexed form also MATCHes) · guard structure cov §10/§1412 · match_one prepends common.h = documented in the tool |
| func_8017F328 (bm) | ADD-9 (same function as ax; the probe run once) + cov §55a (plain local; case bodies in source order) + §224 (cross-jump makes the shared tails) |
| func_8018687C | cov §3-T4 (bounded) + §165-L14292 tell (tie + sliding block = layout) + §5 (phantom frame) |
| func_8017D0AC | cov §193-A/§214 (twin constants don't transfer; store order per-card) |
| func_801818D4 | cov §193-A (byte-identical sibling transplant) + §238 (stale backlog draft discarded) |
| func_8017CDBC | cov §161c (self-cited) + §238 (seed invented the symbol) |
| func_800CB3D8 | cov §48-C2/§160a (8-word block = struct assign) + §229/§20 (named cross-call pointer) + §30 (u8* unscaled) |
| func_8017E4A4 | cov §220/§220-addendum + §176-A · REF-6 (wording): "parameter NAME = target register" — names are alpha-inert |
| func_801827A0 | cov §208 row 2 (self-cited; split call-result/final-value locals) ⊕ |
| func_800CAF24 | cov §3-T4 + §263-family (arg literal-vs-register error surfaces as LENGTH-DRIFT) + §193-A |
| func_800CB5DC | cov §193-A + §3-T2 (OR after byte stores = plain source order) |
| func_8017F01C | cov §3-T4/§247 (negated compare places the arms) + §199-E + §237 + §238 (wrong reference in prior session) |
| func_80182480 | §268 card 2 ($16 pin as live-range shrinker; nopin = +2, frame 0x20 vs 0x18, A/B'd) + ADD-6 |
| func_801819BC | cov §256 (goto dispatch; positive ==2 goto → beq+j; shared store reached by fall-through) |
| func_8017FE78 | REF-3 ($17 pin inert by A/B) · $16 pin load-bearing → §268 corroboration + ADD-6 · cast-call cov §237 |
| func_8017DFE4 | cov §238 (same-VA different-overlay transcript trap) + §176-A (both stores before the call) + law 2 |
| func_801A060C | cov §193-A/§194-E — self-declared no-gap |
| func_80181D08 | cov §252/§253 ⊕ (postfix-old-value axis reaches STORE PLACEMENT — second card for single-observation §253) + §213-3/§267-ADD-9 (anonymous struct by address) + §226-add (0x7FFF last) + §227 |
| func_8017F4C8 | cov §238 (target re-carved mid-task; re-read the .s after any interruption) |
| func_801856F0 | cov §210 — the exact lever (name the mask; andi+sltiu vs srl/xori) ⊕ my A/B is its second live gate; gap #1 |
| func_801A0DA4 | cov §251-2 (addiu -0x5 reads as &= ~0x4, never ~0x5) + §193-A |
| func_801862C8 | cov §243 (sh blocks CSE ⇒ re-derive inline, lw appears twice) + §234 (-0x100000 for bare lui) |
| func_8017ED38 | cov §229/§20 (pointer-local for the u16 global RMW; bare ` |
| func_8017F8C0 | cov §167-30 + §164-56/§167-31 + §194-D + §239 (named temp for subu operand order) — composition, no gap |
| func_8017D8D0 | cov §162d1 ⊕ — supplies its missing independent A/B gate (two-statement form −1, mask folds into jal-2's slot) |
| func_801EFC30 | cov §195-D/§235 ⊕ (transposed-digit jal = false clean at 10 ins; the post-MATCH walk is not optional) |
| func_801835F4 | cov §164-73/§164-74 (stores-per-arm; no cross-bb CSE rematerializes the pointer per arm) |
| func_8017D7C4 | cov §220-addendum (raw a0 self-reuse — self-declared standard) + §214 (macro twin) |
| func_80180150 | cov §214-addendum (twin is an INCLUDE_ASM stub ⇒ grep engine_core.h DEFINE_ for the tail sequence — the exact retrieval note) |
1. Proposed new section
§268 — A register __asm__ PIN ON A CALL-CLOBBERED REGISTER IS HONORED EXACTLY WHEN THE PINNED RANGE CROSSES NO CALL (P31 S59c; three A/B'd cards, unifying §257-2's two)
The symptom you see in a diff — two opposite faces. Face A (§257-2's): you add a $2/$4 pin
and the output does not move an instruction — the pin "is silently ignored." Face B (this batch's):
a REGALLOC-LOCAL / REGALLOC-PERM residual where values rotate through $v0/$v1/$a0 and no
naming, ordering, or width spelling sticks — and a pin FIXES it, in a function that has calls, which
§257-2 says should not work.
The mechanism (behavioral; both directions byte-proven). The pin binds the variable to the hard
register only where the value's live range avoids calls. A range that crosses a jal cannot live in
a call-clobbered register, and gcc-2.7.2 neither errors nor saves/restores — it silently falls back
to ordinary allocation (that is §257-2's observed identical-to-unpinned output). A range that sits
between calls is honored fully, and inside that window the pin also steers first-fit for every
neighboring value. §257-2 is therefore not "pins on call-clobbered regs do nothing"; it is "pins on
call-CROSSING values do nothing." Check which one you have before writing the pin off — or in.
The C spelling. Pin only values born after one call and dead before the next:
register s32 x __asm__("$4");
register s32 r __asm__("$2");
...
r = rand() & 0xF; /* born from $v0, used immediately */
x = *(u16 *)(s0 + 6) - 8;
*(u16 *)(s0 + 6) = x + (*(u16 *)(param_1 + 0x104) + r); /* both dead before next jal */
The evidence.
func_8017F964(ov_SC05_001, 45/45, banked, THREE calls): both pins' ranges are call-free windows. Solo strip → 14 mismatched, REGALLOC-LOCAL ($a0/$v0/$v1rotate). Honored, load-bearing. A/B:.run/s59_distill2/func_8017F964_{base,nopins}.c.func_8018BAC4(ov_SC04_011, 32/32, banked, LEAF):$2/$3/$4pins,$3shared by two disjoint ranges (r/x). A leaf has no calls anywhere, so every pin is honored: strip → +3 LENGTH-DRIFT / 34 mismatched. A/B:func_8018BAC4_{base,nopins,bare}.c.func_80182480/func_8017FE78: pins on CALLEE-SAVED$16— outside this law's register class (callee-saved pins are always honored) but confirming the strip-test discipline; see ADD-6.- §257-2's
func_8018270C/func_8017F790:$2pins on values living ACROSS calls → output identical to unpinned. Ignored. (Unchanged; now explained.)
What was tried and failed. The func_8017F964 drafter burned its session on free-local
spellings and parenthesisations ("no free-local spelling reaches that assignment") — correct, and
now explained: inside a call-free window the assignment is local-alloc first-fit, which C spelling
barely reaches; the pin is the intended tool there. Conversely REF-5 of the previous batch
(func_801816C8) and this §'s Face A are the SAME test read in the other direction.
Boundary and composition. §257-6 still stands (pinning MORE than the target's callee-saved set
blocks jal-slot filling — pin only what allocation would choose anyway); §257-3 (pins on
parameters are a syntax error); §162p/§37 (a pin forfeits ×134 family propagation — try the unpinned
spelling first, §257-9). And compose with §266: before CREDITING a pin, strip it; before DISMISSING
one as a rider, check whether its range crosses a call. Grep bait: pin ignored, pin did nothing,
call-clobbered pin, $2 pin rand, pin between calls, REGALLOC-LOCAL pins.
1a. The §266 sweep — every solo-lever A/B run for this batch
All files in .run/s59_distill2/; every baseline re-verified MATCH before the strip.
| fn (banked ins) | lever stripped/varied | solo A/B result | verdict |
|---|---|---|---|
| func_8017F0A8 (91) | named shifted temp t = v1 * 0x10000 → inline expr |
MATCH | INERT RIDER |
| func_8017F0A8 | * 0x10000 spelling → plain (s16)v1 < 0 |
MATCH | INERT RIDER |
| func_8017F0A8 | init-then-override → plain if/else select |
MATCH | INERT RIDER |
| func_8017F0A8 | s16 sign test → raw s32 v1 < 0 |
DIFF −1, 61 mism. | load-bearing (semantic) |
| func_8018BAC4 (32) | volatile on the three u8 loads |
MATCH | INERT RIDER |
| func_8018BAC4 | the $2/$3/$4 pins |
DIFF +3, 34 mism. | load-bearing |
| func_800CEED0 (13) | __volatile__ on the interposed asm |
DIFF 5 mism. (sw $ra↔sll swap) | load-bearing → ADD-1 |
| func_80181164 (48) | store moved above the guard | DIFF 2 mism. | load-bearing → ADD-4 |
| func_80181164 | named local removed (§167-37 no-name form) | DIFF 2 mism. | load-bearing → ADD-4 |
| func_8017FE78 (52) | both $16/$17 pins |
DIFF +3, 46 mism. | load-bearing (as a set) |
| func_8017FE78 | $17 pin alone |
MATCH | INERT RIDER |
| func_801856F0 (24) | named mask temp → return (s0&0x8000)==0 (and ! form) |
DIFF +1, 9 mism. (srl/xori) |
load-bearing → §210 ⊕ |
| func_80182AC4 (27) | named val = 1 → literal store |
DIFF 4 mism. (cse profile) | load-bearing → ADD-7 |
| func_8017D8D0 (28) | one-expression rand-sum → two statements | DIFF −1, 22 mism. | load-bearing → §162d1 ⊕ |
| func_8017F964 (45) | $4/$2 pins |
DIFF 14 mism. REGALLOC-LOCAL | load-bearing → §268 |
| func_80182480 (22) | $16 pin → plain local |
DIFF +2, 21 mism. (frame 0x20≠0x18) | load-bearing → ADD-6 |
| func_801F0D88 (33) | byte-offset IV → indexed D[i][0], i++ |
MATCH | INERT RIDER |
| func_8017D164 (20) | cast-PLUS → bare p[k] index |
DIFF 16 mism. WIDTH/lhu!=lui | load-bearing → ADD-8 |
| func_8017F328 (307) | case 2/3 SOURCE blocks swapped | DIFF 1 mism. IMM-OFFSET/−8 | load-bearing → ADD-9 |
6 of 19 credited levers are riders (32%) — the same one-in-three rate §266 measured on the previous batch (4 of 8). The harvest-note convention ("banked WITH X; X not solo-A/B'd") is not yet being followed by drafters; every rider above arrived stated as a certainty.
2. Proposed addenda (append each under its named section)
ADD-1 → §257-8 addendum — THE INTERPOSED ASM'S __volatile__ IS A PER-SHAPE DIAL, AND THE "NO-OUTPUT ASM IS IMPLICITLY VOLATILE" LORE IS BYTE-FALSE IN gcc-2.7.2
§257-8 records that §16x's interposed-asm prologue lever DIES under __volatile__ and only the
non-volatile __asm__("" :: "r"(arg)) flips the save pair (func_80186C0C, banked twice). The
opposite polarity is now equally byte-proven: func_800CEED0 (md_MAIN_003, 13/13, banked) needs the
prologue order sw $ra FIRST and gets it only with __asm__ __volatile__("" : : "r"(idx)) on
the $2-pinned incoming index; the non-volatile spelling swaps sw $ra below the sll (5
mismatched, OPCODE-MIXED — A/B .run/s59_distill2/func_800CEED0_{base,novol}.c). Two corollaries:
(1) the volatile-ness of an interposed asm is a per-shape ~20-second A/B, not a rule — do not carry
either polarity between functions; (2) the folk rule "an asm with no outputs is implicitly volatile"
does NOT hold behaviorally in this cc1 — the explicit keyword changes scheduling. Grep bait:
interposed asm volatile, prologue save order asm, sw $ra first.
ADD-2 → §236 addendum (item 1 corollary) — THE SILENT-SPLICE DECLARATION LADDER: WHERE THE TU HAS NO SPELLING, UNPROTOTYPED () BEATS THE FLEET VOTE
§236-1 says in-TU beats fleet consensus, always. The vacuum case needed stating: at a splice point
where the TU carries NO declaration for a callee (defined below, never declared above), the robust
default is the unprototyped () extern for every callee — C89-composite with any later
prototype or definition, immune to §236's classes 1/3/5/8. Copying the atlas/fleet def-signature
instead is what failed the gate once on func_801824E4 (ov_SC02_031, 63 ins — atlas
('void',('void*',)) lifted, gate red; () banked). func_8017FCBC (ov_SC03_030, 230 ins)
corroborates: canon votes for its callee come from OTHER binaries' same-address functions (§150-B),
so a prototyped canon lift would be actively wrong; () vs prototyped verified byte-neutral. The
ladder: in-TU spelling > unprototyped () > fleet vote — the fleet is LAST even in a vacuum
(§196's loss extended). Grep bait: no in-TU spelling, undefined splice point, unprototyped default, fleet vote vacuum.
ADD-3 → §238 addendum — TWO BINARIES CAN EACH DEFINE THE SAME func_ NAME WITH DIFFERENT BYTES, AND NO GENERATED REPORT SHOWS IT
func_800CF370 is defined in src/md_MAIN_003/md_MAIN_003.c:141 (13 ins, this card's bytes) AND in
src/resident/resident.c:281 with contradicting content — both correct for their own binaries
(separate links; resident's own comment admits its disassembly matches neither image).
duplicates.cross.md inventories only byte-IDENTICAL groups, so a byte-DIFFERENT same-name pair is
invisible to every generated report, and a "reconcile" toward either side silently breaks the other
binary. This is §150-B's "same address + same name ≠ same body" restated at the DEFINITION level:
before trusting an in-TU splice for a func_800xxxxx/shared-address symbol, grep the
sibling-binary TUs (src/resident/, other src/md_MAIN_*/) for a second definition, and never
conform one binary's def to another's. Grep bait: cross-binary duplicate, same name different bytes, resident twin, reconcile trap.
ADD-4 → §167-37 addendum — THE FIFTH PRECONDITION, NOW MEASURED: DOWNSTREAM FIELD RE-READS ⇒ NAME IT AND STORE INSIDE THE ARM
§167-37's boundary note ("do not widen past its four preconditions") now has its byte-proven
counter-case. func_80181164 (ov_SC05_005, 48/48, banked): same three-line shape (call result,
stored to +0x20, null-guarded, handed to the next call) plus downstream uses through five
field re-reads — and the target's store sits in the jal's slot inside the else arm (addu $a0,$v0 in the bnez slot, sw $a0,0x20($s0) in the call's slot), not in the guard's slot. Both
prescriptions §167-37 would suggest measure 2-mismatch by solo A/B: the no-local store-and-re-read
form AND the named-local store-before-guard form each swap sw↔move at idx 6/14
(.run/s59_distill2/func_80181164_{preguard,noname}.c). The winning spelling names the result and
places the store between the guard and the first consuming call, inside the arm. Read the store's
HOME first: store in the GUARD's slot ⇒ unconditional, §167-37/§252-reading (write it before the
if); store in the ARM's call slot ⇒ conditional, this row (write it inside the arm). Mechanism per
§48-A4: the named local dies at the second call's argument setup, so its range crosses zero calls
and takes the arg-register copy preference; dbr then fills both slots. Grep bait: store inside the arm, sw in jal slot inside arm, name nothing failed, 167-37 counter.
ADD-5 → §267-ADD-6 / §172b-1 addendum — THE SIGN-TEST FACE: (s16)v < 0 IS sll 16 + bgez ON THE SHIFTED COPY, RAW STAYS LIVE — AND THE HALFWORD-ABS SHAPE NEEDS NO RITUAL
ADD-6 (§267) gave the ZERO-test face ((x<<16) != 0). The SIGN face: testing (s16)v < 0 —
equivalently (v << 16) < 0 or v * 0x10000 < 0 — emits a lone sll $t,$v,16 feeding
bgez/bltz on the SHIFTED copy with no sra (only the sign is needed), while raw v stays
live for both arms. The halfword-abs composition seen on func_8017F0A8 (ov_SC03_092, 91/91,
banked) — subu; sll 16; bgez (slot: addu $a0,raw); negu $a0,raw — is reached by ANY select
spelling over that test: named-shifted-temp, inline expression, (s16) cast, and plain
if/else all compile byte-identical (4-way A/B, .run/s59_distill2/func_8017F0A8_*.c). The ONLY
load-bearing choice is the semantics: the raw s32 test v < 0 drops the sll and drifts −1. The
drafter's "two-liveness" construction (t = v1 * 0x10000; a0 = v1; if (t < 0) a0 = -v1;) is three
inert riders around one s16 cast — do not transcribe the ritual into future drafts. Reading rule: a
bgez on a freshly-sll'd copy whose ARMS use the unshifted register = abs/negate-select of the
low halfword; write if ((s16)x < 0) and any select shape. Grep bait: sll 16 bgez, abs idiom,
negu delay slot abs, sign test halfword, two liveness.
ADD-6 → §220-addendum — THE FOURTH FACE: WHEN THE NAMED COPY ITSELF BUYS THE EXTRA CALLEE-SAVED, PIN THE COPY TO $16
§220-addendum's three faces end at "an explicit named local is the reliable way to pin a
callee-saved copy." The fourth face: sometimes the plain named copy is what OVERSHOOTS — parameter
pseudo and copy each take a callee-saved register. func_80182480 (ov_SC03_098, 22/22): plain
s32 s0 = arg0; → +2 LENGTH-DRIFT, frame 0x20 vs 0x18, extra $s1 save/restore;
register s32 s0 __asm__("$16"); s0 = arg0; banks — the pin unifies copy and home so the parameter
pseudo dies at the copy. func_8017FE78 (ov_SC02_017, 52/52) is the same face at two registers:
stripping both pins costs +3 with the whole s-register file shifted ($s0→$s1, constant→$s2).
Both solo-A/B'd (.run/s59_distill2/func_80182480_nopin.c, func_8017FE78_nopins.c). Distinct
from §136d-1 (pin-as-CSE-defeat): this pin SHRINKS a live range. Compose with §266 — FE78's second
($17) pin was a rider (strip-tested MATCH); pin the copy, not the constants. And the standing
tax: a pin forfeits ×134 propagation (§162p) — try §220's plain-parameter form first; reach for the
pin only when the plain copy demonstrably buys the extra register. Grep bait: pin the copy,
extra callee-saved from local, s16 pin live range, frame 0x20 vs 0x18.
ADD-7 → §229 addendum — THE VALUE FACE: A LOOP-STORE CONSTANT SPELLED AS A LITERAL HAS NO SOURCE POSITION; NAME IT TO PIN THE PROLOGUE INIT ORDER
§229's law is stated for ADDRESSES. The same birth-order mechanism reaches a plain constant:
func_80182AC4 (ov_SC01_080, 27/27, banked) needs the prologue order la $a1(D_801C7560),
li $a2,1, li $v1,3, la $v0(D_801C755C). Writing the loop store as literal *p = 1 leaves the
constant with no statement of its own — gcc materializes it at its own rank and the surrounding
address setups re-order (4 mismatched, ADDRESSING/lui!=addiu, profile=cse — A/B
.run/s59_distill2/func_80182AC4_lit.c). A single-set named local (val = 1; before the loop,
*p = val; inside) gives the constant a birth position, and §3-T2's source-order law then governs
all four inits. Boundary note for §3-T2: a literal OPERAND is not a statement — source order cannot
place what has no statement. Grep bait: literal loop constant, prologue init order, li reordered against la, name the constant.
ADD-8 → §30a addendum — THE THIRD COLUMN: *p++ IS ALSO SERIALIZED BUT BURNS addiu; ONLY CAST-PLUS GIVES SERIALIZATION AND DISPLACEMENT FOLDING
§30a#1 documents that *(T*)((s32)p + k) denies /s (NOP_EXPR over the PLUS) while bare q[k]
grants it. Complete the matrix with the third spelling and the codegen-shape consequences, from
func_8017D164 (ov_SC01_000, 20/20, banked — six lockstep lhu/lui/sh pairs):
| spelling | /s |
consequence |
|---|---|---|
bare p[k] |
granted | loads hoist above the aliasing stores into a 3-load cluster — 16 mismatched, WIDTH/lhu!=lui (A/B .run/s59_distill2/func_8017D164_index.c) |
*p++ |
denied | serialized, but real addiu pointer steps materialize — LENGTH-DRIFT (+2 per drafter's bracket) |
*(u16*)((s32)p + k) |
denied | serialized AND combine folds k into the load displacement — zero extra instructions; the only column that matches a lockstep copy chain |
Grep bait: p++ addiu burn, cast plus displacement, serialized field copy, three spellings aliasing.
ADD-9 → §255 "AND CASE-BODY PLACEMENT" bound / §222-addendum-3 — ON A LARGE SPARSE TREE, BODIES FOLLOW SOURCE ORDER (measured by a one-word probe)
§255 states case bodies emit in DFS order (root body first) and §222 holds source order for dense
switches. Measured on the 29-case sparse balanced tree func_8017F328 (ov_SC01_001, 307/307,
banked): swapping the SOURCE positions of the case 2:/case 3: blocks (identical instruction
shapes, only masked symbols differ) moves exactly ONE unmasked word — the dispatch beq's target
(1 mismatched, IMM-OFFSET/−8; A/B .run/s59_distill2/func_8017F328_swap23.c). Bodies are laid in
source order here, and the drafter's recovery rule holds: the tree's beq targets, read in
ascending physical order, name the source case sequence. Both regimes now have measured
exemplars — when reading a switch, recover case VALUES from the beq/slti chain (per §255), and
recover BODY order from the physical layout only on the source-order regime; when transplanting a
big switch, preserve the source case order exactly. Grep bait: case body order, switch source order probe, beq targets name cases.
ADD-10 → Cross-confirmation card block (per §259's standing instruction: confirmation, not news)
- §210 ←
func_801856F0(bm, 24/24) — second live gate for name-the-mask, at the== 0polarity (sltiu $v0,$v0,0x1); both direct spellings ((x&M)==0,!(x&M)) measure +1 with thesrl 15/xori/andiextract. The section's two fixes stand exactly. - §162d1 ←
func_8017D8D0(bm, 28/28) — the missing independent A/B its own text asks for: two-statement split = −1 (first mask folds into jal-2's slot, cross-calladdu $s0,$v0copy deleted); the one-expression sum is load-bearing. - §237-escape-2 ←
func_801810CC(bm) — strongest return-axis-only card yet: stalevoidself-decls left by BANKED CALLERS (:4650/:4700), cured in-body by the def-side__asm__("func_801810CC")alias; the §85 widen verified as the alternative. Also a process fact worth §236-8's margin: fixes prescribed in NOTES never reach the gate — the cure must ride in the submitted code. - §257-6 ←
func_8017F10C(ax; its own third note) andfunc_801A6A38(bm; "first thing to try on a redraft-lever card: the unpinned direct spelling" — §257-9 restated). - §236-2 ←
func_80182CF4(ax) — the DATA-symbol face: two incompatible block-scope decls ofD_801888B0in sibling functions + a new file-scope extern = whole-TU cc1 death with a green oracle; moving the three data externs to block scope cured it. - §150-B ←
func_80180CE0(ax; a non-authoritative fleet row('s32',...)for a callee whose own.sprovesvoid— ground-truth unbanked callees against their.s) andfunc_8017FCBC(ax; address-taken array beats the scalar plurality). - §253 / §165-06 ←
func_80181D08(bm) — second card for single-observation §253: the postfix-vs-compound axis also decides STORE PLACEMENT (var = (*p)++;keeps the store after themfhi/bnezpair in its own slot; bare++/pre-increment sink it before the div). - §235 / §195-D ←
func_801EFC30(bm) — a transposed digit in ajalsymbol (func_80116714forfunc_80016714) scored MATCH at 10 ins; the post-MATCH relocation walk is not optional at any size. Plus the §235 boundary caution fromfunc_801811D0(ax): a deliberate probe constant in a SUBMISSION weaponizes the same blind spot — probes belong in scratch A/Bs; the whole-binary gate is unmasked (the banked tree carries the true0x7FFFFFFF). - §229 ←
func_801A6A38(bm; negative face: reordering plain stores does NOT drag the hoistedladown — address birth position is independent of its consumers' statement order). - §164-59 ←
func_80183BA0(ax). §251-2 ←func_801A0DA4(bm;addiu -0x5reads&= ~0x4, never~0x5) +func_801820B0(ax;&= ~0x10→addiu -0x11). §243 ←func_801862C8(bm; an interveningshblocks CSE ⇒ the doublelw 0x20is inline re-derivation, not a local). §164-73/-74 ←func_801835F4(bm). §214-addendum ←func_80180150(bm; stub twin ⇒ grepDEFINE_in engine_core.h by tail sequence). §254 ←func_8018944C(ax; already cited there). §224-addendum-4 ←func_801853F0(ax; already cited there).
3. Refuted claims (checked and found wrong — do NOT let these harden into laws)
Four refuted by live match_one A/B against the banked body (files in .run/s59_distill2/),
one by artifact, one definitional. Rate check: 6 of 19 solo-tested levers were riders — the same
one-in-three §266 measured last batch.
func_8017FB04(ax): the bgez/OR-fallthrough/two-entry-merge analysis and its "§199-F is byte-inert here" lever list. MIS-ATTRIBUTED, for the SECOND consecutive batch — the note's subject (lhD_80126CB0+0x300, 8×ctc2, rtps hazard nops, the bgez tail) is ov_SC03_030's HANDWRITTEN homonym (previous batch REF-3; §265's cautionary tale, "no compiler law can be extracted from hand-written asm"). The note is not even a MATCH (LENGTH-DRIFT/−4). Harvester hygiene: the wave file's verdict column must gate candidacy.func_8018BAC4(bm): "the volatile-load lever —*(volatile u8*)pamakes the load non-substitutable by combine, so x survives as a real pseudo that first-fit grants $v1; two pin placements were silently ignored." INERT RIDER — the banked body minus everyvolatileMATCHes 32/32 with the pins present; stripping the PINS instead breaks it (+3 / 34 mismatched). The attribution inverts: the pins are the lever (leaf function — §268), the volatile carries no bytes. The claimed combine mechanism does not operate in the banked context.func_8017FE78(bm): "an early-constant-in-s1 prologue is what forces the twin-styleregister s32 s1 __asm__(\"$17\")declaration." INERT RIDER — removing the$17pin alone still MATCHes 52/52 (the constant colors to$17by itself once$16is pinned). The load-bearing pin is$16on the pointer copy (both off = +3). ADD-6 records the true rule.func_801F0D88(bm): "a plain counted for-loop over an array of structs degrades to dual walking pointers vs a single scaled IV depending purely on source spelling." NOT REPRODUCIBLE — the indexed spelling (D_801F8334[i][0],i += 1, boundi < cnt) also MATCHes 33/33 under the sameif (cnt>0) do..whileguard. The IV spelling is byte-inert here; whatever the failing intermediate did differently (likely the guard/do-while structure, §10/§1412, or the C89 decl errors the note also reports), it was not this. The claimed §246-row addendum is withdrawn.func_8017F0A8(bm): "neitherif (x<0) x=-xnor any conditional-expression spelling produces this; what does is keeping TWO livenesses:t = v1 * 0x10000; a0 = v1; if (t < 0) a0 = -v1;." THREE of the four components are riders (named temp,*0x10000spelling, init-then-override — all strip-tested MATCH); the only load-bearing content is testing the s16 sign rather than the s32 sign ((s16)v1 < 0MATCHes; rawv1 < 0drifts −1). The salvage is ADD-5. "Worth a section" as written would have shipped a three-part ritual.func_8017E4A4(bm, wording-grade): "parameter stays a plain s32 NAMED a0 — naming it a2 or pinning $6 produced a spurious extra copy." A C variable's NAME cannot reach codegen — renaming is alpha-conversion, byte-inert by construction. The substantive dial is §220's plain-param-vs-named-copy (cov). Flagged so "name your locals after target registers" never hardens into lore; no A/B spent (definitional).
4. The discovery-gap list (knowledge existed; the drafter did not find it)
func_801856F0(bm) — needed theandi K+sltiuvssrl n+xoridial; grepped "boolean-tail idioms", wrote "not in the cookbook under the names I grepped". It is §210, whose title contains the exact instruction pair. Index fix: add the literal stringsandi sltiu,sltiu 0x1,single-bit return,bit test ==0to §210's symptom line.func_801810CC(bm) — found the asm-label cure but cited it as "§2535 asm-label pattern" (a cookbook LINE inside §38's memcpy note); the governing entries are §237-escape-2 / §124 / §37. The L→§ alias table now exists — wave prompts should nametools/cookbook_index.py --resolve <N>beside the "grep the index first" line.func_8017F0A8(bm) — cited "§16011/§15367" (line numbers inside §167) for the negu coverage. Right reading, broken citation form — same fix as #2.func_801F0D88(bm) — cited "§10813/10814" for the do-while guard law; those LINES resolve to §156 (preference-donor merge), an unrelated section. The knowledge is §10/§1412. Stale line citations are actively misleading, not just unfindable.func_801A06AC/func_80181D20(ax) — cited "cookbook s1144/s1284" (→§14/§14d) and "§2329" (→§28). Same class as #2-4.- The ax gate-null cluster (~20 cards) — several state "no documented class exists for
match_one-MATCH-but-no-bank" (
func_800CEFBC,func_800CF078,func_80180D14,func_80181A98…). The class IS documented — §236 (nine ways + PROCEDURE) and §259-4 — and landed in the S58b commit these sessions predate or missed. Same recommendation as the previous batch: re-issue drafter prompts pointing at §233-§259 so the standing complaint stops recurring; these cards' honest audits are otherwise §259-3-grade compliance reports. func_8018944C(ax) — called the missing#include "common.h"an undocumented bank-failure class; it is the §259-11/§236-4 standalone-harness fact (andmatch_oneitself documents that it prepends common.h —tools/match_one.py:146).func_8017D8D0(bm) — searched near §55a for the cross-call-lifetime rule; it is §162d1 (indexed under "anonymous temp single-set"). Index fix: addcall pair one expression,two rand sum,mask folded into jal slotto §162d1's row.func_8017F10C(ax) — "no section states that over-pinning is itself the blocker" — §257-6 states exactly that and cites this function's own two earlier notes. The flywheel wrote the lesson; the drafter did not find the dead-end ledger. Index fix: key §257's rows individually (at minimumpin blocks delay slot,volatile fence breaks packing).
5. Plain-language summary for the reviewer
Of 82 notes, 67 are already written down — this batch's coverage rate (82%) sits between the
previous batch's 88% and the §233 harvest, and five of its "cookbook did not tell me" complaints
name sections that cite the very same function. The §266 sweep is the headline: 19 credited levers
were strip-tested against their own banked bodies, and 6 — a third, the same rate as last batch —
are inert riders shipped as certainties, including one whole proposed section (the "two-liveness
abs ritual") that dissolved into a single (s16) cast. The sweep also produced the batch's one
genuinely new law: §268, which turns §257-2's "pins on call-clobbered registers are ignored"
into a usable rule with a precondition (ignored only when the pinned range CROSSES a call — honored
and load-bearing between calls, proven live on two cards and refuted-by-strip on none). Two §257
dead-end rows gained byte-proven bounds (ADD-1's volatile dial; §268 itself), and eight further
addenda land measured corrections: the §167-37 counter-case, the §30a third column, the §255
source-order probe, the §220 pin-the-copy face, the §229 value face, the §236 silent-splice ladder,
and the cross-binary duplicate-definition trap. Six claims were refuted outright — five by live
A/B — and the batch confirms the standing process gaps: drafters still cite cookbook line numbers
as section ids, and one non-MATCH handwritten-homonym card leaked past the harvest filter for the
second batch running.