mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
Automatically disable fastmem and enable memcheck when there are any watchpoints.
- Move JitState::memcheck to JitOptions because it's an option. - Add JitOptions::fastmem; switch JIT code to checking that rather than bFastmem directly. - Add JitBase::UpdateMemoryOptions(), which sets both two JIT options (replacing the duplicate lines in Jit64 and JitIL that set memcheck from bMMU). - (!) The ARM JITs both had some lines that checked js.memcheck despite it being uninitialized in their cases. I've added UpdateMemoryOptions to both. There is a chance this could make something slower compared to the old behavior if the uninitialized value happened to be nonzero... hdkr should check this. - UpdateMemoryOptions forces jo.fastmem and jo.memcheck off and on, respectively, if there are any watchpoints set. - Also call that function from ClearCache. - Have MemChecks call ClearCache when the {first,last} watchpoint is {added,removed}. Enabling jo.memcheck (bah, confusing names) is currently pointless because hitting a watchpoint does not interrupt the basic block. That will change in the next commit.
This commit is contained in:
@ -77,7 +77,7 @@ bool Jitx86Base::BackPatch(u32 emAddress, SContext* ctx)
|
||||
BitSet32 registersInUse = it->second;
|
||||
|
||||
u8* exceptionHandler = nullptr;
|
||||
if (jit->js.memcheck)
|
||||
if (jit->jo.memcheck)
|
||||
{
|
||||
auto it2 = exceptionHandlerAtLoc.find(codePtr);
|
||||
if (it2 != exceptionHandlerAtLoc.end())
|
||||
|
@ -82,3 +82,12 @@ bool JitBase::MergeAllowedNextInstructions(int count)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void JitBase::UpdateMemoryOptions()
|
||||
{
|
||||
bool any_watchpoints = PowerPC::memchecks.HasAny();
|
||||
jo.fastmem = SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem &&
|
||||
!any_watchpoints;
|
||||
jo.memcheck = SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU ||
|
||||
any_watchpoints;
|
||||
}
|
||||
|
@ -61,6 +61,8 @@ protected:
|
||||
bool enableBlocklink;
|
||||
bool optimizeGatherPipe;
|
||||
bool accurateSinglePrecision;
|
||||
bool fastmem;
|
||||
bool memcheck;
|
||||
};
|
||||
struct JitState
|
||||
{
|
||||
@ -85,7 +87,6 @@ protected:
|
||||
bool assumeNoPairedQuantize;
|
||||
bool firstFPInstructionFound;
|
||||
bool isLastInstruction;
|
||||
bool memcheck;
|
||||
int skipInstructions;
|
||||
bool carryFlagSet;
|
||||
bool carryFlagInverted;
|
||||
@ -109,6 +110,8 @@ protected:
|
||||
|
||||
bool MergeAllowedNextInstructions(int count);
|
||||
|
||||
void UpdateMemoryOptions();
|
||||
|
||||
public:
|
||||
// This should probably be removed from public:
|
||||
JitOptions jo;
|
||||
|
@ -14,7 +14,7 @@ using namespace Gen;
|
||||
|
||||
void EmuCodeBlock::MemoryExceptionCheck()
|
||||
{
|
||||
if (jit->js.memcheck && !jit->js.fastmemLoadStore && !jit->js.fixupExceptionHandler)
|
||||
if (jit->jo.memcheck && !jit->js.fastmemLoadStore && !jit->js.fixupExceptionHandler)
|
||||
{
|
||||
TEST(32, PPCSTATE(Exceptions), Gen::Imm32(EXCEPTION_DSI));
|
||||
jit->js.exceptionHandler = J_CC(Gen::CC_NZ, true);
|
||||
@ -254,7 +254,7 @@ FixupBranch EmuCodeBlock::CheckIfSafeAddress(OpArg reg_value, X64Reg reg_addr, B
|
||||
// assuming they'll never do an invalid memory access.
|
||||
// The slightly more complex check needed for Wii games using the space just above MEM1 isn't
|
||||
// implemented here yet, since there are no known working Wii MMU games to test it with.
|
||||
if (jit->js.memcheck && !SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
|
||||
if (jit->jo.memcheck && !SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
|
||||
{
|
||||
if (scratch == reg_addr)
|
||||
PUSH(scratch);
|
||||
@ -276,7 +276,7 @@ FixupBranch EmuCodeBlock::CheckIfSafeAddress(OpArg reg_value, X64Reg reg_addr, B
|
||||
void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, int accessSize, s32 offset, BitSet32 registersInUse, bool signExtend, int flags)
|
||||
{
|
||||
registersInUse[reg_value] = false;
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem &&
|
||||
if (jit->jo.fastmem &&
|
||||
!opAddress.IsImm() &&
|
||||
!(flags & (SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_FASTMEM))
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
@ -521,7 +521,7 @@ void EmuCodeBlock::SafeWriteRegToReg(OpArg reg_value, X64Reg reg_addr, int acces
|
||||
reg_value = FixImmediate(accessSize, reg_value);
|
||||
|
||||
// TODO: support byte-swapped non-immediate fastmem stores
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem &&
|
||||
if (jit->jo.fastmem &&
|
||||
!(flags & SAFE_LOADSTORE_NO_FASTMEM) &&
|
||||
(reg_value.IsImm() || !(flags & SAFE_LOADSTORE_NO_SWAP))
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
|
Reference in New Issue
Block a user