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<JITArgs> 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<u8, N> 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;