diff options
| author | 2022-04-04 11:07:38 -0700 | |
|---|---|---|
| committer | 2022-04-04 11:07:38 -0700 | |
| commit | f11443612041e66027e9f869c797a30af3788a93 (patch) | |
| tree | 0abb9ae160b2a6f16bd9d89f6a9a7490a95290bc /src/core | |
| parent | Merge pull request #8105 from merryhime/atomicload128 (diff) | |
| parent | configure_cpu: More descriptive text for Paranoid option (diff) | |
| download | yuzu-f11443612041e66027e9f869c797a30af3788a93.tar.gz yuzu-f11443612041e66027e9f869c797a30af3788a93.tar.xz yuzu-f11443612041e66027e9f869c797a30af3788a93.zip | |
Merge pull request #8089 from merryhime/paranoia
configuration: Add Paranoid CPU accuracy level
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 50 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 50 |
2 files changed, 56 insertions, 44 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 286976623..d4cbd0c20 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -186,35 +186,41 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 186 | if (!Settings::values.cpuopt_recompile_exclusives) { | 186 | if (!Settings::values.cpuopt_recompile_exclusives) { |
| 187 | config.recompile_on_exclusive_fastmem_failure = false; | 187 | config.recompile_on_exclusive_fastmem_failure = false; |
| 188 | } | 188 | } |
| 189 | } | 189 | } else { |
| 190 | // Unsafe optimizations | ||
| 191 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||
| 192 | config.unsafe_optimizations = true; | ||
| 193 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 194 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 195 | } | ||
| 196 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 197 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 198 | } | ||
| 199 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||
| 200 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | ||
| 201 | } | ||
| 202 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 203 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 204 | } | ||
| 205 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 206 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 207 | } | ||
| 208 | } | ||
| 190 | 209 | ||
| 191 | // Unsafe optimizations | 210 | // Curated optimizations |
| 192 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 211 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { |
| 193 | config.unsafe_optimizations = true; | 212 | config.unsafe_optimizations = true; |
| 194 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 195 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 213 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 196 | } | ||
| 197 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 198 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 199 | } | ||
| 200 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||
| 201 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | 214 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; |
| 202 | } | ||
| 203 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 204 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 215 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 205 | } | ||
| 206 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 207 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; |
| 208 | } | 217 | } |
| 209 | } | ||
| 210 | 218 | ||
| 211 | // Curated optimizations | 219 | // Paranoia mode for debugging optimizations |
| 212 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | 220 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) { |
| 213 | config.unsafe_optimizations = true; | 221 | config.unsafe_optimizations = false; |
| 214 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 222 | config.optimizations = Dynarmic::no_optimizations; |
| 215 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | 223 | } |
| 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 217 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 218 | } | 224 | } |
| 219 | 225 | ||
| 220 | return std::make_unique<Dynarmic::A32::Jit>(config); | 226 | return std::make_unique<Dynarmic::A32::Jit>(config); |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 24107f9f6..6d5a1ecfd 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -248,35 +248,41 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 248 | if (!Settings::values.cpuopt_recompile_exclusives) { | 248 | if (!Settings::values.cpuopt_recompile_exclusives) { |
| 249 | config.recompile_on_exclusive_fastmem_failure = false; | 249 | config.recompile_on_exclusive_fastmem_failure = false; |
| 250 | } | 250 | } |
| 251 | } | 251 | } else { |
| 252 | // Unsafe optimizations | ||
| 253 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||
| 254 | config.unsafe_optimizations = true; | ||
| 255 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 256 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 257 | } | ||
| 258 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 259 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 260 | } | ||
| 261 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 262 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 263 | } | ||
| 264 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 265 | config.fastmem_address_space_bits = 64; | ||
| 266 | } | ||
| 267 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 268 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 269 | } | ||
| 270 | } | ||
| 252 | 271 | ||
| 253 | // Unsafe optimizations | 272 | // Curated optimizations |
| 254 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 273 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { |
| 255 | config.unsafe_optimizations = true; | 274 | config.unsafe_optimizations = true; |
| 256 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 257 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 275 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 258 | } | ||
| 259 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 260 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 261 | } | ||
| 262 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 263 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 276 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 264 | } | ||
| 265 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 266 | config.fastmem_address_space_bits = 64; | 277 | config.fastmem_address_space_bits = 64; |
| 267 | } | ||
| 268 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 269 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | 278 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; |
| 270 | } | 279 | } |
| 271 | } | ||
| 272 | 280 | ||
| 273 | // Curated optimizations | 281 | // Paranoia mode for debugging optimizations |
| 274 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | 282 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) { |
| 275 | config.unsafe_optimizations = true; | 283 | config.unsafe_optimizations = false; |
| 276 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 284 | config.optimizations = Dynarmic::no_optimizations; |
| 277 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 285 | } |
| 278 | config.fastmem_address_space_bits = 64; | ||
| 279 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 280 | } | 286 | } |
| 281 | 287 | ||
| 282 | return std::make_shared<Dynarmic::A64::Jit>(config); | 288 | return std::make_shared<Dynarmic::A64::Jit>(config); |