mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-01-15 16:33:15 -03:00
Jit64: Return current value from RCOpArg::IsImm
The constant propagation PR made it so that a guest register can be present in the register cache as both a host register and an immediate at the same time. If such a guest register is requested from the register cache, the register cache prefers returning it as a host register. However, RCOpArg::IsImm still returns true in this case. This is confusing, especially since OpArg::IsImm does not return true if the RCOpArg is converted into an OpArg. This commit makes RCOpArg::IsImm check whether RCOpArg::Location returns an immediate, so that RCOpArg::IsImm returns false when a host register is being used. Code that wants to know whether an immediate exists in the register cache rather than whether an immediate is currently being used should call RegCache::IsImm instead.
This commit is contained in:
@@ -132,47 +132,6 @@ void RCOpArg::Unlock()
|
||||
contents = std::monostate{};
|
||||
}
|
||||
|
||||
bool RCOpArg::IsImm() const
|
||||
{
|
||||
if (const preg_t* preg = std::get_if<preg_t>(&contents))
|
||||
{
|
||||
return rc->IsImm(*preg);
|
||||
}
|
||||
else if (std::holds_alternative<u32>(contents))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
s32 RCOpArg::SImm32() const
|
||||
{
|
||||
if (const preg_t* preg = std::get_if<preg_t>(&contents))
|
||||
{
|
||||
return rc->SImm32(*preg);
|
||||
}
|
||||
else if (const u32* imm = std::get_if<u32>(&contents))
|
||||
{
|
||||
return static_cast<s32>(*imm);
|
||||
}
|
||||
ASSERT(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 RCOpArg::Imm32() const
|
||||
{
|
||||
if (const preg_t* preg = std::get_if<preg_t>(&contents))
|
||||
{
|
||||
return rc->Imm32(*preg);
|
||||
}
|
||||
else if (const u32* imm = std::get_if<u32>(&contents))
|
||||
{
|
||||
return *imm;
|
||||
}
|
||||
ASSERT(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
RCX64Reg::RCX64Reg() = default;
|
||||
|
||||
RCX64Reg::RCX64Reg(RegCache* rc_, preg_t preg) : rc(rc_), contents(preg)
|
||||
|
||||
@@ -49,9 +49,9 @@ public:
|
||||
|
||||
void Unlock();
|
||||
|
||||
bool IsImm() const;
|
||||
s32 SImm32() const;
|
||||
u32 Imm32() const;
|
||||
bool IsImm() const { return Location().IsImm(); }
|
||||
s32 SImm32() const { return Location().SImm32(); }
|
||||
u32 Imm32() const { return Location().Imm32(); }
|
||||
bool IsZero() const { return IsImm() && Imm32() == 0; }
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user