Files
BFM-decomp/docs/worklist.md
T
Drew T 41e454ec1f chore(phase-25): T0 — refresh sigs/surveys, regen worklist+backlog, fix sig_image h_norm doc
- housekeeping: deleted stale root gccdump.lreg (gcc default -da RTL dump, dumpbase
  "gccdump"; a one-off RTL-inspection run at root CWD, NOT a committed tool). Practice:
  RTL dumps go to a .run/ CWD or -dumpbase .run/gccdump (R12)
- make sig-overlays (134 sigs); worklist.py --refresh -> build_fuel_manifest + backlog
  render: docs/worklist.md + docs/backlog.md regenerated (stale Jun-26 ranking killed;
  the banked whale func_80144B9C dropped from backlog, P9)
- fix tools/sig_image.py docstring: h_norm is the live norm_stream normalizer, not a
  "T5 placeholder" (R21/R30)
- CURRENT_PHASE.md: Phase-25 plan-of-record + T0 frontier survey (R14): h_norm 2,764
  multi-member families / 11.1 MB; 46% of large solo monsters (3,989/8,670) are family
  members; reach-134 h_exact warm-up = 130 classes / 4.11 MB
2026-07-08 01:02:58 -06:00

22 KiB
Raw Blame History

Worklist — remaining functions ranked by byte-weighted project gain

Generated by tools/worklist.py from .run/fuel_manifest.json + .run/backlog.jsonl. Ranked by byte-weighted gain gain_ins = reach × nins (fleet instructions made byte-identical once matched and propagated ×134 — the decomp.dev-comparable metric the giants move, NOT function-count). %rem = share of ALL remaining gain; cum% = running total (shows how few giants capture most of it). close = backlog match_one mismatch count (lower = nearer; blank = not yet attempted). Byte-gate (harvest_verify) is the sole arbiter (G3/P9).

Live stubs: 130 · total remaining gain: 339,070 ins (1,356,280 bytes ×-fleet)

Idiom-class summary (the groups)

class count gain_ins % of remaining
GIANT 1 26,532 7.8%
STRUCT 20 30,501 9.0%
PINS 8 24,438 7.2%
WAVE 80 227,714 67.2%
O0 9 4,750 1.4%
STUB 12 25,135 7.4%

Top 40 remaining gains (all classes)

