diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp index 00b197821..9aae38de7 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp @@ -134,7 +134,7 @@ R4300iOp::Func * R4300iOp::BuildInterpreter() Jump_Opcode[21] = BNEL; Jump_Opcode[22] = BLEZL; Jump_Opcode[23] = BGTZL; - Jump_Opcode[24] = UnknownOpcode; + Jump_Opcode[24] = DADDI; Jump_Opcode[25] = DADDIU; Jump_Opcode[26] = LDL; Jump_Opcode[27] = LDR; @@ -977,6 +977,11 @@ void R4300iOp::BGTZL() } } +void R4300iOp::DADDI() +{ + _GPR[m_Opcode.rt].DW = _GPR[m_Opcode.rs].DW + (int64_t)((int16_t)m_Opcode.immediate); +} + void R4300iOp::DADDIU() { _GPR[m_Opcode.rt].DW = _GPR[m_Opcode.rs].DW + (int64_t)((int16_t)m_Opcode.immediate); diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.h b/Source/Project64-core/N64System/Interpreter/InterpreterOps.h index c17e96d12..9963e5a6f 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.h +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.h @@ -31,6 +31,7 @@ public: static void BNEL(); static void BLEZL(); static void BGTZL(); + static void DADDI(); static void DADDIU(); static void LDL(); static void LDR(); diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps32.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps32.cpp index adc199e56..d13105788 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps32.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps32.cpp @@ -43,7 +43,7 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter() Jump_Opcode[21] = BNEL; Jump_Opcode[22] = BLEZL; Jump_Opcode[23] = BGTZL; - Jump_Opcode[24] = R4300iOp::UnknownOpcode; + Jump_Opcode[24] = R4300iOp::DADDI; Jump_Opcode[25] = R4300iOp::DADDIU; Jump_Opcode[26] = R4300iOp::LDL; Jump_Opcode[27] = R4300iOp::LDR; diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp index 8580e38f5..4adc270bc 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp @@ -2106,6 +2106,20 @@ void CArmRecompilerOps::LUI() m_RegWorkingSet.SetMipsRegState(m_Opcode.rt, CRegInfo::STATE_CONST_32_SIGN); } +void CArmRecompilerOps::DADDI() +{ + if (m_Opcode.rs != 0) { WriteBack_GPR(m_Opcode.rs, false); } + if (m_Opcode.rt != 0) { UnMap_GPR(m_Opcode.rt, true); } + if (g_Settings->LoadBool(Game_32Bit)) + { + CompileInterpterCall((void *)R4300iOp32::DADDI, "R4300iOp32::DADDI"); + } + else + { + CompileInterpterCall((void *)R4300iOp::DADDI, "R4300iOp::DADDI"); + } +} + void CArmRecompilerOps::DADDIU() { if (m_Opcode.rs != 0) { WriteBack_GPR(m_Opcode.rs, false); } diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h index 4a3de5e44..bf683ec69 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h @@ -42,6 +42,7 @@ public: void ORI(); void XORI(); void LUI(); + void DADDI(); void DADDIU(); void LDL(); void LDR(); diff --git a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp index 4a5c5ea66..d2aed8b45 100644 --- a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp +++ b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp @@ -567,6 +567,7 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test) case R4300i_BNEL: m_RecompilerOps->Compile_BranchLikely(CRecompilerOps::CompareTypeBNE, false); break; case R4300i_BGTZL: m_RecompilerOps->Compile_BranchLikely(CRecompilerOps::CompareTypeBGTZ, false); break; case R4300i_BLEZL: m_RecompilerOps->Compile_BranchLikely(CRecompilerOps::CompareTypeBLEZ, false); break; + case R4300i_DADDI: m_RecompilerOps->DADDI(); break; case R4300i_DADDIU: m_RecompilerOps->DADDIU(); break; case R4300i_LDL: m_RecompilerOps->LDL(); break; case R4300i_LDR: m_RecompilerOps->LDR(); break; diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/RecompilerOps.h index c3425a639..aca02728e 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/RecompilerOps.h @@ -59,6 +59,7 @@ public: virtual void ORI() = 0; virtual void XORI() = 0; virtual void LUI() = 0; + virtual void DADDI() = 0; virtual void DADDIU() = 0; virtual void LDL() = 0; virtual void LDR() = 0; diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp index 27ee78aa5..07a38139c 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp @@ -2614,6 +2614,24 @@ void CX86RecompilerOps::LUI() m_RegWorkingSet.SetMipsRegState(m_Opcode.rt, CRegInfo::STATE_CONST_32_SIGN); } +void CX86RecompilerOps::DADDI() +{ + if (m_Opcode.rs != 0) + { + UnMap_GPR(m_Opcode.rs, true); + } + + if (m_Opcode.rs != 0) + { + UnMap_GPR(m_Opcode.rt, true); + } + + m_RegWorkingSet.BeforeCallDirect(); + MoveConstToVariable(m_Opcode.Value, &R4300iOp::m_Opcode.Value, "R4300iOp::m_Opcode.Value"); + Call_Direct((void *)R4300iOp::DADDI, "R4300iOp::DADDI"); + m_RegWorkingSet.AfterCallDirect(); +} + void CX86RecompilerOps::DADDIU() { if (m_Opcode.rs != 0) diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h index fa593f089..00b97130e 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h @@ -55,6 +55,7 @@ public: void ORI(); void XORI(); void LUI(); + void DADDI(); void DADDIU(); void LDL(); void LDR();