From a5318c775c2dd817cb857ea4e459f0e2bbe5c3a6 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 28 Jun 2022 11:58:17 -0700 Subject: [PATCH] constant_pool: Use `std::span` to manage pool Simplifies some raw pointer arithmetic and type-usage into the new `ConstantT` type. --- src/dynarmic/backend/x64/constant_pool.cpp | 18 +++++++++--------- src/dynarmic/backend/x64/constant_pool.h | 14 +++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/dynarmic/backend/x64/constant_pool.cpp b/src/dynarmic/backend/x64/constant_pool.cpp index 14e37f67..29678847 100644 --- a/src/dynarmic/backend/x64/constant_pool.cpp +++ b/src/dynarmic/backend/x64/constant_pool.cpp @@ -14,22 +14,22 @@ namespace Dynarmic::Backend::X64 { ConstantPool::ConstantPool(BlockOfCode& code, size_t size) - : code(code), pool_size(size) { + : code(code), insertion_point(0) { code.int3(); code.align(align_size); - pool_begin = reinterpret_cast(code.AllocateFromCodeSpace(size)); - current_pool_ptr = pool_begin; + pool = std::span( + reinterpret_cast(code.AllocateFromCodeSpace(size)), size / align_size); } Xbyak::Address ConstantPool::GetConstant(const Xbyak::AddressFrame& frame, u64 lower, u64 upper) { - const auto constant = std::make_pair(lower, upper); + const auto constant = ConstantT(lower, upper); auto iter = constant_info.find(constant); if (iter == constant_info.end()) { - ASSERT(static_cast(current_pool_ptr - pool_begin) < pool_size); - std::memcpy(current_pool_ptr, &lower, sizeof(u64)); - std::memcpy(current_pool_ptr + sizeof(u64), &upper, sizeof(u64)); - iter = constant_info.emplace(constant, current_pool_ptr).first; - current_pool_ptr += align_size; + ASSERT(insertion_point < pool.size()); + ConstantT& target_constant = pool[insertion_point]; + target_constant = constant; + iter = constant_info.emplace(constant, &target_constant).first; + ++insertion_point; } return frame[code.rip + iter->second]; } diff --git a/src/dynarmic/backend/x64/constant_pool.h b/src/dynarmic/backend/x64/constant_pool.h index 3a5717e9..2ab64215 100644 --- a/src/dynarmic/backend/x64/constant_pool.h +++ b/src/dynarmic/backend/x64/constant_pool.h @@ -6,6 +6,8 @@ #pragma once #include +#include +#include #include #include @@ -29,18 +31,20 @@ public: private: static constexpr size_t align_size = 16; // bytes + using ConstantT = std::pair; + static_assert(sizeof(ConstantT) == align_size); + struct ConstantHash { - std::size_t operator()(const std::pair& constant) const noexcept { + std::size_t operator()(const ConstantT& constant) const noexcept { return constant.first ^ std::rotl(constant.second, 1); } }; - tsl::robin_map, void*, ConstantHash> constant_info; + tsl::robin_map constant_info; BlockOfCode& code; - size_t pool_size; - u8* pool_begin; - u8* current_pool_ptr; + std::span pool; + std::size_t insertion_point; }; } // namespace Dynarmic::Backend::X64