Merge pull request #6335 from stenzek/membp
Jit64: Fix incorrect PC in PPC state during fastmem trampoline
This commit is contained in:
commit
e7d0aae5be
|
@ -923,10 +923,6 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
|
|||
fprToFlush[js.revertFprLoad] = false;
|
||||
gpr.Flush(RegCache::FlushMode::MaintainState, gprToFlush);
|
||||
fpr.Flush(RegCache::FlushMode::MaintainState, fprToFlush);
|
||||
|
||||
// If a memory exception occurs, the exception handler will read
|
||||
// from PC. Update PC with the latest value in case that happens.
|
||||
MOV(32, PPCSTATE(pc), Imm32(ops[i].address));
|
||||
WriteExceptionExit();
|
||||
SwitchToNearCode();
|
||||
}
|
||||
|
|
|
@ -376,6 +376,10 @@ void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg& opAddress,
|
|||
exit = J(true);
|
||||
SetJumpTarget(slow);
|
||||
}
|
||||
|
||||
// Helps external systems know which instruction triggered the read.
|
||||
MOV(32, PPCSTATE(pc), Imm32(g_jit->js.compilerPC));
|
||||
|
||||
size_t rsp_alignment = (flags & SAFE_LOADSTORE_NO_PROLOG) ? 8 : 0;
|
||||
ABI_PushRegistersAndAdjustStack(registersInUse, rsp_alignment);
|
||||
switch (accessSize)
|
||||
|
@ -436,6 +440,9 @@ void EmuCodeBlock::SafeLoadToRegImmediate(X64Reg reg_value, u32 address, int acc
|
|||
return;
|
||||
}
|
||||
|
||||
// Helps external systems know which instruction triggered the read.
|
||||
MOV(32, PPCSTATE(pc), Imm32(g_jit->js.compilerPC));
|
||||
|
||||
// Fall back to general-case code.
|
||||
ABI_PushRegistersAndAdjustStack(registersInUse, 0);
|
||||
switch (accessSize)
|
||||
|
|
|
@ -70,6 +70,7 @@ bool Jitx86Base::BackPatch(u32 emAddress, SContext* ctx)
|
|||
|
||||
js.generatingTrampoline = true;
|
||||
js.trampolineExceptionHandler = exceptionHandler;
|
||||
js.compilerPC = info.pc;
|
||||
|
||||
// Generate the trampoline.
|
||||
const u8* trampoline = trampolines.GenerateTrampoline(info);
|
||||
|
|
|
@ -63,9 +63,6 @@ const u8* TrampolineCache::GenerateWriteTrampoline(const TrampolineInfo& info)
|
|||
// Don't treat FIFO writes specially for now because they require a burst
|
||||
// check anyway.
|
||||
|
||||
// PC is used by memory watchpoints (if enabled) or to print accurate PC locations in debug logs
|
||||
MOV(32, PPCSTATE(pc), Imm32(info.pc));
|
||||
|
||||
SafeWriteRegToReg(info.op_arg, info.op_reg, info.accessSize << 3, info.offset,
|
||||
info.registersInUse, info.flags | SAFE_LOADSTORE_FORCE_SLOWMEM);
|
||||
|
||||
|
|
Loading…
Reference in New Issue