From 48009fd898c2732652480bdf2c086ab6f77b2a7d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 5 Dec 2025 19:27:06 +0100 Subject: [PATCH] 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. --- .../PowerPC/Jit64/RegCache/JitRegCache.cpp | 41 ------------------- .../Core/PowerPC/Jit64/RegCache/JitRegCache.h | 6 +-- 2 files changed, 3 insertions(+), 44 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp index 2a787f31207..b39ed2e5616 100644 --- a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp +++ b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp @@ -132,47 +132,6 @@ void RCOpArg::Unlock() contents = std::monostate{}; } -bool RCOpArg::IsImm() const -{ - if (const preg_t* preg = std::get_if(&contents)) - { - return rc->IsImm(*preg); - } - else if (std::holds_alternative(contents)) - { - return true; - } - return false; -} - -s32 RCOpArg::SImm32() const -{ - if (const preg_t* preg = std::get_if(&contents)) - { - return rc->SImm32(*preg); - } - else if (const u32* imm = std::get_if(&contents)) - { - return static_cast(*imm); - } - ASSERT(false); - return 0; -} - -u32 RCOpArg::Imm32() const -{ - if (const preg_t* preg = std::get_if(&contents)) - { - return rc->Imm32(*preg); - } - else if (const u32* imm = std::get_if(&contents)) - { - return *imm; - } - ASSERT(false); - return 0; -} - RCX64Reg::RCX64Reg() = default; RCX64Reg::RCX64Reg(RegCache* rc_, preg_t preg) : rc(rc_), contents(preg) diff --git a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.h b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.h index 0a7ab3836d2..4d74285a513 100644 --- a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.h +++ b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.h @@ -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: