diff --git a/config/dedup.us.yaml b/config/dedup.us.yaml index 2a8a3fee5..940e0a3b9 100644 --- a/config/dedup.us.yaml +++ b/config/dedup.us.yaml @@ -11930,3 +11930,31 @@ groups: func: DEFINE_func_8012BA10 vram: 0x8012BA10 binaries: [ov_SC01_077, ov_SC01_005, ov_SC01_006, ov_SC03_001, ov_SC01_000, ov_SC01_001, ov_SC02_000, ov_SC02_003, ov_SC03_002, ov_SC03_006, ov_SC04_000, ov_SC04_018, ov_SC04_019, ov_SC05_000, ov_SC06_000, ov_SC07_000, ov_SC01_004, ov_SC01_008, ov_SC01_009, ov_SC01_074, ov_SC01_080, ov_SC01_084, ov_SC02_004, ov_SC02_005, ov_SC02_011, ov_SC02_015, ov_SC02_016, ov_SC02_017, ov_SC02_021, ov_SC02_026, ov_SC02_027, ov_SC02_028, ov_SC02_031, ov_SC02_035, ov_SC02_039, ov_SC02_041, ov_SC03_003, ov_SC03_007, ov_SC03_010, ov_SC03_011, ov_SC03_012, ov_SC03_013, ov_SC03_014, ov_SC03_015, ov_SC03_023, ov_SC03_024, ov_SC03_028, ov_SC03_029, ov_SC03_030, ov_SC03_031, ov_SC03_089, ov_SC03_090, ov_SC03_091, ov_SC03_092, ov_SC03_093, ov_SC03_094, ov_SC03_095, ov_SC03_096, ov_SC03_097, ov_SC03_098, ov_SC03_099, ov_SC03_100, ov_SC03_101, ov_SC03_102, ov_SC03_103, ov_SC03_104, ov_SC03_105, ov_SC03_108, ov_SC03_109, ov_SC03_110, ov_SC03_111, ov_SC03_112, ov_SC03_113, ov_SC03_114, ov_SC03_115, ov_SC03_116, ov_SC03_117, ov_SC03_118, ov_SC03_119, ov_SC03_121, ov_SC03_124, ov_SC03_125, ov_SC03_126, ov_SC04_002, ov_SC04_003, ov_SC04_004, ov_SC04_005, ov_SC04_006, ov_SC04_007, ov_SC04_008, ov_SC04_009, ov_SC04_010, ov_SC04_011, ov_SC04_012, ov_SC04_015, ov_SC04_016, ov_SC04_020, ov_SC04_021, ov_SC05_001, ov_SC05_002, ov_SC05_003, ov_SC05_004, ov_SC05_005, ov_SC05_006, ov_SC05_007, ov_SC05_008, ov_SC05_009, ov_SC05_010, ov_SC05_011, ov_SC05_017, ov_SC05_018, ov_SC05_019, ov_SC06_006, ov_SC06_008, ov_SC06_010, ov_SC06_011, ov_SC06_013, ov_SC06_014, ov_SC06_015, ov_SC06_016, ov_SC06_018, ov_SC06_020, ov_SC06_022, ov_SC06_024, ov_SC06_025, ov_SC06_027, ov_SC06_029, ov_SC06_030, ov_SC06_032, ov_SC06_033, ov_SC07_001, ov_SC07_002, ov_SC07_008, ov_SC07_009] + - id: E_func_80181D2C + tier: h_exact + hash: e868b79b29fa87158d692f4cd45e15389bee05f0 + source: src/shared/engine_core.h + func: DEFINE_func_80181D2C + vram: 0x80181D2C + binaries: [ov_SC02_000, ov_SC02_003] + - id: E_func_80182D00 + tier: h_exact + hash: ed044b295b10132c271b29cb5c1092852f9b1745 + source: src/shared/engine_core.h + func: DEFINE_func_80182D00 + vram: 0x80182D00 + binaries: [ov_SC02_000, ov_SC02_003] + - id: E_func_801868D4 + tier: h_exact + hash: b24f319e7193cbede5344aa5fc09323daecc40b6 + source: src/shared/engine_core.h + func: DEFINE_func_801868D4 + vram: 0x801868D4 + binaries: [ov_SC02_000, ov_SC02_003] + - id: E_func_801863E8 + tier: h_exact + hash: 40bd924934aa21ce1791e17a0550faf89d76a74b + source: src/shared/engine_core.h + func: DEFINE_func_801863E8 + vram: 0x801863E8 + binaries: [ov_SC02_000, ov_SC02_003] diff --git a/docs/backlog.md b/docs/backlog.md index f751d8774..df4e78ab7 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -2,7 +2,7 @@ > Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there. -**Open near-misses:** 495 · by status {'near': 416, 'failed': 79} · by class {'WAVE': 20, 'plumbing': 42, 'other': 23, 'STUB': 1, 'schedule': 61, 'loose-typing': 7, 'struct': 60, 'regalloc-order': 58, 'remat': 4, 'iv-combine': 3, 'GIANT': 8, 'STRUCT': 7, None: 200, 'PINS': 1} +**Open near-misses:** 644 · by status {'near': 561, 'failed': 83} · by class {'WAVE': 21, 'plumbing': 42, 'other': 23, 'STUB': 1, 'schedule': 61, 'loose-typing': 7, 'struct': 60, 'regalloc-order': 58, 'remat': 4, 'iv-combine': 3, 'GIANT': 8, 'STRUCT': 7, None: 348, 'PINS': 1} | # | addr | reach | class | nins | status | closeness | where it stuck | best draft | |--:|------|------:|-------|-----:|--------|----------:|----------------|------------| @@ -240,264 +240,413 @@ | 232 | func_8015CA28 | 1 | schedule | 91 | near | 0 | none — MATCH (goto forces the func_80161240 block to the function tail; bnez-to-end layout vs early-return fall-through) | `.run/backlog_drafts/func_8015CA28.c` | | 233 | func_801820DC | 1 | struct | 94 | near | 0 | none — MATCH (switch on entity state at 0x34, inner jtbl on (s8)(u70>>8)) | `.run/backlog_drafts/func_801820DC.c` | | 234 | func_80184D50 | 1 | schedule | 98 | near | 0 | none — MATCH (98 ins, relocation-masked) | `.run/backlog_drafts/func_80184D50.c` | -| 235 | func_80128218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80128218.c` | -| 236 | func_8013E054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013E054.c` | -| 237 | func_80165658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80165658.c` | -| 238 | func_80178D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80178D18.c` | -| 239 | func_8017CFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFD4.c` | -| 240 | func_8017CFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFFC.c` | -| 241 | func_8017CF78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF78.c` | -| 242 | func_8017CFA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA0.c` | -| 243 | func_8013CABC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013CABC.c` | -| 244 | func_8013D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013D164.c` | -| 245 | func_8014C1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8014C1A0.c` | -| 246 | func_8015E588 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E588.c` | -| 247 | func_8017D13C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D13C.c` | -| 248 | func_8017D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D164.c` | -| 249 | func_8017D18C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D18C.c` | -| 250 | func_8017DA9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA9C.c` | -| 251 | func_8014C5D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8014C5D0.c` | -| 252 | func_8017D5D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D4.c` | -| 253 | func_8017D5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5FC.c` | -| 254 | func_8017D02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D02C.c` | -| 255 | func_8017D054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D054.c` | -| 256 | func_8017D07C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D07C.c` | -| 257 | func_8017D430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D430.c` | -| 258 | func_8017D134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D134.c` | -| 259 | func_8017D15C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D15C.c` | -| 260 | func_8017D3FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3FC.c` | -| 261 | func_8017D6D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D4.c` | -| 262 | func_8017D964 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D964.c` | -| 263 | func_8017F458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F458.c` | -| 264 | func_8018A660 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A660.c` | -| 265 | func_8013C98C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013C98C.c` | -| 266 | func_80161C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80161C98.c` | -| 267 | func_80171120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171120.c` | -| 268 | func_80157544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157544.c` | -| 269 | func_8015DE58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015DE58.c` | -| 270 | func_801678B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801678B4.c` | -| 271 | func_8016F6E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F6E0.c` | -| 272 | func_8016FDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FDB4.c` | -| 273 | func_8016FFDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FFDC.c` | -| 274 | func_8017D418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D418.c` | -| 275 | func_8017D440 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D440.c` | -| 276 | func_8017E034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E034.c` | -| 277 | func_8017ED30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED30.c` | -| 278 | func_8017ED58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED58.c` | -| 279 | func_80157DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157DC4.c` | -| 280 | func_80164EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164EA4.c` | -| 281 | func_8016F8E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F8E4.c` | -| 282 | func_80171064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171064.c` | -| 283 | func_801727D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801727D0.c` | -| 284 | func_801747CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801747CC.c` | -| 285 | func_8017EE24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE24.c` | -| 286 | func_8017F40C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F40C.c` | -| 287 | func_8017D34C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D34C.c` | -| 288 | func_8017D374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D374.c` | -| 289 | func_8017F080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F080.c` | -| 290 | func_801866B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801866B0.c` | -| 291 | func_8017D00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D00C.c` | -| 292 | func_8017D034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D034.c` | -| 293 | func_80131FDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FDC.c` | -| 294 | func_80152370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152370.c` | -| 295 | func_8015E8E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E8E8.c` | -| 296 | func_80168D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168D58.c` | -| 297 | func_8016AB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016AB30.c` | -| 298 | func_8016CB84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016CB84.c` | -| 299 | func_8016FC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FC90.c` | -| 300 | func_80170748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170748.c` | -| 301 | func_80174888 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174888.c` | -| 302 | func_80143B30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143B30.c` | -| 303 | func_80143E68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143E68.c` | -| 304 | func_8015E1B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E1B8.c` | -| 305 | func_80167A9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80167A9C.c` | -| 306 | func_801693CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801693CC.c` | -| 307 | func_80169F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169F00.c` | -| 308 | func_801704B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801704B0.c` | -| 309 | func_80170BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170BD8.c` | -| 310 | func_80170EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170EFC.c` | -| 311 | func_801714E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801714E4.c` | -| 312 | func_80173544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173544.c` | -| 313 | func_801742A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801742A4.c` | -| 314 | func_80174474 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174474.c` | -| 315 | func_8017D26C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D26C.c` | -| 316 | func_8017D7A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7A4.c` | -| 317 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | -| 318 | func_8017F714 | 1 | plumbing | 27 | near | 1 | none — MATCH (27/27 ins, match_one verified) | `.run/backlog_drafts/func_8017F714.c` | -| 319 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | -| 320 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | -| 321 | func_80184C0C | 1 | struct | 48 | near | 1 | none — MATCH (array-of-struct %lo-fold for &D_8018AEB8[idx], stride 0x34) | `.run/backlog_drafts/func_80184C0C.c` | -| 322 | func_8016B4F8 | 1 | regalloc-order | 50 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8016B4F8.c` | -| 323 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | -| 324 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | -| 325 | func_8017F114 | 1 | regalloc-order | 75 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8017F114.c` | -| 326 | func_801656E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801656E8.c` | -| 327 | func_8017D2D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D2D4.c` | -| 328 | func_801807D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801807D8.c` | -| 329 | func_80180AD0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180AD0.c` | -| 330 | func_8017F758 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F758.c` | -| 331 | func_8017FDB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FDB0.c` | -| 332 | func_80180720 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180720.c` | -| 333 | func_80184D80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184D80.c` | -| 334 | func_80184A28 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184A28.c` | -| 335 | func_8017FB2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB2C.c` | -| 336 | func_80183724 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183724.c` | -| 337 | func_80183AFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183AFC.c` | -| 338 | func_8017EE50 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE50.c` | -| 339 | func_80181FF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FF8.c` | -| 340 | func_80185D5C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185D5C.c` | -| 341 | func_8018AE80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AE80.c` | -| 342 | func_80183FF4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FF4.c` | -| 343 | func_801832F4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801832F4.c` | -| 344 | func_8017FE4C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FE4C.c` | -| 345 | func_801827C4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801827C4.c` | -| 346 | func_8017F290 | 1 | regalloc-order | 86 | near | 2 | none — MATCH. Two levers: (1) hold &D_801270CC in a `int *state` local so its | `.run/backlog_drafts/func_8017F290.c` | -| 347 | func_8016EC0C | 1 | schedule | 88 | near | 2 | none — MATCH (88 ins). Sparse switch(uVar2) = gcc's beq-pivot+slti comparison | `.run/backlog_drafts/func_8016EC0C.c` | -| 348 | func_8017F6B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F6B0.c` | -| 349 | func_8017DDFC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DDFC.c` | -| 350 | func_8017FD2C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FD2C.c` | -| 351 | func_8018A640 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A640.c` | -| 352 | func_80188F30 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80188F30.c` | -| 353 | func_8018BCB4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BCB4.c` | -| 354 | func_80185320 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185320.c` | -| 355 | func_80185670 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185670.c` | -| 356 | func_801880F4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801880F4.c` | -| 357 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | -| 358 | func_8017DA80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DA80.c` | -| 359 | func_8017D468 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D468.c` | -| 360 | func_80185BF4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185BF4.c` | -| 361 | func_8017DCE4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DCE4.c` | -| 362 | func_8017F510 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F510.c` | -| 363 | func_80182EC4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182EC4.c` | -| 364 | func_80140E6C | 1 | schedule | 37 | near | 4 | 4 ins — each save-across-call copy (move s1,v0 / move s0,v0) should fill the NEXT jal's delay slot (target) but gcc-2.7.2 sched ties the copy with the next call's arg-setup at priority 2 and the LUID tie-break (rank_for_schedule) keeps the copy first, so reorg fills the slot with the arg-setup instead; no C reshape found that flips the LUID/priority order without breaking the OR-chain regalloc. | `.run/backlog_drafts/func_80140E6C.c` | -| 365 | func_8012A018 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8012A018.c` | -| 366 | func_80180B24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B24.c` | -| 367 | func_80180B34 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B34.c` | -| 368 | func_80181758 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181758.c` | -| 369 | func_80188484 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188484.c` | -| 370 | func_8013CAE8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8013CAE8.c` | -| 371 | func_8018F080 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F080.c` | -| 372 | func_8018F090 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F090.c` | -| 373 | func_80190460 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190460.c` | -| 374 | func_80190470 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190470.c` | -| 375 | func_80183690 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183690.c` | -| 376 | func_801836A0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801836A0.c` | -| 377 | func_80188F4C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F4C.c` | -| 378 | func_80188F5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F5C.c` | -| 379 | func_80185CC8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CC8.c` | -| 380 | func_80185CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CD8.c` | -| 381 | func_8018ADEC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADEC.c` | -| 382 | func_8018ADFC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADFC.c` | -| 383 | func_8018478C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018478C.c` | -| 384 | func_8018479C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018479C.c` | -| 385 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | -| 386 | func_8017CE34 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE34.c` | -| 387 | func_8017D948 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D948.c` | -| 388 | func_8017D2EC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D2EC.c` | -| 389 | func_801803F0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801803F0.c` | -| 390 | func_80180710 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180710.c` | -| 391 | func_8017CE7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE7C.c` | -| 392 | func_8017F7D8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7D8.c` | -| 393 | func_8017ED98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ED98.c` | -| 394 | func_80181B8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181B8C.c` | -| 395 | func_8017E14C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E14C.c` | -| 396 | func_8017D528 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D528.c` | -| 397 | func_801900E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801900E0.c` | -| 398 | func_8017D1F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1F4.c` | -| 399 | func_8017DB48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DB48.c` | -| 400 | func_8017EBD0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EBD0.c` | -| 401 | func_80182720 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182720.c` | -| 402 | func_8017D160 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D160.c` | -| 403 | func_8017E9D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9D0.c` | -| 404 | func_8017D368 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D368.c` | -| 405 | func_8014D3E0 | 1 | other | 22 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8014D3E0.c` | -| 406 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | -| 407 | func_8017B940 | 1 | struct | 63 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8017B940.c` | -| 408 | func_8017B238 | 1 | regalloc-order | 76 | near | 6 | 6 ins — gcc coalesces param_2 into callee-saved $s0 and hoists `move $s0,$a1` | `.run/backlog_drafts/func_8017B238.c` | -| 409 | func_8017B614 | 1 | regalloc-order | 101 | near | 6 | 6 ins — param_2 lands in callee-saved $s0 (entry `move s0,a1`, sltiu/sll read s0) vs target's $a1; gcc prefers s0 (saved anyway for the late p794/p78C copies) over caller-saved $a1. Body+schedule otherwise byte-exact (101/101 ins); the late-part `__asm__("")` barrier is load-bearing (fixes the const-store schedule, 21->6). | `.run/backlog_drafts/func_8017B614.c` | -| 410 | func_801656D0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801656D0.c` | -| 411 | func_80165700 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80165700.c` | -| 412 | func_80180AE8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180AE8.c` | -| 413 | func_8017D398 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D398.c` | -| 414 | func_801345F8 | 1 | schedule | 106 | near | 7 | 7 ins, all pure scheduling order — maskedp copy not sunk into bnez delay slot | `.run/backlog_drafts/func_801345F8.c` | -| 415 | func_8016BFA8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8016BFA8.c` | -| 416 | func_801815D8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801815D8.c` | -| 417 | func_80189898 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80189898.c` | -| 418 | func_8018823C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018823C.c` | -| 419 | func_80183E3C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E3C.c` | -| 420 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | -| 421 | func_80185F24 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F24.c` | -| 422 | func_80189858 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80189858.c` | -| 423 | func_8017FFF0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FFF0.c` | -| 424 | func_8017E908 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E908.c` | -| 425 | func_8013CB5C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8013CB5C.c` | -| 426 | func_8017A3B0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017A3B0.c` | -| 427 | func_8017F358 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F358.c` | -| 428 | func_80180174 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180174.c` | -| 429 | func_80180E9C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E9C.c` | -| 430 | func_8014C8C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8014C8C8.c` | -| 431 | func_80185A00 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185A00.c` | -| 432 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | -| 433 | func_801824D0 | 1 | WAVE | 181 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_801824D0.c` | -| 434 | func_80165670 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80165670.c` | -| 435 | func_80182F4C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F4C.c` | -| 436 | func_801835C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835C8.c` | -| 437 | func_8017D6C4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D6C4.c` | -| 438 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | -| 439 | func_8013C964 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013C964.c` | -| 440 | func_8013B568 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013B568.c` | -| 441 | func_801289F0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801289F0.c` | -| 442 | func_80182E58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80182E58.c` | -| 443 | func_80185F58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185F58.c` | -| 444 | func_8018A3C8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018A3C8.c` | -| 445 | func_8017EA20 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EA20.c` | -| 446 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | -| 447 | func_80180D10 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D10.c` | -| 448 | func_801824CC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801824CC.c` | -| 449 | func_8013C938 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8013C938.c` | -| 450 | func_8017D2F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017D2F0.c` | -| 451 | func_80158FA4 | 1 | schedule | 51 | near | 17 | target keeps a DEAD `sra $a1,$v0,16` before `beqz $a1` (sign-extend of func_80159464's | `.run/backlog_drafts/func_80158FA4.c` | -| 452 | func_8017D2D0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D2D0.c` | -| 453 | func_80182338 | 1 | PINS | 26 | near | 24 | PINS: 24 mismatch | `.run/backlog_drafts/func_80182338.c` | -| 454 | func_8018301C | 1 | plumbing | 28 | near | 24 | none — MATCH (straight-line, statement-order; verify with match_one) | `.run/backlog_drafts/func_8018301C.c` | -| 455 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | -| 456 | func_80182488 | None | | None | near | 24 | residual: 24 mismatch | `.run/backlog_drafts/func_80182488.c` | -| 457 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | -| 458 | func_801900F4 | None | | None | near | 27 | residual: 27 mismatch | `.run/backlog_drafts/func_801900F4.c` | -| 459 | func_80139BE0 | 1 | loose-typing | 39 | near | 32 | target has redundant andi a1,v0,0xff (uchar zero-extend) gcc proves away; else identical | `.run/backlog_drafts/func_80139BE0.c` | -| 460 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | -| 461 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | -| 462 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | -| 463 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | -| 464 | func_80141A60 | 1 | other | 76 | near | 63 | none — MATCH (76 ins, relocation-masked). Body byte-identical; target reserves an 8-byte | `.run/backlog_drafts/func_80141A60.c` | -| 465 | func_801457A4 | 1 | other | 79 | near | 74 | MATCH at -O0 (79 ins, reloc-masked, real -O0 flags). BANKING BLOCKER: this -O0 fn lives in the -O2 main ov_SC01_077.c; needs its own §18 -O0 split at 0x801457A4 (existing _o0.c covers 0x8013B568..0x8013C98C only). match_one is -O2 -> WRONG here. | `.run/backlog_drafts/func_801457A4.c` | -| 466 | func_8016B6BC | 1 | schedule | 94 | near | 80 | 12-off, all in the last 12 ins (tail). First 82 ins byte-match. Target materializes | `.run/backlog_drafts/func_8016B6BC.c` | -| 467 | func_80134A74 | 1 | regalloc-order | 107 | near | 84 | structure + all 8 callee-saved regs (s0..s7) + block layout MATCH; residual is caller-saved-temp | `.run/backlog_drafts/func_80134A74.c` | -| 468 | func_8013EE10 | 1 | struct | 94 | near | 86 | none — MATCH (94 ins). array-of-struct %lo-fold (E[]) for the 5-elt loops; | `.run/backlog_drafts/func_8013EE10.c` | -| 469 | func_80185E68 | 1 | STRUCT | 132 | near | 131 | STRUCT: 131 mismatch | `.run/backlog_drafts/func_80185E68.c` | -| 470 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | -| 471 | func_8015E018 | 1 | loose-typing | 47 | failed | | none — MATCH (signed char forces lbu+sll24/sra24 sign-extend; default char is unsigned in this toolchain) | `.run/backlog_drafts/func_8015E018.c` | -| 472 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | -| 473 | func_8013E958 | 1 | schedule | 63 | failed | | 2 ins swapped — cc1 emits `andi 0x7f; andi 0xff; beqz`(tests doubly-masked) but target wants `andi 0x7f; beqz; andi 0xff`(andi 0xff in the first beqz delay slot). Loop fully byte-matches; struct/ptr fold idioms nailed (D_80115110.q[0x16] hoists base+0x58 disp, Cell D_80115188[i].v folds %lo). func_800D0488 takes (m&0xFF) arg. s16 m -> 2 mism (right ins count); s32 m fixes order but merges andi+arg-move (62 ins, 1 short). | `.run/backlog_drafts/func_8013E958.c` | -| 474 | func_8013E83C | 1 | plumbing | 71 | failed | | none — MATCH (scalar global stores + 2 conditional calls; §3-T4 branch-polarity invert on the &0xFF test) | `.run/backlog_drafts/func_8013E83C.c` | -| 475 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | -| 476 | func_80180F10 | 1 | schedule | 75 | failed | | none — MATCH (aggregate-initializer form schedules const setup after the prologue saves) | `.run/backlog_drafts/func_80180F10.c` | -| 477 | func_8016C188 | 1 | schedule | 79 | failed | | none — MATCH (79 ins, match_one). Levers: invert if to if(iVar1!=0){big}else{small} | `.run/backlog_drafts/func_8016C188.c` | -| 478 | func_80164930 | 1 | regalloc-order | 81 | failed | | none — MATCH (81 ins, relocation-masked) | `.run/backlog_drafts/func_80164930.c` | -| 479 | func_801418F8 | 1 | loose-typing | 90 | failed | | none — MATCH (90 ins). Keys: D_8011511A is `volatile u16` (store-2-then-read must NOT const-fold), read ONCE into a `u16` local t (an `unsigned int` local adds a stray andi 0xffff; reusing t feeds the single lhu to both sltiu and t-3), and the lone D_80115158 store after the if yields the delay-slot-fill-from-target dup of `addiu 0x106`. | `.run/backlog_drafts/func_801418F8.c` | -| 480 | func_801789AC | 1 | struct | 91 | failed | | none — MATCH (91 ins, relocation-masked) | `.run/backlog_drafts/func_801789AC.c` | -| 481 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` | -| 482 | func_80185428 | 1 | struct | 94 | failed | | none — MATCH (94 ins, relocation-masked) | `.run/backlog_drafts/func_80185428.c` | -| 483 | func_801506A4 | 1 | loose-typing | 95 | failed | | none — MATCH (95 ins). switch var must be int not u16 (u16 adds andi 0xffff promotion mask) | `.run/backlog_drafts/func_801506A4.c` | -| 484 | func_8016BFD0 | 1 | struct | 95 | failed | | none — MATCH (95 ins). memcpy(d,s,4) -> lwl/lwr/swl/swr; MATRIX work buf as s32[16] (0x40, fills 0x10-0x4f, t[] = buf[5..7]); two SVECTOR locals at 0x50/0x58; natural saved-reg order s0=param_5/s1=param_4/s2=iVar5 | `.run/backlog_drafts/func_8016BFD0.c` | -| 485 | func_801596F0 | 1 | struct | 97 | failed | | none — MATCH (97 ins). Loop 1 = struct-ptr for-loop (E38, flag@+4) -> -4 guard / +4 test via gcc biv-elim. Loop 2 needed an EXPLICIT if-guard + do-while with the FIELD pointer as the loop var (so the giv init emits FIRST in the preheader, before the &D invariant block), a non-volatile re-tie barrier on d=&D_800AFAE8 (keeps &D BARE so +4/+0x88 add off it = +1 ins vs the folded %lo, matching target), an explicit u32 mask hoisted first (fills the guard's delay slot), and a separate range check fp=d+0x88. | `.run/backlog_drafts/func_801596F0.c` | -| 486 | func_8017B490 | 1 | schedule | 97 | failed | | none — MATCH (97 ins). Keys: (1) inverted if so the SV4 block-copy else is fallthrough and block A is bnez-far (cond = (u32)&D_801DA73C >= 0xB, a relocated-symbol compare gcc can't fold); (2) SV4{s16 a,b,c,d} align-2 8-byte copy -> lwl/lwr/swl/swr, locals at sp+0x10/0x18; (3) the DEAD block-A index = (s32)&D_801DA73C into D_8018A45C[] (WAVE16=two SV4) needs BOTH source addrs (&[idx].v0,&[idx].v1) in EXPLICIT TEMPS before call1 so base (&D_8018A45C) dies pre-call -> temp $v0 (not callee-saved), forcing the natural 2-reg alloc idx=$s0/param_1=$s1 + src2 into call1's delay slot; (4) tail: D_801DA794/D_801DA78C are SV4, re-read .a/.b/.c via lh sign-extended to s32 stores. | `.run/backlog_drafts/func_8017B490.c` | -| 487 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` | -| 488 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` | -| 489 | func_8013EF88 | 1 | struct | 108 | failed | | none — MATCH (108 ins). Keys: (1) §18 array-of-struct E4{s32 v} for | `.run/backlog_drafts/func_8013EF88.c` | -| 490 | func_8013D13C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8013D13C.c` | -| 491 | func_801563EC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801563EC.c` | -| 492 | func_8017A0C4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017A0C4.c` | -| 493 | func_8017A094 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017A094.c` | -| 494 | func_801288B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801288B0.c` | -| 495 | func_80131E00 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80131E00.c` | +| 235 | func_8017BEF8 | 1 | WAVE | 113 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEF8.c` | +| 236 | func_80185E68 | 1 | STRUCT | 132 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E68.c` | +| 237 | func_80128218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80128218.c` | +| 238 | func_8013E054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013E054.c` | +| 239 | func_80165658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80165658.c` | +| 240 | func_80178D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80178D18.c` | +| 241 | func_8017CFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFD4.c` | +| 242 | func_8017CFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFFC.c` | +| 243 | func_8017CF78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF78.c` | +| 244 | func_8017CFA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA0.c` | +| 245 | func_8013CABC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013CABC.c` | +| 246 | func_8013D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013D164.c` | +| 247 | func_8014C1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8014C1A0.c` | +| 248 | func_8015E588 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E588.c` | +| 249 | func_8017D13C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D13C.c` | +| 250 | func_8017D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D164.c` | +| 251 | func_8017D18C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D18C.c` | +| 252 | func_8017DA9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA9C.c` | +| 253 | func_8014C5D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8014C5D0.c` | +| 254 | func_8017D5D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D4.c` | +| 255 | func_8017D5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5FC.c` | +| 256 | func_8017D02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D02C.c` | +| 257 | func_8017D054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D054.c` | +| 258 | func_8017D07C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D07C.c` | +| 259 | func_8017D430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D430.c` | +| 260 | func_8017D134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D134.c` | +| 261 | func_8017D15C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D15C.c` | +| 262 | func_8017D3FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3FC.c` | +| 263 | func_8017D6D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D4.c` | +| 264 | func_8017D964 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D964.c` | +| 265 | func_8017F458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F458.c` | +| 266 | func_8018A660 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A660.c` | +| 267 | func_8013C98C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8013C98C.c` | +| 268 | func_80161C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80161C98.c` | +| 269 | func_80171120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171120.c` | +| 270 | func_80157544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157544.c` | +| 271 | func_8015DE58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015DE58.c` | +| 272 | func_801678B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801678B4.c` | +| 273 | func_8016F6E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F6E0.c` | +| 274 | func_8016FDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FDB4.c` | +| 275 | func_8016FFDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FFDC.c` | +| 276 | func_8017D418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D418.c` | +| 277 | func_8017D440 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D440.c` | +| 278 | func_8017E034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E034.c` | +| 279 | func_8017ED30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED30.c` | +| 280 | func_8017ED58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED58.c` | +| 281 | func_80157DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157DC4.c` | +| 282 | func_80164EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164EA4.c` | +| 283 | func_8016F8E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F8E4.c` | +| 284 | func_80171064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171064.c` | +| 285 | func_801727D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801727D0.c` | +| 286 | func_801747CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801747CC.c` | +| 287 | func_8017EE24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE24.c` | +| 288 | func_8017F40C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F40C.c` | +| 289 | func_8017D34C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D34C.c` | +| 290 | func_8017D374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D374.c` | +| 291 | func_8017F080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F080.c` | +| 292 | func_801866B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801866B0.c` | +| 293 | func_8017D00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D00C.c` | +| 294 | func_8017D034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D034.c` | +| 295 | func_80131FDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FDC.c` | +| 296 | func_80152370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152370.c` | +| 297 | func_8015E8E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E8E8.c` | +| 298 | func_80168D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168D58.c` | +| 299 | func_8016AB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016AB30.c` | +| 300 | func_8016CB84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016CB84.c` | +| 301 | func_8016FC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FC90.c` | +| 302 | func_80170748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170748.c` | +| 303 | func_80174888 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174888.c` | +| 304 | func_80143B30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143B30.c` | +| 305 | func_80143E68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143E68.c` | +| 306 | func_8015E1B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E1B8.c` | +| 307 | func_80167A9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80167A9C.c` | +| 308 | func_801693CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801693CC.c` | +| 309 | func_80169F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169F00.c` | +| 310 | func_801704B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801704B0.c` | +| 311 | func_80170BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170BD8.c` | +| 312 | func_80170EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170EFC.c` | +| 313 | func_801714E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801714E4.c` | +| 314 | func_80173544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173544.c` | +| 315 | func_801742A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801742A4.c` | +| 316 | func_80174474 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174474.c` | +| 317 | func_8017D26C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D26C.c` | +| 318 | func_8017D7A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7A4.c` | +| 319 | func_80155580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80155580.c` | +| 320 | func_80159698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159698.c` | +| 321 | func_8015BFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BFF4.c` | +| 322 | func_8015F00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F00C.c` | +| 323 | func_80160EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160EA4.c` | +| 324 | func_80166618 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166618.c` | +| 325 | func_8016DEA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016DEA4.c` | +| 326 | func_8016F834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F834.c` | +| 327 | func_801705F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801705F8.c` | +| 328 | func_80170810 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170810.c` | +| 329 | func_80172DAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172DAC.c` | +| 330 | func_8017CD9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD9C.c` | +| 331 | func_80136C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80136C54.c` | +| 332 | func_80153320 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153320.c` | +| 333 | func_80159B70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159B70.c` | +| 334 | func_80166018 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166018.c` | +| 335 | func_80166654 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166654.c` | +| 336 | func_8016A700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A700.c` | +| 337 | func_8016BBA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016BBA4.c` | +| 338 | func_8016FB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FB7C.c` | +| 339 | func_8017F1C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1C8.c` | +| 340 | func_80182B9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B9C.c` | +| 341 | func_80131F64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131F64.c` | +| 342 | func_801425CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801425CC.c` | +| 343 | func_80152D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152D24.c` | +| 344 | func_801599A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801599A4.c` | +| 345 | func_8015C714 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015C714.c` | +| 346 | func_8015EE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015EE08.c` | +| 347 | func_8015F324 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F324.c` | +| 348 | func_801659DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801659DC.c` | +| 349 | func_8016D19C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016D19C.c` | +| 350 | func_801736FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801736FC.c` | +| 351 | func_801737E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801737E8.c` | +| 352 | func_8017CFE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFE4.c` | +| 353 | func_8017D1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1F8.c` | +| 354 | func_80143C38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143C38.c` | +| 355 | func_80159968 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159968.c` | +| 356 | func_8015D4E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015D4E8.c` | +| 357 | func_80160138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160138.c` | +| 358 | func_80162330 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162330.c` | +| 359 | func_801663FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801663FC.c` | +| 360 | func_80168744 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168744.c` | +| 361 | func_80170548 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170548.c` | +| 362 | func_80173078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173078.c` | +| 363 | func_8017390C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017390C.c` | +| 364 | func_8017496C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017496C.c` | +| 365 | func_8017BEC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEC4.c` | +| 366 | func_8017D310 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D310.c` | +| 367 | func_801449C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801449C8.c` | +| 368 | func_80151D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151D24.c` | +| 369 | func_80153060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153060.c` | +| 370 | func_8015824C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015824C.c` | +| 371 | func_8015AD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015AD3C.c` | +| 372 | func_8015BE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BE38.c` | +| 373 | func_8015F7D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F7D4.c` | +| 374 | func_80169830 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169830.c` | +| 375 | func_8016C14C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016C14C.c` | +| 376 | func_8016F798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F798.c` | +| 377 | func_8016FA84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FA84.c` | +| 378 | func_8016FF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FF30.c` | +| 379 | func_80170150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170150.c` | +| 380 | func_8017C150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C150.c` | +| 381 | func_80131EEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131EEC.c` | +| 382 | func_80144A2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80144A2C.c` | +| 383 | func_8015CFC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015CFC0.c` | +| 384 | func_8016A020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A020.c` | +| 385 | func_80170C74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170C74.c` | +| 386 | func_801711C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801711C0.c` | +| 387 | func_80172B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172B44.c` | +| 388 | func_80172CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172CA0.c` | +| 389 | func_80174384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174384.c` | +| 390 | func_8017CF7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF7C.c` | +| 391 | func_8017D22C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D22C.c` | +| 392 | func_8015282C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015282C.c` | +| 393 | func_80164BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164BA0.c` | +| 394 | func_801689D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801689D8.c` | +| 395 | func_80169B80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169B80.c` | +| 396 | func_8016B4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016B4BC.c` | +| 397 | func_8016F9C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F9C4.c` | +| 398 | func_80170AD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170AD8.c` | +| 399 | func_80170E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170E34.c` | +| 400 | func_8017BE60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BE60.c` | +| 401 | func_8017CE20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE20.c` | +| 402 | func_8017D424 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D424.c` | +| 403 | func_8017D6FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6FC.c` | +| 404 | func_8017E4C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4C8.c` | +| 405 | func_8017E578 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E578.c` | +| 406 | func_8017ED0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED0C.c` | +| 407 | func_8017F480 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F480.c` | +| 408 | func_8017F500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F500.c` | +| 409 | func_80180420 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180420.c` | +| 410 | func_8017DD2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD2C.c` | +| 411 | func_8017E524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E524.c` | +| 412 | func_8017E734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E734.c` | +| 413 | func_80184F8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184F8C.c` | +| 414 | func_8017CA80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CA80.c` | +| 415 | func_801814B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814B8.c` | +| 416 | func_80185B40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B40.c` | +| 417 | func_80186910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186910.c` | +| 418 | func_80186CAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186CAC.c` | +| 419 | func_80187FEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187FEC.c` | +| 420 | func_801886DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801886DC.c` | +| 421 | func_80189FD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189FD0.c` | +| 422 | func_8018A00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A00C.c` | +| 423 | func_8017C524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C524.c` | +| 424 | func_8017C7C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C7C4.c` | +| 425 | func_80182154 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182154.c` | +| 426 | func_80182234 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182234.c` | +| 427 | func_80182414 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182414.c` | +| 428 | func_801824E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824E0.c` | +| 429 | func_80183238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183238.c` | +| 430 | func_80183718 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183718.c` | +| 431 | func_801863AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801863AC.c` | +| 432 | func_80186E30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186E30.c` | +| 433 | func_80188ECC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188ECC.c` | +| 434 | func_80189304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189304.c` | +| 435 | func_801898C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801898C8.c` | +| 436 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | +| 437 | func_8017F714 | 1 | plumbing | 27 | near | 1 | none — MATCH (27/27 ins, match_one verified) | `.run/backlog_drafts/func_8017F714.c` | +| 438 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | +| 439 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | +| 440 | func_80184C0C | 1 | struct | 48 | near | 1 | none — MATCH (array-of-struct %lo-fold for &D_8018AEB8[idx], stride 0x34) | `.run/backlog_drafts/func_80184C0C.c` | +| 441 | func_8016B4F8 | 1 | regalloc-order | 50 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8016B4F8.c` | +| 442 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | +| 443 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | +| 444 | func_8017F114 | 1 | regalloc-order | 75 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8017F114.c` | +| 445 | func_801656E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801656E8.c` | +| 446 | func_8017D2D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D2D4.c` | +| 447 | func_801807D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801807D8.c` | +| 448 | func_80180AD0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180AD0.c` | +| 449 | func_8017F758 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F758.c` | +| 450 | func_8017FDB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FDB0.c` | +| 451 | func_80180720 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180720.c` | +| 452 | func_80184D80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184D80.c` | +| 453 | func_80184A28 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184A28.c` | +| 454 | func_8017FB2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB2C.c` | +| 455 | func_80183724 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183724.c` | +| 456 | func_80183AFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183AFC.c` | +| 457 | func_8017EE50 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE50.c` | +| 458 | func_80181FF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FF8.c` | +| 459 | func_80185D5C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185D5C.c` | +| 460 | func_8018AE80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AE80.c` | +| 461 | func_80183FF4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FF4.c` | +| 462 | func_801832F4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801832F4.c` | +| 463 | func_8017FE4C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FE4C.c` | +| 464 | func_801827C4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801827C4.c` | +| 465 | func_80182B68 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182B68.c` | +| 466 | func_80185E38 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185E38.c` | +| 467 | func_8017F290 | 1 | regalloc-order | 86 | near | 2 | none — MATCH. Two levers: (1) hold &D_801270CC in a `int *state` local so its | `.run/backlog_drafts/func_8017F290.c` | +| 468 | func_8016EC0C | 1 | schedule | 88 | near | 2 | none — MATCH (88 ins). Sparse switch(uVar2) = gcc's beq-pivot+slti comparison | `.run/backlog_drafts/func_8016EC0C.c` | +| 469 | func_8017F6B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F6B0.c` | +| 470 | func_8017DDFC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DDFC.c` | +| 471 | func_8017FD2C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FD2C.c` | +| 472 | func_8018A640 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A640.c` | +| 473 | func_80188F30 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80188F30.c` | +| 474 | func_8018BCB4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BCB4.c` | +| 475 | func_80185320 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185320.c` | +| 476 | func_80185670 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185670.c` | +| 477 | func_801880F4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801880F4.c` | +| 478 | func_80182A14 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182A14.c` | +| 479 | func_801817DC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801817DC.c` | +| 480 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | +| 481 | func_8017DA80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DA80.c` | +| 482 | func_8017D468 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D468.c` | +| 483 | func_80185BF4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185BF4.c` | +| 484 | func_8017DCE4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DCE4.c` | +| 485 | func_8017F510 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F510.c` | +| 486 | func_80182EC4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182EC4.c` | +| 487 | func_80140E6C | 1 | schedule | 37 | near | 4 | 4 ins — each save-across-call copy (move s1,v0 / move s0,v0) should fill the NEXT jal's delay slot (target) but gcc-2.7.2 sched ties the copy with the next call's arg-setup at priority 2 and the LUID tie-break (rank_for_schedule) keeps the copy first, so reorg fills the slot with the arg-setup instead; no C reshape found that flips the LUID/priority order without breaking the OR-chain regalloc. | `.run/backlog_drafts/func_80140E6C.c` | +| 488 | func_8012A018 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8012A018.c` | +| 489 | func_80180B24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B24.c` | +| 490 | func_80180B34 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B34.c` | +| 491 | func_80181758 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181758.c` | +| 492 | func_80188484 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188484.c` | +| 493 | func_8013CAE8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8013CAE8.c` | +| 494 | func_8018F080 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F080.c` | +| 495 | func_8018F090 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F090.c` | +| 496 | func_80190460 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190460.c` | +| 497 | func_80190470 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190470.c` | +| 498 | func_80183690 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183690.c` | +| 499 | func_801836A0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801836A0.c` | +| 500 | func_80188F4C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F4C.c` | +| 501 | func_80188F5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F5C.c` | +| 502 | func_80185CC8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CC8.c` | +| 503 | func_80185CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CD8.c` | +| 504 | func_8018ADEC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADEC.c` | +| 505 | func_8018ADFC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADFC.c` | +| 506 | func_8018478C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018478C.c` | +| 507 | func_8018479C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018479C.c` | +| 508 | func_8017F8E4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017F8E4.c` | +| 509 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | +| 510 | func_8017CE34 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE34.c` | +| 511 | func_8017D948 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D948.c` | +| 512 | func_8017D2EC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D2EC.c` | +| 513 | func_801803F0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801803F0.c` | +| 514 | func_80180710 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180710.c` | +| 515 | func_8017CE7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE7C.c` | +| 516 | func_8017F7D8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7D8.c` | +| 517 | func_8017ED98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ED98.c` | +| 518 | func_80181B8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181B8C.c` | +| 519 | func_8017E14C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E14C.c` | +| 520 | func_8017D528 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D528.c` | +| 521 | func_801900E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801900E0.c` | +| 522 | func_8017D1F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1F4.c` | +| 523 | func_8017DB48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DB48.c` | +| 524 | func_8017EBD0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EBD0.c` | +| 525 | func_80182720 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182720.c` | +| 526 | func_8017D160 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D160.c` | +| 527 | func_8017E9D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9D0.c` | +| 528 | func_8017D368 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D368.c` | +| 529 | func_80180564 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180564.c` | +| 530 | func_801809F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801809F4.c` | +| 531 | func_8017F250 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F250.c` | +| 532 | func_8017F66C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F66C.c` | +| 533 | func_8017F76C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F76C.c` | +| 534 | func_8017F790 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F790.c` | +| 535 | func_8017F7B4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7B4.c` | +| 536 | func_8014D3E0 | 1 | other | 22 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8014D3E0.c` | +| 537 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | +| 538 | func_8017B940 | 1 | struct | 63 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8017B940.c` | +| 539 | func_8017B238 | 1 | regalloc-order | 76 | near | 6 | 6 ins — gcc coalesces param_2 into callee-saved $s0 and hoists `move $s0,$a1` | `.run/backlog_drafts/func_8017B238.c` | +| 540 | func_8017B614 | 1 | regalloc-order | 101 | near | 6 | 6 ins — param_2 lands in callee-saved $s0 (entry `move s0,a1`, sltiu/sll read s0) vs target's $a1; gcc prefers s0 (saved anyway for the late p794/p78C copies) over caller-saved $a1. Body+schedule otherwise byte-exact (101/101 ins); the late-part `__asm__("")` barrier is load-bearing (fixes the const-store schedule, 21->6). | `.run/backlog_drafts/func_8017B614.c` | +| 541 | func_801656D0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801656D0.c` | +| 542 | func_80165700 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80165700.c` | +| 543 | func_80180AE8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180AE8.c` | +| 544 | func_8017D398 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D398.c` | +| 545 | func_801345F8 | 1 | schedule | 106 | near | 7 | 7 ins, all pure scheduling order — maskedp copy not sunk into bnez delay slot | `.run/backlog_drafts/func_801345F8.c` | +| 546 | func_8016BFA8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8016BFA8.c` | +| 547 | func_801815D8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801815D8.c` | +| 548 | func_80189898 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80189898.c` | +| 549 | func_8018823C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018823C.c` | +| 550 | func_80183E3C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E3C.c` | +| 551 | func_8017CF40 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017CF40.c` | +| 552 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | +| 553 | func_80185F24 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F24.c` | +| 554 | func_80189858 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80189858.c` | +| 555 | func_8017FFF0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FFF0.c` | +| 556 | func_8017E908 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E908.c` | +| 557 | func_8017CF9C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017CF9C.c` | +| 558 | func_8017D920 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D920.c` | +| 559 | func_8013CB5C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8013CB5C.c` | +| 560 | func_8017A3B0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017A3B0.c` | +| 561 | func_8017F358 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F358.c` | +| 562 | func_80180174 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180174.c` | +| 563 | func_80180E9C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E9C.c` | +| 564 | func_8017A144 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017A144.c` | +| 565 | func_8017BEBC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017BEBC.c` | +| 566 | func_8014C8C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8014C8C8.c` | +| 567 | func_80185A00 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185A00.c` | +| 568 | func_8017FCC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FCC0.c` | +| 569 | func_8017F2D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F2D0.c` | +| 570 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | +| 571 | func_801824D0 | 1 | WAVE | 181 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_801824D0.c` | +| 572 | func_80165670 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80165670.c` | +| 573 | func_80182F4C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F4C.c` | +| 574 | func_801835C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835C8.c` | +| 575 | func_8017D6C4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D6C4.c` | +| 576 | func_8018268C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018268C.c` | +| 577 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | +| 578 | func_8013C964 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013C964.c` | +| 579 | func_8013B568 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013B568.c` | +| 580 | func_801289F0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801289F0.c` | +| 581 | func_80182E58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80182E58.c` | +| 582 | func_8018150C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018150C.c` | +| 583 | func_80185F58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185F58.c` | +| 584 | func_8018A3C8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018A3C8.c` | +| 585 | func_8017EA20 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EA20.c` | +| 586 | func_80178970 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80178970.c` | +| 587 | func_80180528 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180528.c` | +| 588 | func_8017FD44 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017FD44.c` | +| 589 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | +| 590 | func_80180D10 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D10.c` | +| 591 | func_8018316C | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018316C.c` | +| 592 | func_801824CC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801824CC.c` | +| 593 | func_80181784 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80181784.c` | +| 594 | func_8013C938 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8013C938.c` | +| 595 | func_8017D2F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017D2F0.c` | +| 596 | func_80158FA4 | 1 | schedule | 51 | near | 17 | target keeps a DEAD `sra $a1,$v0,16` before `beqz $a1` (sign-extend of func_80159464's | `.run/backlog_drafts/func_80158FA4.c` | +| 597 | func_8017D2D0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D2D0.c` | +| 598 | func_8017EEF4 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017EEF4.c` | +| 599 | func_80182338 | 1 | PINS | 26 | near | 24 | PINS: 24 mismatch | `.run/backlog_drafts/func_80182338.c` | +| 600 | func_8018301C | 1 | plumbing | 28 | near | 24 | none — MATCH (straight-line, statement-order; verify with match_one) | `.run/backlog_drafts/func_8018301C.c` | +| 601 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | +| 602 | func_80182488 | None | | None | near | 24 | residual: 24 mismatch | `.run/backlog_drafts/func_80182488.c` | +| 603 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | +| 604 | func_801900F4 | None | | None | near | 27 | residual: 27 mismatch | `.run/backlog_drafts/func_801900F4.c` | +| 605 | func_80139BE0 | 1 | loose-typing | 39 | near | 32 | target has redundant andi a1,v0,0xff (uchar zero-extend) gcc proves away; else identical | `.run/backlog_drafts/func_80139BE0.c` | +| 606 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | +| 607 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | +| 608 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | +| 609 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | +| 610 | func_80141A60 | 1 | other | 76 | near | 63 | none — MATCH (76 ins, relocation-masked). Body byte-identical; target reserves an 8-byte | `.run/backlog_drafts/func_80141A60.c` | +| 611 | func_801457A4 | 1 | other | 79 | near | 74 | MATCH at -O0 (79 ins, reloc-masked, real -O0 flags). BANKING BLOCKER: this -O0 fn lives in the -O2 main ov_SC01_077.c; needs its own §18 -O0 split at 0x801457A4 (existing _o0.c covers 0x8013B568..0x8013C98C only). match_one is -O2 -> WRONG here. | `.run/backlog_drafts/func_801457A4.c` | +| 612 | func_8016B6BC | 1 | schedule | 94 | near | 80 | 12-off, all in the last 12 ins (tail). First 82 ins byte-match. Target materializes | `.run/backlog_drafts/func_8016B6BC.c` | +| 613 | func_80134A74 | 1 | regalloc-order | 107 | near | 84 | structure + all 8 callee-saved regs (s0..s7) + block layout MATCH; residual is caller-saved-temp | `.run/backlog_drafts/func_80134A74.c` | +| 614 | func_8013EE10 | 1 | struct | 94 | near | 86 | none — MATCH (94 ins). array-of-struct %lo-fold (E[]) for the 5-elt loops; | `.run/backlog_drafts/func_8013EE10.c` | +| 615 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | +| 616 | func_8015E018 | 1 | loose-typing | 47 | failed | | none — MATCH (signed char forces lbu+sll24/sra24 sign-extend; default char is unsigned in this toolchain) | `.run/backlog_drafts/func_8015E018.c` | +| 617 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | +| 618 | func_8013E958 | 1 | schedule | 63 | failed | | 2 ins swapped — cc1 emits `andi 0x7f; andi 0xff; beqz`(tests doubly-masked) but target wants `andi 0x7f; beqz; andi 0xff`(andi 0xff in the first beqz delay slot). Loop fully byte-matches; struct/ptr fold idioms nailed (D_80115110.q[0x16] hoists base+0x58 disp, Cell D_80115188[i].v folds %lo). func_800D0488 takes (m&0xFF) arg. s16 m -> 2 mism (right ins count); s32 m fixes order but merges andi+arg-move (62 ins, 1 short). | `.run/backlog_drafts/func_8013E958.c` | +| 619 | func_8013E83C | 1 | plumbing | 71 | failed | | none — MATCH (scalar global stores + 2 conditional calls; §3-T4 branch-polarity invert on the &0xFF test) | `.run/backlog_drafts/func_8013E83C.c` | +| 620 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | +| 621 | func_80180F10 | 1 | schedule | 75 | failed | | none — MATCH (aggregate-initializer form schedules const setup after the prologue saves) | `.run/backlog_drafts/func_80180F10.c` | +| 622 | func_8016C188 | 1 | schedule | 79 | failed | | none — MATCH (79 ins, match_one). Levers: invert if to if(iVar1!=0){big}else{small} | `.run/backlog_drafts/func_8016C188.c` | +| 623 | func_80164930 | 1 | regalloc-order | 81 | failed | | none — MATCH (81 ins, relocation-masked) | `.run/backlog_drafts/func_80164930.c` | +| 624 | func_801418F8 | 1 | loose-typing | 90 | failed | | none — MATCH (90 ins). Keys: D_8011511A is `volatile u16` (store-2-then-read must NOT const-fold), read ONCE into a `u16` local t (an `unsigned int` local adds a stray andi 0xffff; reusing t feeds the single lhu to both sltiu and t-3), and the lone D_80115158 store after the if yields the delay-slot-fill-from-target dup of `addiu 0x106`. | `.run/backlog_drafts/func_801418F8.c` | +| 625 | func_801789AC | 1 | struct | 91 | failed | | none — MATCH (91 ins, relocation-masked) | `.run/backlog_drafts/func_801789AC.c` | +| 626 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` | +| 627 | func_80185428 | 1 | struct | 94 | failed | | none — MATCH (94 ins, relocation-masked) | `.run/backlog_drafts/func_80185428.c` | +| 628 | func_801506A4 | 1 | loose-typing | 95 | failed | | none — MATCH (95 ins). switch var must be int not u16 (u16 adds andi 0xffff promotion mask) | `.run/backlog_drafts/func_801506A4.c` | +| 629 | func_8016BFD0 | 1 | struct | 95 | failed | | none — MATCH (95 ins). memcpy(d,s,4) -> lwl/lwr/swl/swr; MATRIX work buf as s32[16] (0x40, fills 0x10-0x4f, t[] = buf[5..7]); two SVECTOR locals at 0x50/0x58; natural saved-reg order s0=param_5/s1=param_4/s2=iVar5 | `.run/backlog_drafts/func_8016BFD0.c` | +| 630 | func_801596F0 | 1 | struct | 97 | failed | | none — MATCH (97 ins). Loop 1 = struct-ptr for-loop (E38, flag@+4) -> -4 guard / +4 test via gcc biv-elim. Loop 2 needed an EXPLICIT if-guard + do-while with the FIELD pointer as the loop var (so the giv init emits FIRST in the preheader, before the &D invariant block), a non-volatile re-tie barrier on d=&D_800AFAE8 (keeps &D BARE so +4/+0x88 add off it = +1 ins vs the folded %lo, matching target), an explicit u32 mask hoisted first (fills the guard's delay slot), and a separate range check fp=d+0x88. | `.run/backlog_drafts/func_801596F0.c` | +| 631 | func_8017B490 | 1 | schedule | 97 | failed | | none — MATCH (97 ins). Keys: (1) inverted if so the SV4 block-copy else is fallthrough and block A is bnez-far (cond = (u32)&D_801DA73C >= 0xB, a relocated-symbol compare gcc can't fold); (2) SV4{s16 a,b,c,d} align-2 8-byte copy -> lwl/lwr/swl/swr, locals at sp+0x10/0x18; (3) the DEAD block-A index = (s32)&D_801DA73C into D_8018A45C[] (WAVE16=two SV4) needs BOTH source addrs (&[idx].v0,&[idx].v1) in EXPLICIT TEMPS before call1 so base (&D_8018A45C) dies pre-call -> temp $v0 (not callee-saved), forcing the natural 2-reg alloc idx=$s0/param_1=$s1 + src2 into call1's delay slot; (4) tail: D_801DA794/D_801DA78C are SV4, re-read .a/.b/.c via lh sign-extended to s32 stores. | `.run/backlog_drafts/func_8017B490.c` | +| 632 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` | +| 633 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` | +| 634 | func_8013EF88 | 1 | struct | 108 | failed | | none — MATCH (108 ins). Keys: (1) §18 array-of-struct E4{s32 v} for | `.run/backlog_drafts/func_8013EF88.c` | +| 635 | func_8013D13C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8013D13C.c` | +| 636 | func_801563EC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801563EC.c` | +| 637 | func_8017A0C4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017A0C4.c` | +| 638 | func_8017A094 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017A094.c` | +| 639 | func_801288B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801288B0.c` | +| 640 | func_80131E00 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80131E00.c` | +| 641 | func_80130D0C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80130D0C.c` | +| 642 | func_80141788 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80141788.c` | +| 643 | func_8017D8DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D8DC.c` | +| 644 | func_8017F14C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F14C.c` | diff --git a/docs/community-matching-model-plan.md b/docs/community-matching-model-plan.md new file mode 100644 index 000000000..bd8252918 --- /dev/null +++ b/docs/community-matching-model-plan.md @@ -0,0 +1,171 @@ +# Community matching-model plan — publishing the LLM decomp drafter (parked / future use) + +> **Status:** design note, not active work. Captured 2026-07-01 during the Phase-23 LLM-tier build, while +> the reasoning is fresh (R30). Belongs to the eventual **public flip** (Gen2 exit / Gen3) — do not start +> until BFM is presentable and the repo is public-ready. Sibling docs: `docs/gen2-mips-matching-model.md` +> (how we built BFM's specialist), `docs/matching-cookbook.md` (the idioms the model encodes), +> `PROJECT_CONTEXT.md` (the public-flip + licensing decisions). + +## TL;DR + +We built the first *working* LLM **matching-drafter** for PS1/PsyQ decomp: a LoRA fine-tune of +Qwen2.5-Coder-7B that drafts byte-exact C for `gcc-2.7.2-psx -O2 -G0 + maspsx 2.56`, gated by an +incorruptible whole-binary byte-gate (the model only affects *throughput*, never correctness). Three +things are publishable, in increasing order of community value: + +1. **The weights (`bfm-match-7b-v*`)** — directly useful to anyone on the *same* toolchain; a rough + structural drafter for anyone else. +2. **The pipeline + a toolchain-agnostic training plan** — lets *any* decomp project train its own + specialist on its own pairs in an afternoon. Higher leverage than the weights. +3. **A universal, toolchain-conditioned model** (shared base + per-toolchain LoRA) trained on a *pooled* + multi-decomp corpus — the ambitious, landmark contribution. Feasible; decomp.me is the ready dataset. + +The byte-gate is the load-bearing idea that makes all of this safe to share: a weak or wrong draft from +*any* model can never land a wrong match — it just reverts. So a "pretty good across many compilers" +model is a legitimate accelerator everywhere, with zero correctness risk. + +## Why a matching model is compiler-specific (and what that means for sharing) + +A matching drafter learns one compiler's **codegen fingerprint** — its register allocation, instruction +scheduling, reload/CSE/peephole choices, and the C idioms that trigger specific byte sequences (cookbook +§17–§28). Change the compiler and those bytes change: + +| Audience | Transfer from BFM's v3 | Why | +|---|---|---| +| **Same toolchain** (gcc-2.7.2-psx, similar flags) | **Direct, byte-level** | Identical codegen. Real audience: the Phase-21 sweep byte-verified **4 gcc-2.7.2-psx twins** — Xenogears, Vagrant Story (CC0), Tomba, + the psx lineage `cc1`. | +| **Same gcc family, different flags/version** (2.6.x, 2.8, `-O1`/`-O3`/`-G8`) | **Partial** | Most passes shared; regalloc/scheduling/peephole drift breaks byte-exactness but structure transfers. | +| **Different target, same era** (N64 MIPS via IDO/gcc, PS2, Saturn SH2) | **Structural only** | ISA and ABI differ; useful as a scaffold, not a byte-matcher. | +| **Modern / unrelated compilers** | **Weak** | Different world. | + +So **v3's weights help the gcc-2.7.2-psx crowd directly**; everyone else needs *their own* specialist — +which is why the pipeline matters more than the weights. + +## Artifact 1 — Publish the weights (cheap, do at the public flip) + +- Ship `bfm-match-7b-v3` (and successors) as a LoRA adapter on the chosen base, plus a model card stating + the **exact toolchain it targets** (gcc-2.7.2-psx -O2 -G0, maspsx `--aspsx-version=2.56 --expand-div`), + the training-corpus provenance (BFM matched bodies), held-out eval numbers, and the **byte-gate caveat** + (it is a *drafter*; the byte-gate is the arbiter). +- Licensing: weights derive from BFM-matched C, which derives from ROM analysis — handle under the same + public-flip policy as the rest of the repo (AGPL-3.0 for code; the *dataset* of asm↔C pairs is the + sensitive artifact — see "Data + provenance"). Adapter weights are a learned transform, not ROM bytes, + but treat conservatively until reviewed. + +## Artifact 2 — Publish the pipeline + training plan (highest leverage) + +The loop is toolchain-agnostic; only the *data* and the *compile command* are project-specific: + +``` +export_pairs.py mine (asm .s ↔ matched C) from the project's build objects + shared macro bodies +format_finetune.py -> chat-template examples; inline the project's shared types; compile-filter +train_lora.py QLoRA on a code base model (Qwen2.5-Coder-7B is a strong, permissive default) +serve_local.py serve base+LoRA as an OpenAI endpoint (GPU) + the project's own whole-binary / per-function match check = the SOLE arbiter +lora_grind / waves draft open stubs -> gate -> bank -> propagate; near-misses -> permuter + corpus +``` + +**Publish:** the scripts (already in `tools/`), a `README`/tutorial ("train a matching drafter for *your* +decomp"), and the **measured lessons** that save others weeks: +- *Data is the bottleneck, not model size* — BFM's jump came from corpus fixes (the extern block, the + shared-macro bodies, the "never draft an empty body" prompt), not bigger models (`gen2-mips-matching-model.md`). +- *Self-contained completions* — the model must emit the externs/types it references, or it compiles in + isolation and fails in-project (the propagation cap; cookbook §28/§28d). +- *Dense > MoE for a small LoRA corpus; model size must match data size* (overfit otherwise). +- *The byte-gate makes a weak model a throughput risk only* — so iterate fearlessly. +- *Permuter (CPU) closes the regalloc/schedule tail the LLM leaves* — run it concurrently (GPU vs CPU). + +This is the artifact that actually moves the whole decomp ecosystem: every project keeps its own +incorruptible gate and trains a specialist that fits its exact compiler. + +## Artifact 3 — The universal, toolchain-conditioned model (the ambitious one) + +**Idea:** one model trained on pooled asm↔C pairs from *many* decomps, each example **conditioned on its +toolchain** `(compiler, version, flags, target-arch)`. At inference you state your toolchain and it drafts +in that regime. + +**Why it can work:** the gcc family shares most of its passes across versions, and MIPS targets share the +ISA — so a model that has seen many regimes interpolates, the way a multilingual model does. The +conditioning token tells it which regime to emit. + +**Best architecture — shared base + per-toolchain LoRA:** +- A **base** fine-tuned on the *whole* pooled corpus → broad, cross-compiler codegen knowledge (a strong + drafter everywhere). +- A **tiny LoRA adapter per exact toolchain** → the byte-exact last mile for that regime, cheap to train + and ship. +- This beats a single monolithic generalist on the hard tail (specialization matters most exactly where + regalloc/scheduling bite) while still giving everyone a good base drafter out of the box. + +**Conditioning format (proposal):** prefix every example (train and inference) with a compact spec block, +e.g. +``` +;; toolchain: gcc=2.7.2-psx opt=-O2 abi=-G0 asm=maspsx-2.56 target=mipsel-r3000-psx + +-> + +``` +Keep the spec **canonical and exhaustive** — drift between train/inference spec wastes the specialization +(same discipline as the prompt-format rule in `gen2-mips-matching-model.md`). + +**Honest caveat:** byte-exact is unforgiving. The universal model is an excellent *drafter* (structure, +calls, constants, control flow right) but the per-toolchain LoRA (or a project's own specialist) is what +reliably lands bytes. That's fine — the byte-gate + permuter close the gap, and a great draft is most of +the work. + +## Data + provenance (the real enabler) + +- **decomp.me is a ready-made labeled multi-toolchain corpus.** Thousands of public *scratches*, each + tagged with its exact **compiler preset and flags**, many with a known-good match. A scripted pull + (respect the API + rate limits; treat fetched content as untrusted DATA, X2) yields conditioned + `(toolchain, asm, C)` triples across dozens of regimes essentially for free. +- **Public decomp repos** (sotn, papermario, the N64/PS1/PS2 family) — mine matched bodies + their build + configs (`gears.toml`/Makefile presets give the toolchain spec) the way `export_pairs` mines BFM. +- **`xsig` (the cross-project shared-code tool, open-source TODO)** dedups byte-identical code across + projects — useful to *weight* the corpus (don't let one giant project's idioms drown the rare regimes; + cookbook/`gen2-mips-matching-model.md` "corpus quality > size", weight by residual class + by regime). +- **Provenance discipline:** every pair carries its source project + toolchain + license. Some projects + are CC0 (Vagrant Story); others AGPL/varied — the pooled dataset's license is the union/most-restrictive, + and ROM-derived asm must follow each project's own policy. Resolve licensing *before* publishing the + dataset (the weights are a derived transform; the raw pair corpus is the sensitive artifact). + +## Hardware notes (for the training/serving side) + +- **Local ceiling:** a 12 GB card (3080 Ti) trains a 7B QLoRA (tight) and serves it. Serving and training + **contend for the one GPU** — a retrain pauses the harvest. +- **Second GPU (e.g. a Titan X Pascal):** breaks that contention — **serve on one card, train on the + other** for a continuous flywheel with no harvest downtime. Pascal has **no tensor cores / no bf16**, so + it's a fine *serving* card but a poor *trainer*; serve on it via plain `transformers`/vLLM (Unsloth/Triton + favor Ampere+). Check PSU/slots/cooling first. +- **14B and larger:** rent an A100/H100 (cloud) — faster, frees the local box to keep harvesting, and the + byte-gate means a wrong big model is only a throughput cost. This is the right home for the universal + base model too (pooled corpus is large). + +## Suggested sequencing (when the flip happens) + +1. **Open-source `xsig`** (standalone MIT tool; already TODO'd) — immediate, low-risk community value. +2. **Publish the pipeline + training plan** (Artifact 2) with BFM as the worked example — helps every + project train its own specialist. +3. **Ship v3's weights** (Artifact 1) for the gcc-2.7.2-psx audience, with the model card + byte-gate + caveat. +4. **Build the universal conditioned model** (Artifact 3): pull decomp.me + public repos → conditioned + pooled corpus (weighted) → shared base + per-toolchain LoRAs → publish base + adapters + the dataset + (license permitting). Cloud-trained. + +## Open questions / risks + +- **Licensing of the pooled pair corpus** — the gating risk for Artifact 3; resolve per-source before any + dataset release. +- **Regime imbalance** — huge projects (sotn) vs tiny ones; needs corpus weighting by regime + residual + class, not raw count. +- **Generalist-vs-specialist on the hard tail** — measure: does the base+LoRA match a from-scratch + per-project specialist? (It should be ≥, given the shared base; verify on held-out byte-gate.) +- **Eval honesty** — always report *whole-binary/whole-match* gate-true rates, never `match_one`/standalone + proxies (the R14/§25/§26 lesson: an intermediate metric is not a match). +- **Maintenance** — a published model is a moving target as base models improve; the *pipeline* is the + durable artifact, the weights are a snapshot. + +## One-line pitch (for the eventual README / post) + +> A free, local, fine-tuned **matching drafter** for decompilation: it writes byte-exact C from assembly +> for your exact compiler, an incorruptible byte-gate guarantees nothing wrong ever lands, and a permuter +> closes the regalloc/scheduling tail — train your own specialist with our pipeline, or use the +> toolchain-conditioned universal model and just tell it which compiler you're on. diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index e2a459d43..2a8ac06a9 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -3,30 +3,30 @@ # source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. -FLEET REAL substantive : 219716 (of which dedup-shared 218645 via 1687 groups / 218696 instances) +FLEET REAL substantive : 219765 (of which dedup-shared 218653 via 1691 groups / 218704 instances) FLEET LINKED PsyQ objs : 959 -FLEET byte-identical : 221331 / 344941 = 64.16% (REAL+LINKED+empties) +FLEET byte-identical : 221380 / 344941 = 64.18% (REAL+LINKED+empties) FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 123603 +FLEET INCLUDE_ASM stubs : 123554 FLEET matchable : 344941 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | |---|---:|---:|---:|---:|---:|---:| | main | 54 | 2 | 959 | 1055 | 2096 | 50.3% | | resident | 123 | 0 | 0 | 125 | 146 | 85.6% | -| ov_SC01_000 | 1648 | 1636 | 0 | 1648 | 2410 | 68.4% | +| ov_SC01_000 | 1650 | 1636 | 0 | 1650 | 2410 | 68.5% | | ov_SC01_001 | 1646 | 1636 | 0 | 1648 | 2474 | 66.6% | -| ov_SC01_004 | 1635 | 1627 | 0 | 1636 | 2423 | 67.5% | +| ov_SC01_004 | 1639 | 1627 | 0 | 1640 | 2423 | 67.7% | | ov_SC01_005 | 1662 | 1649 | 0 | 1662 | 2511 | 66.2% | | ov_SC01_006 | 1661 | 1649 | 0 | 1661 | 2511 | 66.1% | -| ov_SC01_008 | 1637 | 1627 | 0 | 1639 | 2435 | 67.3% | -| ov_SC01_009 | 1644 | 1628 | 0 | 1645 | 2517 | 65.4% | -| ov_SC01_074 | 1637 | 1628 | 0 | 1639 | 2434 | 67.3% | +| ov_SC01_008 | 1640 | 1627 | 0 | 1642 | 2435 | 67.4% | +| ov_SC01_009 | 1656 | 1628 | 0 | 1657 | 2517 | 65.8% | +| ov_SC01_074 | 1640 | 1628 | 0 | 1642 | 2434 | 67.5% | | ov_SC01_077 | 2151 | 1588 | 0 | 2153 | 2586 | 83.3% | -| ov_SC01_080 | 1646 | 1631 | 0 | 1646 | 2522 | 65.3% | -| ov_SC01_084 | 1650 | 1631 | 0 | 1655 | 2588 | 63.9% | -| ov_SC02_000 | 1668 | 1660 | 0 | 1668 | 2691 | 62.0% | -| ov_SC02_003 | 1671 | 1660 | 0 | 1671 | 2691 | 62.1% | +| ov_SC01_080 | 1653 | 1631 | 0 | 1653 | 2522 | 65.5% | +| ov_SC01_084 | 1657 | 1631 | 0 | 1662 | 2588 | 64.2% | +| ov_SC02_000 | 1675 | 1664 | 0 | 1675 | 2691 | 62.2% | +| ov_SC02_003 | 1675 | 1664 | 0 | 1675 | 2691 | 62.2% | | ov_SC02_004 | 1644 | 1631 | 0 | 1644 | 2410 | 68.2% | | ov_SC02_005 | 1646 | 1627 | 0 | 1656 | 2937 | 56.4% | | ov_SC02_011 | 1649 | 1634 | 0 | 1660 | 2903 | 57.2% | diff --git a/docs/sister-decomps.md b/docs/sister-decomps.md new file mode 100644 index 000000000..8904dc99e --- /dev/null +++ b/docs/sister-decomps.md @@ -0,0 +1,67 @@ +# Sister decomps — cross-project knowledge transfer (notes for later) + +> **Status:** parked notes / ideas, NOT active work. Captured 2026-07-01 (R30, while fresh). These are +> *recommendations and rationale*, not decided plans — the repo layout below is pending Drew's call. +> Sibling docs: `docs/community-matching-model-plan.md` (publishing the drafter), `docs/matching-cookbook.md` +> (the idioms), `docs/SETUP.md §5.6` (the read-only reference clones). + +## Why sister decomps matter to BFM + +BFM's matching loop runs on **gcc-2.7.2-psx -O2 -G0 + maspsx 2.56**. The Phase-21 collaboration sweep +byte-verified that **our `cc1` IS the psx lineage**, and identified **4 gcc-2.7.2-psx twins**: **Vagrant +Story (CC0)**, **Xenogears**, **Tomba**, and the psx `cc1` source itself. Same compiler ⇒ the entire +`§17–§28` toolkit, the permuter harness, the byte-gate methodology, and even the v3 model transfer at the +**byte level**, not just structurally. + +Two distinct reasons to engage a sibling: + +1. **Contribute (give back).** Apply BFM's industrialized loop to a sibling — most useful on **Vagrant + Story** (CC0 = licensing-clean, freely contributable + poolable). v3 drafts VS functions out of the box + (same compiler); VS's own pairs train a VS adapter or pool into the universal model. + +2. **[THE WAY-LATER IDEA — Drew, 2026-07-01] Cross-project idiom discovery as a ceiling-breaker.** The + cookbook flywheel feeds on hard-won near-misses that teach new gcc-2.7.2 idioms. One codebase eventually + **exhausts its variety** — BFM stops producing *novel* idiom-generating functions and the residual is + the known intrinsic scheduler/regalloc walls. At that point, a **same-compiler sibling with different + code patterns** becomes a fresh source of compiler behaviors, and **any idiom learned there transfers + straight back to BFM**. So if BFM matching stalls on "no new idioms, only intrinsic walls," harvest + *idioms* (not just matches) from VS/Xenogears and re-apply to BFM's tail. Memory: + `cross-project-idiom-discovery`. + +## Recommended layout (pending decision) + +Drew's instinct — co-locate the sibling gitignored inside this repo — is right and matches the existing +`tools/reference/xenogears-decomp` precedent (a gitignored clone). One adjustment, because we'd *write* to +VS (branches/PRs), not just read it: + +- **Clone YOUR FORK** (not upstream) so you can branch + PR. +- **Add the `.gitignore` entry first** (e.g. `/sister-decomps/`) so BFM never tracks a byte of it; the + sibling keeps its own `.git` pushing to your fork → upstream. +- Suggested location: **`/sister-decomps/vagrant-story/`** at the repo root (signals "peer project," not a + BFM read-only reference). +- BFM is the **read-only knowledge base** the sibling references by path (cookbook + `tools/`, ported into + the sibling where a clean PR needs them — the sibling gets its own copies, not BFM imports). +- **Alternative** (textbook, if you'd rather avoid a nested working repo's git foot-gun): a true sibling + `~/vagrant-story/` next to `~/bfm-decomp/`. + +## Discipline (non-negotiable if we do this) + +- **Content firewall.** BFM is private + ROM-derived; VS is public + CC0. Nothing BFM-private or + ROM-derived ever lands in a sibling commit. Tools are code (ROM-free) → fine to port. +- **Governance separation.** The BFM phase-gate/PhaseEnd system governs *this* project only. Sibling work + is a separate track — its own loop, its own gate, no BFM phase ceremony. It is NOT "Phase 24." +- **Licensing of ported tools.** Drew owns the BFM tools and can license his own work into a CC0 project as + he wishes; settle this before contributing tool code upstream. + +## What the transfer buys a sibling (e.g. VS) + +The byte-gate (the sibling has its own `check`/asm-differ), the gcc-2.7.2 idiom toolkit (§17–§28), the +decomp-permuter harness, `inject_capped_externs`-style shared-code propagation, and a same-compiler LLM +drafter (v3 now; a sibling adapter or the universal model later). That's most of an industrialized matching +loop dropped onto a sibling codebase. + +## Next step (when Drew greenlights — not now) + +Provide the VS fork URL (or "fork it for me" → use `gh`), then: add the `.gitignore` entry, clone +co-located, and survey VS's current state (build/gate setup, % matched, the unmatched queue) to see where +our toolkit lands first. Keep a one-line cross-project pointer here so the knowledge link is recorded. diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index b27cda368..f8d2c18db 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -32,7 +32,7 @@ D. Periodically: `export_pairs → format_finetune → train_lora → redeploy` - [ ] **T10 — Progress honesty + PhaseEnd** — track fleet % + bank-rate; PhaseEnd_Phase23 at a clean checkpoint (Tier-1 Max). ## ▶ RESUME HERE (fresh session) -**State:** Phase 23 in progress (NOT a phase end). **v3 is the current model** — `bfm-match-7b-v3` (Qwen2.5-Coder-7B QLoRA on **corpus-v3**), adapter at `models/bfm-match-7b-v3` (v2 kept as fallback at `models/bfm-match-7b`). **LM Studio is EJECTED** — serve via **`tools/serve_local.py`** (Unsloth GPU, OpenAI endpoint), NOT LM Studio. The **8-hour autonomous run (2026-06-30)** built local serving + the prompt fix + corpus-v3 + v3 + a production batch → **fleet 63.82%** (+502 byte-identical, $0), 136/136 byte-clean, 27 commits this session (local — **Drew pushes**, R6). Pipeline validated end-to-end: a free local model banks the small/setter bulk, including the empty-leaf class v2 couldn't. Corpus `datasets/match_pairs/` + `.venv-train` gitignored. (Phase 22 close `PhaseEnd_Phase22.md` is committed `commit:0325`.) +**State:** Phase 23 in progress (NOT a phase end). **v3 is the current model** — `bfm-match-7b-v3` (Qwen2.5-Coder-7B QLoRA on **corpus-v3**), adapter at `models/bfm-match-7b-v3` (v2 kept as fallback at `models/bfm-match-7b`). **LM Studio is EJECTED** — serve via **`tools/serve_local.py`** (Unsloth GPU, OpenAI endpoint), NOT LM Studio. The **8-hour autonomous run (2026-06-30)** built local serving + the prompt fix + corpus-v3 + v3 + a production batch → **fleet 63.82%** (+502 byte-identical, $0), 136/136 byte-clean, 27 commits this session (local — **Drew pushes**, R6). Pipeline validated end-to-end: a free local model banks the small/setter bulk, including the empty-leaf class v2 couldn't. Corpus `datasets/match_pairs/` + `.venv-train` gitignored. (Phase 22 close `PhaseEnd_Phase22.md` is committed `commit:0325`.) **UPDATE 2026-07-01 (this session):** measured v3-on-reach≥2 (banks 6/15, the band is reachable) + built **`tools/inject_capped_externs.py`** (the macro-extern-injection lever) and freed **11 reach-134 propagation-capped fns ×134** → **fleet 64.16%** (+0.34%, $0), 136/136 byte-clean, 1687 groups. v3 still served via `serve_local.py`. See the 2026-07-01 progress-log entry for the full arc + the deferred type-walled-14 + the strategic fork. **NEXT TASK — DECIDED (Drew, 2026-06-30): do A first, THEN B.** (Sequencing rationale: A is $0 + immediate + realizes the ×134 lever this run set up, and A's new banks enrich the corpus that B trains on — so A-then-B compounds.) @@ -73,4 +73,5 @@ The **whole-binary byte-gate** (`gate_stage`/`harvest_verify`, G3/P9) is the sol - 2026-06-30: **T7 DEBUGGED + FIXED.** 3 Explore scouts (tooling / run-evidence / corpus) + a direct code read (R14 — which resolved a flat contradiction between two scouts) found **two independent bugs** in `lora_grind`'s gate path: **(A)** `good_sha()` passed `" "` vs harvest_verify's bare `sha1()` → 0 banks for ALL binaries incl. 077 (so 077's "0/12" was a bug artifact); **(B)** `src/asm/out` defaulted to ov_SC01_077 → non-077 drafts dropped at the 077 stub-filter, silently. Fixed `gate_stage.run_gate` (binary-agnostic resolution + bare-hash normalize + a loud negative-control guard) + `lora_grind.good_sha`; byte-neutral (check-all 136/136). ov_SC01_000 spot-run **banked 7/15 (47%) byte-identical** (@commit:0322) → reach-2 `func_8017CE24` propagated ×2. **ROI:** 6/7 reach-1 → broad rotation is high bank-rate / low fleet-% ROI; the fleet lever is **reach≥2 targeting** + corpus-v3. Backlog now correctly classified (4× close=1 = grinder fuel). NEXT: **T8 corpus-v3** (struct types) + **T9 reach≥2 selection** + concurrent grinder. - 2026-06-30 (cont.): **T9 reach≥2 targeting built + measured.** Added `lora_grind --min-reach N` (lazy sig-based reach oracle == `dedup_propagate`, validated 0-mismatch/60 + the func_8017CE24=2 ground truth; `--min-reach 2` ranks high-reach-first, naturally restricts to overlays). Bounded reach≥2 mass-run: ov_SC01_000's 15 reach≥2 (shared) stubs banked **0/15** (vs the reach-1 spot-run's 7/15) — the model is **weakest on shared code** (corpus skipped the `DEFINE_func` bodies + it's the regalloc/schedule tail). But **5/15 are close≤3 reach-134 near-misses** (3× close=1 = func_8012E27C/BF4C/AD64) → high-value permuter fuel (×134 each). **FINDING: reach≥2 model-only ≠ a fleet lever; the lever is reach≥2-draft → grinder-close (×134)**, which needs `grinder.py`'s per-binary fix (same class as T7) + a backlog `binary` field. (A foreground mass-run hit the 10-min Bash cap mid-2nd-batch; tree recovered clean via `git checkout`, check-all 136/136.) Details: `docs/gen2-mips-matching-model.md` "T9 RESULT". NEXT: the grinder per-binary fix (realize the reach-134 ×134 fuel), then corpus-v3. - 2026-06-30 (cont.): **Grinder per-binary fix (5-layer) — built + validated; reach≥2 fuel re-characterized.** The grinder/backlog were ov_SC01_077-hardcoded **5 layers deep** — fixed all: `gate_stage` records `binary`, `backlog.FIELDS` keeps it, `backlog.load_best`/`_open_stubs` fleet-aware (stuck-local fns surface via their overlay record), `p16_permute.setup` takes asm-subdir, `grinder` per-binary resolution + grouped gating + None-`nins` allow. Validated: the 3 fresh reach-134 close=1 ov_SC01_000 fns now surface + resolve + gate per-000. **FINDINGS (byte-evidenced):** (a) the reach≥2 close=1 fuel is **MODEL semantic-misses** (7B drafts empty `void f(void){}` for trivial `return 1`/setters), NOT permuter fuel — a corrected draft banks them (**+3 byte-identical** via the fixed gate, @commit:0326); (b) ×reach is **propagation-capped** (inline-matched in `ov_SC01_077_a.c` → dedup "nothing to propagate" → banked ×1). So the reach-134 ×134 payoff routes through **corpus-v3** (leaf variety) + the **dedup-collapse**, NOT the permuter. check-all 136/136 throughout. Details: `docs/gen2-mips-matching-model.md` (grinder fix). NEXT: corpus-v3 + dedup-collapse. +- 2026-07-01 (**A: reach≥2 measurement + the macro-extern-injection lever — fleet 63.82%→64.16%, $0 LLM**): served v3 (`serve_local.py`, ~15s). **(1) Measured v3 on reach≥2** (`lora_grind --min-reach 2`, bounded): banked **6/15 in ov_SC01_005** (+1 in 006) — **v3 banks the reach≥2 band**, vs v2-pre-fix's 0/15 (T9). But the banks are mostly low-reach (the 005≡006 pair = ×2) and re-bank inline per overlay → the fleet-% needs the COLLAPSE. **(2) Scoped the dedup-collapse:** the broad-overlay inline banks are mostly already-propagated (8-hr sweeps) or reach-1; the real ×134 fuel is **29 reach-134 fns matched INLINE in ov_SC01_077 but `dedup_propagate`-skipped as "not self-contained"** (the §19/20 propagation cap; the Phase-20 backlog list). Diagnosed (R14): they fail `compiles_standalone` on **file-scope callee/data externs** (clean lever) or **local types** (fiddly). **(3) Built `tools/inject_capped_externs.py`** (the Phase-20-backlog "macro-extern-injection", never built): source each capped fn's externs from 077's OWN file-scope decls, inject block-scope → self-contained → liftable ×134. Byte-neutral (077 stays `d19c9580…`), fail-safe (only rewrites if then `compiles_standalone`). **Freed 8 (main .c) + 3 (`_a.c`) = 11 reach-134 fns**, propagated ×134, **9 new shared groups (1678→1687)**, fleet **63.82%→64.16%** (+0.34%, +1204 byte-identical), check-all **136/136**, dedup-check 0 failed, **$0 LLM**. cookbook **§28d** + SETUP inventory (R16/R21/R30). **(4) Type-walled subset (14 reach-134 fns) DEFERRED:** the §28b type-lift (`build_engine_types --strip`) is **collision-blocked** (`typedef vec differs between header and source`) — the inline-invented types (MATRIX/Buf/Vec3/Loc/vec/…) need manual name-collision reconciliation; low-ROI/fiddly, byte-gate+collision-guard correctly refused. The 14: `0x8014964C 0x8014A048 0x8014C8C8 0x801678F0 0x8016A8FC 0x801749C8 0x80177EA4` (main) + `0x8012A418 0x8012A464 0x8012C658 0x8012E778 0x8012EA90 0x80134310 0x801395D4` (_a). Blast radius of a lift = overlays ONLY (engine_types.h does NOT reach main/resident). **(5) Launched a bounded broad v3 harvest** (12 batches, propagate-every-4) for $0 corpus growth + incremental banks — running at write time. **NEXT:** verify+commit the harvest; then the strategic fork — (a) v3.1 flywheel retrain on the grown corpus (compounding, ~2h GPU), (b) the type-collision reconciliation (~+0.5%, fiddly), or (c) accept the automated ceiling and head to PhaseEnd. The injection lever now CLOSES the v3-reach≥2→×134 loop for future 077 banks (idempotent re-run). - 2026-06-30 (**8-hour autonomous run, Drew away**): prompt-fix + local serving + corpus-v3 + v3 + big batch. **LM Studio ejected** → built **`tools/serve_local.py`** (Unsloth GPU serving as an OpenAI endpoint; the prebuilt llama-cpp-python CUDA wheel SIGILLs on this no-AVX-512 CPU, so the Unsloth/torch path is the reliable one). **PROMPT FIX** (`api_draft.LEAN_SYS` + `format_finetune.SYS`, synced): "translate EVERY instruction, never an empty body" — the v2 empty-leaf overfit, small-leaf band **0/3→2/3**, banked 3 on a fresh ov_SC01_001 batch. **CORPUS-V3**: `export_pairs` now mines the **1623 engine_core.h `DEFINE_func` macros** (the shared setters/return-const the model was blind to — 96.6% of v2 was overlay-unique) + `format_finetune` inlines `engine_types.h` structs → corpus **1312→2891**, trainable **2534+291** (2.5× v2). **v3 trained** (Qwen2.5-Coder-7B QLoRA, loss 1.275→0.085, ~2h), held-out gate-true eval **MATCH 23/40 (57.5%)** (generalizing; v2's mixed-set rate was lower). Grinder concurrent during training = 0 banks (permuter tail exhausted, Phase-22 reality). **Big batch** (v3, broad rotation, 25 binaries, propagate-every-3, **$0 LLM**): banked **~352 fns inline + 45 new shared groups** (1633→1678) → fleet **63.67% → 63.82%** (+502 byte-identical), **136/136 byte-clean**, 25 auto-commits. v3 repeatedly banked the **empty-leaf/setter class v2 couldn't** (func_8012E27C=return 1, 8012AD64/BF4C=setters). **Pipeline validated end-to-end:** a free local fine-tuned model harvests the small/setter bulk at $0, gated identically (G3/P9). Details: `docs/gen2-mips-matching-model.md` ("Corpus-v3 ... 8-hour autonomous run"). **NEXT (fresh session):** (1) **shared/reach≥2 targeting** (`lora_grind --min-reach 2` with v3 — so the setter banks propagate ×134 instead of re-banking inline per binary — the fleet-% lever); (2) **dedup-collapse** the per-binary inline setters; (3) **corpus-v4** = struct-giant types; raise `--max-nins` as the band lifts. Serve: `tools/serve_local.py --adapter models/bfm-match-7b-v3` (R21 / SETUP §Tooling inventory). diff --git a/src/ov_SC02_000/ov_SC02_000.c b/src/ov_SC02_000/ov_SC02_000.c index fc4d7459f..27bcb28ea 100644 --- a/src/ov_SC02_000/ov_SC02_000.c +++ b/src/ov_SC02_000/ov_SC02_000.c @@ -4946,12 +4946,7 @@ extern s16 D_80126968; } -extern void (*D_8018EA0C[])(void); - -void func_80181D2C(u8 *param_1) -{ - D_8018EA0C[param_1[0x4]](); -} +DEFINE_func_80181D2C() /* dedup: shared engine-core @0x80181D2C (src/shared) */ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80181D68); @@ -5039,11 +5034,7 @@ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80182BD0); INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80182CB4); -extern void (*D_8018ED5C[])(void); - -void func_80182D00(void *a0) { - D_8018ED5C[*(u8 *)((s32)a0 + 0x214)](); -} +DEFINE_func_80182D00() /* dedup: shared engine-core @0x80182D00 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80182D3C); @@ -5223,7 +5214,7 @@ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_8018626C); INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_801863AC); -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_801863E8); +DEFINE_func_801863E8() /* dedup: shared engine-core @0x801863E8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80186424); @@ -5231,11 +5222,7 @@ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80186530); INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80186764); -extern void (*D_8018F31C[])(void); - -void func_801868D4(void *a0) { - D_8018F31C[*(u16 *)((s32)a0 + 0x2)](); -} +DEFINE_func_801868D4() /* dedup: shared engine-core @0x801868D4 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80186910); diff --git a/src/ov_SC02_003/ov_SC02_003.c b/src/ov_SC02_003/ov_SC02_003.c index 5ad8b222f..5a1150fda 100644 --- a/src/ov_SC02_003/ov_SC02_003.c +++ b/src/ov_SC02_003/ov_SC02_003.c @@ -4941,12 +4941,7 @@ extern s16 D_80126968; } -extern void (*D_8018EA0C[])(void); - -void func_80181D2C(u8 *param_1) -{ - D_8018EA0C[param_1[0x4]](); -} +DEFINE_func_80181D2C() /* dedup: shared engine-core @0x80181D2C (src/shared) */ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80181D68); @@ -5031,11 +5026,7 @@ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80182BD0); INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80182CB4); -extern void (*D_8018ED5C[])(void); - -void func_80182D00(void *a0) { - D_8018ED5C[*(u8 *)((s32)a0 + 0x214)](); -} +DEFINE_func_80182D00() /* dedup: shared engine-core @0x80182D00 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80182D3C); @@ -5209,11 +5200,7 @@ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_8018626C); INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_801863AC); -extern void (*D_8018F2FC[])(void); - -void func_801863E8(void *a0) { - D_8018F2FC[*(u16 *)((s32)a0 + 0x2)](); -} +DEFINE_func_801863E8() /* dedup: shared engine-core @0x801863E8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80186424); @@ -5222,11 +5209,7 @@ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80186530); INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80186764); -extern void (*D_8018F31C[])(void); - -void func_801868D4(void *a0) { - D_8018F31C[*(u16 *)((s32)a0 + 0x2)](); -} +DEFINE_func_801868D4() /* dedup: shared engine-core @0x801868D4 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80186910); diff --git a/src/shared/engine_core.h b/src/shared/engine_core.h index f8540297b..84b9ee706 100644 --- a/src/shared/engine_core.h +++ b/src/shared/engine_core.h @@ -24406,4 +24406,29 @@ return q; \ } +#define DEFINE_func_80181D2C() \ + extern void (*D_8018EA0C[])(void); \ + void func_80181D2C(u8 *param_1) \ + { \ + D_8018EA0C[param_1[0x4]](); \ + } + +#define DEFINE_func_80182D00() \ + extern void (*D_8018ED5C[])(void); \ + void func_80182D00(void *a0) { \ + D_8018ED5C[*(u8 *)((s32)a0 + 0x214)](); \ + } + +#define DEFINE_func_801868D4() \ + extern void (*D_8018F31C[])(void); \ + void func_801868D4(void *a0) { \ + D_8018F31C[*(u16 *)((s32)a0 + 0x2)](); \ + } + +#define DEFINE_func_801863E8() \ + extern void (*D_8018F2FC[])(void); \ + void func_801863E8(void *a0) { \ + D_8018F2FC[*(u16 *)((s32)a0 + 0x2)](); \ + } + #endif