//--------------------------MIPS2C--------------------- #include "common/dma/gs.h" #include "game/kernel/jak1/kscheme.h" #include "game/mips2c/mips2c_private.h" using namespace jak1; const uint32_t* max_tri_count = nullptr; namespace { u32 vu0_buffer[1024]; // todo, maybe can be 512. u32 vi1 = 0; void vlqi(Mips2C::ExecutionContext* c, int reg) { memcpy(&c->vfs[reg].f[0], &vu0_buffer[vi1 * 4], 16); vi1++; } } // namespace namespace Mips2C::jak1 { namespace pc_upload_collide_frag { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; // vif init is // #x30000000 = STROW // #x4d000000 ROW x // #x4d000000 ROW y // #x4d000000 ROW z // #x3f800000 ROW w // #x5000001 = STMOD 0b1 // #x20000000 = STMASK // #x40404040 = 1's on all w's // #x1000404 = STCYCL cl: 4 wl: 4 // int qw_in_source = c->sgpr64(a1); int qw_to_write = c->sgpr64(a2); const u16* data_in = (const u16*)(g_ee_main_mem + c->sgpr64(a0)); // I don't quite get why this is wrong sometimes. // ASSERT(qw_to_write * 3 == qw_in_source * 8); ASSERT(qw_to_write <= 128); int in_idx = 0; int out_idx = 0; while (out_idx < qw_to_write * 4) { vu0_buffer[out_idx++] = 0x4d000000 + data_in[in_idx++]; vu0_buffer[out_idx++] = 0x4d000000 + data_in[in_idx++]; vu0_buffer[out_idx++] = 0x4d000000 + data_in[in_idx++]; vu0_buffer[out_idx++] = 0x3f800000; } return 0; // (vif-cmd unpack-v3-16) // (__pc-upload-collide-frag (-> frag mesh packed-data) (-> frag mesh vertex-data-qwc) (-> frag // mesh vertex-count)) } void link() { gLinkedFunctionTable.reg("__pc-upload-collide-frag", execute, 128); } } // namespace pc_upload_collide_frag // clang-format off // download from VU0. namespace method_32_collide_cache { struct Cache { void* fake_scratchpad_data; // *fake-scratchpad-data* } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; // u32 call_addr = 0; c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 // daddiu a0, fp, L307 // daddiu a0, fp, L307 // handled at the lq's // nop // sll r0, r0, 0 bc = c->sgpr64(a2) == c->sgpr64(s7); // beq a2, s7, L293 // nop // sll r0, r0, 0 if (bc) {goto block_6;} // branch non-likely //c->lui(v1, 28672); // lui v1, 28672 get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c); c->lqc2(vf14, 12, a1); // lqc2 vf14, 12(a1) c->vmove(DEST::xyzw, vf1, vf0); // vmove.xyzw vf1, vf0 // c->lqc2(vf13, 0, a0); // lqc2 vf13, 0(a0) c->vfs[vf13].du32[0] = 0x4d000000; c->vfs[vf13].du32[1] = 0x4d000000; c->vfs[vf13].du32[2] = 0x4d000000; c->vfs[vf13].du32[3] = 0; c->vmove(DEST::xyzw, vf2, vf0); // vmove.xyzw vf2, vf0 c->lbu(a0, 24, a1); // lbu a0, 24(a1) ASSERT(c->sgpr64(a3) == 0); vi1 = 0; // Unknown instr: ctc2.i vi1, a3 c->vmove(DEST::xyzw, vf3, vf0); // vmove.xyzw vf3, vf0 c->vitof0(DEST::xyzw, vf14, vf14); // vitof0.xyzw vf14, vf14 c->vmove(DEST::xyzw, vf4, vf0); // vmove.xyzw vf4, vf0 c->vmove(DEST::xyzw, vf5, vf0); // vmove.xyzw vf5, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf6, vf0); // vmove.xyzw vf6, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf7, vf0); // vmove.xyzw vf7, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf8, vf0); // vmove.xyzw vf8, vf0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->ld(a1, 52, a2); // ld a1, 52(a2) // nop // sll r0, r0, 0 c->ld(t1, 28, a2); // ld t1, 28(a2) c->pextlh(a1, a1, r0); // pextlh a1, a1, r0 c->ld(a3, 36, a2); // ld a3, 36(a2) c->psraw(t0, a1, 10); // psraw t0, a1, 10 c->ld(a1, 44, a2); // ld a1, 44(a2) c->pextlh(t1, t1, r0); // pextlh t1, t1, r0 c->mfc1(r0, f31); // mfc1 r0, f31 c->psraw(t1, t1, 16); // psraw t1, t1, 16 c->mfc1(r0, f31); // mfc1 r0, f31 c->pextlh(a3, a3, r0); // pextlh a3, a3, r0 c->mov128_vf_gpr(vf18, t0); // qmtc2.i vf18, t0 c->psraw(a3, a3, 16); // psraw a3, a3, 16 c->mov128_vf_gpr(vf15, t1); // qmtc2.i vf15, t1 c->pextlh(a1, a1, r0); // pextlh a1, a1, r0 c->mov128_vf_gpr(vf16, a3); // qmtc2.i vf16, a3 c->psraw(a1, a1, 16); // psraw a1, a1, 16 c->lqc2(vf1, 12, a2); // lqc2 vf1, 12(a2) // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf17, a1); // qmtc2.i vf17, a1 c->vitof0(DEST::xyzw, vf18, vf18); // vitof0.xyzw vf18, vf18 // nop // sll r0, r0, 0 c->vitof12(DEST::xyzw, vf15, vf15); // vitof12.xyzw vf15, vf15 // nop // sll r0, r0, 0 c->vitof12(DEST::xyzw, vf16, vf16); // vitof12.xyzw vf16, vf16 // nop // sll r0, r0, 0 c->vitof12(DEST::xyzw, vf17, vf17); // vitof12.xyzw vf17, vf17 // nop // sll r0, r0, 0 c->vadd(DEST::xyz, vf18, vf18, vf1); // vadd.xyz vf18, vf18, vf1 // nop // sll r0, r0, 0 c->vsub(DEST::xyzw, vf13, vf13, vf14); // vsub.xyzw vf13, vf13, vf14 // Unknown instr: vlqi.xyz vf1, vi1 vlqi(c, vf1); c->daddiu(a0, a0, -4); // daddiu a0, a0, -4 // Unknown instr: vlqi.xyz vf2, vi1 vlqi(c, vf2); // nop // sll r0, r0, 0 // Unknown instr: vlqi.xyz vf3, vi1 vlqi(c, vf3); // nop // sll r0, r0, 0 // Unknown instr: vlqi.xyz vf4, vi1 vlqi(c, vf4); c->vsub(DEST::xyz, vf1, vf1, vf13); // vsub.xyz vf1, vf1, vf13 // Unknown instr: vlqi.xyz vf5, vi1 vlqi(c, vf5); c->vsub(DEST::xyz, vf2, vf2, vf13); // vsub.xyz vf2, vf2, vf13 // Unknown instr: vlqi.xyz vf6, vi1 vlqi(c, vf6); c->vsub(DEST::xyz, vf3, vf3, vf13); // vsub.xyz vf3, vf3, vf13 // Unknown instr: vlqi.xyz vf7, vi1 vlqi(c, vf7); c->vsub(DEST::xyz, vf4, vf4, vf13); // vsub.xyz vf4, vf4, vf13 // Unknown instr: vlqi.xyz vf8, vi1 vlqi(c, vf8); c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf1); // vmaddax.xyzw acc, vf15, vf1 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf1); // vmadday.xyzw acc, vf16, vf1 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf1, vf17, vf1); // vmaddz.xyzw vf1, vf17, vf1 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf2); // vmaddax.xyzw acc, vf15, vf2 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf2); // vmadday.xyzw acc, vf16, vf2 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf2, vf17, vf2); // vmaddz.xyzw vf2, vf17, vf2 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf3); // vmaddax.xyzw acc, vf15, vf3 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf3); // vmadday.xyzw acc, vf16, vf3 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf17, vf3); // vmaddz.xyzw vf3, vf17, vf3 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf4); // vmaddax.xyzw acc, vf15, vf4 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf4); // vmadday.xyzw acc, vf16, vf4 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf4, vf17, vf4); // vmaddz.xyzw vf4, vf17, vf4 // nop // sll r0, r0, 0 c->vftoi0(DEST::xyzw, vf9, vf1); // vftoi0.xyzw vf9, vf1 c->sqc2(vf1, 16, v1); // sqc2 vf1, 16(v1) c->vftoi0(DEST::xyzw, vf10, vf2); // vftoi0.xyzw vf10, vf2 c->sqc2(vf2, 48, v1); // sqc2 vf2, 48(v1) c->vftoi0(DEST::xyzw, vf11, vf3); // vftoi0.xyzw vf11, vf3 c->sqc2(vf3, 80, v1); // sqc2 vf3, 80(v1) c->vftoi0(DEST::xyzw, vf12, vf4); // vftoi0.xyzw vf12, vf4 c->sqc2(vf4, 112, v1); // sqc2 vf4, 112(v1) c->vsub(DEST::xyz, vf5, vf5, vf13); // vsub.xyz vf5, vf5, vf13 c->sqc2(vf9, 0, v1); // sqc2 vf9, 0(v1) c->vsub(DEST::xyz, vf6, vf6, vf13); // vsub.xyz vf6, vf6, vf13 c->sqc2(vf10, 32, v1); // sqc2 vf10, 32(v1) c->vsub(DEST::xyz, vf7, vf7, vf13); // vsub.xyz vf7, vf7, vf13 c->sqc2(vf11, 64, v1); // sqc2 vf11, 64(v1) c->vsub(DEST::xyz, vf8, vf8, vf13); // vsub.xyz vf8, vf8, vf13 c->sqc2(vf12, 96, v1); // sqc2 vf12, 96(v1) c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L295 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf5); // vmaddax.xyzw acc, vf15, vf5 if (bc) {goto block_8;} // branch non-likely c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf5); // vmadday.xyzw acc, vf16, vf5 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf17, vf5); // vmaddz.xyzw vf5, vf17, vf5 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf6); // vmaddax.xyzw acc, vf15, vf6 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf6); // vmadday.xyzw acc, vf16, vf6 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf17, vf6); // vmaddz.xyzw vf6, vf17, vf6 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf7); // vmaddax.xyzw acc, vf15, vf7 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf7); // vmadday.xyzw acc, vf16, vf7 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf17, vf7); // vmaddz.xyzw vf7, vf17, vf7 c->daddiu(v1, v1, 256); // daddiu v1, v1, 256 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // Unknown instr: vlqi.xyz vf1, vi1 vlqi(c, vf1); c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf8); // vmaddax.xyzw acc, vf15, vf8 // Unknown instr: vlqi.xyz vf2, vi1 vlqi(c, vf2); c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf8); // vmadday.xyzw acc, vf16, vf8 // Unknown instr: vlqi.xyz vf3, vi1 vlqi(c, vf3); c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf17, vf8); // vmaddz.xyzw vf8, vf17, vf8 // Unknown instr: vlqi.xyz vf4, vi1 vlqi(c, vf4); c->vftoi0(DEST::xyzw, vf9, vf5); // vftoi0.xyzw vf9, vf5 c->sqc2(vf5, -112, v1); // sqc2 vf5, -112(v1) c->vftoi0(DEST::xyzw, vf10, vf6); // vftoi0.xyzw vf10, vf6 c->sqc2(vf6, -80, v1); // sqc2 vf6, -80(v1) c->vftoi0(DEST::xyzw, vf11, vf7); // vftoi0.xyzw vf11, vf7 c->sqc2(vf7, -48, v1); // sqc2 vf7, -48(v1) c->vftoi0(DEST::xyzw, vf12, vf8); // vftoi0.xyzw vf12, vf8 c->sqc2(vf8, -16, v1); // sqc2 vf8, -16(v1) c->daddiu(a0, a0, -4); // daddiu a0, a0, -4 c->sqc2(vf9, -128, v1); // sqc2 vf9, -128(v1) // nop // sll r0, r0, 0 c->sqc2(vf10, -96, v1); // sqc2 vf10, -96(v1) // nop // sll r0, r0, 0 c->sqc2(vf11, -64, v1); // sqc2 vf11, -64(v1) bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L295 c->sqc2(vf12, -32, v1); // sqc2 vf12, -32(v1) if (bc) {goto block_8;} // branch non-likely block_3: c->vsub(DEST::xyz, vf1, vf1, vf13); // vsub.xyz vf1, vf1, vf13 // Unknown instr: vlqi.xyz vf5, vi1 vlqi(c, vf5); c->vsub(DEST::xyz, vf2, vf2, vf13); // vsub.xyz vf2, vf2, vf13 // Unknown instr: vlqi.xyz vf6, vi1 vlqi(c, vf6); c->vsub(DEST::xyz, vf3, vf3, vf13); // vsub.xyz vf3, vf3, vf13 // Unknown instr: vlqi.xyz vf7, vi1 vlqi(c, vf7); c->vsub(DEST::xyz, vf4, vf4, vf13); // vsub.xyz vf4, vf4, vf13 // Unknown instr: vlqi.xyz vf8, vi1 vlqi(c, vf8); c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf1); // vmaddax.xyzw acc, vf15, vf1 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf1); // vmadday.xyzw acc, vf16, vf1 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf1, vf17, vf1); // vmaddz.xyzw vf1, vf17, vf1 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf2); // vmaddax.xyzw acc, vf15, vf2 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf2); // vmadday.xyzw acc, vf16, vf2 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf2, vf17, vf2); // vmaddz.xyzw vf2, vf17, vf2 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf3); // vmaddax.xyzw acc, vf15, vf3 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf3); // vmadday.xyzw acc, vf16, vf3 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf17, vf3); // vmaddz.xyzw vf3, vf17, vf3 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf4); // vmaddax.xyzw acc, vf15, vf4 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf4); // vmadday.xyzw acc, vf16, vf4 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf4, vf17, vf4); // vmaddz.xyzw vf4, vf17, vf4 // nop // sll r0, r0, 0 c->vftoi0(DEST::xyzw, vf9, vf1); // vftoi0.xyzw vf9, vf1 c->sqc2(vf1, 16, v1); // sqc2 vf1, 16(v1) c->vftoi0(DEST::xyzw, vf10, vf2); // vftoi0.xyzw vf10, vf2 c->sqc2(vf2, 48, v1); // sqc2 vf2, 48(v1) c->vftoi0(DEST::xyzw, vf11, vf3); // vftoi0.xyzw vf11, vf3 c->sqc2(vf3, 80, v1); // sqc2 vf3, 80(v1) c->vftoi0(DEST::xyzw, vf12, vf4); // vftoi0.xyzw vf12, vf4 c->sqc2(vf4, 112, v1); // sqc2 vf4, 112(v1) c->vsub(DEST::xyz, vf5, vf5, vf13); // vsub.xyz vf5, vf5, vf13 c->sqc2(vf9, 0, v1); // sqc2 vf9, 0(v1) c->vsub(DEST::xyz, vf6, vf6, vf13); // vsub.xyz vf6, vf6, vf13 c->sqc2(vf10, 32, v1); // sqc2 vf10, 32(v1) c->vsub(DEST::xyz, vf7, vf7, vf13); // vsub.xyz vf7, vf7, vf13 c->sqc2(vf11, 64, v1); // sqc2 vf11, 64(v1) c->vsub(DEST::xyz, vf8, vf8, vf13); // vsub.xyz vf8, vf8, vf13 c->sqc2(vf12, 96, v1); // sqc2 vf12, 96(v1) c->daddiu(a0, a0, -4); // daddiu a0, a0, -4 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L292 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf5); // vmaddax.xyzw acc, vf15, vf5 if (bc) {goto block_5;} // branch non-likely c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf5); // vmadday.xyzw acc, vf16, vf5 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf17, vf5); // vmaddz.xyzw vf5, vf17, vf5 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf6); // vmaddax.xyzw acc, vf15, vf6 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf6); // vmadday.xyzw acc, vf16, vf6 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf17, vf6); // vmaddz.xyzw vf6, vf17, vf6 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf7); // vmaddax.xyzw acc, vf15, vf7 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf7); // vmadday.xyzw acc, vf16, vf7 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf17, vf7); // vmaddz.xyzw vf7, vf17, vf7 c->daddiu(v1, v1, 256); // daddiu v1, v1, 256 c->vmula_bc(DEST::xyzw, BC::w, vf18, vf0); // vmulaw.xyzw acc, vf18, vf0 // Unknown instr: vlqi.xyz vf1, vi1 vlqi(c, vf1); c->vmadda_bc(DEST::xyzw, BC::x, vf15, vf8); // vmaddax.xyzw acc, vf15, vf8 // Unknown instr: vlqi.xyz vf2, vi1 vlqi(c, vf2); c->vmadda_bc(DEST::xyzw, BC::y, vf16, vf8); // vmadday.xyzw acc, vf16, vf8 // Unknown instr: vlqi.xyz vf3, vi1 vlqi(c, vf3); c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf17, vf8); // vmaddz.xyzw vf8, vf17, vf8 // Unknown instr: vlqi.xyz vf4, vi1 vlqi(c, vf4); c->vftoi0(DEST::xyzw, vf9, vf5); // vftoi0.xyzw vf9, vf5 c->sqc2(vf5, -112, v1); // sqc2 vf5, -112(v1) c->vftoi0(DEST::xyzw, vf10, vf6); // vftoi0.xyzw vf10, vf6 c->sqc2(vf6, -80, v1); // sqc2 vf6, -80(v1) c->vftoi0(DEST::xyzw, vf11, vf7); // vftoi0.xyzw vf11, vf7 c->sqc2(vf7, -48, v1); // sqc2 vf7, -48(v1) c->vftoi0(DEST::xyzw, vf12, vf8); // vftoi0.xyzw vf12, vf8 c->sqc2(vf8, -16, v1); // sqc2 vf8, -16(v1) // nop // sll r0, r0, 0 c->sqc2(vf9, -128, v1); // sqc2 vf9, -128(v1) c->daddiu(a0, a0, -4); // daddiu a0, a0, -4 c->sqc2(vf10, -96, v1); // sqc2 vf10, -96(v1) // nop // sll r0, r0, 0 c->sqc2(vf11, -64, v1); // sqc2 vf11, -64(v1) bc = ((s64)c->sgpr64(a0)) > 0; // bgtz a0, L291 c->sqc2(vf12, -32, v1); // sqc2 vf12, -32(v1) if (bc) {goto block_3;} // branch non-likely block_5: //beq r0, r0, L295 // beq r0, r0, L295 // nop // sll r0, r0, 0 goto block_8; // branch always block_6: // c->lui(v1, 28672); // lui v1, 28672 get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c); c->lqc2(vf14, 12, a1); // lqc2 vf14, 12(a1) c->vmove(DEST::xyzw, vf1, vf0); // vmove.xyzw vf1, vf0 // c->lqc2(vf13, 0, a0); // lqc2 vf13, 0(a0) c->vfs[vf13].du32[0] = 0x4d000000; c->vfs[vf13].du32[1] = 0x4d000000; c->vfs[vf13].du32[2] = 0x4d000000; c->vfs[vf13].du32[3] = 0; c->vmove(DEST::xyzw, vf2, vf0); // vmove.xyzw vf2, vf0 c->lbu(a0, 24, a1); // lbu a0, 24(a1) // Unknown instr: ctc2.i vi1, a3 ASSERT(c->sgpr64(a3) == 0); vi1 = c->sgpr64(a3); c->vmove(DEST::xyzw, vf3, vf0); // vmove.xyzw vf3, vf0 c->vitof0(DEST::xyzw, vf14, vf14); // vitof0.xyzw vf14, vf14 c->vmove(DEST::xyzw, vf4, vf0); // vmove.xyzw vf4, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf5, vf0); // vmove.xyzw vf5, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf6, vf0); // vmove.xyzw vf6, vf0 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf7, vf0); // vmove.xyzw vf7, vf0 c->vsub(DEST::xyzw, vf13, vf13, vf14); // vsub.xyzw vf13, vf13, vf14 c->vmove(DEST::xyzw, vf8, vf0); // vmove.xyzw vf8, vf0 block_7: // nop // sll r0, r0, 0 // Unknown instr: vlqi.xyz vf1, vi1 vlqi(c, vf1); // nop // sll r0, r0, 0 // Unknown instr: vlqi.xyz vf2, vi1 vlqi(c, vf2); // nop // sll r0, r0, 0 // Unknown instr: vlqi.xyz vf3, vi1 vlqi(c, vf3); c->daddiu(v1, v1, 256); // daddiu v1, v1, 256 // Unknown instr: vlqi.xyz vf4, vi1 vlqi(c, vf4); c->vsub(DEST::xyz, vf1, vf1, vf13); // vsub.xyz vf1, vf1, vf13 // Unknown instr: vlqi.xyz vf5, vi1 vlqi(c, vf5); c->vsub(DEST::xyz, vf2, vf2, vf13); // vsub.xyz vf2, vf2, vf13 // Unknown instr: vlqi.xyz vf6, vi1 vlqi(c, vf6); c->vsub(DEST::xyz, vf3, vf3, vf13); // vsub.xyz vf3, vf3, vf13 // Unknown instr: vlqi.xyz vf7, vi1 vlqi(c, vf7); c->vsub(DEST::xyz, vf4, vf4, vf13); // vsub.xyz vf4, vf4, vf13 // Unknown instr: vlqi.xyz vf8, vi1 vlqi(c, vf8); c->vftoi0(DEST::xyzw, vf9, vf1); // vftoi0.xyzw vf9, vf1 c->sqc2(vf1, -240, v1); // sqc2 vf1, -240(v1) c->vftoi0(DEST::xyzw, vf10, vf2); // vftoi0.xyzw vf10, vf2 c->sqc2(vf2, -208, v1); // sqc2 vf2, -208(v1) c->vftoi0(DEST::xyzw, vf11, vf3); // vftoi0.xyzw vf11, vf3 c->sqc2(vf3, -176, v1); // sqc2 vf3, -176(v1) c->vftoi0(DEST::xyzw, vf12, vf4); // vftoi0.xyzw vf12, vf4 c->sqc2(vf4, -144, v1); // sqc2 vf4, -144(v1) c->vsub(DEST::xyz, vf5, vf5, vf13); // vsub.xyz vf5, vf5, vf13 c->sqc2(vf9, -256, v1); // sqc2 vf9, -256(v1) c->vsub(DEST::xyz, vf6, vf6, vf13); // vsub.xyz vf6, vf6, vf13 c->sqc2(vf10, -224, v1); // sqc2 vf10, -224(v1) c->vsub(DEST::xyz, vf7, vf7, vf13); // vsub.xyz vf7, vf7, vf13 c->sqc2(vf11, -192, v1); // sqc2 vf11, -192(v1) c->vsub(DEST::xyz, vf8, vf8, vf13); // vsub.xyz vf8, vf8, vf13 c->sqc2(vf12, -160, v1); // sqc2 vf12, -160(v1) c->vftoi0(DEST::xyzw, vf9, vf5); // vftoi0.xyzw vf9, vf5 c->sqc2(vf5, -112, v1); // sqc2 vf5, -112(v1) c->vftoi0(DEST::xyzw, vf10, vf6); // vftoi0.xyzw vf10, vf6 c->sqc2(vf6, -80, v1); // sqc2 vf6, -80(v1) c->vftoi0(DEST::xyzw, vf11, vf7); // vftoi0.xyzw vf11, vf7 c->sqc2(vf7, -48, v1); // sqc2 vf7, -48(v1) c->vftoi0(DEST::xyzw, vf12, vf8); // vftoi0.xyzw vf12, vf8 c->sqc2(vf8, -16, v1); // sqc2 vf8, -16(v1) // nop // sll r0, r0, 0 c->sqc2(vf9, -128, v1); // sqc2 vf9, -128(v1) c->daddiu(a0, a0, -8); // daddiu a0, a0, -8 c->sqc2(vf10, -96, v1); // sqc2 vf10, -96(v1) // nop // sll r0, r0, 0 c->sqc2(vf11, -64, v1); // sqc2 vf11, -64(v1) bc = ((s64)c->sgpr64(a0)) > 0; // bgtz a0, L294 c->sqc2(vf12, -32, v1); // sqc2 vf12, -32(v1) if (bc) {goto block_7;} // branch non-likely block_8: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(fp, 8, sp); // ld fp, 8(sp) //jr ra // jr ra c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 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.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 32 collide-cache)", execute, 128); max_tri_count = intern_from_c("*collide-cache-max-tris*").cast().c(); } } // namespace method_32_collide_cache } // namespace Mips2C namespace Mips2C::jak1 { // clip by box namespace method_26_collide_cache { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; // *fake-scratchpad-data* } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; [[maybe_unused]] u32 call_addr = 0; c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s1, 16, sp); // sq s1, 16(sp) c->sq(s2, 32, sp); // sq s2, 32(sp) c->sq(s3, 48, sp); // sq s3, 48(sp) c->sq(s4, 64, sp); // sq s4, 64(sp) c->sq(s5, 80, sp); // sq s5, 80(sp) c->sq(gp, 96, sp); // sq gp, 96(sp) // nop // sll r0, r0, 0 c->addiu(v1, r0, *max_tri_count); // addiu v1, r0, 460 c->lwu(a2, 0, a0); // lwu a2, 0(a0) c->dsubu(t0, v1, a2); // dsubu t0, v1, a2 c->addiu(a3, r0, 64); // addiu a3, r0, 64 c->mult3(a3, a2, a3); // mult3 a3, a2, a3 bc = ((s64)c->sgpr64(t0)) < 0; // bltz t0, L249 c->mov64(t0, a0); // or t0, a0, r0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->lbu(t2, 25, a1); // lbu t2, 25(a1) c->daddiu(t0, t0, 4908); // daddiu t0, t0, 4908 c->lwu(t1, 0, a1); // lwu t1, 0(a1) c->dsll(t2, t2, 4); // dsll t2, t2, 4 c->lhu(t3, 8, a1); // lhu t3, 8(a1) c->daddu(a3, t0, a3); // daddu a3, t0, a3 c->lq(t0, 60, a0); // lq t0, 60(a0) c->daddu(t1, t1, t2); // daddu t1, t1, t2 c->lq(t2, 76, a0); // lq t2, 76(a0) // nop // sll r0, r0, 0 c->lwu(a1, 4, a1); // lwu a1, 4(a1) c->daddu(t3, t1, t3); // daddu t3, t1, t3 c->lwu(t4, 8, a0); // lwu t4, 8(a0) block_2: // c->lui(t5, 28672); // lui t5, 28672 get_fake_spad_addr(t5, cache.fake_scratchpad_data, 0, c); c->lb(t7, 0, t1); // lb t7, 0(t1) // nop // sll r0, r0, 0 c->lb(t8, 1, t1); // lb t8, 1(t1) bc = ((s64)c->sgpr64(t7)) < 0; // bltz t7, L248 c->lb(t6, 2, t1); // lb t6, 2(t1) if (bc) {goto block_16;} // branch non-likely c->dsll(t7, t7, 5); // dsll t7, t7, 5 c->dsll(t8, t8, 5); // dsll t8, t8, 5 c->dsll(t9, t6, 5); // dsll t9, t6, 5 c->daddu(t6, t7, t5); // daddu t6, t7, t5 c->daddu(t7, t8, t5); // daddu t7, t8, t5 c->lq(t8, 0, t6); // lq t8, 0(t6) c->daddu(ra, t9, t5); // daddu ra, t9, t5 c->lq(t9, 0, t7); // lq t9, 0(t7) c->pminw(s4, t8, t9); // pminw s4, t8, t9 c->lq(gp, 0, ra); // lq gp, 0(ra) c->pmaxw(s5, t8, t9); // pmaxw s5, t8, t9 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s4, s4, gp); // pminw s4, s4, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s5, s5, gp); // pmaxw s5, s5, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s4, s4, t2); // pcgtw s4, s4, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s5, t0, s5); // pcgtw s5, t0, s5 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s4, s4, s5); // por s4, s4, s5 c->lbu(s5, 0, t3); // lbu s5, 0(t3) c->ppach(s4, r0, s4); // ppach s4, r0, s4 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s4, s4, 16); // dsll s4, s4, 16 c->dsll(s5, s5, 2); // dsll s5, s5, 2 bc = c->sgpr64(s4) != 0; // bne s4, r0, L245 c->daddu(s5, s5, a1); // daddu s5, s5, a1 if (bc) {goto block_7;} // branch non-likely bc = c->sgpr64(a2) == c->sgpr64(v1); // beq a2, v1, L249 c->lwu(s5, 0, s5); // lwu s5, 0(s5) if (bc) {goto block_17;} // branch non-likely c->and_(s4, s5, t4); // and s4, s5, t4 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) != 0; // bne s4, r0, L245 // nop // sll r0, r0, 0 if (bc) {goto block_7;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a3); // sq r0, 48(a3) c->daddiu(a2, a2, 1); // daddiu a2, a2, 1 c->sw(s5, 48, a3); // sw s5, 48(a3) c->daddiu(a3, a3, 64); // daddiu a3, a3, 64 c->lq(s5, 16, t6); // lq s5, 16(t6) // nop // sll r0, r0, 0 c->lq(s4, 16, t7); // lq s4, 16(t7) // nop // sll r0, r0, 0 c->lq(s3, 16, ra); // lq s3, 16(ra) // nop // sll r0, r0, 0 c->sq(s5, -64, a3); // sq s5, -64(a3) // nop // sll r0, r0, 0 c->sq(s4, -48, a3); // sq s4, -48(a3) // nop // sll r0, r0, 0 c->sq(s3, -32, a3); // sq s3, -32(a3) block_7: c->daddiu(t3, t3, 1); // daddiu t3, t3, 1 c->daddiu(t1, t1, 3); // daddiu t1, t1, 3 c->addiu(s5, r0, 16); // addiu s5, r0, 16 // nop // sll r0, r0, 0 block_8: // nop // sll r0, r0, 0 c->lb(s4, 0, t1); // lb s4, 0(t1) c->daddiu(t1, t1, 1); // daddiu t1, t1, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) == 0; // beq s4, r0, L244 // nop // sll r0, r0, 0 if (bc) {goto block_2;} // branch non-likely if (((s64)c->sgpr64(s4)) < 0) { // bltzl s4, L247 c->dsubu(s4, r0, s4); // dsubu s4, r0, s4 goto block_12; } // block_11: c->mov128_gpr_gpr(t8, t9); // por t8, t9, r0 c->mov64(t6, t7); // or t6, t7, r0 c->dsubu(s5, r0, s5); // dsubu s5, r0, s5 // nop // sll r0, r0, 0 block_12: c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 c->mov64(t7, ra); // or t7, ra, r0 c->mov128_gpr_gpr(t9, gp); // por t9, gp, r0 c->dsll(ra, s4, 5); // dsll ra, s4, 5 c->daddu(ra, ra, t5); // daddu ra, ra, t5 c->lbu(s4, 0, t3); // lbu s4, 0(t3) c->pminw(s2, t8, t9); // pminw s2, t8, t9 c->lq(gp, 0, ra); // lq gp, 0(ra) c->pmaxw(s3, t8, t9); // pmaxw s3, t8, t9 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s2, s2, gp); // pminw s2, s2, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s3, s3, gp); // pmaxw s3, s3, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s2, s2, t2); // pcgtw s2, s2, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s3, t0, s3); // pcgtw s3, t0, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s3, s2, s3); // por s3, s2, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->ppach(s3, r0, s3); // ppach s3, r0, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s3, s3, 16); // dsll s3, s3, 16 c->dsll(s4, s4, 2); // dsll s4, s4, 2 bc = c->sgpr64(s3) != 0; // bne s3, r0, L246 c->daddiu(t3, t3, 1); // daddiu t3, t3, 1 if (bc) {goto block_8;} // branch non-likely c->daddu(s4, s4, a1); // daddu s4, s4, a1 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s4, 0, s4); // lwu s4, 0(s4) c->and_(s3, s4, t4); // and s3, s4, t4 // nop // sll r0, r0, 0 bc = c->sgpr64(s3) != 0; // bne s3, r0, L246 // nop // sll r0, r0, 0 if (bc) {goto block_8;} // branch non-likely bc = c->sgpr64(a2) == c->sgpr64(v1); // beq a2, v1, L249 // nop // sll r0, r0, 0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a3); // sq r0, 48(a3) c->daddiu(a2, a2, 1); // daddiu a2, a2, 1 c->sw(s4, 48, a3); // sw s4, 48(a3) c->daddiu(s2, a3, 16); // daddiu s2, a3, 16 c->lq(s1, 16, t7); // lq s1, 16(t7) c->daddiu(a3, a3, 64); // daddiu a3, a3, 64 c->lq(s4, 16, t6); // lq s4, 16(t6) // nop // sll r0, r0, 0 c->lq(s3, 16, ra); // lq s3, 16(ra) // nop // sll r0, r0, 0 c->sq(s1, 0, s2); // sq s1, 0(s2) c->dsubu(s1, s2, s5); // dsubu s1, s2, s5 c->daddu(s2, s2, s5); // daddu s2, s2, s5 // nop // sll r0, r0, 0 c->sq(s4, 0, s1); // sq s4, 0(s1) //beq r0, r0, L246 // beq r0, r0, L246 c->sq(s3, 0, s2); // sq s3, 0(s2) goto block_8; // branch always block_16: // nop // sll r0, r0, 0 c->sw(a2, 0, a0); // sw a2, 0(a0) //beq r0, r0, L251 // beq r0, r0, L251 // nop // sll r0, r0, 0 goto block_21; // branch always block_17: // nop // sll r0, r0, 0 c->sw(v1, 0, a0); // sw v1, 0(a0) c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L250 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t //c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) //c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L250 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) //daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("exceeded maximum collide cache tris (should print on screen but too lazy for that now)\n"); c->mov64(v1, v0); // or v1, v0, r0 block_20: //beq r0, r0, L251 // beq r0, r0, L251 // nop // sll r0, r0, 0 goto block_21; // branch always block_21: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 96, sp); // lq gp, 96(sp) c->lq(s5, 80, sp); // lq s5, 80(sp) c->lq(s4, 64, sp); // lq s4, 64(sp) c->lq(s3, 48, sp); // lq s3, 48(sp) c->lq(s2, 32, sp); // lq s2, 32(sp) c->lq(s1, 16, sp); // lq s1, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 112); // daddiu sp, sp, 112 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 26 collide-cache)", execute, 512); } } // namespace method_26_collide_cache } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_28_collide_cache { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; [[maybe_unused]] u32 call_addr = 0; c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s1, 16, sp); // sq s1, 16(sp) c->sq(s2, 32, sp); // sq s2, 32(sp) c->sq(s3, 48, sp); // sq s3, 48(sp) c->sq(s4, 64, sp); // sq s4, 64(sp) c->sq(s5, 80, sp); // sq s5, 80(sp) c->sq(gp, 96, sp); // sq gp, 96(sp) // nop // sll r0, r0, 0 c->addiu(v1, r0, *max_tri_count); // addiu v1, r0, 460 c->lwu(a2, 0, a0); // lwu a2, 0(a0) c->dsubu(t0, v1, a2); // dsubu t0, v1, a2 c->addiu(a3, r0, 64); // addiu a3, r0, 64 c->mult3(a3, a2, a3); // mult3 a3, a2, a3 bc = ((s64)c->sgpr64(t0)) < 0; // bltz t0, L222 c->mov64(t0, a0); // or t0, a0, r0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->lbu(t2, 25, a1); // lbu t2, 25(a1) c->daddiu(t0, t0, 4908); // daddiu t0, t0, 4908 c->lwu(t1, 0, a1); // lwu t1, 0(a1) c->dsll(t2, t2, 4); // dsll t2, t2, 4 c->lhu(t3, 8, a1); // lhu t3, 8(a1) c->daddu(a3, t0, a3); // daddu a3, t0, a3 c->lq(t0, 60, a0); // lq t0, 60(a0) c->daddu(t1, t1, t2); // daddu t1, t1, t2 c->lq(t2, 76, a0); // lq t2, 76(a0) // nop // sll r0, r0, 0 c->lwu(a1, 4, a1); // lwu a1, 4(a1) c->daddu(t3, t1, t3); // daddu t3, t1, t3 c->lwu(t4, 8, a0); // lwu t4, 8(a0) block_2: // c->lui(t5, 28672); // lui t5, 28672 get_fake_spad_addr(t5, cache.fake_scratchpad_data, 0, c); c->lb(t7, 0, t1); // lb t7, 0(t1) // nop // sll r0, r0, 0 c->lb(t8, 1, t1); // lb t8, 1(t1) bc = ((s64)c->sgpr64(t7)) < 0; // bltz t7, L221 c->lb(t6, 2, t1); // lb t6, 2(t1) if (bc) {goto block_16;} // branch non-likely c->dsll(t7, t7, 5); // dsll t7, t7, 5 c->dsll(t8, t8, 5); // dsll t8, t8, 5 c->dsll(t9, t6, 5); // dsll t9, t6, 5 c->daddu(t6, t7, t5); // daddu t6, t7, t5 c->daddu(t7, t8, t5); // daddu t7, t8, t5 c->lq(t8, 0, t6); // lq t8, 0(t6) c->daddu(ra, t9, t5); // daddu ra, t9, t5 c->lq(t9, 0, t7); // lq t9, 0(t7) c->pminw(s4, t8, t9); // pminw s4, t8, t9 c->lq(gp, 0, ra); // lq gp, 0(ra) c->pmaxw(s5, t8, t9); // pmaxw s5, t8, t9 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s4, s4, gp); // pminw s4, s4, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s5, s5, gp); // pmaxw s5, s5, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s4, s4, t2); // pcgtw s4, s4, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s5, t0, s5); // pcgtw s5, t0, s5 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s4, s4, s5); // por s4, s4, s5 c->lbu(s5, 0, t3); // lbu s5, 0(t3) c->ppach(s4, r0, s4); // ppach s4, r0, s4 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s4, s4, 16); // dsll s4, s4, 16 c->dsll(s5, s5, 2); // dsll s5, s5, 2 bc = c->sgpr64(s4) != 0; // bne s4, r0, L218 c->daddu(s5, s5, a1); // daddu s5, s5, a1 if (bc) {goto block_7;} // branch non-likely bc = c->sgpr64(a2) == c->sgpr64(v1); // beq a2, v1, L222 c->lwu(s5, 0, s5); // lwu s5, 0(s5) if (bc) {goto block_17;} // branch non-likely c->and_(s4, s5, t4); // and s4, s5, t4 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) != 0; // bne s4, r0, L218 // nop // sll r0, r0, 0 if (bc) {goto block_7;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a3); // sq r0, 48(a3) c->daddiu(a2, a2, 1); // daddiu a2, a2, 1 c->sw(s5, 48, a3); // sw s5, 48(a3) c->daddiu(a3, a3, 64); // daddiu a3, a3, 64 c->lq(s5, 16, t6); // lq s5, 16(t6) // nop // sll r0, r0, 0 c->lq(s4, 16, t7); // lq s4, 16(t7) // nop // sll r0, r0, 0 c->lq(s3, 16, ra); // lq s3, 16(ra) // nop // sll r0, r0, 0 c->sq(s5, -64, a3); // sq s5, -64(a3) // nop // sll r0, r0, 0 c->sq(s4, -48, a3); // sq s4, -48(a3) // nop // sll r0, r0, 0 c->sq(s3, -32, a3); // sq s3, -32(a3) block_7: c->daddiu(t3, t3, 1); // daddiu t3, t3, 1 c->daddiu(t1, t1, 3); // daddiu t1, t1, 3 c->addiu(s5, r0, 16); // addiu s5, r0, 16 // nop // sll r0, r0, 0 block_8: // nop // sll r0, r0, 0 c->lb(s4, 0, t1); // lb s4, 0(t1) c->daddiu(t1, t1, 1); // daddiu t1, t1, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) == 0; // beq s4, r0, L217 // nop // sll r0, r0, 0 if (bc) {goto block_2;} // branch non-likely if (((s64)c->sgpr64(s4)) < 0) { // bltzl s4, L220 c->dsubu(s4, r0, s4); // dsubu s4, r0, s4 goto block_12; } // block_11: c->mov128_gpr_gpr(t8, t9); // por t8, t9, r0 c->mov64(t6, t7); // or t6, t7, r0 c->dsubu(s5, r0, s5); // dsubu s5, r0, s5 // nop // sll r0, r0, 0 block_12: c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 c->mov64(t7, ra); // or t7, ra, r0 c->mov128_gpr_gpr(t9, gp); // por t9, gp, r0 c->dsll(ra, s4, 5); // dsll ra, s4, 5 c->daddu(ra, ra, t5); // daddu ra, ra, t5 c->lbu(s4, 0, t3); // lbu s4, 0(t3) c->pminw(s2, t8, t9); // pminw s2, t8, t9 c->lq(gp, 0, ra); // lq gp, 0(ra) c->pmaxw(s3, t8, t9); // pmaxw s3, t8, t9 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s2, s2, gp); // pminw s2, s2, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s3, s3, gp); // pmaxw s3, s3, gp c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s2, s2, t2); // pcgtw s2, s2, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s3, t0, s3); // pcgtw s3, t0, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s3, s2, s3); // por s3, s2, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->ppach(s3, r0, s3); // ppach s3, r0, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s3, s3, 16); // dsll s3, s3, 16 c->dsll(s4, s4, 2); // dsll s4, s4, 2 bc = c->sgpr64(s3) != 0; // bne s3, r0, L219 c->daddiu(t3, t3, 1); // daddiu t3, t3, 1 if (bc) {goto block_8;} // branch non-likely c->daddu(s4, s4, a1); // daddu s4, s4, a1 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s4, 0, s4); // lwu s4, 0(s4) c->and_(s3, s4, t4); // and s3, s4, t4 // nop // sll r0, r0, 0 bc = c->sgpr64(s3) != 0; // bne s3, r0, L219 // nop // sll r0, r0, 0 if (bc) {goto block_8;} // branch non-likely bc = c->sgpr64(a2) == c->sgpr64(v1); // beq a2, v1, L222 // nop // sll r0, r0, 0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a3); // sq r0, 48(a3) c->daddiu(a2, a2, 1); // daddiu a2, a2, 1 c->sw(s4, 48, a3); // sw s4, 48(a3) c->daddiu(s2, a3, 16); // daddiu s2, a3, 16 c->lq(s1, 16, t7); // lq s1, 16(t7) c->daddiu(a3, a3, 64); // daddiu a3, a3, 64 c->lq(s4, 16, t6); // lq s4, 16(t6) // nop // sll r0, r0, 0 c->lq(s3, 16, ra); // lq s3, 16(ra) // nop // sll r0, r0, 0 c->sq(s1, 0, s2); // sq s1, 0(s2) c->dsubu(s1, s2, s5); // dsubu s1, s2, s5 c->daddu(s2, s2, s5); // daddu s2, s2, s5 // nop // sll r0, r0, 0 c->sq(s4, 0, s1); // sq s4, 0(s1) //beq r0, r0, L219 // beq r0, r0, L219 c->sq(s3, 0, s2); // sq s3, 0(s2) goto block_8; // branch always block_16: // nop // sll r0, r0, 0 c->sw(a2, 0, a0); // sw a2, 0(a0) //beq r0, r0, L224 // beq r0, r0, L224 // nop // sll r0, r0, 0 goto block_21; // branch always block_17: // nop // sll r0, r0, 0 c->sw(v1, 0, a0); // sw v1, 0(a0) c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L223 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t //c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) //c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L223 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) //daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("exceeded maximum collide cache tris (should print on screen but too lazy for that now)\n"); c->mov64(v1, v0); // or v1, v0, r0 block_20: //beq r0, r0, L224 // beq r0, r0, L224 // nop // sll r0, r0, 0 goto block_21; // branch always block_21: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 96, sp); // lq gp, 96(sp) c->lq(s5, 80, sp); // lq s5, 80(sp) c->lq(s4, 64, sp); // lq s4, 64(sp) c->lq(s3, 48, sp); // lq s3, 48(sp) c->lq(s2, 32, sp); // lq s2, 32(sp) c->lq(s1, 16, sp); // lq s1, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 112); // daddiu sp, sp, 112 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 28 collide-cache)", execute, 512); } } // namespace method_28_collide_cache } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_27_collide_cache { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* collide_work; // *collide-work* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s1, 16, sp); // sq s1, 16(sp) c->sq(s2, 32, sp); // sq s2, 32(sp) c->sq(s3, 48, sp); // sq s3, 48(sp) c->sq(s4, 64, sp); // sq s4, 64(sp) c->sq(s5, 80, sp); // sq s5, 80(sp) c->sq(gp, 96, sp); // sq gp, 96(sp) c->mov64(gp, a0); // or gp, a0, r0 c->mov64(s5, a1); // or s5, a1, r0 c->mov64(a0, gp); // or a0, gp, r0 c->lwu(v1, -4, a0); // lwu v1, -4(a0) c->lwu(t9, 132, v1); // lwu t9, 132(v1) c->mov64(a1, s5); // or a1, s5, 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(v1, v0); // or v1, v0, r0 // nop // sll r0, r0, 0 c->load_symbol(t0, cache.collide_work); // lw t0, *collide-work*(s7) c->addiu(v1, r0, *max_tri_count); // addiu v1, r0, 460 c->lwu(a0, 0, gp); // lwu a0, 0(gp) c->dsubu(a2, v1, a0); // dsubu a2, v1, a0 c->dsll(a1, a0, 6); // dsll a1, a0, 6 bc = ((s64)c->sgpr64(a2)) < 0; // bltz a2, L179 c->mov64(a2, gp); // or a2, gp, r0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->lbu(t1, 25, s5); // lbu t1, 25(s5) c->daddiu(a2, a2, 4908); // daddiu a2, a2, 4908 c->lwu(a3, 0, s5); // lwu a3, 0(s5) c->dsll(t1, t1, 4); // dsll t1, t1, 4 c->lhu(t2, 8, s5); // lhu t2, 8(s5) c->daddu(a1, a2, a1); // daddu a1, a2, a1 c->lq(a2, 16, t0); // lq a2, 16(t0) c->daddu(a3, a3, t1); // daddu a3, a3, t1 c->lq(t0, 32, t0); // lq t0, 32(t0) // nop // sll r0, r0, 0 c->lwu(t1, 4, s5); // lwu t1, 4(s5) c->daddu(t2, a3, t2); // daddu t2, a3, t2 c->lwu(t3, 8, gp); // lwu t3, 8(gp) block_2: // c->lui(t4, 28672); // lui t4, 28672 get_fake_spad_addr(t4, cache.fake_scratchpad_data, 0, c); c->lb(t6, 0, a3); // lb t6, 0(a3) // nop // sll r0, r0, 0 c->lb(t7, 1, a3); // lb t7, 1(a3) bc = ((s64)c->sgpr64(t6)) < 0; // bltz t6, L178 c->lb(t5, 2, a3); // lb t5, 2(a3) if (bc) {goto block_16;} // branch non-likely c->dsll(t6, t6, 5); // dsll t6, t6, 5 c->dsll(t7, t7, 5); // dsll t7, t7, 5 c->dsll(t8, t5, 5); // dsll t8, t5, 5 c->daddu(t5, t6, t4); // daddu t5, t6, t4 c->daddu(t6, t7, t4); // daddu t6, t7, t4 c->lq(t7, 4096, t5); // lq t7, 4096(t5) c->daddu(t9, t8, t4); // daddu t9, t8, t4 c->lq(t8, 4096, t6); // lq t8, 4096(t6) c->pminw(s4, t7, t8); // pminw s4, t7, t8 c->lq(ra, 4096, t9); // lq ra, 4096(t9) c->pmaxw(s5, t7, t8); // pmaxw s5, t7, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s4, s4, ra); // pminw s4, s4, ra c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s5, s5, ra); // pmaxw s5, s5, ra c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s4, s4, t0); // pcgtw s4, s4, t0 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s5, a2, s5); // pcgtw s5, a2, s5 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s4, s4, s5); // por s4, s4, s5 c->lbu(s5, 0, t2); // lbu s5, 0(t2) c->ppach(s4, r0, s4); // ppach s4, r0, s4 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s4, s4, 16); // dsll s4, s4, 16 c->dsll(s5, s5, 2); // dsll s5, s5, 2 bc = c->sgpr64(s4) != 0; // bne s4, r0, L175 c->daddu(s5, s5, t1); // daddu s5, s5, t1 if (bc) {goto block_7;} // branch non-likely bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L179 c->lwu(s5, 0, s5); // lwu s5, 0(s5) if (bc) {goto block_17;} // branch non-likely c->and_(s4, s5, t3); // and s4, s5, t3 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) != 0; // bne s4, r0, L175 // nop // sll r0, r0, 0 if (bc) {goto block_7;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a1); // sq r0, 48(a1) c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 c->sw(s5, 48, a1); // sw s5, 48(a1) c->daddiu(a1, a1, 64); // daddiu a1, a1, 64 c->lq(s5, 16, t5); // lq s5, 16(t5) // nop // sll r0, r0, 0 c->lq(s4, 16, t6); // lq s4, 16(t6) // nop // sll r0, r0, 0 c->lq(s3, 16, t9); // lq s3, 16(t9) // nop // sll r0, r0, 0 c->sq(s5, -64, a1); // sq s5, -64(a1) // nop // sll r0, r0, 0 c->sq(s4, -48, a1); // sq s4, -48(a1) // nop // sll r0, r0, 0 c->sq(s3, -32, a1); // sq s3, -32(a1) block_7: c->daddiu(t2, t2, 1); // daddiu t2, t2, 1 c->daddiu(a3, a3, 3); // daddiu a3, a3, 3 c->addiu(s5, r0, 16); // addiu s5, r0, 16 // nop // sll r0, r0, 0 block_8: // nop // sll r0, r0, 0 c->lb(s4, 0, a3); // lb s4, 0(a3) c->daddiu(a3, a3, 1); // daddiu a3, a3, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) == 0; // beq s4, r0, L174 // nop // sll r0, r0, 0 if (bc) {goto block_2;} // branch non-likely if (((s64)c->sgpr64(s4)) < 0) { // bltzl s4, L177 c->dsubu(s4, r0, s4); // dsubu s4, r0, s4 goto block_12; } // block_11: c->mov128_gpr_gpr(t7, t8); // por t7, t8, r0 c->mov64(t5, t6); // or t5, t6, r0 c->dsubu(s5, r0, s5); // dsubu s5, r0, s5 // nop // sll r0, r0, 0 block_12: c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 c->mov64(t6, t9); // or t6, t9, r0 c->mov128_gpr_gpr(t8, ra); // por t8, ra, r0 c->dsll(t9, s4, 5); // dsll t9, s4, 5 c->daddu(t9, t9, t4); // daddu t9, t9, t4 c->lbu(s4, 0, t2); // lbu s4, 0(t2) c->pminw(s2, t7, t8); // pminw s2, t7, t8 c->lq(ra, 4096, t9); // lq ra, 4096(t9) c->pmaxw(s3, t7, t8); // pmaxw s3, t7, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s2, s2, ra); // pminw s2, s2, ra c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s3, s3, ra); // pmaxw s3, s3, ra c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s2, s2, t0); // pcgtw s2, s2, t0 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s3, a2, s3); // pcgtw s3, a2, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s3, s2, s3); // por s3, s2, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->ppach(s3, r0, s3); // ppach s3, r0, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s3, s3, 16); // dsll s3, s3, 16 c->dsll(s4, s4, 2); // dsll s4, s4, 2 bc = c->sgpr64(s3) != 0; // bne s3, r0, L176 c->daddiu(t2, t2, 1); // daddiu t2, t2, 1 if (bc) {goto block_8;} // branch non-likely c->daddu(s4, s4, t1); // daddu s4, s4, t1 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s4, 0, s4); // lwu s4, 0(s4) c->and_(s3, s4, t3); // and s3, s4, t3 // nop // sll r0, r0, 0 bc = c->sgpr64(s3) != 0; // bne s3, r0, L176 // nop // sll r0, r0, 0 if (bc) {goto block_8;} // branch non-likely bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L179 // nop // sll r0, r0, 0 if (bc) {goto block_17;} // branch non-likely // nop // sll r0, r0, 0 c->sq(r0, 48, a1); // sq r0, 48(a1) c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 c->sw(s4, 48, a1); // sw s4, 48(a1) c->daddiu(s2, a1, 16); // daddiu s2, a1, 16 c->lq(s1, 16, t6); // lq s1, 16(t6) c->daddiu(a1, a1, 64); // daddiu a1, a1, 64 c->lq(s4, 16, t5); // lq s4, 16(t5) // nop // sll r0, r0, 0 c->lq(s3, 16, t9); // lq s3, 16(t9) // nop // sll r0, r0, 0 c->sq(s1, 0, s2); // sq s1, 0(s2) c->dsubu(s1, s2, s5); // dsubu s1, s2, s5 c->daddu(s2, s2, s5); // daddu s2, s2, s5 // nop // sll r0, r0, 0 c->sq(s4, 0, s1); // sq s4, 0(s1) //beq r0, r0, L176 // beq r0, r0, L176 c->sq(s3, 0, s2); // sq s3, 0(s2) goto block_8; // branch always block_16: // nop // sll r0, r0, 0 c->sw(a0, 0, gp); // sw a0, 0(gp) //beq r0, r0, L181 // beq r0, r0, L181 // nop // sll r0, r0, 0 goto block_21; // branch always block_17: // nop // sll r0, r0, 0 c->sw(v1, 0, gp); // sw v1, 0(gp) c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L180 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t // c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) // c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L180 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_20;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) //daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("exceeded maximum collide cache tris (should print on screen but too lazy for that now)\n"); c->mov64(v1, v0); // or v1, v0, r0 // nop // sll r0, r0, 0 block_20: //beq r0, r0, L181 // beq r0, r0, L181 // nop // sll r0, r0, 0 goto block_21; // branch always block_21: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 96, sp); // lq gp, 96(sp) c->lq(s5, 80, sp); // lq s5, 80(sp) c->lq(s4, 64, sp); // lq s4, 64(sp) c->lq(s3, 48, sp); // lq s3, 48(sp) c->lq(s2, 32, sp); // lq s2, 32(sp) c->lq(s1, 16, sp); // lq s1, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 112); // daddiu sp, sp, 112 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.collide_work = intern_from_c("*collide-work*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 27 collide-cache)", execute, 512); } } // namespace method_27_collide_cache } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_29_collide_cache { struct Cache { void* collide_work; // *collide-work* void* fake_scratchpad_data; } cache; 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->load_symbol(a0, cache.collide_work); // lw a0, *collide-work*(s7) // c->lui(v1, 28672); // lui v1, 28672 get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c); c->lbu(a1, 24, a1); // lbu a1, 24(a1) // nop // sll r0, r0, 0 c->lqc2(vf1, 48, a0); // lqc2 vf1, 48(a0) // nop // sll r0, r0, 0 c->lqc2(vf2, 64, a0); // lqc2 vf2, 64(a0) // nop // sll r0, r0, 0 c->lqc2(vf3, 80, a0); // lqc2 vf3, 80(a0) // nop // sll r0, r0, 0 c->lqc2(vf4, 96, a0); // lqc2 vf4, 96(a0) // nop // sll r0, r0, 0 c->lqc2(vf5, 16, v1); // lqc2 vf5, 16(v1) // nop // sll r0, r0, 0 c->lqc2(vf6, 48, v1); // lqc2 vf6, 48(v1) // nop // sll r0, r0, 0 c->lqc2(vf7, 80, v1); // lqc2 vf7, 80(v1) // nop // sll r0, r0, 0 c->lqc2(vf8, 112, v1); // lqc2 vf8, 112(v1) c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 c->lqc2(vf9, 144, v1); // lqc2 vf9, 144(v1) c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5 c->lqc2(vf10, 176, v1); // lqc2 vf10, 176(v1) c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5 c->lqc2(vf11, 208, v1); // lqc2 vf11, 208(v1) c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5 c->lqc2(vf12, 240, v1); // lqc2 vf12, 240(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, 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 block_1: c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 c->sqc2(vf5, 4096, v1); // sqc2 vf5, 4096(v1) c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf9); // vmaddax.xyzw acc, vf1, vf9 c->sqc2(vf6, 4128, v1); // sqc2 vf6, 4128(v1) c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9 c->sqc2(vf7, 4160, v1); // sqc2 vf7, 4160(v1) c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf3, vf9); // vmaddz.xyzw vf9, vf3, vf9 c->sqc2(vf8, 4192, v1); // sqc2 vf8, 4192(v1) c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 c->lqc2(vf5, 272, v1); // lqc2 vf5, 272(v1) c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf10); // vmaddax.xyzw acc, vf1, vf10 c->lqc2(vf6, 304, v1); // lqc2 vf6, 304(v1) c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf10); // vmadday.xyzw acc, vf2, vf10 c->lqc2(vf7, 336, v1); // lqc2 vf7, 336(v1) c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf3, vf10); // vmaddz.xyzw vf10, vf3, vf10 c->lqc2(vf8, 368, v1); // lqc2 vf8, 368(v1) c->daddiu(v1, v1, 256); // daddiu v1, v1, 256 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 c->daddiu(a0, a1, -4); // daddiu a0, a1, -4 c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf11); // vmadday.xyzw acc, vf2, vf11 bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L172 c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf3, vf11); // vmaddz.xyzw vf11, vf3, vf11 if (bc) {goto block_4;} // branch non-likely 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, 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 c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 c->sqc2(vf9, 3968, v1); // sqc2 vf9, 3968(v1) c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5 c->sqc2(vf10, 4000, v1); // sqc2 vf10, 4000(v1) c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5 c->sqc2(vf11, 4032, v1); // sqc2 vf11, 4032(v1) c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5 c->sqc2(vf12, 4064, v1); // sqc2 vf12, 4064(v1) // 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, vf6); // vmaddax.xyzw acc, vf1, vf6 c->daddiu(a1, a0, -4); // daddiu a1, a0, -4 c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6 bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L172 c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6 if (bc) {goto block_4;} // branch non-likely c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 c->lqc2(vf9, 144, v1); // lqc2 vf9, 144(v1) c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7 c->lqc2(vf10, 176, v1); // lqc2 vf10, 176(v1) c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7 c->lqc2(vf11, 208, v1); // lqc2 vf11, 208(v1) c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7 c->lqc2(vf12, 240, v1); // lqc2 vf12, 240(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, 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, 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 //beq r0, r0, L171 // beq r0, r0, L171 // nop // sll r0, r0, 0 goto block_1; // branch always block_4: 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() { cache.collide_work = intern_from_c("*collide-work*").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 29 collide-cache)", execute, 128); } } // namespace method_29_collide_cache } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_12_collide_shape_prim_mesh { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; c->daddiu(sp, sp, -80); // daddiu sp, sp, -80 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s3, 16, sp); // sq s3, 16(sp) c->sq(s4, 32, sp); // sq s4, 32(sp) c->sq(s5, 48, sp); // sq s5, 48(sp) c->sq(gp, 64, sp); // sq gp, 64(sp) c->mov64(s5, a0); // or s5, a0, r0 c->mov64(gp, a1); // or gp, a1, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s3, 68, s5); // lwu s3, 68(s5) c->daddiu(v1, gp, 108); // daddiu v1, gp, 108 c->lwu(a0, 4, gp); // lwu a0, 4(gp) bc = c->sgpr64(s3) == c->sgpr64(s7); // beq s3, s7, L147 // nop // sll r0, r0, 0 if (bc) {goto block_15;} // branch non-likely c->addiu(a1, r0, 100); // addiu a1, r0, 100 c->dsll(a2, a0, 1); // dsll a2, a0, 1 bc = c->sgpr64(a0) == c->sgpr64(a1); // beq a0, a1, L145 c->daddu(a0, a2, a0); // daddu a0, a2, a0 if (bc) {goto block_11;} // branch non-likely c->dsll(a0, a0, 4); // dsll a0, a0, 4 c->daddu(s4, v1, a0); // daddu s4, v1, a0 c->mov64(a0, s3); // or a0, s3, r0 c->lwu(v1, -4, a0); // lwu v1, -4(a0) c->lwu(t9, 72, v1); // lwu t9, 72(v1) c->lwu(v1, 0, s5); // lwu v1, 0(s5) c->lwu(v1, 136, v1); // lwu v1, 136(v1) c->lwu(v1, 112, v1); // lwu v1, 112(v1) c->lb(a1, 8, s5); // lb a1, 8(s5) c->dsll(a1, a1, 5); // dsll a1, a1, 5 c->daddu(v1, v1, a1); // daddu v1, v1, a1 c->lwu(v1, 28, v1); // lwu v1, 28(v1) c->daddu(a1, r0, v1); // daddu a1, r0, v1 // c->lui(a2, 28672); // lui a2, 28672 get_fake_spad_addr(a2, cache.fake_scratchpad_data, 0, c); 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(v1, v0); // or v1, v0, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(a0, 4, gp); // lwu a0, 4(gp) c->addiu(a1, r0, *max_tri_count); // addiu a1, r0, 460 c->lwu(v1, 0, gp); // lwu v1, 0(gp) c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0 // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf1, a0); // qmtc2.i vf1, a0 // nop // sll r0, r0, 0 c->dsubu(a0, a1, v1); // dsubu a0, a1, v1 c->dsll(t1, v1, 6); // dsll t1, v1, 6 bc = ((s64)c->sgpr64(a0)) < 0; // bltz a0, L146 c->daddiu(a2, s3, 28); // daddiu a2, s3, 28 if (bc) {goto block_12;} // branch non-likely c->mov64(a0, v1); // or a0, v1, r0 c->lwu(a3, 4, s3); // lwu a3, 4(s3) c->daddiu(t2, gp, 4908); // daddiu t2, gp, 4908 c->lq(t0, 60, gp); // lq t0, 60(gp) c->daddu(t1, t2, t1); // daddu t1, t2, t1 c->lq(t2, 76, gp); // lq t2, 76(gp) // c->lui(t3, 28672); // lui t3, 28672 get_fake_spad_addr(t3, cache.fake_scratchpad_data, 0, c); c->lwu(t4, 8, gp); // lwu t4, 8(gp) c->vsub(DEST::zw, vf1, vf0, vf0); // vsub.zw vf1, vf0, vf0 // nop // sll r0, r0, 0 block_4: bc = c->sgpr64(a3) == 0; // beq a3, r0, L144 c->lbu(t5, 0, a2); // lbu t5, 0(a2) if (bc) {goto block_9;} // branch non-likely c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 c->lbu(t6, 1, a2); // lbu t6, 1(a2) c->dsll(t8, t5, 5); // dsll t8, t5, 5 c->lbu(t5, 2, a2); // lbu t5, 2(a2) c->dsll(t7, t6, 5); // dsll t7, t6, 5 c->daddu(t6, t8, t3); // daddu t6, t8, t3 c->dsll(t5, t5, 5); // dsll t5, t5, 5 // nop // sll r0, r0, 0 c->daddu(t7, t7, t3); // daddu t7, t7, t3 c->lq(t9, 16, t6); // lq t9, 16(t6) c->daddu(t5, t5, t3); // daddu t5, t5, t3 c->lq(s3, 16, t7); // lq s3, 16(t7) c->pminw(ra, t9, s3); // pminw ra, t9, s3 c->lq(t8, 16, t5); // lq t8, 16(t5) c->pmaxw(t9, t9, s3); // pmaxw t9, t9, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(ra, ra, t8); // pminw ra, ra, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(t8, t9, t8); // pmaxw t8, t9, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(t9, ra, t2); // pcgtw t9, ra, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(ra, t0, t8); // pcgtw ra, t0, t8 c->lwu(t8, 4, a2); // lwu t8, 4(a2) c->por(t9, t9, ra); // por t9, t9, ra c->lq(t6, 0, t6); // lq t6, 0(t6) c->ppach(t9, r0, t9); // ppach t9, r0, t9 c->lq(t7, 0, t7); // lq t7, 0(t7) c->dsll(t9, t9, 16); // dsll t9, t9, 16 c->lq(t5, 0, t5); // lq t5, 0(t5) bc = c->sgpr64(t9) != 0; // bne t9, r0, L143 c->daddiu(a2, a2, 8); // daddiu a2, a2, 8 if (bc) {goto block_4;} // branch non-likely bc = c->sgpr64(v1) == c->sgpr64(a1); // beq v1, a1, L146 c->sqc2(vf1, 48, t1); // sqc2 vf1, 48(t1) if (bc) {goto block_12;} // branch non-likely c->and_(t9, t8, t4); // and t9, t8, t4 c->sw(t8, 48, t1); // sw t8, 48(t1) bc = c->sgpr64(t9) != 0; // bne t9, r0, L143 c->sq(t6, 0, t1); // sq t6, 0(t1) if (bc) {goto block_4;} // branch non-likely // nop // sll r0, r0, 0 c->sq(t7, 16, t1); // sq t7, 16(t1) c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 c->sq(t5, 32, t1); // sq t5, 32(t1) //beq r0, r0, L143 // beq r0, r0, L143 c->daddiu(t1, t1, 64); // daddiu t1, t1, 64 goto block_4; // branch always block_9: c->dsubu(a3, v1, a0); // dsubu a3, v1, a0 c->lwu(t0, 4, gp); // lwu t0, 4(gp) bc = c->sgpr64(a3) == 0; // beq a3, r0, L147 c->lq(a1, 12, s5); // lq a1, 12(s5) if (bc) {goto block_15;} // branch non-likely // nop // sll r0, r0, 0 c->lq(a2, 28, s5); // lq a2, 28(s5) // nop // sll r0, r0, 0 c->sq(r0, 32, s4); // sq r0, 32(s4) // nop // sll r0, r0, 0 c->sh(a3, 42, s4); // sh a3, 42(s4) // nop // sll r0, r0, 0 c->sw(gp, 32, s4); // sw gp, 32(s4) // nop // sll r0, r0, 0 c->sw(s5, 36, s4); // sw s5, 36(s4) // nop // sll r0, r0, 0 c->sh(a0, 40, s4); // sh a0, 40(s4) c->daddiu(a0, t0, 1); // daddiu a0, t0, 1 c->sq(a1, 0, s4); // sq a1, 0(s4) // nop // sll r0, r0, 0 c->sq(a2, 16, s4); // sq a2, 16(s4) // nop // sll r0, r0, 0 c->sw(a0, 4, gp); // sw a0, 4(gp) //beq r0, r0, L147 // beq r0, r0, L147 c->sw(v1, 0, gp); // sw v1, 0(gp) goto block_15; // branch always block_11: c->load_symbol(t9, cache.format); // lw t9, format(s7) c->addiu(a0, r0, 0); // addiu a0, r0, 0 // daddiu a1, fp, L306 // daddiu a1, fp, L306 printf("too many prims\n"); 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 //beq r0, r0, L147 // beq r0, r0, L147 // nop // sll r0, r0, 0 goto block_15; // branch always block_12: c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L147 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t // c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) // c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L147 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) // daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("too many tris\n"); c->mov64(v1, v0); // or v1, v0, r0 block_15: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 64, sp); // lq gp, 64(sp) c->lq(s5, 48, sp); // lq s5, 48(sp) c->lq(s4, 32, sp); // lq s4, 32(sp) c->lq(s3, 16, sp); // lq s3, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 80); // daddiu sp, sp, 80 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 12 collide-shape-prim-mesh)", execute, 128); } } // namespace method_12_collide_shape_prim_mesh } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_14_collide_shape_prim_mesh { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; c->daddiu(sp, sp, -80); // daddiu sp, sp, -80 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s3, 16, sp); // sq s3, 16(sp) c->sq(s4, 32, sp); // sq s4, 32(sp) c->sq(s5, 48, sp); // sq s5, 48(sp) c->sq(gp, 64, sp); // sq gp, 64(sp) c->mov64(s5, a0); // or s5, a0, r0 c->mov64(gp, a1); // or gp, a1, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s3, 68, s5); // lwu s3, 68(s5) c->daddiu(v1, gp, 108); // daddiu v1, gp, 108 c->lwu(a0, 4, gp); // lwu a0, 4(gp) bc = c->sgpr64(s3) == c->sgpr64(s7); // beq s3, s7, L112 // nop // sll r0, r0, 0 if (bc) {goto block_15;} // branch non-likely c->addiu(a1, r0, 100); // addiu a1, r0, 100 c->dsll(a2, a0, 1); // dsll a2, a0, 1 bc = c->sgpr64(a0) == c->sgpr64(a1); // beq a0, a1, L110 c->daddu(a0, a2, a0); // daddu a0, a2, a0 if (bc) {goto block_11;} // branch non-likely c->dsll(a0, a0, 4); // dsll a0, a0, 4 c->daddu(s4, v1, a0); // daddu s4, v1, a0 c->mov64(a0, s3); // or a0, s3, r0 c->lwu(v1, -4, a0); // lwu v1, -4(a0) c->lwu(t9, 72, v1); // lwu t9, 72(v1) c->lwu(v1, 0, s5); // lwu v1, 0(s5) c->lwu(v1, 136, v1); // lwu v1, 136(v1) c->lwu(v1, 112, v1); // lwu v1, 112(v1) c->lb(a1, 8, s5); // lb a1, 8(s5) c->dsll(a1, a1, 5); // dsll a1, a1, 5 c->daddu(v1, v1, a1); // daddu v1, v1, a1 c->lwu(v1, 28, v1); // lwu v1, 28(v1) c->daddu(a1, r0, v1); // daddu a1, r0, v1 // c->lui(a2, 28672); // lui a2, 28672 get_fake_spad_addr(a2, cache.fake_scratchpad_data, 0, c); 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(v1, v0); // or v1, v0, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(a0, 4, gp); // lwu a0, 4(gp) c->addiu(a1, r0, *max_tri_count); // addiu a1, r0, 460 c->lwu(v1, 0, gp); // lwu v1, 0(gp) c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0 // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf1, a0); // qmtc2.i vf1, a0 // nop // sll r0, r0, 0 c->dsubu(a0, a1, v1); // dsubu a0, a1, v1 c->dsll(t1, v1, 6); // dsll t1, v1, 6 bc = ((s64)c->sgpr64(a0)) < 0; // bltz a0, L111 c->daddiu(a2, s3, 28); // daddiu a2, s3, 28 if (bc) {goto block_12;} // branch non-likely c->mov64(a0, v1); // or a0, v1, r0 c->lwu(a3, 4, s3); // lwu a3, 4(s3) c->daddiu(t2, gp, 4908); // daddiu t2, gp, 4908 c->lq(t0, 60, gp); // lq t0, 60(gp) c->daddu(t1, t2, t1); // daddu t1, t2, t1 c->lq(t2, 76, gp); // lq t2, 76(gp) // c->lui(t3, 28672); // lui t3, 28672 get_fake_spad_addr(t3, cache.fake_scratchpad_data, 0, c); c->lwu(t4, 8, gp); // lwu t4, 8(gp) c->vsub(DEST::zw, vf1, vf0, vf0); // vsub.zw vf1, vf0, vf0 // nop // sll r0, r0, 0 block_4: bc = c->sgpr64(a3) == 0; // beq a3, r0, L109 c->lbu(t5, 0, a2); // lbu t5, 0(a2) if (bc) {goto block_9;} // branch non-likely c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 c->lbu(t6, 1, a2); // lbu t6, 1(a2) c->dsll(t8, t5, 5); // dsll t8, t5, 5 c->lbu(t5, 2, a2); // lbu t5, 2(a2) c->dsll(t7, t6, 5); // dsll t7, t6, 5 c->daddu(t6, t8, t3); // daddu t6, t8, t3 c->dsll(t5, t5, 5); // dsll t5, t5, 5 // nop // sll r0, r0, 0 c->daddu(t7, t7, t3); // daddu t7, t7, t3 c->lq(t9, 16, t6); // lq t9, 16(t6) c->daddu(t5, t5, t3); // daddu t5, t5, t3 c->lq(s3, 16, t7); // lq s3, 16(t7) c->pminw(ra, t9, s3); // pminw ra, t9, s3 c->lq(t8, 16, t5); // lq t8, 16(t5) c->pmaxw(t9, t9, s3); // pmaxw t9, t9, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(ra, ra, t8); // pminw ra, ra, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(t8, t9, t8); // pmaxw t8, t9, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(t9, ra, t2); // pcgtw t9, ra, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(ra, t0, t8); // pcgtw ra, t0, t8 c->lwu(t8, 4, a2); // lwu t8, 4(a2) c->por(t9, t9, ra); // por t9, t9, ra c->lq(t6, 0, t6); // lq t6, 0(t6) c->ppach(t9, r0, t9); // ppach t9, r0, t9 c->lq(t7, 0, t7); // lq t7, 0(t7) c->dsll(t9, t9, 16); // dsll t9, t9, 16 c->lq(t5, 0, t5); // lq t5, 0(t5) bc = c->sgpr64(t9) != 0; // bne t9, r0, L108 c->daddiu(a2, a2, 8); // daddiu a2, a2, 8 if (bc) {goto block_4;} // branch non-likely bc = c->sgpr64(v1) == c->sgpr64(a1); // beq v1, a1, L111 c->sqc2(vf1, 48, t1); // sqc2 vf1, 48(t1) if (bc) {goto block_12;} // branch non-likely c->and_(t9, t8, t4); // and t9, t8, t4 c->sw(t8, 48, t1); // sw t8, 48(t1) bc = c->sgpr64(t9) != 0; // bne t9, r0, L108 c->sq(t6, 0, t1); // sq t6, 0(t1) if (bc) {goto block_4;} // branch non-likely c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 c->sq(t7, 16, t1); // sq t7, 16(t1) // nop // sll r0, r0, 0 c->sq(t5, 32, t1); // sq t5, 32(t1) //beq r0, r0, L108 // beq r0, r0, L108 c->daddiu(t1, t1, 64); // daddiu t1, t1, 64 goto block_4; // branch always block_9: c->dsubu(a3, v1, a0); // dsubu a3, v1, a0 c->lwu(t0, 4, gp); // lwu t0, 4(gp) bc = c->sgpr64(a3) == 0; // beq a3, r0, L112 c->lq(a1, 12, s5); // lq a1, 12(s5) if (bc) {goto block_15;} // branch non-likely // nop // sll r0, r0, 0 c->lq(a2, 28, s5); // lq a2, 28(s5) // nop // sll r0, r0, 0 c->sq(r0, 32, s4); // sq r0, 32(s4) // nop // sll r0, r0, 0 c->sh(a3, 42, s4); // sh a3, 42(s4) // nop // sll r0, r0, 0 c->sw(gp, 32, s4); // sw gp, 32(s4) // nop // sll r0, r0, 0 c->sw(s5, 36, s4); // sw s5, 36(s4) // nop // sll r0, r0, 0 c->sh(a0, 40, s4); // sh a0, 40(s4) c->daddiu(a0, t0, 1); // daddiu a0, t0, 1 c->sq(a1, 0, s4); // sq a1, 0(s4) // nop // sll r0, r0, 0 c->sq(a2, 16, s4); // sq a2, 16(s4) // nop // sll r0, r0, 0 c->sw(a0, 4, gp); // sw a0, 4(gp) //beq r0, r0, L112 // beq r0, r0, L112 c->sw(v1, 0, gp); // sw v1, 0(gp) goto block_15; // branch always block_11: c->load_symbol(t9, cache.format); // lw t9, format(s7) c->addiu(a0, r0, 0); // addiu a0, r0, 0 // daddiu a1, fp, L306 // daddiu a1, fp, L306 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 printf("too many prims\n"); //beq r0, r0, L112 // beq r0, r0, L112 // nop // sll r0, r0, 0 goto block_15; // branch always block_12: c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L112 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t // c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) // c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L112 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) // daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("too many tris\n"); c->mov64(v1, v0); // or v1, v0, r0 block_15: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 64, sp); // lq gp, 64(sp) c->lq(s5, 48, sp); // lq s5, 48(sp) c->lq(s4, 32, sp); // lq s4, 32(sp) c->lq(s3, 16, sp); // lq s3, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 80); // daddiu sp, sp, 80 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 14 collide-shape-prim-mesh)", execute, 256); } } // namespace method_14_collide_shape_prim_mesh } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_13_collide_shape_prim_mesh { struct Cache { void* already_printed_exeeded_max_cache_tris; // *already-printed-exeeded-max-cache-tris* void* cheat_mode; // *cheat-mode* void* collide_work; // *collide-work* void* stdcon; // *stdcon* void* debug; // debug void* format; // format void* fake_scratchpad_data; } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; c->daddiu(sp, sp, -80); // daddiu sp, sp, -80 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s3, 16, sp); // sq s3, 16(sp) c->sq(s4, 32, sp); // sq s4, 32(sp) c->sq(s5, 48, sp); // sq s5, 48(sp) c->sq(gp, 64, sp); // sq gp, 64(sp) c->mov64(s5, a0); // or s5, a0, r0 c->mov64(gp, a1); // or gp, a1, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lwu(s3, 68, s5); // lwu s3, 68(s5) c->daddiu(v1, gp, 108); // daddiu v1, gp, 108 c->lwu(a0, 4, gp); // lwu a0, 4(gp) bc = c->sgpr64(s3) == c->sgpr64(s7); // beq s3, s7, L77 // nop // sll r0, r0, 0 if (bc) {goto block_15;} // branch non-likely c->addiu(a1, r0, 100); // addiu a1, r0, 100 c->dsll(a2, a0, 1); // dsll a2, a0, 1 bc = c->sgpr64(a0) == c->sgpr64(a1); // beq a0, a1, L75 c->daddu(a0, a2, a0); // daddu a0, a2, a0 if (bc) {goto block_11;} // branch non-likely c->dsll(a0, a0, 4); // dsll a0, a0, 4 c->daddu(s4, v1, a0); // daddu s4, v1, a0 c->mov64(a0, s3); // or a0, s3, r0 c->lwu(v1, -4, a0); // lwu v1, -4(a0) c->lwu(t9, 76, v1); // lwu t9, 76(v1) c->lwu(v1, 0, s5); // lwu v1, 0(s5) c->lwu(v1, 136, v1); // lwu v1, 136(v1) c->lwu(v1, 112, v1); // lwu v1, 112(v1) c->lb(a1, 8, s5); // lb a1, 8(s5) c->dsll(a1, a1, 5); // dsll a1, a1, 5 c->daddu(v1, v1, a1); // daddu v1, v1, a1 c->lwu(v1, 28, v1); // lwu v1, 28(v1) c->daddu(a1, r0, v1); // daddu a1, r0, v1 c->load_symbol(v1, cache.collide_work); // lw v1, *collide-work*(s7) c->daddiu(a2, v1, 48); // daddiu a2, v1, 48 // c->lui(a3, 28672); // lui a3, 28672 get_fake_spad_addr(a3, cache.fake_scratchpad_data, 0, c); 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(v1, v0); // or v1, v0, r0 c->load_symbol(t2, cache.collide_work); // lw t2, *collide-work*(s7) // nop // sll r0, r0, 0 c->lwu(a0, 4, gp); // lwu a0, 4(gp) c->addiu(a1, r0, *max_tri_count); // addiu a1, r0, 460 c->lwu(v1, 0, gp); // lwu v1, 0(gp) c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0 // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf1, a0); // qmtc2.i vf1, a0 // nop // sll r0, r0, 0 c->dsubu(a0, a1, v1); // dsubu a0, a1, v1 c->dsll(t1, v1, 6); // dsll t1, v1, 6 bc = ((s64)c->sgpr64(a0)) < 0; // bltz a0, L76 c->daddiu(a2, s3, 28); // daddiu a2, s3, 28 if (bc) {goto block_12;} // branch non-likely c->mov64(a0, v1); // or a0, v1, r0 c->lwu(a3, 4, s3); // lwu a3, 4(s3) c->daddiu(t3, gp, 4908); // daddiu t3, gp, 4908 c->lq(t0, 16, t2); // lq t0, 16(t2) c->daddu(t1, t3, t1); // daddu t1, t3, t1 c->lq(t2, 32, t2); // lq t2, 32(t2) // c->lui(t3, 28672); // lui t3, 28672 get_fake_spad_addr(t3, cache.fake_scratchpad_data, 0, c); c->lwu(t4, 8, gp); // lwu t4, 8(gp) c->vsub(DEST::zw, vf1, vf0, vf0); // vsub.zw vf1, vf0, vf0 // nop // sll r0, r0, 0 block_4: bc = c->sgpr64(a3) == 0; // beq a3, r0, L74 c->lbu(t5, 0, a2); // lbu t5, 0(a2) if (bc) {goto block_9;} // branch non-likely c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 c->lbu(t6, 1, a2); // lbu t6, 1(a2) c->dsll(t8, t5, 5); // dsll t8, t5, 5 c->lbu(t5, 2, a2); // lbu t5, 2(a2) c->dsll(t7, t6, 5); // dsll t7, t6, 5 c->daddu(t6, t8, t3); // daddu t6, t8, t3 c->dsll(t5, t5, 5); // dsll t5, t5, 5 // nop // sll r0, r0, 0 c->daddu(t7, t7, t3); // daddu t7, t7, t3 c->lq(t9, 16, t6); // lq t9, 16(t6) c->daddu(t5, t5, t3); // daddu t5, t5, t3 c->lq(s3, 16, t7); // lq s3, 16(t7) // nop // sll r0, r0, 0 c->lq(t8, 16, t5); // lq t8, 16(t5) c->pminw(ra, t9, s3); // pminw ra, t9, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(t9, t9, s3); // pmaxw t9, t9, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(ra, ra, t8); // pminw ra, ra, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(t8, t9, t8); // pmaxw t8, t9, t8 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(t9, ra, t2); // pcgtw t9, ra, t2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(ra, t0, t8); // pcgtw ra, t0, t8 c->lwu(t8, 4, a2); // lwu t8, 4(a2) c->por(t9, t9, ra); // por t9, t9, ra c->lq(t6, 0, t6); // lq t6, 0(t6) c->ppach(t9, r0, t9); // ppach t9, r0, t9 c->lq(t7, 0, t7); // lq t7, 0(t7) c->dsll(t9, t9, 16); // dsll t9, t9, 16 c->lq(t5, 0, t5); // lq t5, 0(t5) bc = c->sgpr64(t9) != 0; // bne t9, r0, L73 c->daddiu(a2, a2, 8); // daddiu a2, a2, 8 if (bc) {goto block_4;} // branch non-likely bc = c->sgpr64(v1) == c->sgpr64(a1); // beq v1, a1, L76 c->sqc2(vf1, 48, t1); // sqc2 vf1, 48(t1) if (bc) {goto block_12;} // branch non-likely c->and_(t9, t8, t4); // and t9, t8, t4 c->sw(t8, 48, t1); // sw t8, 48(t1) bc = c->sgpr64(t9) != 0; // bne t9, r0, L73 c->sq(t6, 0, t1); // sq t6, 0(t1) if (bc) {goto block_4;} // branch non-likely c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 c->sq(t7, 16, t1); // sq t7, 16(t1) // nop // sll r0, r0, 0 c->sq(t5, 32, t1); // sq t5, 32(t1) //beq r0, r0, L73 // beq r0, r0, L73 c->daddiu(t1, t1, 64); // daddiu t1, t1, 64 goto block_4; // branch always block_9: c->dsubu(a3, v1, a0); // dsubu a3, v1, a0 c->lwu(t0, 4, gp); // lwu t0, 4(gp) bc = c->sgpr64(a3) == 0; // beq a3, r0, L77 c->lq(a1, 12, s5); // lq a1, 12(s5) if (bc) {goto block_15;} // branch non-likely // nop // sll r0, r0, 0 c->lq(a2, 28, s5); // lq a2, 28(s5) // nop // sll r0, r0, 0 c->sq(r0, 32, s4); // sq r0, 32(s4) // nop // sll r0, r0, 0 c->sh(a3, 42, s4); // sh a3, 42(s4) // nop // sll r0, r0, 0 c->sw(gp, 32, s4); // sw gp, 32(s4) // nop // sll r0, r0, 0 c->sw(s5, 36, s4); // sw s5, 36(s4) // nop // sll r0, r0, 0 c->sh(a0, 40, s4); // sh a0, 40(s4) c->daddiu(a0, t0, 1); // daddiu a0, t0, 1 c->sq(a1, 0, s4); // sq a1, 0(s4) // nop // sll r0, r0, 0 c->sq(a2, 16, s4); // sq a2, 16(s4) // nop // sll r0, r0, 0 c->sw(a0, 4, gp); // sw a0, 4(gp) //beq r0, r0, L77 // beq r0, r0, L77 c->sw(v1, 0, gp); // sw v1, 0(gp) goto block_15; // branch always block_11: c->load_symbol(t9, cache.format); // lw t9, format(s7) c->addiu(a0, r0, 0); // addiu a0, r0, 0 // daddiu a1, fp, L306 // daddiu a1, fp, L306 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 printf("too many prims\n"); //beq r0, r0, L77 // beq r0, r0, L77 // nop // sll r0, r0, 0 goto block_15; // branch always block_12: c->load_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// lw v1, *already-printed-exeeded-max-cache-tris*(s7) bc = c->sgpr64(s7) != c->sgpr64(v1); // bne s7, v1, L77 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->daddiu(v1, s7, 8); // daddiu v1, s7, #t // c->store_symbol(v1, cache.already_printed_exeeded_max_cache_tris);// sw v1, *already-printed-exeeded-max-cache-tris*(s7) // c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L77 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_15;} // branch non-likely c->load_symbol(t9, cache.format); // lw t9, format(s7) c->load_symbol(a0, cache.stdcon); // lw a0, *stdcon*(s7) // daddiu a1, fp, L305 // daddiu a1, fp, L305 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 printf("too many tris\n"); c->mov64(v1, v0); // or v1, v0, r0 block_15: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 64, sp); // lq gp, 64(sp) c->lq(s5, 48, sp); // lq s5, 48(sp) c->lq(s4, 32, sp); // lq s4, 32(sp) c->lq(s3, 16, sp); // lq s3, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 80); // daddiu sp, sp, 80 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.already_printed_exeeded_max_cache_tris = intern_from_c("*already-printed-exeeded-max-cache-tris*").c(); cache.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.collide_work = intern_from_c("*collide-work*").c(); cache.stdcon = intern_from_c("*stdcon*").c(); cache.debug = intern_from_c("debug").c(); cache.format = intern_from_c("format").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 13 collide-shape-prim-mesh)", execute, 128); } } // namespace method_13_collide_shape_prim_mesh } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_30_collide_cache { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; // u32 call_addr = 0; bool cop1_bc = false; // nop // sll r0, r0, 0 c->daddiu(a0, a0, 4908); // daddiu a0, a0, 4908 c->lhu(a3, 40, a2); // lhu a3, 40(a2) // nop // sll r0, r0, 0 c->lhu(v1, 42, a2); // lhu v1, 42(a2) c->dsll(a2, a3, 6); // dsll a2, a3, 6 c->lwc1(f4, 0, a1); // lwc1 f4, 0(a1) c->daddu(a0, a0, a2); // daddu a0, a0, a2 // nop // sll r0, r0, 0 block_1: bc = c->sgpr64(v1) == 0; // beq v1, r0, L56 c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0) if (bc) {goto block_9;} // branch non-likely c->daddiu(v1, v1, -1); // daddiu v1, v1, -1 c->lqc2(vf2, 16, a0); // lqc2 vf2, 16(a0) c->vsub(DEST::xyzw, vf5, vf2, vf1); // vsub.xyzw vf5, vf2, vf1 c->lqc2(vf3, 32, a0); // lqc2 vf3, 32(a0) c->vsub(DEST::xyzw, vf6, vf2, vf3); // vsub.xyzw vf6, vf2, vf3 c->lqc2(vf4, 16, a1); // lqc2 vf4, 16(a1) // nop // sll r0, r0, 0 c->lqc2(vf20, 32, a1); // lqc2 vf20, 32(a1) c->vsub(DEST::xyzw, vf7, vf2, vf4); // vsub.xyzw vf7, vf2, vf4 c->lwu(a2, 48, a0); // lwu a2, 48(a0) c->vmul(DEST::xyzw, vf8, vf20, vf20); // vmul.xyzw vf8, vf20, vf20 c->lwu(a3, 4, a1); // lwu a3, 4(a1) c->vopmula(vf6, vf5); // vopmula.xyz acc, vf6, vf5 c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 c->vopmsub(vf9, vf5, vf6); // vopmsub.xyz vf9, vf5, vf6 c->and_(a2, a2, a3); // and a2, a2, a3 bc = c->sgpr64(a2) != 0; // bne a2, r0, L55 c->vadd_bc(DEST::x, BC::y, vf8, vf8, vf8); // vaddy.x vf8, vf8, vf8 if (bc) {goto block_1;} // branch non-likely c->vmul(DEST::xyzw, vf10, vf9, vf9); // vmul.xyzw vf10, vf9, vf9 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf7, vf7, vf9); // vmul.xyzw vf7, vf7, vf9 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf11, vf20, vf9); // vmul.xyzw vf11, vf20, vf9 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf8, vf8, vf8); // vaddz.x vf8, vf8, vf8 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf10, vf10, vf10); // vaddy.x vf10, vf10, vf10 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf7, vf7, vf7); // vaddy.x vf7, vf7, vf7 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf11, vf11, vf11); // vaddy.x vf11, vf11, vf11 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf10, vf10, vf10); // vaddz.x vf10, vf10, vf10 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf7, vf7, vf7); // vaddz.x vf7, vf7, vf7 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf11, vf11, vf11); // vaddz.x vf11, vf11, vf11 // nop // sll r0, r0, 0 c->vrsqrt(vf0, BC::w, vf10, BC::x); // vrsqrt Q, vf0.w, vf10.x // nop // sll r0, r0, 0 c->mov128_gpr_vf(a2, vf11); // qmfc2.i a2, vf11 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a3, vf7); // qmfc2.i a3, vf7 c->mtc1(f2, a2); // mtc1 f2, a2 c->mtc1(f1, a3); // mtc1 f1, a3 c->divs(f3, f1, f2); // div.s f3, f1, f2 c->vmove(DEST::w, vf9, vf0); // vmove.w vf9, vf0 c->sll(a2, a2, 1); // sll a2, a2, 1 bc = c->sgpr64(a2) == 0; // beq a2, r0, L55 // nop // sll r0, r0, 0 if (bc) {goto block_1;} // branch non-likely c->vwaitq(); // vwaitq // nop // sll r0, r0, 0 c->vmulq(DEST::xyz, vf9, vf9); // vmulq.xyz vf9, vf9, Q c->mfc1(a2, f3); // mfc1 a2, f3 bc = ((s64)c->sgpr64(a2)) < 0; // bltz a2, L55 // nop // sll r0, r0, 0 if (bc) {goto block_1;} // branch non-likely c->mov128_vf_gpr(vf12, a2); // qmtc2.i vf12, a2 // nop // sll r0, r0, 0 cop1_bc = c->fprs[f4] <= c->fprs[f3]; // c.le.s f4, f3 // nop // sll r0, r0, 0 bc = cop1_bc; // bc1t L55 c->vmula_bc(DEST::xyzw, BC::x, vf20, vf12); // vmulax.xyzw acc, vf20, vf12 if (bc) {goto block_1;} // branch non-likely c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf4, vf0); // vmaddw.xyzw vf13, vf4, vf0 // nop // sll r0, r0, 0 c->vsub(DEST::xyzw, vf14, vf2, vf13); // vsub.xyzw vf14, vf2, vf13 // nop // sll r0, r0, 0 c->vsub(DEST::xyzw, vf15, vf13, vf3); // vsub.xyzw vf15, vf13, vf3 // nop // sll r0, r0, 0 c->vsub(DEST::xyzw, vf16, vf13, vf1); // vsub.xyzw vf16, vf13, vf1 // nop // sll r0, r0, 0 c->vopmula(vf6, vf14); // vopmula.xyz acc, vf6, vf14 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf21, vf20, vf9); // vmul.xyzw vf21, vf20, vf9 // nop // sll r0, r0, 0 c->vopmsub(vf17, vf14, vf6); // vopmsub.xyz vf17, vf14, vf6 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf21, vf21, vf21); // vaddy.x vf21, vf21, vf21 // nop // sll r0, r0, 0 c->vopmula(vf14, vf5); // vopmula.xyz acc, vf14, vf5 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf21, vf21, vf21); // vaddz.x vf21, vf21, vf21 // nop // sll r0, r0, 0 c->mtc1(f6, r0); // mtc1 f6, r0 // nop // sll r0, r0, 0 c->vopmsub(vf18, vf5, vf14); // vopmsub.xyz vf18, vf5, vf14 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a2, vf21); // qmfc2.i a2, vf21 // nop // sll r0, r0, 0 c->mtc1(f5, a2); // mtc1 f5, a2 // nop // sll r0, r0, 0 cop1_bc = c->fprs[f6] <= c->fprs[f5]; // c.le.s f6, f5 // nop // sll r0, r0, 0 bc = cop1_bc; // bc1t L55 c->vopmula(vf15, vf16); // vopmula.xyz acc, vf15, vf16 if (bc) {goto block_1;} // branch non-likely c->vopmsub(vf19, vf16, vf15); // vopmsub.xyz vf19, vf16, vf15 // nop // sll r0, r0, 0 c->vmul(DEST::xyz, vf17, vf17, vf9); // vmul.xyz vf17, vf17, vf9 // nop // sll r0, r0, 0 c->vmul(DEST::xyz, vf18, vf18, vf9); // vmul.xyz vf18, vf18, vf9 // nop // sll r0, r0, 0 c->vmul(DEST::xyz, vf19, vf19, vf9); // vmul.xyz vf19, vf19, vf9 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::x, vf17, vf17, vf17); // vaddx.y vf17, vf17, vf17 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::x, vf18, vf18, vf18); // vaddx.y vf18, vf18, vf18 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::x, vf19, vf19, vf19); // vaddx.y vf19, vf19, vf19 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::z, vf17, vf17, vf17); // vaddz.y vf17, vf17, vf17 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::z, vf18, vf18, vf18); // vaddz.y vf18, vf18, vf18 // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::z, vf19, vf19, vf19); // vaddz.y vf19, vf19, vf19 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a3, vf17); // qmfc2.i a3, vf17 // nop // sll r0, r0, 0 c->mov128_gpr_vf(t0, vf18); // qmfc2.i t0, vf18 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a2, vf19); // qmfc2.i a2, vf19 // nop // sll r0, r0, 0 c->or_(a3, a3, t0); // or a3, a3, t0 // nop // sll r0, r0, 0 c->or_(a3, a3, a2); // or a3, a3, a2 c->lwu(a2, 8, a1); // lwu a2, 8(a1) bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L55 c->lwu(a3, -16, a0); // lwu a3, -16(a0) if (bc) {goto block_1;} // branch non-likely // nop // sll r0, r0, 0 c->swc1(f3, 0, a1); // swc1 f3, 0(a1) c->movs(f4, f3); // mov.s f4, f3 c->sqc2(vf1, 0, a2); // sqc2 vf1, 0(a2) // nop // sll r0, r0, 0 c->sqc2(vf2, 16, a2); // sqc2 vf2, 16(a2) // nop // sll r0, r0, 0 c->sqc2(vf3, 32, a2); // sqc2 vf3, 32(a2) // nop // sll r0, r0, 0 c->sqc2(vf9, 64, a2); // sqc2 vf9, 64(a2) // nop // sll r0, r0, 0 c->sw(a3, 80, a2); // sw a3, 80(a2) //beq r0, r0, L55 // beq r0, r0, L55 c->sqc2(vf13, 48, a2); // sqc2 vf13, 48(a2) goto block_1; // branch always block_9: 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 30 collide-cache)", execute, 128); } } // namespace method_30_collide_cache } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_9_collide_cache_prim { struct Cache { void* moving_sphere_triangle_intersect; // moving-sphere-triangle-intersect } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; bool cop1_bc = false; c->daddiu(sp, sp, -224); // daddiu sp, sp, -224 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s1, 128, sp); // sq s1, 128(sp) c->sq(s2, 144, sp); // sq s2, 144(sp) c->sq(s3, 160, sp); // sq s3, 160(sp) c->sq(s4, 176, sp); // sq s4, 176(sp) c->sq(s5, 192, sp); // sq s5, 192(sp) c->sq(gp, 208, sp); // sq gp, 208(sp) c->mov64(gp, a1); // or gp, a1, r0 c->mov64(s5, a2); // or s5, a2, r0 c->mov64(s4, a3); // or s4, a3, r0 c->daddiu(s3, sp, 16); // daddiu s3, sp, 16 // nop // sll r0, r0, 0 c->mtc1(f0, r0); // mtc1 f0, r0 c->sw(t1, 8, s3); // sw t1, 8(s3) c->mtc1(f1, t0); // mtc1 f1, t0 c->lhu(a1, 40, a0); // lhu a1, 40(a0) // nop // sll r0, r0, 0 c->lwu(v1, 32, a0); // lwu v1, 32(a0) cop1_bc = c->fprs[f0] <= c->fprs[f1]; // c.le.s f0, f1 c->dsll(a1, a1, 6); // dsll a1, a1, 6 bc = cop1_bc; // bc1t L37 c->daddiu(v1, v1, 4908); // daddiu v1, v1, 4908 if (bc) {goto block_2;} // branch non-likely c->fprs[f1] = 2.0; // lwc1 f1, L310(fp) // nop // sll r0, r0, 0 block_2: c->daddu(s2, v1, a1); // daddu s2, v1, a1 c->swc1(f1, 0, s3); // swc1 f1, 0(s3) // nop // sll r0, r0, 0 c->lhu(s1, 42, a0); // lhu s1, 42(a0) // nop // sll r0, r0, 0 c->swc1(f1, 4, s3); // swc1 f1, 4(s3) block_3: bc = c->sgpr64(s1) == 0; // beq s1, r0, L40 c->daddiu(s1, s1, -1); // daddiu s1, s1, -1 if (bc) {goto block_14;} // branch non-likely c->load_symbol(t9, cache.moving_sphere_triangle_intersect);// lw t9, moving-sphere-triangle-intersect(s7) c->mov64(a0, s5); // or a0, s5, r0 c->mov64(a1, s4); // or a1, s4, r0 c->lwc1(f0, 12, s5); // lwc1 f0, 12(s5) c->mfc1(a2, f0); // mfc1 a2, f0 c->daddu(a3, r0, s2); // daddu a3, r0, s2 c->daddiu(t0, s3, 64); // daddiu t0, s3, 64 c->daddiu(t1, s3, 80); // daddiu t1, s3, 80 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(v1, v0); // or v1, v0, r0 // nop // sll r0, r0, 0 c->mtc1(f0, r0); // mtc1 f0, r0 c->lqc2(vf1, 0, s4); // lqc2 vf1, 0(s4) c->mtc1(f2, v1); // mtc1 f2, v1 c->lwc1(f1, 0, s3); // lwc1 f1, 0(s3) cop1_bc = c->fprs[f2] < c->fprs[f0]; // c.lt.s f2, f0 c->lqc2(vf2, 80, s3); // lqc2 vf2, 80(s3) if (cop1_bc) { // bc1tl L38 c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 goto block_3; } // block_6: cop1_bc = c->fprs[f1] <= c->fprs[f2]; // c.le.s f1, f2 c->lqc2(vf3, 64, s3); // lqc2 vf3, 64(s3) if (cop1_bc) { // bc1tl L38 c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 goto block_3; } // block_8: c->vmul(DEST::xyzw, vf5, vf1, vf2); // vmul.xyzw vf5, vf1, vf2 c->lqc2(vf4, 0, s5); // lqc2 vf4, 0(s5) // nop // sll r0, r0, 0 c->lwu(v1, 8, s3); // lwu v1, 8(s3) c->vsub(DEST::xyzw, vf7, vf4, vf3); // vsub.xyzw vf7, vf4, vf3 c->andi(v1, v1, 1); // andi v1, v1, 1 bc = c->sgpr64(v1) == 0; // beq v1, r0, L39 c->vadd_bc(DEST::x, BC::y, vf5, vf5, vf5); // vaddy.x vf5, vf5, vf5 if (bc) {goto block_13;} // branch non-likely c->vmul(DEST::xyzw, vf6, vf7, vf2); // vmul.xyzw vf6, vf7, vf2 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::z, vf5, vf5, vf5); // vaddz.x vf5, vf5, vf5 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf6, vf6, vf6); // vaddy.x vf6, vf6, vf6 // nop // sll r0, r0, 0 c->mov128_gpr_vf(v1, vf5); // qmfc2.i v1, vf5 // nop // sll r0, r0, 0 c->mtc1(f3, v1); // mtc1 f3, v1 // nop // sll r0, r0, 0 cop1_bc = c->fprs[f0] <= c->fprs[f3]; // c.le.s f0, f3 // nop // sll r0, r0, 0 if (cop1_bc) { // bc1tl L38 c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 goto block_3; } // block_11: c->vadd_bc(DEST::x, BC::z, vf6, vf6, vf6); // vaddz.x vf6, vf6, vf6 // nop // sll r0, r0, 0 c->mov128_gpr_vf(v1, vf6); // qmfc2.i v1, vf6 // nop // sll r0, r0, 0 c->mtc1(f4, v1); // mtc1 f4, v1 // nop // sll r0, r0, 0 cop1_bc = c->fprs[f4] < c->fprs[f0]; // c.lt.s f4, f0 // nop // sll r0, r0, 0 if (cop1_bc) { // bc1tl L38 c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 goto block_3; } block_13: c->lqc2(vf8, 0, s2); // lqc2 vf8, 0(s2) c->lqc2(vf9, 16, s2); // lqc2 vf9, 16(s2) c->lqc2(vf10, 32, s2); // lqc2 vf10, 32(s2) c->lwu(v1, 48, s2); // lwu v1, 48(s2) c->swc1(f2, 0, s3); // swc1 f2, 0(s3) c->sqc2(vf3, 48, gp); // sqc2 vf3, 48(gp) c->sqc2(vf2, 64, gp); // sqc2 vf2, 64(gp) c->sqc2(vf8, 0, gp); // sqc2 vf8, 0(gp) c->sqc2(vf9, 16, gp); // sqc2 vf9, 16(gp) c->sqc2(vf10, 32, gp); // sqc2 vf10, 32(gp) c->sw(v1, 80, gp); // sw v1, 80(gp) //beq r0, r0, L38 // beq r0, r0, L38 c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 goto block_3; // branch always block_14: c->lwc1(f1, 0, s3); // lwc1 f1, 0(s3) c->lwc1(f5, 4, s3); // lwc1 f5, 4(s3) cop1_bc = c->fprs[f1] == c->fprs[f5]; // c.eq.s f1, f5 if (!cop1_bc) { // bc1fl L41 c->mfc1(v0, f1); // mfc1 v0, f1 goto block_17; } // block_16: c->lw_float_constant(v0, 0xccbebc20); // lw v0, L313(fp) -100000000.0 block_17: c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 208, sp); // lq gp, 208(sp) c->lq(s5, 192, sp); // lq s5, 192(sp) c->lq(s4, 176, sp); // lq s4, 176(sp) c->lq(s3, 160, sp); // lq s3, 160(sp) c->lq(s2, 144, sp); // lq s2, 144(sp) c->lq(s1, 128, sp); // lq s1, 128(sp) //jr ra // jr ra c->daddiu(sp, sp, 224); // daddiu sp, sp, 224 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.moving_sphere_triangle_intersect = intern_from_c("moving-sphere-triangle-intersect").c(); gLinkedFunctionTable.reg("(method 9 collide-cache-prim)", execute, 512); } } // namespace method_9_collide_cache_prim } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_10_collide_cache_prim { struct Cache { void* moving_sphere_sphere_intersect; // moving-sphere-sphere-intersect } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; bool cop1_bc = false; c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sd(fp, 8, sp); // sd fp, 8(sp) c->mov64(fp, t9); // or fp, t9, r0 c->sq(s1, 32, sp); // sq s1, 32(sp) c->sq(s2, 48, sp); // sq s2, 48(sp) c->sq(s3, 64, sp); // sq s3, 64(sp) c->sq(s4, 80, sp); // sq s4, 80(sp) c->sq(s5, 96, sp); // sq s5, 96(sp) c->sq(gp, 112, sp); // sq gp, 112(sp) c->mov64(s3, a0); // or s3, a0, r0 c->mov64(gp, a1); // or gp, a1, r0 c->mov64(s5, a3); // or s5, a3, r0 c->mov64(s2, t0); // or s2, t0, r0 c->mov64(s4, t1); // or s4, t1, r0 c->daddiu(s1, sp, 16); // daddiu s1, sp, 16 c->load_symbol(t9, cache.moving_sphere_sphere_intersect);// lw t9, moving-sphere-sphere-intersect(s7) c->mov64(a0, a2); // or a0, a2, r0 c->mov64(a1, s5); // or a1, s5, r0 c->daddu(a2, r0, s3); // daddu a2, r0, s3 c->mov64(a3, s1); // or a3, s1, 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->mtc1(f3, v0); // mtc1 f3, v0 c->fprs[f4] = -100000000.0; // lwc1 f4, L313(fp) c->mtc1(f0, r0); // mtc1 f0, r0 c->lqc2(vf4, 0, s1); // lqc2 vf4, 0(s1) c->movs(f1, f3); // mov.s f1, f3 c->lqc2(vf5, 0, s3); // lqc2 vf5, 0(s3) cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0 c->vmove(DEST::xyzw, vf1, vf0); // vmove.xyzw vf1, vf0 bc = cop1_bc; // bc1t L35 c->mtc1(f2, s2); // mtc1 f2, s2 if (bc) {goto block_11;} // branch non-likely cop1_bc = c->fprs[f2] < c->fprs[f0]; // c.lt.s f2, f0 c->vsub(DEST::xyz, vf1, vf4, vf5); // vsub.xyz vf1, vf4, vf5 bc = cop1_bc; // bc1t L32 c->lwu(v1, 36, s3); // lwu v1, 36(s3) if (bc) {goto block_4;} // branch non-likely cop1_bc = c->fprs[f2] <= c->fprs[f1]; // c.le.s f2, f1 c->andi(a0, s4, 1); // andi a0, s4, 1 if (cop1_bc) { // bc1tl L35 c->movs(f3, f4); // mov.s f3, f4 goto block_11; } block_4: bc = c->sgpr64(a0) == 0; // beq a0, r0, L33 c->lqc2(vf15, 0, s5); // lqc2 vf15, 0(s5) if (bc) {goto block_7;} // branch non-likely c->vmul(DEST::xyzw, vf16, vf15, vf1); // vmul.xyzw vf16, vf15, vf1 c->vadd_bc(DEST::y, BC::x, vf16, vf16, vf16); // vaddx.y vf16, vf16, vf16 c->vadd_bc(DEST::y, BC::z, vf16, vf16, vf16); // vaddz.y vf16, vf16, vf16 c->mov128_gpr_vf(a0, vf16); // qmfc2.i a0, vf16 if (((s64)c->sgpr64(a0)) >= 0) { // bgezl a0, L35 c->movs(f3, f4); // mov.s f3, f4 goto block_11; } block_7: //daddiu a0, fp, L299 // daddiu a0, fp, L299 //L299: // .word 0x0 // .word 0x45800000 // .word 0x0 // .word 0x3f800000 // .word 0x0 // .word 0xc5800000 // .word 0x45800000 // .word 0x3f800000 // .word 0x0 // .word 0xc5800000 // .word 0xc5800000 // .word 0x3f800000 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf12, vf1, vf1); // vmul.xyzw vf12, vf1, vf1 c->sqc2(vf4, 48, gp); // sqc2 vf4, 48(gp) c->vmula_bc(DEST::w, BC::x, vf0, vf12); // vmulax.w acc, vf0, vf12 //c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->vfs[vf9].du32[0] = 0; c->vfs[vf9].du32[1] = 0x45800000; c->vfs[vf9].du32[2] = 0; c->vfs[vf9].du32[3] = 0x3f800000; c->vmadda_bc(DEST::w, BC::y, vf0, vf12); // vmadday.w acc, vf0, vf12 // c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) c->vfs[vf10].du32[0] = 0; c->vfs[vf10].du32[1] = 0xc5800000; c->vfs[vf10].du32[2] = 0x45800000; c->vfs[vf10].du32[3] = 0x3f800000; c->vmadd_bc(DEST::w, BC::z, vf12, vf0, vf12); // vmaddz.w vf12, vf0, vf12 // c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->vfs[vf11].du32[0] = 0; c->vfs[vf11].du32[1] = 0xc5800000; c->vfs[vf11].du32[2] = 0xc5800000; c->vfs[vf11].du32[3] = 0x3f800000; c->vrsqrt(vf0, BC::w, vf12, BC::w); // vrsqrt Q, vf0.w, vf12.w // nop // sll r0, r0, 0 c->vwaitq(); // vwaitq c->lwu(v1, 68, v1); // lwu v1, 68(v1) c->vmulq(DEST::xyz, vf1, vf1); // vmulq.xyz vf1, vf1, Q // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf14, vf1, vf1); // vmul.xyzw vf14, vf1, vf1 c->sqc2(vf1, 64, gp); // sqc2 vf1, 64(gp) c->vabs(DEST::xyzw, vf13, vf1); // vabs.xyzw vf13, vf1 c->sw(v1, 80, gp); // sw v1, 80(gp) c->vmove(DEST::xyzw, vf2, vf0); // vmove.xyzw vf2, vf0 // nop // sll r0, r0, 0 c->vadd_bc(DEST::x, BC::y, vf14, vf14, vf14); // vaddy.x vf14, vf14, vf14 c->mov128_gpr_vf(v1, vf13); // qmfc2.i v1, vf13 if (((s64)c->sgpr64(v1)) == ((s64)0)) { // beql v1, r0, L34 c->vadd_bc(DEST::x, BC::z, vf2, vf0, vf1); // vaddz.x vf2, vf0, vf1 goto block_10; } // block_9: c->vsub_bc(DEST::x, BC::y, vf2, vf0, vf1); // vsuby.x vf2, vf0, vf1 // nop // sll r0, r0, 0 c->vrsqrt(vf0, BC::w, vf14, BC::x); // vrsqrt Q, vf0.w, vf14.x // nop // sll r0, r0, 0 c->vadd_bc(DEST::y, BC::x, vf2, vf0, vf1); // vaddx.y vf2, vf0, vf1 // nop // sll r0, r0, 0 c->vwaitq(); // vwaitq // nop // sll r0, r0, 0 c->vmulq(DEST::xy, vf2, vf2); // vmulq.xy vf2, vf2, Q // nop // sll r0, r0, 0 block_10: c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2 // nop // sll r0, r0, 0 c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1 // 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, vf9); // vmaddax.xyzw acc, vf1, vf9 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyz, BC::z, vf9, vf3, vf9); // vmaddz.xyz vf9, vf3, vf9 // 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, 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::xyz, BC::z, vf10, vf3, vf10); // vmaddz.xyz 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::xyz, BC::z, vf11, vf3, vf11); // vmaddz.xyz vf11, vf3, vf11 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->sqc2(vf9, 0, gp); // sqc2 vf9, 0(gp) // nop // sll r0, r0, 0 c->sqc2(vf10, 16, gp); // sqc2 vf10, 16(gp) // nop // sll r0, r0, 0 c->sqc2(vf11, 32, gp); // sqc2 vf11, 32(gp) c->gprs[v1].du64[0] = 0; // or v1, r0, r0 block_11: c->mfc1(v0, f3); // mfc1 v0, f3 c->ld(ra, 0, sp); // ld ra, 0(sp) c->ld(fp, 8, sp); // ld fp, 8(sp) c->lq(gp, 112, sp); // lq gp, 112(sp) c->lq(s5, 96, sp); // lq s5, 96(sp) c->lq(s4, 80, sp); // lq s4, 80(sp) c->lq(s3, 64, sp); // lq s3, 64(sp) c->lq(s2, 48, sp); // lq s2, 48(sp) c->lq(s1, 32, sp); // lq s1, 32(sp) //jr ra // jr ra c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 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.moving_sphere_sphere_intersect = intern_from_c("moving-sphere-sphere-intersect").c(); gLinkedFunctionTable.reg("(method 10 collide-cache-prim)", execute, 512); } } // namespace method_10_collide_cache_prim } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_10_collide_puss_work { 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, 4, a2); // lwu v1, 4(a2) c->daddiu(a2, a0, 96); // daddiu a2, a0, 96 c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1) bc = c->sgpr64(v1) == 0; // beq v1, r0, L10 c->lq(a1, 64, a0); // lq a1, 64(a0) if (bc) {goto block_12;} // branch non-likely c->vmax_bc(DEST::xyzw, BC::w, vf4, vf0, vf0); // vmaxw.xyzw vf4, vf0, vf0 c->lq(a3, 80, a0); // lq a3, 80(a0) c->vsub_bc(DEST::xyz, BC::w, vf2, vf1, vf1); // vsubw.xyz vf2, vf1, vf1 c->gprs[a0].du64[0] = 0; // or a0, r0, r0 c->vadd_bc(DEST::xyz, BC::w, vf3, vf1, vf1); // vaddw.xyz vf3, vf1, vf1 c->lqc2(vf5, 0, a2); // lqc2 vf5, 0(a2) c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 c->lqc2(vf6, 48, a2); // lqc2 vf6, 48(a2) c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 c->lqc2(vf7, 96, a2); // lqc2 vf7, 96(a2) // nop // sll r0, r0, 0 c->vsub_bc(DEST::w, BC::w, vf1, vf0, vf1); // vsubw.w vf1, vf0, vf1 c->mov128_gpr_vf(t0, vf2); // qmfc2.i t0, vf2 c->lqc2(vf8, 144, a2); // lqc2 vf8, 144(a2) c->mov128_gpr_vf(t1, vf3); // qmfc2.i t1, vf3 // nop // sll r0, r0, 0 c->pcgtw(a1, a1, t1); // pcgtw a1, a1, t1 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(a3, t0, a3); // pcgtw a3, t0, a3 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(a1, a1, a3); // por a1, a1, a3 c->mfc1(r0, f31); // mfc1 r0, f31 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 bc = c->sgpr64(a1) != 0; // bne a1, r0, L10 // nop // sll r0, r0, 0 if (bc) {goto block_12;} // branch non-likely block_2: c->vsub(DEST::xyzw, vf9, vf5, vf1); // vsub.xyzw vf9, vf5, vf1 c->daddiu(a2, a2, 192); // daddiu a2, a2, 192 c->vsub(DEST::xyzw, vf10, vf6, vf1); // vsub.xyzw vf10, vf6, vf1 c->lqc2(vf5, 0, a2); // lqc2 vf5, 0(a2) c->vsub(DEST::xyzw, vf11, vf7, vf1); // vsub.xyzw vf11, vf7, vf1 c->lqc2(vf6, 48, a2); // lqc2 vf6, 48(a2) c->vsub(DEST::xyzw, vf12, vf8, vf1); // vsub.xyzw vf12, vf8, vf1 c->lqc2(vf7, 96, a2); // lqc2 vf7, 96(a2) c->vmul(DEST::xyzw, vf9, vf9, vf9); // vmul.xyzw vf9, vf9, vf9 c->lqc2(vf8, 144, a2); // lqc2 vf8, 144(a2) c->vmul(DEST::xyzw, vf10, vf10, vf10); // vmul.xyzw vf10, vf10, vf10 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf11, vf11, vf11); // vmul.xyzw vf11, vf11, vf11 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf12, vf12, vf12); // vmul.xyzw vf12, vf12, vf12 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf9); // vmulax.xyzw acc, vf4, vf9 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf9); // vmadday.xyzw acc, vf4, vf9 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf9); // vmaddaz.xyzw acc, vf4, vf9 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf9, vf4, vf9); // vmsubw.xyzw vf9, vf4, vf9 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf10); // vmulax.xyzw acc, vf4, vf10 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf10); // vmadday.xyzw acc, vf4, vf10 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf10); // vmaddaz.xyzw acc, vf4, vf10 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf10, vf4, vf10); // vmsubw.xyzw vf10, vf4, vf10 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a1, vf9); // qmfc2.i a1, vf9 c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf11); // vmulax.xyzw acc, vf4, vf11 if (bc) {goto block_11;} // branch non-likely bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf11); // vmadday.xyzw acc, vf4, vf11 if (bc) {goto block_12;} // branch non-likely c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf11); // vmaddaz.xyzw acc, vf4, vf11 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf11, vf4, vf11); // vmsubw.xyzw vf11, vf4, vf11 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a1, vf10); // qmfc2.i a1, vf10 c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf12); // vmulax.xyzw acc, vf4, vf12 if (bc) {goto block_11;} // branch non-likely bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf12); // vmadday.xyzw acc, vf4, vf12 if (bc) {goto block_12;} // branch non-likely c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf12); // vmaddaz.xyzw acc, vf4, vf12 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf12, vf4, vf12); // vmsubw.xyzw vf12, vf4, vf12 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a1, vf11); // qmfc2.i a1, vf11 c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 // nop // sll r0, r0, 0 if (bc) {goto block_11;} // branch non-likely bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 // nop // sll r0, r0, 0 if (bc) {goto block_12;} // branch non-likely c->mov128_gpr_vf(a1, vf12); // qmfc2.i a1, vf12 c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 // nop // sll r0, r0, 0 if (bc) {goto block_11;} // branch non-likely bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L8 // nop // sll r0, r0, 0 if (bc) {goto block_2;} // branch non-likely //beq r0, r0, L10 // beq r0, r0, L10 // nop // sll r0, r0, 0 goto block_12; // branch always block_11: c->daddiu(v1, s7, 8); // daddiu v1, s7, #t c->mov64(v0, v1); // or v0, v1, r0 //beq r0, r0, L11 // beq r0, r0, L11 // nop // sll r0, r0, 0 goto block_14; // branch always block_12: c->mov64(v0, s7); // or v0, s7, r0 //beq r0, r0, L11 // beq r0, r0, L11 // nop // sll r0, r0, 0 goto block_14; // branch always c->gprs[v0].du64[0] = 0; // or v0, r0, r0 block_14: //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 end_of_function: return c->gprs[v0].du64[0]; } void link() { gLinkedFunctionTable.reg("(method 10 collide-puss-work)", execute, 128); } } // namespace method_10_collide_puss_work } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" namespace Mips2C::jak1 { namespace method_9_collide_puss_work { 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; c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sq(s0, 16, sp); // sq s0, 16(sp) c->sq(s1, 32, sp); // sq s1, 32(sp) c->sq(s2, 48, sp); // sq s2, 48(sp) c->sq(s3, 64, sp); // sq s3, 64(sp) c->sq(s4, 80, sp); // sq s4, 80(sp) c->sq(s5, 96, sp); // sq s5, 96(sp) c->sq(gp, 112, sp); // sq gp, 112(sp) c->mov64(gp, a0); // or gp, a0, r0 c->mov64(s5, a2); // or s5, a2, r0 // nop // sll r0, r0, 0 c->lwu(a0, 32, a1); // lwu a0, 32(a1) // nop // sll r0, r0, 0 c->lhu(v1, 40, a1); // lhu v1, 40(a1) c->daddiu(a0, a0, 4908); // daddiu a0, a0, 4908 c->lhu(s4, 42, a1); // lhu s4, 42(a1) c->dsll(v1, v1, 6); // dsll v1, v1, 6 // nop // sll r0, r0, 0 c->daddu(s3, a0, v1); // daddu s3, a0, v1 // nop // sll r0, r0, 0 block_1: bc = c->sgpr64(s4) == 0; // beq s4, r0, L15 c->lqc2(vf1, 0, s3); // lqc2 vf1, 0(s3) if (bc) {goto block_12;} // branch non-likely c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 c->lqc2(vf2, 16, s3); // lqc2 vf2, 16(s3) // nop // sll r0, r0, 0 c->lqc2(vf3, 32, s3); // lqc2 vf3, 32(s3) c->vsub(DEST::xyzw, vf4, vf2, vf1); // vsub.xyzw vf4, vf2, vf1 c->lq(a1, 64, gp); // lq a1, 64(gp) c->vsub(DEST::xyzw, vf5, vf3, vf1); // vsub.xyzw vf5, vf3, vf1 c->lq(v1, 80, gp); // lq v1, 80(gp) c->vmini(DEST::xyzw, vf6, vf1, vf2); // vmini.xyzw vf6, vf1, vf2 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf7, vf1, vf2); // vmax.xyzw vf7, vf1, vf2 // nop // sll r0, r0, 0 c->vopmula(vf4, vf5); // vopmula.xyz acc, vf4, vf5 // nop // sll r0, r0, 0 c->vmove(DEST::xyzw, vf8, vf0); // vmove.xyzw vf8, vf0 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf6, vf6, vf3); // vmini.xyzw vf6, vf6, vf3 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf7, vf7, vf3); // vmax.xyzw vf7, vf7, vf3 // nop // sll r0, r0, 0 c->vopmsub(vf8, vf5, vf4); // vopmsub.xyz vf8, vf5, vf4 // 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->vmul(DEST::xyzw, vf9, vf8, vf8); // vmul.xyzw vf9, vf8, vf8 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a0, vf6); // qmfc2.i a0, vf6 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a2, vf7); // qmfc2.i a2, vf7 // nop // sll r0, r0, 0 c->vmula_bc(DEST::w, BC::x, vf0, vf9); // vmulax.w acc, vf0, vf9 c->sqc2(vf6, 32, gp); // sqc2 vf6, 32(gp) c->vmadda_bc(DEST::w, BC::y, vf0, vf9); // vmadday.w acc, vf0, vf9 c->sqc2(vf7, 48, gp); // sqc2 vf7, 48(gp) c->vmadd_bc(DEST::w, BC::z, vf9, vf0, vf9); // vmaddz.w vf9, vf0, vf9 // nop // sll r0, r0, 0 c->pcgtw(a1, a1, a2); // pcgtw a1, a1, a2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(v1, a0, v1); // pcgtw v1, a0, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(v1, a1, v1); // por v1, a1, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->vrsqrt(vf0, BC::w, vf9, BC::w); // vrsqrt Q, vf0.w, vf9.w // nop // sll r0, r0, 0 c->ppach(v1, r0, v1); // ppach v1, r0, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(v1, v1, 16); // dsll v1, v1, 16 // nop // sll r0, r0, 0 if (((s64)c->sgpr64(v1)) != ((s64)0)) { // bnel v1, r0, L13 c->daddiu(s3, s3, 64); // daddiu s3, s3, 64 goto block_1; } // block_4: c->vwaitq(); // vwaitq // nop // sll r0, r0, 0 c->vmulq(DEST::xyz, vf8, vf8); // vmulq.xyz vf8, vf8, Q c->daddiu(s2, gp, 96); // daddiu s2, gp, 96 // nop // sll r0, r0, 0 c->lwu(s1, 4, s5); // lwu s1, 4(s5) c->gprs[s0].du64[0] = 0; // or s0, r0, r0 c->sqc2(vf8, 16, gp); // sqc2 vf8, 16(gp) block_5: if (((s64)c->sgpr64(s0)) == ((s64)c->sgpr64(s1))) {// beql s0, s1, L13 c->daddiu(s3, s3, 64); // daddiu s3, s3, 64 goto block_1; } // block_7: c->daddiu(s0, s0, 1); // daddiu s0, s0, 1 c->lq(a1, 16, s2); // lq a1, 16(s2) // nop // sll r0, r0, 0 c->lq(a2, 48, gp); // lq a2, 48(gp) // nop // sll r0, r0, 0 c->lq(v1, 32, s2); // lq v1, 32(s2) // nop // sll r0, r0, 0 c->lq(a0, 32, gp); // lq a0, 32(gp) c->pcgtw(a1, a1, a2); // pcgtw a1, a1, a2 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(v1, a0, v1); // pcgtw v1, a0, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(v1, a1, v1); // por v1, a1, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->ppach(v1, r0, v1); // ppach v1, r0, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(v1, v1, 16); // dsll v1, v1, 16 // nop // sll r0, r0, 0 if (((s64)c->sgpr64(v1)) != ((s64)0)) { // bnel v1, r0, L14 c->daddiu(s2, s2, 48); // daddiu s2, s2, 48 goto block_5; } // block_9: c->load_symbol(t9, cache.closest_pt_in_triangle); // lw t9, closest-pt-in-triangle(s7) c->daddu(a0, r0, gp); // daddu a0, r0, gp c->daddu(a1, r0, s2); // daddu a1, r0, s2 c->daddu(a2, r0, s3); // daddu a2, r0, s3 c->daddiu(a3, gp, 16); // daddiu a3, gp, 16 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(vf10, 0, gp); // lqc2 vf10, 0(gp) c->lqc2(vf11, 0, s2); // lqc2 vf11, 0(s2) c->daddiu(s2, s2, 48); // daddiu s2, s2, 48 c->vsub(DEST::xyz, vf9, vf10, vf11); // vsub.xyz vf9, vf10, vf11 c->vmul(DEST::w, vf11, vf11, vf11); // vmul.w vf11, vf11, vf11 c->vmul(DEST::xyzw, vf9, vf9, vf9); // vmul.xyzw vf9, vf9, vf9 c->vmula_bc(DEST::w, BC::x, vf0, vf9); // vmulax.w acc, vf0, vf9 c->vmadda_bc(DEST::w, BC::y, vf0, vf9); // vmadday.w acc, vf0, vf9 c->vmadd_bc(DEST::w, BC::z, vf9, vf0, vf9); // vmaddz.w vf9, vf0, vf9 c->vsub(DEST::w, vf9, vf9, vf11); // vsub.w vf9, vf9, vf11 c->mov128_gpr_vf(v1, vf9); // qmfc2.i v1, vf9 c->pcpyud(v1, v1, v1); // pcpyud v1, v1, v1 if (((s64)c->sgpr64(v1)) > 0) { // bgtzl v1, L14 // nop // sll r0, r0, 0 goto block_5; } // block_11: c->daddiu(v1, s7, 8); // daddiu v1, s7, #t c->mov64(v0, v1); // or v0, v1, r0 //beq r0, r0, L16 // beq r0, r0, L16 // nop // sll r0, r0, 0 goto block_14; // branch always block_12: c->mov64(v0, s7); // or v0, s7, r0 //beq r0, r0, L16 // beq r0, r0, L16 // nop // sll r0, r0, 0 goto block_14; // branch always c->gprs[v0].du64[0] = 0; // or v0, r0, r0 block_14: c->ld(ra, 0, sp); // ld ra, 0(sp) c->lq(gp, 112, sp); // lq gp, 112(sp) c->lq(s5, 96, sp); // lq s5, 96(sp) c->lq(s4, 80, sp); // lq s4, 80(sp) c->lq(s3, 64, sp); // lq s3, 64(sp) c->lq(s2, 48, sp); // lq s2, 48(sp) c->lq(s1, 32, sp); // lq s1, 32(sp) c->lq(s0, 16, sp); // lq s0, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 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("closest-pt-in-triangle").c(); gLinkedFunctionTable.reg("(method 9 collide-puss-work)", execute, 256); } } // namespace method_9_collide_puss_work } // namespace Mips2C