Updated PC on a few memory writes that were missed in the FifoBusy branch. Thanks to hk.konpie for the tip.
Fixes issue 5993.
This commit is contained in:
parent
5f672baca3
commit
056930cac8
|
@ -291,7 +291,10 @@ static void ImHere()
|
||||||
void Jit64::Cleanup()
|
void Jit64::Cleanup()
|
||||||
{
|
{
|
||||||
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
|
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
|
||||||
|
{
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
|
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
|
||||||
|
}
|
||||||
|
|
||||||
// SPEED HACK: MMCR0/MMCR1 should be checked at run-time, not at compile time.
|
// SPEED HACK: MMCR0/MMCR1 should be checked at run-time, not at compile time.
|
||||||
if (MMCR0.Hex || MMCR1.Hex)
|
if (MMCR0.Hex || MMCR1.Hex)
|
||||||
|
@ -561,6 +564,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
||||||
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock >= 32)
|
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock >= 32)
|
||||||
{
|
{
|
||||||
js.fifoBytesThisBlock -= 32;
|
js.fifoBytesThisBlock -= 32;
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
ABI_CallFunction(thunks.ProtectFunction((void *)&GPFifo::CheckGatherPipe, 0));
|
ABI_CallFunction(thunks.ProtectFunction((void *)&GPFifo::CheckGatherPipe, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -303,6 +303,7 @@ void Jit64::stX(UGeckoInstruction inst)
|
||||||
addr += offset;
|
addr += offset;
|
||||||
if ((addr & 0xFFFFF000) == 0xCC008000 && jo.optimizeGatherPipe)
|
if ((addr & 0xFFFFF000) == 0xCC008000 && jo.optimizeGatherPipe)
|
||||||
{
|
{
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
gpr.FlushLockX(ABI_PARAM1);
|
gpr.FlushLockX(ABI_PARAM1);
|
||||||
MOV(32, R(ABI_PARAM1), gpr.R(s));
|
MOV(32, R(ABI_PARAM1), gpr.R(s));
|
||||||
if (update)
|
if (update)
|
||||||
|
@ -330,6 +331,7 @@ void Jit64::stX(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
switch (accessSize)
|
switch (accessSize)
|
||||||
{
|
{
|
||||||
case 32: ABI_CallFunctionAC(thunks.ProtectFunction(true ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), gpr.R(s), addr); break;
|
case 32: ABI_CallFunctionAC(thunks.ProtectFunction(true ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), gpr.R(s), addr); break;
|
||||||
|
|
|
@ -42,6 +42,7 @@ const u8 GC_ALIGNED16(pbswapShuffle2x4[16]) = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10,
|
||||||
#if 0
|
#if 0
|
||||||
static void WriteDual32(u64 value, u32 address)
|
static void WriteDual32(u64 value, u32 address)
|
||||||
{
|
{
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
Memory::Write_U32((u32)(value >> 32), address);
|
Memory::Write_U32((u32)(value >> 32), address);
|
||||||
Memory::Write_U32((u32)value, address + 4);
|
Memory::Write_U32((u32)value, address + 4);
|
||||||
}
|
}
|
||||||
|
|
|
@ -389,7 +389,10 @@ static void ImHere()
|
||||||
void JitIL::Cleanup()
|
void JitIL::Cleanup()
|
||||||
{
|
{
|
||||||
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
|
if (jo.optimizeGatherPipe && js.fifoBytesThisBlock > 0)
|
||||||
|
{
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
|
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
|
||||||
|
}
|
||||||
|
|
||||||
// SPEED HACK: MMCR0/MMCR1 should be checked at run-time, not at compile time.
|
// SPEED HACK: MMCR0/MMCR1 should be checked at run-time, not at compile time.
|
||||||
if (MMCR0.Hex || MMCR1.Hex)
|
if (MMCR0.Hex || MMCR1.Hex)
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "../../HW/GPFifo.h"
|
#include "../../HW/GPFifo.h"
|
||||||
#include "../../Core.h"
|
#include "../../Core.h"
|
||||||
#include "JitAsmCommon.h"
|
#include "JitAsmCommon.h"
|
||||||
|
#include "JitBase.h"
|
||||||
|
|
||||||
using namespace Gen;
|
using namespace Gen;
|
||||||
|
|
||||||
|
@ -179,6 +180,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||||
MOV(64, MComplex(RBX, RCX, SCALE_1, 0), R(RAX));
|
MOV(64, MComplex(RBX, RCX, SCALE_1, 0), R(RAX));
|
||||||
FixupBranch skip_complex = J();
|
FixupBranch skip_complex = J();
|
||||||
SetJumpTarget(too_complex);
|
SetJumpTarget(too_complex);
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&WriteDual32, 2), RAX, RCX);
|
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&WriteDual32, 2), RAX, RCX);
|
||||||
SetJumpTarget(skip_complex);
|
SetJumpTarget(skip_complex);
|
||||||
RET();
|
RET();
|
||||||
|
@ -195,6 +197,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||||
MOV(32, MDisp(ECX, 4+(u32)Memory::base), R(EAX));
|
MOV(32, MDisp(ECX, 4+(u32)Memory::base), R(EAX));
|
||||||
FixupBranch arg2 = J();
|
FixupBranch arg2 = J();
|
||||||
SetJumpTarget(argh);
|
SetJumpTarget(argh);
|
||||||
|
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||||
MOV(32, R(EAX), M(((char*)&psTemp)));
|
MOV(32, R(EAX), M(((char*)&psTemp)));
|
||||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX);
|
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX);
|
||||||
MOV(32, R(EAX), M(((char*)&psTemp)+4));
|
MOV(32, R(EAX), M(((char*)&psTemp)+4));
|
||||||
|
|
Loading…
Reference in New Issue