[AArch64] Implements block linking.
Before block linking was enabled but it wasn't ever implemented. Implements link blocks and destroy block functions and moves the downcount check in the WriteExit function so it doesn't get overwritten when linking.
This commit is contained in:
parent
ca04601b14
commit
51ad798105
|
@ -97,6 +97,8 @@ void JitArm64::DoDownCount()
|
|||
// Exits
|
||||
void JitArm64::WriteExit(u32 destination)
|
||||
{
|
||||
DoDownCount();
|
||||
|
||||
//If nobody has taken care of this yet (this can be removed when all branches are done)
|
||||
JitBlock *b = js.curBlock;
|
||||
JitBlock::LinkData linkData;
|
||||
|
@ -104,8 +106,6 @@ void JitArm64::WriteExit(u32 destination)
|
|||
linkData.exitPtrs = GetWritableCodePtr();
|
||||
linkData.linkStatus = false;
|
||||
|
||||
DoDownCount();
|
||||
|
||||
// Link opportunity!
|
||||
int block;
|
||||
if (jo.enableBlocklink && (block = blocks.GetBlockNumberFromStartAddress(destination)) >= 0)
|
||||
|
@ -163,13 +163,12 @@ void JitArm64::SingleStep()
|
|||
pExecAddr();
|
||||
}
|
||||
|
||||
void JitArm64::Jit(u32 em_address)
|
||||
void JitArm64::Jit(u32)
|
||||
{
|
||||
if (GetSpaceLeft() < 0x10000 || blocks.IsFull() || SConfig::GetInstance().m_LocalCoreStartupParameter.bJITNoBlockCache)
|
||||
{
|
||||
ClearCache();
|
||||
}
|
||||
|
||||
int block_num = blocks.AllocateBlock(PowerPC::ppcState.pc);
|
||||
JitBlock *b = blocks.GetBlock(block_num);
|
||||
const u8* BlockPtr = DoJit(PowerPC::ppcState.pc, &code_buffer, b);
|
||||
|
@ -282,6 +281,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
|
|||
|
||||
b->codeSize = (u32)(GetCodePtr() - normalEntry);
|
||||
b->originalSize = code_block.m_num_instructions;
|
||||
|
||||
FlushIcache();
|
||||
return start;
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ public:
|
|||
void Run();
|
||||
void SingleStep();
|
||||
|
||||
void Jit(u32 em_address);
|
||||
void Jit(u32);
|
||||
|
||||
const char *GetName()
|
||||
{
|
||||
|
|
|
@ -8,9 +8,18 @@
|
|||
|
||||
void JitArm64BlockCache::WriteLinkBlock(u8* location, const u8* address)
|
||||
{
|
||||
ARM64XEmitter emit(location);
|
||||
emit.B(address);
|
||||
emit.FlushIcache();
|
||||
}
|
||||
|
||||
void JitArm64BlockCache::WriteDestroyBlock(const u8* location, u32 address)
|
||||
{
|
||||
ARM64XEmitter emit((u8 *)location);
|
||||
emit.MOVI2R(W0, address);
|
||||
emit.MOVI2R(X30, (u64)jit->GetAsmRoutines()->dispatcher);
|
||||
emit.STR(INDEX_UNSIGNED, W0, X29, PPCSTATE_OFF(pc));
|
||||
emit.BR(X30);
|
||||
emit.FlushIcache();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue