2019-11-19 10:30:04 +00:00
|
|
|
#include "cpu_recompiler_thunks.h"
|
|
|
|
|
|
|
|
namespace CPU::Recompiler {
|
|
|
|
|
|
|
|
// TODO: Port thunks to "ASM routines", i.e. code in the jit buffer.
|
|
|
|
|
2019-11-21 13:33:58 +00:00
|
|
|
u64 Thunks::ReadMemoryByte(Core* cpu, u32 address)
|
2019-11-19 10:30:04 +00:00
|
|
|
{
|
2019-11-21 13:33:58 +00:00
|
|
|
u32 temp = 0;
|
|
|
|
const TickCount cycles = cpu->DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Byte>(address, temp);
|
|
|
|
if (cycles < 0)
|
|
|
|
{
|
|
|
|
cpu->RaiseException(Exception::DBE);
|
|
|
|
return UINT64_C(0xFFFFFFFFFFFFFFFF);
|
|
|
|
}
|
|
|
|
|
2019-12-05 06:28:44 +00:00
|
|
|
cpu->m_pending_ticks += cycles;
|
2019-11-21 13:33:58 +00:00
|
|
|
return ZeroExtend64(temp);
|
2019-11-19 10:30:04 +00:00
|
|
|
}
|
|
|
|
|
2019-11-21 13:33:58 +00:00
|
|
|
u64 Thunks::ReadMemoryHalfWord(Core* cpu, u32 address)
|
2019-11-19 10:30:04 +00:00
|
|
|
{
|
2019-11-21 13:33:58 +00:00
|
|
|
if (!cpu->DoAlignmentCheck<MemoryAccessType::Read, MemoryAccessSize::HalfWord>(address))
|
|
|
|
return UINT64_C(0xFFFFFFFFFFFFFFFF);
|
|
|
|
|
|
|
|
u32 temp = 0;
|
|
|
|
const TickCount cycles = cpu->DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::HalfWord>(address, temp);
|
|
|
|
if (cycles < 0)
|
|
|
|
{
|
|
|
|
cpu->RaiseException(Exception::DBE);
|
|
|
|
return UINT64_C(0xFFFFFFFFFFFFFFFF);
|
|
|
|
}
|
|
|
|
|
2019-12-05 06:28:44 +00:00
|
|
|
cpu->m_pending_ticks += cycles;
|
2019-11-21 13:33:58 +00:00
|
|
|
return ZeroExtend64(temp);
|
2019-11-19 10:30:04 +00:00
|
|
|
}
|
|
|
|
|
2019-11-21 13:33:58 +00:00
|
|
|
u64 Thunks::ReadMemoryWord(Core* cpu, u32 address)
|
2019-11-19 10:30:04 +00:00
|
|
|
{
|
2019-11-21 13:33:58 +00:00
|
|
|
if (!cpu->DoAlignmentCheck<MemoryAccessType::Read, MemoryAccessSize::Word>(address))
|
|
|
|
return UINT64_C(0xFFFFFFFFFFFFFFFF);
|
|
|
|
|
|
|
|
u32 temp = 0;
|
|
|
|
const TickCount cycles = cpu->DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Word>(address, temp);
|
|
|
|
if (cycles < 0)
|
|
|
|
{
|
|
|
|
cpu->RaiseException(Exception::DBE);
|
|
|
|
return UINT64_C(0xFFFFFFFFFFFFFFFF);
|
|
|
|
}
|
|
|
|
|
2019-12-05 06:28:44 +00:00
|
|
|
cpu->m_pending_ticks += cycles;
|
2019-11-21 13:33:58 +00:00
|
|
|
return ZeroExtend64(temp);
|
2019-11-19 10:30:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Thunks::WriteMemoryByte(Core* cpu, u32 address, u8 value)
|
|
|
|
{
|
|
|
|
return cpu->WriteMemoryByte(address, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Thunks::WriteMemoryHalfWord(Core* cpu, u32 address, u16 value)
|
|
|
|
{
|
|
|
|
return cpu->WriteMemoryHalfWord(address, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Thunks::WriteMemoryWord(Core* cpu, u32 address, u32 value)
|
|
|
|
{
|
|
|
|
return cpu->WriteMemoryWord(address, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Thunks::InterpretInstruction(Core* cpu)
|
|
|
|
{
|
|
|
|
cpu->ExecuteInstruction();
|
|
|
|
return cpu->m_exception_raised;
|
|
|
|
}
|
|
|
|
|
2019-11-19 14:15:14 +00:00
|
|
|
void Thunks::UpdateLoadDelay(Core* cpu)
|
|
|
|
{
|
|
|
|
cpu->UpdateLoadDelay();
|
|
|
|
}
|
|
|
|
|
2019-11-22 14:26:56 +00:00
|
|
|
void Thunks::RaiseException(Core* cpu, u8 excode)
|
|
|
|
{
|
|
|
|
cpu->RaiseException(static_cast<Exception>(excode));
|
|
|
|
}
|
|
|
|
|
2019-11-22 11:41:10 +00:00
|
|
|
void Thunks::RaiseAddressException(Core* cpu, u32 address, bool store, bool branch)
|
|
|
|
{
|
|
|
|
cpu->m_cop0_regs.BadVaddr = address;
|
|
|
|
if (branch)
|
|
|
|
cpu->RaiseException(Exception::AdEL, address, false, false, 0);
|
|
|
|
else
|
|
|
|
cpu->RaiseException(store ? Exception::AdES : Exception::AdEL);
|
|
|
|
}
|
|
|
|
|
2019-11-19 10:30:04 +00:00
|
|
|
} // namespace CPU::Recompiler
|