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.