From cc3cbcf55ef17ad92ce6ed2d4466e4ffeecbb741 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Fri, 11 Sep 2026 05:43:05 -0600 Subject: [PATCH] =?UTF-8?q?phase-36:=20S104=20s104=5Fe36=20=E2=80=94=20fun?= =?UTF-8?q?c=5F8018632C=20banked=20at=200=20through=20the=20whole-object?= =?UTF-8?q?=20gate=20+=20propagated=20=E2=80=94=20=E2=86=92=200:=20d39's?= =?UTF-8?q?=20(s16)=20casts=20at=20both=20shifts,=20ported=20(the=20TU's?= =?UTF-8?q?=20aF8018632C=20alias)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agents/ov_SC03_091__func_80185730/body.c | 31 ++ .../ov_SC03_091__func_80185730/mechanism.md | 74 ++++ .../agents/ov_SC03_091__func_8018632C/body.c | 35 ++ .../ov_SC03_091__func_8018632C/mechanism.md | 37 ++ .run/P36/delever/calibration.json | 354 +++++++++--------- .run/P36/delever/ledger.jsonl | 1 + src/ov_SC03_091/ov_SC03_091_jr_8018326C.c | 25 +- 7 files changed, 364 insertions(+), 193 deletions(-) create mode 100644 .run/P36/agents/ov_SC03_091__func_80185730/body.c create mode 100644 .run/P36/agents/ov_SC03_091__func_80185730/mechanism.md create mode 100644 .run/P36/agents/ov_SC03_091__func_8018632C/body.c create mode 100644 .run/P36/agents/ov_SC03_091__func_8018632C/mechanism.md diff --git a/.run/P36/agents/ov_SC03_091__func_80185730/body.c b/.run/P36/agents/ov_SC03_091__func_80185730/body.c new file mode 100644 index 000000000..00b06e4a6 --- /dev/null +++ b/.run/P36/agents/ov_SC03_091__func_80185730/body.c @@ -0,0 +1,31 @@ +s32 *aF80185730(s32 *a0, s32 a1, s32 a2) __asm__("func_80185730"); + +s32 *aF80185730(s32 *a0, s32 a1, s32 a2) { + s32 sp10[4]; + s32 sp20; + s16 *q; + u16 *p; + s16 t; + + q = &D_80126CBA; + if (*q == 0) { + if (func_801858AC(a1)) { + p = (u16 *)(a1 + 0x88); + *(s32 *)(a1 + 0xDC) = 1; + } else { + p = (u16 *)(q - 3); + *(s32 *)(a1 + 0xDC) = 0; + } + } else { + p = (u16 *)(a1 + 0x88); + *(s32 *)(a1 + 0xDC) = 1; + } + *(s16 *)((s32)sp10 + 0x2) = p[0] + *(u16 *)a2; + t = p[1] + *(u16 *)(a2 + 2); + *(s16 *)((s32)sp10 + 0x6) = t; + *(s16 *)(a1 + 0x100) = t; + *(s16 *)((s32)sp10 + 0xA) = p[2] + *(u16 *)(a2 + 4); + func_8012B77C((s32)&sp20, a1 + 4, (s32)sp10); + *a0 = sp20; + return a0; +} diff --git a/.run/P36/agents/ov_SC03_091__func_80185730/mechanism.md b/.run/P36/agents/ov_SC03_091__func_80185730/mechanism.md new file mode 100644 index 000000000..162ea2f95 --- /dev/null +++ b/.run/P36/agents/ov_SC03_091__func_80185730/mechanism.md @@ -0,0 +1,74 @@ +# func_80185730 (ov_SC03_091_jr_8018326C.c) — P36 S104 agent e36 + +**Result: score 0, ZERO levers, plain C — but it needs a SIGNATURE change (return type), so: PARKED per S104 (d29).** +Levers 2 → 0 (the `$2` pin and the end-of-function keepalive, both NEEDED). 52/52 ins. The WHOLE object is identical to the +baseline snapshot (`objdump -s -r` md5 `12d084b9…` both for `scratch/s1.o` and `scratch/s2.o`; `nm` identical). + +The function RETURNS its first argument (the out-buffer pointer) in `$v0`. The tree declared it `void`, so a `$2`-pinned +`dst = a0` plus a keepalive faked `return a0;`. Two byte-proven spellings, both 0, both done with the TU's existing +DEF-SIDE ALIAS idiom (§37/§124, the same one `aF8018632C` uses 500 lines below) so that the three file-scope/body-local +`extern void func_80185730();` K&R prototypes (TU:3699, :3769, :3838) and their callers stay untouched: + +- `PACK/body.c` (= `scratch/s2.c`): `s32 *aF80185730(s32 *a0, s32 a1, s32 a2) __asm__("func_80185730");` — the body is + `body_free.c` with `dst` deleted and the tail `*a0 = sp20; return a0;`. Parameter list unchanged. +- `scratch/s1.c`: a small struct returned BY VALUE — `struct R4 { s32 w; }; struct R4 aF80185730(s32 a1, s32 a2)`, + `struct R4 sp20;` and `return sp20;`. With gcc's pcc struct return the caller passes the result address in `$a0` and the + callee returns it in `$v0` (`function.c` expand_function_end), which is byte-for-byte the same function. This reading + explains WHY the callers pass a buffer first and never read `$v0`; which one the original was cannot be told from this + function's bytes (the callers are the same either way). + +## (a) The residual +Same 52 ins; the tail. Mine `lw v0,32(sp); nop; sw v0,0(s3)`, target `lw v1,32(sp); move v0,s3; sw v1,0(v0)`: the target +copies `a0` into `$v0` and stores THROUGH `$v0`. In a `void` function nothing is live in `$v0` at the exit, so the copy is dead. + +## (b) The pass and the decision (read in `scratch/dumps_s2/s2.i.{rtl,sched,lreg,greg}`; free body in `scratch/dumps_free/`) +1. `return a0;` expands to `(set (reg/i:SI 2) (reg/v:SI 72))` + `(use (reg 2))` (insns 123/124, `.rtl`) — `$v0` live to the end. +2. sched1 (`.sched`) puts insn 123 ABOVE the store 120: the store waits on the `lw` 118 (load latency), the copy is ready at + once (`rank_for_schedule`, sched.c). Order becomes `lw; $v0 = a0; sw`. +3. local-alloc's `update_equiv_regs` calls `optimize_reg_copy_1` (`local-alloc.c:1003-1007` → `:700-760`) for the copy + `$v0 = r72` whose source does not die there: r72 dies in the very next insn (the store), so its use is replaced by the + DESTINATION — `(set (mem:SI (reg/i:SI 2)) (reg 96))` in `.lreg`. MIPS has no SMALL_REGISTER_CLASSES (`local-alloc.c:710`), + so the hard-reg destination is accepted. That is exactly the target's `move v0,s3; sw v1,0(v0)`. +The pin + keepalive reproduced step 1 by hand. All three steps are read in the dumps; the close is proven on bytes. + +## (c) The moves +1. Return type `void` → `s32 *` (or the struct-by-value return), via a def-side alias `aF80185730 __asm__("func_80185730")`. +2. `dst = (s32)a0; *(s32 *)dst = sp20; asm keepalive` → `*a0 = sp20; return a0;` (delete `dst` and its pin). + +## (d) Generator proposal +When a `void` function ends `register … x __asm__("$2"); x = ; …; __asm__ volatile("" : : "r"(x));`, the +function returns x: emit `return x;` with the return type widened, and — when the TU carries a conflicting `extern void` +prototype for it — spell the definition with the def-side alias (`T aF(…) __asm__("func_");`) so `--body` +scores it without any prototype edit; for a `$2` = first-parameter return also try the struct-by-value spelling (drop +`a0`, return the struct). This is d29's keepalive rule generalised from "last statement is `asm "r"(v0)`" to "a `$2` pin + +a keepalive of it". + +## (e) What did not work / notes +- The sweep's best (R12 `dst` → u16, score 1) was a width accident, not the mechanism. +- The SIBLING family `func_80180200` (ov_SC03_099, 10 members; no `func_801858AC` call, `rv = sp20; *a0 = rv; rv = a0;`) + does NOT close with either spelling: `scratch/sib_a.c` (struct) and `sib_b.c` (`s32 *`) both score 4 — its target stores + through `s0` and copies `move v0,s0` AFTER the store (`lw v0; nop; sw v0,0(s0); … move v0,s0`), the shape a plain return + gives here. Its tree comment (4) records that the unpinned return gives this function's shape. Not pursued (other class). + +## (f) Where the method fell short +Nothing; d29's rule (step 15) pointed straight at it. The pack builder's `body_free.c` stripped the pin and the keepalive +but kept `void`, so every generator family scored the dead-store shape. A pin on `$2` + a keepalive at the end is the +second spelling of "this function returns a value" (d29 met the first: a keepalive of an assigned `v0`). + +## (g) Structs +Here the struct question has a concrete answer: the struct-by-value spelling (`scratch/s1.c`) closes at 0 and would explain +the hidden-pointer calling convention (callers pass a buffer first and ignore `$v0`). It does not change any pass decision +against the `s32 *` spelling (same RTL tail), so it is a naming/type choice for the STRUCTS phase, not a byte lever. The +field records: `a1` is an actor (`+0x4` position record passed to `func_8012B77C`, `+0x88` s16[3] home position, +`+0xDC` s32 flag, `+0x100` s16), `sp10` is a 16-byte record with s16 fields at +2/+6/+0xA (func_8012B77C's "to"), +`D_80126CBA - 6` = `D_80126CB4` is a global s16[3] position. + +## Copies (same class; each `--try` 0 with this text, callee and names swapped) +| function | TU | file (`s32 *` return) | struct-return file | +|---|---|---|---| +| func_80185730 | src/ov_SC03_091/ov_SC03_091_jr_8018326C.c | PACK/body.c | scratch/s1.c | +| func_80184BAC | src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c | scratch/copyp_func_80184BAC.c | scratch/copy_func_80184BAC.c | +| func_80184888 | src/ov_SC03_090/ov_SC03_090_jr_8017CA80.c | scratch/copyp_func_80184888.c | scratch/copy_func_80184888.c | +| func_8018271C | src/ov_SC03_104/ov_SC03_104_jr_80182038.c | scratch/copyp_func_8018271C.c | scratch/copy_func_8018271C.c | +The copies carry body-local `extern`s for their callee, `D_80126CBA` and `func_8012B77C` (compatible with any file-scope ones). +Only this TU's copy was checked whole-object. diff --git a/.run/P36/agents/ov_SC03_091__func_8018632C/body.c b/.run/P36/agents/ov_SC03_091__func_8018632C/body.c new file mode 100644 index 000000000..cb87f02c1 --- /dev/null +++ b/.run/P36/agents/ov_SC03_091__func_8018632C/body.c @@ -0,0 +1,35 @@ +s32 aF8018632C(s32 a0) { + extern void func_8012BE54(s32 a0); + extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); + extern u16 D_80126B62; + extern u8 D_801A61DC[]; + + s32 h; + s32 h2; + s32 ret; + s32 s0; + s32 r; + s32 v; + s32 g; + s32 d; + u16 arr[3]; + + h = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18); + ret = ((s32 (*)(s32))func_8012BE54)(a0); + s0 = (s16)h >> 8; + if (ret > s0 * s0) { + return 0; + } + v = *(s16 *)(a0 + 0xA); + h2 = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1A); + g = *(s16 *)&D_80126B62; + r = (s16)h2 >> 6; + d = v - g; + if (d >= 0 ? r < d : r < g - v) { + return 0; + } + arr[0] = *(u16 *)(a0 + 0x6); + arr[1] = *(u16 *)(a0 + 0xA); + arr[2] = *(u16 *)(a0 + 0xE); + func_8012F568(1, 0x4201, 0, 0x1C, (s32)arr, (s32)D_801A61DC); +} diff --git a/.run/P36/agents/ov_SC03_091__func_8018632C/mechanism.md b/.run/P36/agents/ov_SC03_091__func_8018632C/mechanism.md new file mode 100644 index 000000000..eddafe27f --- /dev/null +++ b/.run/P36/agents/ov_SC03_091__func_8018632C/mechanism.md @@ -0,0 +1,37 @@ +# func_8018632C (ov_SC03_091_jr_8018326C.c; C name `aF8018632C`) — P36 S104 agent e36 + +**Result: score 0 in plain C, zero levers** (2 NEEDED `launder`s → 0; the `$17` pin was already REMOVED). 54/54 ins, MATCH. +Closed on the FIRST `--try` with d39's port (`.run/P36/agents/ov_SC03_090__func_80185484/scratch/copy_func_8018632C.c`), +copied verbatim to `PACK/body.c` (= `scratch/c1.c`). + +## (a) The residual +COUNT +2 (56 vs 54): both s16 field loads came out `lhu; sll 16; sra 16+N` where the target has `lh; sra N` +(`+0x18` → `>> 8`, `+0x1A` → `>> 6`). The two launders were exactly on the two shifted values. + +## (b) The pass and the decision (d39's reading, `ov_SC03_090__func_80185484/mechanism.md` (b)/(c); not re-traced here) +cse1 `fold_rtx`'s associative-shift fold (`cse.c:5577-5667`) folds `h >> 8` into `(ashiftrt (ashift x 16) 24)` built on the +load's own extension temp, so combine never re-forms `lh`. `(s16)h >> N` makes `short_shift` (`c-typeck.c:2418-2450`) re-extend +on h's own pseudo; cse folds that pair instead, combine forms `lh` and `simplify_shift_const` (`combine.c:7930-7944`) collapses +the rest to `sra N`. + +## (c) The moves +1. `s0 = h >> 8;` → `s0 = (s16)h >> 8;` +2. `r = h2 >> 6;` → `r = (s16)h2 >> 6;` (both needed — d39: 5 and 4 alone) +3. readability, each checked by d39 at 0: `ent = a0` copy and the `p` temp inlined, the dead `a0 = 1;` deleted. + +## (d) Generator proposal +When the residual shows `lhu; sll 16; sra 16+N` against the target's `lh; sra N`, rewrite every constant right shift `v >> N` +of an s16-loaded `v` as `(s16)v >> N`, enumerating the subsets of the sites (d13 needed one, this class needs both). + +## (e) What did not work +Nothing tried beyond the port; the port closed first time. + +## (f) Where the method fell short +Nothing: step 13 (d13) + "copies close with the same text" (d39 already had this TU's copy ready). + +## (g) Structs +Neutral (d39 did not need one; the channel here is cse's shift fold on a narrowing extension, not aggregate-vs-scalar MEM flags). +A struct for the sub-object at `+0x20` (s16 +0x18 radius, s16 +0x1A range) would read better but does not touch the fold. + +## Copies (all closed by d39 at 0 with this same text) +func_80185484 (ov_SC03_090), func_801857A8 (ov_SC03_089), func_80183318 (ov_SC03_104), func_8018632C (this TU). diff --git a/.run/P36/delever/calibration.json b/.run/P36/delever/calibration.json index 6c0fb3310..a0ddd5ee2 100644 --- a/.run/P36/delever/calibration.json +++ b/.run/P36/delever/calibration.json @@ -1,7 +1,7 @@ { - "head": "55a84c4fd", + "head": "046e84600", "stamp": "15956e4a96c4", - "generated": "2026-09-11 04:52", + "generated": "2026-09-11 05:42", "aliases": [ "main", "ov_SC03_014", @@ -21,207 +21,207 @@ "main": { "objects": 85, "identical": 85, - "seconds": 6.3100000000000005, - "mean_s": 0.074 + "seconds": 6.530000000000003, + "mean_s": 0.077 }, "ov_SC03_014": { "objects": 32, "identical": 32, - "seconds": 4.386, - "mean_s": 0.137 + "seconds": 4.618000000000001, + "mean_s": 0.144 }, "ov_SC03_015": { "objects": 32, "identical": 32, - "seconds": 4.152000000000001, - "mean_s": 0.13 + "seconds": 4.332, + "mean_s": 0.135 }, "ov_SC04_011": { "objects": 28, "identical": 28, - "seconds": 3.7299999999999995, - "mean_s": 0.133 + "seconds": 3.707, + "mean_s": 0.132 } }, "per_object_seconds": { - "build/src/800.o": 0.655, - "build/src/800_b.o": 0.071, - "build/src/800_b_2.o": 0.279, - "build/src/800_b_o0a.o": 0.06, - "build/src/800_c.o": 0.196, - "build/src/800b2.o": 0.069, - "build/src/apicard1.o": 0.063, - "build/src/apicard2.o": 0.07, - "build/src/apicard3.o": 0.063, - "build/src/apicard4.o": 0.083, - "build/src/apicard5.o": 0.075, - "build/src/apicard6.o": 0.082, - "build/src/apicard7.o": 0.091, - "build/src/boot.o": 0.103, - "build/src/gap.o": 0.066, - "build/src/libapi1.o": 0.076, - "build/src/libapi2.o": 0.055, - "build/src/libc2_1.o": 0.062, - "build/src/libc2_2.o": 0.053, - "build/src/libcd1.o": 0.061, - "build/src/libcd2.o": 0.068, - "build/src/libetc.o": 0.062, - "build/src/libgpu.o": 0.06, - "build/src/libgpu2.o": 0.063, - "build/src/libgs1.o": 0.061, - "build/src/libgs2.o": 0.056, - "build/src/libgs3.o": 0.061, - "build/src/libgs4.o": 0.062, - "build/src/libgs5.o": 0.051, - "build/src/libgs6.o": 0.078, - "build/src/libgs7.o": 0.053, - "build/src/libgs8.o": 0.058, - "build/src/libgte1.o": 0.055, - "build/src/libgte10.o": 0.063, - "build/src/libgte11.o": 0.061, - "build/src/libgte12.o": 0.058, + "build/src/800.o": 0.729, + "build/src/800_b.o": 0.086, + "build/src/800_b_2.o": 0.302, + "build/src/800_b_o0a.o": 0.057, + "build/src/800_c.o": 0.225, + "build/src/800b2.o": 0.064, + "build/src/apicard1.o": 0.088, + "build/src/apicard2.o": 0.057, + "build/src/apicard3.o": 0.066, + "build/src/apicard4.o": 0.077, + "build/src/apicard5.o": 0.059, + "build/src/apicard6.o": 0.07, + "build/src/apicard7.o": 0.066, + "build/src/boot.o": 0.066, + "build/src/gap.o": 0.098, + "build/src/libapi1.o": 0.059, + "build/src/libapi2.o": 0.057, + "build/src/libc2_1.o": 0.074, + "build/src/libc2_2.o": 0.056, + "build/src/libcd1.o": 0.081, + "build/src/libcd2.o": 0.059, + "build/src/libetc.o": 0.061, + "build/src/libgpu.o": 0.063, + "build/src/libgpu2.o": 0.083, + "build/src/libgs1.o": 0.057, + "build/src/libgs2.o": 0.059, + "build/src/libgs3.o": 0.057, + "build/src/libgs4.o": 0.063, + "build/src/libgs5.o": 0.055, + "build/src/libgs6.o": 0.103, + "build/src/libgs7.o": 0.052, + "build/src/libgs8.o": 0.056, + "build/src/libgte1.o": 0.061, + "build/src/libgte10.o": 0.053, + "build/src/libgte11.o": 0.057, + "build/src/libgte12.o": 0.055, "build/src/libgte13.o": 0.065, - "build/src/libgte14.o": 0.063, - "build/src/libgte15.o": 0.055, - "build/src/libgte16.o": 0.056, - "build/src/libgte17.o": 0.063, - "build/src/libgte18.o": 0.046, - "build/src/libgte19.o": 0.053, - "build/src/libgte2.o": 0.052, + "build/src/libgte14.o": 0.054, + "build/src/libgte15.o": 0.058, + "build/src/libgte16.o": 0.057, + "build/src/libgte17.o": 0.049, + "build/src/libgte18.o": 0.061, + "build/src/libgte19.o": 0.06, + "build/src/libgte2.o": 0.059, "build/src/libgte20.o": 0.059, - "build/src/libgte21.o": 0.057, - "build/src/libgte22.o": 0.059, - "build/src/libgte23.o": 0.06, - "build/src/libgte24.o": 0.061, - "build/src/libgte25.o": 0.062, - "build/src/libgte26.o": 0.069, - "build/src/libgte27.o": 0.053, - "build/src/libgte28.o": 0.05, - "build/src/libgte29.o": 0.059, - "build/src/libgte3.o": 0.065, - "build/src/libgte30.o": 0.063, - "build/src/libgte4.o": 0.069, - "build/src/libgte5.o": 0.058, - "build/src/libgte6.o": 0.062, - "build/src/libgte7.o": 0.059, - "build/src/libgte8.o": 0.059, + "build/src/libgte21.o": 0.065, + "build/src/libgte22.o": 0.06, + "build/src/libgte23.o": 0.057, + "build/src/libgte24.o": 0.062, + "build/src/libgte25.o": 0.06, + "build/src/libgte26.o": 0.057, + "build/src/libgte27.o": 0.058, + "build/src/libgte28.o": 0.062, + "build/src/libgte29.o": 0.062, + "build/src/libgte3.o": 0.064, + "build/src/libgte30.o": 0.066, + "build/src/libgte4.o": 0.06, + "build/src/libgte5.o": 0.057, + "build/src/libgte6.o": 0.055, + "build/src/libgte7.o": 0.065, + "build/src/libgte8.o": 0.07, "build/src/libgte9.o": 0.06, - "build/src/libmcrd1.o": 0.065, + "build/src/libmcrd1.o": 0.098, "build/src/libmcrd2.o": 0.062, - "build/src/libpad1.o": 0.063, - "build/src/libpad2.o": 0.071, - "build/src/sgap.o": 0.055, - "build/src/sgap_2.o": 0.06, - "build/src/sgap_3.o": 0.062, - "build/src/sgap_4.o": 0.067, - "build/src/sgap_5.o": 0.072, - "build/src/sgap_6.o": 0.053, - "build/src/sgap_8.o": 0.072, - "build/src/snd1.o": 0.069, - "build/src/snd10.o": 0.064, - "build/src/snd11.o": 0.058, - "build/src/snd12.o": 0.062, - "build/src/snd2.o": 0.06, - "build/src/snd3.o": 0.057, - "build/src/snd4.o": 0.066, - "build/src/snd5.o": 0.068, - "build/src/snd6.o": 0.079, + "build/src/libpad1.o": 0.067, + "build/src/libpad2.o": 0.079, + "build/src/sgap.o": 0.06, + "build/src/sgap_2.o": 0.057, + "build/src/sgap_3.o": 0.06, + "build/src/sgap_4.o": 0.066, + "build/src/sgap_5.o": 0.054, + "build/src/sgap_6.o": 0.065, + "build/src/sgap_8.o": 0.064, + "build/src/snd1.o": 0.079, + "build/src/snd10.o": 0.061, + "build/src/snd11.o": 0.057, + "build/src/snd12.o": 0.064, + "build/src/snd2.o": 0.088, + "build/src/snd3.o": 0.065, + "build/src/snd4.o": 0.065, + "build/src/snd5.o": 0.056, + "build/src/snd6.o": 0.075, "build/src/snd7.o": 0.061, - "build/src/snd8.o": 0.059, - "build/src/snd9.o": 0.065, - "build/src/ov_SC03_014/ov_SC03_014.o": 0.116, - "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.484, - "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.347, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.066, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.06, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.116, - "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.156, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.108, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.074, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.064, - "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.167, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.085, - "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.162, - "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.081, - "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.061, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.059, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.09, + "build/src/snd8.o": 0.056, + "build/src/snd9.o": 0.078, + "build/src/ov_SC03_014/ov_SC03_014.o": 0.125, + "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.506, + "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.376, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.064, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.077, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.136, + "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.163, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.131, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.083, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.075, + "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.174, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.099, + "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.172, + "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.096, + "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.063, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.066, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.096, "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.483, - "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.226, - "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.081, - "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.189, - "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.055, - "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.103, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.061, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.165, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.182, - "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.051, - "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.256, - "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.063, - "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.055, - "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.051, - "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.069, - "build/src/ov_SC03_015/ov_SC03_015.o": 0.098, + "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.25, + "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.096, + "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.192, + "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.051, + "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.096, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.07, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.157, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.174, + "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.05, + "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.26, + "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.06, + "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.064, + "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.056, + "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.057, + "build/src/ov_SC03_015/ov_SC03_015.o": 0.115, "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.467, - "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.373, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.051, + "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.384, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.048, "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.048, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.115, - "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.144, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.096, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.069, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.061, - "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.157, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.066, - "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.149, - "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.078, - "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.054, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.104, + "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.14, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.108, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.071, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.064, + "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.172, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.068, + "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.154, + "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.077, + "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.064, "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.062, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.075, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.429, - "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.247, - "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.096, - "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.19, - "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.054, - "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.093, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.053, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.141, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.168, - "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.047, - "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.25, - "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.051, - "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.056, - "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.049, - "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.065, - "build/src/ov_SC04_011/ov_SC04_011.o": 0.124, - "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.403, - "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.347, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.049, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.049, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.102, - "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.148, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.113, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.066, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.089, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.44, + "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.258, + "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.095, + "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.199, + "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.052, + "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.095, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.063, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.162, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.193, + "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.045, + "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.266, + "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.057, + "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.059, + "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.05, + "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.063, + "build/src/ov_SC04_011/ov_SC04_011.o": 0.115, + "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.393, + "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.328, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.052, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.046, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.105, + "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.143, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.108, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.074, "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.057, - "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.163, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.061, - "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.145, - "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.081, - "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.059, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.063, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.087, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.344, - "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.21, + "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.168, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.069, + "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.163, + "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.086, + "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.066, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.066, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.088, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.332, + "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.206, "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.082, - "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.157, - "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.056, - "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.092, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.062, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.09, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.417, - "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.044, - "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.059 + "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.158, + "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.061, + "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.08, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.06, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.094, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.421, + "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.039, + "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.047 }, "ok": true, - "seconds": 2.1 + "seconds": 2.2 } diff --git a/.run/P36/delever/ledger.jsonl b/.run/P36/delever/ledger.jsonl index 588778300..05e6884c8 100644 --- a/.run/P36/delever/ledger.jsonl +++ b/.run/P36/delever/ledger.jsonl @@ -29543,3 +29543,4 @@ {"ts": "2026-09-11 04:51:42", "label": "s104_e32", "rung": "E", "calib": {"head": "b6b1bbc1d", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_105/ov_SC03_105_jr_80181C84.c", "fn": "func_80184CA8", "addr": 2149076136, "aliases": null, "header": false, "includers": 0, "nhash_before": "c2965c1a2bf1830f587a072222355bb1b4f29546", "nhash_after": "26871f5045e56d49361d410849fa3b64894fb7c5", "source": ".run/P36/agents/ov_SC03_105__func_8018574C/scratch/cca8_final.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.105, "objects": ["build/src/ov_SC03_105/ov_SC03_105_jr_80181C84.o"], "before_text": "void func_80184CA8(s32 a0) {\n s32 v0;\n s16 *s1;\n s32 s3;\n u16 flag;\n s32 counter;\n /* K&R house style: all locals at the top. gcc-2.7.2 assigns stack slots in\n DECLARATION order (cookbook item 6), so buf[8] must be declared BEFORE\n tmp[4] to land at sp+0x10 with tmp at sp+0x20 -- even though tmp's arm\n runs first at runtime. */\n s16 buf[8];\n s16 tmp[4];\n s32 t;\n s16 u;\n s32 rnd;\n s32 base;\n s32 rem;\n s32 result;\n\n s3 = a0 + 0x20; /* $s3 = a0 + 0x20 */\n v0 = *(s32 *)(a0 + 0x54);\n s1 = *(s16 **)(a0 + 0x50);\n if (v0 == 0) { /* target: bnez v0 SKIPS the call */\n v0 = func_80185628(a0 + 0x34, (s32)s1);\n *(s16 *)(a0 + 0x28) = v0;\n }\n\n flag = *(u16 *)(a0 + 2);\n *(s16 *)(a0 + 0x34) = s1[0];\n *(s16 *)(a0 + 0x36) = s1[1];\n *(s16 *)(a0 + 0x38) = s1[2];\n\n /* flag != 0 first: writing the arms the other way round flips which side\n falls through and corrupts every branch downstream. */\n if (flag != 0) {\n counter = *(s32 *)(a0 + 0x1C);\n if (counter != 0) {\n *(s32 *)(a0 + 0x1C) = counter - 1;\n } else {\n v0 = func_80185680((void *)s3, (void *)(a0 + 0x48));\n if (v0 == 1) {\n rnd = rand();\n t = *(s16 *)(a0 + 0x2C);\n base = *(s16 *)(a0 + 0x34);\n /* Two levers in ONE zero-byte asm.\n (1) combine expands sign_extend(lh) into ashift/ashiftrt and\n merges it with the outer >>7, so the natural spelling\n always emits lhu+sll,16+sra,23 (3 ins). The re-tie breaks\n the i2->i3 chain, leaving the target's lh + sra,7 (2 ins).\n (2) naming `base` as an extra INPUT makes the 0x34 load a\n predecessor of the fence, so sched1 must place it before\n the fence -- i.e. into the lh 0x2C load-delay slot, which\n is exactly where the target has `lh $s1,0x34($s0)`.\n Without it that slot is a nop and the function is 116 ins. */\n __asm__(\"\" : \"=r\"(t) : \"0\"(t), \"r\"(base)); // !FAKE: launder \u2014 REFUSED launder with 2 inputs (P36 rung B tus10)\n rem = rnd % (t >> 7);\n if (rand() & 1) {\n result = base + rem;\n } else {\n result = base - rem;\n }\n tmp[0] = result; /* sp+0x20 */\n tmp[1] = *(u16 *)(s3 + 0x16) + *(u16 *)(s3 + 0x1E); /* sp+0x22 */\n tmp[2] = *(u16 *)(s3 + 0x18); /* sp+0x24 */\n func_8017E5C8((s32)tmp);\n func_80185218((void *)a0);\n } else {\n /* `u` MUST be declared s16, not s32 (width dial, cookbook\n \u00a7194-B): the 16-bit local keeps the shift result in $v0 and\n sends the negation to $v1; an s32 local swaps the pair. */\n u = (s16)(*(u16 *)(a0 + 0x2C)) >> 9;\n buf[2] = -u; /* sp+0x14 */\n buf[3] = u; /* sp+0x16 */\n u = (s16)(*(u16 *)(a0 + 0x2E)) >> 9;\n buf[4] = -u; /* sp+0x18 */\n buf[5] = u; /* sp+0x1A */\n u = (s16)(*(u16 *)(a0 + 0x30)) >> 9;\n buf[6] = -u; /* sp+0x1C */\n buf[7] = u; /* sp+0x1E */\n func_80185380(a0, (s32)&buf[0], 0x30); /* a1 = sp+0x10 */\n func_80185810(s3);\n }\n }\n } else {\n *(s16 *)(a0 + 2) = flag + 1;\n *(s32 *)(a0 + 0x1C) = rand() % 4;\n }\n}\n", "after_text": "void func_80184CA8(s32 a0) {\n s32 v0;\n s16 *s1;\n s32 s3;\n u16 flag;\n s32 counter;\n /* K&R house style: all locals at the top. gcc-2.7.2 assigns stack slots in\n DECLARATION order (cookbook item 6), so buf[8] must be declared BEFORE\n tmp[4] to land at sp+0x10 with tmp at sp+0x20 -- even though tmp's arm\n runs first at runtime. */\n s16 buf[8];\n s16 tmp[4];\n s32 t;\n s16 u;\n s32 rnd;\n s32 base;\n s32 rem;\n s32 result;\n\n s3 = a0 + 0x20; /* $s3 = a0 + 0x20 */\n v0 = *(s32 *)(a0 + 0x54);\n s1 = *(s16 **)(a0 + 0x50);\n if (v0 == 0) { /* target: bnez v0 SKIPS the call */\n v0 = func_80185628(a0 + 0x34, (s32)s1);\n *(s16 *)(a0 + 0x28) = v0;\n }\n\n flag = *(u16 *)(a0 + 2);\n *(s16 *)(a0 + 0x34) = s1[0];\n *(s16 *)(a0 + 0x36) = s1[1];\n *(s16 *)(a0 + 0x38) = s1[2];\n\n /* flag != 0 first: writing the arms the other way round flips which side\n falls through and corrupts every branch downstream. */\n if (flag != 0) {\n counter = *(s32 *)(a0 + 0x1C);\n if (counter != 0) {\n *(s32 *)(a0 + 0x1C) = counter - 1;\n } else {\n v0 = func_80185680((void *)s3, (void *)(a0 + 0x48));\n if (v0 == 1) {\n rnd = rand();\n t = *(s16 *)(a0 + 0x2C);\n base = *(s16 *)(a0 + 0x34);\n /* `(s16)t >> 7`, not `t >> 7` (P36 S104 e32, replacing a 2-input launder):\n with the cast at the shift, c-typeck's short_shift re-extends the value and\n cse folds that pair into the `lh`, leaving the target's lh + sra,7; written\n `t >> 7`, combine merges the load's sign extension with the shift into\n lhu + sll,16 + sra,23. The 0x34 load then fills the lh delay slot by itself. */\n rem = rnd % ((s16)t >> 7);\n if (rand() & 1) {\n result = base + rem;\n } else {\n result = base - rem;\n }\n tmp[0] = result; /* sp+0x20 */\n tmp[1] = *(u16 *)(s3 + 0x16) + *(u16 *)(s3 + 0x1E); /* sp+0x22 */\n tmp[2] = *(u16 *)(s3 + 0x18); /* sp+0x24 */\n func_8017E5C8((s32)tmp);\n func_80185218((void *)a0);\n } else {\n /* `u` MUST be declared s16, not s32 (width dial, cookbook\n \u00a7194-B): the 16-bit local keeps the shift result in $v0 and\n sends the negation to $v1; an s32 local swaps the pair. */\n u = (s16)(*(u16 *)(a0 + 0x2C)) >> 9;\n buf[2] = -u; /* sp+0x14 */\n buf[3] = u; /* sp+0x16 */\n u = (s16)(*(u16 *)(a0 + 0x2E)) >> 9;\n buf[4] = -u; /* sp+0x18 */\n buf[5] = u; /* sp+0x1A */\n u = (s16)(*(u16 *)(a0 + 0x30)) >> 9;\n buf[6] = -u; /* sp+0x1C */\n buf[7] = u; /* sp+0x1E */\n func_80185380(a0, (s32)&buf[0], 0x30); /* a1 = sp+0x10 */\n func_80185810(s3);\n }\n }\n } else {\n *(s16 *)(a0 + 2) = flag + 1;\n *(s32 *)(a0 + 0x1C) = rand() % 4;\n }\n}\n"} {"ts": "2026-09-11 04:51:59", "label": "s104_e32", "rung": "E", "calib": {"head": "0a272b4ce", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.c", "fn": "func_80181CDC", "addr": 2149063900, "aliases": null, "header": false, "includers": 0, "nhash_before": "5bf849c4f7d1184bf5dcd5ef0a134870eaebfd8f", "nhash_after": "0629125306ac98c7012b1bb33de26307807cdc21", "source": ".run/P36/agents/ov_SC03_105__func_80183DA0/scratch/x1.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.159, "objects": ["build/src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.o"], "before_text": "s32 func_80181CDC(s32 a0, s32 a1) {\n register s32 zr __asm__(\"$0\"); // !FAKE: pin $0 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n SVec_80181CDC pos;\n SVec_80181CDC out;\n s32 val;\n s32 lvl;\n s32 t;\n s32 x;\n s32 n;\n s32 y;\n s32 arg;\n\n val = 0x7F;\n arg = a1;\n pos.vx = *(s16 *)(a0 + 0x6);\n pos.vy = *(s16 *)(a0 + 0xA);\n pos.vz = *(s16 *)(a0 + 0xE);\n ((void (*)(void *, void *))func_8012EFB8)(&pos, &out);\n lvl = 7;\n\n t = out.vx;\n if (t < 0) { t = -t; }\n if (t >= 0xC9) { return 0; }\n\n if (out.vy >= 0) {\n if (out.vy >= 0xA1) { return 0; }\n __asm__ __volatile__(\"\"); // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus9)\n } else {\n if (-out.vy >= 0xA1) { return 0; }\n }\n\n val -= ((((s32 (*)(s32))func_8012BD14)(a0) - 0x1000) * 0x7F) / 0xFF000;\n x = out.vx;\n n = lvl + x / 0x19;\n lvl = n + zr;\n if ((s16)n < 0) { lvl = 0; }\n else if ((s16)n > 0xF) { lvl = 0xF; }\n y = (lvl << 8) | 0x3000;\n func_8002D4C8(arg & 0xFFFF, (val | y) & 0xFFFF);\n return 1;\n}\n", "after_text": "s32 func_80181CDC(s32 a0, s32 a1) {\n SVec_80181CDC pos;\n SVec_80181CDC out;\n s32 val;\n s16 lvl;\n s32 t;\n s32 arg;\n\n val = 0x7F;\n lvl = 7;\n arg = a1;\n pos.vx = *(s16 *)(a0 + 0x6);\n pos.vy = *(s16 *)(a0 + 0xA);\n pos.vz = *(s16 *)(a0 + 0xE);\n ((void (*)(void *, void *))func_8012EFB8)(&pos, &out);\n\n t = out.vx;\n if (t < 0) { t = -t; }\n if (t >= 0xC9) { return 0; }\n\n if (out.vy >= 0 ? out.vy >= 0xA1 : -out.vy >= 0xA1) { return 0; }\n\n val -= ((((s32 (*)(s32))func_8012BD14)(a0) - 0x1000) * 0x7F) / 0xFF000;\n lvl += out.vx / 0x19;\n if (lvl < 0) { lvl = 0; }\n else if (lvl > 0xF) { lvl = 0xF; }\n func_8002D4C8(arg & 0xFFFF, (u16)(val | ((lvl << 8) | 0x3000)));\n return 1;\n}\n"} {"ts": "2026-09-11 04:52:16", "label": "s104_e32", "rung": "E", "calib": {"head": "55a84c4fd", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC05_005/ov_SC05_005_jr_8017D898.c", "fn": "func_80181DE4", "addr": 2149064164, "aliases": null, "header": false, "includers": 0, "nhash_before": "3b6ca8e79d4117385dcea9308c8e3860d27992ca", "nhash_after": "a57d9f274e5758265f54d92a0730f8e3aec7d870", "source": ".run/P36/agents/ov_SC03_105__func_80183DA0/scratch/x2.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.117, "objects": ["build/src/ov_SC05_005/ov_SC05_005_jr_8017D898.o"], "before_text": "s32 func_80181DE4(s32 a0, s32 a1) {\n register s32 zr __asm__(\"$0\"); // !FAKE: pin $0 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n SVec_80181CDC_80181DE4 pos;\n SVec_80181CDC_80181DE4 out;\n s32 val;\n s32 lvl;\n s32 t;\n s32 x;\n s32 n;\n s32 y;\n s32 arg;\n\n val = 0x7F;\n arg = a1;\n pos.vx = *(s16 *)(a0 + 0x6);\n pos.vy = *(s16 *)(a0 + 0xA);\n pos.vz = *(s16 *)(a0 + 0xE);\n ((void (*)(void *, void *))func_8012EFB8)(&pos, &out);\n lvl = 7;\n\n t = out.vx;\n if (t < 0) { t = -t; }\n if (t >= 0xC9) { return 0; }\n\n if (out.vy >= 0) {\n if (out.vy >= 0xA1) { return 0; }\n __asm__ __volatile__(\"\"); // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus9)\n } else {\n if (-out.vy >= 0xA1) { return 0; }\n }\n\n val -= ((((s32 (*)(s32))func_8012BD14)(a0) - 0x1000) * 0x7F) / 0xFF000;\n x = out.vx;\n n = lvl + x / 0x19;\n lvl = n + zr;\n if ((s16)n < 0) { lvl = 0; }\n else if ((s16)n > 0xF) { lvl = 0xF; }\n y = (lvl << 8) | 0x3000;\n func_8002D4C8(arg & 0xFFFF, (val | y) & 0xFFFF);\n return 1;\n}\n", "after_text": "s32 func_80181DE4(s32 a0, s32 a1) {\n SVec_80181CDC_80181DE4 pos;\n SVec_80181CDC_80181DE4 out;\n s32 val;\n s16 lvl;\n s32 t;\n s32 arg;\n\n val = 0x7F;\n lvl = 7;\n arg = a1;\n pos.vx = *(s16 *)(a0 + 0x6);\n pos.vy = *(s16 *)(a0 + 0xA);\n pos.vz = *(s16 *)(a0 + 0xE);\n ((void (*)(void *, void *))func_8012EFB8)(&pos, &out);\n\n t = out.vx;\n if (t < 0) { t = -t; }\n if (t >= 0xC9) { return 0; }\n\n if (out.vy >= 0 ? out.vy >= 0xA1 : -out.vy >= 0xA1) { return 0; }\n\n val -= ((((s32 (*)(s32))func_8012BD14)(a0) - 0x1000) * 0x7F) / 0xFF000;\n lvl += out.vx / 0x19;\n if (lvl < 0) { lvl = 0; }\n else if (lvl > 0xF) { lvl = 0xF; }\n func_8002D4C8(arg & 0xFFFF, (u16)(val | ((lvl << 8) | 0x3000)));\n return 1;\n}\n"} +{"ts": "2026-09-11 05:43:04", "label": "s104_e36", "rung": "E", "calib": {"head": "046e84600", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_091/ov_SC03_091_jr_8018326C.c", "fn": "func_8018632C", "addr": 2149081900, "aliases": null, "header": false, "includers": 0, "nhash_before": "15275ab79776f0e50500ca2b116fb7d4e7669d01", "nhash_after": "a3df056d55dd9c7b2219b849aa94e610176eb6bc", "source": ".run/P36/agents/ov_SC03_091__func_8018632C/body.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.152, "objects": ["build/src/ov_SC03_091/ov_SC03_091_jr_8018326C.o"], "before_text": "s32 aF8018632C(s32 a0) {\n extern void func_8012BE54(s32 a0);\n extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5);\n extern u16 D_80126B62;\n extern u8 D_801A61DC[];\n\n s32 ent;\n s32 p;\n s32 h;\n s32 h2;\n s32 ret;\n s32 s0;\n s32 r;\n s32 v;\n s32 g;\n s32 d;\n u16 arr[3];\n\n ent = a0;\n p = *(s32 *)(ent + 0x20);\n h = *(s16 *)(p + 0x18);\n __asm__(\"\" : \"=r\"(h) : \"0\"(h)); // !FAKE: launder \u2014 NEEDED DIFFERS (P36 rung B tus9)\n ret = ((s32 (*)(s32))func_8012BE54)(ent);\n s0 = h >> 8;\n if (ret > s0 * s0) {\n return 0;\n }\n v = *(s16 *)(ent + 0xA);\n h2 = *(s16 *)(*(s32 *)(ent + 0x20) + 0x1A);\n __asm__ __volatile__(\"\" : \"=r\"(h2) : \"0\"(h2)); // !FAKE: launder \u2014 NEEDED DIFFERS (P36 rung B tus9)\n g = *(s16 *)&D_80126B62;\n r = h2 >> 6;\n d = v - g;\n if (d >= 0 ? r < d : r < g - v) {\n return 0;\n }\n a0 = 1;\n arr[0] = *(u16 *)(ent + 0x6);\n arr[1] = *(u16 *)(ent + 0xA);\n arr[2] = *(u16 *)(ent + 0xE);\n func_8012F568(1, 0x4201, 0, 0x1C, (s32)arr, (s32)D_801A61DC);\n}\n", "after_text": "s32 aF8018632C(s32 a0) {\n extern void func_8012BE54(s32 a0);\n extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5);\n extern u16 D_80126B62;\n extern u8 D_801A61DC[];\n\n s32 h;\n s32 h2;\n s32 ret;\n s32 s0;\n s32 r;\n s32 v;\n s32 g;\n s32 d;\n u16 arr[3];\n\n h = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18);\n ret = ((s32 (*)(s32))func_8012BE54)(a0);\n s0 = (s16)h >> 8;\n if (ret > s0 * s0) {\n return 0;\n }\n v = *(s16 *)(a0 + 0xA);\n h2 = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1A);\n g = *(s16 *)&D_80126B62;\n r = (s16)h2 >> 6;\n d = v - g;\n if (d >= 0 ? r < d : r < g - v) {\n return 0;\n }\n arr[0] = *(u16 *)(a0 + 0x6);\n arr[1] = *(u16 *)(a0 + 0xA);\n arr[2] = *(u16 *)(a0 + 0xE);\n func_8012F568(1, 0x4201, 0, 0x1C, (s32)arr, (s32)D_801A61DC);\n}\n"} diff --git a/src/ov_SC03_091/ov_SC03_091_jr_8018326C.c b/src/ov_SC03_091/ov_SC03_091_jr_8018326C.c index f3b66b11f..afe26359a 100644 --- a/src/ov_SC03_091/ov_SC03_091_jr_8018326C.c +++ b/src/ov_SC03_091/ov_SC03_091_jr_8018326C.c @@ -4719,8 +4719,6 @@ s32 aF8018632C(s32 a0) { extern u16 D_80126B62; extern u8 D_801A61DC[]; - s32 ent; - s32 p; s32 h; s32 h2; s32 ret; @@ -4731,28 +4729,23 @@ s32 aF8018632C(s32 a0) { s32 d; u16 arr[3]; - ent = a0; - p = *(s32 *)(ent + 0x20); - h = *(s16 *)(p + 0x18); - __asm__("" : "=r"(h) : "0"(h)); // !FAKE: launder — NEEDED DIFFERS (P36 rung B tus9) - ret = ((s32 (*)(s32))func_8012BE54)(ent); - s0 = h >> 8; + h = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18); + ret = ((s32 (*)(s32))func_8012BE54)(a0); + s0 = (s16)h >> 8; if (ret > s0 * s0) { return 0; } - v = *(s16 *)(ent + 0xA); - h2 = *(s16 *)(*(s32 *)(ent + 0x20) + 0x1A); - __asm__ __volatile__("" : "=r"(h2) : "0"(h2)); // !FAKE: launder — NEEDED DIFFERS (P36 rung B tus9) + v = *(s16 *)(a0 + 0xA); + h2 = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1A); g = *(s16 *)&D_80126B62; - r = h2 >> 6; + r = (s16)h2 >> 6; d = v - g; if (d >= 0 ? r < d : r < g - v) { return 0; } - a0 = 1; - arr[0] = *(u16 *)(ent + 0x6); - arr[1] = *(u16 *)(ent + 0xA); - arr[2] = *(u16 *)(ent + 0xE); + arr[0] = *(u16 *)(a0 + 0x6); + arr[1] = *(u16 *)(a0 + 0xA); + arr[2] = *(u16 *)(a0 + 0xE); func_8012F568(1, 0x4201, 0, 0x1C, (s32)arr, (s32)D_801A61DC); }