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:
JosJuice
2025-12-05 19:27:06 +01:00
parent 213dc1c9af
commit 48009fd898
2 changed files with 3 additions and 44 deletions

View File

@@ -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)

View File

@@ -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: