CPU/Recompiler: Add GetValueInHostOrScratchRegister helper
This commit is contained in:
parent
cdd0a5525a
commit
1128836826
|
@ -179,6 +179,7 @@ private:
|
||||||
void ConvertValueSizeInPlace(Value* value, RegSize size, bool sign_extend);
|
void ConvertValueSizeInPlace(Value* value, RegSize size, bool sign_extend);
|
||||||
|
|
||||||
Value GetValueInHostRegister(const Value& value, bool allow_zero_register = true);
|
Value GetValueInHostRegister(const Value& value, bool allow_zero_register = true);
|
||||||
|
Value GetValueInHostOrScratchRegister(const Value& value, bool allow_zero_register = true);
|
||||||
|
|
||||||
void SwitchToFarCode();
|
void SwitchToFarCode();
|
||||||
void SwitchToNearCode();
|
void SwitchToNearCode();
|
||||||
|
|
|
@ -182,6 +182,19 @@ Value CodeGenerator::GetValueInHostRegister(const Value& value, bool allow_zero_
|
||||||
return new_value;
|
return new_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value CodeGenerator::GetValueInHostOrScratchRegister(const Value& value, bool allow_zero_register /* = true */)
|
||||||
|
{
|
||||||
|
if (value.IsInHostRegister())
|
||||||
|
return Value::FromHostReg(&m_register_cache, value.host_reg, value.size);
|
||||||
|
|
||||||
|
if (value.HasConstantValue(0) && allow_zero_register)
|
||||||
|
return Value::FromHostReg(&m_register_cache, static_cast<HostReg>(31), value.size);
|
||||||
|
|
||||||
|
Value new_value = Value::FromHostReg(&m_register_cache, RSCRATCH, value.size);
|
||||||
|
EmitCopyValue(new_value.host_reg, value);
|
||||||
|
return new_value;
|
||||||
|
}
|
||||||
|
|
||||||
void CodeGenerator::EmitBeginBlock()
|
void CodeGenerator::EmitBeginBlock()
|
||||||
{
|
{
|
||||||
m_emit->Sub(a64::sp, a64::sp, FUNCTION_STACK_SIZE);
|
m_emit->Sub(a64::sp, a64::sp, FUNCTION_STACK_SIZE);
|
||||||
|
|
|
@ -196,6 +196,16 @@ Value CodeGenerator::GetValueInHostRegister(const Value& value, bool allow_zero_
|
||||||
return new_value;
|
return new_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value CodeGenerator::GetValueInHostOrScratchRegister(const Value& value, bool allow_zero_register /* = true */)
|
||||||
|
{
|
||||||
|
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::EmitBeginBlock()
|
void CodeGenerator::EmitBeginBlock()
|
||||||
{
|
{
|
||||||
m_register_cache.AssumeCalleeSavedRegistersAreSaved();
|
m_register_cache.AssumeCalleeSavedRegistersAreSaved();
|
||||||
|
|
Loading…
Reference in New Issue