From ad114eb6e627600c961268dd2efa820bf752f579 Mon Sep 17 00:00:00 2001 From: Ameer J <52414509+ameerj@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:17:51 -0500 Subject: [PATCH] ARMJIT: Use compile-time constant sized arrays --- src/ARMJIT.cpp | 20 ++++++++++---------- src/ARMJIT.h | 4 +++- src/Args.h | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp index 9582f7c8..5e103071 100644 --- a/src/ARMJIT.cpp +++ b/src/ARMJIT.cpp @@ -472,7 +472,7 @@ ARMJIT::ARMJIT(melonDS::NDS& nds, std::optional jit) noexcept : NDS(nds), Memory(nds), JITCompiler(nds), - MaxBlockSize(jit.has_value() ? std::clamp(jit->MaxBlockSize, 1u, 32u) : 32), + MaxBlockSize(jit.has_value() ? std::clamp(jit->MaxBlockSize, 1u, MaxSupportedBlockSize) : MaxSupportedBlockSize), LiteralOptimizations(jit.has_value() ? jit->LiteralOptimizations : false), BranchOptimizations(jit.has_value() ? jit->BranchOptimizations : false), FastMemory((jit.has_value() ? jit->FastMemory : false) && ARMJIT_Memory::IsFastMemSupported()) @@ -495,7 +495,7 @@ void ARMJIT::RetireJitBlock(JitBlock* block) noexcept void ARMJIT::SetJITArgs(JITArgs args) noexcept { args.FastMemory = args.FastMemory && ARMJIT_Memory::IsFastMemSupported(); - args.MaxBlockSize = std::clamp(args.MaxBlockSize, 1u, 32u); + args.MaxBlockSize = std::clamp(args.MaxBlockSize, 1u, MaxSupportedBlockSize); if (MaxBlockSize != args.MaxBlockSize || LiteralOptimizations != args.LiteralOptimizations @@ -565,24 +565,24 @@ void ARMJIT::CompileBlock(ARM* cpu) noexcept map.erase(existingBlockIt); } - FetchedInstr instrs[MaxBlockSize]; + FetchedInstr instrs[MaxSupportedBlockSize]; int i = 0; u32 r15 = cpu->R[15]; - u32 addressRanges[MaxBlockSize]; - u32 addressMasks[MaxBlockSize]; - memset(addressMasks, 0, MaxBlockSize * sizeof(u32)); + u32 addressRanges[MaxSupportedBlockSize]; + u32 addressMasks[MaxSupportedBlockSize] {}; + u32 numAddressRanges = 0; u32 numLiterals = 0; - u32 literalLoadAddrs[MaxBlockSize]; + u32 literalLoadAddrs[MaxSupportedBlockSize]; // they are going to be hashed - u32 literalValues[MaxBlockSize]; - u32 instrValues[MaxBlockSize]; + u32 literalValues[MaxSupportedBlockSize]; + u32 instrValues[MaxSupportedBlockSize]; // due to instruction merging i might not reflect the amount of actual instructions u32 numInstrs = 0; - u32 writeAddrs[MaxBlockSize]; + u32 writeAddrs[MaxSupportedBlockSize]; u32 numWriteAddrs = 0, writeAddrsTranslated = 0; cpu->FillPipeline(); diff --git a/src/ARMJIT.h b/src/ARMJIT.h index 309aa8e8..72209bf3 100644 --- a/src/ARMJIT.h +++ b/src/ARMJIT.h @@ -67,8 +67,10 @@ public: u32 LocaliseCodeAddress(u32 num, u32 addr) const noexcept; ARMJIT_Memory Memory; + + static constexpr u32 MaxSupportedBlockSize = 32; private: - int MaxBlockSize {}; + u32 MaxBlockSize {}; bool LiteralOptimizations = false; bool BranchOptimizations = false; bool FastMemory = false; diff --git a/src/Args.h b/src/Args.h index 4f4fa1f0..f27c045b 100644 --- a/src/Args.h +++ b/src/Args.h @@ -58,7 +58,7 @@ constexpr std::array BrokenBIOS = []() constexpr { /// Ignored in builds that don't have the JIT included. struct JITArgs { - unsigned MaxBlockSize = 32; + u32 MaxBlockSize = 32; bool LiteralOptimizations = true; bool BranchOptimizations = true;