mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
188 lines
11 KiB
C++
188 lines
11 KiB
C++
|
//--------------------------MIPS2C---------------------
|
||
|
// clang-format off
|
||
|
#include "game/mips2c/mips2c_private.h"
|
||
|
#include "game/kernel/jak2/kscheme.h"
|
||
|
using ::jak2::intern_from_c;
|
||
|
namespace Mips2C::jak2 {
|
||
|
namespace adgif_shader_texture_with_update {
|
||
|
u64 execute(void* ctxt) {
|
||
|
auto* c = (ExecutionContext*)ctxt;
|
||
|
bool bc = false;
|
||
|
c->ld(a2, 16, a0); // ld a2, 16(a0)
|
||
|
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
||
|
c->andi(a2, a2, 513); // andi a2, a2, 513
|
||
|
c->mtc1(f0, v1); // mtc1 f0, v1
|
||
|
c->cvtsw(f0, f0); // cvt.s.w f0, f0
|
||
|
c->lbu(v1, 4, a1); // lbu v1, 4(a1)
|
||
|
c->lwc1(f1, 44, a1); // lwc1 f1, 44(a1)
|
||
|
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
|
||
|
c->divs(f0, f0, f1); // div.s f0, f0, f1
|
||
|
c->dsll(v1, v1, 2); // dsll v1, v1, 2
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->lbu(v1, 7, a1); // lbu v1, 7(a1)
|
||
|
c->dsll(v1, v1, 19); // dsll v1, v1, 19
|
||
|
c->lbu(a3, 5, a1); // lbu a3, 5(a1)
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->dsll(a3, a3, 5); // dsll a3, a3, 5
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->ld(t1, 0, a0); // ld t1, 0(a0)
|
||
|
c->dsll(t1, t1, 27); // dsll t1, t1, 27
|
||
|
c->lbu(v1, 6, a1); // lbu v1, 6(a1)
|
||
|
c->dsra32(t1, t1, 30); // dsra32 t1, t1, 30
|
||
|
c->dsll(v1, v1, 20); // dsll v1, v1, 20
|
||
|
c->dsll32(t1, t1, 3); // dsll32 t1, t1, 3
|
||
|
c->lhu(a3, 10, a1); // lhu a3, 10(a1)
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->lbu(v1, 26, a1); // lbu v1, 26(a1)
|
||
|
c->or_(t1, t1, a3); // or t1, t1, a3
|
||
|
c->dsll(v1, v1, 14); // dsll v1, v1, 14
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->lhu(v1, 0, a1); // lhu v1, 0(a1)
|
||
|
c->plzcw(v1, v1); // plzcw v1, v1
|
||
|
c->addiu(t0, r0, 30); // addiu t0, r0, 30
|
||
|
c->subu(v1, t0, v1); // subu v1, t0, v1
|
||
|
c->lhu(a3, 2, a1); // lhu a3, 2(a1)
|
||
|
c->dsll(v1, v1, 26); // dsll v1, v1, 26
|
||
|
c->plzcw(a3, a3); // plzcw a3, a3
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->subu(a3, t0, a3); // subu a3, t0, a3
|
||
|
c->dsll(a3, a3, 30); // dsll a3, a3, 30
|
||
|
c->addiu(v1, r0, 1); // addiu v1, r0, 1
|
||
|
c->or_(t1, t1, a3); // or t1, t1, a3
|
||
|
c->dsll32(v1, v1, 2); // dsll32 v1, v1, 2
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->lhu(v1, 24, a1); // lhu v1, 24(a1)
|
||
|
c->dsll32(v1, v1, 5); // dsll32 v1, v1, 5
|
||
|
c->lhu(a3, 8, a1); // lhu a3, 8(a1)
|
||
|
c->dsll32(a3, a3, 19); // dsll32 a3, a3, 19
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->or_(t1, t1, a3); // or t1, t1, a3
|
||
|
c->addiu(v1, r0, 1); // addiu v1, r0, 1
|
||
|
c->dsll32(v1, v1, 29); // dsll32 v1, v1, 29
|
||
|
c->cvtws(f0, f0); // cvt.w.s f0, f0
|
||
|
c->or_(t1, t1, v1); // or t1, t1, v1
|
||
|
c->mfc1(v1, f0); // mfc1 v1, f0
|
||
|
c->sd(t1, 0, a0); // sd t1, 0(a0)
|
||
|
c->plzcw(a3, v1); // plzcw a3, v1
|
||
|
c->subu(a3, t0, a3); // subu a3, t0, a3
|
||
|
c->lbu(t0, 7, a1); // lbu t0, 7(a1)
|
||
|
c->daddiu(t0, t0, -1); // daddiu t0, t0, -1
|
||
|
// nop // sll r0, r0, 0
|
||
|
bc = c->sgpr64(t0) == 0; // beq t0, r0, L43
|
||
|
// nop // sll r0, r0, 0
|
||
|
if (bc) {goto block_5;} // branch non-likely
|
||
|
|
||
|
c->daddiu(t0, a3, -4); // daddiu t0, a3, -4
|
||
|
c->dsll(a3, a3, 4); // dsll a3, a3, 4
|
||
|
bc = ((s64)c->sgpr64(t0)) < 0; // bltz t0, L41
|
||
|
c->daddiu(a3, a3, -175); // daddiu a3, a3, -175
|
||
|
if (bc) {goto block_3;} // branch non-likely
|
||
|
|
||
|
//beq r0, r0, L42 // beq r0, r0, L42
|
||
|
c->dsrav(t0, v1, t0); // dsrav t0, v1, t0
|
||
|
goto block_4; // branch always
|
||
|
|
||
|
|
||
|
block_3:
|
||
|
c->dsubu(t0, r0, t0); // dsubu t0, r0, t0
|
||
|
c->dsllv(t0, v1, t0); // dsllv t0, v1, t0
|
||
|
|
||
|
block_4:
|
||
|
c->andi(t0, t0, 15); // andi t0, t0, 15
|
||
|
// nop // sll r0, r0, 0
|
||
|
//beq r0, r0, L46 // beq r0, r0, L46
|
||
|
c->daddu(a3, a3, t0); // daddu a3, a3, t0
|
||
|
goto block_9; // branch always
|
||
|
|
||
|
|
||
|
block_5:
|
||
|
c->daddiu(t0, a3, -5); // daddiu t0, a3, -5
|
||
|
c->dsll(a3, a3, 5); // dsll a3, a3, 5
|
||
|
bc = ((s64)c->sgpr64(t0)) < 0; // bltz t0, L44
|
||
|
c->daddiu(a3, a3, -350); // daddiu a3, a3, -350
|
||
|
if (bc) {goto block_7;} // branch non-likely
|
||
|
|
||
|
//beq r0, r0, L45 // beq r0, r0, L45
|
||
|
c->dsrav(t0, v1, t0); // dsrav t0, v1, t0
|
||
|
goto block_8; // branch always
|
||
|
|
||
|
|
||
|
block_7:
|
||
|
c->dsubu(t0, r0, t0); // dsubu t0, r0, t0
|
||
|
c->dsllv(t0, v1, t0); // dsllv t0, v1, t0
|
||
|
|
||
|
block_8:
|
||
|
c->andi(t0, t0, 31); // andi t0, t0, 31
|
||
|
// nop // sll r0, r0, 0
|
||
|
c->daddu(a3, a3, t0); // daddu a3, a3, t0
|
||
|
// nop // sll r0, r0, 0
|
||
|
|
||
|
block_9:
|
||
|
c->andi(a3, a3, 4095); // andi a3, a3, 4095
|
||
|
c->lhu(t1, 12, a1); // lhu t1, 12(a1)
|
||
|
c->dsll32(a3, a3, 0); // dsll32 a3, a3, 0
|
||
|
c->lbu(v1, 27, a1); // lbu v1, 27(a1)
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->dsll(v1, v1, 14); // dsll v1, v1, 14
|
||
|
c->sd(a2, 16, a0); // sd a2, 16(a0)
|
||
|
c->or_(a2, t1, v1); // or a2, t1, v1
|
||
|
c->lhu(v1, 14, a1); // lhu v1, 14(a1)
|
||
|
// nop // sll r0, r0, 0
|
||
|
c->lbu(a3, 28, a1); // lbu a3, 28(a1)
|
||
|
c->dsll(v1, v1, 20); // dsll v1, v1, 20
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->dsll32(a3, a3, 2); // dsll32 a3, a3, 2
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->lhu(v1, 16, a1); // lhu v1, 16(a1)
|
||
|
c->lbu(a3, 29, a1); // lbu a3, 29(a1)
|
||
|
c->dsll32(v1, v1, 8); // dsll32 v1, v1, 8
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->dsll32(a3, a3, 22); // dsll32 a3, a3, 22
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->lbu(t0, 4, a1); // lbu t0, 4(a1)
|
||
|
c->daddiu(t0, t0, -5); // daddiu t0, t0, -5
|
||
|
c->sd(a2, 32, a0); // sd a2, 32(a0)
|
||
|
bc = ((s64)c->sgpr64(t0)) < 0; // bltz t0, L47
|
||
|
c->lbu(a3, 30, a1); // lbu a3, 30(a1)
|
||
|
if (bc) {goto block_11;} // branch non-likely
|
||
|
|
||
|
c->lhu(a2, 18, a1); // lhu a2, 18(a1)
|
||
|
c->dsll(a3, a3, 14); // dsll a3, a3, 14
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->lhu(v1, 20, a1); // lhu v1, 20(a1)
|
||
|
c->dsll(v1, v1, 20); // dsll v1, v1, 20
|
||
|
c->lbu(a3, 31, a1); // lbu a3, 31(a1)
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->dsll32(a3, a3, 2); // dsll32 a3, a3, 2
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->lhu(v1, 22, a1); // lhu v1, 22(a1)
|
||
|
c->dsll32(v1, v1, 8); // dsll32 v1, v1, 8
|
||
|
c->lbu(a3, 32, a1); // lbu a3, 32(a1)
|
||
|
c->or_(a2, a2, v1); // or a2, a2, v1
|
||
|
c->dsll32(a3, a3, 22); // dsll32 a3, a3, 22
|
||
|
c->or_(a2, a2, a3); // or a2, a2, a3
|
||
|
c->addiu(v1, r0, 54); // addiu v1, r0, 54
|
||
|
c->sd(a2, 64, a0); // sd a2, 64(a0)
|
||
|
// nop // sll r0, r0, 0
|
||
|
c->sw(v1, 72, a0); // sw v1, 72(a0)
|
||
|
// nop // sll r0, r0, 0
|
||
|
|
||
|
block_11:
|
||
|
c->mov64(v0, a0); // or v0, a0, 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
|
||
|
end_of_function:
|
||
|
return c->gprs[v0].du64[0];
|
||
|
}
|
||
|
|
||
|
void link() {
|
||
|
gLinkedFunctionTable.reg("adgif-shader<-texture-with-update!", execute, 128);
|
||
|
}
|
||
|
|
||
|
} // namespace adgif_shader<_texture_with_update
|
||
|
} // namespace Mips2C
|