//--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" // clang-format off namespace { struct Cache { void* clear_frame_accumulator; // clear-frame-accumulator void* decompress_fixed_data_to_accumulator; // decompress-fixed-data-to-accumulator void* decompress_frame_data_pair_to_accumulator; // decompress-frame-data-pair-to-accumulator void* decompress_frame_data_to_accumulator; // decompress-frame-data-to-accumulator void* normalize_frame_quaternions; // normalize-frame-quaternions void* fake_scratchpad_data; // *fake-scratchpad-data* } cache; } namespace Mips2C { namespace decompress_frame_data_pair_to_accumulator { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 next_block = 0; while(true) { switch(next_block) { case 0: next_block = 1; c->daddiu(sp, sp, -64); // daddiu sp, sp, -64 c->sq(a0, 0, sp); // sq a0, 0(sp) c->sq(t7, 16, sp); // sq t7, 16(sp) c->sq(s0, 32, sp); // sq s0, 32(sp) c->sq(s1, 48, sp); // sq s1, 48(sp) c->mov128_vf_gpr(vf11, t0); // qmtc2.i vf11, t0 c->daddu(a3, a3, a1); // daddu a3, a3, a1 c->mov128_vf_gpr(vf13, a2); // qmtc2.i vf13, a2 //c->lui(t2, 28672); // lui t2, 28672 get_fake_spad_addr(t2, cache.fake_scratchpad_data, 0, c); c->lw(t4, 0, a1); // lw t4, 0(a1) c->daddiu(v1, a1, 16); // daddiu v1, a1, 16 c->lw(t5, 4, a1); // lw t5, 4(a1) c->daddu(s5, t1, r0); // daddu s5, t1, r0 c->lw(t6, 8, a1); // lw t6, 8(a1) c->daddu(t4, t4, v1); // daddu t4, t4, v1 c->vsub_bc(DEST::w, BC::x, vf11, vf0, vf11); // vsubx.w vf11, vf0, vf11 c->lw(t7, 0, a3); // lw t7, 0(a3) c->vmul_bc(DEST::xyzw, BC::x, vf13, vf14, vf13); // vmulx.xyzw vf13, vf14, vf13 c->daddiu(t2, t2, 1760); // daddiu t2, t2, 1760 c->lw(s2, 56, t1); // lw s2, 56(t1) c->daddu(t5, t5, v1); // daddu t5, t5, v1 c->lw(s4, 60, t1); // lw s4, 60(t1) c->daddu(t6, t6, v1); // daddu t6, t6, v1 c->addiu(s3, r0, 8); // addiu s3, r0, 8 c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 c->vmul_bc(DEST::xy, BC::w, vf13, vf13, vf11); // vmulw.xy vf13, vf13, vf11 c->lw(s0, 4, a3); // lw s0, 4(a3) c->vmul_bc(DEST::zw, BC::x, vf13, vf13, vf11); // vmulx.zw vf13, vf13, vf11 c->lw(s1, 8, a3); // lw s1, 8(a3) // nop // sll r0, r0, 0 c->daddiu(v1, a3, 16); // daddiu v1, a3, 16 c->daddu(t7, t7, v1); // daddu t7, t7, v1 c->daddu(s0, s0, v1); // daddu s0, s0, v1 c->daddu(s1, s1, v1); // daddu s1, s1, v1 // nop // sll r0, r0, 0 c->andi(t3, s4, 1); // andi t3, s4, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(t3) == 0; // beq t3, r0, L10 // nop // sll r0, r0, 0 if (bc) {next_block = 2;} // branch non-likely break; case 1: next_block = 2; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf5, 0, t7); // lqc2 vf5, 0(t7) c->lqc2(vf6, 16, t7); // lqc2 vf6, 16(t7) c->lqc2(vf7, 32, t7); // lqc2 vf7, 32(t7) c->lqc2(vf8, 48, t7); // lqc2 vf8, 48(t7) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) c->daddiu(t7, t7, 64); // daddiu t7, t7, 64 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf5, vf13); // vmaddw.xyzw vf9, vf5, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf2, vf13); // vmaddax.xyzw acc, vf2, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf10, vf6, vf13); // vmaddw.xyzw vf10, vf6, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf3, vf13); // vmaddax.xyzw acc, vf3, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf7, vf13); // vmaddw.xyzw vf11, vf7, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf4, vf13); // vmaddax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf8, vf13); // vmaddw.xyzw vf12, vf8, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 2: next_block = 3; c->andi(t3, s4, 2); // andi t3, s4, 2 c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 bc = c->sgpr64(t3) == 0; // beq t3, r0, L11 // nop // sll r0, r0, 0 if (bc) {next_block = 4;} // branch non-likely break; case 3: next_block = 4; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf5, 0, t7); // lqc2 vf5, 0(t7) c->lqc2(vf6, 16, t7); // lqc2 vf6, 16(t7) c->lqc2(vf7, 32, t7); // lqc2 vf7, 32(t7) c->lqc2(vf8, 48, t7); // lqc2 vf8, 48(t7) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) c->daddiu(t7, t7, 64); // daddiu t7, t7, 64 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf5, vf13); // vmaddw.xyzw vf9, vf5, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf2, vf13); // vmaddax.xyzw acc, vf2, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf10, vf6, vf13); // vmaddw.xyzw vf10, vf6, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf3, vf13); // vmaddax.xyzw acc, vf3, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf7, vf13); // vmaddw.xyzw vf11, vf7, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf4, vf13); // vmaddax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf8, vf13); // vmaddw.xyzw vf12, vf8, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 4: next_block = 5; c->lw(s4, -4, s5); // lw s4, -4(s5) c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 case 5: next_block = 6; c->andi(t3, s4, 15); // andi t3, s4, 15 c->sra(s4, s4, 4); // sra s4, s4, 4 c->sll(t3, t3, 2); // sll t3, t3, 2 c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 c->daddu(t3, t3, t2); // daddu t3, t3, t2 c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 c->lw(t3, 0, t3); // lw t3, 0(t3) // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 next_block = 0x4d7666d9 ^ c->gprs[t3].du32[0]; // jr t3 ASSERT(next_block < 33); break; // nop // sll r0, r0, 0 case 6: next_block = 7; bc = c->sgpr64(s2) == 0; // beq s2, r0, L20 c->daddiu(a0, a0, 48); // daddiu a0, a0, 48 if (bc) {next_block = 32;} // branch non-likely break; case 7: next_block = 8; bc = c->sgpr64(s3) != 0; // bne s3, r0, L12 // nop // sll r0, r0, 0 if (bc) {next_block = 5;} // branch non-likely break; case 8: next_block = 9; c->lw(s4, 0, s5); // lw s4, 0(s5) c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 //beq r0, r0, L12 // beq r0, r0, L12 c->addiu(s3, r0, 8); // addiu s3, r0, 8 next_block = 5; // branch always break; case 9: next_block = 10; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(s6, 0, s0); // lw s6, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(gp, 0, s1); // lh gp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vitof0(DEST::xyzw, vf2, vf2); // vitof0.xyzw vf2, vf2 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::y, vf1, vf13); // vmadday.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf2, vf13); // vmaddz.xyzw vf3, vf2, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 10: next_block = 11; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->ld(s6, 0, t7); // ld s6, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->lw(gp, 0, s0); // lw gp, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf3, vf2, vf13); // vmaddw.xyzw vf3, vf2, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 11: next_block = 12; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 0, t7); // ld t9, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L14 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 13; break; } case 13: next_block = 14; c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 14: next_block = 15; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 0, t7); // ld t9, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->lw(s6, 0, s0); // lw s6, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(gp, 0, s1); // lh gp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L15 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 16; break; } case 16: next_block = 17; c->vitof0(DEST::xyzw, vf2, vf2); // vitof0.xyzw vf2, vf2 c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::y, vf1, vf13); // vmadday.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf2, vf13); // vmaddz.xyzw vf3, vf2, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 17: next_block = 18; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 8, t7); // ld t9, 8(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->ld(s6, -8, t7); // ld s6, -8(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->lw(gp, 0, s0); // lw gp, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L16 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 19; break; } case 19: next_block = 20; c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf3, vf2, vf13); // vmaddw.xyzw vf3, vf2, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 20: next_block = 21; c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 21: next_block = 22; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(s6, 0, s0); // lw s6, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(gp, 0, s1); // lh gp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vitof0(DEST::xyzw, vf2, vf2); // vitof0.xyzw vf2, vf2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::y, vf1, vf13); // vmadday.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf2, vf13); // vmaddz.xyzw vf3, vf2, vf13 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 22: next_block = 23; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->ld(s6, 0, t7); // ld s6, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->lw(gp, 0, s0); // lw gp, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf3, vf2, vf13); // vmaddw.xyzw vf3, vf2, vf13 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 23: next_block = 24; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 0, t7); // ld t9, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L17 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 25; break; } case 25: next_block = 26; c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 26: next_block = 27; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 0, t7); // ld t9, 0(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->lw(s6, 0, s0); // lw s6, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(gp, 0, s1); // lh gp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L18 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 28; break; } case 28: next_block = 29; c->vitof0(DEST::xyzw, vf2, vf2); // vitof0.xyzw vf2, vf2 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::y, vf1, vf13); // vmadday.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::z, vf3, vf2, vf13); // vmaddz.xyzw vf3, vf2, vf13 c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 29: next_block = 30; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(t9, 8, t7); // ld t9, 8(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf5, t9); // qmtc2.i vf5, t9 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::x, vf4, vf13); // vmulax.xyzw acc, vf4, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf4, vf5, vf13); // vmaddw.xyzw vf4, vf5, vf13 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->ld(s6, -8, t7); // ld s6, -8(t7) c->daddiu(t7, t7, 8); // daddiu t7, t7, 8 c->lw(gp, 0, s0); // lw gp, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->mov128_vf_gpr(vf2, s6); // qmtc2.i vf2, s6 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L19 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 31; break; } case 31: next_block = 32; c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf13); // vmaddax.xyzw acc, vf1, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf3, vf2, vf13); // vmaddw.xyzw vf3, vf2, vf13 c->vadd(DEST::xyzw, vf6, vf6, vf4); // vadd.xyzw vf6, vf6, vf4 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->lw(t8, 0, s0); // lw t8, 0(s0) c->daddiu(s0, s0, 4); // daddiu s0, s0, 4 c->lh(fp, 0, s1); // lh fp, 0(s1) c->daddiu(s1, s1, 2); // daddiu s1, s1, 2 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf8, t8); // qmtc2.i vf8, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vitof12(DEST::xyzw, vf8, vf8); // vitof12.xyzw vf8, vf8 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadda_bc(DEST::xyzw, BC::x, vf7, vf13); // vmaddax.xyzw acc, vf7, vf13 c->vmadd_bc(DEST::xyzw, BC::w, vf9, vf8, vf13); // vmaddw.xyzw vf9, vf8, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L13 // beq r0, r0, L13 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 32: next_block = 33; c->lq(a0, 0, sp); // lq a0, 0(sp) c->lq(t7, 16, sp); // lq t7, 16(sp) c->lq(s0, 32, sp); // lq s0, 32(sp) c->lq(s1, 48, sp); // lq s1, 48(sp) //jr ra // jr ra c->daddiu(sp, sp, 64); // daddiu sp, sp, 64 goto end_of_function; // return //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]; } u32 jump_table_vals[16] = { 0x4d7666df, // = 6 ^ 1299605209 0x4d7666d0, // = 9 ^ 1299605209 0x4d7666d2, // = 11 ^ 1299605209 0x4d7666d7, // = 14 ^ 1299605209 0x4d7666cd, // = 20 ^ 1299605209 0x4d7666cc, // = 21 ^ 1299605209 0x4d7666ce, // = 23 ^ 1299605209 0x4d7666c3, // = 26 ^ 1299605209 0x4d7666df, // = 6 ^ 1299605209 0x4d7666d3, // = 10 ^ 1299605209 0x4d7666d2, // = 11 ^ 1299605209 0x4d7666c8, // = 17 ^ 1299605209 0x4d7666cd, // = 20 ^ 1299605209 0x4d7666cf, // = 22 ^ 1299605209 0x4d7666ce, // = 23 ^ 1299605209 0x4d7666c4, // = 29 ^ 1299605209 }; } // namespace decompress_frame_data_pair_to_accumulator } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace decompress_frame_data_to_accumulator { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 next_block = 0; while(true) { switch(next_block) { case 0: next_block = 1; c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 c->mov128_vf_gpr(vf13, a2); // qmtc2.i vf13, a2 c->sq(a0, 0, sp); // sq a0, 0(sp) //c->lui(t2, 28672); // lui t2, 28672 get_fake_spad_addr(t2, cache.fake_scratchpad_data, 0, c); c->lw(t4, 0, a1); // lw t4, 0(a1) c->daddiu(v1, a1, 16); // daddiu v1, a1, 16 c->lw(t5, 4, a1); // lw t5, 4(a1) c->daddu(s5, t1, r0); // daddu s5, t1, r0 c->lw(t6, 8, a1); // lw t6, 8(a1) c->daddu(t4, t4, v1); // daddu t4, t4, v1 c->vmul_bc(DEST::xyzw, BC::x, vf13, vf14, vf13); // vmulx.xyzw vf13, vf14, vf13 c->daddiu(t2, t2, 1696); // daddiu t2, t2, 1696 c->lw(s2, 56, t1); // lw s2, 56(t1) c->daddu(t5, t5, v1); // daddu t5, t5, v1 c->lw(s4, 60, t1); // lw s4, 60(t1) c->daddu(t6, t6, v1); // daddu t6, t6, v1 c->addiu(s3, r0, 8); // addiu s3, r0, 8 c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 c->andi(t3, s4, 1); // andi t3, s4, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(t3) == 0; // beq t3, r0, L22 // nop // sll r0, r0, 0 if (bc) {next_block = 2;} // branch non-likely break; case 1: next_block = 2; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) // nop // sll r0, r0, 0 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf1, vf13); // vmaddx.xyzw vf9, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf2, vf13); // vmaddx.xyzw vf10, vf2, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf11, vf3, vf13); // vmaddx.xyzw vf11, vf3, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf12, vf4, vf13); // vmaddx.xyzw vf12, vf4, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 2: next_block = 3; c->andi(t3, s4, 2); // andi t3, s4, 2 c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 bc = c->sgpr64(t3) == 0; // beq t3, r0, L23 // nop // sll r0, r0, 0 if (bc) {next_block = 4;} // branch non-likely break; case 3: next_block = 4; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) // nop // sll r0, r0, 0 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf1, vf13); // vmaddx.xyzw vf9, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf2, vf13); // vmaddx.xyzw vf10, vf2, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf11, vf3, vf13); // vmaddx.xyzw vf11, vf3, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf12, vf4, vf13); // vmaddx.xyzw vf12, vf4, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 4: next_block = 5; c->lw(s4, -4, s5); // lw s4, -4(s5) c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 case 5: next_block = 6; c->andi(t3, s4, 15); // andi t3, s4, 15 c->sra(s4, s4, 4); // sra s4, s4, 4 c->sll(t3, t3, 2); // sll t3, t3, 2 c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 c->daddu(t3, t3, t2); // daddu t3, t3, t2 c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 c->lw(t3, 0, t3); // lw t3, 0(t3) // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 next_block = 0x7b2191d ^ c->gprs[t3].du32[0]; // jr t3 ASSERT(next_block < 33); break; // nop // sll r0, r0, 0 case 6: next_block = 7; bc = c->sgpr64(s2) == 0; // beq s2, r0, L32 c->daddiu(a0, a0, 48); // daddiu a0, a0, 48 if (bc) {next_block = 32;} // branch non-likely break; case 7: next_block = 8; bc = c->sgpr64(s3) != 0; // bne s3, r0, L24 // nop // sll r0, r0, 0 if (bc) {next_block = 5;} // branch non-likely break; case 8: next_block = 9; c->lw(s4, 0, s5); // lw s4, 0(s5) c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 //beq r0, r0, L24 // beq r0, r0, L24 c->addiu(s3, r0, 8); // addiu s3, r0, 8 next_block = 5; // branch always break; case 9: next_block = 10; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 10: next_block = 11; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 11: next_block = 12; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L26 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 13; break; } case 13: next_block = 14; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 14: next_block = 15; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L27 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 16; break; } case 16: next_block = 17; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 17: next_block = 18; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L28 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 19; break; } case 19: next_block = 20; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 20: next_block = 21; c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 21: next_block = 22; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 22: next_block = 23; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 23: next_block = 24; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L29 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 25; break; } case 25: next_block = 26; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 26: next_block = 27; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L30 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 28; break; } case 28: next_block = 29; c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 29: next_block = 30; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L31 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 31; break; } case 31: next_block = 32; c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L25 // beq r0, r0, L25 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 32: next_block = 33; c->lq(a0, 0, sp); // lq a0, 0(sp) // nop // sll r0, r0, 0 //jr ra // jr ra c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 goto end_of_function; // return //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]; } u32 jump_table_vals[16] = { 0x7b2191b, // = 6 ^ 129112349 0x7b21914, // = 9 ^ 129112349 0x7b21916, // = 11 ^ 129112349 0x7b21913, // = 14 ^ 129112349 0x7b21909, // = 20 ^ 129112349 0x7b21908, // = 21 ^ 129112349 0x7b2190a, // = 23 ^ 129112349 0x7b21907, // = 26 ^ 129112349 0x7b2191b, // = 6 ^ 129112349 0x7b21917, // = 10 ^ 129112349 0x7b21916, // = 11 ^ 129112349 0x7b2190c, // = 17 ^ 129112349 0x7b21909, // = 20 ^ 129112349 0x7b2190b, // = 22 ^ 129112349 0x7b2190a, // = 23 ^ 129112349 0x7b21900, // = 29 ^ 129112349 }; } // namespace decompress_frame_data_to_accumulator } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace decompress_fixed_data_to_accumulator { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 next_block = 0; while(true) { switch(next_block) { case 0: next_block = 1; c->lq(t4, 0, a1); // lq t4, 0(a1) c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 c->lq(t5, 16, a1); // lq t5, 16(a1) // nop // sll r0, r0, 0 c->sq(t4, 0, t1); // sq t4, 0(t1) // nop // sll r0, r0, 0 c->sq(t5, 16, t1); // sq t5, 16(t1) // nop // sll r0, r0, 0 c->lq(t4, 32, a1); // lq t4, 32(a1) // nop // sll r0, r0, 0 c->lq(t5, 48, a1); // lq t5, 48(a1) // nop // sll r0, r0, 0 c->sq(t4, 32, t1); // sq t4, 32(t1) // nop // sll r0, r0, 0 c->sq(t5, 48, t1); // sq t5, 48(t1) // nop // sll r0, r0, 0 c->sq(a0, 0, sp); // sq a0, 0(sp) // nop // sll r0, r0, 0 c->mov128_vf_gpr(vf13, a2); // qmtc2.i vf13, a2 // c->lui(t2, 28672); // lui t2, 28672 get_fake_spad_addr(t2, cache.fake_scratchpad_data, 0, c); c->lw(t4, 64, a1); // lw t4, 64(a1) c->daddiu(v1, a1, 80); // daddiu v1, a1, 80 c->lw(t5, 68, a1); // lw t5, 68(a1) c->daddu(s5, t1, r0); // daddu s5, t1, r0 c->lw(t6, 72, a1); // lw t6, 72(a1) c->daddu(t4, t4, v1); // daddu t4, t4, v1 c->vmul_bc(DEST::xyzw, BC::x, vf13, vf14, vf13); // vmulx.xyzw vf13, vf14, vf13 c->daddiu(t2, t2, 1632); // daddiu t2, t2, 1632 c->lw(s2, 56, t1); // lw s2, 56(t1) c->daddu(t5, t5, v1); // daddu t5, t5, v1 c->lw(s4, 60, t1); // lw s4, 60(t1) c->daddu(t6, t6, v1); // daddu t6, t6, v1 c->addiu(s3, r0, 8); // addiu s3, r0, 8 c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 c->andi(t3, s4, 1); // andi t3, s4, 1 // nop // sll r0, r0, 0 bc = c->sgpr64(t3) != 0; // bne t3, r0, L34 // nop // sll r0, r0, 0 if (bc) {next_block = 2;} // branch non-likely break; case 1: next_block = 2; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) // nop // sll r0, r0, 0 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf1, vf13); // vmaddx.xyzw vf9, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf2, vf13); // vmaddx.xyzw vf10, vf2, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf11, vf3, vf13); // vmaddx.xyzw vf11, vf3, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf12, vf4, vf13); // vmaddx.xyzw vf12, vf4, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 2: next_block = 3; c->andi(t3, s4, 2); // andi t3, s4, 2 c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 bc = c->sgpr64(t3) != 0; // bne t3, r0, L35 // nop // sll r0, r0, 0 if (bc) {next_block = 4;} // branch non-likely break; case 3: next_block = 4; c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4) c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4) c->lqc2(vf4, 48, t4); // lqc2 vf4, 48(t4) c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) // nop // sll r0, r0, 0 c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) c->lqc2(vf12, 48, a0); // lqc2 vf12, 48(a0) c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf1, vf13); // vmaddx.xyzw vf9, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf2, vf13); // vmaddx.xyzw vf10, vf2, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf11, vf0); // vmulaw.xyzw acc, vf11, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf11, vf3, vf13); // vmaddx.xyzw vf11, vf3, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf12, vf0); // vmulaw.xyzw acc, vf12, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf12, vf4, vf13); // vmaddx.xyzw vf12, vf4, vf13 c->sqc2(vf9, 0, a0); // sqc2 vf9, 0(a0) c->sqc2(vf10, 16, a0); // sqc2 vf10, 16(a0) c->sqc2(vf11, 32, a0); // sqc2 vf11, 32(a0) c->sqc2(vf12, 48, a0); // sqc2 vf12, 48(a0) case 4: next_block = 5; c->lw(s4, -4, s5); // lw s4, -4(s5) c->daddiu(a0, a0, 64); // daddiu a0, a0, 64 case 5: next_block = 6; c->andi(t3, s4, 15); // andi t3, s4, 15 c->sra(s4, s4, 4); // sra s4, s4, 4 c->sll(t3, t3, 2); // sll t3, t3, 2 c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 c->daddu(t3, t3, t2); // daddu t3, t3, t2 c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 c->lw(t3, 0, t3); // lw t3, 0(t3) // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 next_block = 0x3ee6b6f0 ^ c->gprs[t3].du32[0]; // jr t3 ASSERT(next_block < 33); break; // nop // sll r0, r0, 0 case 6: next_block = 7; bc = c->sgpr64(s2) == 0; // beq s2, r0, L44 c->daddiu(a0, a0, 48); // daddiu a0, a0, 48 if (bc) {next_block = 32;} // branch non-likely break; case 7: next_block = 8; bc = c->sgpr64(s3) != 0; // bne s3, r0, L36 // nop // sll r0, r0, 0 if (bc) {next_block = 5;} // branch non-likely break; case 8: next_block = 9; c->lw(s4, 0, s5); // lw s4, 0(s5) c->daddiu(s5, s5, 4); // daddiu s5, s5, 4 //beq r0, r0, L36 // beq r0, r0, L36 c->addiu(s3, r0, 8); // addiu s3, r0, 8 next_block = 5; // branch always break; case 9: next_block = 10; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L38 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 11; break; } case 11: next_block = 12; c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 12: next_block = 13; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L39 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 14; break; } case 14: next_block = 15; c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 15: next_block = 16; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L40 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 17; break; } case 17: next_block = 18; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 18: next_block = 19; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 19: next_block = 20; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 20: next_block = 21; c->lw(t8, 0, t5); // lw t8, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(fp, 0, t6); // lh fp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf9, 32, a0); // lqc2 vf9, 32(a0) c->pextlw(t8, fp, t8); // pextlw t8, fp, t8 c->pextlh(t8, t8, r0); // pextlh t8, t8, r0 c->psraw(t8, t8, 16); // psraw t8, t8, 16 c->mov128_vf_gpr(vf7, t8); // qmtc2.i vf7, t8 c->vitof12(DEST::xyzw, vf7, vf7); // vitof12.xyzw vf7, vf7 c->vmula_bc(DEST::xyzw, BC::w, vf9, vf0); // vmulaw.xyzw acc, vf9, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf7, vf13); // vmaddx.xyzw vf9, vf7, vf13 c->sqc2(vf9, 32, a0); // sqc2 vf9, 32(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 21: next_block = 22; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L41 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 23; break; } case 23: next_block = 24; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 24: next_block = 25; c->ld(t9, 8, t4); // ld t9, 8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->ld(s6, -8, t4); // ld s6, -8(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L42 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 26; break; } case 26: next_block = 27; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 27: next_block = 28; c->ld(t9, 0, t4); // ld t9, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lqc2(vf6, 16, a0); // lqc2 vf6, 16(a0) c->pextlh(t9, t9, r0); // pextlh t9, t9, r0 c->psraw(t9, t9, 16); // psraw t9, t9, 16 c->mov128_vf_gpr(vf4, t9); // qmtc2.i vf4, t9 c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4 c->vmul(DEST::xyzw, vf10, vf4, vf6); // vmul.xyzw vf10, vf4, vf6 c->vmula_bc(DEST::xyzw, BC::w, vf10, vf0); // vmulaw.xyzw acc, vf10, vf0 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->mov128_gpr_vf(t9, vf10); // qmfc2.i t9, vf10 c->pcpyud(t9, t9, r0); // pcpyud t9, t9, r0 if (((s64)c->sgpr64(t9)) < 0) { // bltzl t9, L43 c->vsub(DEST::xyzw, vf4, vf15, vf4); // vsub.xyzw vf4, vf15, vf4 next_block = 29; break; } case 29: next_block = 30; c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf6, vf4, vf13); // vmaddx.xyzw vf6, vf4, vf13 c->sqc2(vf6, 16, a0); // sqc2 vf6, 16(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 30: next_block = 31; c->lw(s6, 0, t5); // lw s6, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lh(gp, 0, t6); // lh gp, 0(t6) c->daddiu(t6, t6, 2); // daddiu t6, t6, 2 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pextlw(s6, gp, s6); // pextlw s6, gp, s6 c->pextlh(s6, s6, r0); // pextlh s6, s6, r0 c->psraw(s6, s6, 16); // psraw s6, s6, 16 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vitof0(DEST::xyzw, vf1, vf1); // vitof0.xyzw vf1, vf1 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf1, vf13); // vmaddy.xyzw vf3, vf1, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 31: next_block = 32; c->ld(s6, 0, t4); // ld s6, 0(t4) c->daddiu(t4, t4, 8); // daddiu t4, t4, 8 c->lw(gp, 0, t5); // lw gp, 0(t5) c->daddiu(t5, t5, 4); // daddiu t5, t5, 4 c->lqc2(vf3, 0, a0); // lqc2 vf3, 0(a0) c->pcpyld(s6, gp, s6); // pcpyld s6, gp, s6 c->mov128_vf_gpr(vf1, s6); // qmtc2.i vf1, s6 c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0 c->vmadd_bc(DEST::xyzw, BC::x, vf3, vf1, vf13); // vmaddx.xyzw vf3, vf1, vf13 c->sqc2(vf3, 0, a0); // sqc2 vf3, 0(a0) //beq r0, r0, L37 // beq r0, r0, L37 // nop // sll r0, r0, 0 next_block = 6; // branch always break; case 32: next_block = 33; c->lq(a0, 0, sp); // lq a0, 0(sp) // nop // sll r0, r0, 0 //jr ra // jr ra c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 goto end_of_function; // return //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]; } u32 jump_table_vals[16] = { 0x3ee6b6f9, // = 9 ^ 1055307504 0x3ee6b6ff, // = 15 ^ 1055307504 0x3ee6b6e2, // = 18 ^ 1055307504 0x3ee6b6e4, // = 20 ^ 1055307504 0x3ee6b6e5, // = 21 ^ 1055307504 0x3ee6b6eb, // = 27 ^ 1055307504 0x3ee6b6ee, // = 30 ^ 1055307504 0x3ee6b6f6, // = 6 ^ 1055307504 0x3ee6b6fc, // = 12 ^ 1055307504 0x3ee6b6ff, // = 15 ^ 1055307504 0x3ee6b6e3, // = 19 ^ 1055307504 0x3ee6b6e4, // = 20 ^ 1055307504 0x3ee6b6e8, // = 24 ^ 1055307504 0x3ee6b6eb, // = 27 ^ 1055307504 0x3ee6b6ef, // = 31 ^ 1055307504 0x3ee6b6f6, // = 6 ^ 1055307504 }; } // namespace decompress_fixed_data_to_accumulator } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace normalize_frame_quaternions { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 c->daddiu(s2, s2, -2); // daddiu s2, s2, -2 c->sw(a0, 0, sp); // sw a0, 0(sp) c->daddiu(a0, a0, 128); // daddiu a0, a0, 128 block_1: c->lqc2(vf4, 16, a0); // lqc2 vf4, 16(a0) c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0) c->lqc2(vf7, 32, a0); // lqc2 vf7, 32(a0) c->vmul(DEST::xyzw, vf10, vf4, vf4); // vmul.xyzw vf10, vf4, vf4 c->vmove(DEST::w, vf1, vf0); // vmove.w vf1, vf0 c->vmove(DEST::w, vf7, vf0); // vmove.w vf7, vf0 c->vmula_bc(DEST::xyzw, BC::w, vf0, vf10); // vmulaw.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::z, vf0, vf10); // vmaddaz.xyzw acc, vf0, vf10 c->vmadda_bc(DEST::xyzw, BC::y, vf0, vf10); // vmadday.xyzw acc, vf0, vf10 c->vmadd_bc(DEST::xyzw, BC::x, vf10, vf0, vf10); // vmaddx.xyzw vf10, vf0, vf10 c->sqc2(vf1, 0, a0); // sqc2 vf1, 0(a0) c->sqc2(vf7, 32, a0); // sqc2 vf7, 32(a0) c->daddiu(a0, a0, 48); // daddiu a0, a0, 48 c->vrsqrt(vf0, BC::w, vf10, BC::w); // vrsqrt Q, vf0.w, vf10.w c->vwaitq(); // vwaitq c->vmulq(DEST::xyzw, vf4, vf4); // vmulq.xyzw vf4, vf4, Q c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 bc = c->sgpr64(s2) != 0; // bne s2, r0, L46 c->sqc2(vf4, -32, a0); // sqc2 vf4, -32(a0) if (bc) {goto block_1;} // branch non-likely c->lw(a0, 0, sp); // lw a0, 0(sp) // nop // sll r0, r0, 0 //jr ra // jr ra c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 goto end_of_function; // return //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]; } } // namespace normalize_frame_quaternions } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace clear_frame_accumulator { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 // nop // sll r0, r0, 0 c->sw(a0, 0, sp); // sw a0, 0(sp) // nop // sll r0, r0, 0 c->sq(r0, 0, a0); // sq r0, 0(a0) c->daddiu(s2, s2, -2); // daddiu s2, s2, -2 c->sq(r0, 16, a0); // sq r0, 16(a0) // nop // sll r0, r0, 0 c->sq(r0, 32, a0); // sq r0, 32(a0) // nop // sll r0, r0, 0 c->sq(r0, 48, a0); // sq r0, 48(a0) // nop // sll r0, r0, 0 c->sq(r0, 64, a0); // sq r0, 64(a0) // nop // sll r0, r0, 0 c->sq(r0, 80, a0); // sq r0, 80(a0) // nop // sll r0, r0, 0 c->sq(r0, 96, a0); // sq r0, 96(a0) // nop // sll r0, r0, 0 c->sq(r0, 112, a0); // sq r0, 112(a0) c->daddiu(a0, a0, 128); // daddiu a0, a0, 128 block_1: c->sq(r0, 0, a0); // sq r0, 0(a0) c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 c->sq(r0, 16, a0); // sq r0, 16(a0) c->daddiu(a0, a0, 48); // daddiu a0, a0, 48 // nop // sll r0, r0, 0 // nop // sll r0, r0, 0 bc = c->sgpr64(s2) != 0; // bne s2, r0, L48 c->sq(r0, -16, a0); // sq r0, -16(a0) if (bc) {goto block_1;} // branch non-likely c->lw(a0, 0, sp); // lw a0, 0(sp) // nop // sll r0, r0, 0 //jr ra // jr ra c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 goto end_of_function; // return //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]; } } // namespace clear_frame_accumulator } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace calc_animation_from_spr { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; u32 call_addr = 0; u32 madr, sadr, qwc; c->mov64(v1, a1); // or v1, a1, r0 c->daddiu(sp, sp, -192); // daddiu sp, sp, -192 c->sq(s0, 0, sp); // sq s0, 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(s6, 96, sp); // sq s6, 96(sp) c->sq(t8, 112, sp); // sq t8, 112(sp) c->sq(t9, 128, sp); // sq t9, 128(sp) c->sq(gp, 144, sp); // sq gp, 144(sp) c->sq(fp, 160, sp); // sq fp, 160(sp) c->sq(ra, 176, sp); // sq ra, 176(sp) c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 c->mov128_vf_gpr(vf15, r0); // qmtc2.i vf15, r0 c->sw(a1, 0, sp); // sw a1, 0(sp) //c->lui(v1, 28672); // lui v1, 28672 get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c); c->lw(s1, 2400, v1); // lw s1, 2400(v1) c->daddiu(t7, v1, 1824); // daddiu t7, v1, 1824 c->lui(s0, 4096); // lui s0, 4096 c->daddiu(t1, v1, 7344); // daddiu t1, v1, 7344 bc = c->sgpr64(s1) == 0; // beq s1, r0, L7 c->ori(s0, s0, 54272); // ori s0, s0, 54272 // spr to (d400) if (bc) {goto block_12;} // branch non-likely c->lw(t2, 0, t7); // lw t2, 0(t7) c->addiu(t3, r0, 7408); // addiu t3, r0, 7408 c->lw(t4, 4, t7); // lw t4, 4(t7) c->addiu(v1, r0, 256); // addiu v1, r0, 256 // c->sw(t2, 16, s0); // sw t2, 16(s0) madr = c->sgpr64(t2); c->vadd_bc(DEST::xyzw, BC::w, vf14, vf15, vf0); // vaddw.xyzw vf14, vf15, vf0 //c->sw(t3, 128, s0); // sw t3, 128(s0) sadr = c->sgpr64(t3); // nop // sll r0, r0, 0 //c->sw(t4, 32, s0); // sw t4, 32(s0) qwc = c->sgpr64(t4); // Unknown instr: sync.l //c->sw(v1, 0, s0); // sw v1, 0(s0) spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc); // Unknown instr: sync.l c->load_symbol(t9, cache.clear_frame_accumulator);// lw t9, clear-frame-accumulator(s7) c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14 c->lw(s2, 0, sp); // lw s2, 0(sp) // nop // sll r0, r0, 0 call_addr = c->gprs[t9].du32[0]; // function call: c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14 //c->jalr(call_addr); // jalr ra, t9 clear_frame_accumulator::execute(c); block_2: // c->lw(v1, 0, s0); // lw v1, 0(s0) // // nop // sll r0, r0, 0 // c->andi(v1, v1, 256); // andi v1, v1, 256 // // nop // sll r0, r0, 0 // // nop // sll r0, r0, 0 // // nop // sll r0, r0, 0 // bc = c->sgpr64(v1) != 0; // bne v1, r0, L3 // // nop // sll r0, r0, 0 // if (bc) {goto block_2;} // branch non-likely c->lw(t2, 8, t7); // lw t2, 8(t7) c->addiu(t3, r0, 9616); // addiu t3, r0, 9616 c->lw(t4, 12, t7); // lw t4, 12(t7) c->addiu(v1, r0, 256); // addiu v1, r0, 256 //c->sw(t2, 16, s0); // sw t2, 16(s0) madr = c->sgpr64(t2); // nop // sll r0, r0, 0 //c->sw(t3, 128, s0); // sw t3, 128(s0) sadr = c->sgpr64(t3); // nop // sll r0, r0, 0 //c->sw(t4, 32, s0); // sw t4, 32(s0) qwc = c->sgpr64(t4); // Unknown instr: sync.l //c->sw(v1, 0, s0); // sw v1, 0(s0) spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc); // Unknown instr: sync.l c->lw(a2, 16, t7); // lw a2, 16(t7) //c->lui(a1, 28672); // lui a1, 28672 get_fake_spad_addr(a1, cache.fake_scratchpad_data, 0, c); c->load_symbol(t9, cache.decompress_fixed_data_to_accumulator);// lw t9, decompress-fixed-data-to-accumulator(s7) c->daddiu(a1, a1, 7408); // daddiu a1, a1, 7408 call_addr = c->gprs[t9].du32[0]; // function call: c->daddiu(s1, s1, -1); // daddiu s1, s1, -1 //c->jalr(call_addr); // jalr ra, t9 decompress_fixed_data_to_accumulator::execute(c); // block_4: // c->lw(v1, 0, s0); // lw v1, 0(s0) // // nop // sll r0, r0, 0 // c->andi(v1, v1, 256); // andi v1, v1, 256 // // nop // sll r0, r0, 0 // // nop // sll r0, r0, 0 // // nop // sll r0, r0, 0 // bc = c->sgpr64(v1) != 0; // bne v1, r0, L4 // // nop // sll r0, r0, 0 // if (bc) {goto block_4;} // branch non-likely bc = c->sgpr64(s1) == 0; // beq s1, r0, L5 // nop // sll r0, r0, 0 if (bc) {goto block_7;} // branch non-likely c->lw(t2, 24, t7); // lw t2, 24(t7) c->addiu(t3, r0, 7408); // addiu t3, r0, 7408 c->lw(t4, 28, t7); // lw t4, 28(t7) c->addiu(v1, r0, 256); // addiu v1, r0, 256 //c->sw(t2, 16, s0); // sw t2, 16(s0) madr = c->sgpr64(t2); // nop // sll r0, r0, 0 //c->sw(t3, 128, s0); // sw t3, 128(s0) sadr = c->sgpr64(t3); // nop // sll r0, r0, 0 //c->sw(t4, 32, s0); // sw t4, 32(s0) qwc = c->sgpr64(t4); // Unknown instr: sync.l //c->sw(v1, 0, s0); // sw v1, 0(s0) spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc); // Unknown instr: sync.l block_7: c->lw(t0, 20, t7); // lw t0, 20(t7) //c->lui(a1, 28672); // lui a1, 28672 get_fake_spad_addr(a1, cache.fake_scratchpad_data, 0, c); c->lw(a2, 16, t7); // lw a2, 16(t7) c->daddiu(a1, a1, 9616); // daddiu a1, a1, 9616 bc = c->sgpr64(t0) == 0; // beq t0, r0, L6 // nop // sll r0, r0, 0 if (bc) {goto block_10;} // branch non-likely c->lw(a3, 12, t7); // lw a3, 12(t7) // nop // sll r0, r0, 0 c->load_symbol(t9, cache.decompress_frame_data_pair_to_accumulator);// lw t9, decompress-frame-data-pair-to-accumulator(s7) // nop // sll r0, r0, 0 call_addr = c->gprs[t9].du32[0]; // function call: c->sll(a3, a3, 3); // sll a3, a3, 3 //c->jalr(call_addr); // jalr ra, t9 decompress_frame_data_pair_to_accumulator::execute(c); bc = c->sgpr64(s1) != 0; // bne s1, r0, L3 c->daddiu(t7, t7, 24); // daddiu t7, t7, 24 if (bc) {goto block_2;} // branch non-likely c->load_symbol(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7) // nop // sll r0, r0, 0 c->lw(s2, 0, sp); // lw s2, 0(sp) // nop // sll r0, r0, 0 call_addr = c->gprs[t9].du32[0]; // function call: // nop // sll r0, r0, 0 //c->jalr(call_addr); // jalr ra, t9 normalize_frame_quaternions::execute(c); c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 // nop // sll r0, r0, 0 c->lq(s0, 0, sp); // lq s0, 0(sp) c->lq(s1, 16, sp); // lq s1, 16(sp) c->lq(s2, 32, sp); // lq s2, 32(sp) c->lq(s3, 48, sp); // lq s3, 48(sp) c->lq(s4, 64, sp); // lq s4, 64(sp) c->lq(s5, 80, sp); // lq s5, 80(sp) c->lq(s6, 96, sp); // lq s6, 96(sp) c->lq(t8, 112, sp); // lq t8, 112(sp) c->lq(t9, 128, sp); // lq t9, 128(sp) c->lq(gp, 144, sp); // lq gp, 144(sp) c->lq(ra, 176, sp); // lq ra, 176(sp) c->lq(fp, 160, sp); // lq fp, 160(sp) //jr ra // jr ra c->daddiu(sp, sp, 192); // daddiu sp, sp, 192 goto end_of_function; // return block_10: c->load_symbol(t9, cache.decompress_frame_data_to_accumulator);// lw t9, decompress-frame-data-to-accumulator(s7) // nop // sll r0, r0, 0 call_addr = c->gprs[t9].du32[0]; // function call: // nop // sll r0, r0, 0 //c->jalr(call_addr); // jalr ra, t9 decompress_frame_data_to_accumulator::execute(c); bc = c->sgpr64(s1) != 0; // bne s1, r0, L3 c->daddiu(t7, t7, 24); // daddiu t7, t7, 24 if (bc) {goto block_2;} // branch non-likely c->load_symbol(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7) // nop // sll r0, r0, 0 c->lw(s2, 0, sp); // lw s2, 0(sp) // nop // sll r0, r0, 0 call_addr = c->gprs[t9].du32[0]; // function call: // nop // sll r0, r0, 0 //c->jalr(call_addr); // jalr ra, t9 normalize_frame_quaternions::execute(c); block_12: c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 // nop // sll r0, r0, 0 c->lq(s0, 0, sp); // lq s0, 0(sp) c->lq(s1, 16, sp); // lq s1, 16(sp) c->lq(s2, 32, sp); // lq s2, 32(sp) c->lq(s3, 48, sp); // lq s3, 48(sp) c->lq(s4, 64, sp); // lq s4, 64(sp) c->lq(s5, 80, sp); // lq s5, 80(sp) c->lq(s6, 96, sp); // lq s6, 96(sp) c->lq(t8, 112, sp); // lq t8, 112(sp) c->lq(t9, 128, sp); // lq t9, 128(sp) c->lq(gp, 144, sp); // lq gp, 144(sp) c->lq(ra, 176, sp); // lq ra, 176(sp) c->lq(fp, 160, sp); // lq fp, 160(sp) //jr ra // jr ra c->daddiu(sp, sp, 192); // daddiu sp, sp, 192 goto end_of_function; // return //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.clear_frame_accumulator = intern_from_c("clear-frame-accumulator").c(); cache.decompress_fixed_data_to_accumulator = intern_from_c("decompress-fixed-data-to-accumulator").c(); cache.decompress_frame_data_pair_to_accumulator = intern_from_c("decompress-frame-data-pair-to-accumulator").c(); cache.decompress_frame_data_to_accumulator = intern_from_c("decompress-frame-data-to-accumulator").c(); cache.normalize_frame_quaternions = intern_from_c("normalize-frame-quaternions").c(); cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); gLinkedFunctionTable.reg("calc-animation-from-spr", execute, 1024); } } // namespace calc_animation_from_spr } // namespace Mips2C //--------------------------MIPS2C--------------------- #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" namespace Mips2C { namespace cspace_parented_transformq_joint { u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; // nop // sll r0, r0, 0 c->lw(a3, 0, a0); // lw a3, 0(a0) c->lui(v1, 16256); // lui v1, 16256 c->lqc2(vf5, 16, a1); // lqc2 vf5, 16(a1) c->mtc1(f0, v1); // mtc1 f0, v1 c->lw(t0, 16, a3); // lw t0, 16(a3) // nop // sll r0, r0, 0 c->lw(a2, 16, a0); // lw a2, 16(a0) c->vadd(DEST::xyzw, vf6, vf5, vf5); // vadd.xyzw vf6, vf5, vf5 c->lwc1(f1, 64, t0); // lwc1 f1, 64(t0) c->vadd_bc(DEST::x, BC::w, vf2, vf0, vf5); // vaddw.x vf2, vf0, vf5 c->lqc2(vf15, 0, a1); // lqc2 vf15, 0(a1) c->vadd_bc(DEST::y, BC::z, vf2, vf0, vf5); // vaddz.y vf2, vf0, vf5 c->lqc2(vf1, 32, a1); // lqc2 vf1, 32(a1) c->divs_accurate(f4, f0, f1); // div.s f4, f0, f1 c->lqc2(vf7, 0, t0); // lqc2 vf7, 0(t0) c->vsub_bc(DEST::z, BC::y, vf2, vf0, vf5); // vsuby.z vf2, vf0, vf5 c->lqc2(vf8, 16, t0); // lqc2 vf8, 16(t0) c->vsub_bc(DEST::w, BC::w, vf2, vf0, vf0); // vsubw.w vf2, vf0, vf0 c->lqc2(vf9, 32, t0); // lqc2 vf9, 32(t0) c->vsub_bc(DEST::x, BC::z, vf3, vf0, vf5); // vsubz.x vf3, vf0, vf5 c->lqc2(vf10, 48, t0); // lqc2 vf10, 48(t0) c->vadd_bc(DEST::y, BC::w, vf3, vf0, vf5); // vaddw.y vf3, vf0, vf5 c->lwc1(f2, 68, t0); // lwc1 f2, 68(t0) c->vadd_bc(DEST::z, BC::x, vf3, vf0, vf5); // vaddx.z vf3, vf0, vf5 c->sqc2(vf1, 64, a2); // sqc2 vf1, 64(a2) c->vsub_bc(DEST::w, BC::w, vf3, vf0, vf0); // vsubw.w vf3, vf0, vf0 c->lwc1(f3, 72, t0); // lwc1 f3, 72(t0) c->vadd_bc(DEST::x, BC::y, vf4, vf0, vf5); // vaddy.x vf4, vf0, vf5 c->lw(v1, 76, t0); // lw v1, 76(t0) c->vsub_bc(DEST::y, BC::x, vf4, vf0, vf5); // vsubx.y vf4, vf0, vf5 c->mfc1(t1, f4); // mfc1 t1, f4 c->vadd_bc(DEST::z, BC::w, vf4, vf0, vf5); // vaddw.z vf4, vf0, vf5 c->divs_accurate(f4, f0, f2); // div.s f4, f0, f2 c->vsub_bc(DEST::w, BC::w, vf4, vf0, vf0); // vsubw.w vf4, vf0, vf0 c->vopmula(vf6, vf2); // vopmula.xyz acc, vf6, vf2 c->vopmsub(vf2, vf2, vf6); // vopmsub.xyz vf2, vf2, vf6 c->vopmula(vf6, vf3); // vopmula.xyz acc, vf6, vf3 c->vopmsub(vf3, vf3, vf6); // vopmsub.xyz vf3, vf3, vf6 c->vopmula(vf6, vf4); // vopmula.xyz acc, vf6, vf4 c->vopmsub(vf4, vf4, vf6); // vopmsub.xyz vf4, vf4, vf6 c->vadd_bc(DEST::x, BC::w, vf2, vf2, vf0); // vaddw.x vf2, vf2, vf0 c->vadd_bc(DEST::y, BC::w, vf3, vf3, vf0); // vaddw.y vf3, vf3, vf0 c->vadd_bc(DEST::z, BC::w, vf4, vf4, vf0); // vaddw.z vf4, vf4, vf0 c->mfc1(t2, f4); // mfc1 t2, f4 bc = c->sgpr64(v1) != 0; // bne v1, r0, L50 c->divs_accurate(f4, f0, f3); // div.s f4, f0, f3 if (bc) {goto block_2;} // branch non-likely c->vmul_bc(DEST::xyzw, BC::x, vf2, vf2, vf1); // vmulx.xyzw vf2, vf2, vf1 c->vmul_bc(DEST::xyzw, BC::y, vf3, vf3, vf1); // vmuly.xyzw vf3, vf3, vf1 c->vmul_bc(DEST::xyzw, BC::z, vf4, vf4, vf1); // vmulz.xyzw vf4, vf4, vf1 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf2); // vmulax.xyzw acc, vf7, vf2 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf2); // vmadday.xyzw acc, vf8, vf2 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf2); // vmaddaz.xyzw acc, vf9, vf2 c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf10, vf2); // vmaddw.xyzw vf11, vf10, vf2 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf3); // vmulax.xyzw acc, vf7, vf3 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf3); // vmadday.xyzw acc, vf8, vf3 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf3); // vmaddaz.xyzw acc, vf9, vf3 c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf10, vf3); // vmaddw.xyzw vf12, vf10, vf3 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf4); // vmulax.xyzw acc, vf7, vf4 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf4); // vmadday.xyzw acc, vf8, vf4 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf4); // vmaddaz.xyzw acc, vf9, vf4 c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf10, vf4); // vmaddw.xyzw vf13, vf10, vf4 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf15); // vmulax.xyzw acc, vf7, vf15 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf15); // vmadday.xyzw acc, vf8, vf15 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf15); // vmaddaz.xyzw acc, vf9, vf15 c->vmadd_bc(DEST::xyzw, BC::w, vf14, vf10, vf0); // vmaddw.xyzw vf14, vf10, vf0 c->sqc2(vf11, 0, a2); // sqc2 vf11, 0(a2) c->sqc2(vf12, 16, a2); // sqc2 vf12, 16(a2) c->sqc2(vf13, 32, a2); // sqc2 vf13, 32(a2) c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2) //jr ra // jr ra // nop // sll r0, r0, 0 goto end_of_function; // return block_2: c->pextlw(t1, t2, t1); // pextlw t1, t2, t1 c->vmul_bc(DEST::xyzw, BC::x, vf2, vf2, vf1); // vmulx.xyzw vf2, vf2, vf1 c->vmul_bc(DEST::xyzw, BC::y, vf3, vf3, vf1); // vmuly.xyzw vf3, vf3, vf1 c->vmul_bc(DEST::xyzw, BC::z, vf4, vf4, vf1); // vmulz.xyzw vf4, vf4, vf1 c->mfc1(t3, f4); // mfc1 t3, f4 c->pcpyld(t1, t3, t1); // pcpyld t1, t3, t1 c->mov128_vf_gpr(vf16, t1); // qmtc2.i vf16, t1 c->vmul(DEST::xyzw, vf2, vf2, vf16); // vmul.xyzw vf2, vf2, vf16 c->vmul(DEST::xyzw, vf3, vf3, vf16); // vmul.xyzw vf3, vf3, vf16 c->vmul(DEST::xyzw, vf4, vf4, vf16); // vmul.xyzw vf4, vf4, vf16 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf2); // vmulax.xyzw acc, vf7, vf2 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf2); // vmadday.xyzw acc, vf8, vf2 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf2); // vmaddaz.xyzw acc, vf9, vf2 c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf10, vf2); // vmaddw.xyzw vf11, vf10, vf2 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf3); // vmulax.xyzw acc, vf7, vf3 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf3); // vmadday.xyzw acc, vf8, vf3 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf3); // vmaddaz.xyzw acc, vf9, vf3 c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf10, vf3); // vmaddw.xyzw vf12, vf10, vf3 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf4); // vmulax.xyzw acc, vf7, vf4 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf4); // vmadday.xyzw acc, vf8, vf4 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf4); // vmaddaz.xyzw acc, vf9, vf4 c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf10, vf4); // vmaddw.xyzw vf13, vf10, vf4 c->vmula_bc(DEST::xyzw, BC::x, vf7, vf15); // vmulax.xyzw acc, vf7, vf15 c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf15); // vmadday.xyzw acc, vf8, vf15 c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf15); // vmaddaz.xyzw acc, vf9, vf15 c->vmadd_bc(DEST::xyzw, BC::w, vf14, vf10, vf0); // vmaddw.xyzw vf14, vf10, vf0 c->sqc2(vf11, 0, a2); // sqc2 vf11, 0(a2) c->sqc2(vf12, 16, a2); // sqc2 vf12, 16(a2) c->sqc2(vf13, 32, a2); // sqc2 vf13, 32(a2) c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2) //jr ra // jr ra // nop // sll r0, r0, 0 goto end_of_function; // return //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("cspace<-parented-transformq-joint!", execute, 128); } } // namespace cspace<_parented_transformq_joint } // namespace Mips2C // add cspace<_parented_transformq_joint::link to the link callback table for the object file. // FWD DEC: namespace normalize_frame_quaternions { extern void link(); } namespace decompress_fixed_data_to_accumulator { extern void link(); } namespace decompress_frame_data_to_accumulator { extern void link(); } namespace decompress_frame_data_pair_to_accumulator { extern void link(); }