mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
1016 lines
64 KiB
C++
1016 lines
64 KiB
C++
//--------------------------MIPS2C---------------------
|
|
|
|
#include "game/kernel/jak1/kscheme.h"
|
|
#include "game/mips2c/mips2c_private.h"
|
|
using namespace jak1;
|
|
namespace Mips2C::jak1 {
|
|
|
|
// clang-format off
|
|
void vcallms48(ExecutionContext* c) {
|
|
// nop | mulx.xyzw vf13, vf09, vf31
|
|
c->vfs[vf13].vf.mul(Mask::xyzw, c->vf_src(vf09).vf, c->vf_src(vf31).vf.x());
|
|
// nop | subw.z vf21, vf21, vf00
|
|
c->vfs[vf21].vf.sub(Mask::z, c->vf_src(vf21).vf, c->vf_src(vf00).vf.w());
|
|
// nop | addy.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y());
|
|
// nop | mulx.xyz vf08, vf08, vf30
|
|
c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf30).vf.x());
|
|
// nop | addw.xy vf05, vf05, vf31
|
|
c->vfs[vf05].vf.add(Mask::xy, c->vf_src(vf05).vf, c->vf_src(vf31).vf.w());
|
|
// nop | mul.xyz vf30, vf21, vf13
|
|
c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf21).vf, c->vf_src(vf13).vf);
|
|
// nop | addz.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z());
|
|
// nop | add.xyz vf08, vf08, vf16
|
|
c->vfs[vf08].vf.add(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf16).vf);
|
|
// move.xyzw vf28, vf27 | ftoi12.xy vf17, vf05
|
|
c->vfs[vf17].vf.ftoi12(Mask::xy, c->vf_src(vf05).vf); c->vfs[vf28].vf.move(Mask::xyzw, c->vf_src(vf27).vf);
|
|
// move.xyzw vf02, vf22 | addy.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y()); c->vfs[vf02].vf.move(Mask::xyzw, c->vf_src(vf22).vf);
|
|
// rsqrt Q, vf31.z, vf29.x | mul.xyz vf06, vf06, Q
|
|
c->vfs[vf06].vf.mul(Mask::xyz, c->vf_src(vf06).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x());
|
|
// nop | mul.xyz vf29, vf08, vf08
|
|
c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf08).vf);
|
|
// nop | mulx.xyz vf01, vf21, vf28
|
|
c->vfs[vf01].vf.mul(Mask::xyz, c->vf_src(vf21).vf, c->vf_src(vf28).vf.x());
|
|
// nop | addz.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z());
|
|
// nop | mulx.xyzw vf14, vf10, vf31
|
|
c->vfs[vf14].vf.mul(Mask::xyzw, c->vf_src(vf10).vf, c->vf_src(vf31).vf.x());
|
|
// nop | subw.z vf02, vf02, vf00
|
|
c->vfs[vf02].vf.sub(Mask::z, c->vf_src(vf02).vf, c->vf_src(vf00).vf.w());
|
|
// nop | addy.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y());
|
|
// nop | mulx.xyz vf01, vf01, vf30
|
|
c->vfs[vf01].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf30).vf.x());
|
|
// nop | addw.xy vf06, vf06, vf31
|
|
c->vfs[vf06].vf.add(Mask::xy, c->vf_src(vf06).vf, c->vf_src(vf31).vf.w());
|
|
// nop | mul.xyz vf30, vf02, vf14
|
|
c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf14).vf);
|
|
// nop | addz.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z());
|
|
// nop | add.xyz vf01, vf01, vf13
|
|
c->vfs[vf01].vf.add(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf13).vf);
|
|
// nop | ftoi12.xy vf18, vf06
|
|
c->vfs[vf18].vf.ftoi12(Mask::xy, c->vf_src(vf06).vf);
|
|
// nop | addy.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y());
|
|
// rsqrt Q, vf31.z, vf29.x | mul.xyz vf07, vf07, Q
|
|
c->vfs[vf07].vf.mul(Mask::xyz, c->vf_src(vf07).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x());
|
|
// move.xyzw vf03, vf23 | mul.xyz vf29, vf01, vf01
|
|
c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf01).vf); c->vfs[vf03].vf.move(Mask::xyzw, c->vf_src(vf23).vf);
|
|
// nop | muly.xyz vf02, vf02, vf28
|
|
c->vfs[vf02].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf28).vf.y());
|
|
// nop | addz.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z());
|
|
// nop | mulx.xyzw vf15, vf11, vf31
|
|
c->vfs[vf15].vf.mul(Mask::xyzw, c->vf_src(vf11).vf, c->vf_src(vf31).vf.x());
|
|
// nop | subw.z vf03, vf03, vf00
|
|
c->vfs[vf03].vf.sub(Mask::z, c->vf_src(vf03).vf, c->vf_src(vf00).vf.w());
|
|
// nop | addy.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y());
|
|
// nop | mulx.xyz vf02, vf02, vf30
|
|
c->vfs[vf02].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf30).vf.x());
|
|
// nop | addw.xy vf07, vf07, vf31
|
|
c->vfs[vf07].vf.add(Mask::xy, c->vf_src(vf07).vf, c->vf_src(vf31).vf.w());
|
|
// nop | mul.xyz vf30, vf03, vf15
|
|
c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf15).vf);
|
|
// nop | addz.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z());
|
|
// nop | add.xyz vf02, vf02, vf14
|
|
c->vfs[vf02].vf.add(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf14).vf);
|
|
// nop | ftoi12.xy vf19, vf07
|
|
c->vfs[vf19].vf.ftoi12(Mask::xy, c->vf_src(vf07).vf);
|
|
// nop | addy.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y());
|
|
// rsqrt Q, vf31.z, vf29.x | mul.xyz vf08, vf08, Q
|
|
c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x());
|
|
// move.xyzw vf04, vf24 | mul.xyz vf29, vf02, vf02
|
|
c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf02).vf); c->vfs[vf04].vf.move(Mask::xyzw, c->vf_src(vf24).vf);
|
|
// nop | mulz.xyz vf03, vf03, vf28
|
|
c->vfs[vf03].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf28).vf.z());
|
|
// nop | addz.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z());
|
|
// nop | mulx.xyzw vf16, vf12, vf31
|
|
c->vfs[vf16].vf.mul(Mask::xyzw, c->vf_src(vf12).vf, c->vf_src(vf31).vf.x());
|
|
// nop | subw.z vf04, vf04, vf00
|
|
c->vfs[vf04].vf.sub(Mask::z, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w());
|
|
// nop | addy.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y());
|
|
// nop | mulx.xyz vf03, vf03, vf30
|
|
c->vfs[vf03].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf30).vf.x());
|
|
// nop | addw.xy vf08, vf08, vf31
|
|
c->vfs[vf08].vf.add(Mask::xy, c->vf_src(vf08).vf, c->vf_src(vf31).vf.w());
|
|
// nop | mul.xyz vf30, vf04, vf16
|
|
c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf04).vf, c->vf_src(vf16).vf);
|
|
// nop | addz.x vf29, vf29, vf29
|
|
c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z());
|
|
// nop | add.xyz vf03, vf03, vf15
|
|
c->vfs[vf03].vf.add(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf15).vf);
|
|
// nop | ftoi12.xy vf20, vf08
|
|
c->vfs[vf20].vf.ftoi12(Mask::xy, c->vf_src(vf08).vf);
|
|
// nop | addy.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y());
|
|
// rsqrt Q, vf31.z, vf29.x | mul.xyz vf05, vf01, Q
|
|
c->vfs[vf05].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x());
|
|
// move.xyzw vf06, vf02 | mul.xyz vf29, vf03, vf03
|
|
c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf03).vf); c->vfs[vf06].vf.move(Mask::xyzw, c->vf_src(vf02).vf);
|
|
// move.xyzw vf07, vf03 | mulw.xyz vf08, vf04, vf28 :e
|
|
c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf04).vf, c->vf_src(vf28).vf.w()); c->vfs[vf07].vf.move(Mask::xyzw, c->vf_src(vf03).vf);
|
|
// nop | addz.x vf30, vf30, vf30
|
|
c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z());
|
|
|
|
}
|
|
|
|
namespace generic_envmap_dproc {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
// nop // sll r0, r0, 0
|
|
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
|
c->lui(v1, 16256); // lui v1, 16256
|
|
c->mtc1(f0, v1); // mtc1 f0, v1
|
|
c->lwu(a1, 60, at); // lwu a1, 60(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(v1, 12048, at); // lw v1, 12048(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a2, 4, a1); // lw a2, 4(a1)
|
|
c->mov64(a0, a2); // or a0, a2, r0
|
|
c->lhu(a1, 20, a1); // lhu a1, 20(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2)
|
|
c->daddiu(a1, a1, -4); // daddiu a1, a1, -4
|
|
c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t2, 16, a2); // lq t2, 16(a2)
|
|
c->subs(f4, f4, f0); // sub.s f4, f4, f0
|
|
c->lq(t3, 48, a2); // lq t3, 48(a2)
|
|
c->divs(f4, f0, f4); // div.s f4, f0, f4
|
|
c->lq(t4, 80, a2); // lq t4, 80(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t5, 112, a2); // lq t5, 112(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf31, 12016, at); // lqc2 vf31, 12016(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t6, 0, a2); // lq t6, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a3, 32, a2); // lq a3, 32(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t0, 64, a2); // lq t0, 64(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t1, 96, a2); // lq t1, 96(a2)
|
|
c->muls(f4, f4, f0); // mul.s f4, f4, f0
|
|
c->mov128_vf_gpr(vf21, t2); // qmtc2.i vf21, t2
|
|
c->subs(f3, f3, f0); // sub.s f3, f3, f0
|
|
c->mov128_vf_gpr(vf22, t3); // qmtc2.ni vf22, t3
|
|
c->divs(f3, f0, f3); // div.s f3, f0, f3
|
|
c->mov128_vf_gpr(vf23, t4); // qmtc2.ni vf23, t4
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf24, t5); // qmtc2.ni vf24, t5
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf9, t6); // qmtc2.ni vf9, t6
|
|
c->subs(f2, f2, f0); // sub.s f2, f2, f0
|
|
c->mfc1(t2, f4); // mfc1 t2, f4
|
|
c->subs(f1, f1, f0); // sub.s f1, f1, f0
|
|
c->mov128_vf_gpr(vf10, a3); // qmtc2.ni vf10, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf11, t0); // qmtc2.ni vf11, t0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf12, t1); // qmtc2.ni vf12, t1
|
|
c->muls(f3, f3, f0); // mul.s f3, f3, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f2, f0, f2); // div.s f2, f0, f2
|
|
// 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->mfc1(a3, f3); // mfc1 a3, f3
|
|
// 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->muls(f2, f2, f0); // mul.s f2, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f1, f0, f1); // div.s f1, f0, f1
|
|
// nop // sll r0, r0, 0
|
|
c->pextlw(a3, a3, t2); // pextlw a3, a3, t2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t0, f2); // mfc1 t0, f2
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->daddiu(a2, a2, 128); // daddiu a2, a2, 128
|
|
// 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->mfc1(t1, f1); // mfc1 t1, f1
|
|
c->pextlw(t0, t1, t0); // pextlw t0, t1, t0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(a3, t0, a3); // pcpyld a3, t0, a3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: vcallms 48
|
|
vcallms48(c);
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
|
c->subs(f4, f4, f0); // sub.s f4, f4, f0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f3, f3, f0); // sub.s f3, f3, f0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f2, f2, f0); // sub.s f2, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f1, f1, f0); // sub.s f1, f1, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f4, f0, f4); // div.s f4, f0, f4
|
|
c->lq(t0, 48, a2); // lq t0, 48(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t1, 80, a2); // lq t1, 80(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t2, 112, a2); // lq t2, 112(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t3, 0, a2); // lq t3, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t4, 32, a2); // lq t4, 32(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t5, 64, a2); // lq t5, 64(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t6, 96, a2); // lq t6, 96(a2)
|
|
c->muls(f4, f4, f0); // mul.s f4, f4, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f3, f0, f3); // div.s f3, f0, f3
|
|
// 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->mfc1(t7, f4); // mfc1 t7, f4
|
|
// nop // sll r0, r0, 0
|
|
c->daddiu(a2, a2, 128); // daddiu a2, a2, 128
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f3, f3, f0); // mul.s f3, f3, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f2, f0, f2); // div.s f2, f0, f2
|
|
// 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->mfc1(t8, f3); // mfc1 t8, f3
|
|
// 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->muls(f2, f2, f0); // mul.s f2, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f1, f0, f1); // div.s f1, f0, f1
|
|
// nop // sll r0, r0, 0
|
|
c->pextlw(t7, t8, t7); // pextlw t7, t8, t7
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t8, f2); // mfc1 t8, f2
|
|
// 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->mfc1(t9, f1); // mfc1 t9, f1
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf9, t3); // qmtc2.ni vf9, t3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf10, t4); // qmtc2.ni vf10, t4
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf11, t5); // qmtc2.ni vf11, t5
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf12, t6); // qmtc2.ni vf12, t6
|
|
c->pextlw(a3, t9, t8); // pextlw a3, t9, t8
|
|
// nop // sll r0, r0, 0
|
|
c->pcpyld(a3, a3, t7); // pcpyld a3, a3, t7
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf22, t0); // qmtc2.ni vf22, t0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf23, t1); // qmtc2.ni vf23, t1
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf24, t2); // qmtc2.ni vf24, t2
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3
|
|
// nop // sll r0, r0, 0
|
|
// Unknown instr: vcallms 48
|
|
vcallms48(c);
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f1, 24, a2); // lwc1 f1, 24(a2)
|
|
c->subs(f1, f1, f0); // sub.s f1, f1, f0
|
|
c->lwc1(f2, 56, a2); // lwc1 f2, 56(a2)
|
|
c->divs(f3, f0, f1); // div.s f3, f0, f1
|
|
c->lwc1(f5, 88, a2); // lwc1 f5, 88(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f4, f2, f0); // sub.s f4, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f2, f5, f0); // sub.s f2, f5, f0
|
|
// nop // sll r0, r0, 0
|
|
c->subs(f1, f1, f0); // sub.s f1, f1, f0
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f3, f3, f0); // mul.s f3, f3, f0
|
|
c->lq(t0, 48, a2); // lq t0, 48(a2)
|
|
c->divs(f4, f0, f4); // div.s f4, f0, f4
|
|
c->lq(t1, 80, a2); // lq t1, 80(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t2, 112, a2); // lq t2, 112(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t3, 0, a2); // lq t3, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t4, 32, a2); // lq t4, 32(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t5, 64, a2); // lq t5, 64(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t6, 96, a2); // lq t6, 96(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t7, f3); // mfc1 t7, f3
|
|
c->muls(f3, f4, f0); // mul.s f3, f4, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f2, f0, f2); // div.s f2, f0, f2
|
|
// 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->daddiu(a2, a2, 128); // daddiu a2, a2, 128
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t8, f3); // mfc1 t8, f3
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f2, f2, f0); // mul.s f2, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f1, f0, f1); // div.s f1, f0, f1
|
|
// 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->mfc1(t9, f2); // mfc1 t9, f2
|
|
// 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->pextlw(t7, t8, t7); // pextlw t7, t8, t7
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t8, f1); // mfc1 t8, f1
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->pextlw(t8, t8, t9); // pextlw t8, t8, t9
|
|
// nop // sll r0, r0, 0
|
|
c->pcpyld(t7, t8, t7); // pcpyld t7, t8, t7
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf22, t0); // qmtc2.ni vf22, t0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf23, t1); // qmtc2.ni vf23, t1
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf24, t2); // qmtc2.ni vf24, t2
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf9, t3); // qmtc2.ni vf9, t3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf10, t4); // qmtc2.ni vf10, t4
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf11, t5); // qmtc2.ni vf11, t5
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf12, t6); // qmtc2.ni vf12, t6
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf27, t7); // qmtc2.ni vf27, t7
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t1, vf17); // qmfc2.ni t1, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t2, vf18); // qmfc2.ni t2, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19
|
|
bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L47
|
|
c->mov128_gpr_vf(a3, vf20); // qmfc2.ni a3, vf20
|
|
if (bc) {goto block_2;} // branch non-likely
|
|
|
|
|
|
block_1:
|
|
c->ppach(t1, r0, t1); // ppach t1, r0, t1
|
|
// Unknown instr: vcallms 48
|
|
vcallms48(c);
|
|
c->ppach(t2, r0, t2); // ppach t2, r0, t2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->ppach(t0, r0, t0); // ppach t0, r0, t0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->ppach(a3, r0, a3); // ppach a3, r0, a3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// nop // sll r0, r0, 0
|
|
c->sw(t1, 16, a0); // sw t1, 16(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(t2, 48, a0); // sw t2, 48(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(t0, 80, a0); // sw t0, 80(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(a3, 112, a0); // sw a3, 112(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
|
c->subs(f4, f4, f0); // sub.s f4, f4, f0
|
|
c->sw(v1, 20, a0); // sw v1, 20(a0)
|
|
c->subs(f3, f3, f0); // sub.s f3, f3, f0
|
|
c->sw(v1, 52, a0); // sw v1, 52(a0)
|
|
c->subs(f2, f2, f0); // sub.s f2, f2, f0
|
|
c->sw(v1, 84, a0); // sw v1, 84(a0)
|
|
c->subs(f1, f1, f0); // sub.s f1, f1, f0
|
|
c->sw(v1, 116, a0); // sw v1, 116(a0)
|
|
c->divs(f4, f0, f4); // div.s f4, f0, f4
|
|
c->lq(t3, 48, a2); // lq t3, 48(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t4, 80, a2); // lq t4, 80(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t5, 112, a2); // lq t5, 112(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t6, 0, a2); // lq t6, 0(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t2, 32, a2); // lq t2, 32(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t0, 64, a2); // lq t0, 64(a2)
|
|
// nop // sll r0, r0, 0
|
|
c->lq(t1, 96, a2); // lq t1, 96(a2)
|
|
c->daddiu(a1, a1, -4); // daddiu a1, a1, -4
|
|
c->daddiu(a0, a0, 128); // daddiu a0, a0, 128
|
|
c->muls(f4, f4, f0); // mul.s f4, f4, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f3, f0, f3); // div.s f3, f0, f3
|
|
// 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->mfc1(t7, f4); // mfc1 t7, f4
|
|
// nop // sll r0, r0, 0
|
|
c->daddiu(a2, a2, 128); // daddiu a2, a2, 128
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->muls(f3, f3, f0); // mul.s f3, f3, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f2, f0, f2); // div.s f2, f0, f2
|
|
// 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->mfc1(t8, f3); // mfc1 t8, f3
|
|
// 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->muls(f2, f2, f0); // mul.s f2, f2, f0
|
|
// nop // sll r0, r0, 0
|
|
c->divs(f1, f0, f1); // div.s f1, f0, f1
|
|
// nop // sll r0, r0, 0
|
|
c->pextlw(t7, t8, t7); // pextlw t7, t8, t7
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t8, f2); // mfc1 t8, f2
|
|
// 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
|
|
// nop // sll r0, r0, 0
|
|
c->mfc1(t9, f1); // mfc1 t9, f1
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf22, t3); // qmtc2.ni vf22, t3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf23, t4); // qmtc2.ni vf23, t4
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf24, t5); // qmtc2.ni vf24, t5
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf9, t6); // qmtc2.ni vf9, t6
|
|
c->pextlw(a3, t9, t8); // pextlw a3, t9, t8
|
|
c->mov128_vf_gpr(vf10, t2); // qmtc2.ni vf10, t2
|
|
c->pcpyld(a3, a3, t7); // pcpyld a3, a3, t7
|
|
c->mov128_vf_gpr(vf11, t0); // qmtc2.ni vf11, t0
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf12, t1); // qmtc2.ni vf12, t1
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t1, vf17); // qmfc2.ni t1, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t2, vf18); // qmfc2.ni t2, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19
|
|
bc = ((s64)c->sgpr64(a1)) > 0; // bgtz a1, L46
|
|
c->mov128_gpr_vf(a3, vf20); // qmfc2.ni a3, vf20
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
|
|
block_2:
|
|
c->ppach(a1, r0, t1); // ppach a1, r0, t1
|
|
c->sw(v1, 20, a0); // sw v1, 20(a0)
|
|
c->ppach(a2, r0, t2); // ppach a2, r0, t2
|
|
c->sw(v1, 52, a0); // sw v1, 52(a0)
|
|
c->ppach(t0, r0, t0); // ppach t0, r0, t0
|
|
c->sw(a1, 16, a0); // sw a1, 16(a0)
|
|
c->ppach(a1, r0, a3); // ppach a1, r0, a3
|
|
c->sw(a2, 48, a0); // sw a2, 48(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(t0, 80, a0); // sw t0, 80(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(a1, 112, a0); // sw a1, 112(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(v1, 84, a0); // sw v1, 84(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(v1, 116, a0); // sw v1, 116(a0)
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//jr ra // jr ra
|
|
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c();
|
|
gLinkedFunctionTable.reg("generic-envmap-dproc", execute, 256);
|
|
}
|
|
|
|
} // namespace generic_envmap_dproc
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
#include "game/mips2c/mips2c_private.h"
|
|
|
|
namespace Mips2C::jak1 {
|
|
namespace generic_interp_dproc {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
|
// nop // sll r0, r0, 0
|
|
c->lw(v1, 80, at); // lw v1, 80(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a0, 60, at); // lw a0, 60(at)
|
|
bc = c->sgpr64(v1) == 0; // beq v1, r0, L44
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
// nop // sll r0, r0, 0
|
|
c->lw(t0, 8, v1); // lw t0, 8(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a2, 4, a0); // lw a2, 4(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lh(a0, 0, v1); // lh a0, 0(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->lh(a1, 2, v1); // lh a1, 2(v1)
|
|
bc = c->sgpr64(a0) != 0; // bne a0, r0, L44
|
|
c->lh(a0, 4, v1); // lh a0, 4(v1)
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->dsll(t1, a0, 5); // dsll t1, a0, 5
|
|
c->lh(a0, 12, v1); // lh a0, 12(v1)
|
|
c->daddiu(a3, a1, 7); // daddiu a3, a1, 7
|
|
c->lh(a1, 14, v1); // lh a1, 14(v1)
|
|
bc = c->sgpr64(a1) == 0; // beq a1, r0, L44
|
|
c->daddu(v1, t1, a2); // daddu v1, t1, a2
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->pextlh(a0, a0, a0); // pextlh a0, a0, a0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlw(a0, a0, a0); // pextlw a0, a0, a0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(a0, a0, a0); // pcpyld a0, a0, a0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlh(a1, a1, a1); // pextlh a1, a1, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlw(a1, a1, a1); // pextlw a1, a1, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(a1, a1, a1); // pcpyld a1, a1, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlw(a2, a2, a2); // pextlw a2, a2, a2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(a2, a2, a2); // pcpyld a2, a2, a2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->dsra(a3, a3, 3); // dsra a3, a3, 3
|
|
// nop // sll r0, r0, 0
|
|
c->dsll(a3, a3, 4); // dsll a3, a3, 4
|
|
c->ld(t1, 0, t0); // ld t1, 0(t0)
|
|
c->daddu(a3, t0, a3); // daddu a3, t0, a3
|
|
c->daddiu(t0, t0, 8); // daddiu t0, t0, 8
|
|
c->pextlb(t1, r0, t1); // pextlb t1, r0, t1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->psllh(t2, t1, 5); // psllh t2, t1, 5
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuh(t1, r0, t2); // pextuh t1, r0, t2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlh(t2, r0, t2); // pextlh t2, r0, t2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->paddw(t2, t2, a2); // paddw t2, t2, a2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
//beq r0, r0, L43 // beq r0, r0, L43
|
|
c->pcpyud(t5, t2, r0); // pcpyud t5, t2, r0
|
|
goto block_5; // branch always
|
|
|
|
|
|
block_4:
|
|
c->dsrl32(t5, t6, 0); // dsrl32 t5, t6, 0
|
|
c->dsrl32(t4, t3, 0); // dsrl32 t4, t3, 0
|
|
c->pextuh(t1, r0, t2); // pextuh t1, r0, t2
|
|
c->sw(t6, 16, v1); // sw t6, 16(v1)
|
|
c->pextlh(t2, r0, t2); // pextlh t2, r0, t2
|
|
c->sw(t5, 48, v1); // sw t5, 48(v1)
|
|
c->paddw(t2, t2, a2); // paddw t2, t2, a2
|
|
c->sw(t3, 80, v1); // sw t3, 80(v1)
|
|
c->pcpyud(t5, t2, r0); // pcpyud t5, t2, r0
|
|
c->sw(t4, 112, v1); // sw t4, 112(v1)
|
|
c->daddiu(t0, t0, 8); // daddiu t0, t0, 8
|
|
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
|
|
|
block_5:
|
|
c->paddw(t1, t1, a2); // paddw t1, t1, a2
|
|
c->lwu(t3, 16, t2); // lwu t3, 16(t2)
|
|
c->pcpyud(t6, t1, r0); // pcpyud t6, t1, r0
|
|
c->lwu(t4, 16, t5); // lwu t4, 16(t5)
|
|
c->dsrl32(t8, t2, 0); // dsrl32 t8, t2, 0
|
|
c->lwu(t2, 16, t1); // lwu t2, 16(t1)
|
|
c->dsrl32(t9, t5, 0); // dsrl32 t9, t5, 0
|
|
c->lwu(t5, 16, t6); // lwu t5, 16(t6)
|
|
c->dsrl32(t7, t1, 0); // dsrl32 t7, t1, 0
|
|
c->lwu(t1, 16, t8); // lwu t1, 16(t8)
|
|
c->dsrl32(t8, t6, 0); // dsrl32 t8, t6, 0
|
|
c->lwu(t6, 16, t9); // lwu t6, 16(t9)
|
|
c->pextlw(t4, t4, t3); // pextlw t4, t4, t3
|
|
c->lwu(t3, 16, t7); // lwu t3, 16(t7)
|
|
c->pextlw(t2, t5, t2); // pextlw t2, t5, t2
|
|
c->lwu(t5, 16, t8); // lwu t5, 16(t8)
|
|
c->pcpyld(t2, t2, t4); // pcpyld t2, t2, t4
|
|
c->lwu(t4, 16, v1); // lwu t4, 16(v1)
|
|
c->pextlw(t6, t6, t1); // pextlw t6, t6, t1
|
|
c->lwu(t1, 48, v1); // lwu t1, 48(v1)
|
|
c->pextlw(t3, t5, t3); // pextlw t3, t5, t3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(t3, t3, t6); // pcpyld t3, t3, t6
|
|
c->lwu(t5, 80, v1); // lwu t5, 80(v1)
|
|
c->pextlw(t1, t1, t4); // pextlw t1, t1, t4
|
|
c->lwu(t4, 112, v1); // lwu t4, 112(v1)
|
|
c->pmulth(r0, t2, a1); // pmulth r0, t2, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlw(t2, t4, t5); // pextlw t2, t4, t5
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pmaddh(r0, t3, a1); // pmaddh r0, t3, a1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(t1, t2, t1); // pcpyld t1, t2, t1
|
|
c->ld(t2, 0, t0); // ld t2, 0(t0)
|
|
c->pmaddh(r0, t1, a0); // pmaddh r0, t1, a0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlb(t1, r0, t2); // pextlb t1, r0, t2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->psllh(t2, t1, 5); // psllh t2, t1, 5
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// Unknown instr: pmfhl.lw t3
|
|
c->pmfhl_lw(t3);
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
// Unknown instr: pmfhl.uw t1
|
|
c->pmfhl_uw(t1);
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->psraw(t3, t3, 8); // psraw t3, t3, 8
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->psraw(t1, t1, 8); // psraw t1, t1, 8
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pinteh(t6, t1, t3); // pinteh t6, t1, t3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
bc = c->sgpr64(t0) != c->sgpr64(a3); // bne t0, a3, L42
|
|
c->pcpyud(t3, t6, r0); // pcpyud t3, t6, r0
|
|
if (bc) {goto block_4;} // branch non-likely
|
|
|
|
c->dsrl32(a0, t6, 0); // dsrl32 a0, t6, 0
|
|
c->sw(t6, 16, v1); // sw t6, 16(v1)
|
|
c->dsrl32(a1, t3, 0); // dsrl32 a1, t3, 0
|
|
c->sw(a0, 48, v1); // sw a0, 48(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(t3, 80, v1); // sw t3, 80(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->sw(a1, 112, v1); // sw a1, 112(v1)
|
|
|
|
block_7:
|
|
//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
|
|
// 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("generic-interp-dproc", execute, 128);
|
|
}
|
|
|
|
} // namespace generic_interp_dproc
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
#include "game/mips2c/mips2c_private.h"
|
|
|
|
namespace Mips2C::jak1 {
|
|
namespace generic_no_light_dproc {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
c->daddiu(sp, sp, -128); // daddiu sp, sp, -128
|
|
c->sd(ra, 12432, at); // sd ra, 12432(at)
|
|
c->sq(s0, 12448, at); // sq s0, 12448(at)
|
|
c->sq(s1, 12464, at); // sq s1, 12464(at)
|
|
c->sq(s2, 12480, at); // sq s2, 12480(at)
|
|
c->sq(s3, 12496, at); // sq s3, 12496(at)
|
|
c->sq(s4, 12512, at); // sq s4, 12512(at)
|
|
c->sq(s5, 12528, at); // sq s5, 12528(at)
|
|
c->sq(gp, 12544, at); // sq gp, 12544(at)
|
|
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a1, 60, at); // lw a1, 60(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a0, 52, at); // lw a0, 52(at)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(v1, 0, a1); // lw v1, 0(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->lw(a2, 4, a1); // lw a2, 4(a1)
|
|
c->daddiu(a0, a0, 3); // daddiu a0, a0, 3
|
|
// nop // sll r0, r0, 0
|
|
c->dsra(a0, a0, 2); // dsra a0, a0, 2
|
|
// nop // sll r0, r0, 0
|
|
c->dsll(a0, a0, 3); // dsll a0, a0, 3
|
|
c->addiu(a3, r0, 255); // addiu a3, r0, 255
|
|
c->lui(a1, -2); // lui a1, -2
|
|
c->addiu(t1, r0, 256); // addiu t1, r0, 256
|
|
c->ori(a1, a1, 65534); // ori a1, a1, 65534
|
|
c->daddu(a0, v1, a0); // daddu a0, v1, a0
|
|
c->pextlw(a1, a1, a1); // pextlw a1, a1, a1
|
|
c->lw(t2, 20, at); // lw t2, 20(at)
|
|
c->pextlw(a1, a1, a1); // pextlw a1, a1, a1
|
|
c->lw(t3, 24, at); // lw t3, 24(at)
|
|
c->pextlw(a2, a2, a2); // pextlw a2, a2, a2
|
|
c->lw(t5, 28, at); // lw t5, 28(at)
|
|
c->pextlw(a2, a2, a2); // pextlw a2, a2, a2
|
|
c->lw(t4, 32, at); // lw t4, 32(at)
|
|
c->pcpyh(a3, a3); // pcpyh a3, a3
|
|
c->lw(t6, 36, at); // lw t6, 36(at)
|
|
c->pcpyld(a3, a3, a3); // pcpyld a3, a3, a3
|
|
c->lq(t0, 12160, at); // lq t0, 12160(at)
|
|
c->pcpyh(t1, t1); // pcpyh t1, t1
|
|
c->ld(t7, 0, v1); // ld t7, 0(v1)
|
|
c->pcpyld(t1, t1, t1); // pcpyld t1, t1, t1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlh(t8, r0, t7); // pextlh t8, r0, t7
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pand(t7, t8, a3); // pand t7, t8, a3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->psllw(t7, t7, 5); // psllw t7, t7, 5
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->daddiu(t2, t2, -48); // daddiu t2, t2, -48
|
|
c->daddiu(t3, t3, -16); // daddiu t3, t3, -16
|
|
c->daddiu(t4, t4, -16); // daddiu t4, t4, -16
|
|
c->daddiu(t5, t5, -16); // daddiu t5, t5, -16
|
|
//beq r0, r0, L34 // beq r0, r0, L34
|
|
c->daddiu(t6, t6, -16); // daddiu t6, t6, -16
|
|
goto block_3; // branch always
|
|
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_2:
|
|
c->pextlh(t8, r0, gp); // pextlh t8, r0, gp
|
|
c->sq(t7, 0, t2); // sq t7, 0(t2)
|
|
c->pand(t7, t8, a3); // pand t7, t8, a3
|
|
c->sq(t9, 16, t2); // sq t9, 16(t2)
|
|
c->psllw(t7, t7, 5); // psllw t7, t7, 5
|
|
c->sq(ra, 32, t2); // sq ra, 32(t2)
|
|
|
|
block_3:
|
|
c->paddw(s3, t7, a2); // paddw s3, t7, a2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->dsrl32(s2, s3, 0); // dsrl32 s2, s3, 0
|
|
c->daddiu(t2, t2, 48); // daddiu t2, t2, 48
|
|
c->pcpyud(s5, s3, r0); // pcpyud s5, s3, r0
|
|
c->lq(t7, 0, s3); // lq t7, 0(s3)
|
|
c->dsrl32(s4, s5, 0); // dsrl32 s4, s5, 0
|
|
c->daddiu(t3, t3, 16); // daddiu t3, t3, 16
|
|
c->pand(t8, t8, t1); // pand t8, t8, t1
|
|
c->lq(t9, 0, s2); // lq t9, 0(s2)
|
|
c->psraw(gp, t8, 8); // psraw gp, t8, 8
|
|
c->lq(t8, 0, s5); // lq t8, 0(s5)
|
|
c->pextuw(s1, t9, t7); // pextuw s1, t9, t7
|
|
c->lq(ra, 0, s4); // lq ra, 0(s4)
|
|
c->daddiu(t5, t5, 16); // daddiu t5, t5, 16
|
|
c->daddiu(v1, v1, 8); // daddiu v1, v1, 8
|
|
c->daddiu(t4, t4, 16); // daddiu t4, t4, 16
|
|
c->daddiu(t6, t6, 16); // daddiu t6, t6, 16
|
|
c->pextuw(s0, ra, t8); // pextuw s0, ra, t8
|
|
c->lq(s3, 16, s3); // lq s3, 16(s3)
|
|
c->pcpyud(s1, s1, s0); // pcpyud s1, s1, s0
|
|
c->lq(s2, 16, s2); // lq s2, 16(s2)
|
|
c->paddh(s0, s1, t0); // paddh s0, s1, t0
|
|
c->lq(s1, 16, s5); // lq s1, 16(s5)
|
|
c->pand(s5, s0, a1); // pand s5, s0, a1
|
|
c->lq(s0, 16, s4); // lq s0, 16(s4)
|
|
c->pextlw(s4, s2, s3); // pextlw s4, s2, s3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuw(s3, s2, s3); // pextuw s3, s2, s3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlw(s2, s0, s1); // pextlw s2, s0, s1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuw(s0, s0, s1); // pextuw s0, s0, s1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(s1, s2, s4); // pcpyld s1, s2, s4
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyud(s4, s4, s2); // pcpyud s4, s4, s2
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyud(s3, s3, s0); // pcpyud s3, s3, s0
|
|
c->sq(s4, 0, t4); // sq s4, 0(t4)
|
|
c->pand(s4, s1, a1); // pand s4, s1, a1
|
|
c->sq(s3, 0, t3); // sq s3, 0(t3)
|
|
c->por(s4, s4, gp); // por s4, s4, gp
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->por(gp, s5, gp); // por gp, s5, gp
|
|
c->sq(s4, 0, t6); // sq s4, 0(t6)
|
|
c->prot3w(ra, ra); // prot3w ra, ra
|
|
c->sq(gp, 0, t5); // sq gp, 0(t5)
|
|
c->prot3w(t9, t9); // prot3w t9, t9
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuw(s5, t9, t7); // pextuw s5, t9, t7
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pcpyld(t9, t8, t9); // pcpyld t9, t8, t9
|
|
c->ld(gp, 0, v1); // ld gp, 0(v1)
|
|
c->pcpyld(t7, s5, t7); // pcpyld t7, s5, t7
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuw(t8, ra, t8); // pextuw t8, ra, t8
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
bc = c->sgpr64(v1) != c->sgpr64(a0); // bne v1, a0, L33
|
|
c->pcpyld(ra, ra, t8); // pcpyld ra, ra, t8
|
|
if (bc) {goto block_2;} // branch non-likely
|
|
|
|
// nop // sll r0, r0, 0
|
|
c->sq(t7, 0, t2); // sq t7, 0(t2)
|
|
// nop // sll r0, r0, 0
|
|
c->sq(t9, 16, t2); // sq t9, 16(t2)
|
|
// nop // sll r0, r0, 0
|
|
c->sq(ra, 32, t2); // sq ra, 32(t2)
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
c->ld(ra, 12432, at); // ld ra, 12432(at)
|
|
c->lq(gp, 12544, at); // lq gp, 12544(at)
|
|
c->lq(s5, 12528, at); // lq s5, 12528(at)
|
|
c->lq(s4, 12512, at); // lq s4, 12512(at)
|
|
c->lq(s3, 12496, at); // lq s3, 12496(at)
|
|
c->lq(s2, 12480, at); // lq s2, 12480(at)
|
|
c->lq(s1, 12464, at); // lq s1, 12464(at)
|
|
c->lq(s0, 12448, at); // lq s0, 12448(at)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 128); // daddiu sp, sp, 128
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c();
|
|
gLinkedFunctionTable.reg("generic-no-light-dproc", execute, 256);
|
|
}
|
|
|
|
} // namespace generic_no_light_dproc
|
|
} // namespace Mips2C
|
|
|
|
|