mirror of
https://github.com/open-goal/jak-project
synced 2026-09-04 18:51:29 -04:00
9c86c86c74
Breaks the 300 file milestone, also includes the majority of mips2c functions carried forward. Some functions need some fixes in the c++ code to mips2c properly, and a small handful of the mips2c functions require manual patching -- all spots were marked with `TODO - fix` that had to be commented out to get things compiling.
1807 lines
103 KiB
C++
1807 lines
103 KiB
C++
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace draw_large_polygon {
|
|
struct Cache {
|
|
void* clip_polygon_against_negative_hyperplane; // clip-polygon-against-negative-hyperplane
|
|
void* clip_polygon_against_positive_hyperplane; // clip-polygon-against-positive-hyperplane
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
// nop // sll r0, r0, 0
|
|
c->daddiu(sp, sp, -16); // daddiu sp, sp, -16
|
|
// nop // sll r0, r0, 0
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->load_symbol2(t9, cache.clip_polygon_against_positive_hyperplane);// lw t9, clip-polygon-against-positive-hyperplane(s7)
|
|
c->mov64(a3, t5); // or a3, t5, r0
|
|
c->mov64(t0, t6); // or t0, t6, r0
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->daddu(t3, a3, r0); // daddu t3, a3, r0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
bc = c->sgpr64(t1) == 0; // beq t1, r0, L123
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->mov64(a3, t6); // or a3, t6, r0
|
|
c->mov64(t0, t5); // or t0, t5, r0
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->daddiu(t3, a3, 4); // daddiu t3, a3, 4
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
bc = c->sgpr64(t1) == 0; // beq t1, r0, L123
|
|
c->load_symbol2(t9, cache.clip_polygon_against_negative_hyperplane);// lw t9, clip-polygon-against-negative-hyperplane(s7)
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->mov64(a3, t5); // or a3, t5, r0
|
|
c->mov64(t0, t6); // or t0, t6, r0
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->daddu(t3, a3, r0); // daddu t3, a3, r0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
bc = c->sgpr64(t1) == 0; // beq t1, r0, L123
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->mov64(a3, t6); // or a3, t6, r0
|
|
c->mov64(t0, t5); // or t0, t5, r0
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->daddiu(t3, a3, 4); // daddiu t3, a3, 4
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
bc = c->sgpr64(t1) == 0; // beq t1, r0, L123
|
|
c->lw(t0, 4, a1); // lw t0, 4(a1)
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->mov64(a3, t5); // or a3, t5, r0
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf27, 0, t0); // sqc2 vf27, 0(t0)
|
|
c->daddiu(t0, t0, 16); // daddiu t0, t0, 16
|
|
c->sw(t1, -16, t0); // sw t1, -16(t0)
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_5:
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a3); // lqc2 vf2, 16(a3)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, a3); // lqc2 vf3, 32(a3)
|
|
c->vdiv(vf0, BC::w, vf1, BC::w); // vdiv Q, vf0.w, vf1.w
|
|
c->vmul(DEST::xyzw, vf1, vf1, vf26); // vmul.xyzw vf1, vf1, vf26
|
|
// nop // sll r0, r0, 0
|
|
c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3
|
|
// nop // sll r0, r0, 0
|
|
c->vadd(DEST::xyzw, vf2, vf2, vf24); // vadd.xyzw vf2, vf2, vf24
|
|
// nop // sll r0, r0, 0
|
|
c->vwaitq(); // vwaitq
|
|
// nop // sll r0, r0, 0
|
|
c->vmulq(DEST::xyz, vf1, vf1); // vmulq.xyz vf1, vf1, Q
|
|
c->sqc2(vf3, 16, t0); // sqc2 vf3, 16(t0)
|
|
c->vmulq(DEST::xyzw, vf2, vf2); // vmulq.xyzw vf2, vf2, Q
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
c->vadd(DEST::xyzw, vf1, vf1, vf25); // vadd.xyzw vf1, vf1, vf25
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->vmul_bc(DEST::z, BC::z, vf1, vf1, vf0); // vmulz.z vf1, vf1, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmini_bc(DEST::w, BC::z, vf1, vf1, vf13); // vminiz.w vf1, vf1, vf13
|
|
// nop // sll r0, r0, 0
|
|
c->vadd_bc(DEST::z, BC::x, vf1, vf1, vf23); // vaddx.z vf1, vf1, vf23
|
|
// nop // sll r0, r0, 0
|
|
c->vmax_bc(DEST::w, BC::y, vf1, vf1, vf13); // vmaxy.w vf1, vf1, vf13
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf2, -48, t0); // sqc2 vf2, -48(t0)
|
|
c->daddiu(t1, t1, -1); // daddiu t1, t1, -1
|
|
c->vftoi4(DEST::xyzw, vf1, vf1); // vftoi4.xyzw vf1, vf1
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t1) != 0; // bne t1, r0, L122
|
|
c->sqc2(vf1, -16, t0); // sqc2 vf1, -16(t0)
|
|
if (bc) {goto block_5;} // branch non-likely
|
|
|
|
c->sw(t0, 4, a1); // sw t0, 4(a1)
|
|
// nop // sll r0, r0, 0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->daddiu(v0, s7, 4); // daddiu v0, s7, 4
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
|
|
goto end_of_function; // return
|
|
|
|
|
|
block_7:
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->mov64(v0, s7); // or v0, s7, r0
|
|
//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];
|
|
}
|
|
|
|
void link() {
|
|
cache.clip_polygon_against_negative_hyperplane = intern_from_c(-1, 0, "clip-polygon-against-negative-hyperplane").c();
|
|
cache.clip_polygon_against_positive_hyperplane = intern_from_c(-1, 0, "clip-polygon-against-positive-hyperplane").c();
|
|
gLinkedFunctionTable.reg("draw-large-polygon", execute, 256);
|
|
}
|
|
|
|
} // namespace draw_large_polygon
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace method_32_sky_work {
|
|
struct Cache {
|
|
void* vector_normalize; // vector-normalize!
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->daddiu(sp, sp, -48); // daddiu sp, sp, -48
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->sq(s5, 16, sp); // sq s5, 16(sp)
|
|
c->sq(gp, 32, sp); // sq gp, 32(sp)
|
|
c->mov64(gp, a0); // or gp, a0, r0
|
|
c->addiu(a1, r0, 0); // addiu a1, r0, 0
|
|
c->mov64(v1, gp); // or v1, gp, r0
|
|
c->lqc2(vf31, 1536, gp); // lqc2 vf31, 1536(gp)
|
|
c->lqc2(vf30, 1552, gp); // lqc2 vf30, 1552(gp)
|
|
c->lqc2(vf29, 1568, gp); // lqc2 vf29, 1568(gp)
|
|
c->addiu(a0, r0, 0); // addiu a0, r0, 0
|
|
//beq r0, r0, L38 // beq r0, r0, L38
|
|
// nop // sll r0, r0, 0
|
|
goto block_10; // branch always
|
|
|
|
|
|
block_1:
|
|
c->daddiu(a2, a1, 3); // daddiu a2, a1, 3
|
|
c->daddiu(t0, a1, 5); // daddiu t0, a1, 5
|
|
c->daddiu(a3, a1, 7); // daddiu a3, a1, 7
|
|
c->andi(a2, a2, 7); // andi a2, a2, 7
|
|
c->andi(t1, t0, 7); // andi t1, t0, 7
|
|
c->andi(t2, a3, 7); // andi t2, a3, 7
|
|
c->dsll(a3, a1, 4); // dsll a3, a1, 4
|
|
c->dsll(t0, a2, 4); // dsll t0, a2, 4
|
|
c->dsll(t1, t1, 4); // dsll t1, t1, 4
|
|
c->dsll(a2, t2, 4); // dsll a2, t2, 4
|
|
c->daddu(t3, a3, gp); // daddu t3, a3, gp
|
|
c->daddu(t2, t0, gp); // daddu t2, t0, gp
|
|
c->daddu(a3, t1, gp); // daddu a3, t1, gp
|
|
c->lq(t0, 816, t3); // lq t0, 816(t3)
|
|
c->daddu(a2, a2, gp); // daddu a2, a2, gp
|
|
c->lq(t1, 816, t2); // lq t1, 816(t2)
|
|
c->daddiu(a1, a1, 1); // daddiu a1, a1, 1
|
|
c->lq(a3, 816, a3); // lq a3, 816(a3)
|
|
c->paddb(t0, t0, t1); // paddb t0, t0, t1
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->paddb(a3, t0, a3); // paddb a3, t0, a3
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->andi(a1, a1, 7); // andi a1, a1, 7
|
|
c->sq(a3, 816, a2); // sq a3, 816(a2)
|
|
c->pextlb(t0, a3, r0); // pextlb t0, a3, r0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextub(a2, a3, r0); // pextub a2, a3, r0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextuh(a3, t0, r0); // pextuh a3, t0, r0
|
|
c->mfc1(r0, f31); // mfc1 r0, f31
|
|
c->pextlh(t0, t0, r0); // pextlh t0, t0, r0
|
|
c->mov128_vf_gpr(vf15, a3); // qmtc2.i vf15, a3
|
|
c->pextuh(a3, a2, r0); // pextuh a3, a2, r0
|
|
c->mov128_vf_gpr(vf16, t0); // qmtc2.i vf16, t0
|
|
c->pextlh(a2, a2, r0); // pextlh a2, a2, r0
|
|
c->mov128_vf_gpr(vf17, a3); // qmtc2.i vf17, a3
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_vf_gpr(vf18, a2); // qmtc2.i vf18, a2
|
|
c->vitof15(DEST::xyzw, vf15, vf15); // vitof15.xyzw vf15, vf15
|
|
// nop // sll r0, r0, 0
|
|
c->vitof15(DEST::xyzw, vf16, vf16); // vitof15.xyzw vf16, vf16
|
|
// nop // sll r0, r0, 0
|
|
c->vitof15(DEST::xyzw, vf17, vf17); // vitof15.xyzw vf17, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->vitof15(DEST::xyzw, vf18, vf18); // vitof15.xyzw vf18, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf15); // vmulax.xyzw acc, vf31, vf15
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf15); // vmadday.xyzw acc, vf30, vf15
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf15, vf29, vf15); // vmaddz.xyzw vf15, vf29, vf15
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf16); // vmulax.xyzw acc, vf31, vf16
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf16); // vmadday.xyzw acc, vf30, vf16
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf16, vf29, vf16); // vmaddz.xyzw vf16, vf29, vf16
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf17); // vmulax.xyzw acc, vf31, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf17); // vmadday.xyzw acc, vf30, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf17, vf29, vf17); // vmaddz.xyzw vf17, vf29, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf18); // vmulax.xyzw acc, vf31, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf18); // vmadday.xyzw acc, vf30, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::z, vf18, vf29, vf18); // vmaddz.xyzw vf18, vf29, vf18
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(a2, vf15); // qmfc2.i a2, vf15
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(a3, vf16); // qmfc2.i a3, vf16
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t0, vf17); // qmfc2.i t0, vf17
|
|
// nop // sll r0, r0, 0
|
|
c->mov128_gpr_vf(t1, vf18); // qmfc2.i t1, vf18
|
|
// nop // sll r0, r0, 0
|
|
bc = ((s64)c->sgpr64(a2)) >= 0; // bgez a2, L34
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
c->vsub(DEST::xyz, vf15, vf0, vf15); // vsub.xyz vf15, vf0, vf15
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_3:
|
|
bc = ((s64)c->sgpr64(a3)) >= 0; // bgez a3, L35
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_5;} // branch non-likely
|
|
|
|
c->vsub(DEST::xyz, vf16, vf0, vf16); // vsub.xyz vf16, vf0, vf16
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_5:
|
|
bc = ((s64)c->sgpr64(t0)) >= 0; // bgez t0, L36
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_7;} // branch non-likely
|
|
|
|
c->vsub(DEST::xyz, vf17, vf0, vf17); // vsub.xyz vf17, vf0, vf17
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_7:
|
|
bc = ((s64)c->sgpr64(t1)) >= 0; // bgez t1, L37
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_9;} // branch non-likely
|
|
|
|
c->vsub(DEST::xyz, vf18, vf0, vf18); // vsub.xyz vf18, vf0, vf18
|
|
// nop // sll r0, r0, 0
|
|
|
|
block_9:
|
|
c->sqc2(vf15, 1920, v1); // sqc2 vf15, 1920(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf16, 1936, v1); // sqc2 vf16, 1936(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf17, 1952, v1); // sqc2 vf17, 1952(v1)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf18, 1968, v1); // sqc2 vf18, 1968(v1)
|
|
c->daddiu(v1, v1, 64); // daddiu v1, v1, 64
|
|
c->daddiu(a0, a0, 1); // daddiu a0, a0, 1
|
|
|
|
block_10:
|
|
c->slti(a2, a0, 128); // slti a2, a0, 128
|
|
bc = c->sgpr64(a2) != 0; // bne a2, r0, L33
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->addiu(s5, r0, 0); // addiu s5, r0, 0
|
|
//beq r0, r0, L40 // beq r0, r0, L40
|
|
// nop // sll r0, r0, 0
|
|
goto block_13; // branch always
|
|
|
|
|
|
block_12:
|
|
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
|
c->dsll(v1, s5, 4); // dsll v1, s5, 4
|
|
c->daddiu(v1, v1, 1920); // daddiu v1, v1, 1920
|
|
c->daddu(a0, v1, gp); // daddu a0, v1, gp
|
|
c->lui(v1, 18243); // lui v1, 18243
|
|
c->ori(a1, v1, 20480); // ori a1, v1, 20480
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->daddiu(s5, s5, 1); // daddiu s5, s5, 1
|
|
|
|
block_13:
|
|
c->slti(v1, s5, 512); // slti v1, s5, 512
|
|
bc = c->sgpr64(v1) != 0; // bne v1, r0, L39
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_12;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->lq(gp, 32, sp); // lq gp, 32(sp)
|
|
c->lq(s5, 16, sp); // lq s5, 16(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 48); // daddiu sp, sp, 48
|
|
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.vector_normalize = intern_from_c(-1, 0, "vector-normalize!").c();
|
|
gLinkedFunctionTable.reg("(method 32 sky-work)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_32_sky_work
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace method_31_sky_work {
|
|
struct Cache {
|
|
void* z_vector; // *z-vector*
|
|
void* vector_normalize; // vector-normalize!
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->daddiu(sp, sp, -80); // daddiu sp, sp, -80
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->sq(s4, 32, sp); // sq s4, 32(sp)
|
|
c->sq(s5, 48, sp); // sq s5, 48(sp)
|
|
c->sq(gp, 64, sp); // sq gp, 64(sp)
|
|
c->mov64(gp, a0); // or gp, a0, r0
|
|
c->mov64(s4, a1); // or s4, a1, r0
|
|
c->mov64(s5, a2); // or s5, a2, r0
|
|
c->daddiu(v1, s4, 32); // daddiu v1, s4, 32
|
|
c->mov64(a0, s5); // or a0, s5, r0
|
|
c->lq(a0, 0, a0); // lq a0, 0(a0)
|
|
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
|
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
|
c->daddiu(a0, s4, 32); // daddiu a0, s4, 32
|
|
c->lui(a1, 16256); // lui a1, 16256
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->daddu(a1, r0, s4); // daddu a1, r0, s4
|
|
c->load_symbol2(v1, cache.z_vector); // lw v1, *z-vector*(s7)
|
|
c->daddiu(a0, s4, 32); // daddiu a0, s4, 32
|
|
c->lqc2(vf1, 0, v1); // lqc2 vf1, 0(v1)
|
|
c->lqc2(vf2, 0, a0); // lqc2 vf2, 0(a0)
|
|
c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2
|
|
c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1
|
|
c->sqc2(vf3, 0, a1); // sqc2 vf3, 0(a1)
|
|
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
|
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
|
c->lui(a1, 16256); // lui a1, 16256
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->daddiu(a1, s4, 16); // daddiu a1, s4, 16
|
|
c->daddiu(v1, s4, 32); // daddiu v1, s4, 32
|
|
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
|
c->lqc2(vf1, 0, v1); // lqc2 vf1, 0(v1)
|
|
c->lqc2(vf2, 0, a0); // lqc2 vf2, 0(a0)
|
|
c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2
|
|
c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1
|
|
c->sqc2(vf3, 0, a1); // sqc2 vf3, 0(a1)
|
|
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
|
c->daddiu(a0, s4, 16); // daddiu a0, s4, 16
|
|
c->lui(a1, 16256); // lui a1, 16256
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->daddiu(s4, sp, 16); // daddiu s4, sp, 16
|
|
c->mov64(v1, s4); // or v1, s4, r0
|
|
c->lq(a0, 0, s5); // lq a0, 0(s5)
|
|
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
|
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
|
c->mov64(a0, s4); // or a0, s4, r0
|
|
c->lui(a1, -16512); // lui a1, -16512
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->mtc1(f0, r0); // mtc1 f0, r0
|
|
c->lui(v1, 16256); // lui v1, 16256
|
|
c->mtc1(f1, v1); // mtc1 f1, v1
|
|
c->lui(v1, 16800); // lui v1, 16800
|
|
c->mtc1(f2, v1); // mtc1 f2, v1
|
|
c->lui(v1, 15692); // lui v1, 15692
|
|
c->ori(v1, v1, 52429); // ori v1, v1, 52429
|
|
c->mtc1(f3, v1); // mtc1 f3, v1
|
|
c->lwc1(f4, 4, s4); // lwc1 f4, 4(s4)
|
|
c->adds(f3, f3, f4); // add.s f3, f3, f4
|
|
c->muls(f2, f2, f3); // mul.s f2, f2, f3
|
|
c->mins(f1, f1, f2); // min.s f1, f1, f2
|
|
c->maxs(f0, f0, f1); // max.s f0, f0, f1
|
|
c->addiu(v1, r0, 0); // addiu v1, r0, 0
|
|
//beq r0, r0, L43 // beq r0, r0, L43
|
|
// nop // sll r0, r0, 0
|
|
goto block_2; // branch always
|
|
|
|
|
|
block_1:
|
|
c->lui(a0, 17152); // lui a0, 17152
|
|
c->mtc1(f1, a0); // mtc1 f1, a0
|
|
c->lui(a0, 16640); // lui a0, 16640
|
|
c->mtc1(f2, a0); // mtc1 f2, a0
|
|
c->mtc1(f3, v1); // mtc1 f3, v1
|
|
c->cvtsw(f3, f3); // cvt.s.w f3, f3
|
|
c->muls(f2, f2, f3); // mul.s f2, f2, f3
|
|
c->subs(f1, f1, f2); // sub.s f1, f1, f2
|
|
c->muls(f1, f1, f0); // mul.s f1, f1, f0
|
|
c->dsll(a0, v1, 4); // dsll a0, v1, 4
|
|
c->daddiu(a0, a0, 528); // daddiu a0, a0, 528
|
|
c->daddu(a0, a0, gp); // daddu a0, a0, gp
|
|
c->cvtws(f2, f1); // cvt.w.s f2, f1
|
|
c->swc1(f2, 0, a0); // swc1 f2, 0(a0)
|
|
c->cvtws(f2, f1); // cvt.w.s f2, f1
|
|
c->swc1(f2, 4, a0); // swc1 f2, 4(a0)
|
|
c->cvtws(f1, f1); // cvt.w.s f1, f1
|
|
c->swc1(f1, 8, a0); // swc1 f1, 8(a0)
|
|
c->addiu(a1, r0, 128); // addiu a1, r0, 128
|
|
c->sw(a1, 12, a0); // sw a1, 12(a0)
|
|
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
|
|
|
block_2:
|
|
c->slti(a0, v1, 16); // slti a0, v1, 16
|
|
bc = c->sgpr64(a0) != 0; // bne a0, r0, L42
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->lq(gp, 64, sp); // lq gp, 64(sp)
|
|
c->lq(s5, 48, sp); // lq s5, 48(sp)
|
|
c->lq(s4, 32, sp); // lq s4, 32(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 80); // daddiu sp, sp, 80
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
cache.z_vector = intern_from_c(-1, 0, "*z-vector*").c();
|
|
cache.vector_normalize = intern_from_c(-1, 0, "vector-normalize!").c();
|
|
gLinkedFunctionTable.reg("(method 31 sky-work)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_31_sky_work
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace method_30_sky_work {
|
|
struct Cache {
|
|
// TODO FIX - void* adgif_shader<_texture_simple; // adgif-shader<-texture-simple!
|
|
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
bool cop1_bc = false;
|
|
c->daddiu(sp, sp, -80); // daddiu sp, sp, -80
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->sq(s4, 32, sp); // sq s4, 32(sp)
|
|
c->sq(s5, 48, sp); // sq s5, 48(sp)
|
|
c->sq(gp, 64, sp); // sq gp, 64(sp)
|
|
c->mov64(gp, a0); // or gp, a0, r0
|
|
c->mov64(s5, a2); // or s5, a2, r0
|
|
c->sw(a1, 1916, gp); // sw a1, 1916(gp)
|
|
c->load_symbol2(t9, cache.lookup_texture_by_id_fast);// lw t9, lookup-texture-by-id-fast(s7)
|
|
c->lui(v1, 128); // lui v1, 128
|
|
c->ori(a0, v1, 2304); // ori a0, v1, 2304
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->sw(v0, 16, sp); // sw v0, 16(sp)
|
|
c->load_symbol2(t9, cache.lookup_texture_by_id_fast);// lw t9, lookup-texture-by-id-fast(s7)
|
|
c->lui(v1, 128); // lui v1, 128
|
|
c->ori(a0, v1, 2048); // ori a0, v1, 2048
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->sw(v0, 20, sp); // sw v0, 20(sp)
|
|
c->lwu(v1, 16, sp); // lwu v1, 16(sp)
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L45
|
|
c->mov64(v1, v1); // or v1, v1, r0
|
|
goto block_3;
|
|
}
|
|
|
|
block_2:
|
|
c->lwu(v1, 20, sp); // lwu v1, 20(sp)
|
|
|
|
block_3:
|
|
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L48
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
c->lqc2(vf15, 1312, gp); // lqc2 vf15, 1312(gp)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf15); // vmulax.xyzw acc, vf31, vf15
|
|
c->lqc2(vf1, 288, gp); // lqc2 vf1, 288(gp)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf15); // vmadday.xyzw acc, vf30, vf15
|
|
c->lqc2(vf4, 304, gp); // lqc2 vf4, 304(gp)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf15); // vmaddaz.xyzw acc, vf29, vf15
|
|
c->lqc2(vf2, 784, gp); // lqc2 vf2, 784(gp)
|
|
c->vmadd_bc(DEST::xyzw, BC::w, vf15, vf28, vf0); // vmaddw.xyzw vf15, vf28, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmul(DEST::xyzw, vf16, vf15, vf14); // vmul.xyzw vf16, vf15, vf14
|
|
c->lqc2(vf5, 800, gp); // lqc2 vf5, 800(gp)
|
|
c->vdiv(vf0, BC::w, vf16, BC::w); // vdiv Q, vf0.w, vf16.w
|
|
c->lqc2(vf8, 32, gp); // lqc2 vf8, 32(gp)
|
|
c->lqc2(vf11, 48, gp); // lqc2 vf11, 48(gp)
|
|
c->lqc2(vf7, 320, gp); // lqc2 vf7, 320(gp)
|
|
c->lqc2(vf10, 336, gp); // lqc2 vf10, 336(gp)
|
|
c->lqc2(vf17, 352, gp); // lqc2 vf17, 352(gp)
|
|
c->lqc2(vf18, 368, gp); // lqc2 vf18, 368(gp)
|
|
c->lqc2(vf3, 480, gp); // lqc2 vf3, 480(gp)
|
|
c->lqc2(vf6, 496, gp); // lqc2 vf6, 496(gp)
|
|
c->lqc2(vf9, 512, gp); // lqc2 vf9, 512(gp)
|
|
c->vwaitq(); // vwaitq
|
|
c->vmulq(DEST::xyz, vf15, vf15); // vmulq.xyz vf15, vf15, Q
|
|
c->vmulq(DEST::xyzw, vf16, vf26); // vmulq.xyzw vf16, vf26, Q
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf1, vf1, vf16); // vmulw.xyzw vf1, vf1, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf4, vf4, vf16); // vmulw.xyzw vf4, vf4, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf7, vf7, vf16); // vmulw.xyzw vf7, vf7, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf10, vf10, vf16); // vmulw.xyzw vf10, vf10, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf17, vf17, vf16); // vmulw.xyzw vf17, vf17, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf18, vf18, vf16); // vmulw.xyzw vf18, vf18, vf16
|
|
c->vadd(DEST::xyzw, vf15, vf15, vf25); // vadd.xyzw vf15, vf15, vf25
|
|
c->vadd(DEST::xyz, vf1, vf1, vf15); // vadd.xyz vf1, vf1, vf15
|
|
c->vadd(DEST::xyz, vf4, vf4, vf15); // vadd.xyz vf4, vf4, vf15
|
|
c->vadd(DEST::xyz, vf7, vf7, vf15); // vadd.xyz vf7, vf7, vf15
|
|
c->vadd(DEST::xyz, vf10, vf10, vf15); // vadd.xyz vf10, vf10, vf15
|
|
c->vadd(DEST::xyz, vf17, vf17, vf15); // vadd.xyz vf17, vf17, vf15
|
|
c->vadd(DEST::xyz, vf18, vf18, vf15); // vadd.xyz vf18, vf18, vf15
|
|
c->vftoi4(DEST::xyzw, vf1, vf1); // vftoi4.xyzw vf1, vf1
|
|
c->vftoi4(DEST::xyzw, vf4, vf4); // vftoi4.xyzw vf4, vf4
|
|
c->vftoi4(DEST::xyz, vf7, vf7); // vftoi4.xyz vf7, vf7
|
|
c->vftoi4(DEST::xyzw, vf10, vf10); // vftoi4.xyzw vf10, vf10
|
|
c->vftoi4(DEST::xyzw, vf17, vf17); // vftoi4.xyzw vf17, vf17
|
|
c->vftoi4(DEST::xyzw, vf18, vf18); // vftoi4.xyzw vf18, vf18
|
|
c->sqc2(vf7, 1600, gp); // sqc2 vf7, 1600(gp)
|
|
c->sqc2(vf10, 1616, gp); // sqc2 vf10, 1616(gp)
|
|
c->lw(v1, 1612, gp); // lw v1, 1612(gp)
|
|
c->mtc1(f0, v1); // mtc1 f0, v1
|
|
c->mtc1(f1, r0); // mtc1 f1, r0
|
|
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
|
bc = !cop1_bc; // bc1f L46
|
|
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
|
if (bc) {goto block_6;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
|
|
block_6:
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L47
|
|
c->mov64(v1, v1); // or v1, v1, r0
|
|
goto block_15;
|
|
}
|
|
|
|
block_8:
|
|
c->lw(v1, 1600, gp); // lw v1, 1600(gp)
|
|
c->lw(a0, 556, s5); // lw a0, 556(s5)
|
|
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L47
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_15;
|
|
}
|
|
|
|
block_10:
|
|
c->lw(v1, 1604, gp); // lw v1, 1604(gp)
|
|
c->lw(a0, 560, s5); // lw a0, 560(s5)
|
|
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L47
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_15;
|
|
}
|
|
|
|
block_12:
|
|
c->addiu(v1, r0, 28672); // addiu v1, r0, 28672
|
|
c->lw(a0, 1616, gp); // lw a0, 1616(gp)
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L47
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_15;
|
|
}
|
|
|
|
block_14:
|
|
c->addiu(v1, r0, 29440); // addiu v1, r0, 29440
|
|
c->lw(a0, 1620, gp); // lw a0, 1620(gp)
|
|
c->slt(a0, v1, a0); // slt a0, v1, a0
|
|
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
|
c->movz(v1, s7, a0); // movz v1, s7, a0
|
|
|
|
block_15:
|
|
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L48
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(t0, 4, v1); // lwu t0, 4(v1)
|
|
c->vsub(DEST::z, vf1, vf0, vf0); // vsub.z vf1, vf0, vf0
|
|
c->vsub(DEST::z, vf4, vf0, vf0); // vsub.z vf4, vf0, vf0
|
|
c->vsub(DEST::z, vf7, vf0, vf0); // vsub.z vf7, vf0, vf0
|
|
c->vsub(DEST::z, vf10, vf0, vf0); // vsub.z vf10, vf0, vf0
|
|
c->vsub(DEST::z, vf17, vf0, vf0); // vsub.z vf17, vf0, vf0
|
|
c->vsub(DEST::z, vf18, vf0, vf0); // vsub.z vf18, vf0, vf0
|
|
c->sqc2(vf8, 112, t0); // sqc2 vf8, 112(t0)
|
|
c->sqc2(vf11, 128, t0); // sqc2 vf11, 128(t0)
|
|
c->sqc2(vf3, 144, t0); // sqc2 vf3, 144(t0)
|
|
c->sqc2(vf2, 160, t0); // sqc2 vf2, 160(t0)
|
|
c->sqc2(vf1, 176, t0); // sqc2 vf1, 176(t0)
|
|
c->sqc2(vf5, 192, t0); // sqc2 vf5, 192(t0)
|
|
c->sqc2(vf4, 208, t0); // sqc2 vf4, 208(t0)
|
|
c->sqc2(vf8, 224, t0); // sqc2 vf8, 224(t0)
|
|
c->sqc2(vf11, 240, t0); // sqc2 vf11, 240(t0)
|
|
c->sqc2(vf6, 256, t0); // sqc2 vf6, 256(t0)
|
|
c->sqc2(vf2, 272, t0); // sqc2 vf2, 272(t0)
|
|
c->sqc2(vf7, 288, t0); // sqc2 vf7, 288(t0)
|
|
c->sqc2(vf5, 304, t0); // sqc2 vf5, 304(t0)
|
|
c->sqc2(vf10, 320, t0); // sqc2 vf10, 320(t0)
|
|
c->sqc2(vf8, 448, t0); // sqc2 vf8, 448(t0)
|
|
c->sqc2(vf11, 464, t0); // sqc2 vf11, 464(t0)
|
|
c->sqc2(vf9, 480, t0); // sqc2 vf9, 480(t0)
|
|
c->sqc2(vf2, 496, t0); // sqc2 vf2, 496(t0)
|
|
c->sqc2(vf17, 512, t0); // sqc2 vf17, 512(t0)
|
|
c->sqc2(vf5, 528, t0); // sqc2 vf5, 528(t0)
|
|
c->sqc2(vf18, 544, t0); // sqc2 vf18, 544(t0)
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(s5, 4, v1); // lwu s5, 4(v1)
|
|
c->lq(v1, 0, gp); // lq v1, 0(gp)
|
|
c->sq(v1, 0, s5); // sq v1, 0(s5)
|
|
c->lq(v1, 16, gp); // lq v1, 16(gp)
|
|
c->sq(v1, 16, s5); // sq v1, 16(s5)
|
|
c->daddiu(s4, s5, 32); // daddiu s4, s5, 32
|
|
// TODO - fix c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
|
c->mov64(a0, s4); // or a0, s4, r0
|
|
c->lwu(a1, 16, sp); // lwu a1, 16(sp)
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->addiu(v1, r0, 72); // addiu v1, r0, 72
|
|
c->sd(v1, 64, s4); // sd v1, 64(s4)
|
|
c->lq(v1, 0, gp); // lq v1, 0(gp)
|
|
c->sq(v1, 336, s5); // sq v1, 336(s5)
|
|
c->lq(v1, 16, gp); // lq v1, 16(gp)
|
|
c->sq(v1, 352, s5); // sq v1, 352(s5)
|
|
c->daddiu(s5, s5, 368); // daddiu s5, s5, 368
|
|
// TODO FIX - c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
|
c->mov64(a0, s5); // or a0, s5, r0
|
|
c->lwu(a1, 20, sp); // lwu a1, 20(sp)
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->addiu(v1, r0, 68); // addiu v1, r0, 68
|
|
c->sd(v1, 64, s5); // sd v1, 64(s5)
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
|
c->daddiu(v1, v1, 560); // daddiu v1, v1, 560
|
|
c->lwu(a0, 1916, gp); // lwu a0, 1916(gp)
|
|
c->sw(v1, 4, a0); // sw v1, 4(a0)
|
|
|
|
block_17:
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->lq(gp, 64, sp); // lq gp, 64(sp)
|
|
c->lq(s5, 48, sp); // lq s5, 48(sp)
|
|
c->lq(s4, 32, sp); // lq s4, 32(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 80); // daddiu sp, sp, 80
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
// TODO FIX - cache.adgif_shader<_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
|
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
|
gLinkedFunctionTable.reg("(method 30 sky-work)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_30_sky_work
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace method_29_sky_work {
|
|
struct Cache {
|
|
// TODO - fix void* adgif_shader<_texture_simple; // adgif-shader<-texture-simple!
|
|
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
bool cop1_bc = false;
|
|
c->daddiu(sp, sp, -64); // daddiu sp, sp, -64
|
|
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
|
c->sq(s5, 32, sp); // sq s5, 32(sp)
|
|
c->sq(gp, 48, sp); // sq gp, 48(sp)
|
|
c->mov64(gp, a0); // or gp, a0, r0
|
|
c->mov64(s5, a2); // or s5, a2, r0
|
|
c->sw(a1, 1916, gp); // sw a1, 1916(gp)
|
|
c->load_symbol2(t9, cache.lookup_texture_by_id_fast);// lw t9, lookup-texture-by-id-fast(s7)
|
|
c->lui(v1, 128); // lui v1, 128
|
|
c->ori(a0, v1, 2304); // ori a0, v1, 2304
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->sw(v0, 16, sp); // sw v0, 16(sp)
|
|
c->lwu(v1, 16, sp); // lwu v1, 16(sp)
|
|
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L52
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
if (bc) {goto block_14;} // branch non-likely
|
|
|
|
c->lqc2(vf15, 1248, gp); // lqc2 vf15, 1248(gp)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf15); // vmulax.xyzw acc, vf31, vf15
|
|
c->lqc2(vf1, 256, gp); // lqc2 vf1, 256(gp)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf15); // vmadday.xyzw acc, vf30, vf15
|
|
c->lqc2(vf4, 272, gp); // lqc2 vf4, 272(gp)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf15); // vmaddaz.xyzw acc, vf29, vf15
|
|
c->lqc2(vf2, 784, gp); // lqc2 vf2, 784(gp)
|
|
c->vmadd_bc(DEST::xyzw, BC::w, vf15, vf28, vf0); // vmaddw.xyzw vf15, vf28, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmul(DEST::xyzw, vf16, vf15, vf14); // vmul.xyzw vf16, vf15, vf14
|
|
c->lqc2(vf5, 800, gp); // lqc2 vf5, 800(gp)
|
|
c->vdiv(vf0, BC::w, vf16, BC::w); // vdiv Q, vf0.w, vf16.w
|
|
c->lqc2(vf8, 32, gp); // lqc2 vf8, 32(gp)
|
|
c->lqc2(vf11, 48, gp); // lqc2 vf11, 48(gp)
|
|
c->lqc2(vf3, 448, gp); // lqc2 vf3, 448(gp)
|
|
c->lqc2(vf6, 464, gp); // lqc2 vf6, 464(gp)
|
|
c->vwaitq(); // vwaitq
|
|
c->vmulq(DEST::xyz, vf15, vf15); // vmulq.xyz vf15, vf15, Q
|
|
c->vmulq(DEST::xyzw, vf16, vf26); // vmulq.xyzw vf16, vf26, Q
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf1, vf1, vf16); // vmulw.xyzw vf1, vf1, vf16
|
|
c->vmul_bc(DEST::xyzw, BC::w, vf4, vf4, vf16); // vmulw.xyzw vf4, vf4, vf16
|
|
c->vadd(DEST::xyzw, vf15, vf15, vf25); // vadd.xyzw vf15, vf15, vf25
|
|
c->vadd(DEST::xyz, vf1, vf1, vf15); // vadd.xyz vf1, vf1, vf15
|
|
c->vadd(DEST::xyz, vf4, vf4, vf15); // vadd.xyz vf4, vf4, vf15
|
|
c->vftoi4(DEST::xyz, vf1, vf1); // vftoi4.xyz vf1, vf1
|
|
c->vftoi4(DEST::xyzw, vf4, vf4); // vftoi4.xyzw vf4, vf4
|
|
c->sqc2(vf1, 1600, gp); // sqc2 vf1, 1600(gp)
|
|
c->sqc2(vf4, 1616, gp); // sqc2 vf4, 1616(gp)
|
|
c->lw(v1, 1612, gp); // lw v1, 1612(gp)
|
|
c->mtc1(f0, v1); // mtc1 f0, v1
|
|
c->mtc1(f1, r0); // mtc1 f1, r0
|
|
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
|
bc = !cop1_bc; // bc1f L50
|
|
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
|
|
block_3:
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L51
|
|
c->mov64(v1, v1); // or v1, v1, r0
|
|
goto block_12;
|
|
}
|
|
|
|
block_5:
|
|
c->lw(v1, 1600, gp); // lw v1, 1600(gp)
|
|
c->lw(a0, 556, s5); // lw a0, 556(s5)
|
|
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L51
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_12;
|
|
}
|
|
|
|
block_7:
|
|
c->lw(v1, 1604, gp); // lw v1, 1604(gp)
|
|
c->lw(a0, 560, s5); // lw a0, 560(s5)
|
|
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L51
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_12;
|
|
}
|
|
|
|
block_9:
|
|
c->addiu(v1, r0, 28672); // addiu v1, r0, 28672
|
|
c->lw(a0, 1616, gp); // lw a0, 1616(gp)
|
|
c->slt(v1, v1, a0); // slt v1, v1, a0
|
|
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
|
c->movz(a0, s7, v1); // movz a0, s7, v1
|
|
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L51
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
goto block_12;
|
|
}
|
|
|
|
block_11:
|
|
c->addiu(v1, r0, 29440); // addiu v1, r0, 29440
|
|
c->lw(a0, 1620, gp); // lw a0, 1620(gp)
|
|
c->slt(a0, v1, a0); // slt a0, v1, a0
|
|
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
|
c->movz(v1, s7, a0); // movz v1, s7, a0
|
|
|
|
block_12:
|
|
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L52
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
if (bc) {goto block_14;} // branch non-likely
|
|
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(t0, 4, v1); // lwu t0, 4(v1)
|
|
c->vsub(DEST::z, vf1, vf0, vf0); // vsub.z vf1, vf0, vf0
|
|
c->vsub(DEST::z, vf4, vf0, vf0); // vsub.z vf4, vf0, vf0
|
|
c->sqc2(vf8, 112, t0); // sqc2 vf8, 112(t0)
|
|
c->sqc2(vf11, 128, t0); // sqc2 vf11, 128(t0)
|
|
c->sqc2(vf3, 144, t0); // sqc2 vf3, 144(t0)
|
|
c->sqc2(vf2, 160, t0); // sqc2 vf2, 160(t0)
|
|
c->sqc2(vf1, 176, t0); // sqc2 vf1, 176(t0)
|
|
c->sqc2(vf5, 192, t0); // sqc2 vf5, 192(t0)
|
|
c->sqc2(vf4, 208, t0); // sqc2 vf4, 208(t0)
|
|
c->sqc2(vf8, 224, t0); // sqc2 vf8, 224(t0)
|
|
c->sqc2(vf11, 240, t0); // sqc2 vf11, 240(t0)
|
|
c->sqc2(vf6, 256, t0); // sqc2 vf6, 256(t0)
|
|
c->sqc2(vf2, 272, t0); // sqc2 vf2, 272(t0)
|
|
c->sqc2(vf1, 288, t0); // sqc2 vf1, 288(t0)
|
|
c->sqc2(vf5, 304, t0); // sqc2 vf5, 304(t0)
|
|
c->sqc2(vf4, 320, t0); // sqc2 vf4, 320(t0)
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
|
c->lq(a0, 0, gp); // lq a0, 0(gp)
|
|
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
|
c->lq(a0, 16, gp); // lq a0, 16(gp)
|
|
c->sq(a0, 16, v1); // sq a0, 16(v1)
|
|
c->daddiu(s5, v1, 32); // daddiu s5, v1, 32
|
|
// TODO fix - c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
|
c->mov64(a0, s5); // or a0, s5, r0
|
|
c->lwu(a1, 16, sp); // lwu a1, 16(sp)
|
|
call_addr = c->gprs[t9].du32[0]; // function call:
|
|
c->sll(v0, ra, 0); // sll v0, ra, 0
|
|
c->jalr(call_addr); // jalr ra, t9
|
|
c->addiu(v1, r0, 72); // addiu v1, r0, 72
|
|
c->sd(v1, 64, s5); // sd v1, 64(s5)
|
|
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
|
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
|
c->daddiu(v1, v1, 336); // daddiu v1, v1, 336
|
|
c->lwu(a0, 1916, gp); // lwu a0, 1916(gp)
|
|
c->sw(v1, 4, a0); // sw v1, 4(a0)
|
|
|
|
block_14:
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
|
c->lq(gp, 48, sp); // lq gp, 48(sp)
|
|
c->lq(s5, 32, sp); // lq s5, 32(sp)
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 64); // daddiu sp, sp, 64
|
|
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() {
|
|
// TODO - fix cache.adgif_shader<_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
|
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
|
gLinkedFunctionTable.reg("(method 29 sky-work)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_29_sky_work
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace method_17_sky_work {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->daddiu(sp, sp, -32); // daddiu sp, sp, -32
|
|
c->lwu(a2, 176, a1); // lwu a2, 176(a1)
|
|
c->daddiu(v1, a0, 1472); // daddiu v1, a0, 1472
|
|
c->lqc2(vf31, 0, v1); // lqc2 vf31, 0(v1)
|
|
c->lqc2(vf30, 16, v1); // lqc2 vf30, 16(v1)
|
|
c->lqc2(vf29, 32, v1); // lqc2 vf29, 32(v1)
|
|
c->lqc2(vf28, 48, v1); // lqc2 vf28, 48(v1)
|
|
c->lqc2(vf14, 780, a2); // lqc2 vf14, 780(a2)
|
|
c->lqc2(vf25, 812, a2); // lqc2 vf25, 812(a2)
|
|
c->lqc2(vf13, 1024, a0); // lqc2 vf13, 1024(a0)
|
|
c->vmove(DEST::z, vf25, vf0); // vmove.z vf25, vf0
|
|
c->vmove(DEST::xyzw, vf23, vf0); // vmove.xyzw vf23, vf0
|
|
c->daddiu(v1, sp, 16); // daddiu v1, sp, 16
|
|
c->sq(r0, 0, v1); // sq r0, 0(v1)
|
|
c->lui(a0, 16256); // lui a0, 16256
|
|
c->mtc1(f0, a0); // mtc1 f0, a0
|
|
c->lui(a0, 17974); // lui a0, 17974
|
|
c->ori(a0, a0, 2913); // ori a0, a0, 2913
|
|
c->mtc1(f1, a0); // mtc1 f1, a0
|
|
c->lwc1(f2, 8, a2); // lwc1 f2, 8(a2)
|
|
c->divs(f1, f1, f2); // div.s f1, f1, f2
|
|
c->mins(f0, f0, f1); // min.s f0, f0, f1
|
|
c->swc1(f0, 12, v1); // swc1 f0, 12(v1)
|
|
c->lqc2(vf26, 0, v1); // lqc2 vf26, 0(v1)
|
|
c->mov128_gpr_vf(v1, vf26); // qmfc2.i v1, vf26
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 32); // daddiu sp, sp, 32
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("(method 17 sky-work)", execute, 256);
|
|
}
|
|
|
|
} // namespace method_17_sky_work
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace render_sky_tri {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
void* draw_large_polygon; // draw-large-polygon
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
get_fake_spad_addr2(t5, cache.fake_scratchpad_data, 0, c);// lui t5, 28672
|
|
c->ori(t5, t5, 12288); // ori t5, t5, 12288
|
|
get_fake_spad_addr2(t6, cache.fake_scratchpad_data, 0, c);// lui t6, 28672
|
|
c->ori(t6, t6, 14336); // ori t6, t6, 14336
|
|
c->mov64(t0, t5); // or t0, t5, r0
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0)
|
|
c->addiu(t1, r0, 3); // addiu t1, r0, 3
|
|
c->lqc2(vf2, 16, a0); // lqc2 vf2, 16(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, a0); // lqc2 vf3, 32(a0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf1); // vmulax.xyzw acc, vf31, vf1
|
|
c->lqc2(vf4, 48, a0); // lqc2 vf4, 48(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf1); // vmadday.xyzw acc, vf30, vf1
|
|
c->lqc2(vf5, 64, a0); // lqc2 vf5, 64(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf1); // vmaddaz.xyzw acc, vf29, vf1
|
|
c->lqc2(vf6, 80, a0); // lqc2 vf6, 80(a0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf1, vf28, vf1); // vmaddw.xyw vf1, vf28, vf1
|
|
c->lqc2(vf7, 96, a0); // lqc2 vf7, 96(a0)
|
|
c->vmove(DEST::z, vf1, vf0); // vmove.z vf1, vf0
|
|
c->lqc2(vf8, 112, a0); // lqc2 vf8, 112(a0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf4); // vmulax.xyzw acc, vf31, vf4
|
|
c->lqc2(vf9, 128, a0); // lqc2 vf9, 128(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf4); // vmadday.xyzw acc, vf30, vf4
|
|
c->sqc2(vf2, 16, t0); // sqc2 vf2, 16(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf4); // vmaddaz.xyzw acc, vf29, vf4
|
|
c->sqc2(vf3, 32, t0); // sqc2 vf3, 32(t0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf4, vf28, vf4); // vmaddw.xyw vf4, vf28, vf4
|
|
c->sqc2(vf5, 64, t0); // sqc2 vf5, 64(t0)
|
|
c->vmove(DEST::z, vf4, vf0); // vmove.z vf4, vf0
|
|
c->sqc2(vf6, 80, t0); // sqc2 vf6, 80(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf7); // vmulax.xyzw acc, vf31, vf7
|
|
c->sqc2(vf8, 112, t0); // sqc2 vf8, 112(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf7); // vmadday.xyzw acc, vf30, vf7
|
|
c->sqc2(vf9, 128, t0); // sqc2 vf9, 128(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf7); // vmaddaz.xyzw acc, vf29, vf7
|
|
c->sqc2(vf2, 160, t0); // sqc2 vf2, 160(t0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf7, vf28, vf7); // vmaddw.xyw vf7, vf28, vf7
|
|
c->sqc2(vf3, 176, t0); // sqc2 vf3, 176(t0)
|
|
c->vmove(DEST::z, vf7, vf0); // vmove.z vf7, vf0
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf1, 144, t0); // sqc2 vf1, 144(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf4, 48, t0); // sqc2 vf4, 48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, 96, t0); // sqc2 vf7, 96(t0)
|
|
c->load_symbol2(t9, cache.draw_large_polygon); // lw t9, draw-large-polygon(s7)
|
|
// Unknown instr: jr t9
|
|
draw_large_polygon::execute(ctxt);
|
|
// nop // sll r0, r0, 0
|
|
//jr ra // jr ra
|
|
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
|
cache.draw_large_polygon = intern_from_c(-1, 0, "draw-large-polygon").c();
|
|
gLinkedFunctionTable.reg("render-sky-tri", execute, 256);
|
|
}
|
|
|
|
} // namespace render_sky_tri
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace render_sky_quad {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
void* draw_large_polygon; // draw-large-polygon
|
|
} cache;
|
|
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->mov64(v1, a0); // or v1, a0, r0
|
|
c->mov64(v1, a2); // or v1, a2, r0
|
|
c->lqc2(vf14, 780, a2); // lqc2 vf14, 780(a2)
|
|
get_fake_spad_addr2(t5, cache.fake_scratchpad_data, 0, c);// lui t5, 28672
|
|
c->ori(t5, t5, 12288); // ori t5, t5, 12288
|
|
get_fake_spad_addr2(t6, cache.fake_scratchpad_data, 0, c);// lui t6, 28672
|
|
c->ori(t6, t6, 14336); // ori t6, t6, 14336
|
|
c->mov64(t0, t5); // or t0, t5, r0
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf1, 0, a0); // lqc2 vf1, 0(a0)
|
|
c->addiu(t1, r0, 4); // addiu t1, r0, 4
|
|
c->lqc2(vf2, 16, a0); // lqc2 vf2, 16(a0)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, a0); // lqc2 vf3, 32(a0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf1); // vmulax.xyzw acc, vf31, vf1
|
|
c->lqc2(vf4, 48, a0); // lqc2 vf4, 48(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf1); // vmadday.xyzw acc, vf30, vf1
|
|
c->lqc2(vf5, 64, a0); // lqc2 vf5, 64(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf1); // vmaddaz.xyzw acc, vf29, vf1
|
|
c->lqc2(vf6, 80, a0); // lqc2 vf6, 80(a0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf1, vf28, vf1); // vmaddw.xyw vf1, vf28, vf1
|
|
c->lqc2(vf7, 96, a0); // lqc2 vf7, 96(a0)
|
|
c->vmove(DEST::z, vf1, vf0); // vmove.z vf1, vf0
|
|
c->lqc2(vf8, 112, a0); // lqc2 vf8, 112(a0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf4); // vmulax.xyzw acc, vf31, vf4
|
|
c->lqc2(vf9, 128, a0); // lqc2 vf9, 128(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf4); // vmadday.xyzw acc, vf30, vf4
|
|
c->lqc2(vf10, 144, a0); // lqc2 vf10, 144(a0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf4); // vmaddaz.xyzw acc, vf29, vf4
|
|
c->lqc2(vf11, 160, a0); // lqc2 vf11, 160(a0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf4, vf28, vf4); // vmaddw.xyw vf4, vf28, vf4
|
|
c->lqc2(vf12, 176, a0); // lqc2 vf12, 176(a0)
|
|
c->vmove(DEST::z, vf4, vf0); // vmove.z vf4, vf0
|
|
c->sqc2(vf2, 16, t0); // sqc2 vf2, 16(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf7); // vmulax.xyzw acc, vf31, vf7
|
|
c->sqc2(vf3, 32, t0); // sqc2 vf3, 32(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf7); // vmadday.xyzw acc, vf30, vf7
|
|
c->sqc2(vf5, 64, t0); // sqc2 vf5, 64(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf7); // vmaddaz.xyzw acc, vf29, vf7
|
|
c->sqc2(vf6, 80, t0); // sqc2 vf6, 80(t0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf7, vf28, vf7); // vmaddw.xyw vf7, vf28, vf7
|
|
c->sqc2(vf8, 112, t0); // sqc2 vf8, 112(t0)
|
|
c->vmove(DEST::z, vf7, vf0); // vmove.z vf7, vf0
|
|
c->sqc2(vf9, 128, t0); // sqc2 vf9, 128(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf10); // vmulax.xyzw acc, vf31, vf10
|
|
c->sqc2(vf11, 160, t0); // sqc2 vf11, 160(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf10); // vmadday.xyzw acc, vf30, vf10
|
|
c->sqc2(vf12, 176, t0); // sqc2 vf12, 176(t0)
|
|
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf10); // vmaddaz.xyzw acc, vf29, vf10
|
|
c->sqc2(vf2, 208, t0); // sqc2 vf2, 208(t0)
|
|
c->vmadd_bc(DEST::xyw, BC::w, vf10, vf28, vf10); // vmaddw.xyw vf10, vf28, vf10
|
|
c->sqc2(vf3, 224, t0); // sqc2 vf3, 224(t0)
|
|
c->vmove(DEST::z, vf10, vf0); // vmove.z vf10, vf0
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf1, 192, t0); // sqc2 vf1, 192(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf4, 48, t0); // sqc2 vf4, 48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, 96, t0); // sqc2 vf7, 96(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf10, 144, t0); // sqc2 vf10, 144(t0)
|
|
c->load_symbol2(t9, cache.draw_large_polygon); // lw t9, draw-large-polygon(s7)
|
|
// Unknown instr: jr t9
|
|
draw_large_polygon::execute(ctxt);
|
|
// nop // sll r0, r0, 0
|
|
//jr ra // jr ra
|
|
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
|
goto end_of_function; // return
|
|
|
|
// nop // sll r0, r0, 0
|
|
// nop // sll r0, r0, 0
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
|
cache.draw_large_polygon = intern_from_c(-1, 0, "draw-large-polygon").c();
|
|
gLinkedFunctionTable.reg("render-sky-quad", execute, 256);
|
|
}
|
|
|
|
} // namespace render_sky_quad
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace clip_polygon_against_negative_hyperplane {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
bool cop1_bc = false;
|
|
// nop // sll r0, r0, 0
|
|
c->mov64(t2, t1); // or t2, t1, r0
|
|
c->addiu(t1, r0, 0); // addiu t1, r0, 0
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->mov64(t4, t0); // or t4, t0, r0
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->negs(f0, f0); // neg.s f0, f0
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a3); // lqc2 vf2, 16(a3)
|
|
cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
bc = !cop1_bc; // bc1f L106
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_9;} // branch non-likely
|
|
|
|
|
|
block_1:
|
|
c->lwc1(f2, 12, a3); // lwc1 f2, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lwc1(f3, 0, t3); // lwc1 f3, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lqc2(vf4, 0, a3); // lqc2 vf4, 0(a3)
|
|
c->negs(f2, f2); // neg.s f2, f2
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf5, 16, a3); // lqc2 vf5, 16(a3)
|
|
cop1_bc = c->fprs[f3] < c->fprs[f2]; // c.lt.s f3, f2
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
bc = !cop1_bc; // bc1f L104
|
|
c->lqc2(vf6, -16, a3); // lqc2 vf6, -16(a3)
|
|
if (bc) {goto block_6;} // branch non-likely
|
|
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L110
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_3:
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->negs(f0, f0); // neg.s f0, f0
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a3); // lqc2 vf2, 16(a3)
|
|
cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
bc = !cop1_bc; // bc1f L105
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_8;} // branch non-likely
|
|
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L102
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
//beq r0, r0, L110 // beq r0, r0, L110
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_6:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf4, vf1); // vsub.xyzw vf7, vf4, vf1
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf5, vf2); // vsub.xyzw vf8, vf5, vf2
|
|
c->subs(f5, f7, f8); // sub.s f5, f7, f8
|
|
c->vsub(DEST::xyzw, vf9, vf6, vf3); // vsub.xyzw vf9, vf6, vf3
|
|
c->divs(f6, f7, f5); // div.s f6, f7, f5
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf1, vf0); // vmulaw.xyzw acc, vf1, vf0
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf2, vf0); // vmulaw.xyzw acc, vf2, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L107
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_11;} // branch non-likely
|
|
|
|
//beq r0, r0, L110 // beq r0, r0, L110
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_8:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf1, vf4); // vsub.xyzw vf7, vf1, vf4
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf2, vf5); // vsub.xyzw vf8, vf2, vf5
|
|
c->subs(f5, f8, f7); // sub.s f5, f8, f7
|
|
c->vsub(DEST::xyzw, vf9, vf3, vf6); // vsub.xyzw vf9, vf3, vf6
|
|
c->divs(f6, f8, f5); // div.s f6, f8, f5
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf5, vf0); // vmulaw.xyzw acc, vf5, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L110
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_9:
|
|
c->lwc1(f2, 12, a3); // lwc1 f2, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lwc1(f3, 0, t3); // lwc1 f3, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lqc2(vf4, 0, a3); // lqc2 vf4, 0(a3)
|
|
c->negs(f2, f2); // neg.s f2, f2
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf5, 16, a3); // lqc2 vf5, 16(a3)
|
|
cop1_bc = c->fprs[f3] < c->fprs[f2]; // c.lt.s f3, f2
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
bc = cop1_bc; // bc1t L108
|
|
c->lqc2(vf6, -16, a3); // lqc2 vf6, -16(a3)
|
|
if (bc) {goto block_14;} // branch non-likely
|
|
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->sqc2(vf2, -32, t0); // sqc2 vf2, -32(t0)
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L110
|
|
c->sqc2(vf3, -16, t0); // sqc2 vf3, -16(t0)
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_11:
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->negs(f0, f0); // neg.s f0, f0
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, a3); // lqc2 vf2, 16(a3)
|
|
cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
bc = cop1_bc; // bc1t L109
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_16;} // branch non-likely
|
|
|
|
c->sqc2(vf4, 0, t0); // sqc2 vf4, 0(t0)
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->sqc2(vf5, -32, t0); // sqc2 vf5, -32(t0)
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L106
|
|
c->sqc2(vf6, -16, t0); // sqc2 vf6, -16(t0)
|
|
if (bc) {goto block_9;} // branch non-likely
|
|
|
|
//beq r0, r0, L110 // beq r0, r0, L110
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_14:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf1, vf4); // vsub.xyzw vf7, vf1, vf4
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf2, vf5); // vsub.xyzw vf8, vf2, vf5
|
|
c->subs(f5, f8, f7); // sub.s f5, f8, f7
|
|
c->vsub(DEST::xyzw, vf9, vf3, vf6); // vsub.xyzw vf9, vf3, vf6
|
|
c->divs(f6, f8, f5); // div.s f6, f8, f5
|
|
c->daddiu(t0, t0, 96); // daddiu t0, t0, 96
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->sqc2(vf1, -96, t0); // sqc2 vf1, -96(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->sqc2(vf2, -80, t0); // sqc2 vf2, -80(t0)
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
c->sqc2(vf3, -64, t0); // sqc2 vf3, -64(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf5, vf0); // vmulaw.xyzw acc, vf5, vf0
|
|
c->daddiu(t1, t1, 2); // daddiu t1, t1, 2
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L103
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
//beq r0, r0, L110 // beq r0, r0, L110
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_16:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf4, vf1); // vsub.xyzw vf7, vf4, vf1
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf5, vf2); // vsub.xyzw vf8, vf5, vf2
|
|
c->subs(f5, f7, f8); // sub.s f5, f7, f8
|
|
c->vsub(DEST::xyzw, vf9, vf6, vf3); // vsub.xyzw vf9, vf6, vf3
|
|
c->divs(f6, f7, f5); // div.s f6, f7, f5
|
|
c->daddiu(t0, t0, 96); // daddiu t0, t0, 96
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->sqc2(vf4, -96, t0); // sqc2 vf4, -96(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf1, vf0); // vmulaw.xyzw acc, vf1, vf0
|
|
c->sqc2(vf5, -80, t0); // sqc2 vf5, -80(t0)
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
c->sqc2(vf6, -64, t0); // sqc2 vf6, -64(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf2, vf0); // vmulaw.xyzw acc, vf2, vf0
|
|
c->daddiu(t1, t1, 2); // daddiu t1, t1, 2
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L102
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
|
|
block_17:
|
|
c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf2, 16, t0); // sqc2 vf2, 16(t0)
|
|
// nop // sll r0, r0, 0
|
|
//jr ra // jr ra
|
|
c->sqc2(vf3, 32, t0); // sqc2 vf3, 32(t0)
|
|
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];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("clip-polygon-against-negative-hyperplane", execute, 256);
|
|
}
|
|
|
|
} // namespace clip_polygon_against_negative_hyperplane
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace clip_polygon_against_positive_hyperplane {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
bool cop1_bc = false;
|
|
// nop // sll r0, r0, 0
|
|
c->mov64(t2, t1); // or t2, t1, r0
|
|
c->addiu(t1, r0, 0); // addiu t1, r0, 0
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->mov64(t4, t0); // or t4, t0, r0
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
|
c->lqc2(vf2, -32, a3); // lqc2 vf2, -32(a3)
|
|
bc = !cop1_bc; // bc1f L116
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_9;} // branch non-likely
|
|
|
|
|
|
block_1:
|
|
c->lwc1(f3, 0, t3); // lwc1 f3, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lwc1(f2, 12, a3); // lwc1 f2, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lqc2(vf4, 0, a3); // lqc2 vf4, 0(a3)
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
cop1_bc = c->fprs[f2] < c->fprs[f3]; // c.lt.s f2, f3
|
|
c->lqc2(vf5, -32, a3); // lqc2 vf5, -32(a3)
|
|
bc = !cop1_bc; // bc1f L114
|
|
c->lqc2(vf6, -16, a3); // lqc2 vf6, -16(a3)
|
|
if (bc) {goto block_6;} // branch non-likely
|
|
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L120
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_3:
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
|
c->lqc2(vf2, -32, a3); // lqc2 vf2, -32(a3)
|
|
bc = !cop1_bc; // bc1f L115
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_8;} // branch non-likely
|
|
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L112
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
//beq r0, r0, L120 // beq r0, r0, L120
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_6:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf4, vf1); // vsub.xyzw vf7, vf4, vf1
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf5, vf2); // vsub.xyzw vf8, vf5, vf2
|
|
c->subs(f5, f7, f8); // sub.s f5, f7, f8
|
|
c->vsub(DEST::xyzw, vf9, vf6, vf3); // vsub.xyzw vf9, vf6, vf3
|
|
c->divs(f6, f7, f5); // div.s f6, f7, f5
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf1, vf0); // vmulaw.xyzw acc, vf1, vf0
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf2, vf0); // vmulaw.xyzw acc, vf2, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L117
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_11;} // branch non-likely
|
|
|
|
//beq r0, r0, L120 // beq r0, r0, L120
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_8:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf1, vf4); // vsub.xyzw vf7, vf1, vf4
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf2, vf5); // vsub.xyzw vf8, vf2, vf5
|
|
c->subs(f5, f8, f7); // sub.s f5, f8, f7
|
|
c->vsub(DEST::xyzw, vf9, vf3, vf6); // vsub.xyzw vf9, vf3, vf6
|
|
c->divs(f6, f8, f5); // div.s f6, f8, f5
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf5, vf0); // vmulaw.xyzw acc, vf5, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L120
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_9:
|
|
c->lwc1(f3, 0, t3); // lwc1 f3, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lwc1(f2, 12, a3); // lwc1 f2, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lqc2(vf4, 0, a3); // lqc2 vf4, 0(a3)
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
cop1_bc = c->fprs[f2] < c->fprs[f3]; // c.lt.s f2, f3
|
|
c->lqc2(vf5, -32, a3); // lqc2 vf5, -32(a3)
|
|
bc = cop1_bc; // bc1t L118
|
|
c->lqc2(vf6, -16, a3); // lqc2 vf6, -16(a3)
|
|
if (bc) {goto block_14;} // branch non-likely
|
|
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->sqc2(vf2, -32, t0); // sqc2 vf2, -32(t0)
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
bc = c->sgpr64(t2) == 0; // beq t2, r0, L120
|
|
c->sqc2(vf3, -16, t0); // sqc2 vf3, -16(t0)
|
|
if (bc) {goto block_17;} // branch non-likely
|
|
|
|
|
|
block_11:
|
|
c->lwc1(f1, 0, t3); // lwc1 f1, 0(t3)
|
|
c->daddiu(t3, t3, 48); // daddiu t3, t3, 48
|
|
c->lwc1(f0, 12, a3); // lwc1 f0, 12(a3)
|
|
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
|
c->lqc2(vf1, 0, a3); // lqc2 vf1, 0(a3)
|
|
c->daddiu(a3, a3, 48); // daddiu a3, a3, 48
|
|
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
|
c->lqc2(vf2, -32, a3); // lqc2 vf2, -32(a3)
|
|
bc = cop1_bc; // bc1t L119
|
|
c->lqc2(vf3, -16, a3); // lqc2 vf3, -16(a3)
|
|
if (bc) {goto block_16;} // branch non-likely
|
|
|
|
c->sqc2(vf4, 0, t0); // sqc2 vf4, 0(t0)
|
|
c->daddiu(t0, t0, 48); // daddiu t0, t0, 48
|
|
c->sqc2(vf5, -32, t0); // sqc2 vf5, -32(t0)
|
|
c->daddiu(t1, t1, 1); // daddiu t1, t1, 1
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L116
|
|
c->sqc2(vf6, -16, t0); // sqc2 vf6, -16(t0)
|
|
if (bc) {goto block_9;} // branch non-likely
|
|
|
|
//beq r0, r0, L120 // beq r0, r0, L120
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_14:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf1, vf4); // vsub.xyzw vf7, vf1, vf4
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf2, vf5); // vsub.xyzw vf8, vf2, vf5
|
|
c->subs(f5, f8, f7); // sub.s f5, f8, f7
|
|
c->vsub(DEST::xyzw, vf9, vf3, vf6); // vsub.xyzw vf9, vf3, vf6
|
|
c->divs(f6, f8, f5); // div.s f6, f8, f5
|
|
c->daddiu(t0, t0, 96); // daddiu t0, t0, 96
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->sqc2(vf1, -96, t0); // sqc2 vf1, -96(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
|
c->sqc2(vf2, -80, t0); // sqc2 vf2, -80(t0)
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
c->sqc2(vf3, -64, t0); // sqc2 vf3, -64(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf5, vf0); // vmulaw.xyzw acc, vf5, vf0
|
|
c->daddiu(t1, t1, 2); // daddiu t1, t1, 2
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf6, vf0); // vmulaw.xyzw acc, vf6, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L113
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
//beq r0, r0, L120 // beq r0, r0, L120
|
|
// nop // sll r0, r0, 0
|
|
goto block_17; // branch always
|
|
|
|
|
|
block_16:
|
|
c->subs(f7, f0, f1); // sub.s f7, f0, f1
|
|
c->vsub(DEST::xyzw, vf7, vf4, vf1); // vsub.xyzw vf7, vf4, vf1
|
|
c->subs(f8, f2, f3); // sub.s f8, f2, f3
|
|
c->vsub(DEST::xyzw, vf8, vf5, vf2); // vsub.xyzw vf8, vf5, vf2
|
|
c->subs(f5, f7, f8); // sub.s f5, f7, f8
|
|
c->vsub(DEST::xyzw, vf9, vf6, vf3); // vsub.xyzw vf9, vf6, vf3
|
|
c->divs(f6, f7, f5); // div.s f6, f7, f5
|
|
c->daddiu(t0, t0, 96); // daddiu t0, t0, 96
|
|
c->mfc1(v1, f6); // mfc1 v1, f6
|
|
c->mov128_vf_gpr(vf10, v1); // qmtc2.i vf10, v1
|
|
c->sqc2(vf4, -96, t0); // sqc2 vf4, -96(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf1, vf0); // vmulaw.xyzw acc, vf1, vf0
|
|
c->sqc2(vf5, -80, t0); // sqc2 vf5, -80(t0)
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf7, vf7, vf10); // vmaddx.xyzw vf7, vf7, vf10
|
|
c->sqc2(vf6, -64, t0); // sqc2 vf6, -64(t0)
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf2, vf0); // vmulaw.xyzw acc, vf2, vf0
|
|
c->daddiu(t1, t1, 2); // daddiu t1, t1, 2
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf8, vf8, vf10); // vmaddx.xyzw vf8, vf8, vf10
|
|
c->daddiu(t7, s7, 4); // daddiu t7, s7, 4
|
|
c->vmula_bc(DEST::xyzw, BC::w, vf3, vf0); // vmulaw.xyzw acc, vf3, vf0
|
|
// nop // sll r0, r0, 0
|
|
c->vmadd_bc(DEST::xyzw, BC::x, vf9, vf9, vf10); // vmaddx.xyzw vf9, vf9, vf10
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf7, -48, t0); // sqc2 vf7, -48(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf8, -32, t0); // sqc2 vf8, -32(t0)
|
|
// nop // sll r0, r0, 0
|
|
bc = c->sgpr64(t2) != 0; // bne t2, r0, L112
|
|
c->sqc2(vf9, -16, t0); // sqc2 vf9, -16(t0)
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
|
|
block_17:
|
|
c->lqc2(vf1, 0, t4); // lqc2 vf1, 0(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->lqc2(vf3, 32, t4); // lqc2 vf3, 32(t4)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf1, 0, t0); // sqc2 vf1, 0(t0)
|
|
// nop // sll r0, r0, 0
|
|
c->sqc2(vf2, 16, t0); // sqc2 vf2, 16(t0)
|
|
// nop // sll r0, r0, 0
|
|
//jr ra // jr ra
|
|
c->sqc2(vf3, 32, t0); // sqc2 vf3, 32(t0)
|
|
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];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("clip-polygon-against-positive-hyperplane", execute, 256);
|
|
}
|
|
|
|
} // namespace clip_polygon_against_positive_hyperplane
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jakx/kscheme.h"
|
|
using ::jakx::intern_from_c;
|
|
namespace Mips2C::jakx {
|
|
namespace set_tex_offset {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
u32 call_addr = 0;
|
|
c->daddiu(sp, sp, -32); // daddiu sp, sp, -32
|
|
c->daddiu(v1, sp, 16); // daddiu v1, sp, 16
|
|
c->sq(r0, 0, v1); // sq r0, 0(v1)
|
|
c->lui(a2, 14208); // lui a2, 14208
|
|
c->mtc1(f0, a2); // mtc1 f0, a2
|
|
c->mtc1(f1, a0); // mtc1 f1, a0
|
|
c->cvtsw(f1, f1); // cvt.s.w f1, f1
|
|
c->muls(f0, f0, f1); // mul.s f0, f0, f1
|
|
c->swc1(f0, 0, v1); // swc1 f0, 0(v1)
|
|
c->lui(a0, 14208); // lui a0, 14208
|
|
c->mtc1(f0, a0); // mtc1 f0, a0
|
|
c->mtc1(f1, a1); // mtc1 f1, a1
|
|
c->cvtsw(f1, f1); // cvt.s.w f1, f1
|
|
c->muls(f0, f0, f1); // mul.s f0, f0, f1
|
|
c->swc1(f0, 4, v1); // swc1 f0, 4(v1)
|
|
c->mtc1(f0, r0); // mtc1 f0, r0
|
|
c->swc1(f0, 8, v1); // swc1 f0, 8(v1)
|
|
c->mtc1(f0, r0); // mtc1 f0, r0
|
|
c->swc1(f0, 12, v1); // swc1 f0, 12(v1)
|
|
c->lqc2(vf24, 0, v1); // lqc2 vf24, 0(v1)
|
|
c->mov128_gpr_vf(v1, vf24); // qmfc2.i v1, vf24
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//jr ra // jr ra
|
|
c->daddiu(sp, sp, 32); // daddiu sp, sp, 32
|
|
goto end_of_function; // return
|
|
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("set-tex-offset", execute, 256);
|
|
}
|
|
|
|
} // namespace set_tex_offset
|
|
} // namespace Mips2C
|