New calling method in JIT

This commit is contained in:
SimoneN64
2023-03-19 23:00:29 +01:00
parent fbfdbe730e
commit e032330b07
4 changed files with 19 additions and 168 deletions

View File

@@ -58,7 +58,6 @@ void JIT::Recompile(Mem& mem, u32 pc) {
InvalidateCache(); InvalidateCache();
} }
Util::debug("Start of block @ PC {:08X}\n", loopPC);
code.sub(rsp, 8); code.sub(rsp, 8);
while(!prevBranch) { while(!prevBranch) {
@@ -67,9 +66,9 @@ void JIT::Recompile(Mem& mem, u32 pc) {
u32 instr = mem.Read32(regs, loopPC); u32 instr = mem.Read32(regs, loopPC);
emitBreakpoint(); emitBreakpoint();
code.mov(rdi, (uintptr_t)&regs); code.mov(rdi, (uintptr_t)this);
code.mov(rsi, instr);
Util::debug("\tInstr: {:08X}, PC: {:08X}\n", instr, loopPC);
code.mov(r8, qword[rdi + REG_OFFSET(oldPC)]); code.mov(r8, qword[rdi + REG_OFFSET(oldPC)]);
code.mov(r9, qword[rdi + REG_OFFSET(pc)]); code.mov(r9, qword[rdi + REG_OFFSET(pc)]);
code.mov(r10, qword[rdi + REG_OFFSET(nextPC)]); code.mov(r10, qword[rdi + REG_OFFSET(nextPC)]);
@@ -87,7 +86,6 @@ void JIT::Recompile(Mem& mem, u32 pc) {
code.add(rsp, 8); code.add(rsp, 8);
code.ret(); code.ret();
Util::debug("End of block @ PC {:08X}, len: {}\n", loopPC, instrInBlock);
dump.write(code.getCode<char*>(), code.getSize()); dump.write(code.getCode<char*>(), code.getSize());
blockCache[startPC >> 20][startPC & 0xFFF] = block; blockCache[startPC >> 20][startPC & 0xFFF] = block;
@@ -99,7 +97,7 @@ void JIT::AllocateOuter(u32 pc) {
} }
int JIT::Run() { int JIT::Run() {
/*instrInBlock = 0; instrInBlock = 0;
regs.gpr[0] = 0; regs.gpr[0] = 0;
regs.prevDelaySlot = regs.delaySlot; regs.prevDelaySlot = regs.delaySlot;
regs.delaySlot = false; regs.delaySlot = false;
@@ -129,8 +127,7 @@ int JIT::Run() {
FireException(regs, ExceptionCode::Interrupt, 0, false); FireException(regs, ExceptionCode::Interrupt, 0, false);
} }
return instrInBlock;*/ return instrInBlock;
Util::panic("JIT RECOMPILER NOT YET IMPLEMENTED!\n");
} }
void JIT::Reset() { void JIT::Reset() {

View File

@@ -10,22 +10,18 @@ void cop0Decode(Registers& regs, JIT& cpu, u32 instr) {
switch(mask_cop) { switch(mask_cop) {
case 0x00: case 0x00:
code.mov(code.rsi, (u64)instr);
code.mov(code.rax, (u64)mfc0); code.mov(code.rax, (u64)mfc0);
code.call(code.rax); code.call(code.rax);
break; break;
case 0x01: case 0x01:
code.mov(code.rsi, (u64)instr);
code.mov(code.rax, (u64)dmfc0); code.mov(code.rax, (u64)dmfc0);
code.call(code.rax); code.call(code.rax);
break; break;
case 0x04: case 0x04:
code.mov(code.rsi, (u64)instr);
code.mov(code.rax, (uintptr_t)mtc0); code.mov(code.rax, (uintptr_t)mtc0);
code.call(code.rax); code.call(code.rax);
break; break;
case 0x05: case 0x05:
code.mov(code.rsi, (u64)instr);
code.mov(code.rax, (u64)dmtc0); code.mov(code.rax, (u64)dmtc0);
code.call(code.rax); code.call(code.rax);
break; break;
@@ -36,14 +32,14 @@ void cop0Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x02: case 0x02:
code.and_(code.dword[code.rdi + offsetof(Registers, cop0.index)], 0x3F); code.mov(code.rcx, code.dword[code.rdi + offsetof(Registers, cop0.index)]);
code.mov(code.rsi, code.dword[code.rdi]); code.and_(code.rcx, 0x3F);
code.mov(code.rsi, code.rcx);
code.mov(code.rax, (u64)tlbw); code.mov(code.rax, (u64)tlbw);
code.call(code.rax); code.call(code.rax);
break; break;
case 0x06: case 0x06:
code.mov(code.rax, (u64)regs.cop0.GetRandom()); code.mov(code.rsi, (u64)regs.cop0.GetRandom());
code.mov(code.rsi, code.rax);
code.mov(code.rax, (u64)tlbw); code.mov(code.rax, (u64)tlbw);
code.call(code.rax); code.call(code.rax);
break; break;

View File

@@ -10,9 +10,6 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
u8 mask_fun = instr & 0x3F; u8 mask_fun = instr & 0x3F;
u8 mask_branch = (instr >> 16) & 0x1F; u8 mask_branch = (instr >> 16) & 0x1F;
code.mov(code.rdi, (u64)&regs);
code.mov(code.esi, instr);
switch(mask_sub) { switch(mask_sub) {
// 000r_rccc // 000r_rccc
case 0x00: case 0x00:
@@ -28,7 +25,7 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x03: case 0x03:
Util::panic("[RECOMPILER] FPU Reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
case 0x04: case 0x04:
code.mov(code.rax, (u64)mtc1); code.mov(code.rax, (u64)mtc1);
code.call(code.rax); code.call(code.rax);
@@ -42,26 +39,26 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x07: case 0x07:
Util::panic("[RECOMPILER] FPU Reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
case 0x08: case 0x08:
switch(mask_branch) { switch(mask_branch) {
case 0: case 0:
code.mov(code.rdi, !regs.cop1.fcr31.compare); code.mov(code.rdx, !regs.cop1.fcr31.compare);
code.mov(code.rax, (u64)b); code.mov(code.rax, (u64)b);
code.call(code.rax); code.call(code.rax);
return true; return true;
case 1: case 1:
code.mov(code.rdi, regs.cop1.fcr31.compare); code.mov(code.rdx, regs.cop1.fcr31.compare);
code.mov(code.rax, (u64)b); code.mov(code.rax, (u64)b);
code.call(code.rax); code.call(code.rax);
return true; return true;
case 2: case 2:
code.mov(code.rdi, !regs.cop1.fcr31.compare); code.mov(code.rdx, !regs.cop1.fcr31.compare);
code.mov(code.rax, (u64)bl); code.mov(code.rax, (u64)bl);
code.call(code.rax); code.call(code.rax);
return true; return true;
case 3: case 3:
code.mov(code.rdi, regs.cop1.fcr31.compare); code.mov(code.rdx, regs.cop1.fcr31.compare);
code.mov(code.rax, (u64)bl); code.mov(code.rax, (u64)bl);
code.call(code.rax); code.call(code.rax);
return true; return true;
@@ -135,7 +132,7 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x20: case 0x20:
Util::panic("[RECOMPILER] FPU Reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
case 0x21: case 0x21:
code.mov(code.rax, (u64)cvtds); code.mov(code.rax, (u64)cvtds);
code.call(code.rax); code.call(code.rax);
@@ -302,7 +299,7 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x21: case 0x21:
Util::panic("[RECOMPILER] FPU Reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
case 0x24: case 0x24:
code.mov(code.rax, (u64)cvtwd); code.mov(code.rax, (u64)cvtwd);
code.call(code.rax); code.call(code.rax);
@@ -421,7 +418,7 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x24: case 0x24:
Util::panic("[RECOMPILER] FPU reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
default: Util::panic("Unimplemented COP1 function W[{} {}] ({:08X}) ({:016X})", mask_fun >> 3, mask_fun & 7, instr, (u64)regs.oldPC); default: Util::panic("Unimplemented COP1 function W[{} {}] ({:08X}) ({:016X})", mask_fun >> 3, mask_fun & 7, instr, (u64)regs.oldPC);
} }
break; break;
@@ -452,9 +449,9 @@ bool cop1Decode(Registers& regs, JIT& cpu, u32 instr) {
code.call(code.rax); code.call(code.rax);
break; break;
case 0x24: case 0x24:
Util::panic("[RECOMPILER] FPU reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
case 0x25: case 0x25:
Util::panic("[RECOMPILER] FPU reserved instruction exception!\n"); Util::panic("[RECOMPILER] FPU Reserved instruction exception! {:08X}\n", instr);
default: Util::panic("Unimplemented COP1 function L[{} {}] ({:08X}) ({:016X})", mask_fun >> 3, mask_fun & 7, instr, (u64)regs.oldPC); default: Util::panic("Unimplemented COP1 function L[{} {}] ({:08X}) ({:016X})", mask_fun >> 3, mask_fun & 7, instr, (u64)regs.oldPC);
} }
break; break;

View File

@@ -5,10 +5,6 @@
namespace n64 { namespace n64 {
void JIT::cop2Decode(u32 instr) { void JIT::cop2Decode(u32 instr) {
code.mov(rdi, (u64)this);
code.mov(rsi, (u64)&regs);
code.mov(rdx, instr);
switch(RS(instr)) { switch(RS(instr)) {
case 0x00: case 0x00:
code.mov(rax, (u64)mfc2); code.mov(rax, (u64)mfc2);
@@ -40,44 +36,36 @@ bool JIT::special(u32 instr) {
switch (mask) { // TODO: named constants for clearer code switch (mask) { // TODO: named constants for clearer code
case 0: case 0:
if (instr != 0) { if (instr != 0) {
code.mov(rsi, instr);
code.mov(rax, (u64)sll); code.mov(rax, (u64)sll);
code.call(rax); code.call(rax);
} }
break; break;
case 0x02: case 0x02:
code.mov(rsi, instr);
code.mov(rax, (u64)srl); code.mov(rax, (u64)srl);
code.call(rax); code.call(rax);
break; break;
case 0x03: case 0x03:
code.mov(rsi, instr);
code.mov(rax, (u64)sra); code.mov(rax, (u64)sra);
code.call(rax); code.call(rax);
break; break;
case 0x04: case 0x04:
code.mov(rsi, instr);
code.mov(rax, (u64)sllv); code.mov(rax, (u64)sllv);
code.call(rax); code.call(rax);
break; break;
case 0x06: case 0x06:
code.mov(rsi, instr);
code.mov(rax, (u64)srlv); code.mov(rax, (u64)srlv);
code.call(rax); code.call(rax);
break; break;
case 0x07: case 0x07:
code.mov(rsi, instr);
code.mov(rax, (u64)srav); code.mov(rax, (u64)srav);
code.call(rax); code.call(rax);
break; break;
case 0x08: case 0x08:
code.mov(rsi, instr);
code.mov(rax, (u64)jr); code.mov(rax, (u64)jr);
code.call(rax); code.call(rax);
res = true; res = true;
break; break;
case 0x09: case 0x09:
code.mov(rsi, instr);
code.mov(rax, (u64)jalr); code.mov(rax, (u64)jalr);
code.call(rax); code.call(rax);
res = true; res = true;
@@ -86,147 +74,118 @@ bool JIT::special(u32 instr) {
case 0x0D: Util::panic("[RECOMPILER] Unhandled break instruction {:016X}\n", (u64)regs.pc); case 0x0D: Util::panic("[RECOMPILER] Unhandled break instruction {:016X}\n", (u64)regs.pc);
case 0x0F: break; // SYNC case 0x0F: break; // SYNC
case 0x10: case 0x10:
code.mov(rsi, instr);
code.mov(rax, (u64)mfhi); code.mov(rax, (u64)mfhi);
code.call(rax); code.call(rax);
break; break;
case 0x11: case 0x11:
code.mov(rsi, instr);
code.mov(rax, (u64)mthi); code.mov(rax, (u64)mthi);
code.call(rax); code.call(rax);
break; break;
case 0x12: case 0x12:
code.mov(rsi, instr);
code.mov(rax, (u64)mflo); code.mov(rax, (u64)mflo);
code.call(rax); code.call(rax);
break; break;
case 0x13: case 0x13:
code.mov(rsi, instr);
code.mov(rax, (u64)mtlo); code.mov(rax, (u64)mtlo);
code.call(rax); code.call(rax);
break; break;
case 0x14: case 0x14:
code.mov(rsi, instr);
code.mov(rax, (u64)dsllv); code.mov(rax, (u64)dsllv);
code.call(rax); code.call(rax);
break; break;
case 0x16: case 0x16:
code.mov(rsi, instr);
code.mov(rax, (u64)dsrlv); code.mov(rax, (u64)dsrlv);
code.call(rax); code.call(rax);
break; break;
case 0x17: case 0x17:
code.mov(rsi, instr);
code.mov(rax, (u64)dsrav); code.mov(rax, (u64)dsrav);
code.call(rax); code.call(rax);
break; break;
case 0x18: case 0x18:
code.mov(rsi, instr);
code.mov(rax, (u64)mult); code.mov(rax, (u64)mult);
code.call(rax); code.call(rax);
break; break;
case 0x19: case 0x19:
code.mov(rsi, instr);
code.mov(rax, (u64)multu); code.mov(rax, (u64)multu);
code.call(rax); code.call(rax);
break; break;
case 0x1A: case 0x1A:
code.mov(rsi, instr);
code.mov(rax, (u64)div); code.mov(rax, (u64)div);
code.call(rax); code.call(rax);
break; break;
case 0x1B: case 0x1B:
code.mov(rsi, instr);
code.mov(rax, (u64)divu); code.mov(rax, (u64)divu);
code.call(rax); code.call(rax);
break; break;
case 0x1C: case 0x1C:
code.mov(rsi, instr);
code.mov(rax, (u64)dmult); code.mov(rax, (u64)dmult);
code.call(rax); code.call(rax);
break; break;
case 0x1D: case 0x1D:
code.mov(rsi, instr);
code.mov(rax, (u64)dmultu); code.mov(rax, (u64)dmultu);
code.call(rax); code.call(rax);
break; break;
case 0x1E: case 0x1E:
code.mov(rsi, instr);
code.mov(rax, (u64)ddiv); code.mov(rax, (u64)ddiv);
code.call(rax); code.call(rax);
break; break;
case 0x1F: case 0x1F:
code.mov(rsi, instr);
code.mov(rax, (u64)ddivu); code.mov(rax, (u64)ddivu);
code.call(rax); code.call(rax);
break; break;
case 0x20: case 0x20:
code.mov(rsi, instr);
code.mov(rax, (u64)add); code.mov(rax, (u64)add);
code.call(rax); code.call(rax);
break; break;
case 0x21: case 0x21:
code.mov(rsi, instr);
code.mov(rax, (u64)addu); code.mov(rax, (u64)addu);
code.call(rax); code.call(rax);
break; break;
case 0x22: case 0x22:
code.mov(rsi, instr);
code.mov(rax, (u64)sub); code.mov(rax, (u64)sub);
code.call(rax); code.call(rax);
break; break;
case 0x23: case 0x23:
code.mov(rsi, instr);
code.mov(rax, (u64)subu); code.mov(rax, (u64)subu);
code.call(rax); code.call(rax);
break; break;
case 0x24: case 0x24:
code.mov(rsi, instr);
code.mov(rax, (u64)and_); code.mov(rax, (u64)and_);
code.call(rax); code.call(rax);
break; break;
case 0x25: case 0x25:
code.mov(rsi, instr);
code.mov(rax, (u64)or_); code.mov(rax, (u64)or_);
code.call(rax); code.call(rax);
break; break;
case 0x26: case 0x26:
code.mov(rsi, instr);
code.mov(rax, (u64)xor_); code.mov(rax, (u64)xor_);
code.call(rax); code.call(rax);
break; break;
case 0x27: case 0x27:
code.mov(rsi, instr);
code.mov(rax, (u64)nor); code.mov(rax, (u64)nor);
code.call(rax); code.call(rax);
break; break;
case 0x2A: case 0x2A:
code.mov(rsi, instr);
code.mov(rax, (u64)slt); code.mov(rax, (u64)slt);
code.call(rax); code.call(rax);
break; break;
case 0x2B: case 0x2B:
code.mov(rsi, instr);
code.mov(rax, (u64)sltu); code.mov(rax, (u64)sltu);
code.call(rax); code.call(rax);
break; break;
case 0x2C: case 0x2C:
code.mov(rsi, instr);
code.mov(rax, (u64)dadd); code.mov(rax, (u64)dadd);
code.call(rax); code.call(rax);
break; break;
case 0x2D: case 0x2D:
code.mov(rsi, instr);
code.mov(rax, (u64)daddu); code.mov(rax, (u64)daddu);
code.call(rax); code.call(rax);
break; break;
case 0x2E: case 0x2E:
code.mov(rsi, instr);
code.mov(rax, (u64)dsub); code.mov(rax, (u64)dsub);
code.call(rax); code.call(rax);
break; break;
case 0x2F: case 0x2F:
code.mov(rsi, instr);
code.mov(rax, (u64)dsubu); code.mov(rax, (u64)dsubu);
code.call(rax); code.call(rax);
break; break;
@@ -291,32 +250,26 @@ bool JIT::special(u32 instr) {
res = true; res = true;
break; break;
case 0x38: case 0x38:
code.mov(rsi, instr);
code.mov(rax, (u64)dsll); code.mov(rax, (u64)dsll);
code.call(rax); code.call(rax);
break; break;
case 0x3A: case 0x3A:
code.mov(rsi, instr);
code.mov(rax, (u64)dsrl); code.mov(rax, (u64)dsrl);
code.call(rax); code.call(rax);
break; break;
case 0x3B: case 0x3B:
code.mov(rsi, instr);
code.mov(rax, (u64)dsra); code.mov(rax, (u64)dsra);
code.call(rax); code.call(rax);
break; break;
case 0x3C: case 0x3C:
code.mov(rsi, instr);
code.mov(rax, (u64)dsll32); code.mov(rax, (u64)dsll32);
code.call(rax); code.call(rax);
break; break;
case 0x3E: case 0x3E:
code.mov(rsi, instr);
code.mov(rax, (u64)dsrl32); code.mov(rax, (u64)dsrl32);
code.call(rax); code.call(rax);
break; break;
case 0x3F: case 0x3F:
code.mov(rsi, instr);
code.mov(rax, (u64)dsra32); code.mov(rax, (u64)dsra32);
code.call(rax); code.call(rax);
break; break;
@@ -332,7 +285,6 @@ bool JIT::regimm(u32 instr) {
// 000r_rccc // 000r_rccc
switch (mask) { // TODO: named constants for clearer code switch (mask) { // TODO: named constants for clearer code
case 0x00: case 0x00:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -341,7 +293,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x01: case 0x01:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -350,7 +301,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x02: case 0x02:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -359,7 +309,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x03: case 0x03:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -416,7 +365,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x10: case 0x10:
code.mov(rsi, instr);
code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(rcx, 0); code.cmp(rcx, 0);
@@ -425,7 +373,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x11: case 0x11:
code.mov(rsi, instr);
code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(rcx, 0); code.cmp(rcx, 0);
@@ -434,7 +381,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x12: case 0x12:
code.mov(rsi, instr);
code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(rcx, 0); code.cmp(rcx, 0);
@@ -443,7 +389,6 @@ bool JIT::regimm(u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x13: case 0x13:
code.mov(rsi, instr);
code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(rcx, 0); code.cmp(rcx, 0);
@@ -467,19 +412,16 @@ bool JIT::Exec(Mem& mem, u32 instr) {
case 0x00: res = special(instr); break; case 0x00: res = special(instr); break;
case 0x01: res = regimm(instr); break; case 0x01: res = regimm(instr); break;
case 0x02: case 0x02:
code.mov(rsi, instr);
code.mov(rax, (u64)j); code.mov(rax, (u64)j);
code.call(rax); code.call(rax);
res = true; res = true;
break; break;
case 0x03: case 0x03:
code.mov(rsi, instr);
code.mov(rax, (u64)jal); code.mov(rax, (u64)jal);
code.call(rax); code.call(rax);
res = true; res = true;
break; break;
case 0x04: case 0x04:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
@@ -490,7 +432,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
res = true; res = true;
break; break;
case 0x05: case 0x05:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
@@ -501,7 +442,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
res = true; res = true;
break; break;
case 0x06: case 0x06:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.test(r8, r8); code.test(r8, r8);
@@ -511,7 +451,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
res = true; res = true;
break; break;
case 0x07: case 0x07:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.test(r8, r8); code.test(r8, r8);
@@ -521,42 +460,34 @@ bool JIT::Exec(Mem& mem, u32 instr) {
res = true; res = true;
break; break;
case 0x08: case 0x08:
code.mov(rsi, instr);
code.mov(rax, (u64)addi); code.mov(rax, (u64)addi);
code.call(rax); code.call(rax);
break; break;
case 0x09: case 0x09:
code.mov(rsi, instr);
code.mov(rax, (u64)addiu); code.mov(rax, (u64)addiu);
code.call(rax); code.call(rax);
break; break;
case 0x0A: case 0x0A:
code.mov(rsi, instr);
code.mov(rax, (u64)slti); code.mov(rax, (u64)slti);
code.call(rax); code.call(rax);
break; break;
case 0x0B: case 0x0B:
code.mov(rsi, instr);
code.mov(rax, (u64)sltiu); code.mov(rax, (u64)sltiu);
code.call(rax); code.call(rax);
break; break;
case 0x0C: case 0x0C:
code.mov(rsi, instr);
code.mov(rax, (u64)andi); code.mov(rax, (u64)andi);
code.call(rax); code.call(rax);
break; break;
case 0x0D: case 0x0D:
code.mov(rsi, instr);
code.mov(rax, (u64)ori); code.mov(rax, (u64)ori);
code.call(rax); code.call(rax);
break; break;
case 0x0E: case 0x0E:
code.mov(rsi, instr);
code.mov(rax, (u64)xori); code.mov(rax, (u64)xori);
code.call(rax); code.call(rax);
break; break;
case 0x0F: case 0x0F:
code.mov(rsi, instr);
code.mov(rax, (u64)lui); code.mov(rax, (u64)lui);
code.call(rax); code.call(rax);
break; break;
@@ -564,7 +495,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
case 0x11: res = cop1Decode(regs, *this, instr); break; case 0x11: res = cop1Decode(regs, *this, instr); break;
case 0x12: cop2Decode(instr); break; case 0x12: cop2Decode(instr); break;
case 0x14: case 0x14:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
@@ -574,7 +504,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x15: case 0x15:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]); code.mov(rcx, qword[rdi + GPR_OFFSET(RT(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
@@ -584,7 +513,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x16: case 0x16:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -593,7 +521,6 @@ bool JIT::Exec(Mem& mem, u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x17: case 0x17:
code.mov(rsi, instr);
code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]); code.mov(r8, qword[rdi + GPR_OFFSET(RS(instr))]);
code.xor_(rdx, rdx); code.xor_(rdx, rdx);
code.cmp(r8, 0); code.cmp(r8, 0);
@@ -602,186 +529,120 @@ bool JIT::Exec(Mem& mem, u32 instr) {
code.call(rax); code.call(rax);
break; break;
case 0x18: case 0x18:
code.mov(rsi, instr);
code.mov(rax, (u64)daddi); code.mov(rax, (u64)daddi);
code.call(rax); code.call(rax);
break; break;
case 0x19: case 0x19:
code.mov(rsi, instr);
code.mov(rax, (u64)daddiu); code.mov(rax, (u64)daddiu);
code.call(rax); code.call(rax);
break; break;
case 0x1A: case 0x1A:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)ldl); code.mov(rax, (u64)ldl);
code.call(rax); code.call(rax);
break; break;
case 0x1B: case 0x1B:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)ldr); code.mov(rax, (u64)ldr);
code.call(rax); code.call(rax);
break; break;
case 0x1F: Util::panic("[RECOMPILER] Unhandled reserved instruction exception {:016X}\n", regs.oldPC); break; case 0x1F: Util::panic("[RECOMPILER] Unhandled reserved instruction exception {:016X}\n", regs.oldPC); break;
case 0x20: case 0x20:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lb); code.mov(rax, (u64)lb);
code.call(rax); code.call(rax);
break; break;
case 0x21: case 0x21:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lh); code.mov(rax, (u64)lh);
code.call(rax); code.call(rax);
break; break;
case 0x22: case 0x22:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lwl); code.mov(rax, (u64)lwl);
code.call(rax); code.call(rax);
break; break;
case 0x23: case 0x23:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lw); code.mov(rax, (u64)lw);
code.call(rax); code.call(rax);
break; break;
case 0x24: case 0x24:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lbu); code.mov(rax, (u64)lbu);
code.call(rax); code.call(rax);
break; break;
case 0x25: case 0x25:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lhu); code.mov(rax, (u64)lhu);
code.call(rax); code.call(rax);
break; break;
case 0x26: case 0x26:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lwr); code.mov(rax, (u64)lwr);
code.call(rax); code.call(rax);
break; break;
case 0x27: case 0x27:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lwu); code.mov(rax, (u64)lwu);
code.call(rax); code.call(rax);
break; break;
case 0x28: case 0x28:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sb); code.mov(rax, (u64)sb);
code.call(rax); code.call(rax);
break; break;
case 0x29: case 0x29:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sh); code.mov(rax, (u64)sh);
code.call(rax); code.call(rax);
break; break;
case 0x2A: case 0x2A:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)swl); code.mov(rax, (u64)swl);
code.call(rax); code.call(rax);
break; break;
case 0x2B: case 0x2B:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sw); code.mov(rax, (u64)sw);
code.call(rax); code.call(rax);
break; break;
case 0x2C: case 0x2C:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sdl); code.mov(rax, (u64)sdl);
code.call(rax); code.call(rax);
break; break;
case 0x2D: case 0x2D:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sdr); code.mov(rax, (u64)sdr);
code.call(rax); code.call(rax);
break; break;
case 0x2E: case 0x2E:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)swr); code.mov(rax, (u64)swr);
code.call(rax); code.call(rax);
break; break;
case 0x2F: break; // CACHE case 0x2F: break; // CACHE
case 0x30: case 0x30:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)ll); code.mov(rax, (u64)ll);
code.call(rax); code.call(rax);
break; break;
case 0x31: case 0x31:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lwc1); code.mov(rax, (u64)lwc1);
code.call(rax); code.call(rax);
break; break;
case 0x34: case 0x34:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)lld); code.mov(rax, (u64)lld);
code.call(rax); code.call(rax);
break; break;
case 0x35: case 0x35:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)ldc1); code.mov(rax, (u64)ldc1);
code.call(rax); code.call(rax);
break; break;
case 0x37: case 0x37:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)ld); code.mov(rax, (u64)ld);
code.call(rax); code.call(rax);
break; break;
case 0x38: case 0x38:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sc); code.mov(rax, (u64)sc);
code.call(rax); code.call(rax);
break; break;
case 0x39: case 0x39:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)swc1); code.mov(rax, (u64)swc1);
code.call(rax); code.call(rax);
break; break;
case 0x3C: case 0x3C:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)scd); code.mov(rax, (u64)scd);
code.call(rax); code.call(rax);
break; break;
case 0x3D: case 0x3D:
code.mov(rsi, (u64)&mem);
code.mov(rdx, instr);
code.mov(rax, (u64)sdc1); code.mov(rax, (u64)sdc1);
code.call(rax); code.call(rax);
break; break;
case 0x3F: case 0x3F:
code.mov(rsi, (u64)&mem);
code.mov(rdx, (u64)this);
code.mov(rcx, instr);
code.mov(rax, (u64)sd); code.mov(rax, (u64)sd);
code.call(rax); code.call(rax);
break; break;