Core: When running as recompiler in 32bit mode, if LW/SW are in delay slots on block boundaries use 32bit interpter functions

This commit is contained in:
zilmar 2024-11-21 19:13:56 +10:30
parent 5e1a40fffb
commit 315d5b9e66
6 changed files with 32 additions and 12 deletions

View File

@ -2,4 +2,5 @@
#include "../../3rdParty/zlib/contrib/minizip/unzip.h"
#include "../../3rdParty/zlib/contrib/minizip/zip.h"
#include "../../3rdParty/zlib/contrib/minizip/iowin32.h"

View File

@ -23,7 +23,7 @@ const int32_t R4300iOp::SWR_SHIFT[4] = {24, 16, 8, 0};
const int32_t R4300iOp::LWL_SHIFT[4] = {0, 8, 16, 24};
const int32_t R4300iOp::LWR_SHIFT[4] = {24, 16, 8, 0};
R4300iOp::R4300iOp(CN64System & System) :
R4300iOp::R4300iOp(CN64System & System, bool Force32bit) :
m_System(System),
m_Reg(System.m_Reg),
m_TLB(System.m_TLB),
@ -43,7 +43,7 @@ R4300iOp::R4300iOp(CN64System & System) :
m_LLBit(System.m_Reg.m_LLBit)
{
m_Opcode.Value = 0;
BuildInterpreter();
BuildInterpreter(Force32bit);
}
R4300iOp::~R4300iOp()
@ -263,7 +263,7 @@ void R4300iOp::COP1_L()
(this->*Jump_CoP1_L[m_Opcode.funct])();
}
void R4300iOp::BuildInterpreter()
void R4300iOp::BuildInterpreter(bool Force32bit)
{
Jump_Opcode[0] = &R4300iOp::SPECIAL;
Jump_Opcode[1] = &R4300iOp::REGIMM;
@ -300,7 +300,7 @@ void R4300iOp::BuildInterpreter()
Jump_Opcode[32] = &R4300iOp::LB;
Jump_Opcode[33] = &R4300iOp::LH;
Jump_Opcode[34] = &R4300iOp::LWL;
Jump_Opcode[35] = &R4300iOp::LW;
Jump_Opcode[35] = Force32bit ? &R4300iOp::LW_32 : &R4300iOp::LW;
Jump_Opcode[36] = &R4300iOp::LBU;
Jump_Opcode[37] = &R4300iOp::LHU;
Jump_Opcode[38] = &R4300iOp::LWR;
@ -308,7 +308,7 @@ void R4300iOp::BuildInterpreter()
Jump_Opcode[40] = &R4300iOp::SB;
Jump_Opcode[41] = &R4300iOp::SH;
Jump_Opcode[42] = &R4300iOp::SWL;
Jump_Opcode[43] = &R4300iOp::SW;
Jump_Opcode[43] = Force32bit ? &R4300iOp::SW_32 : &R4300iOp::SW;
Jump_Opcode[44] = &R4300iOp::SDL;
Jump_Opcode[45] = &R4300iOp::SDR;
Jump_Opcode[46] = &R4300iOp::SWR;
@ -1182,6 +1182,17 @@ void R4300iOp::LW()
}
}
void R4300iOp::LW_32()
{
uint64_t Address = m_GPR[m_Opcode.base].W[0] + (int16_t)m_Opcode.offset;
uint32_t MemoryValue;
if (m_MMU.LW_Memory(Address, MemoryValue))
{
m_GPR[m_Opcode.rt].DW = (int32_t)MemoryValue;
}
}
void R4300iOp::LBU()
{
uint64_t Address = m_GPR[m_Opcode.base].DW + (int16_t)m_Opcode.offset;
@ -1262,6 +1273,12 @@ void R4300iOp::SW()
m_MMU.SW_Memory(Address, m_GPR[m_Opcode.rt].UW[0]);
}
void R4300iOp::SW_32()
{
uint64_t Address = m_GPR[m_Opcode.base].W[0] + (int16_t)m_Opcode.offset;
m_MMU.SW_Memory(Address, m_GPR[m_Opcode.rt].UW[0]);
}
uint64_t SDL_MASK[8] = {0, 0xFF00000000000000,
0xFFFF000000000000,
0xFFFFFF0000000000,

View File

@ -13,7 +13,7 @@ class R4300iOp :
friend CX86RecompilerOps;
public:
R4300iOp(CN64System & System);
R4300iOp(CN64System & System, bool Force32bit);
~R4300iOp(void);
void ExecuteCPU();
@ -30,7 +30,7 @@ private:
R4300iOp(const R4300iOp &);
R4300iOp & operator=(const R4300iOp &);
void BuildInterpreter(void);
void BuildInterpreter(bool Force32bit);
typedef void (R4300iOp::*Func)();
@ -74,6 +74,7 @@ private:
void LH();
void LWL();
void LW();
void LW_32();
void LBU();
void LHU();
void LWR();
@ -82,6 +83,7 @@ private:
void SH();
void SWL();
void SW();
void SW_32();
void SDL();
void SDR();
void SWR();

View File

@ -32,7 +32,7 @@ CN64System::CN64System(CPlugins * Plugins, uint32_t randomizer_seed, bool SavesR
//m_Cheats(m_MMU_VM),
m_Reg(*this, m_SystemEvents),
m_TLB(m_MMU_VM, m_Reg, m_Recomp),
m_OpCodes(*this),
m_OpCodes(*this, !SyncSystem && g_Settings->LoadDword(Game_CpuType) != CPU_Interpreter && b32BitCore()),
m_Recomp(nullptr),
m_InReset(false),
m_NextTimer(0),

View File

@ -1102,9 +1102,9 @@ void CRomBrowser::SelectRomDir(void)
wchar_t Directory[_MAX_PATH];
if (SHGetPathFromIDList(pidl, Directory))
{
CPath RomDir(stdstr().FromUTF16(Directory), "");
g_Settings->SaveString(RomList_GameDir, RomDir.GetDriveDirectory());
Notify().AddRecentDir(RomDir.GetDriveDirectory().c_str());
CPath NewRomDir(stdstr().FromUTF16(Directory), "");
g_Settings->SaveString(RomList_GameDir, NewRomDir.GetDriveDirectory());
Notify().AddRecentDir(NewRomDir.GetDriveDirectory().c_str());
RefreshRomList();
}
}