From c12251607768afa133971f316dcb54b25522e86f Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 17 Nov 2020 12:41:59 -0800 Subject: [PATCH] Adds resizable frontend decoded buffer Allows us to save memory in the frontend decoder by starting out with a small buffer until we hit larger code blocks. --- External/FEXCore/Source/Interface/Core/Frontend.cpp | 12 ++++++++++-- External/FEXCore/Source/Interface/Core/Frontend.h | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/Frontend.cpp b/External/FEXCore/Source/Interface/Core/Frontend.cpp index 2afa80d57..062276db1 100644 --- a/External/FEXCore/Source/Interface/Core/Frontend.cpp +++ b/External/FEXCore/Source/Interface/Core/Frontend.cpp @@ -983,11 +983,19 @@ bool Decoder::DecodeInstructionsAtEntry(uint8_t const* _InstStream, uint64_t PC) break; } - if (DecodedSize >= CTX->Config.MaxInstPerBlock || - DecodedSize >= DecodedBuffer.size()) { + if (DecodedSize >= CTX->Config.MaxInstPerBlock) { break; } + if (DecodedSize >= DecodedBuffer.size() && + DecodedBuffer.size() == MaxDecodedBufferSize) { + break; + } + else if (DecodedSize >= DecodedBuffer.size()) { + // We can keep going + DecodedBuffer.resize(std::min(static_cast(DecodedBuffer.size() * 1.5), MaxDecodedBufferSize)); + } + if (TotalInstructions >= CTX->Config.MaxInstPerBlock) { break; } diff --git a/External/FEXCore/Source/Interface/Core/Frontend.h b/External/FEXCore/Source/Interface/Core/Frontend.h index 86ba0711a..d1c1ca669 100644 --- a/External/FEXCore/Source/Interface/Core/Frontend.h +++ b/External/FEXCore/Source/Interface/Core/Frontend.h @@ -45,7 +45,9 @@ private: bool NormalOp(FEXCore::X86Tables::X86InstInfo const *Info, uint16_t Op); bool NormalOpHeader(FEXCore::X86Tables::X86InstInfo const *Info, uint16_t Op); - static constexpr size_t DefaultDecodedBufferSize = 0x10000; + static constexpr size_t DefaultDecodedBufferSize = 0x200; + static constexpr size_t MaxDecodedBufferSize = 0x10000; + std::vector DecodedBuffer; size_t DecodedSize {};