mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
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));
|
OR(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_ISI));
|
||||||
|
|
||||||
// Remove the invalid instruction from the icache, forcing a recompile
|
// Remove the invalid instruction from the icache, forcing a recompile
|
||||||
|
#ifdef _M_IX86
|
||||||
if (js.compilerPC & JIT_ICACHE_VMEM_BIT)
|
if (js.compilerPC & JIT_ICACHE_VMEM_BIT)
|
||||||
MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||||
else if (js.blockStart & JIT_ICACHE_EXRAM_BIT)
|
else if (js.blockStart & JIT_ICACHE_EXRAM_BIT)
|
||||||
MOV(32, M((jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
MOV(32, M((jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||||
else
|
else
|
||||||
MOV(32, M((jit->GetBlockCache()->GetICache() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
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();
|
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));
|
Jit->OR(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_ISI));
|
||||||
|
|
||||||
// Remove the invalid instruction from the icache, forcing a recompile
|
// Remove the invalid instruction from the icache, forcing a recompile
|
||||||
|
#ifdef _M_IX86
|
||||||
if (InstLoc & JIT_ICACHE_VMEM_BIT)
|
if (InstLoc & JIT_ICACHE_VMEM_BIT)
|
||||||
Jit->MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
Jit->MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
||||||
else if (InstLoc & JIT_ICACHE_EXRAM_BIT)
|
else if (InstLoc & JIT_ICACHE_EXRAM_BIT)
|
||||||
@ -1901,6 +1902,15 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak
|
|||||||
else
|
else
|
||||||
Jit->MOV(32, M((jit->GetBlockCache()->GetICache() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD));
|
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();
|
Jit->WriteExceptionExit();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user