mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-22 22:01:06 -06:00
implement block linking + some refactoring
currently only supported for x64
This commit is contained in:
37
src/ARM.cpp
37
src/ARM.cpp
@ -252,15 +252,15 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr)
|
||||
if (addr & 0x2)
|
||||
{
|
||||
NextInstr[0] = CodeRead32(addr-2, true) >> 16;
|
||||
Cycles += CodeCycles;
|
||||
Cycles -= CodeCycles;
|
||||
NextInstr[1] = CodeRead32(addr+2, false);
|
||||
Cycles += CodeCycles;
|
||||
Cycles -= CodeCycles;
|
||||
}
|
||||
else
|
||||
{
|
||||
NextInstr[0] = CodeRead32(addr, true);
|
||||
NextInstr[1] = NextInstr[0] >> 16;
|
||||
Cycles += CodeCycles;
|
||||
Cycles -= CodeCycles;
|
||||
}
|
||||
|
||||
CPSR |= 0x20;
|
||||
@ -273,9 +273,9 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr)
|
||||
if (newregion != oldregion) SetupCodeMem(addr);
|
||||
|
||||
NextInstr[0] = CodeRead32(addr, true);
|
||||
Cycles += CodeCycles;
|
||||
Cycles -= CodeCycles;
|
||||
NextInstr[1] = CodeRead32(addr+4, false);
|
||||
Cycles += CodeCycles;
|
||||
Cycles -= CodeCycles;
|
||||
|
||||
CPSR &= ~0x20;
|
||||
}
|
||||
@ -315,7 +315,7 @@ void ARMv4::JumpTo(u32 addr, bool restorecpsr)
|
||||
|
||||
NextInstr[0] = CodeRead16(addr);
|
||||
NextInstr[1] = CodeRead16(addr+2);
|
||||
Cycles += NDS::ARM7MemTimings[CodeCycles][0] + NDS::ARM7MemTimings[CodeCycles][1];
|
||||
Cycles -= NDS::ARM7MemTimings[CodeCycles][0] + NDS::ARM7MemTimings[CodeCycles][1];
|
||||
|
||||
CPSR |= 0x20;
|
||||
}
|
||||
@ -328,7 +328,7 @@ void ARMv4::JumpTo(u32 addr, bool restorecpsr)
|
||||
|
||||
NextInstr[0] = CodeRead32(addr);
|
||||
NextInstr[1] = CodeRead32(addr+4);
|
||||
Cycles += NDS::ARM7MemTimings[CodeCycles][2] + NDS::ARM7MemTimings[CodeCycles][3];
|
||||
Cycles -= NDS::ARM7MemTimings[CodeCycles][2] + NDS::ARM7MemTimings[CodeCycles][3];
|
||||
|
||||
CPSR &= ~0x20;
|
||||
}
|
||||
@ -587,7 +587,7 @@ void ARMv5::Execute()
|
||||
}*/
|
||||
if (IRQ) TriggerIRQ();
|
||||
|
||||
NDS::ARM9Timestamp += Cycles;
|
||||
NDS::ARM9Timestamp -= Cycles;
|
||||
Cycles = 0;
|
||||
}
|
||||
|
||||
@ -627,14 +627,16 @@ void ARMv5::ExecuteJIT()
|
||||
return;
|
||||
}
|
||||
|
||||
ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock<0>(instrAddr);
|
||||
// hack so Cycles <= 0 becomes Cycles < 0
|
||||
Cycles = NDS::ARM9Target - NDS::ARM9Timestamp - 1;
|
||||
|
||||
ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlockEntry(ARMJIT::TranslateAddr<0>(instrAddr));
|
||||
if (block)
|
||||
Cycles += block();
|
||||
ARM_Dispatch(this, block);
|
||||
else
|
||||
ARMJIT::CompileBlock(this);
|
||||
|
||||
NDS::ARM9Timestamp += Cycles;
|
||||
Cycles = 0;
|
||||
NDS::ARM9Timestamp = NDS::ARM9Target - (Cycles + 1);
|
||||
|
||||
if (StopExecution)
|
||||
{
|
||||
@ -728,7 +730,7 @@ void ARMv4::Execute()
|
||||
}*/
|
||||
if (IRQ) TriggerIRQ();
|
||||
|
||||
NDS::ARM7Timestamp += Cycles;
|
||||
NDS::ARM7Timestamp -= Cycles;
|
||||
Cycles = 0;
|
||||
}
|
||||
|
||||
@ -768,14 +770,15 @@ void ARMv4::ExecuteJIT()
|
||||
return;
|
||||
}
|
||||
|
||||
ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock<1>(instrAddr);
|
||||
Cycles = NDS::ARM7Target - NDS::ARM7Timestamp - 1;
|
||||
|
||||
ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlockEntry(ARMJIT::TranslateAddr<1>(instrAddr));
|
||||
if (block)
|
||||
Cycles += block();
|
||||
ARM_Dispatch(this, block);
|
||||
else
|
||||
ARMJIT::CompileBlock(this);
|
||||
|
||||
NDS::ARM7Timestamp += Cycles;
|
||||
Cycles = 0;
|
||||
NDS::ARM7Timestamp = NDS::ARM7Target - (Cycles + 1);
|
||||
|
||||
// TODO optimize this shit!!!
|
||||
if (StopExecution)
|
||||
|
Reference in New Issue
Block a user