# name class reach nins gain_ins %rem cum% cached region close where it stuck best draft
1 func_801412A8 GIANT 134 198 26532 7.82 7.8 Y main 110 110 mismatch (count-exact 198/198). S11 LUID(x)alloc: register-assignment permutation + prim2 store-schedule.… .run/backlog_drafts/func_801412A8.c
2 func_80137DD4 STRUCT 134 129 17286 5.10 12.9 Y a 107 regalloc fully matches (frame -0x30; s4/s3/s5=params, s2=mask, s1=ptr w/ in-place +0x24 reuse, s0=acc+reused … .run/backlog_drafts/func_80137DD4.c
3 func_801325B8 WAVE 134 113 15142 4.47 17.4 Y a 4 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits .run/backlog_drafts/func_801325B8.c
4 func_801330E0 STUB 134 110 14740 4.35 21.7 Y a 79 none — MATCH (110/110 words byte-identical via objcopy raw .text, reloc-masked on jal+%hi/%lo(D_800AF648)). m… .run/backlog_drafts/func_801330E0.c
5 func_8012CC88 WAVE 134 105 14070 4.15 25.9 Y a 0 none — MATCH (105 ins, relocation-masked) .run/backlog_drafts/func_8012CC88.c
6 func_801387B8 WAVE 134 100 13400 3.95 29.8 Y a 50 the two scanned bytes land in $a0/$a1 not $a1/$a2 (gcc-2.7.2 grabs the freed incoming-arg $a0 for the first l… .run/backlog_drafts/func_801387B8.c
7 func_801379FC WAVE 134 97 12998 3.83 33.7 Y a 0 none — MATCH (match_one 97/97) .run/backlog_drafts/func_801379FC.c
8 func_8012B4B8 WAVE 134 84 11256 3.32 37.0 Y a 0 none — MATCH .run/backlog_drafts/func_8012B4B8.c
9 func_8012E138 WAVE 134 81 10854 3.20 40.2 Y a 0 none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 .run/backlog_drafts/func_8012E138.c
10 func_8012A1BC WAVE 134 78 10452 3.08 43.3 Y a 42 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoi… .run/backlog_drafts/func_8012A1BC.c
11 func_80137178 WAVE 134 78 10452 3.08 46.4 Y a 15 reg values all correct; prologue independent-addiu order + lazy sw placement differ .run/backlog_drafts/func_80137178.c
12 func_8012E014 WAVE 134 73 9782 2.88 49.2 Y a 0 none — MATCH (expected; straightforward struct-field + global-copy body) .run/backlog_drafts/func_8012E014.c
13 func_80132F40 STRUCT 134 72 9648 2.85 52.1 Y a gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes .run/backlog_drafts/func_80132F40.c
14 func_80130C08 WAVE 134 65 8710 2.57 54.7 Y a 5 tail shares one jal func_80131CA8 between the a1=5 and a1=0x38 arms via j .L80130CEC with a DUPLICATED `mov… .run/backlog_drafts/func_80130C08.c
15 func_80133298 WAVE 134 65 8710 2.57 57.2 Y a 0 none — MATCH (65 ins, relocation-masked) .run/backlog_drafts/func_80133298.c
16 func_80140D68 WAVE 134 65 8710 2.57 59.8 Y main 5 5-ins near-miss — gcc hoists lui 0xff00 (the 0xFF000000 mask) one slot too early in the first AddPrim block… .run/backlog_drafts/func_80140D68.c
17 func_80136F3C WAVE 134 61 8174 2.41 62.2 Y a 10 10/61 — regalloc EXACT (param-copy + corner register-pins). residual = gcc list-scheduler permutation of the … .run/backlog_drafts/func_80136F3C.c
18 func_8012A328 WAVE 134 60 8040 2.37 64.6 Y a 0 none — MATCH (60 ins, relocation-masked) .run/backlog_drafts/func_8012A328.c
19 func_80130650 WAVE 134 60 8040 2.37 66.9 Y a none — MATCH (60 ins). ((void (*)(void))func_801319E0)() called with NO arg in the >=0x10 branch (target jal+… .run/backlog_drafts/func_80130650.c
20 func_80138DE0 WAVE 134 60 8040 2.37 69.3 Y a 0 none — MATCH (60 ins) .run/backlog_drafts/func_80138DE0.c
21 func_8012B77C WAVE 134 58 7772 2.29 71.6 Y a 33 gcc instruction-scheduler load-ordering + 1st-ratan2 delay-slot fill differ (s2 subtraction lands early inste… .run/backlog_drafts/func_8012B77C.c
22 func_8012F49C WAVE 134 51 6834 2.02 73.6 Y a 29 gcc CSEs the two &D_800AF648 into one call-crossing pseudo and allocates it the .run/backlog_drafts/func_8012F49C.c
23 func_801376E8 WAVE 134 51 6834 2.02 75.6 Y a 0 none — MATCH (51 ins). 3 levers: (1) adjacent-field array u16 D_80126A14[] for A14/A16 .run/backlog_drafts/func_801376E8.c
24 func_80136DFC PINS 134 50 6700 1.98 77.6 Y a 0 none — MATCH .run/backlog_drafts/func_80136DFC.c
25 func_80129C40 PINS 134 46 6164 1.82 79.4 Y a 0 none — MATCH (array-of-struct %lo-fold for the two 3-element 0xA4-stride bases) .run/backlog_drafts/func_80129C40.c
26 func_80130A18 WAVE 134 43 5762 1.70 81.1 Y a none — MATCH (two separate Vec3s locals give the 8-byte-spaced sp+0x10/sp+0x18 blocks) .run/backlog_drafts/func_80130A18.c
27 func_80131D68 WAVE 134 38 5092 1.50 82.6 Y a 0 return value held in $v0 per-path (no $s1 frame); using explicit returns .run/backlog_drafts/func_80131D68.c
28 func_80131A34 PINS 134 37 4958 1.46 84.1 Y a 3 3-off — (a) prologue saves $ra before $s0 (target: $s0 then $ra) and (b) return-0 path reuses $a1's proven-ze… .run/backlog_drafts/func_80131A34.c
29 func_8012F40C WAVE 134 36 4824 1.42 85.5 Y a 0 none — MATCH (address rematerialized per call via caller-saved $a0 pin) .run/backlog_drafts/func_8012F40C.c
30 func_8012A6D0 STUB 134 34 4556 1.34 86.9 Y a 0 none — MATCH (sum order p[2]^2 + p[0]^2, then ratan2(p1[1]-p2[1], (s16)dist)) .run/backlog_drafts/func_8012A6D0.c
31 func_80144B14 WAVE 134 34 4556 1.34 88.2 Y main 31 none — MATCH (34 ins). Two stack structs (s16[3] each) passed by addr to .run/backlog_drafts/func_80144B14.c
32 func_8012EFB8 STUB 134 32 4288 1.26 89.5 Y a 11 none — MATCH (32 ins, byte-verified via objdump -dz; match_one's default objdump elides the 2 consecutive rtp… .run/backlog_drafts/func_8012EFB8.c
33 func_8012F274 WAVE 134 29 3886 1.15 90.6 Y a 0 none — MATCH (29 ins, match_one byte-clean via relocation-masked pipeline) .run/backlog_drafts/func_8012F274.c
34 func_80131CF4 WAVE 134 29 3886 1.15 91.8 Y a 15 15 mismatches cascade from a 2-instruction gap — target reloads *param_1 (lw v0,0(a0)) into v0 before the loo… .run/backlog_drafts/func_80131CF4.c
35 func_80141B90 PINS 134 29 3886 1.15 92.9 Y main 24 none — MATCH (29 ins); array-of-int %lo-fold + call + u16 if-block; volatile-double reserves the target's 8-b… .run/backlog_drafts/func_80141B90.c
36 func_8013C08C O0 134 27 3618 1.07 94.0 Y o0
37 func_80137614 WAVE 134 26 3484 1.03 95.0 Y a 0 none — MATCH (sibling func_8013767C pattern; all 3 params live across the call) .run/backlog_drafts/func_80137614.c
38 func_8012A598 WAVE 134 24 3216 0.95 96.0 Y a 0 none — MATCH (24 ins, relocation-masked) .run/backlog_drafts/func_8012A598.c
39 func_80131CA8 PINS 134 19 2546 0.75 96.7 Y a 0 none — MATCH (call-through-fnptr dispatcher: explicit return 1/return 0) .run/backlog_drafts/func_80131CA8.c
40 func_8013F350 STRUCT 1 490 490 0.14 96.8 Y main

GIANT hand-decomp queue — 1 fns, 7.8% of all remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_801412A8 GIANT 134 198 26532 7.82 Y main 110 110 mismatch (count-exact 198/198). S11 LUID(x)alloc: register-assignment permutation + prim2 store-schedule.… .run/backlog_drafts/func_801412A8.c

Idiom-group tables

STRUCT — 20 fns, 9.0% of remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_80137DD4 STRUCT 134 129 17286 5.10 Y a 107 regalloc fully matches (frame -0x30; s4/s3/s5=params, s2=mask, s1=ptr w/ in-place +0x24 reuse, s0=acc+reused … .run/backlog_drafts/func_80137DD4.c
2 func_80132F40 STRUCT 134 72 9648 2.85 Y a gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes .run/backlog_drafts/func_80132F40.c
3 func_8013F350 STRUCT 1 490 490 0.14 Y main
4 func_801380E0 STRUCT 1 438 438 0.13 n a
5 func_80131340 STRUCT 1 424 424 0.13 n a
6 func_80135EB0 STRUCT 1 289 289 0.09 n a
7 func_80134C20 STRUCT 1 230 230 0.07 n a
8 func_8013FFD8 STRUCT 1 213 213 0.06 Y main
9 func_8014032C STRUCT 1 183 183 0.05 Y main
10 func_80135A4C STRUCT 1 181 181 0.05 n a
11 func_801347A0 STRUCT 1 162 162 0.05 n a
12 func_801299C8 STRUCT 1 158 158 0.05 n a
13 func_8012C890 STRUCT 1 149 149 0.04 n a
14 func_80135260 STRUCT 1 136 136 0.04 n a
15 func_8012AAAC STRUCT 1 125 125 0.04 n a
16 func_80140608 STRUCT 1 123 123 0.04 Y main
17 func_80135888 STRUCT 1 113 113 0.03 n a
18 func_80135D20 STRUCT 1 100 100 0.03 n a
19 func_80142A10 STRUCT 1 28 28 0.01 Y main 1 none — MATCH (pending byte-gate) .run/backlog_drafts/func_80142A10.c
20 func_8012ACE0 STRUCT 1 25 25 0.01 n a 21 STRUCT: 21 mismatch .run/backlog_drafts/func_8012ACE0.c

PINS — 8 fns, 7.2% of remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_80136DFC PINS 134 50 6700 1.98 Y a 0 none — MATCH .run/backlog_drafts/func_80136DFC.c
2 func_80129C40 PINS 134 46 6164 1.82 Y a 0 none — MATCH (array-of-struct %lo-fold for the two 3-element 0xA4-stride bases) .run/backlog_drafts/func_80129C40.c
3 func_80131A34 PINS 134 37 4958 1.46 Y a 3 3-off — (a) prologue saves $ra before $s0 (target: $s0 then $ra) and (b) return-0 path reuses $a1's proven-ze… .run/backlog_drafts/func_80131A34.c
4 func_80141B90 PINS 134 29 3886 1.15 Y main 24 none — MATCH (29 ins); array-of-int %lo-fold + call + u16 if-block; volatile-double reserves the target's 8-b… .run/backlog_drafts/func_80141B90.c
5 func_80131CA8 PINS 134 19 2546 0.75 Y a 0 none — MATCH (call-through-fnptr dispatcher: explicit return 1/return 0) .run/backlog_drafts/func_80131CA8.c
6 func_80141A60 PINS 1 76 76 0.02 Y main 63 none — MATCH (76 ins, relocation-masked). Body byte-identical; target reserves an 8-byte .run/backlog_drafts/func_80141A60.c
7 func_8013E83C PINS 1 71 71 0.02 Y main none — MATCH (scalar global stores + 2 conditional calls; §3-T4 branch-polarity invert on the &0xFF test) .run/backlog_drafts/func_8013E83C.c
8 func_80140E6C PINS 1 37 37 0.01 Y main 4 4 ins — each save-across-call copy (move s1,v0 / move s0,v0) should fill the NEXT jal's delay slot (target) b… .run/backlog_drafts/func_80140E6C.c

WAVE — 80 fns, 67.2% of remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_801325B8 WAVE 134 113 15142 4.47 Y a 4 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits .run/backlog_drafts/func_801325B8.c
2 func_8012CC88 WAVE 134 105 14070 4.15 Y a 0 none — MATCH (105 ins, relocation-masked) .run/backlog_drafts/func_8012CC88.c
3 func_801387B8 WAVE 134 100 13400 3.95 Y a 50 the two scanned bytes land in $a0/$a1 not $a1/$a2 (gcc-2.7.2 grabs the freed incoming-arg $a0 for the first l… .run/backlog_drafts/func_801387B8.c
4 func_801379FC WAVE 134 97 12998 3.83 Y a 0 none — MATCH (match_one 97/97) .run/backlog_drafts/func_801379FC.c
5 func_8012B4B8 WAVE 134 84 11256 3.32 Y a 0 none — MATCH .run/backlog_drafts/func_8012B4B8.c
6 func_8012E138 WAVE 134 81 10854 3.20 Y a 0 none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 .run/backlog_drafts/func_8012E138.c
7 func_8012A1BC WAVE 134 78 10452 3.08 Y a 42 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoi… .run/backlog_drafts/func_8012A1BC.c
8 func_80137178 WAVE 134 78 10452 3.08 Y a 15 reg values all correct; prologue independent-addiu order + lazy sw placement differ .run/backlog_drafts/func_80137178.c
9 func_8012E014 WAVE 134 73 9782 2.88 Y a 0 none — MATCH (expected; straightforward struct-field + global-copy body) .run/backlog_drafts/func_8012E014.c
10 func_80130C08 WAVE 134 65 8710 2.57 Y a 5 tail shares one jal func_80131CA8 between the a1=5 and a1=0x38 arms via j .L80130CEC with a DUPLICATED `mov… .run/backlog_drafts/func_80130C08.c
11 func_80133298 WAVE 134 65 8710 2.57 Y a 0 none — MATCH (65 ins, relocation-masked) .run/backlog_drafts/func_80133298.c
12 func_80140D68 WAVE 134 65 8710 2.57 Y main 5 5-ins near-miss — gcc hoists lui 0xff00 (the 0xFF000000 mask) one slot too early in the first AddPrim block… .run/backlog_drafts/func_80140D68.c
13 func_80136F3C WAVE 134 61 8174 2.41 Y a 10 10/61 — regalloc EXACT (param-copy + corner register-pins). residual = gcc list-scheduler permutation of the … .run/backlog_drafts/func_80136F3C.c
14 func_8012A328 WAVE 134 60 8040 2.37 Y a 0 none — MATCH (60 ins, relocation-masked) .run/backlog_drafts/func_8012A328.c
15 func_80130650 WAVE 134 60 8040 2.37 Y a none — MATCH (60 ins). ((void (*)(void))func_801319E0)() called with NO arg in the >=0x10 branch (target jal+… .run/backlog_drafts/func_80130650.c
16 func_80138DE0 WAVE 134 60 8040 2.37 Y a 0 none — MATCH (60 ins) .run/backlog_drafts/func_80138DE0.c
17 func_8012B77C WAVE 134 58 7772 2.29 Y a 33 gcc instruction-scheduler load-ordering + 1st-ratan2 delay-slot fill differ (s2 subtraction lands early inste… .run/backlog_drafts/func_8012B77C.c
18 func_8012F49C WAVE 134 51 6834 2.02 Y a 29 gcc CSEs the two &D_800AF648 into one call-crossing pseudo and allocates it the .run/backlog_drafts/func_8012F49C.c
19 func_801376E8 WAVE 134 51 6834 2.02 Y a 0 none — MATCH (51 ins). 3 levers: (1) adjacent-field array u16 D_80126A14[] for A14/A16 .run/backlog_drafts/func_801376E8.c
20 func_80130A18 WAVE 134 43 5762 1.70 Y a none — MATCH (two separate Vec3s locals give the 8-byte-spaced sp+0x10/sp+0x18 blocks) .run/backlog_drafts/func_80130A18.c
21 func_80131D68 WAVE 134 38 5092 1.50 Y a 0 return value held in $v0 per-path (no $s1 frame); using explicit returns .run/backlog_drafts/func_80131D68.c
22 func_8012F40C WAVE 134 36 4824 1.42 Y a 0 none — MATCH (address rematerialized per call via caller-saved $a0 pin) .run/backlog_drafts/func_8012F40C.c
23 func_80144B14 WAVE 134 34 4556 1.34 Y main 31 none — MATCH (34 ins). Two stack structs (s16[3] each) passed by addr to .run/backlog_drafts/func_80144B14.c
24 func_8012F274 WAVE 134 29 3886 1.15 Y a 0 none — MATCH (29 ins, match_one byte-clean via relocation-masked pipeline) .run/backlog_drafts/func_8012F274.c
25 func_80131CF4 WAVE 134 29 3886 1.15 Y a 15 15 mismatches cascade from a 2-instruction gap — target reloads *param_1 (lw v0,0(a0)) into v0 before the loo… .run/backlog_drafts/func_80131CF4.c
26 func_80137614 WAVE 134 26 3484 1.03 Y a 0 none — MATCH (sibling func_8013767C pattern; all 3 params live across the call) .run/backlog_drafts/func_80137614.c
27 func_8012A598 WAVE 134 24 3216 0.95 Y a 0 none — MATCH (24 ins, relocation-masked) .run/backlog_drafts/func_8012A598.c
28 func_8013FAF8 WAVE 1 312 312 0.09 Y main
29 func_80130D48 WAVE 1 266 266 0.08 n a
30 func_80140958 WAVE 1 260 260 0.08 Y main
31 func_80135480 WAVE 1 258 258 0.08 n a
32 func_8012956C WAVE 1 226 226 0.07 n a
33 func_80133784 WAVE 1 203 203 0.06 n a
34 func_8013DD68 WAVE 1 187 187 0.06 Y main
35 func_80136334 WAVE 1 161 161 0.05 n a
36 func_80136824 WAVE 1 156 156 0.05 n a
37 func_801365B8 WAVE 1 155 155 0.05 n a
38 func_80133AB0 WAVE 1 137 137 0.04 n a
39 func_8013EB7C WAVE 1 124 124 0.04 Y main
40 func_8013D178 WAVE 1 110 110 0.03 Y main

(+40 more WAVE fns — see .run/worklist.json)

O0 — 9 fns, 1.4% of remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_8013C08C O0 134 27 3618 1.07 Y o0
2 func_8013C414 O0 1 329 329 0.10 Y o0
3 func_8013B83C O0 1 272 272 0.08 Y o0
4 func_8013BD74 O0 1 198 198 0.06 Y o0
5 func_8013C0F8 O0 1 154 154 0.05 Y o0
6 func_8013B6A0 O0 1 67 67 0.02 Y o0
7 func_8013B598 O0 1 66 66 0.02 Y o0
8 func_8013BC7C O0 1 24 24 0.01 Y o0
9 func_8013BCDC O0 1 22 22 0.01 Y o0

STUB — 12 fns, 7.4% of remaining gain

# name class reach nins gain_ins %rem cached region close where it stuck best draft
1 func_801330E0 STUB 134 110 14740 4.35 Y a 79 none — MATCH (110/110 words byte-identical via objcopy raw .text, reloc-masked on jal+%hi/%lo(D_800AF648)). m… .run/backlog_drafts/func_801330E0.c
2 func_8012A6D0 STUB 134 34 4556 1.34 Y a 0 none — MATCH (sum order p[2]^2 + p[0]^2, then ratan2(p1[1]-p2[1], (s16)dist)) .run/backlog_drafts/func_8012A6D0.c
3 func_8012EFB8 STUB 134 32 4288 1.26 Y a 11 none — MATCH (32 ins, byte-verified via objdump -dz; match_one's default objdump elides the 2 consecutive rtp… .run/backlog_drafts/func_8012EFB8.c
4 func_80133CD4 STUB 1 399 399 0.12 n a
5 func_8013CB84 STUB 1 249 249 0.07 Y main
6 func_8013D53C STUB 1 240 240 0.07 Y main
7 func_8013B274 STUB 1 189 189 0.06 n a
8 func_8013D9B0 STUB 1 141 141 0.04 Y main
9 func_80140F00 STUB 1 128 128 0.04 Y main
10 func_8013AD38 STUB 1 122 122 0.04 n a
11 func_80138C60 STUB 1 62 62 0.02 n a
12 func_801336E8 STUB 1 21 21 0.01 n a won't compile standalone (loose-typing / missing decl)