//--------------------------MIPS2C--------------------- // clang-format off #include "game/mips2c/mips2c_private.h" #include "game/kernel/jak2/kscheme.h" using ::jak2::intern_from_c; namespace Mips2C::jak2 { namespace method_11_collide_hash { struct Cache { void* fake_scratchpad_data; // *fake-scratchpad-data* } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; c->daddiu(sp, sp, -96); // daddiu sp, sp, -96 c->sd(ra, 0, sp); // sd ra, 0(sp) c->sq(s2, 16, sp); // sq s2, 16(sp) c->sq(s3, 32, sp); // sq s3, 32(sp) c->sq(s4, 48, sp); // sq s4, 48(sp) c->sq(s5, 64, sp); // sq s5, 64(sp) c->sq(gp, 80, sp); // sq gp, 80(sp) c->addiu(v1, r0, 0); // addiu v1, r0, 0 //beq r0, r0, L91 // beq r0, r0, L91 // nop // sll r0, r0, 0 goto block_2; // branch always block_1: c->dsll(a1, v1, 4); // dsll a1, v1, 4 get_fake_spad_addr2(t0, cache.fake_scratchpad_data, 0, c);// lui t0, 28672 c->daddu(a1, a1, t0); // daddu a1, a1, t0 c->sq(r0, 0, a1); // sq r0, 0(a1) c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 block_2: c->lwu(a1, 8, a0); // lwu a1, 8(a0) c->slt(a1, v1, a1); // slt a1, v1, a1 bc = c->sgpr64(a1) != 0; // bne a1, r0, L90 // nop // sll r0, r0, 0 if (bc) {goto block_1;} // branch non-likely c->mov64(v1, s7); // or v1, s7, r0 c->mov64(v1, s7); // or v1, s7, r0 // nop // sll r0, r0, 0 c->lw(v1, 72, a0); // lw v1, 72(a0) // nop // sll r0, r0, 0 c->lqc2(vf1, 28, a0); // lqc2 vf1, 28(a0) c->lui(a1, 1); // lui a1, 1 c->lqc2(vf2, 128, a3); // lqc2 vf2, 128(a3) c->ori(a1, a1, 257); // ori a1, a1, 257 c->lqc2(vf3, 144, a3); // lqc2 vf3, 144(a3) c->dsubu(v1, v1, a1); // dsubu v1, v1, a1 c->lqc2(vf4, 44, a0); // lqc2 vf4, 44(a0) c->vsub(DEST::xyzw, vf2, vf2, vf1); // vsub.xyzw vf2, vf2, vf1 c->lq(a1, 160, a3); // lq a1, 160(a3) c->vsub(DEST::xyzw, vf3, vf3, vf1); // vsub.xyzw vf3, vf3, vf1 c->lq(t0, 176, a3); // lq t0, 176(a3) c->pextlb(v1, r0, v1); // pextlb v1, r0, v1 c->lq(t1, 60, a0); // lq t1, 60(a0) c->pextlh(v1, r0, v1); // pextlh v1, r0, v1 c->lq(t2, 76, a0); // lq t2, 76(a0) c->pcgtw(t0, t1, t0); // pcgtw t0, t1, t0 c->vmul(DEST::xyzw, vf2, vf2, vf4); // vmul.xyzw vf2, vf2, vf4 c->pcgtw(a1, a1, t2); // pcgtw a1, a1, t2 c->vmul(DEST::xyzw, vf3, vf3, vf4); // vmul.xyzw vf3, vf3, vf4 c->por(a1, t0, a1); // por a1, t0, a1 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 c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 bc = c->sgpr64(a1) != 0; // bne a1, r0, L98 c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 if (bc) {goto block_16;} // branch non-likely // nop // sll r0, r0, 0 c->mov128_gpr_vf(t0, vf2); // qmfc2.i t0, vf2 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a1, vf3); // qmfc2.i a1, vf3 c->pmaxw(t0, t0, r0); // pmaxw t0, t0, r0 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(a1, a1, r0); // pmaxw a1, a1, r0 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(t0, t0, v1); // pminw t0, t0, v1 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(v1, a1, v1); // pminw v1, a1, v1 c->mfc1(r0, f31); // mfc1 r0, f31 // nop // sll r0, r0, 0 c->sq(t0, 400, a3); // sq t0, 400(a3) // nop // sll r0, r0, 0 c->sq(v1, 416, a3); // sq v1, 416(a3) c->addiu(v1, r0, 4); // addiu v1, r0, 4 c->lbu(a1, 72, a0); // lbu a1, 72(a0) c->multu3(a1, a1, v1); // multu3 a1, a1, v1 c->lbu(t0, 74, a0); // lbu t0, 74(a0) c->multu3(t0, t0, a1); // multu3 t0, t0, a1 c->addiu(t1, r0, 1); // addiu t1, r0, 1 c->lw(t2, 400, a3); // lw t2, 400(a3) c->dsubu(t1, t1, t2); // dsubu t1, t1, t2 c->lw(t2, 416, a3); // lw t2, 416(a3) c->daddu(t1, t1, t2); // daddu t1, t1, t2 c->addiu(t2, r0, 1); // addiu t2, r0, 1 c->lw(t3, 404, a3); // lw t3, 404(a3) c->dsubu(t2, t2, t3); // dsubu t2, t2, t3 c->lw(t3, 420, a3); // lw t3, 420(a3) c->daddu(t4, t2, t3); // daddu t4, t2, t3 c->addiu(t2, r0, 1); // addiu t2, r0, 1 c->lw(t3, 408, a3); // lw t3, 408(a3) c->dsubu(t2, t2, t3); // dsubu t2, t2, t3 c->lw(t3, 424, a3); // lw t3, 424(a3) c->daddu(t2, t2, t3); // daddu t2, t2, t3 c->lwu(t3, 40, a0); // lwu t3, 40(a0) c->lw(t5, 400, a3); // lw t5, 400(a3) c->mult3(t5, t5, v1); // mult3 t5, t5, v1 c->lw(t6, 404, a3); // lw t6, 404(a3) c->mult3(t6, t6, t0); // mult3 t6, t6, t0 c->daddu(t5, t5, t6); // daddu t5, t5, t6 c->lw(t6, 408, a3); // lw t6, 408(a3) c->mult3(t6, t6, a1); // mult3 t6, t6, a1 c->daddu(t5, t5, t6); // daddu t5, t5, t6 c->daddu(t3, t3, t5); // daddu t3, t3, t5 c->mov64(t4, t4); // or t4, t4, r0 // nop // sll r0, r0, 0 block_5: c->mov64(t5, t2); // or t5, t2, r0 c->mov64(t6, t3); // or t6, t3, r0 block_6: c->mov64(t7, t1); // or t7, t1, r0 c->mov64(t8, t6); // or t8, t6, r0 block_7: // nop // sll r0, r0, 0 c->lhu(t9, 0, t8); // lhu t9, 0(t8) // nop // sll r0, r0, 0 c->lw(ra, 56, a0); // lw ra, 56(a0) c->sll(gp, t9, 3); // sll gp, t9, 3 c->lhu(t9, 2, t8); // lhu t9, 2(t8) bc = c->sgpr64(t9) == 0; // beq t9, r0, L97 c->daddu(ra, gp, ra); // daddu ra, gp, ra if (bc) {goto block_13;} // branch non-likely block_8: get_fake_spad_addr2(s5, cache.fake_scratchpad_data, 0, c);// lui s5, 28672 c->lw(s2, 0, ra); // lw s2, 0(ra) c->addiu(s4, r0, 1); // addiu s4, r0, 1 c->lw(gp, 4, ra); // lw gp, 4(ra) c->andi(s3, s2, 7); // andi s3, s2, 7 c->sra(s2, s2, 3); // sra s2, s2, 3 c->daddu(s5, s2, s5); // daddu s5, s2, s5 c->lqc2(vf8, 12, gp); // lqc2 vf8, 12(gp) c->sllv(s4, s4, s3); // sllv s4, s4, s3 c->lb(s3, 0, s5); // lb s3, 0(s5) c->and_(s2, s3, s4); // and s2, s3, s4 c->daddiu(t9, t9, -1); // daddiu t9, t9, -1 bc = c->sgpr64(s2) != 0; // bne s2, r0, L96 c->or_(s4, s3, s4); // or s4, s3, s4 if (bc) {goto block_12;} // branch non-likely c->vsub_bc(DEST::xyzw, BC::w, vf2, vf8, vf8); // vsubw.xyzw vf2, vf8, vf8 c->sb(s4, 0, s5); // sb s4, 0(s5) c->vadd_bc(DEST::xyzw, BC::w, vf3, vf8, vf8); // vaddw.xyzw vf3, vf8, vf8 // nop // sll r0, r0, 0 c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 c->lq(s5, 160, a3); // lq s5, 160(a3) c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 c->lq(s3, 176, a3); // lq s3, 176(a3) // nop // sll r0, r0, 0 c->mov128_gpr_vf(s2, vf2); // qmfc2.i s2, vf2 // nop // sll r0, r0, 0 c->mov128_gpr_vf(s4, vf3); // qmfc2.i s4, vf3 c->pcgtw(s3, s2, s3); // pcgtw s3, s2, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s5, s5, s4); // pcgtw s5, s5, s4 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s5, s3, s5); // por s5, s3, s5 c->mfc1(r0, f31); // mfc1 r0, f31 c->ppach(s5, r0, s5); // ppach s5, r0, s5 c->mfc1(r0, f31); // mfc1 r0, f31 c->dsll(s5, s5, 16); // dsll s5, s5, 16 // nop // sll r0, r0, 0 bc = c->sgpr64(s5) != 0; // bne s5, r0, L96 // nop // sll r0, r0, 0 if (bc) {goto block_12;} // branch non-likely // nop // sll r0, r0, 0 c->lw(s4, 0, a2); // lw s4, 0(a2) c->daddiu(s3, s4, -256); // daddiu s3, s4, -256 c->sll(s5, s4, 3); // sll s5, s4, 3 bc = ((s64)c->sgpr64(s3)) >= 0; // bgez s3, L98 c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 if (bc) {goto block_16;} // branch non-likely c->daddu(s5, s5, a2); // daddu s5, s5, a2 c->sw(s4, 0, a2); // sw s4, 0(a2) // nop // sll r0, r0, 0 c->sw(s7, 20, s5); // sw s7, 20(s5) // nop // sll r0, r0, 0 c->sw(gp, 16, s5); // sw gp, 16(s5) block_12: bc = ((s64)c->sgpr64(t9)) > 0; // bgtz t9, L95 c->daddiu(ra, ra, 8); // daddiu ra, ra, 8 if (bc) {goto block_8;} // branch non-likely block_13: c->daddiu(t7, t7, -1); // daddiu t7, t7, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t7) != 0; // bne t7, r0, L94 c->daddu(t8, t8, v1); // daddu t8, t8, v1 if (bc) {goto block_7;} // branch non-likely c->daddiu(t5, t5, -1); // daddiu t5, t5, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t5) != 0; // bne t5, r0, L93 c->daddu(t6, t6, a1); // daddu t6, t6, a1 if (bc) {goto block_6;} // branch non-likely c->daddiu(t4, t4, -1); // daddiu t4, t4, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t4) != 0; // bne t4, r0, L92 c->daddu(t3, t3, t0); // daddu t3, t3, t0 if (bc) {goto block_5;} // branch non-likely block_16: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(sp) c->lq(gp, 80, sp); // lq gp, 80(sp) c->lq(s5, 64, sp); // lq s5, 64(sp) c->lq(s4, 48, sp); // lq s4, 48(sp) c->lq(s3, 32, sp); // lq s3, 32(sp) c->lq(s2, 16, sp); // lq s2, 16(sp) //jr ra // jr ra c->daddiu(sp, sp, 96); // daddiu sp, sp, 96 goto end_of_function; // return // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 end_of_function: return c->gprs[v0].du64[0]; } void link() { cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("(method 11 collide-hash)", execute, 256); } } // namespace method_11_collide_hash } // namespace Mips2C //--------------------------MIPS2C--------------------- // clang-format off #include "game/mips2c/mips2c_private.h" #include "game/kernel/jak2/kscheme.h" using ::jak2::intern_from_c; namespace Mips2C::jak2 { namespace method_12_collide_hash { struct Cache { void* fake_scratchpad_data; // *fake-scratchpad-data* } cache; u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 c->sd(ra, 0, sp); // sd ra, 0(sp) 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->addiu(v1, r0, 0); // addiu v1, r0, 0 //beq r0, r0, L81 // beq r0, r0, L81 // nop // sll r0, r0, 0 goto block_2; // branch always block_1: c->dsll(a1, v1, 4); // dsll a1, v1, 4 get_fake_spad_addr2(t0, cache.fake_scratchpad_data, 0, c);// lui t0, 28672 c->daddu(a1, a1, t0); // daddu a1, a1, t0 c->sq(r0, 0, a1); // sq r0, 0(a1) c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 block_2: c->lwu(a1, 8, a0); // lwu a1, 8(a0) c->slt(a1, v1, a1); // slt a1, v1, a1 bc = c->sgpr64(a1) != 0; // bne a1, r0, L80 // nop // sll r0, r0, 0 if (bc) {goto block_1;} // branch non-likely c->mov64(v1, s7); // or v1, s7, r0 c->mov64(v1, s7); // or v1, s7, r0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->lw(v1, 72, a0); // lw v1, 72(a0) // nop // sll r0, r0, 0 c->lqc2(vf2, 28, a0); // lqc2 vf2, 28(a0) c->lui(a1, 1); // lui a1, 1 c->lqc2(vf3, 128, a3); // lqc2 vf3, 128(a3) c->ori(a1, a1, 257); // ori a1, a1, 257 c->lqc2(vf4, 144, a3); // lqc2 vf4, 144(a3) c->dsubu(v1, v1, a1); // dsubu v1, v1, a1 c->lqc2(vf5, 44, a0); // lqc2 vf5, 44(a0) c->vsub(DEST::xyzw, vf3, vf3, vf2); // vsub.xyzw vf3, vf3, vf2 c->lq(a1, 160, a3); // lq a1, 160(a3) c->vsub(DEST::xyzw, vf4, vf4, vf2); // vsub.xyzw vf4, vf4, vf2 c->lq(t0, 176, a3); // lq t0, 176(a3) c->pextlb(v1, r0, v1); // pextlb v1, r0, v1 c->lq(t1, 60, a0); // lq t1, 60(a0) c->pextlh(v1, r0, v1); // pextlh v1, r0, v1 c->lq(t2, 76, a0); // lq t2, 76(a0) c->pcgtw(t0, t1, t0); // pcgtw t0, t1, t0 c->vmul(DEST::xyzw, vf3, vf3, vf5); // vmul.xyzw vf3, vf3, vf5 c->pcgtw(a1, a1, t2); // pcgtw a1, a1, t2 c->vmul(DEST::xyzw, vf4, vf4, vf5); // vmul.xyzw vf4, vf4, vf5 c->por(a1, t0, a1); // por a1, t0, a1 c->lqc2(vf10, 256, a3); // lqc2 vf10, 256(a3) c->ppach(a1, r0, a1); // ppach a1, r0, a1 c->lqc2(vf11, 272, a3); // lqc2 vf11, 272(a3) c->dsll(a1, a1, 16); // dsll a1, a1, 16 c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 bc = c->sgpr64(a1) != 0; // bne a1, r0, L88 c->vftoi0(DEST::xyzw, vf4, vf4); // vftoi0.xyzw vf4, vf4 if (bc) {goto block_19;} // branch non-likely // nop // sll r0, r0, 0 c->lqc2(vf8, 208, a3); // lqc2 vf8, 208(a3) // nop // sll r0, r0, 0 c->lqc2(vf9, 224, a3); // lqc2 vf9, 224(a3) // nop // sll r0, r0, 0 c->mov128_gpr_vf(t0, vf3); // qmfc2.i t0, vf3 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a1, vf4); // qmfc2.i a1, vf4 c->pmaxw(t0, t0, r0); // pmaxw t0, t0, r0 c->lqc2(vf6, 12, a0); // lqc2 vf6, 12(a0) c->pmaxw(a1, a1, r0); // pmaxw a1, a1, r0 c->lqc2(vf7, 240, a3); // lqc2 vf7, 240(a3) c->pminw(t0, t0, v1); // pminw t0, t0, v1 c->vmax_bc(DEST::xyzw, BC::w, vf1, vf0, vf0); // vmaxw.xyzw vf1, vf0, vf0 c->pminw(v1, a1, v1); // pminw v1, a1, v1 c->mfc1(r0, f31); // mfc1 r0, f31 // nop // sll r0, r0, 0 c->sq(t0, 400, a3); // sq t0, 400(a3) // nop // sll r0, r0, 0 c->sq(v1, 416, a3); // sq v1, 416(a3) c->addiu(v1, r0, 4); // addiu v1, r0, 4 c->lbu(a1, 72, a0); // lbu a1, 72(a0) c->multu3(a1, a1, v1); // multu3 a1, a1, v1 c->lbu(t0, 74, a0); // lbu t0, 74(a0) c->multu3(t0, t0, a1); // multu3 t0, t0, a1 c->addiu(t1, r0, 1); // addiu t1, r0, 1 c->lw(t2, 400, a3); // lw t2, 400(a3) c->dsubu(t1, t1, t2); // dsubu t1, t1, t2 c->lw(t2, 416, a3); // lw t2, 416(a3) c->daddu(t1, t1, t2); // daddu t1, t1, t2 c->addiu(t2, r0, 1); // addiu t2, r0, 1 c->lw(t3, 404, a3); // lw t3, 404(a3) c->dsubu(t2, t2, t3); // dsubu t2, t2, t3 c->lw(t3, 420, a3); // lw t3, 420(a3) c->daddu(t2, t2, t3); // daddu t2, t2, t3 c->addiu(t3, r0, 1); // addiu t3, r0, 1 c->lw(t4, 408, a3); // lw t4, 408(a3) c->dsubu(t3, t3, t4); // dsubu t3, t3, t4 c->lw(t4, 424, a3); // lw t4, 424(a3) c->daddu(t3, t3, t4); // daddu t3, t3, t4 c->lwu(t4, 40, a0); // lwu t4, 40(a0) c->lw(t5, 400, a3); // lw t5, 400(a3) c->mult3(t5, t5, v1); // mult3 t5, t5, v1 c->lw(t6, 404, a3); // lw t6, 404(a3) c->mult3(t6, t6, t0); // mult3 t6, t6, t0 c->daddu(t5, t5, t6); // daddu t5, t5, t6 c->lw(t6, 408, a3); // lw t6, 408(a3) c->mult3(t6, t6, a1); // mult3 t6, t6, a1 c->daddu(t5, t5, t6); // daddu t5, t5, t6 c->daddu(t4, t4, t5); // daddu t4, t4, t5 c->mov64(t5, t2); // or t5, t2, r0 // nop // sll r0, r0, 0 block_5: c->mov64(t6, t3); // or t6, t3, r0 c->mov64(t7, t4); // or t7, t4, r0 block_6: c->mov64(t8, t1); // or t8, t1, r0 c->mov64(t9, t7); // or t9, t7, r0 block_7: c->dsubu(s3, t1, t8); // dsubu s3, t1, t8 c->lw(s2, 400, a3); // lw s2, 400(a3) c->dsubu(s5, t2, t5); // dsubu s5, t2, t5 c->lw(s4, 404, a3); // lw s4, 404(a3) c->dsubu(ra, t3, t6); // dsubu ra, t3, t6 c->lw(gp, 408, a3); // lw gp, 408(a3) c->daddu(s3, s3, s2); // daddu s3, s3, s2 c->sw(r0, 444, a3); // sw r0, 444(a3) c->daddu(s5, s5, s4); // daddu s5, s5, s4 c->sw(s3, 432, a3); // sw s3, 432(a3) c->daddu(ra, ra, gp); // daddu ra, ra, gp c->sw(s5, 436, a3); // sw s5, 436(a3) // nop // sll r0, r0, 0 c->sw(ra, 440, a3); // sw ra, 440(a3) // nop // sll r0, r0, 0 c->lqc2(vf3, 432, a3); // lqc2 vf3, 432(a3) c->vitof0(DEST::xyzw, vf3, vf3); // vitof0.xyzw vf3, vf3 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf3, vf6); // vmula.xyzw acc, vf3, vf6 // nop // sll r0, r0, 0 c->vmadda(DEST::xyzw, vf1, vf2); // vmadda.xyzw acc, vf1, vf2 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf3, vf1, vf10); // vmsubw.xyzw vf3, vf1, vf10 // nop // sll r0, r0, 0 c->vmadda(DEST::xyzw, vf1, vf6); // vmadda.xyzw acc, vf1, vf6 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf1, vf10); // vmaddw.xyzw vf4, vf1, vf10 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf3); // vmula.xyzw acc, vf7, vf3 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf13, vf1, vf10); // vmsub.xyzw vf13, vf1, vf10 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf15, vf1, vf11); // vmadd.xyzw vf15, vf1, vf11 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf4); // vmula.xyzw acc, vf7, vf4 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf14, vf1, vf11); // vmsub.xyzw vf14, vf1, vf11 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf16, vf1, vf10); // vmadd.xyzw vf16, vf1, vf10 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf13, vf13, vf14); // vmax.xyzw vf13, vf13, vf14 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf15, vf15, vf16); // vmini.xyzw vf15, vf15, vf16 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::y, vf13, vf13, vf13); // vmaxy.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::y, vf15, vf15, vf15); // vminiy.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::z, vf13, vf13, vf13); // vmaxz.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::z, vf15, vf15, vf15); // vminiz.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vftoi4(DEST::xyzw, vf13, vf13); // vftoi4.xyzw vf13, vf13 // nop // sll r0, r0, 0 c->vftoi4(DEST::xyzw, vf15, vf15); // vftoi4.xyzw vf15, vf15 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->mov128_gpr_vf(s5, vf13); // qmfc2.i s5, vf13 c->addiu(s4, r0, 4096); // addiu s4, r0, 4096 c->mov128_gpr_vf(ra, vf15); // qmfc2.i ra, vf15 c->subu(gp, ra, s5); // subu gp, ra, s5 c->subu(s5, s4, s5); // subu s5, s4, s5 bc = ((s64)c->sgpr64(gp)) < 0; // bltz gp, L87 // nop // sll r0, r0, 0 if (bc) {goto block_16;} // branch non-likely bc = ((s64)c->sgpr64(s5)) < 0; // bltz s5, L87 // nop // sll r0, r0, 0 if (bc) {goto block_16;} // branch non-likely bc = ((s64)c->sgpr64(ra)) < 0; // bltz ra, L87 // nop // sll r0, r0, 0 if (bc) {goto block_16;} // branch non-likely // nop // sll r0, r0, 0 c->lhu(ra, 0, t9); // lhu ra, 0(t9) // nop // sll r0, r0, 0 c->lw(gp, 56, a0); // lw gp, 56(a0) c->sll(s5, ra, 3); // sll s5, ra, 3 c->lhu(ra, 2, t9); // lhu ra, 2(t9) bc = c->sgpr64(ra) == 0; // beq ra, r0, L87 c->daddu(gp, s5, gp); // daddu gp, s5, gp if (bc) {goto block_16;} // branch non-likely block_11: get_fake_spad_addr2(s4, cache.fake_scratchpad_data, 0, c);// lui s4, 28672 c->lw(s1, 0, gp); // lw s1, 0(gp) c->addiu(s3, r0, 1); // addiu s3, r0, 1 c->lw(s5, 4, gp); // lw s5, 4(gp) c->andi(s2, s1, 7); // andi s2, s1, 7 c->sra(s1, s1, 3); // sra s1, s1, 3 c->daddu(s4, s1, s4); // daddu s4, s1, s4 c->lqc2(vf12, 12, s5); // lqc2 vf12, 12(s5) c->sllv(s3, s3, s2); // sllv s3, s3, s2 c->lb(s2, 0, s4); // lb s2, 0(s4) c->and_(s1, s2, s3); // and s1, s2, s3 c->daddiu(ra, ra, -1); // daddiu ra, ra, -1 bc = c->sgpr64(s1) != 0; // bne s1, r0, L86 c->or_(s3, s2, s3); // or s3, s2, s3 if (bc) {goto block_15;} // branch non-likely c->vmula(DEST::xyzw, vf9, vf12); // vmula.xyzw acc, vf9, vf12 c->sb(s3, 0, s4); // sb s3, 0(s4) c->vmsub(DEST::xyzw, vf13, vf9, vf8); // vmsub.xyzw vf13, vf9, vf8 // nop // sll r0, r0, 0 c->vmul_bc(DEST::xyzw, BC::w, vf14, vf1, vf7); // vmulw.xyzw vf14, vf1, vf7 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf1, vf12); // vmulaw.xyzw acc, vf1, vf12 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf15, vf1, vf10); // vmaddw.xyzw vf15, vf1, vf10 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::w, vf13, vf7); // vmulaw.xyzw acc, vf13, vf7 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf14, vf13); // vmadday.xyzw acc, vf14, vf13 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf13, vf14, vf13); // vmaddz.xyzw vf13, vf14, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::w, vf13, vf13, vf0); // vminiw.xyzw vf13, vf13, vf0 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::x, vf13, vf13, vf0); // vmaxx.xyzw vf13, vf13, vf0 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf9, vf13); // vmulax.xyzw acc, vf9, vf13 // nop // sll r0, r0, 0 c->vmadda(DEST::xyzw, vf1, vf8); // vmadda.xyzw acc, vf1, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf13, vf1, vf12); // vmsub.xyzw vf13, vf1, vf12 // nop // sll r0, r0, 0 c->vmul(DEST::xyzw, vf13, vf13, vf13); // vmul.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf0, vf0); // vmulax.xyzw acc, vf0, vf0 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf15, vf15); // vmsuba.xyzw acc, vf15, vf15 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf1, vf13); // vmadday.xyzw acc, vf1, vf13 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::z, vf13, vf1, vf13); // vmaddz.xyzw vf13, vf1, vf13 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->mov128_gpr_vf(s4, vf13); // qmfc2.i s4, vf13 bc = ((s64)c->sgpr64(s4)) > 0; // bgtz s4, L86 // nop // sll r0, r0, 0 if (bc) {goto block_15;} // branch non-likely // nop // sll r0, r0, 0 c->lw(s3, 0, a2); // lw s3, 0(a2) c->daddiu(s2, s3, -256); // daddiu s2, s3, -256 c->sll(s4, s3, 3); // sll s4, s3, 3 bc = ((s64)c->sgpr64(s2)) >= 0; // bgez s2, L88 c->daddiu(s3, s3, 1); // daddiu s3, s3, 1 if (bc) {goto block_19;} // branch non-likely c->daddu(s4, s4, a2); // daddu s4, s4, a2 c->sw(s3, 0, a2); // sw s3, 0(a2) // nop // sll r0, r0, 0 c->sw(s7, 20, s4); // sw s7, 20(s4) // nop // sll r0, r0, 0 c->sw(s5, 16, s4); // sw s5, 16(s4) block_15: bc = ((s64)c->sgpr64(ra)) > 0; // bgtz ra, L85 c->daddiu(gp, gp, 8); // daddiu gp, gp, 8 if (bc) {goto block_11;} // branch non-likely block_16: c->daddiu(t8, t8, -1); // daddiu t8, t8, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t8) != 0; // bne t8, r0, L84 c->daddu(t9, t9, v1); // daddu t9, t9, v1 if (bc) {goto block_7;} // branch non-likely c->daddiu(t6, t6, -1); // daddiu t6, t6, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t6) != 0; // bne t6, r0, L83 c->daddu(t7, t7, a1); // daddu t7, t7, a1 if (bc) {goto block_6;} // branch non-likely c->daddiu(t5, t5, -1); // daddiu t5, t5, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t5) != 0; // bne t5, r0, L82 c->daddu(t4, t4, t0); // daddu t4, t4, t0 if (bc) {goto block_5;} // branch non-likely block_19: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 c->ld(ra, 0, sp); // ld ra, 0(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 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 12 collide-hash)", execute, 256); } } // namespace method_12_collide_hash } // namespace Mips2C //--------------------------MIPS2C--------------------- // clang-format off #include "game/mips2c/mips2c_private.h" #include "game/kernel/jak2/kscheme.h" using ::jak2::intern_from_c; namespace Mips2C::jak2 { namespace fill_bg_using_box_new { struct Cache { void* cheat_mode; // *cheat-mode* void* collide_stats; // *collide-stats* void* fake_scratchpad_data; // *fake-scratchpad-data* void* debug; // debug void* print_exceeded_max_cache_tris; // print-exceeded-max-cache-tris } 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) // nop // sll r0, r0, 0 c->lw(v1, 40, a1); // lw v1, 40(a1) // nop // sll r0, r0, 0 c->lqc2(vf1, 44, a1); // lqc2 vf1, 44(a1) c->lui(a3, 1); // lui a3, 1 c->lqc2(vf2, 128, a2); // lqc2 vf2, 128(a2) c->ori(a3, a3, 257); // ori a3, a3, 257 c->lqc2(vf3, 144, a2); // lqc2 vf3, 144(a2) c->dsubu(v1, v1, a3); // dsubu v1, v1, a3 c->lqc2(vf6, 60, a1); // lqc2 vf6, 60(a1) c->vsub(DEST::xyzw, vf2, vf2, vf1); // vsub.xyzw vf2, vf2, vf1 c->lq(a3, 160, a2); // lq a3, 160(a2) c->vsub(DEST::xyzw, vf3, vf3, vf1); // vsub.xyzw vf3, vf3, vf1 c->lq(t0, 176, a2); // lq t0, 176(a2) c->pextlb(v1, r0, v1); // pextlb v1, r0, v1 c->lq(t1, 76, a1); // lq t1, 76(a1) c->pextlh(v1, r0, v1); // pextlh v1, r0, v1 c->lq(t2, 92, a1); // lq t2, 92(a1) c->pcgtw(t0, t1, t0); // pcgtw t0, t1, t0 c->vftoi0(DEST::xyzw, vf4, vf2); // vftoi0.xyzw vf4, vf2 c->pcgtw(a3, a3, t2); // pcgtw a3, a3, t2 c->vftoi0(DEST::xyzw, vf5, vf3); // vftoi0.xyzw vf5, vf3 c->por(a3, t0, a3); // por a3, t0, a3 c->vmul(DEST::xyzw, vf2, vf2, vf6); // vmul.xyzw vf2, vf2, vf6 c->ppach(a3, r0, a3); // ppach a3, r0, a3 c->vmul(DEST::xyzw, vf3, vf3, vf6); // vmul.xyzw vf3, vf3, vf6 c->dsll(t0, a3, 16); // dsll t0, a3, 16 c->mov128_gpr_vf(a3, vf4); // qmfc2.i a3, vf4 bc = c->sgpr64(t0) != 0; // bne t0, r0, L75 c->mov128_gpr_vf(t0, vf5); // qmfc2.i t0, vf5 if (bc) {goto block_17;} // branch non-likely c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 c->psraw(a3, a3, 4); // psraw a3, a3, 4 c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 c->psraw(t0, t0, 4); // psraw t0, t0, 4 // nop // sll r0, r0, 0 c->sq(a3, 368, a2); // sq a3, 368(a2) // nop // sll r0, r0, 0 c->sq(t0, 384, a2); // sq t0, 384(a2) // nop // sll r0, r0, 0 c->mov128_gpr_vf(t0, vf2); // qmfc2.i t0, vf2 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a3, vf3); // qmfc2.i a3, vf3 c->pmaxw(t0, t0, r0); // pmaxw t0, t0, r0 c->lqc2(vf10, 448, a2); // lqc2 vf10, 448(a2) c->pmaxw(a3, a3, r0); // pmaxw a3, a3, r0 c->lqc2(vf11, 464, a2); // lqc2 vf11, 464(a2) c->pminw(t0, t0, v1); // pminw t0, t0, v1 c->lqc2(vf12, 480, a2); // lqc2 vf12, 480(a2) c->pminw(v1, a3, v1); // pminw v1, a3, v1 c->lqc2(vf13, 496, a2); // lqc2 vf13, 496(a2) // nop // sll r0, r0, 0 c->sq(t0, 400, a2); // sq t0, 400(a2) // nop // sll r0, r0, 0 c->sq(v1, 416, a2); // sq v1, 416(a2) c->addiu(v1, r0, 4); // addiu v1, r0, 4 c->lbu(a3, 40, a1); // lbu a3, 40(a1) c->multu3(t8, a3, v1); // multu3 t8, a3, v1 c->lbu(a3, 42, a1); // lbu a3, 42(a1) c->multu3(t6, a3, t8); // multu3 t6, a3, t8 c->addiu(a3, r0, 1); // addiu a3, r0, 1 c->lw(t0, 400, a2); // lw t0, 400(a2) c->dsubu(a3, a3, t0); // dsubu a3, a3, t0 c->lw(t0, 416, a2); // lw t0, 416(a2) c->daddu(a3, a3, t0); // daddu a3, a3, t0 c->addiu(t0, r0, 1); // addiu t0, r0, 1 c->lw(t1, 404, a2); // lw t1, 404(a2) c->dsubu(t0, t0, t1); // dsubu t0, t0, t1 c->lw(t1, 420, a2); // lw t1, 420(a2) c->daddu(t1, t0, t1); // daddu t1, t0, t1 c->addiu(t0, r0, 1); // addiu t0, r0, 1 c->lw(t2, 408, a2); // lw t2, 408(a2) c->dsubu(t0, t0, t2); // dsubu t0, t0, t2 c->lw(t2, 424, a2); // lw t2, 424(a2) c->daddu(t0, t0, t2); // daddu t0, t0, t2 c->lwu(t2, 8, a1); // lwu t2, 8(a1) c->lw(t3, 400, a2); // lw t3, 400(a2) c->mult3(t3, t3, v1); // mult3 t3, t3, v1 c->lw(t4, 404, a2); // lw t4, 404(a2) c->mult3(t4, t4, t6); // mult3 t4, t4, t6 c->daddu(t3, t3, t4); // daddu t3, t3, t4 c->lw(t4, 408, a2); // lw t4, 408(a2) c->mult3(t4, t4, t8); // mult3 t4, t4, t8 c->daddu(t3, t3, t4); // daddu t3, t3, t4 c->daddu(t7, t2, t3); // daddu t7, t2, t3 c->mov64(t1, t1); // or t1, t1, r0 // nop // sll r0, r0, 0 block_2: c->mov64(t5, t0); // or t5, t0, r0 c->mov64(t9, t7); // or t9, t7, r0 // nop // sll r0, r0, 0 c->sw(t7, 524, a2); // sw t7, 524(a2) // nop // sll r0, r0, 0 c->sw(t6, 528, a2); // sw t6, 528(a2) block_3: c->mov64(t6, a3); // or t6, a3, r0 c->mov64(t7, t9); // or t7, t9, r0 // nop // sll r0, r0, 0 c->sw(t9, 532, a2); // sw t9, 532(a2) // nop // sll r0, r0, 0 c->sw(t8, 536, a2); // sw t8, 536(a2) block_4: // nop // sll r0, r0, 0 c->lhu(ra, 0, t7); // lhu ra, 0(t7) // nop // sll r0, r0, 0 c->lw(gp, 104, a1); // lw gp, 104(a1) // nop // sll r0, r0, 0 c->lhu(t8, 2, t7); // lhu t8, 2(t7) // nop // sll r0, r0, 0 c->lw(t9, 72, a1); // lw t9, 72(a1) bc = c->sgpr64(t8) == 0; // beq t8, r0, L74 c->daddu(ra, ra, gp); // daddu ra, ra, gp if (bc) {goto block_13;} // branch non-likely block_5: get_fake_spad_addr2(gp, cache.fake_scratchpad_data, 0, c);// lui gp, 28672 c->lbu(s4, 0, ra); // lbu s4, 0(ra) c->addiu(s3, r0, 1); // addiu s3, r0, 1 c->andi(s2, s4, 7); // andi s2, s4, 7 c->sra(s5, s4, 3); // sra s5, s4, 3 c->sll(s4, s4, 2); // sll s4, s4, 2 c->daddu(s5, s5, gp); // daddu s5, s5, gp c->daddu(s4, s4, t9); // daddu s4, s4, t9 c->sllv(s3, s3, s2); // sllv s3, s3, s2 c->lb(s2, 0, s5); // lb s2, 0(s5) // nop // sll r0, r0, 0 c->lbu(s0, 3, s4); // lbu s0, 3(s4) c->and_(s1, s2, s3); // and s1, s2, s3 c->daddiu(t8, t8, -1); // daddiu t8, t8, -1 bc = c->sgpr64(s1) != 0; // bne s1, r0, L73 c->lw(s1, 4, a1); // lw s1, 4(a1) if (bc) {goto block_12;} // branch non-likely c->dsll(s0, s0, 2); // dsll s0, s0, 2 c->or_(s3, s2, s3); // or s3, s2, s3 c->daddu(s2, s0, s1); // daddu s2, s0, s1 c->sb(s3, 0, s5); // sb s3, 0(s5) // nop // sll r0, r0, 0 c->lwu(s5, 0, s2); // lwu s5, 0(s2) // nop // sll r0, r0, 0 c->lwu(s2, 96, a2); // lwu s2, 96(a2) // nop // sll r0, r0, 0 c->lw(s3, 88, a1); // lw s3, 88(a1) c->and_(s2, s2, s5); // and s2, s2, s5 c->lbu(s1, 0, s4); // lbu s1, 0(s4) bc = c->sgpr64(s2) != 0; // bne s2, r0, L73 c->lbu(s2, 1, s4); // lbu s2, 1(s4) if (bc) {goto block_12;} // branch non-likely c->sll(s1, s1, 1); // sll s1, s1, 1 c->lbu(s4, 2, s4); // lbu s4, 2(s4) c->sll(s0, s1, 1); // sll s0, s1, 1 c->sll(s2, s2, 1); // sll s2, s2, 1 c->daddu(s1, s1, s0); // daddu s1, s1, s0 c->sll(s0, s2, 1); // sll s0, s2, 1 c->sll(s4, s4, 1); // sll s4, s4, 1 c->daddu(s0, s2, s0); // daddu s0, s2, s0 c->sll(v0, s4, 1); // sll v0, s4, 1 c->daddu(s2, s1, s3); // daddu s2, s1, s3 c->daddu(s4, s4, v0); // daddu s4, s4, v0 c->daddu(s1, s0, s3); // daddu s1, s0, s3 c->daddu(s4, s4, s3); // daddu s4, s4, s3 c->ldr(t2, 0, s2); // ldr t2, 0(s2) // nop // sll r0, r0, 0 c->ldl(t2, 7, s2); // ldl t2, 7(s2) // nop // sll r0, r0, 0 c->ldr(t3, 0, s1); // ldr t3, 0(s1) // nop // sll r0, r0, 0 c->ldl(t3, 7, s1); // ldl t3, 7(s1) // nop // sll r0, r0, 0 c->ldr(t4, 0, s4); // ldr t4, 0(s4) c->pextlh(t2, r0, t2); // pextlh t2, r0, t2 c->ldl(t4, 7, s4); // ldl t4, 7(s4) c->pextlh(t3, r0, t3); // pextlh t3, r0, t3 c->lq(s4, 368, a2); // lq s4, 368(a2) c->pextlh(t4, r0, t4); // pextlh t4, r0, t4 c->lq(s3, 384, a2); // lq s3, 384(a2) c->pminw(s1, t2, t3); // pminw s1, t2, t3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s2, t2, t3); // pmaxw s2, t2, t3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pminw(s1, s1, t4); // pminw s1, s1, t4 c->mfc1(r0, f31); // mfc1 r0, f31 c->pmaxw(s2, s2, t4); // pmaxw s2, s2, t4 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s3, s1, s3); // pcgtw s3, s1, s3 c->mfc1(r0, f31); // mfc1 r0, f31 c->pcgtw(s4, s4, s2); // pcgtw s4, s4, s2 c->mfc1(r0, f31); // mfc1 r0, f31 c->por(s4, s3, s4); // por s4, s3, s4 c->mfc1(r0, f31); // mfc1 r0, f31 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 // nop // sll r0, r0, 0 bc = c->sgpr64(s4) != 0; // bne s4, r0, L73 // nop // sll r0, r0, 0 if (bc) {goto block_12;} // branch non-likely c->psllw(t2, t2, 4); // psllw t2, t2, 4 c->lw(s4, 2048, gp); // lw s4, 2048(gp) c->psllw(t3, t3, 4); // psllw t3, t3, 4 c->mov128_vf_gpr(vf7, t2); // qmtc2.i vf7, t2 c->psllw(t4, t4, 4); // psllw t4, t4, 4 c->mov128_vf_gpr(vf8, t3); // qmtc2.i vf8, t3 // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf9, t4); // qmtc2.i vf9, t4 c->vitof0(DEST::xyzw, vf7, vf7); // vitof0.xyzw vf7, vf7 c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 c->vitof0(DEST::xyzw, vf8, vf8); // vitof0.xyzw vf8, vf8 c->sw(s4, 2048, gp); // sw s4, 2048(gp) c->vitof0(DEST::xyzw, vf9, vf9); // vitof0.xyzw vf9, vf9 // nop // sll r0, r0, 0 c->vadd(DEST::xyzw, vf7, vf7, vf1); // vadd.xyzw vf7, vf7, vf1 // nop // sll r0, r0, 0 c->vadd(DEST::xyzw, vf8, vf8, vf1); // vadd.xyzw vf8, vf8, vf1 c->lwu(gp, 512, a2); // lwu gp, 512(a2) c->vadd(DEST::xyzw, vf9, vf9, vf1); // vadd.xyzw vf9, vf9, vf1 // nop // sll r0, r0, 0 bc = c->sgpr64(gp) == c->sgpr64(s7); // beq gp, s7, L72 // nop // sll r0, r0, 0 if (bc) {goto block_10;} // branch non-likely c->vmula_bc(DEST::xyzw, BC::x, vf10, vf7); // vmulax.xyzw acc, vf10, vf7 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf11, vf7); // vmadday.xyzw acc, vf11, vf7 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf12, vf7); // vmaddaz.xyzw acc, vf12, vf7 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf7, vf13, vf0); // vmaddw.xyzw vf7, vf13, vf0 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf10, vf8); // vmulax.xyzw acc, vf10, vf8 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf11, vf8); // vmadday.xyzw acc, vf11, vf8 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf12, vf8); // vmaddaz.xyzw acc, vf12, vf8 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf8, vf13, vf0); // vmaddw.xyzw vf8, vf13, vf0 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf10, vf9); // vmulax.xyzw acc, vf10, vf9 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf11, vf9); // vmadday.xyzw acc, vf11, vf9 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf12, vf9); // vmaddaz.xyzw acc, vf12, vf9 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf13, vf0); // vmaddw.xyzw vf9, vf13, vf0 // nop // sll r0, r0, 0 block_10: c->pextlw(gp, gp, s5); // pextlw gp, gp, s5 c->lw(s4, 0, a0); // lw s4, 0(a0) // nop // sll r0, r0, 0 c->daddiu(s5, a0, 4908); // daddiu s5, a0, 4908 c->daddiu(s3, s4, -460); // daddiu s3, s4, -460 // nop // sll r0, r0, 0 bc = ((s64)c->sgpr64(s3)) >= 0; // bgez s3, L76 c->dsll(s3, s4, 6); // dsll s3, s4, 6 if (bc) {goto block_18;} // branch non-likely c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 c->daddu(s5, s5, s3); // daddu s5, s5, s3 // nop // sll r0, r0, 0 c->sw(s4, 0, a0); // sw s4, 0(a0) // nop // sll r0, r0, 0 c->sq(gp, 48, s5); // sq gp, 48(s5) // nop // sll r0, r0, 0 c->sqc2(vf7, 0, s5); // sqc2 vf7, 0(s5) // nop // sll r0, r0, 0 c->sqc2(vf8, 16, s5); // sqc2 vf8, 16(s5) // nop // sll r0, r0, 0 c->sqc2(vf9, 32, s5); // sqc2 vf9, 32(s5) block_12: bc = ((s64)c->sgpr64(t8)) > 0; // bgtz t8, L71 c->daddiu(ra, ra, 1); // daddiu ra, ra, 1 if (bc) {goto block_5;} // branch non-likely block_13: c->daddiu(t6, t6, -1); // daddiu t6, t6, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t6) != 0; // bne t6, r0, L70 c->daddu(t7, t7, v1); // daddu t7, t7, v1 if (bc) {goto block_4;} // branch non-likely // nop // sll r0, r0, 0 c->lw(t6, 532, a2); // lw t6, 532(a2) // nop // sll r0, r0, 0 c->lw(t8, 536, a2); // lw t8, 536(a2) c->daddiu(t5, t5, -1); // daddiu t5, t5, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t5) != 0; // bne t5, r0, L69 c->daddu(t9, t6, t8); // daddu t9, t6, t8 if (bc) {goto block_3;} // branch non-likely // nop // sll r0, r0, 0 c->lw(t5, 524, a2); // lw t5, 524(a2) // nop // sll r0, r0, 0 c->lw(t6, 528, a2); // lw t6, 528(a2) c->daddiu(t1, t1, -1); // daddiu t1, t1, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t1) != 0; // bne t1, r0, L68 c->daddu(t7, t5, t6); // daddu t7, t5, t6 if (bc) {goto block_2;} // branch non-likely c->load_symbol2(v1, cache.collide_stats); // lw v1, *collide-stats*(s7) c->lwu(v1, 12, v1); // lwu v1, 12(v1) c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 c->load_symbol2(a0, cache.collide_stats); // lw a0, *collide-stats*(s7) c->sw(v1, 12, a0); // sw v1, 12(a0) block_17: c->mov64(v0, s7); // or v0, s7, r0 //beq r0, r0, L78 // beq r0, r0, L78 // nop // sll r0, r0, 0 goto block_21; // branch always block_18: c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol2(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_20;} // branch non-likely c->load_symbol2(t9, cache.print_exceeded_max_cache_tris);// lw t9, print-exceeded-max-cache-tris(s7) 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 block_20: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 block_21: 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.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.collide_stats = intern_from_c("*collide-stats*").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); cache.debug = intern_from_c("debug").c(); cache.print_exceeded_max_cache_tris = intern_from_c("print-exceeded-max-cache-tris").c(); gLinkedFunctionTable.reg("fill-bg-using-box-new", execute, 256); } } // namespace fill_bg_using_box_new } // namespace Mips2C //--------------------------MIPS2C--------------------- // clang-format off #include "game/mips2c/mips2c_private.h" #include "game/kernel/jak2/kscheme.h" using ::jak2::intern_from_c; namespace Mips2C::jak2 { namespace fill_bg_using_line_sphere_new { struct Cache { void* cheat_mode; // *cheat-mode* void* collide_stats; // *collide-stats* void* fake_scratchpad_data; // *fake-scratchpad-data* void* debug; // debug void* print_exceeded_max_cache_tris; // print-exceeded-max-cache-tris } 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) // nop // sll r0, r0, 0 c->lw(v1, 40, a1); // lw v1, 40(a1) // nop // sll r0, r0, 0 c->lqc2(vf2, 44, a1); // lqc2 vf2, 44(a1) c->lui(a3, 1); // lui a3, 1 c->lqc2(vf3, 128, a2); // lqc2 vf3, 128(a2) c->ori(a3, a3, 257); // ori a3, a3, 257 c->lqc2(vf4, 144, a2); // lqc2 vf4, 144(a2) c->dsubu(v1, v1, a3); // dsubu v1, v1, a3 c->lqc2(vf5, 60, a1); // lqc2 vf5, 60(a1) c->vsub(DEST::xyzw, vf3, vf3, vf2); // vsub.xyzw vf3, vf3, vf2 c->lq(a3, 160, a2); // lq a3, 160(a2) c->vsub(DEST::xyzw, vf4, vf4, vf2); // vsub.xyzw vf4, vf4, vf2 c->lq(t0, 176, a2); // lq t0, 176(a2) c->pextlb(v1, r0, v1); // pextlb v1, r0, v1 c->lq(t1, 76, a1); // lq t1, 76(a1) c->pextlh(v1, r0, v1); // pextlh v1, r0, v1 c->lq(t2, 92, a1); // lq t2, 92(a1) c->pcgtw(t0, t1, t0); // pcgtw t0, t1, t0 c->vmul(DEST::xyzw, vf3, vf3, vf5); // vmul.xyzw vf3, vf3, vf5 c->pcgtw(a3, a3, t2); // pcgtw a3, a3, t2 c->vmul(DEST::xyzw, vf4, vf4, vf5); // vmul.xyzw vf4, vf4, vf5 c->por(a3, t0, a3); // por a3, t0, a3 c->lqc2(vf10, 256, a2); // lqc2 vf10, 256(a2) c->ppach(a3, r0, a3); // ppach a3, r0, a3 c->lqc2(vf11, 272, a2); // lqc2 vf11, 272(a2) c->dsll(a3, a3, 16); // dsll a3, a3, 16 c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 bc = c->sgpr64(a3) != 0; // bne a3, r0, L63 c->vftoi0(DEST::xyzw, vf4, vf4); // vftoi0.xyzw vf4, vf4 if (bc) {goto block_22;} // branch non-likely // nop // sll r0, r0, 0 c->lqc2(vf8, 208, a2); // lqc2 vf8, 208(a2) // nop // sll r0, r0, 0 c->lqc2(vf9, 224, a2); // lqc2 vf9, 224(a2) // nop // sll r0, r0, 0 c->mov128_gpr_vf(t0, vf3); // qmfc2.i t0, vf3 // nop // sll r0, r0, 0 c->mov128_gpr_vf(a3, vf4); // qmfc2.i a3, vf4 c->pmaxw(t0, t0, r0); // pmaxw t0, t0, r0 c->lqc2(vf6, 28, a1); // lqc2 vf6, 28(a1) c->pmaxw(a3, a3, r0); // pmaxw a3, a3, r0 c->lqc2(vf7, 240, a2); // lqc2 vf7, 240(a2) c->pminw(t0, t0, v1); // pminw t0, t0, v1 c->vmax_bc(DEST::xyzw, BC::w, vf1, vf0, vf0); // vmaxw.xyzw vf1, vf0, vf0 c->pminw(v1, a3, v1); // pminw v1, a3, v1 c->lqc2(vf23, 448, a2); // lqc2 vf23, 448(a2) // nop // sll r0, r0, 0 c->lqc2(vf24, 464, a2); // lqc2 vf24, 464(a2) // nop // sll r0, r0, 0 c->lqc2(vf25, 480, a2); // lqc2 vf25, 480(a2) // nop // sll r0, r0, 0 c->lqc2(vf26, 496, a2); // lqc2 vf26, 496(a2) // nop // sll r0, r0, 0 c->sq(t0, 400, a2); // sq t0, 400(a2) // nop // sll r0, r0, 0 c->sq(v1, 416, a2); // sq v1, 416(a2) c->vsub(DEST::xyzw, vf8, vf8, vf2); // vsub.xyzw vf8, vf8, vf2 // nop // sll r0, r0, 0 c->addiu(t8, r0, 4); // addiu t8, r0, 4 c->lbu(v1, 40, a1); // lbu v1, 40(a1) c->multu3(t9, v1, t8); // multu3 t9, v1, t8 c->lbu(v1, 42, a1); // lbu v1, 42(a1) c->multu3(t6, v1, t9); // multu3 t6, v1, t9 c->addiu(v1, r0, 1); // addiu v1, r0, 1 c->lw(a3, 400, a2); // lw a3, 400(a2) c->dsubu(v1, v1, a3); // dsubu v1, v1, a3 c->lw(a3, 416, a2); // lw a3, 416(a2) c->daddu(v1, v1, a3); // daddu v1, v1, a3 c->addiu(a3, r0, 1); // addiu a3, r0, 1 c->lw(t0, 404, a2); // lw t0, 404(a2) c->dsubu(a3, a3, t0); // dsubu a3, a3, t0 c->lw(t0, 420, a2); // lw t0, 420(a2) c->daddu(a3, a3, t0); // daddu a3, a3, t0 c->addiu(t0, r0, 1); // addiu t0, r0, 1 c->lw(t1, 408, a2); // lw t1, 408(a2) c->dsubu(t0, t0, t1); // dsubu t0, t0, t1 c->lw(t1, 424, a2); // lw t1, 424(a2) c->daddu(t0, t0, t1); // daddu t0, t0, t1 c->lwu(t1, 8, a1); // lwu t1, 8(a1) c->lw(t2, 400, a2); // lw t2, 400(a2) c->mult3(t2, t2, t8); // mult3 t2, t2, t8 c->lw(t3, 404, a2); // lw t3, 404(a2) c->mult3(t3, t3, t6); // mult3 t3, t3, t6 c->daddu(t2, t2, t3); // daddu t2, t2, t3 c->lw(t3, 408, a2); // lw t3, 408(a2) c->mult3(t3, t3, t9); // mult3 t3, t3, t9 c->daddu(t2, t2, t3); // daddu t2, t2, t3 c->daddu(t7, t1, t2); // daddu t7, t1, t2 c->mov64(t1, a3); // or t1, a3, r0 // nop // sll r0, r0, 0 block_2: c->mov64(t2, t0); // or t2, t0, r0 c->mov64(ra, t7); // or ra, t7, r0 // nop // sll r0, r0, 0 c->sw(t7, 524, a2); // sw t7, 524(a2) // nop // sll r0, r0, 0 c->sw(t6, 528, a2); // sw t6, 528(a2) block_3: c->mov64(t6, v1); // or t6, v1, r0 c->mov64(t7, ra); // or t7, ra, r0 // nop // sll r0, r0, 0 c->sw(ra, 532, a2); // sw ra, 532(a2) // nop // sll r0, r0, 0 c->sw(t9, 536, a2); // sw t9, 536(a2) block_4: // nop // sll r0, r0, 0 c->sw(t8, 520, a2); // sw t8, 520(a2) c->dsubu(s5, v1, t6); // dsubu s5, v1, t6 c->lw(s4, 400, a2); // lw s4, 400(a2) c->dsubu(ra, a3, t1); // dsubu ra, a3, t1 c->lw(gp, 404, a2); // lw gp, 404(a2) c->dsubu(t8, t0, t2); // dsubu t8, t0, t2 c->lw(t9, 408, a2); // lw t9, 408(a2) c->daddu(s5, s5, s4); // daddu s5, s5, s4 c->sw(r0, 444, a2); // sw r0, 444(a2) c->daddu(ra, ra, gp); // daddu ra, ra, gp c->sw(s5, 432, a2); // sw s5, 432(a2) c->daddu(t8, t8, t9); // daddu t8, t8, t9 c->sw(ra, 436, a2); // sw ra, 436(a2) // nop // sll r0, r0, 0 c->sw(t8, 440, a2); // sw t8, 440(a2) // nop // sll r0, r0, 0 c->lqc2(vf3, 432, a2); // lqc2 vf3, 432(a2) c->vitof0(DEST::xyzw, vf3, vf3); // vitof0.xyzw vf3, vf3 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf3, vf6); // vmula.xyzw acc, vf3, vf6 // nop // sll r0, r0, 0 c->vmsub_bc(DEST::xyzw, BC::w, vf3, vf1, vf10); // vmsubw.xyzw vf3, vf1, vf10 // nop // sll r0, r0, 0 c->vmadda(DEST::xyzw, vf1, vf6); // vmadda.xyzw acc, vf1, vf6 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf1, vf10); // vmaddw.xyzw vf4, vf1, vf10 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf3); // vmula.xyzw acc, vf7, vf3 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf13, vf1, vf10); // vmsub.xyzw vf13, vf1, vf10 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf15, vf1, vf11); // vmadd.xyzw vf15, vf1, vf11 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf4); // vmula.xyzw acc, vf7, vf4 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf14, vf1, vf11); // vmsub.xyzw vf14, vf1, vf11 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf16, vf1, vf10); // vmadd.xyzw vf16, vf1, vf10 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf13, vf13, vf14); // vmax.xyzw vf13, vf13, vf14 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf15, vf15, vf16); // vmini.xyzw vf15, vf15, vf16 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::y, vf13, vf13, vf13); // vmaxy.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::y, vf15, vf15, vf15); // vminiy.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::z, vf13, vf13, vf13); // vmaxz.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::z, vf15, vf15, vf15); // vminiz.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vftoi12(DEST::xyzw, vf13, vf13); // vftoi12.xyzw vf13, vf13 // nop // sll r0, r0, 0 c->vftoi12(DEST::xyzw, vf15, vf15); // vftoi12.xyzw vf15, vf15 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->mov128_gpr_vf(ra, vf13); // qmfc2.i ra, vf13 c->addiu(gp, r0, 4096); // addiu gp, r0, 4096 c->mov128_gpr_vf(t8, vf15); // qmfc2.i t8, vf15 c->subu(t9, t8, ra); // subu t9, t8, ra c->subu(ra, gp, ra); // subu ra, gp, ra bc = ((s64)c->sgpr64(t9)) < 0; // bltz t9, L62 // nop // sll r0, r0, 0 if (bc) {goto block_18;} // branch non-likely bc = ((s64)c->sgpr64(ra)) < 0; // bltz ra, L62 // nop // sll r0, r0, 0 if (bc) {goto block_18;} // branch non-likely bc = ((s64)c->sgpr64(t8)) < 0; // bltz t8, L62 // nop // sll r0, r0, 0 if (bc) {goto block_18;} // branch non-likely // nop // sll r0, r0, 0 c->lhu(ra, 0, t7); // lhu ra, 0(t7) // nop // sll r0, r0, 0 c->lw(gp, 104, a1); // lw gp, 104(a1) // nop // sll r0, r0, 0 c->lhu(t8, 2, t7); // lhu t8, 2(t7) // nop // sll r0, r0, 0 c->lw(t9, 72, a1); // lw t9, 72(a1) bc = c->sgpr64(t8) == 0; // beq t8, r0, L62 c->daddu(ra, ra, gp); // daddu ra, ra, gp if (bc) {goto block_18;} // branch non-likely block_8: get_fake_spad_addr2(gp, cache.fake_scratchpad_data, 0, c);// lui gp, 28672 c->lbu(s4, 0, ra); // lbu s4, 0(ra) c->addiu(s3, r0, 1); // addiu s3, r0, 1 c->andi(s2, s4, 7); // andi s2, s4, 7 c->sra(s5, s4, 3); // sra s5, s4, 3 c->sll(s4, s4, 2); // sll s4, s4, 2 c->daddu(s5, s5, gp); // daddu s5, s5, gp c->daddu(s4, s4, t9); // daddu s4, s4, t9 c->sllv(s3, s3, s2); // sllv s3, s3, s2 c->lb(s2, 0, s5); // lb s2, 0(s5) // nop // sll r0, r0, 0 c->lbu(s0, 3, s4); // lbu s0, 3(s4) c->and_(s1, s2, s3); // and s1, s2, s3 c->daddiu(t8, t8, -1); // daddiu t8, t8, -1 bc = c->sgpr64(s1) != 0; // bne s1, r0, L61 c->lw(s1, 4, a1); // lw s1, 4(a1) if (bc) {goto block_17;} // branch non-likely c->dsll(s0, s0, 2); // dsll s0, s0, 2 c->or_(s3, s2, s3); // or s3, s2, s3 c->daddu(s2, s0, s1); // daddu s2, s0, s1 c->sb(s3, 0, s5); // sb s3, 0(s5) // nop // sll r0, r0, 0 c->lwu(s5, 0, s2); // lwu s5, 0(s2) // nop // sll r0, r0, 0 c->lwu(s2, 96, a2); // lwu s2, 96(a2) // nop // sll r0, r0, 0 c->lw(s3, 88, a1); // lw s3, 88(a1) c->and_(s2, s2, s5); // and s2, s2, s5 c->lbu(s1, 0, s4); // lbu s1, 0(s4) bc = c->sgpr64(s2) != 0; // bne s2, r0, L61 c->lbu(s2, 1, s4); // lbu s2, 1(s4) if (bc) {goto block_17;} // branch non-likely c->sll(s1, s1, 1); // sll s1, s1, 1 c->lbu(s4, 2, s4); // lbu s4, 2(s4) c->sll(s0, s1, 1); // sll s0, s1, 1 c->sll(s2, s2, 1); // sll s2, s2, 1 c->daddu(s1, s1, s0); // daddu s1, s1, s0 c->sll(s0, s2, 1); // sll s0, s2, 1 c->sll(s4, s4, 1); // sll s4, s4, 1 c->daddu(s0, s2, s0); // daddu s0, s2, s0 c->sll(v0, s4, 1); // sll v0, s4, 1 c->daddu(s2, s1, s3); // daddu s2, s1, s3 c->daddu(s1, s4, v0); // daddu s1, s4, v0 c->daddu(s4, s0, s3); // daddu s4, s0, s3 c->daddu(s3, s1, s3); // daddu s3, s1, s3 c->ldr(t3, 0, s2); // ldr t3, 0(s2) // nop // sll r0, r0, 0 c->ldl(t3, 7, s2); // ldl t3, 7(s2) // nop // sll r0, r0, 0 c->ldr(t4, 0, s4); // ldr t4, 0(s4) c->pextlh(t3, r0, t3); // pextlh t3, r0, t3 c->ldl(t4, 7, s4); // ldl t4, 7(s4) c->psllw(t3, t3, 4); // psllw t3, t3, 4 c->ldr(t5, 0, s3); // ldr t5, 0(s3) c->pextlh(t4, r0, t4); // pextlh t4, r0, t4 c->ldl(t5, 7, s3); // ldl t5, 7(s3) c->psllw(t4, t4, 4); // psllw t4, t4, 4 c->mov128_vf_gpr(vf17, t3); // qmtc2.i vf17, t3 c->pextlh(t5, r0, t5); // pextlh t5, r0, t5 c->mov128_vf_gpr(vf18, t4); // qmtc2.i vf18, t4 c->psllw(t5, t5, 4); // psllw t5, t5, 4 c->lw(s4, 2048, gp); // lw s4, 2048(gp) c->mov128_vf_gpr(vf19, t5); // qmtc2.i vf19, t5 // nop // sll r0, r0, 0 c->vitof0(DEST::xyzw, vf17, vf17); // vitof0.xyzw vf17, vf17 c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 c->vitof0(DEST::xyzw, vf18, vf18); // vitof0.xyzw vf18, vf18 c->sw(s4, 2048, gp); // sw s4, 2048(gp) c->vitof0(DEST::xyzw, vf19, vf19); // vitof0.xyzw vf19, vf19 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf3, vf17, vf18); // vmini.xyzw vf3, vf17, vf18 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf4, vf17, vf18); // vmax.xyzw vf4, vf17, vf18 // nop // sll r0, r0, 0 c->vadd(DEST::xyzw, vf17, vf17, vf2); // vadd.xyzw vf17, vf17, vf2 // nop // sll r0, r0, 0 c->vadd(DEST::xyzw, vf18, vf18, vf2); // vadd.xyzw vf18, vf18, vf2 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf3, vf3, vf19); // vmini.xyzw vf3, vf3, vf19 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf4, vf4, vf19); // vmax.xyzw vf4, vf4, vf19 // nop // sll r0, r0, 0 c->vadd(DEST::xyzw, vf19, vf19, vf2); // vadd.xyzw vf19, vf19, vf2 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->vsub_bc(DEST::xyzw, BC::w, vf3, vf3, vf10); // vsubw.xyzw vf3, vf3, vf10 // nop // sll r0, r0, 0 c->vadd_bc(DEST::xyzw, BC::w, vf4, vf4, vf10); // vaddw.xyzw vf4, vf4, vf10 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf3); // vmula.xyzw acc, vf7, vf3 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf13, vf1, vf10); // vmsub.xyzw vf13, vf1, vf10 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf15, vf1, vf11); // vmadd.xyzw vf15, vf1, vf11 // nop // sll r0, r0, 0 c->vmula(DEST::xyzw, vf7, vf4); // vmula.xyzw acc, vf7, vf4 // nop // sll r0, r0, 0 c->vmsuba(DEST::xyzw, vf7, vf8); // vmsuba.xyzw acc, vf7, vf8 // nop // sll r0, r0, 0 c->vmsub(DEST::xyzw, vf14, vf1, vf11); // vmsub.xyzw vf14, vf1, vf11 // nop // sll r0, r0, 0 c->vmadd(DEST::xyzw, vf16, vf1, vf10); // vmadd.xyzw vf16, vf1, vf10 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf23, vf17); // vmulax.xyzw acc, vf23, vf17 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf24, vf17); // vmadday.xyzw acc, vf24, vf17 // nop // sll r0, r0, 0 c->vmax(DEST::xyzw, vf13, vf13, vf14); // vmax.xyzw vf13, vf13, vf14 // nop // sll r0, r0, 0 c->vmini(DEST::xyzw, vf15, vf15, vf16); // vmini.xyzw vf15, vf15, vf16 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf25, vf17); // vmaddaz.xyzw acc, vf25, vf17 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf20, vf26, vf0); // vmaddw.xyzw vf20, vf26, vf0 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::y, vf13, vf13, vf13); // vmaxy.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::y, vf15, vf15, vf15); // vminiy.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf23, vf18); // vmulax.xyzw acc, vf23, vf18 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf24, vf18); // vmadday.xyzw acc, vf24, vf18 // nop // sll r0, r0, 0 c->vmax_bc(DEST::xyzw, BC::z, vf13, vf13, vf13); // vmaxz.xyzw vf13, vf13, vf13 // nop // sll r0, r0, 0 c->vmini_bc(DEST::xyzw, BC::z, vf15, vf15, vf15); // vminiz.xyzw vf15, vf15, vf15 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::z, vf25, vf18); // vmaddaz.xyzw acc, vf25, vf18 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf21, vf26, vf0); // vmaddw.xyzw vf21, vf26, vf0 // nop // sll r0, r0, 0 c->vftoi12(DEST::xyzw, vf13, vf13); // vftoi12.xyzw vf13, vf13 // nop // sll r0, r0, 0 c->vftoi12(DEST::xyzw, vf15, vf15); // vftoi12.xyzw vf15, vf15 // nop // sll r0, r0, 0 c->vmula_bc(DEST::xyzw, BC::x, vf23, vf19); // vmulax.xyzw acc, vf23, vf19 // nop // sll r0, r0, 0 c->vmadda_bc(DEST::xyzw, BC::y, vf24, vf19); // vmadday.xyzw acc, vf24, vf19 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->mov128_gpr_vf(s3, vf13); // qmfc2.i s3, vf13 c->addiu(s2, r0, 4096); // addiu s2, r0, 4096 c->mov128_gpr_vf(s4, vf15); // qmfc2.i s4, vf15 c->subu(gp, s4, s3); // subu gp, s4, s3 c->subu(s3, s2, s3); // subu s3, s2, s3 bc = ((s64)c->sgpr64(gp)) < 0; // bltz gp, L61 c->lwu(gp, 512, a2); // lwu gp, 512(a2) if (bc) {goto block_17;} // branch non-likely bc = ((s64)c->sgpr64(s3)) < 0; // bltz s3, L61 // nop // sll r0, r0, 0 if (bc) {goto block_17;} // branch non-likely bc = ((s64)c->sgpr64(s4)) < 0; // bltz s4, L61 // nop // sll r0, r0, 0 if (bc) {goto block_17;} // branch non-likely c->pextlw(s5, gp, s5); // pextlw s5, gp, s5 c->lw(s3, 0, a0); // lw s3, 0(a0) // nop // sll r0, r0, 0 c->daddiu(s4, a0, 4908); // daddiu s4, a0, 4908 c->daddiu(s2, s3, -460); // daddiu s2, s3, -460 // nop // sll r0, r0, 0 bc = ((s64)c->sgpr64(s2)) >= 0; // bgez s2, L64 c->dsll(s2, s3, 6); // dsll s2, s3, 6 if (bc) {goto block_23;} // branch non-likely c->daddiu(s3, s3, 1); // daddiu s3, s3, 1 c->daddu(s4, s4, s2); // daddu s4, s4, s2 bc = c->sgpr64(gp) == c->sgpr64(s7); // beq gp, s7, L60 c->sw(s3, 0, a0); // sw s3, 0(a0) if (bc) {goto block_16;} // branch non-likely c->vmadda_bc(DEST::xyzw, BC::z, vf25, vf19); // vmaddaz.xyzw acc, vf25, vf19 // nop // sll r0, r0, 0 c->vmadd_bc(DEST::xyzw, BC::w, vf22, vf26, vf0); // vmaddw.xyzw vf22, vf26, vf0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 c->sq(s5, 48, s4); // sq s5, 48(s4) // nop // sll r0, r0, 0 c->sqc2(vf20, 0, s4); // sqc2 vf20, 0(s4) // nop // sll r0, r0, 0 c->sqc2(vf21, 16, s4); // sqc2 vf21, 16(s4) //beq r0, r0, L61 // beq r0, r0, L61 c->sqc2(vf22, 32, s4); // sqc2 vf22, 32(s4) goto block_17; // branch always block_16: // nop // sll r0, r0, 0 c->sq(s5, 48, s4); // sq s5, 48(s4) // nop // sll r0, r0, 0 c->sqc2(vf17, 0, s4); // sqc2 vf17, 0(s4) // nop // sll r0, r0, 0 c->sqc2(vf18, 16, s4); // sqc2 vf18, 16(s4) // nop // sll r0, r0, 0 c->sqc2(vf19, 32, s4); // sqc2 vf19, 32(s4) block_17: bc = ((s64)c->sgpr64(t8)) > 0; // bgtz t8, L59 c->daddiu(ra, ra, 1); // daddiu ra, ra, 1 if (bc) {goto block_8;} // branch non-likely block_18: // nop // sll r0, r0, 0 c->lw(t8, 520, a2); // lw t8, 520(a2) c->daddiu(t6, t6, -1); // daddiu t6, t6, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t6) != 0; // bne t6, r0, L58 c->daddu(t7, t7, t8); // daddu t7, t7, t8 if (bc) {goto block_4;} // branch non-likely // nop // sll r0, r0, 0 c->lw(t6, 532, a2); // lw t6, 532(a2) // nop // sll r0, r0, 0 c->lw(t9, 536, a2); // lw t9, 536(a2) c->daddiu(t2, t2, -1); // daddiu t2, t2, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t2) != 0; // bne t2, r0, L57 c->daddu(ra, t6, t9); // daddu ra, t6, t9 if (bc) {goto block_3;} // branch non-likely // nop // sll r0, r0, 0 c->lw(t2, 524, a2); // lw t2, 524(a2) // nop // sll r0, r0, 0 c->lw(t6, 528, a2); // lw t6, 528(a2) c->daddiu(t1, t1, -1); // daddiu t1, t1, -1 // nop // sll r0, r0, 0 bc = c->sgpr64(t1) != 0; // bne t1, r0, L56 c->daddu(t7, t2, t6); // daddu t7, t2, t6 if (bc) {goto block_2;} // branch non-likely c->load_symbol2(v1, cache.collide_stats); // lw v1, *collide-stats*(s7) c->lwu(v1, 12, v1); // lwu v1, 12(v1) c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 c->load_symbol2(a0, cache.collide_stats); // lw a0, *collide-stats*(s7) c->sw(v1, 12, a0); // sw v1, 12(a0) block_22: c->mov64(v0, s7); // or v0, s7, r0 //beq r0, r0, L66 // beq r0, r0, L66 // nop // sll r0, r0, 0 goto block_26; // branch always block_23: c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug c->load_symbol2(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L65 c->mov64(v1, s7); // or v1, s7, r0 if (bc) {goto block_25;} // branch non-likely c->load_symbol2(t9, cache.print_exceeded_max_cache_tris);// lw t9, print-exceeded-max-cache-tris(s7) 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 block_25: c->gprs[v0].du64[0] = 0; // or v0, r0, r0 block_26: 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.cheat_mode = intern_from_c("*cheat-mode*").c(); cache.collide_stats = intern_from_c("*collide-stats*").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); cache.debug = intern_from_c("debug").c(); cache.print_exceeded_max_cache_tris = intern_from_c("print-exceeded-max-cache-tris").c(); gLinkedFunctionTable.reg("fill-bg-using-line-sphere-new", execute, 256); } } // namespace fill_bg_using_line_sphere_new } // namespace Mips2C