mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
0b021d1be1
add -> multiply. Fixes https://github.com/open-goal/jak-project/issues/2429
275 lines
16 KiB
C++
275 lines
16 KiB
C++
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak2/kscheme.h"
|
|
using ::jak2::intern_from_c;
|
|
namespace Mips2C::jak2 {
|
|
namespace method_39_nav_state {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
bool cop1_bc = false;
|
|
c->daddiu(sp, sp, -96); // daddiu sp, sp, -96
|
|
c->swc1(f20, 80, sp); // swc1 f20, 80(sp)
|
|
c->swc1(f22, 84, sp); // swc1 f22, 84(sp)
|
|
c->lwc1(f0, 32, a0); // lwc1 f0, 32(a0)
|
|
c->lwu(v1, 4, a0); // lwu v1, 4(a0)
|
|
c->lwc1(f1, 28, v1); // lwc1 f1, 28(v1)
|
|
c->muls(f1, f0, f1); // mul.s f1, f0, f1
|
|
c->daddiu(v1, a0, 48); // daddiu v1, a0, 48
|
|
c->lwc1(f0, 0, v1); // lwc1 f0, 0(v1)
|
|
c->lwc1(f2, 0, v1); // lwc1 f2, 0(v1)
|
|
c->muls(f0, f0, f2); // mul.s f0, f0, f2
|
|
c->lwc1(f2, 8, v1); // lwc1 f2, 8(v1)
|
|
c->lwc1(f3, 8, v1); // lwc1 f3, 8(v1)
|
|
c->muls(f2, f2, f3); // mul.s f2, f2, f3
|
|
c->adds(f0, f0, f2); // add.s f0, f0, f2
|
|
c->sqrts(f0, f0); // sqrt.s f0, f0
|
|
c->mfc1(v1, f0); // mfc1 v1, f0
|
|
c->mtc1(f0, v1); // mtc1 f0, v1
|
|
c->daddiu(v1, sp, 16); // daddiu v1, sp, 16
|
|
c->daddiu(a1, sp, 32); // daddiu a1, sp, 32
|
|
c->lwu(a2, 12, a0); // lwu a2, 12(a0)
|
|
c->lwu(a3, 0, a2); // lwu a3, 0(a2)
|
|
c->lwu(a2, 12, a0); // lwu a2, 12(a0)
|
|
c->lwu(a2, 0, a2); // lwu a2, 0(a2)
|
|
c->lwc1(f2, 28, a2); // lwc1 f2, 28(a2)
|
|
cop1_bc = c->fprs[f2] < c->fprs[f0]; // c.lt.s f2, f0
|
|
bc = !cop1_bc; // bc1f L154
|
|
c->mov64(v0, s7); // or v0, s7, r0
|
|
if (bc) {goto block_6;} // branch non-likely
|
|
|
|
c->mov64(a2, v1); // or a2, v1, r0
|
|
c->daddiu(t0, a0, 48); // daddiu t0, a0, 48
|
|
c->lui(t1, 16256); // lui t1, 16256
|
|
c->mtc1(f2, t1); // mtc1 f2, t1
|
|
c->divs(f2, f2, f0); // div.s f2, f2, f0
|
|
c->lqc2(vf1, 0, t0); // lqc2 vf1, 0(t0)
|
|
c->mfc1(t0, f2); // mfc1 t0, f2
|
|
c->mov128_vf_gpr(vf2, t0); // qmtc2.i vf2, t0
|
|
c->vadd_bc(DEST::w, BC::x, vf1, vf0, vf0); // vaddx.w vf1, vf0, vf0
|
|
c->vmul_bc(DEST::xyz, BC::x, vf1, vf1, vf2); // vmulx.xyz vf1, vf1, vf2
|
|
c->sqc2(vf1, 0, a2); // sqc2 vf1, 0(a2)
|
|
c->mtc1(f2, r0); // mtc1 f2, r0
|
|
c->swc1(f2, 4, v1); // swc1 f2, 4(v1)
|
|
c->mov64(a2, a1); // or a2, a1, r0
|
|
c->lwc1(f2, 16, a3); // lwc1 f2, 16(a3)
|
|
c->cvtws(f1, f1); // cvt.w.s f1, f1
|
|
c->mfc1(a3, f1); // mfc1 a3, f1
|
|
c->dsll32(a3, a3, 16); // dsll32 a3, a3, 16
|
|
c->dsra32(a3, a3, 16); // dsra32 a3, a3, 16
|
|
c->mtc1(f1, a3); // mtc1 f1, a3
|
|
c->cvtsw(f1, f1); // cvt.s.w f1, f1
|
|
c->muls(f1, f2, f1); // mul.s f1, f2, f1
|
|
c->lui(a3, 16255); // lui a3, 16255
|
|
c->lui(t0, -16854); // lui t0, -16854
|
|
c->ori(a3, a3, 65502); // ori a3, a3, 65502
|
|
c->ori(t0, t0, 43253); // ori t0, t0, 43253
|
|
c->subs(f22, f22, f22); // sub.s f22, f22, f22
|
|
c->lui(t1, 15368); // lui t1, 15368
|
|
c->mtc1(f10, a3); // mtc1 f10, a3
|
|
c->ori(a3, t1, 27638); // ori a3, t1, 27638
|
|
c->mtc1(f11, t0); // mtc1 f11, t0
|
|
c->lui(t0, -18099); // lui t0, -18099
|
|
c->muls(f2, f1, f1); // mul.s f2, f1, f1
|
|
c->ori(t0, t0, 8306); // ori t0, t0, 8306
|
|
c->mtc1(f12, a3); // mtc1 f12, a3
|
|
c->lui(a3, 13850); // lui a3, 13850
|
|
c->mtc1(f14, t0); // mtc1 f14, t0
|
|
c->ori(t0, a3, 41599); // ori t0, a3, 41599
|
|
// Unknown instr: mula.s f1, f10
|
|
float acc;
|
|
acc = c->fprs[f1] * c->fprs[f10];
|
|
c->lui(a3, 16256); // lui a3, 16256
|
|
c->muls(f3, f2, f1); // mul.s f3, f2, f1
|
|
c->mov64(a3, a3); // or a3, a3, r0
|
|
c->muls(f4, f2, f2); // mul.s f4, f2, f2
|
|
c->lui(t1, -16641); // lui t1, -16641
|
|
c->mtc1(f15, t0); // mtc1 f15, t0
|
|
c->lui(t0, -16641); // lui t0, -16641
|
|
c->or_(t0, t1, t0); // or t0, t1, t0
|
|
c->mtc1(f16, a3); // mtc1 f16, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mtc1(f17, t0); // mtc1 f17, t0
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f5, f3, f2); // mul.s f5, f3, f2
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f6, f3, f3); // mul.s f6, f3, f3
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f7, f4, f3); // mul.s f7, f4, f3
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f8, f4, f4); // mul.s f8, f4, f4
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f9, f5, f4); // mul.s f9, f5, f4
|
|
c->lui(a3, 15658); // lui a3, 15658
|
|
// Unknown instr: madda.s f3, f11
|
|
acc += c->fprs[f3] * c->fprs[f11];
|
|
c->ori(a3, a3, 31272); // ori a3, a3, 31272
|
|
// Unknown instr: madda.s f5, f12
|
|
acc += c->fprs[f5] * c->fprs[f12];
|
|
c->lui(t0, -17742); // lui t0, -17742
|
|
// Unknown instr: madda.s f7, f14
|
|
acc += c->fprs[f7] * c->fprs[f14];
|
|
c->ori(t0, t0, 48177); // ori t0, t0, 48177
|
|
// Unknown instr: madd.s f21, f9, f15
|
|
c->fprs[f21] = acc + (c->fprs[f9] * c->fprs[f15]);
|
|
c->lui(t1, 14249); // lui t1, 14249
|
|
c->mtc1(f18, a3); // mtc1 f18, a3
|
|
c->ori(a3, t1, 13291); // ori a3, t1, 13291
|
|
c->mtc1(f19, t0); // mtc1 f19, t0
|
|
// nop // sll r0, r0, 0
|
|
c->mtc1(f20, a3); // mtc1 f20, a3
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: mula.s f16, f16
|
|
acc = c->fprs[f16] * c->fprs[f16];
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: madda.s f2, f17
|
|
acc += c->fprs[f2] * c->fprs[f17];
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: madda.s f4, f18
|
|
acc += c->fprs[f4] * c->fprs[f18];
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: madda.s f6, f19
|
|
acc += c->fprs[f6] * c->fprs[f19];
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: madd.s f22, f8, f20
|
|
c->fprs[f22] = acc + (c->fprs[f8] * c->fprs[f20]);
|
|
// nop // sll r0, r0, 0
|
|
c->swc1(f21, 0, a2); // swc1 f21, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->swc1(f22, 4, a2); // swc1 f22, 4(a2)
|
|
c->gprs[a2].du64[0] = 0; // or a2, r0, r0
|
|
c->mov64(a3, v1); // or a3, v1, r0
|
|
c->daddiu(a2, a0, 144); // daddiu a2, a0, 144
|
|
c->lwc1(f1, 0, a3); // lwc1 f1, 0(a3)
|
|
c->lwc1(f2, 4, a3); // lwc1 f2, 4(a3)
|
|
c->lwc1(f3, 8, a3); // lwc1 f3, 8(a3)
|
|
c->lwc1(f4, 0, a2); // lwc1 f4, 0(a2)
|
|
c->lwc1(f5, 4, a2); // lwc1 f5, 4(a2)
|
|
c->lwc1(f6, 8, a2); // lwc1 f6, 8(a2)
|
|
// Unknown instr: mula.s f1, f4
|
|
// Unknown instr: madda.s f2, f5
|
|
// Unknown instr: madd.s f1, f3, f6
|
|
c->fprs[f1] = (c->fprs[f3] * c->fprs[f6]) + (c->fprs[f2] * c->fprs[f5]) + (c->fprs[f1] * c->fprs[f4]);
|
|
c->mfc1(a2, f1); // mfc1 a2, f1
|
|
c->mtc1(f1, a2); // mtc1 f1, a2
|
|
c->lwc1(f2, 4, a1); // lwc1 f2, 4(a1)
|
|
cop1_bc = c->fprs[f1] < c->fprs[f2]; // c.lt.s f1, f2
|
|
bc = !cop1_bc; // bc1f L154
|
|
c->mov64(v0, s7); // or v0, s7, r0
|
|
if (bc) {goto block_6;} // branch non-likely
|
|
|
|
c->daddiu(a2, sp, 48); // daddiu a2, sp, 48
|
|
c->daddiu(a3, sp, 64); // daddiu a3, sp, 64
|
|
c->mov64(t0, a2); // or t0, a2, r0
|
|
c->daddiu(t1, a0, 144); // daddiu t1, a0, 144
|
|
c->lwc1(f1, 0, a1); // lwc1 f1, 0(a1)
|
|
c->lwc1(f3, 4, a1); // lwc1 f3, 4(a1)
|
|
c->lwc1(f2, 0, t1); // lwc1 f2, 0(t1)
|
|
c->lwc1(f4, 8, t1); // lwc1 f4, 8(t1)
|
|
c->muls(f5, f3, f2); // mul.s f5, f3, f2
|
|
c->muls(f6, f1, f4); // mul.s f6, f1, f4
|
|
c->adds(f5, f5, f6); // add.s f5, f5, f6
|
|
c->swc1(f5, 0, t0); // swc1 f5, 0(t0)
|
|
c->lwc1(f5, 4, t1); // lwc1 f5, 4(t1)
|
|
c->swc1(f5, 4, t0); // swc1 f5, 4(t0)
|
|
c->muls(f3, f3, f4); // mul.s f3, f3, f4
|
|
c->muls(f1, f1, f2); // mul.s f1, f1, f2
|
|
c->subs(f1, f3, f1); // sub.s f1, f3, f1
|
|
c->swc1(f1, 8, t0); // swc1 f1, 8(t0)
|
|
c->mfc1(t0, f1); // mfc1 t0, f1
|
|
c->mov64(t0, a3); // or t0, a3, r0
|
|
c->daddiu(t1, a0, 144); // daddiu t1, a0, 144
|
|
c->lwc1(f1, 0, a1); // lwc1 f1, 0(a1)
|
|
c->negs(f1, f1); // neg.s f1, f1
|
|
c->lwc1(f3, 4, a1); // lwc1 f3, 4(a1)
|
|
c->lwc1(f2, 0, t1); // lwc1 f2, 0(t1)
|
|
c->lwc1(f4, 8, t1); // lwc1 f4, 8(t1)
|
|
c->muls(f5, f3, f2); // mul.s f5, f3, f2
|
|
c->muls(f6, f1, f4); // mul.s f6, f1, f4
|
|
c->adds(f5, f5, f6); // add.s f5, f5, f6
|
|
c->swc1(f5, 0, t0); // swc1 f5, 0(t0)
|
|
c->lwc1(f5, 4, t1); // lwc1 f5, 4(t1)
|
|
c->swc1(f5, 4, t0); // swc1 f5, 4(t0)
|
|
c->muls(f3, f3, f4); // mul.s f3, f3, f4
|
|
c->muls(f1, f1, f2); // mul.s f1, f1, f2
|
|
c->subs(f1, f3, f1); // sub.s f1, f3, f1
|
|
c->swc1(f1, 8, t0); // swc1 f1, 8(t0)
|
|
c->mfc1(a1, f1); // mfc1 a1, f1
|
|
c->mov64(t0, a2); // or t0, a2, r0
|
|
c->mov64(a1, v1); // or a1, v1, r0
|
|
c->lwc1(f1, 0, t0); // lwc1 f1, 0(t0)
|
|
c->lwc1(f2, 4, t0); // lwc1 f2, 4(t0)
|
|
c->lwc1(f3, 8, t0); // lwc1 f3, 8(t0)
|
|
c->lwc1(f4, 0, a1); // lwc1 f4, 0(a1)
|
|
c->lwc1(f5, 4, a1); // lwc1 f5, 4(a1)
|
|
c->lwc1(f6, 8, a1); // lwc1 f6, 8(a1)
|
|
// Unknown instr: mula.s f1, f4
|
|
// Unknown instr: madda.s f2, f5
|
|
// Unknown instr: madd.s f1, f3, f6
|
|
c->fprs[f1] = (c->fprs[f3] * c->fprs[f6]) + (c->fprs[f2] * c->fprs[f5]) + (c->fprs[f1] * c->fprs[f4]);
|
|
c->mfc1(a1, f1); // mfc1 a1, f1
|
|
c->mtc1(f1, a1); // mtc1 f1, a1
|
|
c->mov64(t0, a3); // or t0, a3, r0
|
|
c->mov64(a1, v1); // or a1, v1, r0
|
|
c->lwc1(f2, 0, t0); // lwc1 f2, 0(t0)
|
|
c->lwc1(f3, 4, t0); // lwc1 f3, 4(t0)
|
|
c->lwc1(f4, 8, t0); // lwc1 f4, 8(t0)
|
|
c->lwc1(f5, 0, a1); // lwc1 f5, 0(a1)
|
|
c->lwc1(f6, 4, a1); // lwc1 f6, 4(a1)
|
|
c->lwc1(f7, 8, a1); // lwc1 f7, 8(a1)
|
|
// Unknown instr: mula.s f2, f5
|
|
// Unknown instr: madda.s f3, f6
|
|
// Unknown instr: madd.s f2, f4, f7
|
|
c->fprs[f2] = (c->fprs[f4] * c->fprs[f7]) + (c->fprs[f3] * c->fprs[f6]) + (c->fprs[f2] * c->fprs[f5]);
|
|
c->mfc1(a1, f2); // mfc1 a1, f2
|
|
c->mtc1(f2, a1); // mtc1 f2, a1
|
|
cop1_bc = c->fprs[f2] < c->fprs[f1]; // c.lt.s f2, f1
|
|
bc = !cop1_bc; // bc1f L152
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_4;} // branch non-likely
|
|
|
|
c->mov64(a1, v1); // or a1, v1, r0
|
|
c->lq(a2, 0, a2); // lq a2, 0(a2)
|
|
c->sq(a2, 0, a1); // sq a2, 0(a1)
|
|
//beq r0, r0, L153 // beq r0, r0, L153
|
|
// nop // sll r0, r0, 0
|
|
goto block_5; // branch always
|
|
|
|
|
|
block_4:
|
|
c->mov64(a1, v1); // or a1, v1, r0
|
|
c->lq(a2, 0, a3); // lq a2, 0(a3)
|
|
c->sq(a2, 0, a1); // sq a2, 0(a1)
|
|
|
|
block_5:
|
|
c->daddiu(a0, a0, 48); // daddiu a0, a0, 48
|
|
c->lqc2(vf1, 0, v1); // lqc2 vf1, 0(v1)
|
|
c->mfc1(v1, f0); // mfc1 v1, f0
|
|
c->mov128_vf_gpr(vf2, v1); // qmtc2.i vf2, v1
|
|
c->vadd_bc(DEST::w, BC::x, vf1, vf0, vf0); // vaddx.w vf1, vf0, vf0
|
|
c->vmul_bc(DEST::xyz, BC::x, vf1, vf1, vf2); // vmulx.xyz vf1, vf1, vf2
|
|
c->sqc2(vf1, 0, a0); // sqc2 vf1, 0(a0)
|
|
c->daddiu(v0, s7, 4); // daddiu v0, s7, #t
|
|
|
|
block_6:
|
|
c->lwc1(f22, 84, sp); // lwc1 f22, 84(sp)
|
|
c->lwc1(f20, 80, sp); // lwc1 f20, 80(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 96); // daddiu sp, sp, 96
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("(method 39 nav-state)", execute, 96);
|
|
}
|
|
|
|
} // namespace method_39_nav_state
|
|
} // namespace Mips2C
|