mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-29 15:18:24 -04:00
feat(phase-31): propagate func_80186764 (gate lane)
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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) */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user