mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-26 21:36:06 -04:00
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:
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
Reference in New Issue
Block a user