From c5325c2ff309bf4c262a38d9cdb6312c0348f1e6 Mon Sep 17 00:00:00 2001
From: Bruno <56844494+fab918@users.noreply.github.com>
Date: Sun, 27 Sep 2026 13:23:08 +0200
Subject: [PATCH] perf(cpu): tune Release JIT compilation (#301)
---
property_sheets/platform.props | 2 +-
property_sheets/release.props | 5 +++--
src/nxemu-cpu/arm_dynarmic_32.cpp | 5 +++++
src/nxemu-cpu/arm_dynarmic_64.cpp | 5 +++++
src/nxemu-cpu/dynarmic/backend/arm64/a32_address_space.cpp | 4 +++-
src/nxemu-cpu/dynarmic/backend/arm64/a64_address_space.cpp | 4 +++-
src/nxemu-cpu/dynarmic/backend/x64/a32_interface.cpp | 4 +++-
src/nxemu-cpu/dynarmic/backend/x64/a64_interface.cpp | 4 +++-
src/nxemu-cpu/dynarmic/interface/optimization_flags.h | 2 ++
9 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/property_sheets/platform.props b/property_sheets/platform.props
index 2ef53089..b874c0b9 100644
--- a/property_sheets/platform.props
+++ b/property_sheets/platform.props
@@ -62,7 +62,7 @@
false
true
false
- Async
+ Sync
Default
Default
false
diff --git a/property_sheets/release.props b/property_sheets/release.props
index 7988289f..921a427b 100644
--- a/property_sheets/release.props
+++ b/property_sheets/release.props
@@ -3,14 +3,15 @@
NDEBUG;%(PreprocessorDefinitions)
- MinSpace
+ MaxSpeed
Default
true
- Size
+ Speed
false
false
false
MultiThreaded
+ /Gw %(AdditionalOptions)
NDEBUG;%(PreprocessorDefinitions)
diff --git a/src/nxemu-cpu/arm_dynarmic_32.cpp b/src/nxemu-cpu/arm_dynarmic_32.cpp
index 4396a7ec..840ba658 100644
--- a/src/nxemu-cpu/arm_dynarmic_32.cpp
+++ b/src/nxemu-cpu/arm_dynarmic_32.cpp
@@ -238,9 +238,14 @@ std::shared_ptr ArmDynarmic32::MakeJit(IKernelProcess & proc
config.check_halt_on_memory_access = true;
}
+#if !defined(NDEBUG)
+ config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
+#endif
+
// Safe optimizations
if (cpuSettings.cpu_debug_mode)
{
+ config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
if (!cpuSettings.cpuopt_page_tables)
{
config.page_table = nullptr;
diff --git a/src/nxemu-cpu/arm_dynarmic_64.cpp b/src/nxemu-cpu/arm_dynarmic_64.cpp
index fd1b07c8..acc7d04e 100644
--- a/src/nxemu-cpu/arm_dynarmic_64.cpp
+++ b/src/nxemu-cpu/arm_dynarmic_64.cpp
@@ -369,9 +369,14 @@ std::shared_ptr ArmDynarmic64::MakeJit(IKernelProcess & proc
config.check_halt_on_memory_access = true;
}
+#if !defined(NDEBUG)
+ config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
+#endif
+
// Safe optimizations
if (cpuSettings.cpu_debug_mode)
{
+ config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
if (!cpuSettings.cpuopt_page_tables)
{
config.page_table = nullptr;
diff --git a/src/nxemu-cpu/dynarmic/backend/arm64/a32_address_space.cpp b/src/nxemu-cpu/dynarmic/backend/arm64/a32_address_space.cpp
index 9808d53b..42dc1b97 100644
--- a/src/nxemu-cpu/dynarmic/backend/arm64/a32_address_space.cpp
+++ b/src/nxemu-cpu/dynarmic/backend/arm64/a32_address_space.cpp
@@ -176,7 +176,9 @@ IR::Block A32AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
Optimization::DeadCodeElimination(ir_block);
}
Optimization::IdentityRemovalPass(ir_block);
- Optimization::VerificationPass(ir_block);
+ if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
+ Optimization::VerificationPass(ir_block);
+ }
return ir_block;
}
diff --git a/src/nxemu-cpu/dynarmic/backend/arm64/a64_address_space.cpp b/src/nxemu-cpu/dynarmic/backend/arm64/a64_address_space.cpp
index adb78120..9d82fb47 100644
--- a/src/nxemu-cpu/dynarmic/backend/arm64/a64_address_space.cpp
+++ b/src/nxemu-cpu/dynarmic/backend/arm64/a64_address_space.cpp
@@ -345,7 +345,9 @@ IR::Block A64AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) {
Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks);
}
- Optimization::VerificationPass(ir_block);
+ if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
+ Optimization::VerificationPass(ir_block);
+ }
return ir_block;
}
diff --git a/src/nxemu-cpu/dynarmic/backend/x64/a32_interface.cpp b/src/nxemu-cpu/dynarmic/backend/x64/a32_interface.cpp
index 84f84f5d..f899789a 100644
--- a/src/nxemu-cpu/dynarmic/backend/x64/a32_interface.cpp
+++ b/src/nxemu-cpu/dynarmic/backend/x64/a32_interface.cpp
@@ -226,7 +226,9 @@ private:
Optimization::DeadCodeElimination(ir_block);
}
Optimization::IdentityRemovalPass(ir_block);
- Optimization::VerificationPass(ir_block);
+ if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
+ Optimization::VerificationPass(ir_block);
+ }
return emitter.Emit(ir_block);
}
diff --git a/src/nxemu-cpu/dynarmic/backend/x64/a64_interface.cpp b/src/nxemu-cpu/dynarmic/backend/x64/a64_interface.cpp
index 69f455db..fb36b111 100644
--- a/src/nxemu-cpu/dynarmic/backend/x64/a64_interface.cpp
+++ b/src/nxemu-cpu/dynarmic/backend/x64/a64_interface.cpp
@@ -295,7 +295,9 @@ private:
if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) {
Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks);
}
- Optimization::VerificationPass(ir_block);
+ if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
+ Optimization::VerificationPass(ir_block);
+ }
return emitter.Emit(ir_block).entrypoint;
}
diff --git a/src/nxemu-cpu/dynarmic/interface/optimization_flags.h b/src/nxemu-cpu/dynarmic/interface/optimization_flags.h
index 2f65f0bf..063f16bf 100644
--- a/src/nxemu-cpu/dynarmic/interface/optimization_flags.h
+++ b/src/nxemu-cpu/dynarmic/interface/optimization_flags.h
@@ -32,6 +32,8 @@ enum class OptimizationFlag : std::uint32_t {
ConstProp = 0x00000010,
/// This is enables miscellaneous safe IR optimizations.
MiscIROpt = 0x00000020,
+ /// Disable IR verification passes after translation and optimization.
+ DisableVerification = 0x00000080,
/// This is an UNSAFE optimization that reduces accuracy of fused multiply-add operations.
/// This unfuses fused instructions to improve performance on host CPUs without FMA support.