phase-36: S104 e31 (5) + e32 (6) banked; func_801834A4 NOT banked (a steering dead store — Drew's call, like d20); e38 packs (md_MAIN_003)

This commit is contained in:
Drew T
2026-09-11 04:52:31 -06:00
parent 6d1b2d078b
commit a4f043bc35
33 changed files with 866 additions and 4 deletions
+4 -4
View File
@@ -1,5 +1,5 @@
rank fn alias copies best needed kinds regs tu
85 func_80180D54 ov_SC03_097 2 7 1 pin $2 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c
64 func_8017FEA0 ov_SC03_097 1 12 1 pin $2 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c
52 func_8017F7E4 ov_SC03_097 1 13 2 barrier,launder src/ov_SC03_097/ov_SC03_097_jr_8017D898.c
109 func_80182498 ov_SC03_097 1 17 3 launder,pin $29 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c
8 func_800D24D0 md_MAIN_003 1 4 1 barrier src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
12 func_800D2A24 md_MAIN_003 1 4 3 keepalive,pin $2 src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
5 func_800D1E9C md_MAIN_003 1 5 3 barrier,keepalive,pin $2 src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
4 func_800D30D0 md_MAIN_003 1 12 5 cast,launder src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
1 rank fn alias copies best needed kinds regs tu
2 85 8 func_80180D54 func_800D24D0 ov_SC03_097 md_MAIN_003 2 1 7 4 1 pin barrier $2 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
3 64 12 func_8017FEA0 func_800D2A24 ov_SC03_097 md_MAIN_003 1 12 4 1 3 pin keepalive,pin $2 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
4 52 5 func_8017F7E4 func_800D1E9C ov_SC03_097 md_MAIN_003 1 13 5 2 3 barrier,launder barrier,keepalive,pin $2 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
5 109 4 func_80182498 func_800D30D0 ov_SC03_097 md_MAIN_003 1 17 12 3 5 launder,pin cast,launder $29 src/ov_SC03_097/ov_SC03_097_jr_8017D898.c src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
@@ -0,0 +1,111 @@
void func_800D1E9C(void *arg0) {
s32 sp18[30];
s16 sp90[4];
s16 sp98[8];
s32 *p;
s32 i;
s32 v0r;
p = (s32 *) arg0;
D_800EC9F0 = 1;
((void (*)()) func_800D2394)(D_800EC9A4,
p[1] ? (p[4] * 3) / 2 : p[4],
p[5],
p[1] ? (p[4] * 3) / 2 : p[4],
p[5] + p[7],
p);
if (((s32 (*)()) func_800D2454)(D_800EC9FC, func_800D24D0, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_800D2AA0(0);
goto ret;
}
if (func_800D2704(D_800EC9A4, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_800D2AA0(0);
goto ret;
}
D_800EC9F4 = 0;
D_800EC9F8 = 0;
func_80059658(0);
VSync(0);
sp90[0] = 0;
sp90[1] = 0;
sp90[2] = p[1] ? (p[6] * 3) / 2 : p[6];
sp90[3] = p[7] * 2;
if (p[1] != 0) {
func_80059888(sp90, 0, 0, 0);
sp98[0] = 0x1E0;
sp98[1] = 0;
sp98[2] = 0xA0;
sp98[3] = 0x1E0;
func_80059888(sp98, 0xFF, 0xFF, 0xFF);
} else {
func_80059888(sp90, 0, 0, 0);
sp98[0] = 0x140;
sp98[1] = 0;
sp98[2] = 0x140;
sp98[3] = 0x1E0;
func_80059888(sp98, 0xFF, 0xFF, 0xFF);
}
for (;;) {
func_800D2C0C(D_800EC9A4[D_800EC9AC], p[1] ? 3 : 2);
((void (*)()) func_800D2C88)((&D_800EC9A4[3])[D_800EC9B8],
((*(s16 *) ((u8 *) D_800EC9A4 + 0x30) << 4) *
((*(s16 *) ((u8 *) D_800EC9A4 + 0x32) - 1) / 16 + 1)) >> 1);
if (func_800D2704(D_800EC9A4, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
goto after;
}
func_800D298C(D_800EC9A4, 0);
VSync(0);
i = (D_800EC9CC == 0);
SetDefDispEnv(sp18,
D_800EC9BC[i * 4] -
(p[1] ? (p[4] * 3) / 2 : p[4]),
D_800EC9BE[i * 4] - p[5],
p[1] ? (p[6] * 3) / 2 : p[6],
p[7]);
if (p[1] != 0) {
*((u8 *) sp18 + 0x11) = p[1];
*(s16 *) ((u8 *) sp18 + 4) = (*(s16 *) ((u8 *) sp18 + 4) * 2) / 3;
}
func_80059FC0((u8 *) sp18);
func_80059658(1);
if (D_800EC9F4 == 1) {
goto done;
}
func_800189A8();
if (D_800EC9F8 == 0) {
if (D_800EC9E0 == 0) {
if (func_80014CAC(0, 0x800) != 0) {
D_800EC9E0 = 1;
D_800EC9E4 = 0x10;
func_8002D8A8();
}
} else {
D_800EC9E4 -= 1;
if (D_800EC9E4 == 0) {
goto done;
}
}
}
func_8002D034();
}
done:
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_80043830(9, 0, 0);
after:
func_800D2AA0(0);
func_80059658(1);
ret:
func_80010A98();
v0r = 1;
}
@@ -0,0 +1,113 @@
void func_800D1E9C(void *arg0) {
s32 sp18[30];
s16 sp90[4];
s16 sp98[8];
s32 *p;
s32 i;
register s32 v0r __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9)
p = (s32 *) arg0;
D_800EC9F0 = 1;
((void (*)()) func_800D2394)(D_800EC9A4,
p[1] ? (p[4] * 3) / 2 : p[4],
p[5],
p[1] ? (p[4] * 3) / 2 : p[4],
p[5] + p[7],
p);
if (((s32 (*)()) func_800D2454)(D_800EC9FC, func_800D24D0, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_800D2AA0(0);
__asm__ __volatile__(""); // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus9)
goto ret;
}
if (func_800D2704(D_800EC9A4, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_800D2AA0(0);
goto ret;
}
D_800EC9F4 = 0;
D_800EC9F8 = 0;
func_80059658(0);
VSync(0);
sp90[0] = 0;
sp90[1] = 0;
sp90[2] = p[1] ? (p[6] * 3) / 2 : p[6];
sp90[3] = p[7] * 2;
if (p[1] != 0) {
func_80059888(sp90, 0, 0, 0);
sp98[0] = 0x1E0;
sp98[1] = 0;
sp98[2] = 0xA0;
sp98[3] = 0x1E0;
func_80059888(sp98, 0xFF, 0xFF, 0xFF);
} else {
func_80059888(sp90, 0, 0, 0);
sp98[0] = 0x140;
sp98[1] = 0;
sp98[2] = 0x140;
sp98[3] = 0x1E0;
func_80059888(sp98, 0xFF, 0xFF, 0xFF);
}
for (;;) {
func_800D2C0C(D_800EC9A4[D_800EC9AC], p[1] ? 3 : 2);
((void (*)()) func_800D2C88)((&D_800EC9A4[3])[D_800EC9B8],
((*(s16 *) ((u8 *) D_800EC9A4 + 0x30) << 4) *
((*(s16 *) ((u8 *) D_800EC9A4 + 0x32) - 1) / 16 + 1)) >> 1);
if (func_800D2704(D_800EC9A4, p) != 0) {
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
goto after;
}
func_800D298C(D_800EC9A4, 0);
VSync(0);
i = (D_800EC9CC == 0);
SetDefDispEnv(sp18,
D_800EC9BC[i * 4] -
(p[1] ? (p[4] * 3) / 2 : p[4]),
D_800EC9BE[i * 4] - p[5],
p[1] ? (p[6] * 3) / 2 : p[6],
p[7]);
if (p[1] != 0) {
*((u8 *) sp18 + 0x11) = p[1];
*(s16 *) ((u8 *) sp18 + 4) = (*(s16 *) ((u8 *) sp18 + 4) * 2) / 3;
}
func_80059FC0((u8 *) sp18);
func_80059658(1);
if (D_800EC9F4 == 1) {
goto done;
}
func_800189A8();
if (D_800EC9F8 == 0) {
if (D_800EC9E0 == 0) {
if (func_80014CAC(0, 0x800) != 0) {
D_800EC9E0 = 1;
D_800EC9E4 = 0x10;
func_8002D8A8();
}
} else {
D_800EC9E4 -= 1;
if (D_800EC9E4 == 0) {
goto done;
}
}
}
func_8002D034();
}
done:
func_800D2D44(0);
func_800468FC();
func_8002D8D4();
func_80043830(9, 0, 0);
after:
func_800D2AA0(0);
func_80059658(1);
ret:
func_80010A98();
v0r = 1;
__asm__ __volatile__("" : : "r"(v0r)); // !FAKE: keepalive — NEEDED DIFFERS (P36 rung B tus9)
}
@@ -0,0 +1,15 @@
s3: verdict BUDGET start 20 best 5 compiles 400 path R9 swap-stmts @172
s3b: verdict BUDGET start 20 best 5 compiles 400 path R9 swap-stmts @172
best-scoring single candidates of the last trace (move -> score [residual class]):
R9 swap-stmts @172 -> 5 [COUNT] (from 20)
R9 swap-stmts @179 -> 5 [COUNT] (from 20)
R12 width v0r s32->u16 @159 -> 5 [COUNT] (from 5)
R7 block @173 -> 5 [COUNT] (from 5)
R9 swap-stmts @261 -> 5 [COUNT] (from 5)
R4 decl-move v0r 5->0 -> 5 [COUNT] (from 5)
R12 width v0r s32->s16 @159 -> 5 [COUNT] (from 5)
R7 do-while @173 -> 5 [COUNT] (from 5)
R10 param-copy arg0 @160 -> 5 [COUNT] (from 5)
R4 decl-move v0r 5->1 -> 5 [COUNT] (from 5)
R12 width v0r s32->u8 @159 -> 5 [COUNT] (from 5)
R8 hoist tmp0 @190 -> 5 [COUNT] (from 5)
@@ -0,0 +1 @@
@@ -0,0 +1,124 @@
=== lever-free bodies in md_MAIN_003 sharing a callee or global with func_800D1E9C (7 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_800D27A0 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:456) shares 3: D_800EC9F4 D_800EC9F8 func_80059888 ---
s32 func_800D27A0(void* arg0, struct UnkS1* arg1) {
s32 sp10[2];
u16 sp18[4];
s32 ret;
s32 i;
for (i = 0x8000; i != 0; i--) {
if (StGetNext(&sp10[0], &sp10[1]) == 0) {
goto found;
}
}
return 0;
found:
if (*(u32*)(sp10[1] + 8) >= arg1->fC) {
D_800EC9F4 = 1;
}
if (*(u32*)(sp10[1] + 8) >= arg1->fC - 15) {
D_800EC9F8 = 1;
} else {
D_800EC9F8 = 0;
}
if (D_800D9484 != *(u16*)(sp10[1] + 0x10) || D_800D9488 != *(u16*)(sp10[1] + 0x12)) {
u16 cur1;
u16 cur2;
sp18[0] = 0;
sp18[1] = 0;
sp18[2] = arg1->f4 != 0 ? (arg1->f18 * 3) / 2 : *(u16*)&arg1->f18;
sp18[3] = arg1->f1C * 2;
if (arg1->f4 != 0) {
func_80059888(sp18, 0, 0, 0);
} else {
func_80059888(sp18, 0x40, 0x40, 0x40);
}
cur1 = *(u16*)(sp10[1] + 0x10);
cur2 = *(u16*)(sp10[1] + 0x12);
D_800D9484 = cur1;
D_800D9488 = cur2;
}
{
u16 t = arg1->f4 != 0 ? (D_800D9484 * 3) / 2 : *(u16*)&D_800D9484;
u16 g;
ret = sp10[0];
g = *(u16*)&D_800D9488;
*(u16*)(arg0 + 0x24) = t;
*(u16*)(arg0 + 0x1C) = t;
*(u16*)(arg0 + 0x26) = g;
*(u16*)(arg0 + 0x1E) = g;
*(u16*)(arg0 + 0x32) = g;
}
return ret;
}
--- func_800D2454 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:340) shares 2: func_800D2AA0 func_800D2D44 ---
void func_800D2454(s32 a0, s32 a1, s32 *a2) {
func_800D2AA0(0);
func_800D2D44(a1);
StSetRing(D_800D946C, 0x20);
StSetStream(a2[1], a2[2], -1, 0, 0);
func_800D2A24(a0);
}
--- func_800D1E18 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:93) shares 1: D_800EC9FC ---
s32 func_800D1E18(void) {
return CdSearchFile(D_800EC9FC, (void *) D_800D942C[func_8001BFA0()].unk00) != 0;
}
--- func_800D1E58 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:105) shares 1: D_800EC9E0 ---
void func_800D1E58(void) {
D_800EC9E0 = 0;
func_800D1E9C(&D_800D942C[func_8001BFA0()]);
func_8001BFB0();
}
--- func_800CF300 (src/md_MAIN_003/md_MAIN_003.c:193) shares 1: func_80059888 ---
void func_800CF300(void) {
s16 sp10[4];
func_800CF3E8();
D_800EC68C -= 4;
if (D_800EC68C < 0) {
sp10[2] = 0x280;
sp10[0] = 0;
sp10[1] = 0;
sp10[3] = 0x1E0;
func_80059888(&sp10[0], 0, 0, 0);
func_800118AC();
}
}
--- func_800D0440 (src/md_MAIN_003/md_MAIN_003_o0e.c:205) shares 1: func_80059888 ---
void func_800D0440(void) {
register u8 *p = D_800AF630;
u16 rect[4];
if ((u16) func_800167F0(4) != 0) {
switch (D_800EC894) {
case 0:
*(u16 *) (p + 0xA3B6) = 1;
*(u16 *) (p + 0xA3B8) = 2;
break;
case 1:
*(u16 *) (p + 0xA3B6) = 1;
*(u16 *) (p + 0xA3B8) = 0;
break;
case 2:
*(u16 *) (p + 0xA3B6) = 1;
*(u16 *) (p + 0xA3B8) = 1;
break;
case 4:
*(u16 *) (p + 0xA3B6) = 1;
*(u16 *) (p + 0xA3B8) = 4;
break;
}
rect[0] = 0;
rect[1] = 0;
rect[2] = 0x140;
rect[3] = 0x1E0;
func_80059888(rect, 0, 0, 0);
}
func_800D0D6C();
}
@@ -0,0 +1,31 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:func_800D1E9C: score 20 (COUNT; mine 307 ins, target 318) — not yet
replace mine[51:52] target[51:62]
51 bnez v0,170 <func_800D1E9C+0xec> | beqz v0,180 <func_800D1E9C+0xfc>
52 -- | nop
53 -- | jal 0 <func_800D1E18>
54 -- | move a0,zero
55 -- | jal 0 <func_800D1E18>
56 -- | nop
57 -- | jal 0 <func_800D1E18>
58 -- | nop
59 -- | jal 0 <func_800D1E18>
60 -- | move a0,zero
61 -- | j 554 <func_800D1E9C+0x4d0>
replace mine[67:68] target[77:78]
67 j 52c <func_800D1E9C+0x4a8> | j 554 <func_800D1E9C+0x4d0>
replace mine[89:90] target[99:100]
89 j 1f4 <func_800D1E9C+0x170> | j 21c <func_800D1E9C+0x198>
replace mine[115:116] target[125:126]
115 j 2b0 <func_800D1E9C+0x22c> | j 2d8 <func_800D1E9C+0x254>
replace mine[123:124] target[133:134]
123 j 51c <func_800D1E9C+0x498> | j 544 <func_800D1E9C+0x4c0>
replace mine[198:199] target[208:209]
198 j 3b0 <func_800D1E9C+0x32c> | j 3d8 <func_800D1E9C+0x354>
replace mine[218:219] target[228:229]
218 j 3f8 <func_800D1E9C+0x374> | j 420 <func_800D1E9C+0x39c>
replace mine[270:271] target[280:281]
270 j 4e4 <func_800D1E9C+0x460> | j 50c <func_800D1E9C+0x488>
replace mine[282:283] target[292:293]
282 j 2c4 <func_800D1E9C+0x240> | j 2ec <func_800D1E9C+0x268>
insert mine[300:300] target[310:311]
300 -- | li v0,1
@@ -0,0 +1,3 @@
NEEDED pin $2 line 159
NEEDED barrier line 174
NEEDED keepalive line 264
@@ -0,0 +1,2 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
func_800D1E9C
@@ -0,0 +1,48 @@
void func_800D24D0(void) {
D24D0_Rect sp10[2];
s32 s0;
s32 idx;
s32 r;
s16 *p;
s32 n;
if (D_800EC9DC != 0) {
if (D_800A5F1C != 0) {
StCdInterrupt();
D_800A5F1C = 0;
}
}
sp10[0] = *(D24D0_Rect *)&D_800EC9D0;
{
s32 *pb = &D_800EC9B8;
s0 = *pb;
*pb = (*pb == 0);
}
if (D_800EC9F0 != 0) {
r = D_800EC9C0[D_800EC9CC * 4] % D_800EC9D4;
if (r != 0) {
D_800EC9F0 = 0;
D_800EC9D0 = D_800EC9D0 + r;
goto join;
}
}
{
s16 *px = &D_800EC9D0;
*px = *px + D_800EC9D4;
}
join:
p = (s16 *)((u8 *)D_800EC9A4 + 0x2C);
idx = D_800EC9CC;
if (*p < D_800EC9BC[idx * 4] + D_800EC9C0[idx * 4]) {
((void (*)()) func_800D2C88)((&D_800EC9A4[3])[D_800EC9B8],
((D_800EC9D4 << 4) * ((D_800EC9D6 - 1) / 16 + 1)) >> 1);
} else {
D_800EC9D8 = 1;
n = (idx == 0);
D_800EC9CC = n;
*p = *(u16 *)((u8 *)aD_800EC9BC + n * 8);
D_800EC9F0 = 1;
D_800EC9D2 = D_800EC9BE[n * 4];
}
func_800599B8((u16 *)sp10, (u16 *)D_800EC9B0[s0]);
}
@@ -0,0 +1,49 @@
void func_800D24D0(void) {
D24D0_Rect sp10[2];
s32 s0;
s32 idx;
s32 r;
s16 *p;
s32 n;
if (D_800EC9DC != 0) {
if (D_800A5F1C != 0) {
StCdInterrupt();
D_800A5F1C = 0;
}
}
sp10[0] = *(D24D0_Rect *)&D_800EC9D0;
{
s32 *pb = &D_800EC9B8;
s0 = *pb;
__asm__ __volatile__("" ::: "memory"); // !FAKE: barrier memory — NEEDED DIFFERS (P36 rung B tus9)
*pb = (*pb == 0);
}
if (D_800EC9F0 != 0) {
r = D_800EC9C0[D_800EC9CC * 4] % D_800EC9D4;
if (r != 0) {
D_800EC9F0 = 0;
D_800EC9D0 = D_800EC9D0 + r;
goto join;
}
}
{
s16 *px = &D_800EC9D0;
*px = *px + D_800EC9D4;
}
join:
p = (s16 *)((u8 *)D_800EC9A4 + 0x2C);
idx = D_800EC9CC;
if (*p < D_800EC9BC[idx * 4] + D_800EC9C0[idx * 4]) {
((void (*)()) func_800D2C88)((&D_800EC9A4[3])[D_800EC9B8],
((D_800EC9D4 << 4) * ((D_800EC9D6 - 1) / 16 + 1)) >> 1);
} else {
D_800EC9D8 = 1;
n = (idx == 0);
D_800EC9CC = n;
*p = *(u16 *)((u8 *)aD_800EC9BC + n * 8);
D_800EC9F0 = 1;
D_800EC9D2 = D_800EC9BE[n * 4];
}
func_800599B8((u16 *)sp10, (u16 *)D_800EC9B0[s0]);
}
@@ -0,0 +1,14 @@
g6b: verdict NO-MATCH start 4 best 4 compiles 318 path
best-scoring single candidates of the last trace (move -> score [residual class]):
R12 width n s32->u16 @377 -> 4 [COUNT] (from 4)
R8 hoist tmp0 @392 -> 4 [COUNT] (from 4)
R7 block @381 -> 4 [COUNT] (from 4)
R5 swap + @395 -> 4 [COUNT] (from 4)
R12 width n s32->s16 @377 -> 4 [COUNT] (from 4)
R7 do-while @381 -> 4 [COUNT] (from 4)
R9 swap-stmts @394 -> 4 [COUNT] (from 4)
R12 width n s32->u8 @377 -> 4 [COUNT] (from 4)
R8 temp tmp0 @413 -> 4 [COUNT] (from 4)
R7 block @392 -> 4 [COUNT] (from 4)
R9 swap-stmts @410 -> 4 [COUNT] (from 4)
R8 base tmp0 @413 -> 4 [COUNT] (from 4)
@@ -0,0 +1 @@
@@ -0,0 +1,54 @@
=== lever-free bodies in md_MAIN_003 sharing a callee or global with func_800D24D0 (2 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_800D0C50 (src/md_MAIN_003/md_MAIN_003_o0e.c:621) shares 1: func_800599B8 ---
void func_800D0C50(void) {
s16 sp10[8];
u16 *addr2;
u16 *addr1;
addr1 = (u16 *)(D_800EC894 * 307744 + 0x80114014);
addr2 = (u16 *)(D_800EC894 * 307744 + 0x80114220);
sp10[0] = 0;
sp10[1] = 0x1E0;
sp10[2] = 0x100;
sp10[3] = 1;
sp10[4] = 0x280;
sp10[5] = 0x10;
sp10[6] = 0x140;
sp10[7] = 0x1E0;
func_800599B8(sp10, addr1);
func_800599B8(&sp10[4], addr2);
func_80011928(3);
}
--- func_800CFE00 (src/md_MAIN_003/md_MAIN_003.c:670) shares 1: func_800599B8 ---
void func_800CFE00(void) {
u16 sp10[8];
u16 *addr1;
u16 *addr2;
s32 v;
s32 t;
v = D_800EC678;
sp10[0] = 0;
sp10[1] = 0x1E0;
sp10[2] = 0x100;
sp10[3] = 1;
sp10[4] = 0x280;
sp10[5] = 0x24;
sp10[6] = 0x140;
sp10[7] = 0x1B8;
t = v << 4;
t += v;
t <<= 2;
t += v;
t <<= 3;
t -= v;
t <<= 4;
t += v;
t <<= 5;
addr1 = (u16 *)(t + 0x80120014);
addr2 = (u16 *)(t + 0x80120220);
func_800599B8(sp10, addr1);
func_800599B8(&sp10[4], addr2);
}
@@ -0,0 +1,10 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:func_800D24D0: score 4 (COUNT; mine 140 ins, target 141) — not yet
register pairs (mine -> target, count): s0->v0 x1
insert mine[28:28] target[28:29]
28 -- | lw v0,0(v1)
replace mine[30:31] target[31:32]
30 sltiu v0,s0,1 | sltiu v0,v0,1
replace mine[63:64] target[64:65]
63 j 7dc <func_800D24D0+0x124> | j 7e0 <func_800D24D0+0x128>
replace mine[109:110] target[110:111]
109 j 8c0 <func_800D24D0+0x208> | j 8c4 <func_800D24D0+0x20c>
@@ -0,0 +1,2 @@
NEEDED barrier memory line 389
REMOVED barrier line 408
@@ -0,0 +1,2 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
func_800D24D0
@@ -0,0 +1,26 @@
void func_800D2A24(s32 a0) {
u8 *p;
s32 r;
s32 v0;
retry:
p = D_800EC9E8;
for (;;) {
r = func_800435CC(2, (void *)a0, p);
if (*p & 0x10) {
goto ret1;
}
if (r != 0) {
break;
}
}
if (CdRead2(0x1C0) == 0) {
goto retry;
}
v0 = 0;
return;
ret1:
v0 = 1;
return;
}
@@ -0,0 +1,28 @@
void func_800D2A24(s32 a0) {
u8 *p;
s32 r;
register s32 v0 __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus9)
retry:
p = D_800EC9E8;
for (;;) {
r = func_800435CC(2, (void *)a0, p);
if (*p & 0x10) {
goto ret1;
}
if (r != 0) {
break;
}
}
if (CdRead2(0x1C0) == 0) {
goto retry;
}
v0 = 0;
__asm__ __volatile__("" : : "r"(v0)); // !FAKE: keepalive — NEEDED DIFFERS (P36 rung B tus9)
return;
ret1:
v0 = 1;
__asm__ __volatile__("" : : "r"(v0)); // !FAKE: keepalive — NEEDED DIFFERS (P36 rung B tus9)
return;
}
@@ -0,0 +1,14 @@
s6: verdict NO-MATCH start 4 best 4 compiles 73 path
best-scoring single candidates of the last trace (move -> score [residual class]):
R12 width v0 s32->u16 @570 -> 4 [COUNT] (from 4)
R7 block @586 -> 4 [COUNT] (from 4)
R10 param-copy a0 @571 -> 4 [COUNT] (from 4)
R4 decl-move v0 2->0 -> 4 [COUNT] (from 4)
R12 width v0 s32->s16 @570 -> 4 [COUNT] (from 4)
R7 do-while @586 -> 4 [COUNT] (from 4)
R4 decl-move v0 2->1 -> 4 [COUNT] (from 4)
R12 width v0 s32->u8 @570 -> 4 [COUNT] (from 4)
R7 block @590 -> 4 [COUNT] (from 4)
R7 do-while @590 -> 4 [COUNT] (from 4)
R7 block @575 -> 4 [COUNT] (from 4)
R7 block @573 -> 4 [COUNT] (from 4)
@@ -0,0 +1,19 @@
=== THIS FUNCTION'S OWN HEADER (func_800D2A24, line 567) — read it in full ===
/* TU (src/md_MAIN_003/md_MAIN_003.c:1085) forward-declares this K&R-style as
* `extern void func_800D2A24();` for its sole caller (func_800D2454, which
* discards the return), so the definition here must be `void` to avoid
* `conflicting types for 'func_800D2A24'` (cc1 exit 33). The body genuinely
* sets $v0 to 1 or 0 on every exit path (asm: `addiu $v0,zero,1` /
* `addu $v0,zero,zero`), and a plain `return <value>;` in a void function is
* a pedwarn gcc-2.7.2 silently DISCARDS (loses those materializations,
* closeness != 0 -- cookbook §43's void-return-value-drop). Absorbed at the
* use site instead: a hard-`$2` register local set via a read-only
* input-`__asm__` immediately before a bare `return;` on each exit forces
* the same `li $v0,K` the s32-typed body would have emitted, without
* widening the TU's declared return type. Putting the early-exit's v0-set
* behind a `goto` (rather than inline in the `if` body) keeps that branch a
* single instruction, matching the target's branch polarity -- inlining the
* register-pin + asm barrier directly in the `if` block bloats it and flips
* beqz/bnez (byte-verified: NEAR closeness 10 vs this MATCH closeness 0).
*/
@@ -0,0 +1 @@
=== lever-free bodies in md_MAIN_003 sharing a callee or global with func_800D2A24 (0 found; top 6 by shared symbols) — read them for the SHAPE ===
@@ -0,0 +1,8 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:func_800D2A24: score 4 (COUNT; mine 28 ins, target 31) — not yet
replace mine[14:15] target[14:15]
14 bnez v1,c64 <func_800D2A24+0x58> | bnez v1,c6c <func_800D2A24+0x60>
insert mine[21:21] target[21:23]
21 -- | move v0,zero
22 -- | j c70 <func_800D2A24+0x64>
insert mine[22:22] target[24:25]
22 -- | li v0,1
@@ -0,0 +1,3 @@
NEEDED pin $2 line 571
NEEDED keepalive line 588
NEEDED keepalive line 593
@@ -0,0 +1,2 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
func_800D2A24
@@ -0,0 +1,27 @@
s32 aF800D30D0(char *arg0) {
s32 ret;
s32 s0;
func_8005C604(D_800CEEB8, arg0);
s0 = *(volatile s32 *)D_800DB670;
func_8005C604(D_800CEE58,
(*(volatile u32 *)D_800DB644 >> 24) & 1,
(*(volatile u32 *)D_800DB650 >> 24) & 1,
*D_800DB63C,
*D_800DB648);
func_8005C604(D_800CEE80,
((u32)~s0 >> 31),
((u32)s0 >> 30) & 1,
((u32)s0 >> 29) & 1,
((u32)s0 >> 28) & 1,
((u32)s0 >> 27) & 1,
((u32)s0 >> 25) & 1,
((u32)s0 >> 23) & 1);
*D_800DB670 = 0x80000000;
*D_800DB644 = 0;
*D_800DB650 = 0;
ret = 0;
(void)*(volatile s32 *)D_800DB650;
*D_800DB670 = 0x60000000;
return ret;
}
@@ -0,0 +1,27 @@
s32 aF800D30D0(char *arg0) {
s32 ret;
s32 s0;
func_8005C604(D_800CEEB8, arg0);
s0 = *(volatile s32 *)D_800DB670;
func_8005C604(D_800CEE58,
(*(volatile u32 *)D_800DB644 >> 24) & 1,
(*(volatile u32 *)D_800DB650 >> 24) & 1,
*D_800DB63C,
*D_800DB648);
func_8005C604(D_800CEE80,
((u32)~s0 >> 31),
((u32)s0 >> 30) & 1,
((u32)s0 >> 29) & 1,
((u32)s0 >> 28) & 1,
((u32)s0 >> 27) & 1,
((u32)s0 >> 25) & 1,
((u32)s0 >> 23) & 1);
*D_800DB670 = 0x80000000;
*D_800DB644 = 0;
*D_800DB650 = 0;
__asm__ volatile("" : "=r"(ret) : "0"(0)); // !FAKE: launder — NEEDED DIFFERS (P36 rung B tus9)
(void)*(volatile s32 *)D_800DB650;
*D_800DB670 = 0x60000000;
return ret;
}
@@ -0,0 +1,14 @@
s6: verdict NO-MATCH start 14 best 12 compiles 173 path R16 const-holder ret=0 x1 + R9 swap-stmts @924
best-scoring single candidates of the last trace (move -> score [residual class]):
R9 swap-stmts @924 -> 12 [COUNT] (from 14)
R9 swap-stmts @924 -> 12 [COUNT] (from 14)
R16 const-holder ret=0 x1 -> 14 [COUNT] (from 14)
R6 inline ret @926 -> 14 [COUNT] (from 14)
R7 block @927 -> 14 [COUNT] (from 14)
R9 swap-stmts @926 -> 14 [COUNT] (from 14)
R7 block @926 -> 14 [COUNT] (from 14)
R9 swap-stmts @925 -> 14 [COUNT] (from 14)
R12 width ret s32->u16 @905 -> 14 [COUNT] (from 14)
R7 do-while @926 -> 14 [COUNT] (from 14)
R12 width ret s32->s16 @905 -> 14 [COUNT] (from 14)
R7 block @928 -> 14 [COUNT] (from 14)
@@ -0,0 +1 @@
@@ -0,0 +1,87 @@
=== lever-free bodies in md_MAIN_003 sharing a callee or global with func_800D30D0 (6 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_800D2E64 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:789) shares 2: D_800DB63C D_800DB644 ---
void func_800D2E64(s32 a0, s32 a1) {
u32 s0;
s32 s1;
s1 = a0;
s0 = (u32)a1;
func_800D2F88(a0, a1);
s0 = (s0 >> 5) << 16;
*D_800DB674 |= 0x88;
*D_800DB63C = s1 + 4;
*D_800DB640 = s0 | 0x20;
*D_800DB66C = *(s32 *)s1;
*D_800DB644 = 0x1000201;
}
--- func_800D2EF8 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:810) shares 2: D_800DB648 D_800DB650 ---
void func_800D2EF8(s32 a0, s32 a1) {
s32 s1;
u32 s0;
s1 = a0;
s0 = (u32)a1;
func_800D3020();
s0 >>= 5;
*D_800DB674 |= 0x88;
*D_800DB650 = 0;
*D_800DB648 = s1;
*D_800DB64C = (s32)(s0 << 16) | 0x20;
*D_800DB650 = 0x1000200;
}
--- func_800D30B8 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:859) shares 1: D_800DB670 ---
s32 func_800D30B8(void) {
return *D_800DB670;
}
--- func_800D2F88 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:829) shares 1: D_800DB670 ---
u32 aF800D2F88(void)
{
volatile int count = 0x100000;
while (*(*(u32 **)&D_800DB670) & 0x20000000) {
if (--count == -1) {
func_800D30D0("MDEC_in_sync");
return -1;
}
}
return 0;
}
--- func_800D3020 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:845) shares 1: D_800DB650 ---
u32 func_800D3020(void)
{
volatile int count = 0x100000;
while (*(*(u32 * *)&D_800DB650) & 0x1000000) {
if (--count == -1) {
func_800D30D0("MDEC_out_sync");
return -1;
}
}
return 0;
}
--- func_800D2D68 (src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:757) shares 1: func_8005C604 ---
void func_800D2D68(s32 arg0) {
s32 dummy;
switch (arg0) {
case 0:
*aD800DB670 = 0x80000000;
*aD800DB644 = 0;
*aD800DB650 = 0;
*aD800DB670 = 0x60000000;
func_800D2E64((s32)&D_800DB52C, 0x20);
func_800D2E64((s32)&D_800DB5B0, 0x20);
break;
case 1:
*aD800DB670 = 0x80000000;
*aD800DB644 = 0;
*aD800DB650 = 0;
dummy = *aD800DB650;
*aD800DB670 = 0x60000000;
break;
default:
func_8005C604(D_800CEE1C, arg0);
break;
}
}
@@ -0,0 +1,17 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c:func_800D30D0: score 14 (COUNT; mine 76 ins, target 76) — not yet
delete mine[63:70] target[63:63]
63 lui v0,0x0 | --
64 lw v0,0(v0) | --
65 lui v1,0x0 | --
66 lw v1,0(v1) | --
67 lw v0,0(v0) | --
68 lui v0,0x6000 | --
69 sw v0,0(v1) | --
insert mine[71:71] target[64:71]
71 -- | lui v1,0x0
72 -- | lw v1,0(v1)
73 -- | lui a0,0x0
74 -- | lw a0,0(a0)
75 -- | lw v1,0(v1)
76 -- | lui v1,0x6000
77 -- | sw v1,0(a0)
@@ -0,0 +1,6 @@
REMOVED pin $2 line 906
NEEDED cast volatile s32 * line 910
NEEDED cast volatile u32 * line 912
NEEDED cast volatile u32 * line 913
NEEDED launder line 927
NEEDED cast volatile s32 * line 928
@@ -0,0 +1,2 @@
src/md_MAIN_003/md_MAIN_003_jr_800D1E18.c
func_800D30D0