PPC-Jit: Fix cache invalidation when doing a memory exception on 64bit
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7658 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
ea95e603b2
commit
7b00c2a6f7
|
@ -609,12 +609,22 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
|||
OR(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_ISI));
|
||||
|
||||
// Remove the invalid instruction from the icache, forcing a recompile
|
||||
#ifdef _M_IX86
|
||||
if (js.compilerPC & JIT_ICACHE_VMEM_BIT)
|
||||
MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
else if (js.blockStart & JIT_ICACHE_EXRAM_BIT)
|
||||
MOV(32, M((jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
else
|
||||
MOV(32, M((jit->GetBlockCache()->GetICache() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
#else
|
||||
if (js.compilerPC & JIT_ICACHE_VMEM_BIT)
|
||||
MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK)));
|
||||
else if (js.blockStart & JIT_ICACHE_EXRAM_BIT)
|
||||
MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK)));
|
||||
else
|
||||
MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICache() + (js.compilerPC & JIT_ICACHE_MASK)));
|
||||
MOV(32,MatR(RAX),Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
#endif
|
||||
|
||||
WriteExceptionExit();
|
||||
}
|
||||
|
|
|
@ -1894,6 +1894,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak
|
|||
Jit->OR(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_ISI));
|
||||
|
||||
// Remove the invalid instruction from the icache, forcing a recompile
|
||||
#ifdef _M_IX86
|
||||
if (InstLoc & JIT_ICACHE_VMEM_BIT)
|
||||
Jit->MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
else if (InstLoc & JIT_ICACHE_EXRAM_BIT)
|
||||
|
@ -1901,6 +1902,15 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak
|
|||
else
|
||||
Jit->MOV(32, M((jit->GetBlockCache()->GetICache() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
|
||||
#else
|
||||
if (InstLoc & JIT_ICACHE_VMEM_BIT)
|
||||
Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK)));
|
||||
else if (InstLoc & JIT_ICACHE_EXRAM_BIT)
|
||||
Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheEx() + (InstLoc & JIT_ICACHEEX_MASK)));
|
||||
else
|
||||
Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICache() + (InstLoc & JIT_ICACHE_MASK)));
|
||||
Jit->MOV(32, MatR(RAX), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||
#endif
|
||||
Jit->WriteExceptionExit();
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue