diff --git a/config/dedup.us.yaml b/config/dedup.us.yaml index 979e6cb49..61411e76c 100644 --- a/config/dedup.us.yaml +++ b/config/dedup.us.yaml @@ -14558,3 +14558,10 @@ groups: func: DEFINE_func_8017D808 vram: 0x8017D808 binaries: [ov_SC01_005, ov_SC01_006] + - id: E_func_8017E404 + tier: h_exact + hash: 7c41de81900f591c42e025527551c45c3580913c + source: src/shared/engine_core.h + func: DEFINE_func_8017E404 + vram: 0x8017E404 + binaries: [ov_SC02_000, ov_SC02_003] diff --git a/src/ov_SC02_000/ov_SC02_000_jr_8017AE2C.c b/src/ov_SC02_000/ov_SC02_000_jr_8017AE2C.c index 0b568a630..fb2b31243 100644 --- a/src/ov_SC02_000/ov_SC02_000_jr_8017AE2C.c +++ b/src/ov_SC02_000/ov_SC02_000_jr_8017AE2C.c @@ -4529,52 +4529,7 @@ void func_8017D538(s32 arg0) // @class: regalloc-order // @stuck: none — MATCH (relocation-masked, 70 ins). pins $s0/$s1 + precomputed a0v anchored in a zero-byte barrier fix the prologue schedule. -extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); -extern s32 ratan2(s32, s32); -extern void func_8012B0B4(SVEC *, s32, s32); -extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); -extern void func_8012ADE4(u8 *a0); - -s32 func_8017E404(s32 param_1, s32 param_2) -{ - register s32 p1 __asm__("$16") = param_1; - register s32 p2 __asm__("$17") = param_2; - SVEC in; - SVEC out; - SVEC buf; - s32 d; - s32 ang; - u16 px, pz; - s32 a0v; - - a0v = p1 + 4; - __asm__ __volatile__("" : : "r"(p2), "r"(a0v)); - if (((s32 (*)(s32, s32))func_8012BC60)(a0v, p2 + 4) >= 0x1000) { - return 0; - } - ang = ratan2((s32)*(s16 *)(p1 + 0xe) - (s32)*(s16 *)(p2 + 0xe), - (s32)*(s16 *)(p2 + 6) - (s32)*(s16 *)(p1 + 6)); - func_8012B0B4(&buf, (ang - 0x400) & 0xfff, 0x41); - d = *(s32 *)&buf; - px = *(u16 *)(p2 + 6); - out.vx = px; - out.vy = *(u16 *)(p2 + 0xa); - pz = *(u16 *)(p2 + 0xe); - out.vz = pz; - out.vx = px + d; - out.vz = pz + (d >> 16); - in.vx = *(u16 *)(p1 + 0x3a); - in.vy = *(u16 *)(p1 + 0x3e); - in.vz = *(u16 *)(p1 + 0x42); - if ((((s32 (*)(SVEC *, SVEC *, s32))func_8012CEB0)(&in, &out, 0) & 0x2000) == 0) { - ((void (*)(s32))func_8012ADE4)(p1); - return 1; - } - *(s16 *)(p1 + 6) = out.vx; - *(s16 *)(p1 + 0xa) = out.vy; - *(s16 *)(p1 + 0xe) = out.vz; - return 1; -} +DEFINE_func_8017E404() /* dedup: shared engine-core @0x8017E404 (src/shared) */ diff --git a/src/ov_SC02_003/ov_SC02_003_jr_8017AE2C.c b/src/ov_SC02_003/ov_SC02_003_jr_8017AE2C.c index 6776c1666..7600c43b7 100644 --- a/src/ov_SC02_003/ov_SC02_003_jr_8017AE2C.c +++ b/src/ov_SC02_003/ov_SC02_003_jr_8017AE2C.c @@ -4529,52 +4529,7 @@ void func_8017D538(s32 arg0) // @class: regalloc-order // @stuck: none — MATCH (relocation-masked, 70 ins). pins $s0/$s1 + precomputed a0v anchored in a zero-byte barrier fix the prologue schedule. -extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); -extern s32 ratan2(s32, s32); -extern void func_8012B0B4(SVEC *, s32, s32); -extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); -extern void func_8012ADE4(u8 *a0); - -s32 func_8017E404(s32 param_1, s32 param_2) -{ - register s32 p1 __asm__("$16") = param_1; - register s32 p2 __asm__("$17") = param_2; - SVEC in; - SVEC out; - SVEC buf; - s32 d; - s32 ang; - u16 px, pz; - s32 a0v; - - a0v = p1 + 4; - __asm__ __volatile__("" : : "r"(p2), "r"(a0v)); - if (((s32 (*)(s32, s32))func_8012BC60)(a0v, p2 + 4) >= 0x1000) { - return 0; - } - ang = ratan2((s32)*(s16 *)(p1 + 0xe) - (s32)*(s16 *)(p2 + 0xe), - (s32)*(s16 *)(p2 + 6) - (s32)*(s16 *)(p1 + 6)); - func_8012B0B4(&buf, (ang - 0x400) & 0xfff, 0x41); - d = *(s32 *)&buf; - px = *(u16 *)(p2 + 6); - out.vx = px; - out.vy = *(u16 *)(p2 + 0xa); - pz = *(u16 *)(p2 + 0xe); - out.vz = pz; - out.vx = px + d; - out.vz = pz + (d >> 16); - in.vx = *(u16 *)(p1 + 0x3a); - in.vy = *(u16 *)(p1 + 0x3e); - in.vz = *(u16 *)(p1 + 0x42); - if ((((s32 (*)(SVEC *, SVEC *, s32))func_8012CEB0)(&in, &out, 0) & 0x2000) == 0) { - ((void (*)(s32))func_8012ADE4)(p1); - return 1; - } - *(s16 *)(p1 + 6) = out.vx; - *(s16 *)(p1 + 0xa) = out.vy; - *(s16 *)(p1 + 0xe) = out.vz; - return 1; -} +DEFINE_func_8017E404() /* dedup: shared engine-core @0x8017E404 (src/shared) */ diff --git a/src/shared/engine_core.h b/src/shared/engine_core.h index ee5b7b8ea..ebb59453b 100644 --- a/src/shared/engine_core.h +++ b/src/shared/engine_core.h @@ -60394,6 +60394,52 @@ *(s32 *)(param_1 + 0x44) = (s32)svec_out.vz; \ } +#define DEFINE_func_8017E404() \ + extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); \ + extern s32 ratan2(s32, s32); \ + extern void func_8012B0B4(SVEC *, s32, s32); \ + extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); \ + extern void func_8012ADE4(u8 *a0); \ + s32 func_8017E404(s32 param_1, s32 param_2) \ + { \ + register s32 p1 __asm__("$16") = param_1; \ + register s32 p2 __asm__("$17") = param_2; \ + SVEC in; \ + SVEC out; \ + SVEC buf; \ + s32 d; \ + s32 ang; \ + u16 px, pz; \ + s32 a0v; \ + a0v = p1 + 4; \ + __asm__ __volatile__("" : : "r"(p2), "r"(a0v)); \ + if (((s32 (*)(s32, s32))func_8012BC60)(a0v, p2 + 4) >= 0x1000) { \ + return 0; \ + } \ + ang = ratan2((s32)*(s16 *)(p1 + 0xe) - (s32)*(s16 *)(p2 + 0xe), \ + (s32)*(s16 *)(p2 + 6) - (s32)*(s16 *)(p1 + 6)); \ + func_8012B0B4(&buf, (ang - 0x400) & 0xfff, 0x41); \ + d = *(s32 *)&buf; \ + px = *(u16 *)(p2 + 6); \ + out.vx = px; \ + out.vy = *(u16 *)(p2 + 0xa); \ + pz = *(u16 *)(p2 + 0xe); \ + out.vz = pz; \ + out.vx = px + d; \ + out.vz = pz + (d >> 16); \ + in.vx = *(u16 *)(p1 + 0x3a); \ + in.vy = *(u16 *)(p1 + 0x3e); \ + in.vz = *(u16 *)(p1 + 0x42); \ + if ((((s32 (*)(SVEC *, SVEC *, s32))func_8012CEB0)(&in, &out, 0) & 0x2000) == 0) { \ + ((void (*)(s32))func_8012ADE4)(p1); \ + return 1; \ + } \ + *(s16 *)(p1 + 6) = out.vx; \ + *(s16 *)(p1 + 0xa) = out.vy; \ + *(s16 *)(p1 + 0xe) = out.vz; \ + return 1; \ + } + #endif #define DEFINE_func_80128EA8() \ @@ -150193,4 +150239,50 @@ *(s32 *)(param_1 + 0x44) = (s32)svec_out.vz; \ } +#define DEFINE_func_8017E404() \ + extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); \ + extern s32 ratan2(s32, s32); \ + extern void func_8012B0B4(SVEC *, s32, s32); \ + extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); \ + extern void func_8012ADE4(u8 *a0); \ + s32 func_8017E404(s32 param_1, s32 param_2) \ + { \ + register s32 p1 __asm__("$16") = param_1; \ + register s32 p2 __asm__("$17") = param_2; \ + SVEC in; \ + SVEC out; \ + SVEC buf; \ + s32 d; \ + s32 ang; \ + u16 px, pz; \ + s32 a0v; \ + a0v = p1 + 4; \ + __asm__ __volatile__("" : : "r"(p2), "r"(a0v)); \ + if (((s32 (*)(s32, s32))func_8012BC60)(a0v, p2 + 4) >= 0x1000) { \ + return 0; \ + } \ + ang = ratan2((s32)*(s16 *)(p1 + 0xe) - (s32)*(s16 *)(p2 + 0xe), \ + (s32)*(s16 *)(p2 + 6) - (s32)*(s16 *)(p1 + 6)); \ + func_8012B0B4(&buf, (ang - 0x400) & 0xfff, 0x41); \ + d = *(s32 *)&buf; \ + px = *(u16 *)(p2 + 6); \ + out.vx = px; \ + out.vy = *(u16 *)(p2 + 0xa); \ + pz = *(u16 *)(p2 + 0xe); \ + out.vz = pz; \ + out.vx = px + d; \ + out.vz = pz + (d >> 16); \ + in.vx = *(u16 *)(p1 + 0x3a); \ + in.vy = *(u16 *)(p1 + 0x3e); \ + in.vz = *(u16 *)(p1 + 0x42); \ + if ((((s32 (*)(SVEC *, SVEC *, s32))func_8012CEB0)(&in, &out, 0) & 0x2000) == 0) { \ + ((void (*)(s32))func_8012ADE4)(p1); \ + return 1; \ + } \ + *(s16 *)(p1 + 6) = out.vx; \ + *(s16 *)(p1 + 0xa) = out.vy; \ + *(s16 *)(p1 + 0xe) = out.vz; \ + return 1; \ + } + #endif