|
|
|
|
@ -5,16 +5,6 @@ Log_SetChannel(CPU::Recompiler);
|
|
|
|
|
|
|
|
|
|
namespace CPU::Recompiler {
|
|
|
|
|
|
|
|
|
|
CodeGenerator::CodeGenerator(Core* cpu, JitCodeBuffer* code_buffer, const ASMFunctions& asm_functions)
|
|
|
|
|
: m_cpu(cpu), m_code_buffer(code_buffer), m_asm_functions(asm_functions), m_register_cache(*this),
|
|
|
|
|
m_near_emitter(code_buffer->GetFreeCodeSpace(), code_buffer->GetFreeCodePointer()),
|
|
|
|
|
m_far_emitter(code_buffer->GetFreeFarCodeSpace(), code_buffer->GetFreeFarCodePointer()), m_emit(&m_near_emitter)
|
|
|
|
|
{
|
|
|
|
|
InitHostRegs();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CodeGenerator::~CodeGenerator() = default;
|
|
|
|
|
|
|
|
|
|
u32 CodeGenerator::CalculateRegisterOffset(Reg reg)
|
|
|
|
|
{
|
|
|
|
|
return uint32(offsetof(Core, m_regs.r[0]) + (static_cast<u32>(reg) * sizeof(u32)));
|
|
|
|
|
@ -255,6 +245,16 @@ Value CodeGenerator::ConvertValueSize(const Value& value, RegSize size, bool sig
|
|
|
|
|
return new_value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Value CodeGenerator::GetValueInHostRegister(const Value& value)
|
|
|
|
|
{
|
|
|
|
|
if (value.IsInHostRegister())
|
|
|
|
|
return Value(value.regcache, value.host_reg, value.size, ValueFlags::Valid | ValueFlags::InHostRegister);
|
|
|
|
|
|
|
|
|
|
Value new_value = m_register_cache.AllocateScratch(value.size);
|
|
|
|
|
EmitCopyValue(new_value.host_reg, value);
|
|
|
|
|
return new_value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CodeGenerator::ConvertValueSizeInPlace(Value* value, RegSize size, bool sign_extend)
|
|
|
|
|
{
|
|
|
|
|
DebugAssert(value->size != size);
|
|
|
|
|
|