phase12: match func_80102F58 (686 bodies / 695 regions)

This commit is contained in:
Christopher Williams
2026-09-24 19:53:00 -04:00
parent 3ce5c11603
commit 9729dd0ed7
7 changed files with 57 additions and 13 deletions
+2 -2
View File
@@ -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
1 # Syphon Filter 3 (USA) match worklist.
991 984
992 #
993 # listed=984
994 # excluded_already_registered=691 # excluded_already_registered=693
995 # excluded_bad_extent_start=8
996 # excluded_degenerate_body=252
997 # excluded_delay_slot_start=5
1000 # excluded_low_confidence_grade=90
1001 # excluded_named_exclusion=9
1002 # excluded_no_extent=0
1003 # excluded_recorded_negative=105 # excluded_recorded_negative=103
1004 # excluded_restores_unsaved=11
1005 # excluded_trapping_arith=48
-1
View File
@@ -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
Can't render this file because it contains an unexpected character in line 118 and column 203.
+2 -1
View File
@@ -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
1 # Code-region registry: one C region per matched function.
624 0x800FF47C
625 0x800FF6A4
626 0x800FFBEC
627 0x800FFF60
628 0x80100038
629 0x80100318
630 0x80100334
644 0x80102A80
645 0x80102B10
646 0x80102B30
647 0x80102F58
648 0x80102FA4
649 0x80102FD4
650 0x80102FE4
+3
View File
@@ -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
1 # Symbol registry: absolute addresses for cross-references used by C regions.
207 D_8012218C
208 D_80122190
209 D_80122194
210 D_801221A8
211 D_801221AA
212 D_801221AC
213 D_801221B0
214 D_801221C4
215 D_801221C8
+16 -1
View File
@@ -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).
+28
View File
@@ -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).**
+6 -8
View File
@@ -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