jak-project/game/mips2c/jak2_functions/squid.cpp

393 lines
27 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_53_squid {
struct Cache {
void* default_dead_pool; // *default-dead-pool*
void* game_info; // *game-info*
void* rand_vu_float_range; // rand-vu-float-range
void* spawn_projectile; // spawn-projectile
void* squid_increment_shield; // squid-increment-shield
void* squid_shot; // squid-shot
void* tan; // tan
void* vector_flatten; // vector-flatten!
void* vector_normalize; // vector-normalize!
void* vector_cspace; // vector<-cspace!
} cache;
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
bool cop1_bc = false;
c->daddiu(sp, sp, -336); // daddiu sp, sp, -336
c->sd(ra, 0, sp); // sd ra, 0(sp)
c->sq(s1, 224, sp); // sq s1, 224(sp)
c->sq(s2, 240, sp); // sq s2, 240(sp)
c->sq(s3, 256, sp); // sq s3, 256(sp)
c->sq(s4, 272, sp); // sq s4, 272(sp)
c->sq(s5, 288, sp); // sq s5, 288(sp)
c->sq(gp, 304, sp); // sq gp, 304(sp)
c->swc1(f24, 320, sp); // swc1 f24, 320(sp)
c->swc1(f26, 324, sp); // swc1 f26, 324(sp)
c->swc1(f28, 328, sp); // swc1 f28, 328(sp)
c->swc1(f30, 332, sp); // swc1 f30, 332(sp)
c->mov64(gp, a0); // or gp, a0, r0
c->mov64(s4, a1); // or s4, a1, r0
c->load_symbol2(t9, cache.squid_increment_shield);// lw t9, squid-increment-shield(s7)
c->lui(v1, -17393); // lui v1, -17393
c->ori(a0, v1, 47140); // ori a0, v1, 47140
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->load_symbol2(t9, cache.vector_cspace); // lw t9, vector<-cspace!(s7)
c->daddiu(a0, sp, 16); // daddiu a0, sp, 16
c->dsll(v1, s4, 5); // dsll v1, s4, 5
c->daddiu(v1, v1, 12); // daddiu v1, v1, 12
c->lwu(a1, 128, gp); // lwu a1, 128(gp)
c->daddu(a1, v1, a1); // daddu a1, v1, a1
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mov64(s2, v0); // or s2, v0, r0
c->daddiu(s5, sp, 32); // daddiu s5, sp, 32
c->lwu(v1, 128, gp); // lwu v1, 128(gp)
c->dsll(a0, s4, 5); // dsll a0, s4, 5
c->daddu(v1, v1, a0); // daddu v1, v1, a0
c->lwu(v1, 28, v1); // lwu v1, 28(v1)
c->daddu(a2, r0, v1); // daddu a2, r0, v1
c->lq(v1, 0, a2); // lq v1, 0(a2)
c->lq(a0, 16, a2); // lq a0, 16(a2)
c->lq(a1, 32, a2); // lq a1, 32(a2)
c->lq(a2, 48, a2); // lq a2, 48(a2)
c->sq(v1, 0, s5); // sq v1, 0(s5)
c->sq(a0, 16, s5); // sq a0, 16(s5)
c->sq(a1, 32, s5); // sq a1, 32(s5)
c->sq(a2, 48, s5); // sq a2, 48(s5)
c->mov64(a0, gp); // or a0, gp, r0
c->lwu(v1, -4, a0); // lwu v1, -4(a0)
c->lwu(t9, 184, v1); // lwu t9, 184(v1)
c->daddiu(a1, sp, 96); // daddiu a1, sp, 96
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mov64(s3, v0); // or s3, v0, r0
c->mov64(a1, s3); // or a1, s3, r0
c->mov64(v1, s3); // or v1, s3, r0
c->mov64(a0, s2); // or a0, s2, r0
c->lqc2(vf4, 0, v1); // lqc2 vf4, 0(v1)
c->lqc2(vf5, 0, a0); // lqc2 vf5, 0(a0)
c->vmove(DEST::w, vf6, vf0); // vmove.w vf6, vf0
c->vsub(DEST::xyz, vf6, vf4, vf5); // vsub.xyz vf6, vf4, vf5
c->sqc2(vf6, 0, a1); // sqc2 vf6, 0(a1)
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
c->daddu(a0, r0, s5); // daddu a0, r0, s5
c->lui(a1, 16256); // lui a1, 16256
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
c->daddiu(a0, s5, 16); // daddiu a0, s5, 16
c->lui(a1, 16256); // lui a1, 16256
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
c->daddiu(a0, s5, 32); // daddiu a0, s5, 32
c->lui(a1, 16256); // lui a1, 16256
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->lui(v1, 18800); // lui v1, 18800
c->mtc1(f0, v1); // mtc1 f0, v1
c->lui(v1, 18176); // lui v1, 18176
c->mtc1(f1, v1); // mtc1 f1, v1
c->mov64(a0, s3); // or a0, s3, r0
c->daddiu(v1, s5, 16); // daddiu v1, s5, 16
c->lwc1(f2, 0, a0); // lwc1 f2, 0(a0)
c->lwc1(f3, 4, a0); // lwc1 f3, 4(a0)
c->lwc1(f4, 8, a0); // lwc1 f4, 8(a0)
c->lwc1(f5, 0, v1); // lwc1 f5, 0(v1)
c->lwc1(f6, 4, v1); // lwc1 f6, 4(v1)
c->lwc1(f7, 8, v1); // lwc1 f7, 8(v1)
// 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(v1, f2); // mfc1 v1, f2
c->mtc1(f2, v1); // mtc1 f2, v1
c->maxs(f1, f1, f2); // max.s f1, f1, f2
c->divs(f30, f0, f1); // div.s f30, f0, f1
c->daddiu(s4, sp, 112); // daddiu s4, sp, 112
c->lwu(v1, 52, gp); // lwu v1, 52(gp)
c->sw(v1, 0, s4); // sw v1, 0(s4)
c->lui(v1, 16256); // lui v1, 16256
c->mtc1(f0, v1); // mtc1 f0, v1
c->swc1(f0, 4, s4); // swc1 f0, 4(s4)
c->addiu(v1, r0, 8192); // addiu v1, r0, 8192
c->sd(v1, 16, s4); // sd v1, 16(s4)
c->daddiu(v1, s4, 48); // daddiu v1, s4, 48
c->lq(a0, 0, s2); // lq a0, 0(s2)
c->sq(a0, 0, v1); // sq a0, 0(v1)
c->mov64(a0, gp); // or a0, gp, r0
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L2
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_2;} // branch non-likely
c->lwu(v1, 24, a0); // lwu v1, 24(a0)
block_2:
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L3
// nop // sll r0, r0, 0
if (bc) {goto block_4;} // branch non-likely
c->lwu(a0, 0, v1); // lwu a0, 0(v1)
c->lw(a0, 40, a0); // lw a0, 40(a0)
c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0
//beq r0, r0, L4 // beq r0, r0, L4
// nop // sll r0, r0, 0
goto block_5; // branch always
block_4:
c->addiu(a0, r0, 0); // addiu a0, r0, 0
block_5:
c->sllv(v1, v1, r0); // sllv v1, v1, r0
c->or_(v1, a0, v1); // or v1, a0, v1
c->sd(v1, 24, s4); // sd v1, 24(s4)
c->sd(s7, 32, s4); // sd s7, 32(s4)
c->mov64(a0, gp); // or a0, gp, r0
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L5
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_7;} // branch non-likely
c->lwu(v1, 24, a0); // lwu v1, 24(a0)
block_7:
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L6
// nop // sll r0, r0, 0
if (bc) {goto block_9;} // branch non-likely
c->lwu(a0, 0, v1); // lwu a0, 0(v1)
c->lw(a0, 40, a0); // lw a0, 40(a0)
c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0
//beq r0, r0, L7 // beq r0, r0, L7
// nop // sll r0, r0, 0
goto block_10; // branch always
block_9:
c->addiu(a0, r0, 0); // addiu a0, r0, 0
block_10:
c->sllv(v1, v1, r0); // sllv v1, v1, r0
c->or_(v1, a0, v1); // or v1, a0, v1
c->sd(v1, 40, s4); // sd v1, 40(s4)
c->load_symbol2(v1, cache.game_info); // lw v1, *game-info*(s7)
c->lwu(a0, 224, v1); // lwu a0, 224(v1)
c->daddiu(a0, a0, 1); // daddiu a0, a0, 1
c->sw(a0, 224, v1); // sw a0, 224(v1)
c->sw(a0, 8, s4); // sw a0, 8(s4)
c->addiu(v1, r0, 1200); // addiu v1, r0, 1200
c->sd(v1, 80, s4); // sd v1, 80(s4)
c->daddiu(v1, s4, 64); // daddiu v1, s4, 64
c->daddiu(a0, s5, 16); // daddiu a0, s5, 16
c->lui(a1, 18800); // lui a1, 18800
c->mtc1(f0, a1); // mtc1 f0, a1
c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0)
c->mfc1(a0, f0); // mfc1 a0, f0
c->mov128_vf_gpr(vf2, a0); // qmtc2.i vf2, a0
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, v1); // sqc2 vf1, 0(v1)
c->load_symbol2(t9, cache.vector_flatten); // lw t9, vector-flatten!(s7)
c->daddiu(a0, sp, 208); // daddiu a0, sp, 208
c->daddiu(a2, s5, 32); // daddiu a2, s5, 32
c->mov64(a1, s3); // or a1, s3, r0
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mov64(a0, v0); // or a0, v0, r0
c->daddu(v1, r0, s5); // daddu v1, r0, s5
c->lwc1(f0, 0, a0); // lwc1 f0, 0(a0)
c->lwc1(f1, 4, a0); // lwc1 f1, 4(a0)
c->lwc1(f2, 8, a0); // lwc1 f2, 8(a0)
c->lwc1(f3, 0, v1); // lwc1 f3, 0(v1)
c->lwc1(f4, 4, v1); // lwc1 f4, 4(v1)
c->lwc1(f5, 8, v1); // lwc1 f5, 8(v1)
// Unknown instr: mula.s f0, f3
// Unknown instr: madda.s f1, f4
// Unknown instr: madd.s f0, f2, f5
c->fprs[f0] = (c->fprs[f2] * c->fprs[f5]) + (c->fprs[f1] * c->fprs[f4]) + (c->fprs[f0] * c->fprs[f3]);
c->mfc1(v1, f0); // mfc1 v1, f0
c->mtc1(f0, v1); // mtc1 f0, v1
c->mtc1(f1, r0); // mtc1 f1, r0
cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0
bc = !cop1_bc; // bc1f L8
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_12;} // branch non-likely
c->addiu(v1, r0, 0); // addiu v1, r0, 0
c->lui(a0, -14976); // lui a0, -14976
c->mtc1(f1, a0); // mtc1 f1, a0
c->adds(f0, f1, f0); // add.s f0, f1, f0
c->mfc1(a0, f0); // mfc1 a0, f0
c->mtc1(f0, a0); // mtc1 f0, a0
c->cvtws(f0, f0); // cvt.w.s f0, f0
c->mfc1(a1, f0); // mfc1 a1, f0
c->slt(a1, v1, a1); // slt a1, v1, a1
c->movn(v1, a0, a1); // movn v1, a0, a1
c->mtc1(f0, v1); // mtc1 f0, v1
c->mfc1(v1, f0); // mfc1 v1, f0
//beq r0, r0, L9 // beq r0, r0, L9
// nop // sll r0, r0, 0
goto block_14; // branch always
block_12:
c->mtc1(f1, r0); // mtc1 f1, r0
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
bc = !cop1_bc; // bc1f L9
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_14;} // branch non-likely
c->addiu(v1, r0, 0); // addiu v1, r0, 0
c->lui(a0, 17792); // lui a0, 17792
c->mtc1(f1, a0); // mtc1 f1, a0
c->adds(f0, f1, f0); // add.s f0, f1, f0
c->mfc1(a0, f0); // mfc1 a0, f0
c->mtc1(f0, a0); // mtc1 f0, a0
c->cvtws(f0, f0); // cvt.w.s f0, f0
c->mfc1(a1, f0); // mfc1 a1, f0
c->slt(a1, v1, a1); // slt a1, v1, a1
c->movz(v1, a0, a1); // movz v1, a0, a1
c->mtc1(f0, v1); // mtc1 f0, v1
c->mfc1(v1, f0); // mfc1 v1, f0
block_14:
c->muls(f28, f0, f30); // mul.s f28, f0, f30
c->lui(v1, 18800); // lui v1, 18800
c->mtc1(f26, v1); // mtc1 f26, v1
c->load_symbol2(t9, cache.tan); // lw t9, tan(s7)
c->lui(v1, 17507); // lui v1, 17507
c->ori(a0, v1, 36409); // ori a0, v1, 36409
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mtc1(f0, v0); // mtc1 f0, v0
c->muls(f26, f26, f0); // mul.s f26, f26, f0
c->lui(v1, 18800); // lui v1, 18800
c->mtc1(f24, v1); // mtc1 f24, v1
c->load_symbol2(t9, cache.tan); // lw t9, tan(s7)
c->lui(v1, 17507); // lui v1, 17507
c->ori(a0, v1, 36409); // ori a0, v1, 36409
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mtc1(f0, v0); // mtc1 f0, v0
c->muls(f0, f24, f0); // mul.s f0, f24, f0
c->negs(f0, f0); // neg.s f0, f0
c->maxs(f0, f0, f28); // max.s f0, f0, f28
c->mins(f0, f26, f0); // min.s f0, f26, f0
c->daddiu(v1, s4, 64); // daddiu v1, s4, 64
c->daddiu(a0, s4, 64); // daddiu a0, s4, 64
c->daddu(a1, r0, s5); // daddu a1, r0, s5
c->lqc2(vf2, 0, a1); // lqc2 vf2, 0(a1)
c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0)
c->mfc1(a0, f0); // mfc1 a0, f0
c->mov128_vf_gpr(vf3, a0); // qmtc2.i vf3, a0
c->vadd_bc(DEST::w, BC::x, vf4, vf0, vf0); // vaddx.w vf4, vf0, vf0
c->vmula_bc(DEST::xyzw, BC::x, vf2, vf3); // vmulax.xyzw acc, vf2, vf3
c->vmadd_bc(DEST::xyz, BC::w, vf4, vf1, vf0); // vmaddw.xyz vf4, vf1, vf0
c->sqc2(vf4, 0, v1); // sqc2 vf4, 0(v1)
c->lui(v1, 17664); // lui v1, 17664
c->mtc1(f0, v1); // mtc1 f0, v1
c->muls(f30, f0, f30); // mul.s f30, f0, f30
c->daddiu(s3, s4, 64); // daddiu s3, s4, 64
c->daddiu(s2, s4, 64); // daddiu s2, s4, 64
c->daddu(s1, r0, s5); // daddu s1, r0, s5
c->load_symbol2(t9, cache.rand_vu_float_range); // lw t9, rand-vu-float-range(s7)
c->negs(f0, f30); // neg.s f0, f30
c->mfc1(a0, f0); // mfc1 a0, f0
c->mfc1(a1, f30); // mfc1 a1, f30
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mtc1(f0, v0); // mtc1 f0, v0
c->lqc2(vf2, 0, s1); // lqc2 vf2, 0(s1)
c->lqc2(vf1, 0, s2); // lqc2 vf1, 0(s2)
c->mfc1(v1, f0); // mfc1 v1, f0
c->mov128_vf_gpr(vf3, v1); // qmtc2.i vf3, v1
c->vadd_bc(DEST::w, BC::x, vf4, vf0, vf0); // vaddx.w vf4, vf0, vf0
c->vmula_bc(DEST::xyzw, BC::x, vf2, vf3); // vmulax.xyzw acc, vf2, vf3
c->vmadd_bc(DEST::xyz, BC::w, vf4, vf1, vf0); // vmaddw.xyz vf4, vf1, vf0
c->sqc2(vf4, 0, s3); // sqc2 vf4, 0(s3)
c->daddiu(s3, s4, 64); // daddiu s3, s4, 64
c->daddiu(s2, s4, 64); // daddiu s2, s4, 64
c->daddiu(s5, s5, 32); // daddiu s5, s5, 32
c->load_symbol2(t9, cache.rand_vu_float_range); // lw t9, rand-vu-float-range(s7)
c->negs(f0, f30); // neg.s f0, f30
c->mfc1(a0, f0); // mfc1 a0, f0
c->mfc1(a1, f30); // mfc1 a1, f30
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mtc1(f0, v0); // mtc1 f0, v0
c->lqc2(vf2, 0, s5); // lqc2 vf2, 0(s5)
c->lqc2(vf1, 0, s2); // lqc2 vf1, 0(s2)
c->mfc1(v1, f0); // mfc1 v1, f0
c->mov128_vf_gpr(vf3, v1); // qmtc2.i vf3, v1
c->vadd_bc(DEST::w, BC::x, vf4, vf0, vf0); // vaddx.w vf4, vf0, vf0
c->vmula_bc(DEST::xyzw, BC::x, vf2, vf3); // vmulax.xyzw acc, vf2, vf3
c->vmadd_bc(DEST::xyz, BC::w, vf4, vf1, vf0); // vmaddw.xyz vf4, vf1, vf0
c->sqc2(vf4, 0, s3); // sqc2 vf4, 0(s3)
c->load_symbol2(t9, cache.spawn_projectile); // lw t9, spawn-projectile(s7)
c->load_symbol2(a0, cache.squid_shot); // lw a0, squid-shot(s7)
c->load_symbol2(a3, cache.default_dead_pool); // lw a3, *default-dead-pool*(s7)
c->mov64(a1, s4); // or a1, s4, r0
c->mov64(a2, gp); // or a2, gp, r0
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->ld(ra, 0, sp); // ld ra, 0(sp)
c->lwc1(f30, 332, sp); // lwc1 f30, 332(sp)
c->lwc1(f28, 328, sp); // lwc1 f28, 328(sp)
c->lwc1(f26, 324, sp); // lwc1 f26, 324(sp)
c->lwc1(f24, 320, sp); // lwc1 f24, 320(sp)
c->lq(gp, 304, sp); // lq gp, 304(sp)
c->lq(s5, 288, sp); // lq s5, 288(sp)
c->lq(s4, 272, sp); // lq s4, 272(sp)
c->lq(s3, 256, sp); // lq s3, 256(sp)
c->lq(s2, 240, sp); // lq s2, 240(sp)
c->lq(s1, 224, sp); // lq s1, 224(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 336); // daddiu sp, sp, 336
goto end_of_function; // return
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.default_dead_pool = intern_from_c("*default-dead-pool*").c();
cache.game_info = intern_from_c("*game-info*").c();
cache.rand_vu_float_range = intern_from_c("rand-vu-float-range").c();
cache.spawn_projectile = intern_from_c("spawn-projectile").c();
cache.squid_increment_shield = intern_from_c("squid-increment-shield").c();
cache.squid_shot = intern_from_c("squid-shot").c();
cache.tan = intern_from_c("tan").c();
cache.vector_flatten = intern_from_c("vector-flatten!").c();
cache.vector_normalize = intern_from_c("vector-normalize!").c();
cache.vector_cspace = intern_from_c("vector<-cspace!").c();
gLinkedFunctionTable.reg("(method 53 squid)", execute, 512);
}
} // namespace method_53_squid
} // namespace Mips2C