diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp index fa6c40646..f8f44c0a4 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp @@ -1782,8 +1782,8 @@ void CArmRecompilerOps::ADDIU() void CArmRecompilerOps::SLTI() { - UnMap_GPR(m_Opcode.rs, true); UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SLTI, "R4300iOp32::SLTI"); @@ -1796,8 +1796,8 @@ void CArmRecompilerOps::SLTI() void CArmRecompilerOps::SLTIU() { - UnMap_GPR(m_Opcode.rs, true); UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SLTIU, "R4300iOp32::SLTIU"); @@ -1810,8 +1810,8 @@ void CArmRecompilerOps::SLTIU() void CArmRecompilerOps::ANDI() { - UnMap_GPR(m_Opcode.rs, true); UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::ANDI, "R4300iOp32::ANDI"); @@ -1824,8 +1824,8 @@ void CArmRecompilerOps::ANDI() void CArmRecompilerOps::ORI() { - UnMap_GPR(m_Opcode.rs, true); UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::ORI, "R4300iOp32::ORI"); @@ -1838,8 +1838,8 @@ void CArmRecompilerOps::ORI() void CArmRecompilerOps::XORI() { - UnMap_GPR(m_Opcode.rs, true); UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::XORI, "R4300iOp32::XORI"); @@ -1865,8 +1865,8 @@ void CArmRecompilerOps::LUI() void CArmRecompilerOps::DADDIU() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::DADDIU, "R4300iOp32::DADDIU"); @@ -1879,7 +1879,7 @@ void CArmRecompilerOps::DADDIU() void CArmRecompilerOps::LDL() { - UnMap_GPR(m_Opcode.base, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } UnMap_GPR(m_Opcode.rt, true); if (g_Settings->LoadBool(Game_32Bit)) { @@ -1893,7 +1893,7 @@ void CArmRecompilerOps::LDL() void CArmRecompilerOps::LDR() { - UnMap_GPR(m_Opcode.base, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } UnMap_GPR(m_Opcode.rt, true); if (g_Settings->LoadBool(Game_32Bit)) { @@ -2023,8 +2023,8 @@ void CArmRecompilerOps::LWU() void CArmRecompilerOps::SB() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SB, "R4300iOp32::SB"); @@ -2037,8 +2037,8 @@ void CArmRecompilerOps::SB() void CArmRecompilerOps::SH() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SH, "R4300iOp32::SH"); @@ -2051,8 +2051,8 @@ void CArmRecompilerOps::SH() void CArmRecompilerOps::SWL() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SWL, "R4300iOp32::SWL"); @@ -2069,8 +2069,8 @@ void CArmRecompilerOps::SW() UpdateCounters(m_RegWorkingSet, false, true); m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp()); - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SW, "R4300iOp32::SW"); @@ -2083,8 +2083,8 @@ void CArmRecompilerOps::SW() void CArmRecompilerOps::SWR() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SWR, "R4300iOp32::SWR"); @@ -2097,8 +2097,8 @@ void CArmRecompilerOps::SWR() void CArmRecompilerOps::SDL() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SDL, "R4300iOp32::SDL"); @@ -2111,8 +2111,8 @@ void CArmRecompilerOps::SDL() void CArmRecompilerOps::SDR() { - UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.base != 0) { UnMap_GPR(m_Opcode.base, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SDR, "R4300iOp32::SDR"); @@ -2265,7 +2265,7 @@ void CArmRecompilerOps::SDC1() void CArmRecompilerOps::SD() { UnMap_GPR(m_Opcode.base, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SD, "R4300iOp32::SD"); @@ -2283,7 +2283,7 @@ void CArmRecompilerOps::SPECIAL_SLL() return; } UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SLL, "R4300iOp32::SPECIAL_SLL"); @@ -2297,7 +2297,7 @@ void CArmRecompilerOps::SPECIAL_SLL() void CArmRecompilerOps::SPECIAL_SRL() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SRL, "R4300iOp32::SPECIAL_SRL"); @@ -2311,7 +2311,7 @@ void CArmRecompilerOps::SPECIAL_SRL() void CArmRecompilerOps::SPECIAL_SRA() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SRA, "R4300iOp32::SPECIAL_SRA"); @@ -2325,7 +2325,7 @@ void CArmRecompilerOps::SPECIAL_SRA() void CArmRecompilerOps::SPECIAL_SLLV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } UnMap_GPR(m_Opcode.rs, true); if (g_Settings->LoadBool(Game_32Bit)) { @@ -2340,7 +2340,7 @@ void CArmRecompilerOps::SPECIAL_SLLV() void CArmRecompilerOps::SPECIAL_SRLV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } UnMap_GPR(m_Opcode.rs, true); if (g_Settings->LoadBool(Game_32Bit)) { @@ -2355,7 +2355,7 @@ void CArmRecompilerOps::SPECIAL_SRLV() void CArmRecompilerOps::SPECIAL_SRAV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } UnMap_GPR(m_Opcode.rs, true); if (g_Settings->LoadBool(Game_32Bit)) { @@ -2583,8 +2583,8 @@ void CArmRecompilerOps::SPECIAL_MTHI() void CArmRecompilerOps::SPECIAL_DSLLV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSLLV, "R4300iOp32::SPECIAL_DSLLV"); @@ -2598,8 +2598,8 @@ void CArmRecompilerOps::SPECIAL_DSLLV() void CArmRecompilerOps::SPECIAL_DSRLV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRLV, "R4300iOp32::SPECIAL_DSRLV"); @@ -2613,8 +2613,8 @@ void CArmRecompilerOps::SPECIAL_DSRLV() void CArmRecompilerOps::SPECIAL_DSRAV() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRAV, "R4300iOp32::SPECIAL_DSRAV"); @@ -2627,8 +2627,8 @@ void CArmRecompilerOps::SPECIAL_DSRAV() void CArmRecompilerOps::SPECIAL_MULT() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_MULT, "R4300iOp32::SPECIAL_MULT"); @@ -2641,8 +2641,8 @@ void CArmRecompilerOps::SPECIAL_MULT() void CArmRecompilerOps::SPECIAL_MULTU() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_MULTU, "R4300iOp32::SPECIAL_MULTU"); @@ -2655,8 +2655,8 @@ void CArmRecompilerOps::SPECIAL_MULTU() void CArmRecompilerOps::SPECIAL_DIV() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DIV, "R4300iOp32::SPECIAL_DIV"); @@ -2669,8 +2669,8 @@ void CArmRecompilerOps::SPECIAL_DIV() void CArmRecompilerOps::SPECIAL_DIVU() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DIVU, "R4300iOp32::SPECIAL_DIVU"); @@ -2683,8 +2683,8 @@ void CArmRecompilerOps::SPECIAL_DIVU() void CArmRecompilerOps::SPECIAL_DMULT() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DMULT, "R4300iOp32::SPECIAL_DMULT"); @@ -2697,8 +2697,8 @@ void CArmRecompilerOps::SPECIAL_DMULT() void CArmRecompilerOps::SPECIAL_DMULTU() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DMULTU, "R4300iOp32::SPECIAL_DMULTU"); @@ -2711,8 +2711,8 @@ void CArmRecompilerOps::SPECIAL_DMULTU() void CArmRecompilerOps::SPECIAL_DDIV() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DDIV, "R4300iOp32::SPECIAL_DDIV"); @@ -2725,8 +2725,8 @@ void CArmRecompilerOps::SPECIAL_DDIV() void CArmRecompilerOps::SPECIAL_DDIVU() { - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DDIVU, "R4300iOp32::SPECIAL_DDIVU"); @@ -2740,8 +2740,8 @@ void CArmRecompilerOps::SPECIAL_DDIVU() void CArmRecompilerOps::SPECIAL_ADD() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_ADD, "R4300iOp32::SPECIAL_ADD"); @@ -2755,8 +2755,8 @@ void CArmRecompilerOps::SPECIAL_ADD() void CArmRecompilerOps::SPECIAL_ADDU() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_ADDU, "R4300iOp32::SPECIAL_ADDU"); @@ -2770,8 +2770,8 @@ void CArmRecompilerOps::SPECIAL_ADDU() void CArmRecompilerOps::SPECIAL_SUB() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SUBU, "R4300iOp32::SPECIAL_SUBU"); @@ -2785,8 +2785,8 @@ void CArmRecompilerOps::SPECIAL_SUB() void CArmRecompilerOps::SPECIAL_SUBU() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SUBU, "R4300iOp32::SPECIAL_SUBU"); @@ -2800,8 +2800,8 @@ void CArmRecompilerOps::SPECIAL_SUBU() void CArmRecompilerOps::SPECIAL_AND() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_AND, "R4300iOp32::SPECIAL_AND"); @@ -2815,8 +2815,8 @@ void CArmRecompilerOps::SPECIAL_AND() void CArmRecompilerOps::SPECIAL_OR() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_OR, "R4300iOp32::SPECIAL_OR"); @@ -2845,8 +2845,8 @@ void CArmRecompilerOps::SPECIAL_XOR() void CArmRecompilerOps::SPECIAL_NOR() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); - UnMap_GPR(m_Opcode.rs, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_NOR, "R4300iOp32::SPECIAL_NOR"); @@ -2860,8 +2860,8 @@ void CArmRecompilerOps::SPECIAL_NOR() void CArmRecompilerOps::SPECIAL_SLT() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SLT, "R4300iOp32::SPECIAL_SLT"); @@ -2875,8 +2875,8 @@ void CArmRecompilerOps::SPECIAL_SLT() void CArmRecompilerOps::SPECIAL_SLTU() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_SLTU, "R4300iOp32::SPECIAL_SLTU"); @@ -2890,8 +2890,8 @@ void CArmRecompilerOps::SPECIAL_SLTU() void CArmRecompilerOps::SPECIAL_DADD() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DADD, "R4300iOp32::SPECIAL_DADD"); @@ -2905,8 +2905,8 @@ void CArmRecompilerOps::SPECIAL_DADD() void CArmRecompilerOps::SPECIAL_DADDU() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DADDU, "R4300iOp32::SPECIAL_DADDU"); @@ -2920,8 +2920,8 @@ void CArmRecompilerOps::SPECIAL_DADDU() void CArmRecompilerOps::SPECIAL_DSUB() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSUB, "R4300iOp32::SPECIAL_DSUB"); @@ -2935,8 +2935,8 @@ void CArmRecompilerOps::SPECIAL_DSUB() void CArmRecompilerOps::SPECIAL_DSUBU() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rs, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs, true); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSUBU, "R4300iOp32::SPECIAL_DSUBU"); @@ -2950,7 +2950,7 @@ void CArmRecompilerOps::SPECIAL_DSUBU() void CArmRecompilerOps::SPECIAL_DSLL() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSLL, "R4300iOp32::SPECIAL_DSLL"); @@ -2964,7 +2964,7 @@ void CArmRecompilerOps::SPECIAL_DSLL() void CArmRecompilerOps::SPECIAL_DSRL() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRL, "R4300iOp32::SPECIAL_DSRL"); @@ -2978,7 +2978,7 @@ void CArmRecompilerOps::SPECIAL_DSRL() void CArmRecompilerOps::SPECIAL_DSRA() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRA, "R4300iOp32::SPECIAL_DSRA"); @@ -2992,7 +2992,7 @@ void CArmRecompilerOps::SPECIAL_DSRA() void CArmRecompilerOps::SPECIAL_DSLL32() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSLL32, "R4300iOp32::SPECIAL_DSLL32"); @@ -3006,7 +3006,7 @@ void CArmRecompilerOps::SPECIAL_DSLL32() void CArmRecompilerOps::SPECIAL_DSRL32() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRL32, "R4300iOp32::SPECIAL_DSRL32"); @@ -3020,7 +3020,7 @@ void CArmRecompilerOps::SPECIAL_DSRL32() void CArmRecompilerOps::SPECIAL_DSRA32() { UnMap_GPR(m_Opcode.rd, true); - UnMap_GPR(m_Opcode.rt, true); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::SPECIAL_DSRA32, "R4300iOp32::SPECIAL_DSRA32"); @@ -3034,6 +3034,8 @@ void CArmRecompilerOps::SPECIAL_DSRA32() /************************** COP0 functions **************************/ void CArmRecompilerOps::COP0_MF() { + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } + switch (m_Opcode.rd) { case 9: //Count @@ -3054,11 +3056,7 @@ void CArmRecompilerOps::COP0_MF() void CArmRecompilerOps::COP0_MT() { - if (IsKnown(m_Opcode.rt)) - { - g_Notify->BreakPoint(__FILE__, __LINE__); - return; - } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } switch (m_Opcode.rd) { @@ -3188,6 +3186,7 @@ void CArmRecompilerOps::COP0_CO_ERET() void CArmRecompilerOps::COP1_MF() { CompileCop1Test(); + UnMap_GPR(m_Opcode.rt, false); if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::COP1_MF, "R4300iOp32::COP1_MF"); @@ -3201,6 +3200,7 @@ void CArmRecompilerOps::COP1_MF() void CArmRecompilerOps::COP1_DMF() { CompileCop1Test(); + UnMap_GPR(m_Opcode.rt, false); if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::COP1_DMF, "R4300iOp32::COP1_DMF"); @@ -3215,6 +3215,7 @@ void CArmRecompilerOps::COP1_CF() { CompileCop1Test(); + UnMap_GPR(m_Opcode.rt, false); if (m_Opcode.fs != 31 && m_Opcode.fs != 0) { UnknownOpcode(); @@ -3233,6 +3234,7 @@ void CArmRecompilerOps::COP1_CF() void CArmRecompilerOps::COP1_MT() { CompileCop1Test(); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::COP1_MT, "R4300iOp32::COP1_MT"); @@ -3246,6 +3248,8 @@ void CArmRecompilerOps::COP1_MT() void CArmRecompilerOps::COP1_DMT() { CompileCop1Test(); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } + if (g_Settings->LoadBool(Game_32Bit)) { CompileInterpterCall((void *)R4300iOp32::COP1_DMT, "R4300iOp32::COP1_DMT"); @@ -3259,6 +3263,7 @@ void CArmRecompilerOps::COP1_DMT() void CArmRecompilerOps::COP1_CT() { CompileCop1Test(); + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } if (m_Opcode.fs != 31) { diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h index 0d623426a..a79c5e875 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h @@ -235,6 +235,7 @@ public: static inline bool IsSigned(int32_t Reg) { return m_RegWorkingSet.IsSigned(Reg); } static inline bool Is32Bit(int32_t Reg) { return m_RegWorkingSet.Is32Bit(Reg); } static inline bool Is64Bit(int32_t Reg) { return m_RegWorkingSet.Is64Bit(Reg); } + static inline void Map_GPR_32bit(int32_t Reg, bool SignValue, int32_t MipsRegToLoad) { m_RegWorkingSet.Map_GPR_32bit(Reg, SignValue, MipsRegToLoad); } static inline void UnMap_GPR(uint32_t Reg, bool WriteBackValue){ m_RegWorkingSet.UnMap_GPR(Reg, WriteBackValue); } static inline ArmReg Map_TempReg(ArmReg Reg, int32_t MipsReg, bool LoadHiWord) { return m_RegWorkingSet.Map_TempReg(Reg, MipsReg, LoadHiWord); }