New calling method in JIT
This commit is contained in:
@@ -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)®s);
|
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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)®s);
|
|
||||||
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;
|
||||||
|
|||||||
@@ -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)®s);
|
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user