feat(phase-31): propagate func_80186764 (gate lane)

This commit is contained in:
Drew T
2026-08-15 08:08:24 -06:00
parent 6634db313d
commit cb93147138
4 changed files with 123 additions and 76 deletions
+7
View File
@@ -15062,3 +15062,10 @@ groups:
func: DEFINE_func_80187738
vram: 0x80187738
binaries: [ov_SC02_000, ov_SC02_003]
- id: E_func_80186764
tier: h_exact
hash: d67a6376071007d5dab792f0add70266857bab1e
source: src/shared/engine_core.h
func: DEFINE_func_80186764
vram: 0x80186764
binaries: [ov_SC02_000, ov_SC02_003]
+1 -75
View File
@@ -4009,81 +4009,7 @@ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8018173C", func_8018653
#include "common.h"
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
extern void func_8001C810(s32 a0, s32 a1);
extern void func_8001D0E8(s32 a0, s32 a1, s32 a2);
extern void func_8001C214(s32 a0, s32 a1);
extern void func_8012A828(s32 a0, void *a1);
extern u8 D_801DCED0;
extern s32 D_8018F304;
extern s32 D_801E8270;
extern u8 D_801E827C;
extern u8 D_801E827D;
extern u8 D_801E827E;
extern u8 D_801E828C;
extern u8 D_801E828E;
extern u8 D_801E829E;
extern u8 D_801E82AC;
extern u8 D_801DD528;
extern M2C_UNK D_8018AF28;
extern s32 D_801270C8;
// @class: sched-order (statement order, NOT regalloc)
// @note: the second func_8001D0E8 call fills its delay slot with
// `sw $v0, 0x20($a0)`, i.e. the store to obj+0x20 happens BEFORE that
// call in source order. Writing it after the call (the m2c reading)
// pushes the store into the *next* jal's delay slot and makes gcc keep
// obj pinned in $s0 across everything -> 91 ins / 21 mismatched.
// With the store hoisted above the call, CSE naturally keeps
// &D_8018AF28 live across func_8001D0E8 and reuses the $s0 slot that
// obj vacates at `addu $a0, $s0, $zero`. No register pin required.
void func_80186764(s32 param_1)
{
s32 v0;
s32 s0;
v0 = ((s32 (*)(void))func_8012C1B8)();
*(s32 *)(param_1 + 0x20) = v0;
if (v0 == 0) {
((void (*)(s32))func_8012CAE4)(param_1);
return;
}
((void (*)(s32, void *))func_8001C810)(v0, &D_801DCED0);
*(s32 *)(param_1 + 0x58) = (s32)&D_8018F304;
*(u16 *)(param_1 + 0x5C) = 0x800;
*(s32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x40000000;
func_8001D0E8(*(s32 *)(param_1 + 0x20), 0xDC, 0x98);
*(u16 *)(*(s32 *)(param_1 + 0x20) + 0x2C) |= 0x20;
*(s32 *)(*(s32 *)(param_1 + 0x20) + 0x80) = (s32)&(*(u8 *)&D_801E8270);
D_801E827D = 0xFF;
D_801E829E = 0xFF;
D_801E82AC = 0xFF;
D_801E827D = 0xFF;
D_801E828E = 0xFF;
D_801E828C = 0xFF;
D_801E827D = 0xFF;
D_801E827E = 0xFF;
D_801E827C = 0xFF;
s0 = ((s32 (*)(void))func_8012C1B8)();
*(s32 *)(param_1 + 0xCC) = s0;
((void (*)(s32, void *))func_8001C214)(s0, &D_801DD528);
*(s32 *)(s0 + 0x20) = (*(s32 *)&D_8018AF28);
func_8001D0E8(s0, 0xDC, 0x98);
((void (*)(s32, void *))func_8012A828)(param_1, &(*(s32 *)&D_8018AF28));
*(s16 *)(param_1 + 2) = 1;
*(u16 *)(param_1 + 0xFC) = 0x10;
*(s32 *)(param_1 + 0xDC) = D_801270C8;
}
DEFINE_func_80186764() /* dedup: shared engine-core @0x80186764 (src/shared) */
DEFINE_func_801868D4() /* dedup: shared engine-core @0x801868D4 (src/shared) */
+1 -1
View File
@@ -3262,7 +3262,7 @@ DEFINE_func_80186424() /* dedup: shared engine-core @0x80186424 (src/shared) */
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8018173C", func_80186530);
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8018173C", func_80186764);
DEFINE_func_80186764() /* dedup: shared engine-core @0x80186764 (src/shared) */
DEFINE_func_801868D4() /* dedup: shared engine-core @0x801868D4 (src/shared) */
+114
View File
@@ -62259,6 +62259,63 @@
*(s16 *)(param_1 + 2) = t2; \
}
#define DEFINE_func_80186764() \
extern void func_8012C1B8(void); \
extern void func_8012CAE4(void *a0); \
extern void func_8001C810(s32 a0, s32 a1); \
extern void func_8001D0E8(s32 a0, s32 a1, s32 a2); \
extern void func_8001C214(s32 a0, s32 a1); \
extern void func_8012A828(s32 a0, void *a1); \
extern u8 D_801DCED0; \
extern s32 D_8018F304; \
extern s32 D_801E8270; \
extern u8 D_801E827C; \
extern u8 D_801E827D; \
extern u8 D_801E827E; \
extern u8 D_801E828C; \
extern u8 D_801E828E; \
extern u8 D_801E829E; \
extern u8 D_801E82AC; \
extern u8 D_801DD528; \
extern M2C_UNK D_8018AF28; \
extern s32 D_801270C8; \
void func_80186764(s32 param_1) \
{ \
s32 v0; \
s32 s0; \
v0 = ((s32 (*)(void))func_8012C1B8)(); \
*(s32 *)(param_1 + 0x20) = v0; \
if (v0 == 0) { \
((void (*)(s32))func_8012CAE4)(param_1); \
return; \
} \
((void (*)(s32, void *))func_8001C810)(v0, &D_801DCED0); \
*(s32 *)(param_1 + 0x58) = (s32)&D_8018F304; \
*(u16 *)(param_1 + 0x5C) = 0x800; \
*(s32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x40000000; \
func_8001D0E8(*(s32 *)(param_1 + 0x20), 0xDC, 0x98); \
*(u16 *)(*(s32 *)(param_1 + 0x20) + 0x2C) |= 0x20; \
*(s32 *)(*(s32 *)(param_1 + 0x20) + 0x80) = (s32)&(*(u8 *)&D_801E8270); \
D_801E827D = 0xFF; \
D_801E829E = 0xFF; \
D_801E82AC = 0xFF; \
D_801E827D = 0xFF; \
D_801E828E = 0xFF; \
D_801E828C = 0xFF; \
D_801E827D = 0xFF; \
D_801E827E = 0xFF; \
D_801E827C = 0xFF; \
s0 = ((s32 (*)(void))func_8012C1B8)(); \
*(s32 *)(param_1 + 0xCC) = s0; \
((void (*)(s32, void *))func_8001C214)(s0, &D_801DD528); \
*(s32 *)(s0 + 0x20) = (*(s32 *)&D_8018AF28); \
func_8001D0E8(s0, 0xDC, 0x98); \
((void (*)(s32, void *))func_8012A828)(param_1, &(*(s32 *)&D_8018AF28)); \
*(s16 *)(param_1 + 2) = 1; \
*(u16 *)(param_1 + 0xFC) = 0x10; \
*(s32 *)(param_1 + 0xDC) = D_801270C8; \
}
#endif
#define DEFINE_func_80128EA8() \
@@ -153923,4 +153980,61 @@
*(s16 *)(param_1 + 2) = t2; \
}
#define DEFINE_func_80186764() \
extern void func_8012C1B8(void); \
extern void func_8012CAE4(void *a0); \
extern void func_8001C810(s32 a0, s32 a1); \
extern void func_8001D0E8(s32 a0, s32 a1, s32 a2); \
extern void func_8001C214(s32 a0, s32 a1); \
extern void func_8012A828(s32 a0, void *a1); \
extern u8 D_801DCED0; \
extern s32 D_8018F304; \
extern s32 D_801E8270; \
extern u8 D_801E827C; \
extern u8 D_801E827D; \
extern u8 D_801E827E; \
extern u8 D_801E828C; \
extern u8 D_801E828E; \
extern u8 D_801E829E; \
extern u8 D_801E82AC; \
extern u8 D_801DD528; \
extern M2C_UNK D_8018AF28; \
extern s32 D_801270C8; \
void func_80186764(s32 param_1) \
{ \
s32 v0; \
s32 s0; \
v0 = ((s32 (*)(void))func_8012C1B8)(); \
*(s32 *)(param_1 + 0x20) = v0; \
if (v0 == 0) { \
((void (*)(s32))func_8012CAE4)(param_1); \
return; \
} \
((void (*)(s32, void *))func_8001C810)(v0, &D_801DCED0); \
*(s32 *)(param_1 + 0x58) = (s32)&D_8018F304; \
*(u16 *)(param_1 + 0x5C) = 0x800; \
*(s32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x40000000; \
func_8001D0E8(*(s32 *)(param_1 + 0x20), 0xDC, 0x98); \
*(u16 *)(*(s32 *)(param_1 + 0x20) + 0x2C) |= 0x20; \
*(s32 *)(*(s32 *)(param_1 + 0x20) + 0x80) = (s32)&(*(u8 *)&D_801E8270); \
D_801E827D = 0xFF; \
D_801E829E = 0xFF; \
D_801E82AC = 0xFF; \
D_801E827D = 0xFF; \
D_801E828E = 0xFF; \
D_801E828C = 0xFF; \
D_801E827D = 0xFF; \
D_801E827E = 0xFF; \
D_801E827C = 0xFF; \
s0 = ((s32 (*)(void))func_8012C1B8)(); \
*(s32 *)(param_1 + 0xCC) = s0; \
((void (*)(s32, void *))func_8001C214)(s0, &D_801DD528); \
*(s32 *)(s0 + 0x20) = (*(s32 *)&D_8018AF28); \
func_8001D0E8(s0, 0xDC, 0x98); \
((void (*)(s32, void *))func_8012A828)(param_1, &(*(s32 *)&D_8018AF28)); \
*(s16 *)(param_1 + 2) = 1; \
*(u16 *)(param_1 + 0xFC) = 0x10; \
*(s32 *)(param_1 + 0xDC) = D_801270C8; \
}
#endif