diff --git a/config/dedup.us.yaml b/config/dedup.us.yaml index a59688716..29dcdea08 100644 --- a/config/dedup.us.yaml +++ b/config/dedup.us.yaml @@ -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] diff --git a/src/ov_SC02_000/ov_SC02_000_jr_8018173C.c b/src/ov_SC02_000/ov_SC02_000_jr_8018173C.c index da3d2cd5b..01ece45f1 100644 --- a/src/ov_SC02_000/ov_SC02_000_jr_8018173C.c +++ b/src/ov_SC02_000/ov_SC02_000_jr_8018173C.c @@ -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) */ diff --git a/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c b/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c index 978c3040e..22186d281 100644 --- a/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c +++ b/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c @@ -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) */ diff --git a/src/shared/engine_core.h b/src/shared/engine_core.h index 1421337b1..9be998689 100644 --- a/src/shared/engine_core.h +++ b/src/shared/engine_core.h @@ -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