Jit64: Add a switch for easier fallback to the C++ dispatcher.
This commit is contained in:
parent
9b77a39767
commit
43cdbab515
|
@ -92,19 +92,10 @@ void Jit64AsmRoutineManager::Generate()
|
||||||
|
|
||||||
dispatcherNoCheck = GetCodePtr();
|
dispatcherNoCheck = GetCodePtr();
|
||||||
|
|
||||||
// Switch to the correct memory base, in case MSR.DR has changed.
|
|
||||||
// TODO: Is there a more efficient place to put this? We don't
|
|
||||||
// need to do this for indirect jumps, just exceptions etc.
|
|
||||||
TEST(32, PPCSTATE(msr), Imm32(1 << (31 - 27)));
|
|
||||||
FixupBranch physmem = J_CC(CC_NZ);
|
|
||||||
MOV(64, R(RMEM), ImmPtr(Memory::physical_base));
|
|
||||||
FixupBranch membaseend = J();
|
|
||||||
SetJumpTarget(physmem);
|
|
||||||
MOV(64, R(RMEM), ImmPtr(Memory::logical_base));
|
|
||||||
SetJumpTarget(membaseend);
|
|
||||||
|
|
||||||
// The following is a translation of JitBaseBlockCache::Dispatch into assembly.
|
// The following is a translation of JitBaseBlockCache::Dispatch into assembly.
|
||||||
|
const bool assembly_dispatcher = true;
|
||||||
|
if (assembly_dispatcher)
|
||||||
|
{
|
||||||
// Fast block number lookup.
|
// Fast block number lookup.
|
||||||
// ((PC >> 2) & mask) * sizeof(JitBlock*) = (PC & (mask << 2)) * 2
|
// ((PC >> 2) & mask) * sizeof(JitBlock*) = (PC & (mask << 2)) * 2
|
||||||
MOV(32, R(RSCRATCH), PPCSTATE(pc));
|
MOV(32, R(RSCRATCH), PPCSTATE(pc));
|
||||||
|
@ -132,14 +123,22 @@ void Jit64AsmRoutineManager::Generate()
|
||||||
OR(64, R(RSCRATCH2), R(RSCRATCH_EXTRA));
|
OR(64, R(RSCRATCH2), R(RSCRATCH_EXTRA));
|
||||||
CMP(64, R(RSCRATCH2), MDisp(RSCRATCH, static_cast<s32>(offsetof(JitBlock, effectiveAddress))));
|
CMP(64, R(RSCRATCH2), MDisp(RSCRATCH, static_cast<s32>(offsetof(JitBlock, effectiveAddress))));
|
||||||
FixupBranch state_mismatch = J_CC(CC_NE);
|
FixupBranch state_mismatch = J_CC(CC_NE);
|
||||||
|
|
||||||
// Success; branch to the block we found.
|
// Success; branch to the block we found.
|
||||||
|
// Switch to the correct memory base, in case MSR.DR has changed.
|
||||||
|
TEST(32, PPCSTATE(msr), Imm32(1 << (31 - 27)));
|
||||||
|
FixupBranch physmem = J_CC(CC_Z);
|
||||||
|
MOV(64, R(RMEM), ImmPtr(Memory::logical_base));
|
||||||
JMPptr(MDisp(RSCRATCH, static_cast<s32>(offsetof(JitBlock, normalEntry))));
|
JMPptr(MDisp(RSCRATCH, static_cast<s32>(offsetof(JitBlock, normalEntry))));
|
||||||
|
SetJumpTarget(physmem);
|
||||||
|
MOV(64, R(RMEM), ImmPtr(Memory::physical_base));
|
||||||
|
JMPptr(MDisp(RSCRATCH, static_cast<s32>(offsetof(JitBlock, normalEntry))));
|
||||||
|
|
||||||
SetJumpTarget(not_found);
|
SetJumpTarget(not_found);
|
||||||
SetJumpTarget(state_mismatch);
|
SetJumpTarget(state_mismatch);
|
||||||
|
|
||||||
// Failure; call into the block cache to update the state, then try again.
|
// Failure, fallback to the C++ dispatcher for calling the JIT.
|
||||||
// (We need to loop because Jit() might not actually generate a block
|
}
|
||||||
// if we hit an ISI.)
|
|
||||||
|
|
||||||
// We reset the stack because Jit might clear the code cache.
|
// We reset the stack because Jit might clear the code cache.
|
||||||
// Also if we are in the middle of disabling BLR optimization on windows
|
// Also if we are in the middle of disabling BLR optimization on windows
|
||||||
|
@ -151,8 +150,15 @@ void Jit64AsmRoutineManager::Generate()
|
||||||
ABI_PushRegistersAndAdjustStack({}, 0);
|
ABI_PushRegistersAndAdjustStack({}, 0);
|
||||||
ABI_CallFunction(JitBase::Dispatch);
|
ABI_CallFunction(JitBase::Dispatch);
|
||||||
ABI_PopRegistersAndAdjustStack({}, 0);
|
ABI_PopRegistersAndAdjustStack({}, 0);
|
||||||
// JMPptr(R(ABI_RETURN));
|
|
||||||
JMP(dispatcherNoCheck, true);
|
// Switch to the correct memory base, in case MSR.DR has changed.
|
||||||
|
TEST(32, PPCSTATE(msr), Imm32(1 << (31 - 27)));
|
||||||
|
FixupBranch physmem = J_CC(CC_Z);
|
||||||
|
MOV(64, R(RMEM), ImmPtr(Memory::logical_base));
|
||||||
|
JMPptr(R(ABI_RETURN));
|
||||||
|
SetJumpTarget(physmem);
|
||||||
|
MOV(64, R(RMEM), ImmPtr(Memory::physical_base));
|
||||||
|
JMPptr(R(ABI_RETURN));
|
||||||
|
|
||||||
SetJumpTarget(bail);
|
SetJumpTarget(bail);
|
||||||
doTiming = GetCodePtr();
|
doTiming = GetCodePtr();
|
||||||
|
|
Loading…
Reference in New Issue