mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-08 01:34:14 -04:00
phase-36: S104 s104_e30 — func_801836D4 banked at 0 through the whole-object gate + propagated — 2 pins → 0: the test + copy in each case on a case-local tw (cse.c:4836; local-alloc.c:1486-1500)
This commit is contained in:
@@ -7046,13 +7046,10 @@ void func_801835B0(s32 a0)
|
||||
*/
|
||||
s32 func_801836D4(void *a0, void *a1) {
|
||||
s16 buf[16]; /* dead-store scratch: forces frame 0x28 */
|
||||
register u16 b __asm__("$3"); // !FAKE: pin $3 — NEEDED DIFFERS (P36 rung B t3_tus1)
|
||||
u16 a;
|
||||
s16 diff;
|
||||
s16 v1;
|
||||
register s32 tw __asm__("$2"); /* SImode -> lh */ // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B t3_tus1)
|
||||
s16 t16; /* HImode copy of tw -> addu $a1,$v0,$0 */
|
||||
s16 xr; /* xor result back in $v0 */
|
||||
s16 t16;
|
||||
s16 xr;
|
||||
|
||||
if (*(s16 *)((s32)a0 + 0xEA) != 0) {
|
||||
*(s16 *)((s32)a0 + 0xEA) = *(s16 *)((s32)a0 + 0xEA) - 1;
|
||||
@@ -7060,33 +7057,46 @@ s32 func_801836D4(void *a0, void *a1) {
|
||||
|
||||
v1 = *(s16 *)((s32)a0 + 0xE2);
|
||||
switch (v1) {
|
||||
case 0:
|
||||
a = *(u16 *)((s32)a0 + 0xE4);
|
||||
b = *(u16 *)((s32)a1 + 0x6);
|
||||
diff = a - b;
|
||||
case 0: {
|
||||
s32 tw;
|
||||
|
||||
diff = *(u16 *)((s32)a0 + 0xE4) - *(u16 *)((s32)a1 + 0x6);
|
||||
buf[0] = diff;
|
||||
tw = *(s16 *)((s32)a0 + 0xEC);
|
||||
t16 = tw;
|
||||
if (tw == 0) {
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
a = *(u16 *)((s32)a0 + 0xE6);
|
||||
b = *(u16 *)((s32)a1 + 0xA);
|
||||
diff = a - b;
|
||||
}
|
||||
case 1: {
|
||||
s32 tw;
|
||||
|
||||
diff = *(u16 *)((s32)a0 + 0xE6) - *(u16 *)((s32)a1 + 0xA);
|
||||
buf[1] = diff;
|
||||
tw = *(s16 *)((s32)a0 + 0xEE);
|
||||
t16 = tw;
|
||||
if (tw == 0) {
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
a = *(u16 *)((s32)a0 + 0xE8);
|
||||
b = *(u16 *)((s32)a1 + 0xE);
|
||||
diff = a - b;
|
||||
}
|
||||
case 2: {
|
||||
s32 tw;
|
||||
|
||||
diff = *(u16 *)((s32)a0 + 0xE8) - *(u16 *)((s32)a1 + 0xE);
|
||||
buf[2] = diff;
|
||||
tw = *(s16 *)((s32)a0 + 0xF0);
|
||||
t16 = tw;
|
||||
if (tw == 0) {
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
goto default_case;
|
||||
}
|
||||
|
||||
if (tw == 0) goto ret1;
|
||||
t16 = tw;
|
||||
if (diff == 0) goto ret1;
|
||||
xr = diff ^ t16;
|
||||
if (xr >= 0) goto default_case;
|
||||
|
||||
Reference in New Issue
Block a user