Files
water111 ad5cec1bb4 [jak2] Floating point blerc (#2715)
This moves the blerc math from mips2c to the Merc2 renderer, and uses
floats instead.

We could potentially do this on the GPU, which would be even faster, but
this isn't that slow in the first place.
2023-06-11 12:35:08 -04:00

677 lines
39 KiB
C++

//--------------------------MIPS2C---------------------
// clang-format off
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/jak2/kscheme.h"
using namespace jak2;
namespace Mips2C::jak2 {
void exec_mpg(ExecutionContext* c) {
// nop | mulax.xyzw ACC, vf05, vf01 0
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf01).vf.x());
// nop | madday.xyzw ACC, vf06, vf01 1
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf01].vf.y());
// nop | maddaz.xyzw ACC, vf07, vf01 2
c->acc.vf.madda(Mask::xyzw, c->vfs[vf07].vf, c->vfs[vf01].vf.z());
// nop | maddw.xyzw vf13, vf08, vf01 3
c->acc.vf.madd(Mask::xyzw, c->vfs[vf13].vf, c->vf_src(vf08).vf, c->vf_src(vf01).vf.w());
// nop | mulax.xyzw ACC, vf05, vf02 4
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf02).vf.x());
// nop | madday.xyzw ACC, vf06, vf02 5
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf02].vf.y());
// nop | maddaz.xyzw ACC, vf07, vf02 6
c->acc.vf.madda(Mask::xyzw, c->vfs[vf07].vf, c->vfs[vf02].vf.z());
// nop | maddw.xyzw vf14, vf08, vf02 7
c->acc.vf.madd(Mask::xyzw, c->vfs[vf14].vf, c->vf_src(vf08).vf, c->vf_src(vf02).vf.w());
// nop | mulax.xyzw ACC, vf05, vf03 8
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf03).vf.x());
// nop | madday.xyzw ACC, vf06, vf03 9
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf03].vf.y());
// nop | maddaz.xyzw ACC, vf07, vf03 10
c->acc.vf.madda(Mask::xyzw, c->vfs[vf07].vf, c->vfs[vf03].vf.z());
// nop | maddw.xyzw vf15, vf08, vf03 11
c->acc.vf.madd(Mask::xyzw, c->vfs[vf15].vf, c->vf_src(vf08).vf, c->vf_src(vf03).vf.w());
// nop | mulax.xyzw ACC, vf05, vf04 12
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf04).vf.x());
// nop | madday.xyzw ACC, vf06, vf04 13
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf04].vf.y());
// nop | maddaz.xyzw ACC, vf07, vf04 14
c->acc.vf.madda(Mask::xyzw, c->vfs[vf07].vf, c->vfs[vf04].vf.z());
// nop | maddw.xyzw vf16, vf08, vf04 15
c->acc.vf.madd(Mask::xyzw, c->vfs[vf16].vf, c->vf_src(vf08).vf, c->vf_src(vf04).vf.w());
// nop | opmula.xyz ACC, vf14, vf15 16
c->vopmula(vf14, vf15); // vu.acc.opmula(vu.vf14, vu.vf15);
// nop | opmsub.xyz vf09, vf15, vf14 17
c->vopmsub(vf09, vf15, vf14); // vu.acc.opmsub(vu.vf09, vu.vf15, vu.vf14);
// nop | opmula.xyz ACC, vf15, vf13 18
c->vopmula(vf15, vf13); // vu.acc.opmula(vu.vf15, vu.vf13);
// nop | opmsub.xyz vf10, vf13, vf15 19
c->vopmsub(vf10, vf13, vf15); // vu.acc.opmsub(vu.vf10, vu.vf13, vu.vf15);
// nop | opmula.xyz ACC, vf13, vf14 20
c->vopmula(vf13, vf14); // vu.acc.opmula(vu.vf13, vu.vf14);
// nop | mul.xyz vf12, vf13, vf09 21
c->vfs[vf12].vf.mul(Mask::xyz, c->vf_src(vf13).vf, c->vf_src(vf09).vf);
// nop | opmsub.xyz vf11, vf14, vf13 22
c->vopmsub(vf11, vf14, vf13); // vu.acc.opmsub(vu.vf11, vu.vf14, vu.vf13);
// nop | mulax.xyzw ACC, vf28, vf13 23
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf28).vf, c->vf_src(vf13).vf.x());
// nop | madday.xyzw ACC, vf29, vf13 24
c->acc.vf.madda(Mask::xyzw, c->vfs[vf29].vf, c->vfs[vf13].vf.y());
// nop | maddaz.xyzw ACC, vf30, vf13 25
c->acc.vf.madda(Mask::xyzw, c->vfs[vf30].vf, c->vfs[vf13].vf.z());
// nop | maddw.xyzw vf13, vf31, vf13 26
c->acc.vf.madd(Mask::xyzw, c->vfs[vf13].vf, c->vf_src(vf31).vf, c->vf_src(vf13).vf.w());
// nop | mulax.w ACC, vf00, vf12 27
c->acc.vf.mula(Mask::w, c->vf_src(vf00).vf, c->vf_src(vf12).vf.x());
// nop | madday.w ACC, vf00, vf12 28
c->acc.vf.madda(Mask::w, c->vf_src(vf00).vf, c->vfs[vf12].vf.y());
// nop | maddz.w vf12, vf00, vf12 29
c->acc.vf.madd(Mask::w, c->vfs[vf12].vf, c->vf_src(vf00).vf, c->vf_src(vf12).vf.z());
// nop | mulax.xyzw ACC, vf28, vf14 30
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf28).vf, c->vf_src(vf14).vf.x());
// nop | madday.xyzw ACC, vf29, vf14 31
c->acc.vf.madda(Mask::xyzw, c->vfs[vf29].vf, c->vfs[vf14].vf.y());
// nop | maddaz.xyzw ACC, vf30, vf14 32
c->acc.vf.madda(Mask::xyzw, c->vfs[vf30].vf, c->vfs[vf14].vf.z());
// div Q, vf00.w, vf12.w | maddw.xyzw vf14, vf31, vf14 33
c->acc.vf.madd(Mask::xyzw, c->vfs[vf14].vf, c->vf_src(vf31).vf, c->vf_src(vf14).vf.w());
//vu.Q = vu.vf00.w() / vu.vf12.w();
c->vdiv(vf0, BC::w, vf12, BC::w);
// nop | mulax.xyzw ACC, vf28, vf15 34
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf28).vf, c->vf_src(vf15).vf.x());
// nop | madday.xyzw ACC, vf29, vf15 35
c->acc.vf.madda(Mask::xyzw, c->vfs[vf29].vf, c->vfs[vf15].vf.y());
// nop | maddaz.xyzw ACC, vf30, vf15 36
c->acc.vf.madda(Mask::xyzw, c->vfs[vf30].vf, c->vfs[vf15].vf.z());
// nop | maddw.xyzw vf15, vf31, vf15 37
c->acc.vf.madd(Mask::xyzw, c->vfs[vf15].vf, c->vf_src(vf31).vf, c->vf_src(vf15).vf.w());
// nop | mulax.xyzw ACC, vf28, vf16 38
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf28).vf, c->vf_src(vf16).vf.x());
// nop | madday.xyzw ACC, vf29, vf16 39
c->acc.vf.madda(Mask::xyzw, c->vfs[vf29].vf, c->vfs[vf16].vf.y());
// nop | maddaz.xyzw ACC, vf30, vf16 40
c->acc.vf.madda(Mask::xyzw, c->vfs[vf30].vf, c->vfs[vf16].vf.z());
// nop | maddw.xyzw vf16, vf31, vf16 41
c->acc.vf.madd(Mask::xyzw, c->vfs[vf16].vf, c->vf_src(vf31).vf, c->vf_src(vf16).vf.w());
// nop | mul.xyzw vf09, vf09, Q 42
c->vfs[vf09].vf.mul(Mask::xyzw, c->vf_src(vf09).vf, c->Q);
// nop | mul.xyzw vf10, vf10, Q 43
c->vfs[vf10].vf.mul(Mask::xyzw, c->vf_src(vf10).vf, c->Q);
// nop | mul.xyzw vf11, vf11, Q 44
c->vfs[vf11].vf.mul(Mask::xyzw, c->vf_src(vf11).vf, c->Q);
// nop | mulax.xyzw ACC, vf25, vf09 45
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf25).vf, c->vf_src(vf09).vf.x());
// nop | madday.xyzw ACC, vf26, vf09 46
c->acc.vf.madda(Mask::xyzw, c->vfs[vf26].vf, c->vfs[vf09].vf.y());
// nop | maddz.xyzw vf09, vf27, vf09 47
c->acc.vf.madd(Mask::xyzw, c->vfs[vf09].vf, c->vf_src(vf27).vf, c->vf_src(vf09).vf.z());
// nop | mulax.xyzw ACC, vf25, vf10 48
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf25).vf, c->vf_src(vf10).vf.x());
// nop | madday.xyzw ACC, vf26, vf10 49
c->acc.vf.madda(Mask::xyzw, c->vfs[vf26].vf, c->vfs[vf10].vf.y());
// nop | maddz.xyzw vf10, vf27, vf10 50
c->acc.vf.madd(Mask::xyzw, c->vfs[vf10].vf, c->vf_src(vf27).vf, c->vf_src(vf10).vf.z());
// nop | mulax.xyzw ACC, vf25, vf11 51
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf25).vf, c->vf_src(vf11).vf.x());
// nop | madday.xyzw ACC, vf26, vf11 :e 52
c->acc.vf.madda(Mask::xyzw, c->vfs[vf26].vf, c->vfs[vf11].vf.y());
// nop | maddz.xyzw vf11, vf27, vf11 53
c->acc.vf.madd(Mask::xyzw, c->vfs[vf11].vf, c->vf_src(vf27).vf, c->vf_src(vf11).vf.z());
}
}
//--------------------------MIPS2C---------------------
// clang-format off
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/jak2/kscheme.h"
using ::jak2::intern_from_c;
namespace Mips2C::jak2 {
namespace bones_mtx_calc {
struct Cache {
void* fake_scratchpad_data; // *fake-scratchpad-data*
} cache;
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 madr, sadr, qwc;
// hack, added this that should be loaded by the caller.
// lqc2 vf28, 0(v1) ;; [ 60] (set! vf28 (l.vf v1-13)) [v1: matrix ] -> []
c->lqc2(vf28, 0, t0);
// lqc2 vf29, 16(v1) ;; [ 61] (set! vf29 (l.vf (+ v1-13 16))) [v1: matrix ] -> []
c->lqc2(vf29, 16, t0);
// lqc2 vf30, 32(v1) ;; [ 62] (set! vf30 (l.vf (+ v1-13 32))) [v1: matrix ] -> []
c->lqc2(vf30, 32, t0);
// lqc2 vf31, 48(v1) ;; [ 63] (set! vf31 (l.vf (+ v1-13 48))) [v1: matrix ] -> []
c->lqc2(vf31, 48, t0);
// lqc2 vf25, 0(v1) ;; [ 64] (set! vf25 (l.vf v1-13)) [v1: matrix ] -> []
c->lqc2(vf25, 0, t0);
// lqc2 vf26, 16(v1) ;; [ 65] (set! vf26 (l.vf (+ v1-13 16))) [v1: matrix ] -> []
c->lqc2(vf26, 16, t0);
// lqc2 vf27, 32(v1) ;; [ 66] (set! vf27 (l.vf (+ v1-13 32))) [v1: matrix ] -> []
c->lqc2(vf27, 32, t0);
c->daddiu(sp, sp, -96); // daddiu sp, sp, -96
c->sd(ra, 0, sp); // sd ra, 0(sp)
c->sq(s2, 16, sp); // sq s2, 16(sp)
c->sq(s3, 32, sp); // sq s3, 32(sp)
c->sq(s4, 48, sp); // sq s4, 48(sp)
c->sq(s5, 64, sp); // sq s5, 64(sp)
c->sq(gp, 80, sp); // sq gp, 80(sp)
c->lui(v1, 4096); // lui v1, 4096
c->lui(t0, 4096); // lui t0, 4096
c->ori(v1, v1, 54272); // ori v1, v1, 54272
c->ori(t0, t0, 53248); // ori t0, t0, 53248
c->lui(t2, 32767); // lui t2, 32767
c->daddiu(t1, a3, -16); // daddiu t1, a3, -16
c->ori(t2, t2, 65535); // ori t2, t2, 65535
get_fake_spad_addr2(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
c->addiu(t4, r0, 64); // addiu t4, r0, 64
c->addiu(t5, r0, 1280); // addiu t5, r0, 1280
bc = ((s64)c->sgpr64(t1)) >= 0; // bgez t1, L17
c->addiu(t3, r0, 16); // addiu t3, r0, 16
if (bc) {goto block_2;} // branch non-likely
c->mov64(t3, a3); // or t3, a3, r0
// nop // sll r0, r0, 0
c->dsll(t4, t3, 2); // dsll t4, t3, 2
c->dsll(a3, t3, 4); // dsll a3, t3, 4
c->dsll(t1, t3, 6); // dsll t1, t3, 6
// nop // sll r0, r0, 0
c->daddu(t5, t1, a3); // daddu t5, t1, a3
c->addiu(t1, r0, 0); // addiu t1, r0, 0
block_2:
c->addiu(a3, r0, 0); // addiu a3, r0, 0
c->addiu(t6, r0, 1); // addiu t6, r0, 1
c->and_(a1, a1, t2); // and a1, a1, t2
// nop // sll r0, r0, 0
c->daddiu(a1, a1, 12); // daddiu a1, a1, 12
c->mov64(a0, a0); // or a0, a0, r0
c->daddiu(a1, a1, -80); // daddiu a1, a1, -80
// nop // sll r0, r0, 0
/*
block_3:
c->lw(t6, 0, v1); // lw t6, 0(v1)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t6, t6, 256); // andi t6, t6, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t6) == 0; // beq t6, r0, L19
// nop // sll r0, r0, 0
if (bc) {goto block_5;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L18 // beq r0, r0, L18
// nop // sll r0, r0, 0
goto block_3; // branch always
*/
// block_5:
c->addiu(t6, r0, 80); // addiu t6, r0, 80
c->addiu(t7, r0, 264); // addiu t7, r0, 264
// c->sw(t6, 128, v1); // sw t6, 128(v1)
// c->sw(a1, 16, v1); // sw a1, 16(v1)
// c->sw(t4, 32, v1); // sw t4, 32(v1)
// c->sw(t7, 0, v1); // sw t7, 0(v1)
spad_to_dma_no_sadr_off_bones_interleave(cache.fake_scratchpad_data, c->sgpr64(a1), c->sgpr64(t6), c->sgpr64(t4));
c->daddu(a1, a1, t5); // daddu a1, a1, t5
/*
block_6:
c->lw(t4, 0, v1); // lw t4, 0(v1)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t4, t4, 256); // andi t4, t4, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t4) == 0; // beq t4, r0, L21
// nop // sll r0, r0, 0
if (bc) {goto block_8;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L20 // beq r0, r0, L20
// nop // sll r0, r0, 0
goto block_6; // branch always
*/
// block_8:
c->and_(a2, a2, t2); // and a2, a2, t2
// nop // sll r0, r0, 0
c->dsll(t2, t3, 2); // dsll t2, t3, 2
c->addiu(t4, r0, 256); // addiu t4, r0, 256
c->daddu(t2, t2, t3); // daddu t2, t2, t3
c->addiu(t6, r0, 1104); // addiu t6, r0, 1104
c->dsll(t5, t2, 4); // dsll t5, t2, 4
// c->sw(t6, 128, v1); // sw t6, 128(v1)
sadr = c->sgpr64(t6);
c->addiu(t8, r0, 0); // addiu t8, r0, 0
// c->sw(a2, 16, v1); // sw a2, 16(v1)
madr = c->sgpr64(a2);
c->daddu(a2, a2, t5); // daddu a2, a2, t5
// c->sw(t2, 32, v1); // sw t2, 32(v1)
qwc = c->sgpr64(t2);
c->addiu(t2, r0, 1); // addiu t2, r0, 1
// c->sw(t4, 0, v1); // sw t4, 0(v1)
spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc);
block_9:
/*
c->lw(t5, 0, v1); // lw t5, 0(v1)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t5, t5, 256); // andi t5, t5, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t5) == 0; // beq t5, r0, L23
// nop // sll r0, r0, 0
if (bc) {goto block_11;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L22 // beq r0, r0, L22
// nop // sll r0, r0, 0
goto block_9; // branch always
*/
// block_11:
c->dsll(t5, t8, 2); // dsll t5, t8, 2
c->daddu(t9, t5, at); // daddu t9, t5, at
// nop // sll r0, r0, 0
c->lwu(t5, 0, t9); // lwu t5, 0(t9)
c->mov64(t6, t3); // or t6, t3, r0
c->lwu(t7, 8, t9); // lwu t7, 8(t9)
c->mov64(ra, t3); // or ra, t3, r0
c->lwu(t3, 16, t9); // lwu t3, 16(t9)
// nop // sll r0, r0, 0
c->sw(ra, 44, at); // sw ra, 44(at)
bc = c->sgpr64(ra) == 0; // beq ra, r0, L36
c->sw(t8, 48, at); // sw t8, 48(at)
if (bc) {goto block_33;} // branch non-likely
c->daddiu(t1, t1, -16); // daddiu t1, t1, -16
c->addiu(t9, r0, 1280); // addiu t9, r0, 1280
bc = ((s64)c->sgpr64(t1)) >= 0; // bgez t1, L24
c->addiu(t8, r0, 16); // addiu t8, r0, 16
if (bc) {goto block_14;} // branch non-likely
c->daddiu(t8, t1, 16); // daddiu t8, t1, 16
c->addiu(t1, r0, 0); // addiu t1, r0, 0
c->dsll(t9, t8, 4); // dsll t9, t8, 4
c->dsll(ra, t8, 6); // dsll ra, t8, 6
bc = c->sgpr64(t8) == 0; // beq t8, r0, L25
c->daddu(t9, ra, t9); // daddu t9, ra, t9
if (bc) {goto block_15;} // branch non-likely
block_14:
c->dsll(t4, t8, 2); // dsll t4, t8, 2
c->dsll(ra, t2, 2); // dsll ra, t2, 2
c->daddu(gp, ra, at); // daddu gp, ra, at
// c->sw(a1, 16, v1); // sw a1, 16(v1)
madr = c->sgpr64(a1);
c->addiu(ra, r0, 264); // addiu ra, r0, 264
c->lwu(gp, 0, gp); // lwu gp, 0(gp)
c->andi(gp, gp, 16383); // andi gp, gp, 16383
// c->sw(t4, 32, v1); // sw t4, 32(v1)
qwc = c->sgpr64(t4);
c->daddu(a1, a1, t9); // daddu a1, a1, t9
// c->sw(gp, 128, v1); // sw gp, 128(v1)
sadr = c->sgpr64(gp);
c->addiu(t4, r0, 0); // addiu t4, r0, 0
// c->sw(ra, 0, v1); // sw ra, 0(v1)
spad_to_dma_no_sadr_off_bones_interleave(cache.fake_scratchpad_data, madr, sadr, qwc);
block_15:
// nop // sll r0, r0, 0
c->sw(t8, 40, at); // sw t8, 40(at)
// nop // sll r0, r0, 0
c->lqc2(vf1, 0, t5); // lqc2 vf1, 0(t5)
// nop // sll r0, r0, 0
c->lqc2(vf2, 16, t5); // lqc2 vf2, 16(t5)
// nop // sll r0, r0, 0
c->lqc2(vf3, 32, t5); // lqc2 vf3, 32(t5)
// nop // sll r0, r0, 0
c->lqc2(vf4, 48, t5); // lqc2 vf4, 48(t5)
// nop // sll r0, r0, 0
c->lqc2(vf5, 0, t7); // lqc2 vf5, 0(t7)
// nop // sll r0, r0, 0
c->lqc2(vf6, 16, t7); // lqc2 vf6, 16(t7)
// nop // sll r0, r0, 0
c->lqc2(vf7, 32, t7); // lqc2 vf7, 32(t7)
// nop // sll r0, r0, 0
c->lqc2(vf8, 48, t7); // lqc2 vf8, 48(t7)
// Unknown instr: vcallms 0
exec_mpg(c);
// nop // sll r0, r0, 0
block_16:
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->daddiu(t5, t5, 64); // daddiu t5, t5, 64
// nop // sll r0, r0, 0
c->daddiu(t7, t7, 80); // daddiu t7, t7, 80
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->lq(t8, 0, t5); // lq t8, 0(t5)
// nop // sll r0, r0, 0
c->lq(t9, 16, t5); // lq t9, 16(t5)
// nop // sll r0, r0, 0
c->lq(ra, 32, t5); // lq ra, 32(t5)
// nop // sll r0, r0, 0
c->lq(gp, 48, t5); // lq gp, 48(t5)
// nop // sll r0, r0, 0
c->lq(s5, 0, t7); // lq s5, 0(t7)
// nop // sll r0, r0, 0
c->lq(s4, 16, t7); // lq s4, 16(t7)
// nop // sll r0, r0, 0
c->lq(s3, 32, t7); // lq s3, 32(t7)
// nop // sll r0, r0, 0
c->lq(s2, 48, t7); // lq s2, 48(t7)
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf1, t8); // qmtc2.ni vf1, t8
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf2, t9); // qmtc2.ni vf2, t9
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf3, ra); // qmtc2.ni vf3, ra
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf4, gp); // qmtc2.ni vf4, gp
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf5, s5); // qmtc2.ni vf5, s5
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf6, s4); // qmtc2.ni vf6, s4
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf7, s3); // qmtc2.ni vf7, s3
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf8, s2); // qmtc2.ni vf8, s2
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t8, vf13); // qmfc2.i t8, vf13
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t9, vf14); // qmfc2.ni t9, vf14
// nop // sll r0, r0, 0
c->mov128_gpr_vf(ra, vf15); // qmfc2.ni ra, vf15
// nop // sll r0, r0, 0
c->mov128_gpr_vf(gp, vf16); // qmfc2.ni gp, vf16
// nop // sll r0, r0, 0
c->mov128_gpr_vf(s5, vf9); // qmfc2.ni s5, vf9
// nop // sll r0, r0, 0
c->mov128_gpr_vf(s4, vf10); // qmfc2.ni s4, vf10
// nop // sll r0, r0, 0
c->mov128_gpr_vf(s3, vf11); // qmfc2.ni s3, vf11
// Unknown instr: vcallms 0
exec_mpg(c);
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->sq(t8, 0, t3); // sq t8, 0(t3)
// nop // sll r0, r0, 0
c->sq(t9, 16, t3); // sq t9, 16(t3)
// nop // sll r0, r0, 0
c->sq(ra, 32, t3); // sq ra, 32(t3)
// nop // sll r0, r0, 0
c->sq(gp, 48, t3); // sq gp, 48(t3)
// nop // sll r0, r0, 0
c->sq(s5, 64, t3); // sq s5, 64(t3)
// nop // sll r0, r0, 0
c->sq(s4, 80, t3); // sq s4, 80(t3)
// nop // sll r0, r0, 0
c->sq(s3, 96, t3); // sq s3, 96(t3)
// nop // sll r0, r0, 0
c->sq(r0, 112, t3); // sq r0, 112(t3)
c->daddiu(t3, t3, 128); // daddiu t3, t3, 128
c->daddiu(t6, t6, -1); // daddiu t6, t6, -1
bc = ((s64)c->sgpr64(t6)) > 0; // bgtz t6, L26
// nop // sll r0, r0, 0
if (bc) {goto block_16;} // branch non-likely
// nop // sll r0, r0, 0
c->lw(t3, 40, at); // lw t3, 40(at)
bc = c->sgpr64(t3) == 0; // beq t3, r0, L29
// nop // sll r0, r0, 0
if (bc) {goto block_21;} // branch non-likely
/*
block_18:
c->lw(t4, 0, v1); // lw t4, 0(v1)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t4, t4, 256); // andi t4, t4, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t4) == 0; // beq t4, r0, L28
// nop // sll r0, r0, 0
if (bc) {goto block_20;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L27 // beq r0, r0, L27
// nop // sll r0, r0, 0
goto block_18; // branch always
*/
// block_20:
c->dsll(t5, t2, 2); // dsll t5, t2, 2
// nop // sll r0, r0, 0
c->addiu(t4, r0, 1); // addiu t4, r0, 1
c->daddu(t5, t5, at); // daddu t5, t5, at
// nop // sll r0, r0, 0
c->lwu(t6, 8, t5); // lwu t6, 8(t5)
c->dsll(t5, t3, 2); // dsll t5, t3, 2
c->andi(t6, t6, 16383); // andi t6, t6, 16383
c->daddu(t5, t5, t3); // daddu t5, t5, t3
// c->sw(t6, 128, v1); // sw t6, 128(v1)
sadr = c->sgpr64(t6);
c->dsll(t6, t5, 4); // dsll t6, t5, 4
// c->sw(a2, 16, v1); // sw a2, 16(v1)
madr = c->sgpr64(a2);
c->addiu(t7, r0, 256); // addiu t7, r0, 256
// c->sw(t5, 32, v1); // sw t5, 32(v1)
qwc = c->sgpr64(t5);
c->daddu(a2, a2, t6); // daddu a2, a2, t6
// c->sw(t7, 0, v1); // sw t7, 0(v1)
spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc);
block_21:
// nop // sll r0, r0, 0
c->lw(t5, 48, at); // lw t5, 48(at)
// nop // sll r0, r0, 0
c->lw(t6, 44, at); // lw t6, 44(at)
/*
block_22:
c->lw(t7, 0, t0); // lw t7, 0(t0)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t7, t7, 256); // andi t7, t7, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t7) == 0; // beq t7, r0, L31
// nop // sll r0, r0, 0
if (bc) {goto block_24;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L30 // beq r0, r0, L30
// nop // sll r0, r0, 0
goto block_22; // branch always
*/
// block_24:
bc = c->sgpr64(t6) == 0; // beq t6, r0, L32
// nop // sll r0, r0, 0
if (bc) {goto block_26;} // branch non-likely
c->dsll(t7, t5, 2); // dsll t7, t5, 2
get_fake_spad_addr2(t8, cache.fake_scratchpad_data, 0, c);// lui t8, 28672
c->daddu(t7, t7, t8); // daddu t7, t7, t8
c->lwu(t7, 16, t7); // lwu t7, 16(t7)
c->andi(t7, t7, 16383); // andi t7, t7, 16383
// c->sw(t7, 128, t0); // sw t7, 128(t0)
sadr = c->sgpr64(t7);
// c->sw(a0, 16, t0); // sw a0, 16(t0)
madr = c->sgpr64(a0);
c->dsll(t7, t6, 3); // dsll t7, t6, 3
// c->sw(t7, 32, t0); // sw t7, 32(t0)
qwc = c->sgpr64(t7);
c->addiu(t7, r0, 256); // addiu t7, r0, 256
// c->sw(t7, 0, t0); // sw t7, 0(t0)
spad_from_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc);
c->dsll(t6, t6, 7); // dsll t6, t6, 7
c->daddu(a0, a0, t6); // daddu a0, a0, t6
block_26:
bc = c->sgpr64(t3) == 0; // beq t3, r0, L35
// nop // sll r0, r0, 0
if (bc) {goto block_31;} // branch non-likely
bc = c->sgpr64(t4) != 0; // bne t4, r0, L35
// nop // sll r0, r0, 0
if (bc) {goto block_31;} // branch non-likely
/*
block_28:
c->lw(t6, 0, v1); // lw t6, 0(v1)
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->andi(t6, t6, 256); // andi t6, t6, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t6) == 0; // beq t6, r0, L34
// nop // sll r0, r0, 0
if (bc) {goto block_30;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
//beq r0, r0, L33 // beq r0, r0, L33
// nop // sll r0, r0, 0
goto block_28; // branch always
*/
// block_30:
c->dsll(t6, t2, 2); // dsll t6, t2, 2
get_fake_spad_addr2(t7, cache.fake_scratchpad_data, 0, c);// lui t7, 28672
c->daddu(t6, t6, t7); // daddu t6, t6, t7
c->lwu(t6, 8, t6); // lwu t6, 8(t6)
c->andi(t6, t6, 16383); // andi t6, t6, 16383
// c->sw(t6, 128, v1); // sw t6, 128(v1)
sadr = c->sgpr64(t6);
// c->sw(a2, 16, v1); // sw a2, 16(v1)
madr = c->sgpr64(a2);
c->addiu(t6, r0, 5); // addiu t6, r0, 5
c->mult3(t6, t6, t3); // mult3 t6, t6, t3
// c->sw(t6, 32, v1); // sw t6, 32(v1)
qwc = c->sgpr64(t6);
c->addiu(t6, r0, 256); // addiu t6, r0, 256
// c->sw(t6, 0, v1); // sw t6, 0(v1)
spad_to_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc);
c->addiu(t6, r0, 80); // addiu t6, r0, 80
c->mult3(t6, t6, t3); // mult3 t6, t6, t3
c->daddu(a2, a2, t6); // daddu a2, a2, t6
block_31:
c->mov64(t8, t2); // or t8, t2, r0
bc = c->sgpr64(t1) != 0; // bne t1, r0, L22
c->mov64(t2, t5); // or t2, t5, r0
if (bc) {goto block_9;} // branch non-likely
bc = c->sgpr64(a3) == 0; // beq a3, r0, L22
c->addiu(a3, r0, 1); // addiu a3, r0, 1
if (bc) {goto block_9;} // branch non-likely
block_33:
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
c->ld(ra, 0, sp); // ld ra, 0(sp)
c->lq(gp, 80, sp); // lq gp, 80(sp)
c->lq(s5, 64, sp); // lq s5, 64(sp)
c->lq(s4, 48, sp); // lq s4, 48(sp)
c->lq(s3, 32, sp); // lq s3, 32(sp)
c->lq(s2, 16, sp); // lq s2, 16(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 96); // daddiu sp, sp, 96
goto end_of_function; // return
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c();
gLinkedFunctionTable.reg("bones-mtx-calc", execute, 128);
}
} // namespace bones_mtx_calc
} // namespace Mips2C