ConstantPool: Return a pointer instead of an OpArg

This allows for greater flexibility.
This commit is contained in:
MerryMage 2017-04-11 17:00:34 +01:00
parent 4e90c5da8b
commit 433999d60f
3 changed files with 13 additions and 14 deletions

View File

@ -7,7 +7,6 @@
#include <utility> #include <utility>
#include "Common/Assert.h" #include "Common/Assert.h"
#include "Common/x64Emitter.h"
#include "Core/PowerPC/Jit64Common/ConstantPool.h" #include "Core/PowerPC/Jit64Common/ConstantPool.h"
ConstantPool::ConstantPool() = default; ConstantPool::ConstantPool() = default;
@ -37,8 +36,8 @@ void ConstantPool::Shutdown()
m_const_info.clear(); m_const_info.clear();
} }
Gen::OpArg ConstantPool::GetConstantOpArg(const void* value, size_t element_size, const void* ConstantPool::GetConstant(const void* value, size_t element_size, size_t num_elements,
size_t num_elements, size_t index) size_t index)
{ {
const size_t value_size = element_size * num_elements; const size_t value_size = element_size * num_elements;
auto iter = m_const_info.find(value); auto iter = m_const_info.find(value);
@ -59,5 +58,5 @@ Gen::OpArg ConstantPool::GetConstantOpArg(const void* value, size_t element_size
_assert_msg_(DYNA_REC, info.m_size == value_size, _assert_msg_(DYNA_REC, info.m_size == value_size,
"Constant has incorrect size in constant pool."); "Constant has incorrect size in constant pool.");
u8* location = static_cast<u8*>(info.m_location); u8* location = static_cast<u8*>(info.m_location);
return Gen::M(location + element_size * index); return location + element_size * index;
} }

View File

@ -7,12 +7,6 @@
#include <cstddef> #include <cstddef>
#include <map> #include <map>
namespace Gen
{
struct OpArg;
class X64CodeBlock;
}
// Constants are copied into this pool so that they live at a memory location // Constants are copied into this pool so that they live at a memory location
// that is close to the code that references it. This ensures that the 32-bit // that is close to the code that references it. This ensures that the 32-bit
// limitation on RIP addressing is not an issue. // limitation on RIP addressing is not an issue.
@ -32,8 +26,8 @@ public:
// Copies the value into the pool if it doesn't exist. Returns a pointer // Copies the value into the pool if it doesn't exist. Returns a pointer
// to existing values if they were already copied. Pointer equality is // to existing values if they were already copied. Pointer equality is
// used to determine if two constants are the same. // used to determine if two constants are the same.
Gen::OpArg GetConstantOpArg(const void* value, size_t element_size, size_t num_elements, const void* GetConstant(const void* value, size_t element_size, size_t num_elements,
size_t index); size_t index);
private: private:
struct ConstantInfo struct ConstantInfo

View File

@ -29,16 +29,22 @@ public:
void SwitchToFarCode(); void SwitchToFarCode();
void SwitchToNearCode(); void SwitchToNearCode();
template <typename T>
const void* GetConstantFromPool(const T& value)
{
return m_const_pool.GetConstant(&value, sizeof(T), 1, 0);
}
template <typename T> template <typename T>
Gen::OpArg MConst(const T& value) Gen::OpArg MConst(const T& value)
{ {
return m_const_pool.GetConstantOpArg(&value, sizeof(T), 1, 0); return Gen::M(GetConstantFromPool(value));
} }
template <typename T, size_t N> template <typename T, size_t N>
Gen::OpArg MConst(const T (&value)[N], size_t index = 0) Gen::OpArg MConst(const T (&value)[N], size_t index = 0)
{ {
return m_const_pool.GetConstantOpArg(&value, sizeof(T), N, index); return Gen::M(m_const_pool.GetConstant(&value, sizeof(T), N, index));
} }
Gen::FixupBranch CheckIfSafeAddress(const Gen::OpArg& reg_value, Gen::X64Reg reg_addr, Gen::FixupBranch CheckIfSafeAddress(const Gen::OpArg& reg_value, Gen::X64Reg reg_addr,