mirror of
https://github.com/open-goal/jak-project
synced 2026-07-03 21:10:50 -04:00
93afb02cf4
This includes all the collision stuff needed to spawn `target`, decompiles the sparticle code and adds some of the PC hacks needed for merc to run (it doesn't work quite right and looks bad, likely due to a combination of code copied from Jak 2 and the time of day hacks). There are a bunch of temporary hacks (see commits) in place to prevent the game from crashing quite as much, but it is still extremely prone to doing so due to lots of missing functions/potentially bad decomp. --------- Co-authored-by: water <awaterford111445@gmail.com>
719 lines
46 KiB
C++
719 lines
46 KiB
C++
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_12_collide_mesh {
|
|
struct Cache {
|
|
void* closest_pt_in_triangle; // closest-pt-in-triangle
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
bool cop1_bc = false;
|
|
c->daddiu(sp, sp, -160); // daddiu sp, sp, -160
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->sq(s1, 64, sp); // sq s1, 64(sp)
|
|
c->sq(s2, 80, sp); // sq s2, 80(sp)
|
|
c->sq(s3, 96, sp); // sq s3, 96(sp)
|
|
c->sq(s4, 112, sp); // sq s4, 112(sp)
|
|
c->sq(s5, 128, sp); // sq s5, 128(sp)
|
|
c->sq(gp, 144, sp); // sq gp, 144(sp)
|
|
c->mov64(gp, a2); // or gp, a2, r0
|
|
c->mov64(s5, a3); // or s5, a3, r0
|
|
c->mov64(s3, t0); // or s3, t0, r0
|
|
c->daddiu(s4, sp, 16); // daddiu s4, sp, 16
|
|
c->lui(v1, 17141); // lui v1, 17141
|
|
c->ori(v1, v1, 49807); // ori v1, v1, 49807
|
|
// nop // sll r0, r0, 0
|
|
c->mov64(s2, a1); // or s2, a1, r0
|
|
c->lqc2(vf3, 0, s5); // lqc2 vf3, 0(s5)
|
|
c->mov128_vf_gpr(vf14, v1); // qmtc2.i vf14, v1
|
|
c->lwu(s1, 4, a0); // lwu s1, 4(a0)
|
|
c->vadd_bc(DEST::w, BC::x, vf3, vf3, vf14); // vaddx.w vf3, vf3, vf14
|
|
// nop // sll r0, r0, 0
|
|
c->vsub_bc(DEST::xyzw, BC::w, vf12, vf3, vf3); // vsubw.xyzw vf12, vf3, vf3
|
|
// nop // sll r0, r0, 0
|
|
c->vadd_bc(DEST::xyzw, BC::w, vf13, vf3, vf3); // vaddw.xyzw vf13, vf3, vf3
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf12, vf12); // vftoi0.xyzw vf12, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf13, vf13); // vftoi0.xyzw vf13, vf13
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(v1, vf12); // qmfc2.i v1, vf12
|
|
c->sqc2(vf12, 16, s4); // sqc2 vf12, 16(s4)
|
|
c->mov128_gpr_vf(a0, vf13); // qmfc2.i a0, vf13
|
|
c->sqc2(vf13, 32, s4); // sqc2 vf13, 32(s4)
|
|
|
|
block_1:
|
|
bc = c->sgpr64(s1) == 0; // beq s1, r0, L34
|
|
c->lwu(a2, 60, s2); // lwu a2, 60(s2)
|
|
if (bc) {goto block_14;} // branch non-likely
|
|
|
|
c->addiu(a3, r0, 896); // addiu a3, r0, 896
|
|
c->addiu(a1, r0, 0); // addiu a1, r0, 0
|
|
c->and_(a2, a2, a3); // and a2, a2, a3
|
|
c->addiu(a3, r0, 256); // addiu a3, r0, 256
|
|
bc = c->sgpr64(a2) == c->sgpr64(a1); // beq a2, a1, L32
|
|
c->daddiu(s1, s1, -1); // daddiu s1, s1, -1
|
|
if (bc) {goto block_5;} // branch non-likely
|
|
|
|
if (((s64)c->sgpr64(a2)) != ((s64)c->sgpr64(a3))) {// bnel a2, a3, L31
|
|
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
|
goto block_1;
|
|
}
|
|
|
|
block_5:
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a2, 64, s2); // lq a2, 64(s2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a1, 80, s2); // lq a1, 80(s2)
|
|
c->pcgtw(a2, a2, a0); // pcgtw a2, a2, a0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcgtw(a1, v1, a1); // pcgtw a1, v1, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->por(a1, a2, a1); // por a1, a2, a1
|
|
// nop // sll r0, r0, 0
|
|
c->ppach(a1, r0, a1); // ppach a1, r0, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->dsll(a1, a1, 16); // dsll a1, a1, 16
|
|
// nop // sll r0, r0, 0
|
|
if (((s64)c->sgpr64(a1)) != ((s64)0)) { // bnel a1, r0, L31
|
|
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
|
goto block_1;
|
|
}
|
|
|
|
// block_7:
|
|
c->load_symbol2(t9, cache.closest_pt_in_triangle);// lw t9, closest-pt-in-triangle(s7)
|
|
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
|
c->mov64(a1, s5); // or a1, s5, r0
|
|
c->daddu(a2, r0, s2); // daddu a2, r0, s2
|
|
c->daddiu(a3, s2, 48); // daddiu a3, s2, 48
|
|
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->lqc2(vf2, 0, s4); // lqc2 vf2, 0(s4)
|
|
c->lqc2(vf3, 0, s5); // lqc2 vf3, 0(s5)
|
|
c->lqc2(vf1, 48, s2); // lqc2 vf1, 48(s2)
|
|
c->lq(v1, 16, s4); // lq v1, 16(s4)
|
|
c->lq(a0, 32, s4); // lq a0, 32(s4)
|
|
c->vsub(DEST::xyzw, vf4, vf3, vf2); // vsub.xyzw vf4, vf3, vf2
|
|
c->lwu(a1, 60, s2); // lwu a1, 60(s2)
|
|
c->vmul(DEST::xyzw, vf5, vf4, vf1); // vmul.xyzw vf5, vf4, vf1
|
|
c->lqc2(vf7, 0, s2); // lqc2 vf7, 0(s2)
|
|
c->vmul(DEST::xyzw, vf6, vf4, vf4); // vmul.xyzw vf6, vf4, vf4
|
|
c->lqc2(vf8, 16, s2); // lqc2 vf8, 16(s2)
|
|
c->vmove(DEST::w, vf1, vf0); // vmove.w vf1, vf0
|
|
c->lqc2(vf9, 32, s2); // lqc2 vf9, 32(s2)
|
|
c->vadd_bc(DEST::y, BC::x, vf5, vf5, vf5); // vaddx.y vf5, vf5, vf5
|
|
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
|
c->vadd_bc(DEST::x, BC::y, vf6, vf6, vf6); // vaddy.x vf6, vf6, vf6
|
|
c->mtc1(f5, s3); // mtc1 f5, s3
|
|
c->vadd_bc(DEST::y, BC::z, vf5, vf5, vf5); // vaddz.y vf5, vf5, vf5
|
|
c->lui(a2, 17141); // lui a2, 17141
|
|
c->ori(a2, a2, 49807); // ori a2, a2, 49807
|
|
c->mtc1(f3, a2); // mtc1 f3, a2
|
|
c->vadd_bc(DEST::x, BC::z, vf6, vf6, vf6); // vaddz.x vf6, vf6, vf6
|
|
c->lui(a2, -15232); // lui a2, -15232
|
|
c->mtc1(f4, a2); // mtc1 f4, a2
|
|
c->vsqrt(vf6, BC::x); // vsqrt Q, vf6.x
|
|
c->mov128_gpr_vf(a2, vf5); // qmfc2.i a2, vf5
|
|
c->vwaitq(); // vwaitq
|
|
c->lwc1(f1, 12, s5); // lwc1 f1, 12(s5)
|
|
c->vaddq(DEST::x, vf6, vf0); // vaddq.x vf6, vf0, Q
|
|
c->vmove(DEST::xyzw, vf10, vf6); // vmove.xyzw vf10, vf6
|
|
if (((s64)c->sgpr64(a2)) < 0) { // bltzl a2, L33
|
|
c->vsub(DEST::xyzw, vf10, vf0, vf10); // vsub.xyzw vf10, vf0, vf10
|
|
goto block_9;
|
|
}
|
|
|
|
block_9:
|
|
c->mov128_gpr_vf(a2, vf10); // qmfc2.i a2, vf10
|
|
c->mtc1(f2, a2); // mtc1 f2, a2
|
|
c->subs(f2, f2, f1); // sub.s f2, f2, f1
|
|
cop1_bc = c->fprs[f5] < c->fprs[f2]; // c.lt.s f5, f2
|
|
bc = cop1_bc; // bc1t L31
|
|
c->vdiv(vf0, BC::w, vf6, BC::x); // vdiv Q, vf0.w, vf6.x
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
cop1_bc = c->fprs[f3] <= c->fprs[f2]; // c.le.s f3, f2
|
|
bc = cop1_bc; // bc1t L31
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
cop1_bc = c->fprs[f2] <= c->fprs[f4]; // c.le.s f2, f4
|
|
bc = cop1_bc; // bc1t L31
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->vwaitq(); // vwaitq
|
|
// nop // sll r0, r0, 0
|
|
c->vmulq(DEST::xyzw, vf11, vf4); // vmulq.xyzw vf11, vf4, Q
|
|
c->lui(a2, 16180); // lui a2, 16180
|
|
c->ori(a2, a2, 65012); // ori a2, a2, 65012
|
|
c->mtc1(f6, a2); // mtc1 f6, a2
|
|
c->vmul(DEST::xyzw, vf5, vf11, vf1); // vmul.xyzw vf5, vf11, vf1
|
|
c->vadd_bc(DEST::x, BC::y, vf5, vf5, vf5); // vaddy.x vf5, vf5, vf5
|
|
c->vadd_bc(DEST::x, BC::z, vf5, vf5, vf5); // vaddz.x vf5, vf5, vf5
|
|
c->mov128_gpr_vf(a2, vf5); // qmfc2.i a2, vf5
|
|
c->mtc1(f7, a2); // mtc1 f7, a2
|
|
cop1_bc = c->fprs[f7] < c->fprs[f6]; // c.lt.s f7, f6
|
|
bc = cop1_bc; // bc1t L31
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->mfc1(s3, f2); // mfc1 s3, f2
|
|
c->sqc2(vf7, 0, gp); // sqc2 vf7, 0(gp)
|
|
c->sqc2(vf8, 16, gp); // sqc2 vf8, 16(gp)
|
|
c->sqc2(vf9, 32, gp); // sqc2 vf9, 32(gp)
|
|
c->sqc2(vf2, 48, gp); // sqc2 vf2, 48(gp)
|
|
c->sqc2(vf1, 64, gp); // sqc2 vf1, 64(gp)
|
|
//beq r0, r0, L31 // beq r0, r0, L31
|
|
c->sw(a1, 80, gp); // sw a1, 80(gp)
|
|
goto block_1; // branch always
|
|
|
|
|
|
block_14:
|
|
c->mov64(v0, s3); // or v0, s3, r0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->lq(gp, 144, sp); // lq gp, 144(sp)
|
|
c->lq(s5, 128, sp); // lq s5, 128(sp)
|
|
c->lq(s4, 112, sp); // lq s4, 112(sp)
|
|
c->lq(s3, 96, sp); // lq s3, 96(sp)
|
|
c->lq(s2, 80, sp); // lq s2, 80(sp)
|
|
c->lq(s1, 64, sp); // lq s1, 64(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 160); // daddiu sp, sp, 160
|
|
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() {
|
|
cache.closest_pt_in_triangle = intern_from_c(-1, 0, "closest-pt-in-triangle").c();
|
|
gLinkedFunctionTable.reg("(method 12 collide-mesh)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_12_collide_mesh
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_14_collide_mesh {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->lwu(v1, 12, a0); // lwu v1, 12(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lwu(a0, 8, a0); // lwu a0, 8(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a1); // lqc2 vf2, 16(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, a1); // lqc2 vf3, 32(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf4, 48, a1); // lqc2 vf4, 48(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
|
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
|
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
|
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf13, vf5); // vftoi0.xyzw vf13, vf5
|
|
c->sqc2(vf5, 0, a2); // sqc2 vf5, 0(a2)
|
|
c->vftoi0(DEST::xyzw, vf14, vf6); // vftoi0.xyzw vf14, vf6
|
|
c->sqc2(vf6, 32, a2); // sqc2 vf6, 32(a2)
|
|
c->vftoi0(DEST::xyzw, vf15, vf7); // vftoi0.xyzw vf15, vf7
|
|
c->sqc2(vf7, 64, a2); // sqc2 vf7, 64(a2)
|
|
c->vftoi0(DEST::xyzw, vf16, vf8); // vftoi0.xyzw vf16, vf8
|
|
c->sqc2(vf8, 96, a2); // sqc2 vf8, 96(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf13, 16, a2); // sqc2 vf13, 16(a2)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
|
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
|
c->sqc2(vf15, 80, a2); // sqc2 vf15, 80(a2)
|
|
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L25
|
|
c->sqc2(vf16, 112, a2); // sqc2 vf16, 112(a2)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
|
|
block_1:
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf9); // vmaddax.xyzw acc, vf1, vf9
|
|
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9
|
|
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf3, vf9); // vmaddz.xyzw vf9, vf3, vf9
|
|
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf10); // vmaddax.xyzw acc, vf1, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf10); // vmadday.xyzw acc, vf2, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf3, vf10); // vmaddz.xyzw vf10, vf3, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf11); // vmaddax.xyzw acc, vf1, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf11); // vmadday.xyzw acc, vf2, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf3, vf11); // vmaddz.xyzw vf11, vf3, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf12); // vmaddax.xyzw acc, vf1, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf12); // vmadday.xyzw acc, vf2, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf3, vf12); // vmaddz.xyzw vf12, vf3, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf17, vf9); // vftoi0.xyzw vf17, vf9
|
|
c->sqc2(vf9, 128, a2); // sqc2 vf9, 128(a2)
|
|
c->vftoi0(DEST::xyzw, vf18, vf10); // vftoi0.xyzw vf18, vf10
|
|
c->sqc2(vf10, 160, a2); // sqc2 vf10, 160(a2)
|
|
c->vftoi0(DEST::xyzw, vf19, vf11); // vftoi0.xyzw vf19, vf11
|
|
c->sqc2(vf11, 192, a2); // sqc2 vf11, 192(a2)
|
|
c->vftoi0(DEST::xyzw, vf20, vf12); // vftoi0.xyzw vf20, vf12
|
|
c->sqc2(vf12, 224, a2); // sqc2 vf12, 224(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf17, 144, a2); // sqc2 vf17, 144(a2)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf18, 176, a2); // sqc2 vf18, 176(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf19, 208, a2); // sqc2 vf19, 208(a2)
|
|
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L25
|
|
c->sqc2(vf20, 240, a2); // sqc2 vf20, 240(a2)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
|
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
|
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
|
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->daddiu(a2, a2, 256); // daddiu a2, a2, 256
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf13, vf5); // vftoi0.xyzw vf13, vf5
|
|
c->sqc2(vf5, 0, a2); // sqc2 vf5, 0(a2)
|
|
c->vftoi0(DEST::xyzw, vf14, vf6); // vftoi0.xyzw vf14, vf6
|
|
c->sqc2(vf6, 32, a2); // sqc2 vf6, 32(a2)
|
|
c->vftoi0(DEST::xyzw, vf15, vf7); // vftoi0.xyzw vf15, vf7
|
|
c->sqc2(vf7, 64, a2); // sqc2 vf7, 64(a2)
|
|
c->vftoi0(DEST::xyzw, vf16, vf8); // vftoi0.xyzw vf16, vf8
|
|
c->sqc2(vf8, 96, a2); // sqc2 vf8, 96(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf13, 16, a2); // sqc2 vf13, 16(a2)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
|
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
|
c->sqc2(vf15, 80, a2); // sqc2 vf15, 80(a2)
|
|
bc = ((s64)c->sgpr64(a0)) > 0; // bgtz a0, L24
|
|
c->sqc2(vf16, 112, a2); // sqc2 vf16, 112(a2)
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
|
|
block_3:
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//jr ra // jr ra
|
|
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
|
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 14 collide-mesh)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_14_collide_mesh
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_15_collide_mesh {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->lwu(v1, 12, a0); // lwu v1, 12(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lwu(a0, 8, a0); // lwu a0, 8(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a1); // lqc2 vf2, 16(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, a1); // lqc2 vf3, 32(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf4, 48, a1); // lqc2 vf4, 48(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf13, 0, a2); // lqc2 vf13, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf14, 16, a2); // lqc2 vf14, 16(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf15, 32, a2); // lqc2 vf15, 32(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf16, 48, a2); // lqc2 vf16, 48(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
|
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
|
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
|
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
c->sqc2(vf5, 0, a3); // sqc2 vf5, 0(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf5); // vmaddax.xyzw acc, vf13, vf5
|
|
c->sqc2(vf6, 32, a3); // sqc2 vf6, 32(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf5); // vmadday.xyzw acc, vf14, vf5
|
|
c->sqc2(vf7, 64, a3); // sqc2 vf7, 64(a3)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf15, vf5); // vmaddz.xyzw vf5, vf15, vf5
|
|
c->sqc2(vf8, 96, a3); // sqc2 vf8, 96(a3)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf6); // vmaddax.xyzw acc, vf13, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf6); // vmadday.xyzw acc, vf14, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf15, vf6); // vmaddz.xyzw vf6, vf15, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf7); // vmaddax.xyzw acc, vf13, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf7); // vmadday.xyzw acc, vf14, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf15, vf7); // vmaddz.xyzw vf7, vf15, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf8); // vmaddax.xyzw acc, vf13, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf8); // vmadday.xyzw acc, vf14, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf15, vf8); // vmaddz.xyzw vf8, vf15, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf5, vf5); // vftoi0.xyzw vf5, vf5
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf6, vf6); // vftoi0.xyzw vf6, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf7, vf7); // vftoi0.xyzw vf7, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf8, vf8); // vftoi0.xyzw vf8, vf8
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf5, 16, a3); // sqc2 vf5, 16(a3)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf6, 48, a3); // sqc2 vf6, 48(a3)
|
|
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
|
c->sqc2(vf7, 80, a3); // sqc2 vf7, 80(a3)
|
|
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L22
|
|
c->sqc2(vf8, 112, a3); // sqc2 vf8, 112(a3)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
|
|
block_1:
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf9); // vmaddax.xyzw acc, vf1, vf9
|
|
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9
|
|
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf3, vf9); // vmaddz.xyzw vf9, vf3, vf9
|
|
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf10); // vmaddax.xyzw acc, vf1, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf10); // vmadday.xyzw acc, vf2, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf3, vf10); // vmaddz.xyzw vf10, vf3, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf11); // vmaddax.xyzw acc, vf1, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf11); // vmadday.xyzw acc, vf2, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf3, vf11); // vmaddz.xyzw vf11, vf3, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf12); // vmaddax.xyzw acc, vf1, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf12); // vmadday.xyzw acc, vf2, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf3, vf12); // vmaddz.xyzw vf12, vf3, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
c->sqc2(vf9, 128, a3); // sqc2 vf9, 128(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf9); // vmaddax.xyzw acc, vf13, vf9
|
|
c->sqc2(vf10, 160, a3); // sqc2 vf10, 160(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf9); // vmadday.xyzw acc, vf14, vf9
|
|
c->sqc2(vf11, 192, a3); // sqc2 vf11, 192(a3)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf15, vf9); // vmaddz.xyzw vf9, vf15, vf9
|
|
c->sqc2(vf12, 224, a3); // sqc2 vf12, 224(a3)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf10); // vmaddax.xyzw acc, vf13, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf10); // vmadday.xyzw acc, vf14, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf15, vf10); // vmaddz.xyzw vf10, vf15, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf11); // vmaddax.xyzw acc, vf13, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf11); // vmadday.xyzw acc, vf14, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf15, vf11); // vmaddz.xyzw vf11, vf15, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf12); // vmaddax.xyzw acc, vf13, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf12); // vmadday.xyzw acc, vf14, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf15, vf12); // vmaddz.xyzw vf12, vf15, vf12
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf9, vf9); // vftoi0.xyzw vf9, vf9
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf10, vf10); // vftoi0.xyzw vf10, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf11, vf11); // vftoi0.xyzw vf11, vf11
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf12, vf12); // vftoi0.xyzw vf12, vf12
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf9, 144, a3); // sqc2 vf9, 144(a3)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf10, 176, a3); // sqc2 vf10, 176(a3)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf11, 208, a3); // sqc2 vf11, 208(a3)
|
|
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L22
|
|
c->sqc2(vf12, 240, a3); // sqc2 vf12, 240(a3)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
|
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
|
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
|
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->daddiu(a3, a3, 256); // daddiu a3, a3, 256
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
c->sqc2(vf5, 0, a3); // sqc2 vf5, 0(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf5); // vmaddax.xyzw acc, vf13, vf5
|
|
c->sqc2(vf6, 32, a3); // sqc2 vf6, 32(a3)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf5); // vmadday.xyzw acc, vf14, vf5
|
|
c->sqc2(vf7, 64, a3); // sqc2 vf7, 64(a3)
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf15, vf5); // vmaddz.xyzw vf5, vf15, vf5
|
|
c->sqc2(vf8, 96, a3); // sqc2 vf8, 96(a3)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf6); // vmaddax.xyzw acc, vf13, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf6); // vmadday.xyzw acc, vf14, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf15, vf6); // vmaddz.xyzw vf6, vf15, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf7); // vmaddax.xyzw acc, vf13, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf7); // vmadday.xyzw acc, vf14, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf15, vf7); // vmaddz.xyzw vf7, vf15, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf16, vf0); // vmulaw.xyzw acc, vf16, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::x, vf13, vf8); // vmaddax.xyzw acc, vf13, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf8); // vmadday.xyzw acc, vf14, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf15, vf8); // vmaddz.xyzw vf8, vf15, vf8
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf5, vf5); // vftoi0.xyzw vf5, vf5
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf6, vf6); // vftoi0.xyzw vf6, vf6
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf7, vf7); // vftoi0.xyzw vf7, vf7
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf8, vf8); // vftoi0.xyzw vf8, vf8
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf5, 16, a3); // sqc2 vf5, 16(a3)
|
|
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
|
c->sqc2(vf6, 48, a3); // sqc2 vf6, 48(a3)
|
|
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
|
c->sqc2(vf7, 80, a3); // sqc2 vf7, 80(a3)
|
|
bc = ((s64)c->sgpr64(a0)) > 0; // bgtz a0, L21
|
|
c->sqc2(vf8, 112, a3); // sqc2 vf8, 112(a3)
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
|
|
block_3:
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//jr ra // jr ra
|
|
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
|
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 15 collide-mesh)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_15_collide_mesh
|
|
} // namespace Mips2C
|