diff --git a/.run/P36/agents/ov_SC06_014__func_8017FB4C/body.c b/.run/P36/agents/ov_SC06_014__func_8017FB4C/body.c index ffdc750bfb..d2e9aa05ed 100644 --- a/.run/P36/agents/ov_SC06_014__func_8017FB4C/body.c +++ b/.run/P36/agents/ov_SC06_014__func_8017FB4C/body.c @@ -1,55 +1,37 @@ void func_8017FB4C(void *a0) { - void *s3 = a0; - void *s2; + void *s2 = *(void **)((s32)a0 + 0x20); void *p; - s32 v1; - s32 v0; - s32 bits; - s32 s0; - s32 s1; + s32 rot; + s32 flag; + s32 angle; + s32 a; + s32 b; - s2 = *(void **)((s32)s3 + 0x20); - func_8017FD74(s3); - p = (*(void * *)&D_801A14A8); - if (p == 0) { - goto END; + func_8017FD74(a0); + p = (void *)D_801A14A8; + if (p != 0) { + rot = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + flag = *(u16 *)((s32)p + 0x12) & 0x400; + angle = rot & 0xFFF; + if (flag) { + a = func_80012A60(angle, 0x400); + b = func_80012A60(angle, 0xC00); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0x400; + } else { + *(u16 *)((s32)s2 + 0x12) = 0xC00; + } + } else { + a = func_80012A60(angle, 0); + b = func_80012A60(angle, 0x800); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0; + } else { + *(u16 *)((s32)s2 + 0x12) = 0x800; + } + } } - v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; - p = *(void **)((s32)p + 0x20); - bits = *(u16 *)((s32)p + 0x12) & 0x400; - s0 = v0 & 0xFFF; - if (bits == 0) { - goto ELSE; - } - s1 = func_80012A60(s0, 0x400); - v0 = func_80012A60(s0, 0xC00); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE1; - } - v0 = 0x400; - goto STORE; -TRUE1: - v0 = 0xC00; - goto STORE; -ELSE: - s1 = func_80012A60(s0, 0); - v0 = func_80012A60(s0, 0x800); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE2; - } - *(u16 *)((s32)s2 + 0x12) = 0; - goto END; -TRUE2: - v0 = 0x800; -STORE: - *(u16 *)((s32)s2 + 0x12) = v0; -END: - func_80171990((u8 *)s3); + func_80171990((u8 *)a0); } diff --git a/.run/P36/agents/ov_SC06_014__func_8017FB4C/mechanism.md b/.run/P36/agents/ov_SC06_014__func_8017FB4C/mechanism.md new file mode 100644 index 0000000000..6ecf50d6ad --- /dev/null +++ b/.run/P36/agents/ov_SC06_014__func_8017FB4C/mechanism.md @@ -0,0 +1,82 @@ +# func_8017FB4C (ov_SC06_014_jr_8017BEBC.c, 4 copies) — P36 S104 agent d3 + +**Result: score 0 in plain C** (no pin, no asm, no volatile, no do-while, no dead initialiser). Lever count 1 -> 0. +Body: `PACK/body.c` (= `scratch/n11.c`). The same body with body-local struct types (`scratch/n15.c`) also scores 0. + +## (a) The residual +Starting text (`body_free.c`, score 22) and the sweep's `free_048.c` (score 4) are goto transliterations. Counting +first: 66 vs 66 instructions every time, so it is a pure register residual at the start, but the goto shape hid three +separate decisions. Once rewritten as structured C they came apart one at a time: + +| step | text | score | what still differed | +|---|---|---|---| +| n4b | if/else, one shared `v` temp stored once | 4 | the stored value in `$a0`, the target has `$v0` | +| n5 | one constant store per arm (no shared temp) | 9 | `$s0`/`$s1` swapped between `angle` and `a` | +| n10 | flag computed before `angle = rot & 0xFFF` | 10 | `D_801A14A8`'s value in `$v0`, the target has `$v1` | +| n11 | `p` reused: `p = D; if (p) { … p = p->+0x20; … }` | **0** | — | + +Every intermediate score is worse than free_048's 4, and the close is the JOINT of the three moves (METHOD step 5). + +## (b) The passes and decisions (read, and proved on bytes) +1. **Stored value `$a0` vs `$v0`: jump.c's if/else hoist + sched1.** `if (c) v = a; else v = b;` becomes + `v = b; if (c) v = a;` (`jump.c:699-835`, conditions `:727-761`, move at `:811`). sched1 then moves the hoisted + `v = 0xC00` above the sign-extension of the second call's result, which still occupies the hard `$v0` + (`.lreg` insn 142 comes before insn 62 in n4b). So `v` conflicts with `$v0` and `find_reg` hands it `$a0`. The target + never had a shared temp. Each arm stores its own constant, and the post-reload cross-jump pass (`toplev.c:3142`, + `find_cross_jump` `jump.c:2371`) merges the three identical `sh $v0,18($s2)` tails into the one the bytes show. The + `sh $zero` arm stays separate because its tail differs. PROVED (n4b -> n5 removed exactly those 4 hunks). +2. **`$s0`/`$s1` swap: sched1's LUID tie-break feeding global.c's priority.** `angle` has 5 refs and `a` has 4. With + `angle`'s `& 0xFFF` computed BEFORE the flag's `& 0x400`, both are ready at T-2 with equal priority (7f000001) and + `rank_for_schedule` (`sched.c:2385`, final tie `INSN_LUID`, `:2428`) puts the higher LUID, the flag, next to the + branch. `angle`'s def moves one insn earlier, so its live length goes from 12 to 13, and sched1's live lengths + replace flow's (`sched.c:4946-4947`). The priority is then 2*5/13 = 7692 < `a`'s 2*4/10 = 8000 + (`allocno_compare`, `global.c:587-607`, priority first, allocno number only on a tie), so `a` takes `$s0` first. Writing the flag before `angle = rot & 0xFFF` + puts `angle` next to the branch: live 12, 8333 > 8000, and `angle` gets `$s0`. A separate `rot` temp is needed for the + `+0x800` value: folding it into `angle` (n9) makes `angle` the addiu's destination (`addiu s0,…`). PROVED: the tables + of n5 and n11 give the numbers above, identical to the pinned tree's table (20000 / 8333 / 8000). +3. **`D_801A14A8` in `$v0` vs `$v1`: one pseudo for the walked pointer (the S103 c18 MERGE move).** sched1 puts the + `lw +0x20` first in block 1. With a separate pseudo for the global's value, that value dies before the + `lhu 18($s2)` temp (which local-alloc gives `$v0`) is born. So nothing conflicts with `$v0`, and global.c's lowest + free register is `$v0`. Reusing ONE variable `p` for both the global's value and the loaded child pointer keeps + the pseudo live up to the `lhu 0x12(p)` (5 refs, live 5, "conflicts v0" in n11's table), so it lands in `$v1`, as + in the target. The pinned tree body already had this shape. Its `p` was reused the same way, and the `$2` pin only + stood in for decisions 1 and 2. PROVED (n10 -> n11). + +## (c) The source moves that closed it +- Rewrote the goto chain as if/else, with one constant store per arm and no shared `v` temp (cross-jump rebuilds the shared `sh`). +- Kept both call results in `s32` locals `a`, `b` and compared `(s16)a <= (s16)b` (with direct calls, or with `s16` locals, the first result is extended before the second call — n6/n7, score 30). +- `rot = lhu + 0x800; p = p->0x20; flag = … & 0x400; angle = rot & 0xFFF; if (flag)`: this source order is the sched tie-break. +- Reused `p` for the global and the child pointer. + +## (d) Generator proposal +When a goto body's `$2`/`$3` pin feeds a temp that only carries constants to ONE store after an if/else join, rewrite +the join as one constant store per arm (cross-jump re-merges the tails after reload). When a `$sN` pair is swapped +between two call-crossing values, reorder the source so the insn defining the higher-ref value has the higher LUID +among the ready-at-branch insns: move independent test computations (flag masks) BEFORE its def. Check it with +`2·refs/live` in `alloc_table.py`. + +## (e) What did not work (byte evidence) +- n1 (`s16 a`, `(s16)call < a` inline): score 37. The sign extension moved before the second call. +- n2/n3/n4b (shared `v` temp, either branch sense): scores 13 / 5 / 4. The jump.c hoist, see (b)1. +- n6 (both calls inline in the comparison) and n7 (`s16 a, b` locals): score 30. The extension came before the second call, and the frame and callee-saved set changed. +- n8 (flag line before the whole `angle` expression): score 10. The `lw +0x20` ordering changed in block 1. +- n9 (`angle = lhu+0x800; …; angle &= 0xFFF`): score 5. One pseudo, so `addiu s0`. +- n12 (no `rot`, `angle` after flag): 10. n13 (no `flag`, test inline): 18. +- n14 (natural `(s16)a > (s16)b` with the arms swapped): score 11, 69 insns. jump sense and block layout change, so `<=` with the 0x400 / 0 arm first stays. + +## (f) Where the method fell short +- The residual's hunk view reported ONE register class at each step. The real defect was three independent decisions, and + the goto transliteration (body_free / free_048) hides decision 1 completely: a shared temp is exactly what the goto + form forces. The generator families all mutate the goto text, so R2-R26 could not reach a per-arm-store spelling. + A "de-goto to structured if/else with per-arm stores" generator is the missing family. +- alloc_table.py was decisive for (b)2 and (b)3. The live lengths it prints are sched1's, and the tie-break that sets + them is only visible in the `.sched` ready-list trace ("now 38 36"), so pair the two when priorities are within one insn. + +## (g) Structs question +Not needed here. Test on bytes: `scratch/n15.c` gives `a0` a body-local `struct Obj { u8 pad[0x20]; void *xf; }` and +`s2` `struct Xform { u8 pad[0x12]; u16 rot; }` (all 6 field accesses through them), and it also scores 0. None of the +three decisions goes through the aggregate-vs-scalar channel (`expr.c:4568-4577`, `sched.c` true_dependence): the only +stores come after every load, and the decisions are the jump.c hoist, a LUID tie-break and pseudo identity. +One caveat for the STRUCTS phase: decision 3 needs ONE variable for both `D_801A14A8`'s object and its `+0x20` child +(`p = p->xf`). Once those get distinct struct types, the reuse needs a common pointer type or a cast. Splitting them into two +typed locals re-opens the `$v0`/`$v1` residual (n10, score 10). diff --git a/.run/P36/delever/calibration.json b/.run/P36/delever/calibration.json index fd9f04c98b..ed34fae66e 100644 --- a/.run/P36/delever/calibration.json +++ b/.run/P36/delever/calibration.json @@ -1,7 +1,7 @@ { - "head": "55ef71b95", + "head": "547571fd1", "stamp": "15956e4a96c4", - "generated": "2026-09-10 21:07", + "generated": "2026-09-10 21:10", "aliases": [ "main", "ov_SC03_014", @@ -21,207 +21,207 @@ "main": { "objects": 85, "identical": 85, - "seconds": 11.27, - "mean_s": 0.133 + "seconds": 10.635000000000002, + "mean_s": 0.125 }, "ov_SC03_014": { "objects": 32, "identical": 32, - "seconds": 7.015, - "mean_s": 0.219 + "seconds": 7.177999999999999, + "mean_s": 0.224 }, "ov_SC03_015": { "objects": 32, "identical": 32, - "seconds": 6.8740000000000006, - "mean_s": 0.215 + "seconds": 6.9430000000000005, + "mean_s": 0.217 }, "ov_SC04_011": { "objects": 28, "identical": 28, - "seconds": 6.5649999999999995, - "mean_s": 0.234 + "seconds": 6.312, + "mean_s": 0.225 } }, "per_object_seconds": { - "build/src/800.o": 1.055, - "build/src/800_b.o": 0.111, - "build/src/800_b_2.o": 0.479, - "build/src/800_b_o0a.o": 0.092, - "build/src/800_c.o": 0.284, - "build/src/800b2.o": 0.189, - "build/src/apicard1.o": 0.152, - "build/src/apicard2.o": 0.106, - "build/src/apicard3.o": 0.139, - "build/src/apicard4.o": 0.094, - "build/src/apicard5.o": 0.207, - "build/src/apicard6.o": 0.178, - "build/src/apicard7.o": 0.137, - "build/src/boot.o": 0.204, - "build/src/gap.o": 0.101, - "build/src/libapi1.o": 0.11, - "build/src/libapi2.o": 0.142, - "build/src/libc2_1.o": 0.116, - "build/src/libc2_2.o": 0.08, - "build/src/libcd1.o": 0.12, - "build/src/libcd2.o": 0.074, - "build/src/libetc.o": 0.126, - "build/src/libgpu.o": 0.089, - "build/src/libgpu2.o": 0.117, - "build/src/libgs1.o": 0.168, - "build/src/libgs2.o": 0.108, - "build/src/libgs3.o": 0.132, - "build/src/libgs4.o": 0.127, - "build/src/libgs5.o": 0.125, - "build/src/libgs6.o": 0.114, - "build/src/libgs7.o": 0.126, - "build/src/libgs8.o": 0.082, - "build/src/libgte1.o": 0.097, - "build/src/libgte10.o": 0.08, - "build/src/libgte11.o": 0.092, - "build/src/libgte12.o": 0.102, - "build/src/libgte13.o": 0.132, - "build/src/libgte14.o": 0.115, - "build/src/libgte15.o": 0.116, - "build/src/libgte16.o": 0.077, - "build/src/libgte17.o": 0.148, - "build/src/libgte18.o": 0.122, - "build/src/libgte19.o": 0.105, - "build/src/libgte2.o": 0.077, - "build/src/libgte20.o": 0.087, - "build/src/libgte21.o": 0.101, + "build/src/800.o": 1.183, + "build/src/800_b.o": 0.169, + "build/src/800_b_2.o": 0.616, + "build/src/800_b_o0a.o": 0.128, + "build/src/800_c.o": 0.32, + "build/src/800b2.o": 0.188, + "build/src/apicard1.o": 0.084, + "build/src/apicard2.o": 0.104, + "build/src/apicard3.o": 0.093, + "build/src/apicard4.o": 0.129, + "build/src/apicard5.o": 0.097, + "build/src/apicard6.o": 0.117, + "build/src/apicard7.o": 0.109, + "build/src/boot.o": 0.146, + "build/src/gap.o": 0.081, + "build/src/libapi1.o": 0.083, + "build/src/libapi2.o": 0.086, + "build/src/libc2_1.o": 0.094, + "build/src/libc2_2.o": 0.075, + "build/src/libcd1.o": 0.111, + "build/src/libcd2.o": 0.079, + "build/src/libetc.o": 0.094, + "build/src/libgpu.o": 0.143, + "build/src/libgpu2.o": 0.101, + "build/src/libgs1.o": 0.077, + "build/src/libgs2.o": 0.146, + "build/src/libgs3.o": 0.07, + "build/src/libgs4.o": 0.106, + "build/src/libgs5.o": 0.083, + "build/src/libgs6.o": 0.1, + "build/src/libgs7.o": 0.094, + "build/src/libgs8.o": 0.114, + "build/src/libgte1.o": 0.084, + "build/src/libgte10.o": 0.077, + "build/src/libgte11.o": 0.113, + "build/src/libgte12.o": 0.092, + "build/src/libgte13.o": 0.118, + "build/src/libgte14.o": 0.099, + "build/src/libgte15.o": 0.082, + "build/src/libgte16.o": 0.091, + "build/src/libgte17.o": 0.087, + "build/src/libgte18.o": 0.121, + "build/src/libgte19.o": 0.168, + "build/src/libgte2.o": 0.092, + "build/src/libgte20.o": 0.118, + "build/src/libgte21.o": 0.12, "build/src/libgte22.o": 0.096, - "build/src/libgte23.o": 0.094, - "build/src/libgte24.o": 0.16, - "build/src/libgte25.o": 0.08, - "build/src/libgte26.o": 0.126, - "build/src/libgte27.o": 0.109, - "build/src/libgte28.o": 0.088, - "build/src/libgte29.o": 0.144, - "build/src/libgte3.o": 0.13, - "build/src/libgte30.o": 0.141, - "build/src/libgte4.o": 0.106, - "build/src/libgte5.o": 0.079, - "build/src/libgte6.o": 0.09, - "build/src/libgte7.o": 0.094, - "build/src/libgte8.o": 0.1, - "build/src/libgte9.o": 0.103, - "build/src/libmcrd1.o": 0.171, - "build/src/libmcrd2.o": 0.098, - "build/src/libpad1.o": 0.1, - "build/src/libpad2.o": 0.09, - "build/src/sgap.o": 0.094, - "build/src/sgap_2.o": 0.141, - "build/src/sgap_3.o": 0.075, - "build/src/sgap_4.o": 0.112, - "build/src/sgap_5.o": 0.14, - "build/src/sgap_6.o": 0.087, - "build/src/sgap_8.o": 0.131, - "build/src/snd1.o": 0.139, - "build/src/snd10.o": 0.076, - "build/src/snd11.o": 0.176, - "build/src/snd12.o": 0.08, - "build/src/snd2.o": 0.086, - "build/src/snd3.o": 0.11, - "build/src/snd4.o": 0.153, - "build/src/snd5.o": 0.125, - "build/src/snd6.o": 0.112, - "build/src/snd7.o": 0.109, - "build/src/snd8.o": 0.101, - "build/src/snd9.o": 0.089, - "build/src/ov_SC03_014/ov_SC03_014.o": 0.219, - "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.785, - "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.616, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.116, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.121, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.17, - "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.195, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.173, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.129, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.111, - "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.226, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.109, - "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.24, - "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.194, - "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.105, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.1, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.151, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.638, - "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.345, - "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.134, - "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.305, - "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.094, - "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.168, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.117, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.288, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.309, - "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.077, - "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.402, - "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.079, - "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.137, - "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.075, - "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.087, - "build/src/ov_SC03_015/ov_SC03_015.o": 0.229, - "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.651, - "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.654, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.133, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.099, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.159, - "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.206, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.137, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.108, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.094, - "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.284, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.141, - "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.227, - "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.164, - "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.114, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.093, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.127, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.606, - "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.402, - "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.149, - "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.301, - "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.089, - "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.137, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.088, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.227, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.296, - "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.108, - "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.389, - "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.075, - "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.095, - "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.112, - "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.18, - "build/src/ov_SC04_011/ov_SC04_011.o": 0.208, - "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.693, - "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.561, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.125, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.132, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.19, - "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.211, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.163, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.091, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.116, - "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.281, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.11, - "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.256, - "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.158, - "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.089, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.1, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.146, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.668, - "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.394, - "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.152, - "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.297, - "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.093, - "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.138, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.094, + "build/src/libgte23.o": 0.124, + "build/src/libgte24.o": 0.07, + "build/src/libgte25.o": 0.081, + "build/src/libgte26.o": 0.095, + "build/src/libgte27.o": 0.122, + "build/src/libgte28.o": 0.09, + "build/src/libgte29.o": 0.097, + "build/src/libgte3.o": 0.086, + "build/src/libgte30.o": 0.08, + "build/src/libgte4.o": 0.089, + "build/src/libgte5.o": 0.105, + "build/src/libgte6.o": 0.123, + "build/src/libgte7.o": 0.092, + "build/src/libgte8.o": 0.15, + "build/src/libgte9.o": 0.088, + "build/src/libmcrd1.o": 0.098, + "build/src/libmcrd2.o": 0.118, + "build/src/libpad1.o": 0.077, + "build/src/libpad2.o": 0.093, + "build/src/sgap.o": 0.137, + "build/src/sgap_2.o": 0.095, + "build/src/sgap_3.o": 0.094, + "build/src/sgap_4.o": 0.122, + "build/src/sgap_5.o": 0.13, + "build/src/sgap_6.o": 0.088, + "build/src/sgap_8.o": 0.111, + "build/src/snd1.o": 0.107, + "build/src/snd10.o": 0.109, + "build/src/snd11.o": 0.124, + "build/src/snd12.o": 0.11, + "build/src/snd2.o": 0.083, + "build/src/snd3.o": 0.088, + "build/src/snd4.o": 0.081, + "build/src/snd5.o": 0.114, + "build/src/snd6.o": 0.126, + "build/src/snd7.o": 0.084, + "build/src/snd8.o": 0.081, + "build/src/snd9.o": 0.095, + "build/src/ov_SC03_014/ov_SC03_014.o": 0.289, + "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.665, + "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.571, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.158, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.088, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.174, + "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.221, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.162, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.166, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.101, + "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.304, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.106, + "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.228, + "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.161, + "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.098, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.097, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.131, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.665, + "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.423, + "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.144, + "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.322, + "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.1, + "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.156, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.13, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.257, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.313, + "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.114, + "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.424, + "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.088, + "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.104, + "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.09, + "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.128, + "build/src/ov_SC03_015/ov_SC03_015.o": 0.241, + "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.637, + "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.582, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.094, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.083, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.178, + "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.196, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.143, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.157, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.087, + "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.283, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.143, + "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.212, + "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.122, + "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.111, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.103, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.161, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.712, + "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.408, + "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.18, + "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.288, + "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.085, + "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.128, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.098, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.245, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.344, + "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.07, + "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.393, + "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.14, + "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.1, + "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.107, + "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.112, + "build/src/ov_SC04_011/ov_SC04_011.o": 0.205, + "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.631, + "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.497, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.073, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.077, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.211, + "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.243, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.141, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.106, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.144, + "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.233, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.15, + "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.245, + "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.115, + "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.117, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.116, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.137, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.587, + "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.363, + "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.14, + "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.273, + "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.109, + "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.173, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.115, "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.147, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.779, - "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.075, - "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.098 + "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.743, + "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.111, + "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.11 }, "ok": true, - "seconds": 4.1 + "seconds": 3.8 } diff --git a/.run/P36/delever/ledger.jsonl b/.run/P36/delever/ledger.jsonl index b2c2ebdbc3..b29621565a 100644 --- a/.run/P36/delever/ledger.jsonl +++ b/.run/P36/delever/ledger.jsonl @@ -29051,3 +29051,7 @@ {"ts": "2026-09-10 21:08:21", "label": "s104_d1", "rung": "E", "calib": {"head": "55ef71b95", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_024/ov_SC06_024_jr_80181D34.c", "fn": "func_80183408", "addr": 2149069832, "aliases": null, "header": false, "includers": 0, "nhash_before": "6f9b635381cfed4e65260e98d4a16f64f97515c2", "nhash_after": "c935c2c51102d9037d3fbb3a711bf772b71f2efc", "source": "propagate:src/ov_SC04_011/ov_SC04_011_jr_8017D494.c:func_80185960", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.14, "objects": ["build/src/ov_SC06_024/ov_SC06_024_jr_80181D34.o"], "before_text": "void func_80183408(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n mag = diff;\n if ((s16)diff < 0) {\n mag = -diff;\n }\n __asm__ __volatile__(\"\" : \"=r\"(diff) : \"0\"(diff) : \"memory\"); // !FAKE: launder \u2014 NEEDED DIFFERS (P36 rung B tus9)\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n", "after_text": "void func_80183408(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n if ((s16)diff >= 0) {\n mag = diff;\n } else {\n mag = -diff;\n }\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n"} {"ts": "2026-09-10 21:08:21", "label": "s104_d1", "rung": "E", "calib": {"head": "55ef71b95", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC02_005/ov_SC02_005_jr_80185060.c", "fn": "func_80185DD0", "addr": 2149080528, "aliases": null, "header": false, "includers": 0, "nhash_before": "6f9b635381cfed4e65260e98d4a16f64f97515c2", "nhash_after": "c935c2c51102d9037d3fbb3a711bf772b71f2efc", "source": "propagate:src/ov_SC04_011/ov_SC04_011_jr_8017D494.c:func_80185960", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.072, "objects": ["build/src/ov_SC02_005/ov_SC02_005_jr_80185060.o"], "before_text": "void func_80185DD0(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n mag = diff;\n if ((s16)diff < 0) {\n mag = -diff;\n }\n __asm__ __volatile__(\"\" : \"=r\"(diff) : \"0\"(diff) : \"memory\"); // !FAKE: launder \u2014 NEEDED DIFFERS (P36 rung B tus9)\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n", "after_text": "void func_80185DD0(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n if ((s16)diff >= 0) {\n mag = diff;\n } else {\n mag = -diff;\n }\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n"} {"ts": "2026-09-10 21:08:23", "label": "s104_d1", "rung": "E", "calib": {"head": "55ef71b95", "stamp": "15956e4a96c4"}, "tu": "src/md_SC07_004/md_SC07_004.c", "fn": "func_801A3624", "addr": 2149201444, "aliases": null, "header": false, "includers": 0, "nhash_before": "6f9b635381cfed4e65260e98d4a16f64f97515c2", "nhash_after": "c935c2c51102d9037d3fbb3a711bf772b71f2efc", "source": "propagate:src/ov_SC04_011/ov_SC04_011_jr_8017D494.c:func_80185960", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.557, "objects": ["build/src/md_SC07_004/md_SC07_004.o"], "before_text": "void func_801A3624(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n mag = diff;\n if ((s16)diff < 0) {\n mag = -diff;\n }\n __asm__ __volatile__(\"\" : \"=r\"(diff) : \"0\"(diff) : \"memory\"); // !FAKE: launder \u2014 NEEDED DIFFERS (P36 rung B tus9)\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n", "after_text": "void func_801A3624(s32 target, u16 *cur, s32 step)\n{\n s32 t;\n s32 diff;\n s32 mag;\n\n t = (target - *cur) & 0xFFF;\n if (t < 0x800) {\n diff = t;\n } else {\n diff = t | 0xF000;\n }\n if ((s16)diff >= 0) {\n mag = diff;\n } else {\n mag = -diff;\n }\n if ((s16)mag > (u16)step) {\n if ((s16)diff < 0) {\n *cur = *cur - step;\n } else {\n *cur = *cur + step;\n }\n } else {\n *cur = target;\n }\n}\n"} +{"ts": "2026-09-10 21:11:29", "label": "s104_d3", "rung": "E", "calib": {"head": "547571fd1", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c", "fn": "func_8017FB4C", "addr": 2149055308, "aliases": null, "header": false, "includers": 0, "nhash_before": "0ca9f9d76b6711cb03e1602d2b539a6316fec523", "nhash_after": "eb6dd7bc00bbee44c90267704ec1a8ba9707336e", "source": ".run/P36/agents/ov_SC06_014__func_8017FB4C/body.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.119, "objects": ["build/src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.o"], "before_text": "void func_8017FB4C(void *a0)\n{\n void *s3 = a0;\n void *s2;\n void *p;\n s32 v1;\n register s32 v0 __asm__(\"$2\"); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n s32 bits;\n s32 s0;\n s32 s1;\n\n s2 = *(void **)((s32)s3 + 0x20);\n func_8017FD74(s3);\n p = (*(void * *)&D_801A14A8);\n if (p == 0) {\n goto END;\n }\n v0 = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n bits = *(u16 *)((s32)p + 0x12) & 0x400;\n s0 = v0 & 0xFFF;\n if (bits == 0) {\n goto ELSE;\n }\n s1 = func_80012A60(s0, 0x400);\n v0 = func_80012A60(s0, 0xC00);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE1;\n }\n v0 = 0x400;\n goto STORE;\nTRUE1:\n v0 = 0xC00;\n goto STORE;\nELSE:\n s1 = func_80012A60(s0, 0);\n v0 = func_80012A60(s0, 0x800);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE2;\n }\n *(u16 *)((s32)s2 + 0x12) = 0;\n goto END;\nTRUE2:\n v0 = 0x800;\nSTORE:\n *(u16 *)((s32)s2 + 0x12) = v0;\nEND:\n func_80171990((u8 *)s3);\n}\n", "after_text": "void func_8017FB4C(void *a0)\n{\n void *s2 = *(void **)((s32)a0 + 0x20);\n void *p;\n s32 rot;\n s32 flag;\n s32 angle;\n s32 a;\n s32 b;\n\n func_8017FD74(a0);\n p = (void *)D_801A14A8;\n if (p != 0) {\n rot = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n flag = *(u16 *)((s32)p + 0x12) & 0x400;\n angle = rot & 0xFFF;\n if (flag) {\n a = func_80012A60(angle, 0x400);\n b = func_80012A60(angle, 0xC00);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0x400;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0xC00;\n }\n } else {\n a = func_80012A60(angle, 0);\n b = func_80012A60(angle, 0x800);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0x800;\n }\n }\n }\n func_80171990((u8 *)a0);\n}\n"} +{"ts": "2026-09-10 21:11:44", "label": "s104_d3", "rung": "E", "calib": {"head": "547571fd1", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.c", "fn": "func_8017F3C8", "addr": 2149053384, "aliases": null, "header": false, "includers": 0, "nhash_before": "0ca9f9d76b6711cb03e1602d2b539a6316fec523", "nhash_after": "eb6dd7bc00bbee44c90267704ec1a8ba9707336e", "source": "propagate:src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c:func_8017FB4C", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.066, "objects": ["build/src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.o"], "before_text": "void func_8017F3C8(void *a0)\n{\n void *s3 = a0;\n void *s2;\n void *p;\n s32 v1;\n register s32 v0 __asm__(\"$2\"); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n s32 bits;\n s32 s0;\n s32 s1;\n\n s2 = *(void **)((s32)s3 + 0x20);\n func_8017F5F0(s3);\n p = (*(void * *)&D_801ABBD8);\n if (p == 0) {\n goto END;\n }\n v0 = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n bits = *(u16 *)((s32)p + 0x12) & 0x400;\n s0 = v0 & 0xFFF;\n if (bits == 0) {\n goto ELSE;\n }\n s1 = func_80012A60(s0, 0x400);\n v0 = func_80012A60(s0, 0xC00);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE1;\n }\n v0 = 0x400;\n goto STORE;\nTRUE1:\n v0 = 0xC00;\n goto STORE;\nELSE:\n s1 = func_80012A60(s0, 0);\n v0 = func_80012A60(s0, 0x800);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE2;\n }\n *(u16 *)((s32)s2 + 0x12) = 0;\n goto END;\nTRUE2:\n v0 = 0x800;\nSTORE:\n *(u16 *)((s32)s2 + 0x12) = v0;\nEND:\n func_80171990((u8 *)s3);\n}\n", "after_text": "void func_8017F3C8(void *a0)\n{\n void *s2 = *(void **)((s32)a0 + 0x20);\n void *p;\n s32 rot;\n s32 flag;\n s32 angle;\n s32 a;\n s32 b;\n\n func_8017F5F0(a0);\n p = (void *)D_801ABBD8;\n if (p != 0) {\n rot = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n flag = *(u16 *)((s32)p + 0x12) & 0x400;\n angle = rot & 0xFFF;\n if (flag) {\n a = func_80012A60(angle, 0x400);\n b = func_80012A60(angle, 0xC00);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0x400;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0xC00;\n }\n } else {\n a = func_80012A60(angle, 0);\n b = func_80012A60(angle, 0x800);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0x800;\n }\n }\n }\n func_80171990((u8 *)a0);\n}\n"} +{"ts": "2026-09-10 21:11:45", "label": "s104_d3", "rung": "E", "calib": {"head": "547571fd1", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.c", "fn": "func_8017E7E8", "addr": 2149050344, "aliases": null, "header": false, "includers": 0, "nhash_before": "0ca9f9d76b6711cb03e1602d2b539a6316fec523", "nhash_after": "eb6dd7bc00bbee44c90267704ec1a8ba9707336e", "source": "propagate:src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c:func_8017FB4C", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.152, "objects": ["build/src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.o"], "before_text": "void func_8017E7E8(void *a0)\n{\n void *s3 = a0;\n void *s2;\n void *p;\n s32 v1;\n register s32 v0 __asm__(\"$2\"); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n s32 bits;\n s32 s0;\n s32 s1;\n\n s2 = *(void **)((s32)s3 + 0x20);\n func_8017EA10(s3);\n p = (*(void * *)&D_8019AA90);\n if (p == 0) {\n goto END;\n }\n v0 = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n bits = *(u16 *)((s32)p + 0x12) & 0x400;\n s0 = v0 & 0xFFF;\n if (bits == 0) {\n goto ELSE;\n }\n s1 = func_80012A60(s0, 0x400);\n v0 = func_80012A60(s0, 0xC00);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE1;\n }\n v0 = 0x400;\n goto STORE;\nTRUE1:\n v0 = 0xC00;\n goto STORE;\nELSE:\n s1 = func_80012A60(s0, 0);\n v0 = func_80012A60(s0, 0x800);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE2;\n }\n *(u16 *)((s32)s2 + 0x12) = 0;\n goto END;\nTRUE2:\n v0 = 0x800;\nSTORE:\n *(u16 *)((s32)s2 + 0x12) = v0;\nEND:\n func_80171990((u8 *)s3);\n}\n", "after_text": "void func_8017E7E8(void *a0)\n{\n void *s2 = *(void **)((s32)a0 + 0x20);\n void *p;\n s32 rot;\n s32 flag;\n s32 angle;\n s32 a;\n s32 b;\n\n func_8017EA10(a0);\n p = (void *)D_8019AA90;\n if (p != 0) {\n rot = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n flag = *(u16 *)((s32)p + 0x12) & 0x400;\n angle = rot & 0xFFF;\n if (flag) {\n a = func_80012A60(angle, 0x400);\n b = func_80012A60(angle, 0xC00);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0x400;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0xC00;\n }\n } else {\n a = func_80012A60(angle, 0);\n b = func_80012A60(angle, 0x800);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0x800;\n }\n }\n }\n func_80171990((u8 *)a0);\n}\n"} +{"ts": "2026-09-10 21:11:45", "label": "s104_d3", "rung": "E", "calib": {"head": "547571fd1", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.c", "fn": "func_8017E6A4", "addr": 2149050020, "aliases": null, "header": false, "includers": 0, "nhash_before": "0ca9f9d76b6711cb03e1602d2b539a6316fec523", "nhash_after": "eb6dd7bc00bbee44c90267704ec1a8ba9707336e", "source": "propagate:src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c:func_8017FB4C", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.121, "objects": ["build/src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.o"], "before_text": "void func_8017E6A4(void *a0)\n{\n void *s3 = a0;\n void *s2;\n void *p;\n s32 v1;\n register s32 v0 __asm__(\"$2\"); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n s32 bits;\n s32 s0;\n s32 s1;\n\n s2 = *(void **)((s32)s3 + 0x20);\n func_8017E8CC(s3);\n p = (*(void * *)&D_80194888);\n if (p == 0) {\n goto END;\n }\n v0 = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n bits = *(u16 *)((s32)p + 0x12) & 0x400;\n s0 = v0 & 0xFFF;\n if (bits == 0) {\n goto ELSE;\n }\n s1 = func_80012A60(s0, 0x400);\n v0 = func_80012A60(s0, 0xC00);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE1;\n }\n v0 = 0x400;\n goto STORE;\nTRUE1:\n v0 = 0xC00;\n goto STORE;\nELSE:\n s1 = func_80012A60(s0, 0);\n v0 = func_80012A60(s0, 0x800);\n v1 = (s16)s1;\n v0 = (s16)v0;\n v0 = (v0 < v1);\n if (v0 != 0) {\n goto TRUE2;\n }\n *(u16 *)((s32)s2 + 0x12) = 0;\n goto END;\nTRUE2:\n v0 = 0x800;\nSTORE:\n *(u16 *)((s32)s2 + 0x12) = v0;\nEND:\n func_80171990((u8 *)s3);\n}\n", "after_text": "void func_8017E6A4(void *a0)\n{\n void *s2 = *(void **)((s32)a0 + 0x20);\n void *p;\n s32 rot;\n s32 flag;\n s32 angle;\n s32 a;\n s32 b;\n\n func_8017E8CC(a0);\n p = (void *)D_80194888;\n if (p != 0) {\n rot = *(u16 *)((s32)s2 + 0x12) + 0x800;\n p = *(void **)((s32)p + 0x20);\n flag = *(u16 *)((s32)p + 0x12) & 0x400;\n angle = rot & 0xFFF;\n if (flag) {\n a = func_80012A60(angle, 0x400);\n b = func_80012A60(angle, 0xC00);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0x400;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0xC00;\n }\n } else {\n a = func_80012A60(angle, 0);\n b = func_80012A60(angle, 0x800);\n if ((s16)a <= (s16)b) {\n *(u16 *)((s32)s2 + 0x12) = 0;\n } else {\n *(u16 *)((s32)s2 + 0x12) = 0x800;\n }\n }\n }\n func_80171990((u8 *)a0);\n}\n"} diff --git a/src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.c b/src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.c index b985379b87..3ce2701d4c 100644 --- a/src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.c +++ b/src/ov_SC06_011/ov_SC06_011_jr_8017EEEC.c @@ -228,58 +228,40 @@ extern s32 D_801ABBD8; void func_8017F3C8(void *a0) { - void *s3 = a0; - void *s2; + void *s2 = *(void **)((s32)a0 + 0x20); void *p; - s32 v1; - register s32 v0 __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9) - s32 bits; - s32 s0; - s32 s1; + s32 rot; + s32 flag; + s32 angle; + s32 a; + s32 b; - s2 = *(void **)((s32)s3 + 0x20); - func_8017F5F0(s3); - p = (*(void * *)&D_801ABBD8); - if (p == 0) { - goto END; + func_8017F5F0(a0); + p = (void *)D_801ABBD8; + if (p != 0) { + rot = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + flag = *(u16 *)((s32)p + 0x12) & 0x400; + angle = rot & 0xFFF; + if (flag) { + a = func_80012A60(angle, 0x400); + b = func_80012A60(angle, 0xC00); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0x400; + } else { + *(u16 *)((s32)s2 + 0x12) = 0xC00; + } + } else { + a = func_80012A60(angle, 0); + b = func_80012A60(angle, 0x800); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0; + } else { + *(u16 *)((s32)s2 + 0x12) = 0x800; + } + } } - v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; - p = *(void **)((s32)p + 0x20); - bits = *(u16 *)((s32)p + 0x12) & 0x400; - s0 = v0 & 0xFFF; - if (bits == 0) { - goto ELSE; - } - s1 = func_80012A60(s0, 0x400); - v0 = func_80012A60(s0, 0xC00); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE1; - } - v0 = 0x400; - goto STORE; -TRUE1: - v0 = 0xC00; - goto STORE; -ELSE: - s1 = func_80012A60(s0, 0); - v0 = func_80012A60(s0, 0x800); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE2; - } - *(u16 *)((s32)s2 + 0x12) = 0; - goto END; -TRUE2: - v0 = 0x800; -STORE: - *(u16 *)((s32)s2 + 0x12) = v0; -END: - func_80171990((u8 *)s3); + func_80171990((u8 *)a0); } diff --git a/src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.c b/src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.c index 31acc755f3..c034fd9d96 100644 --- a/src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.c +++ b/src/ov_SC06_013/ov_SC06_013_jr_8017BEBC.c @@ -3844,58 +3844,40 @@ extern s32 D_8019AA90; void func_8017E7E8(void *a0) { - void *s3 = a0; - void *s2; + void *s2 = *(void **)((s32)a0 + 0x20); void *p; - s32 v1; - register s32 v0 __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9) - s32 bits; - s32 s0; - s32 s1; + s32 rot; + s32 flag; + s32 angle; + s32 a; + s32 b; - s2 = *(void **)((s32)s3 + 0x20); - func_8017EA10(s3); - p = (*(void * *)&D_8019AA90); - if (p == 0) { - goto END; + func_8017EA10(a0); + p = (void *)D_8019AA90; + if (p != 0) { + rot = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + flag = *(u16 *)((s32)p + 0x12) & 0x400; + angle = rot & 0xFFF; + if (flag) { + a = func_80012A60(angle, 0x400); + b = func_80012A60(angle, 0xC00); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0x400; + } else { + *(u16 *)((s32)s2 + 0x12) = 0xC00; + } + } else { + a = func_80012A60(angle, 0); + b = func_80012A60(angle, 0x800); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0; + } else { + *(u16 *)((s32)s2 + 0x12) = 0x800; + } + } } - v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; - p = *(void **)((s32)p + 0x20); - bits = *(u16 *)((s32)p + 0x12) & 0x400; - s0 = v0 & 0xFFF; - if (bits == 0) { - goto ELSE; - } - s1 = func_80012A60(s0, 0x400); - v0 = func_80012A60(s0, 0xC00); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE1; - } - v0 = 0x400; - goto STORE; -TRUE1: - v0 = 0xC00; - goto STORE; -ELSE: - s1 = func_80012A60(s0, 0); - v0 = func_80012A60(s0, 0x800); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE2; - } - *(u16 *)((s32)s2 + 0x12) = 0; - goto END; -TRUE2: - v0 = 0x800; -STORE: - *(u16 *)((s32)s2 + 0x12) = v0; -END: - func_80171990((u8 *)s3); + func_80171990((u8 *)a0); } diff --git a/src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c b/src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c index f7644cece6..141275833f 100644 --- a/src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c +++ b/src/ov_SC06_014/ov_SC06_014_jr_8017BEBC.c @@ -4542,58 +4542,40 @@ extern s32 D_801A14A8; void func_8017FB4C(void *a0) { - void *s3 = a0; - void *s2; + void *s2 = *(void **)((s32)a0 + 0x20); void *p; - s32 v1; - register s32 v0 __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9) - s32 bits; - s32 s0; - s32 s1; + s32 rot; + s32 flag; + s32 angle; + s32 a; + s32 b; - s2 = *(void **)((s32)s3 + 0x20); - func_8017FD74(s3); - p = (*(void * *)&D_801A14A8); - if (p == 0) { - goto END; + func_8017FD74(a0); + p = (void *)D_801A14A8; + if (p != 0) { + rot = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + flag = *(u16 *)((s32)p + 0x12) & 0x400; + angle = rot & 0xFFF; + if (flag) { + a = func_80012A60(angle, 0x400); + b = func_80012A60(angle, 0xC00); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0x400; + } else { + *(u16 *)((s32)s2 + 0x12) = 0xC00; + } + } else { + a = func_80012A60(angle, 0); + b = func_80012A60(angle, 0x800); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0; + } else { + *(u16 *)((s32)s2 + 0x12) = 0x800; + } + } } - v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; - p = *(void **)((s32)p + 0x20); - bits = *(u16 *)((s32)p + 0x12) & 0x400; - s0 = v0 & 0xFFF; - if (bits == 0) { - goto ELSE; - } - s1 = func_80012A60(s0, 0x400); - v0 = func_80012A60(s0, 0xC00); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE1; - } - v0 = 0x400; - goto STORE; -TRUE1: - v0 = 0xC00; - goto STORE; -ELSE: - s1 = func_80012A60(s0, 0); - v0 = func_80012A60(s0, 0x800); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE2; - } - *(u16 *)((s32)s2 + 0x12) = 0; - goto END; -TRUE2: - v0 = 0x800; -STORE: - *(u16 *)((s32)s2 + 0x12) = v0; -END: - func_80171990((u8 *)s3); + func_80171990((u8 *)a0); } diff --git a/src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.c b/src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.c index 9178116896..54f0989a50 100644 --- a/src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.c +++ b/src/ov_SC06_015/ov_SC06_015_jr_8017BEBC.c @@ -3723,58 +3723,40 @@ extern s32 D_80194888; void func_8017E6A4(void *a0) { - void *s3 = a0; - void *s2; + void *s2 = *(void **)((s32)a0 + 0x20); void *p; - s32 v1; - register s32 v0 __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9) - s32 bits; - s32 s0; - s32 s1; + s32 rot; + s32 flag; + s32 angle; + s32 a; + s32 b; - s2 = *(void **)((s32)s3 + 0x20); - func_8017E8CC(s3); - p = (*(void * *)&D_80194888); - if (p == 0) { - goto END; + func_8017E8CC(a0); + p = (void *)D_80194888; + if (p != 0) { + rot = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + flag = *(u16 *)((s32)p + 0x12) & 0x400; + angle = rot & 0xFFF; + if (flag) { + a = func_80012A60(angle, 0x400); + b = func_80012A60(angle, 0xC00); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0x400; + } else { + *(u16 *)((s32)s2 + 0x12) = 0xC00; + } + } else { + a = func_80012A60(angle, 0); + b = func_80012A60(angle, 0x800); + if ((s16)a <= (s16)b) { + *(u16 *)((s32)s2 + 0x12) = 0; + } else { + *(u16 *)((s32)s2 + 0x12) = 0x800; + } + } } - v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; - p = *(void **)((s32)p + 0x20); - bits = *(u16 *)((s32)p + 0x12) & 0x400; - s0 = v0 & 0xFFF; - if (bits == 0) { - goto ELSE; - } - s1 = func_80012A60(s0, 0x400); - v0 = func_80012A60(s0, 0xC00); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE1; - } - v0 = 0x400; - goto STORE; -TRUE1: - v0 = 0xC00; - goto STORE; -ELSE: - s1 = func_80012A60(s0, 0); - v0 = func_80012A60(s0, 0x800); - v1 = (s16)s1; - v0 = (s16)v0; - v0 = (v0 < v1); - if (v0 != 0) { - goto TRUE2; - } - *(u16 *)((s32)s2 + 0x12) = 0; - goto END; -TRUE2: - v0 = 0x800; -STORE: - *(u16 *)((s32)s2 + 0x12) = v0; -END: - func_80171990((u8 *)s3); + func_80171990((u8 *)a0); }