From 9729dd0ed73f60f3e259449fb78a107a1ce97410 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Thu, 24 Sep 2026 19:53:00 -0400 Subject: [PATCH] phase12: match func_80102F58 (686 bodies / 695 regions) --- config/match_worklist.tsv | 4 ++-- config/near_match_negatives.tsv | 1 - config/regions.tsv | 3 ++- config/symbols.tsv | 3 +++ phase-ends/CURRENT_PHASE.md | 17 ++++++++++++++++- phase-ends/logs/Phase12.md | 28 ++++++++++++++++++++++++++++ src/func_80102F58.c | 14 ++++++-------- 7 files changed, 57 insertions(+), 13 deletions(-) diff --git a/config/match_worklist.tsv b/config/match_worklist.tsv index 92a772b..2e7b20e 100644 --- a/config/match_worklist.tsv +++ b/config/match_worklist.tsv @@ -991,7 +991,7 @@ 984 0x801007E0 0x80100808 40 fallthrough 3 frame 1 - 1 # # listed=984 -# excluded_already_registered=691 +# excluded_already_registered=693 # excluded_bad_extent_start=8 # excluded_degenerate_body=252 # excluded_delay_slot_start=5 @@ -1000,6 +1000,6 @@ # excluded_low_confidence_grade=90 # excluded_named_exclusion=9 # excluded_no_extent=0 -# excluded_recorded_negative=105 +# excluded_recorded_negative=103 # excluded_restores_unsaved=11 # excluded_trapping_arith=48 diff --git a/config/near_match_negatives.tsv b/config/near_match_negatives.tsv index 808d811..f4f0c8f 100644 --- a/config/near_match_negatives.tsv +++ b/config/near_match_negatives.tsv @@ -176,7 +176,6 @@ 0x80101E50 76 near-match custom-compare loop shape (back-up-mismatch path; cc1 rewrites to 52B) 0X80102A00 128 near-match candidate_bytes=124 vs 128 expected, ONE extra instruction in the original: the original has a `nop` at 0x80102A64 between `lw v0,-724(v0)` (0x80102A6 0X80102A80 132 near-match rare-epilogue-r1-r2-measured; residual 4B at 0x80102A88; tried default maspsx 136 vs 132 LENGTH-MISMATCH (reorder nop block -0x80102F58 - near-match - 0x80102FE4 - near-match - 0x80103AA4 - near-match - 0x8010400C 44 near-match constant-base-in-register diff --git a/config/regions.tsv b/config/regions.tsv index 70f7d06..71cdc88 100644 --- a/config/regions.tsv +++ b/config/regions.tsv @@ -624,7 +624,7 @@ 0x800FF47C 0x800FF4BC src/func_800FF47C.c cc1bin=gcc-2.8.1-psx 0x800FF6A4 0x800FF6DC src/func_800FF6A4.c 0x800FFBEC 0x800FFC3C src/func_800FFBEC.c maspsx=epilogue -0x800FFF60 0x800FFFEC src/func_800FFF60.c maspsx=epilogue +0x800FFF60 0x800FFFEC src/func_800FFF60.c maspsx=epilogue gp=-D_801221A8,-D_801221AA,-D_801221AC 0x80100038 0x801000A0 src/func_80100038.c maspsx=epilogue 0x80100318 0x80100334 src/func_80100318.c 0x80100334 0x8010036C src/func_80100334.c maspsx=epilogue @@ -644,6 +644,7 @@ 0x80102A80 0x80102B04 src/func_80102A80.c maspsx=epilogue 0x80102B10 0x80102B2C src/func_80102B10.c maspsx=off 0x80102B30 0x80102B5C src/func_80102B30.c maspsx=off +0x80102F58 0x80102F94 src/func_80102F58.c maspsx=epilogue 0x80102FA4 0x80102FD4 src/func_80102FA4.c 0x80102FD4 0x80102FE0 src/func_80102FD4.c 0x80102FE4 0x80103014 src/func_80102FE4.c diff --git a/config/symbols.tsv b/config/symbols.tsv index 279b86e..fb31875 100644 --- a/config/symbols.tsv +++ b/config/symbols.tsv @@ -207,6 +207,9 @@ D_80122188 0x80122188 gp D_8012218C 0x8012218C gp D_80122190 0x80122190 gp D_80122194 0x80122194 gp +D_801221A8 0x801221A8 gp +D_801221AA 0x801221AA gp +D_801221AC 0x801221AC gp D_801221B0 0x801221B0 gp D_801221C4 0x801221C4 gp D_801221C8 0x801221C8 gp diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index caa309a..04cfd05 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -4,7 +4,22 @@ **Plan:** `phase-ends/Phase12_PLAN.md` — **APPROVED** by the developer 2026-09-24. **Ledger:** `phase-ends/logs/Phase12.md` (the running record; staging under `.run/p12/`). -## STATE — SESSION STOP, 2026-09-24 23:35 (supersedes the cycle-1 block below, kept as history) +## STATE — SOLO CONTINUATION, 2026-09-24 (current) + +**686 bodies / 695 regions**, from 685 / 694 at the last session stop — **+1 body / +1 region**. +The Phase 12 milestone remains 750 bodies, so **+64 remains**. The promoted whole-binary gate is green: +`c_regions=695`, `differing_bytes=0`, SHA-1 +`e173426c157384ebf1b6caf8c6fea18a85a14af9`; 344 synthetic tests pass and extents report +`regions=695 disagreements=0 result=AGREE`. + +Task 1/10 completed `0x80102F58` (60 bytes) and its three proven gp symbol rows. No harness parser +change was needed: the existing comma grammar `gp=-A,-B,-C` expresses the required per-site exclusions +on the already-registered `0x800FFF60` row. The source is now a tracked claim rather than the stop-time +unregistered work-in-progress. Worklist regeneration remains at 984 rows; its +`excluded_already_registered=693` continues the already-characterised two-row registry lag and is not a +correctness issue because the 695-region gate proves the registry simultaneously. + +## STATE — SESSION STOP, 2026-09-24 23:35 (historical; superseded by the state above, kept for provenance) **685 bodies / 694 regions**, from 602 / 611 at the Phase 11 close — **+83 bodies**. **Milestone 750 was NOT reached and will not be this session; +65 remains** (stretch 800 needs +115). diff --git a/phase-ends/logs/Phase12.md b/phase-ends/logs/Phase12.md index 2843fa5..baae860 100644 --- a/phase-ends/logs/Phase12.md +++ b/phase-ends/logs/Phase12.md @@ -1825,3 +1825,31 @@ Commit `0cb720d`'s message says "merge worker D's final row 0x8002D014 (685 bodi mine: **take the extent from the table, and guard every commit on the gate's exit code.** The invariant that makes the first mechanical — *a region's extent ends exactly 8 bytes past its LAST `jr $31`* — is recorded above, and `--end = last jr $31 + 8` would have caught this in one line. + +## SOLO CONTINUATION — 2026-09-24 + +The unavailable pi/herdr roster was replaced by a strictly sequential solo continuation: one function is +selected, evidenced, source-matched, candidate-gated, promoted, and committed before the next begins. +The full protocol remains in force; only concurrency and the copied charter/ledger are absent. + +### Task 1/10 — `0x80102F58` (60 B) MATCH + +* Re-derived from the tracked source and the exact extent row: `0x80102F58..0x80102F94`, 60 bytes, + grade `exact`, term `jr_ra`. +* Fresh range result: `candidate_bytes=60 differing_bytes=0 result=MATCH`, source md5 before the + documentation update `84422e3e9b35f046d5646686210ac5c7`, region token `maspsx=epilogue`. +* Added proven symbol rows `D_801221A8`, `D_801221AA`, and `D_801221AC`, all gp-marked. Their addresses + are computed from the observed gp displacements 2160/2162/2164 plus the proved gp base 0x80121938. +* The handover identified a parser multiplicity problem. Direct inspection of the enforcing tool found + the existing tested grammar already accepts a comma-separated list. Therefore **no tool change was + made**: `0x800FFF60` now uses `gp=-D_801221A8,-D_801221AA,-D_801221AC`, while the new row consumes the + same three registry rows gp-relatively. This directly demonstrates finding 16's per-site rule and + avoids widening the override grammar unnecessarily. +* `sf3_merge` accepted 1 region and 3 symbols. Candidate whole-binary gate: 695 regions, + `differing_bytes=0`, both SHA-1 values `e173426c157384ebf1b6caf8c6fea18a85a14af9`, exit 0. +* Promoted range recheck and `make check`: 344 tests OK; extents `regions=695 disagreements=0`; gate + `c_regions=695 differing_bytes=0 result=MATCH`. +* Removed the registered row from `near_match_negatives.tsv` (193 -> 192 data rows). Worklist regeneration + remains 984 rows and reproduces the already-recorded `excluded_already_registered=693` two-row lag. + +**Count after task 1: 686 bodies / 695 regions (+84 bodies from the Phase 12 open baseline).** diff --git a/src/func_80102F58.c b/src/func_80102F58.c index 3c26072..41cf85b 100644 --- a/src/func_80102F58.c +++ b/src/func_80102F58.c @@ -3,17 +3,15 @@ * * Stores the two halfword parameters into the gp-globals at 0x801221A8 and 0x801221AA, * then, if the gp-global at 0x801221AC is zero, calls func_80107874 with both parameters - * SIGN-EXTENDED. Matched with `--fill-epilogue` once three symbol rows exist. + * SIGN-EXTENDED. Region token: `maspsx=epilogue`. * - * *** SYMBOL ROWS REQUIRED (coordinator write) *** - * D_801221A8 0x801221A8 gp - * D_801221AA 0x801221AA gp - * D_801221AC 0x801221AC gp * The three accesses are `sh a0,2160(gp)`, `sh a1,2162(gp)` and `lw v0,2164(gp)`, so the * symbols are the gp base (0x80121938) plus 2160/2162/2164 -- read the DISPLACEMENT and - * add, do not infer from a neighbouring name. Without the rows each access assembles to - * `lui at,0x8012` + the load/store: 72 bytes instead of 60 (two extra instructions per - * access). Verified against a staged copy of the registry. + * add, do not infer from a neighbouring name. The symbol registry therefore marks + * D_801221A8, D_801221AA and D_801221AC gp-relative. The already-registered sibling + * 0x800FFF60 accesses these same addresses absolutely and declares comma-form `gp=-...` + * exclusions, a direct instance of the per-site access rule. Without the three gp rows + * this function assembles to 72 bytes rather than 60. * * **THE PARAMETERS ARE `short`.** The emitted `sll a0,a0,0x10 / sra a0,a0,0x10` (and the * same for a1) is the halfword-to-word SIGN EXTENSION that cc1 inserts when a narrow