diff options
| author | 2022-03-26 08:45:51 +0000 | |
|---|---|---|
| committer | 2022-03-26 08:46:25 +0000 | |
| commit | 3c8547160d47d113e8e90cfc58bbc0ad10bd345f (patch) | |
| tree | 328edad9df08c89e838c5f5b15b0d2af242f4188 /src/core | |
| parent | Merge pull request #8041 from Morph1984/inline-swkbd (diff) | |
| download | yuzu-3c8547160d47d113e8e90cfc58bbc0ad10bd345f.tar.gz yuzu-3c8547160d47d113e8e90cfc58bbc0ad10bd345f.tar.xz yuzu-3c8547160d47d113e8e90cfc58bbc0ad10bd345f.zip | |
configuration: Add Paranoid CPU accuracy level
Disables most optimizations for the paranoid.
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 d96226c41..a2d893450 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -246,35 +246,41 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 246 | if (!Settings::values.cpuopt_recompile_exclusives) { | 246 | if (!Settings::values.cpuopt_recompile_exclusives) { |
| 247 | config.recompile_on_exclusive_fastmem_failure = false; | 247 | config.recompile_on_exclusive_fastmem_failure = false; |
| 248 | } | 248 | } |
| 249 | } | 249 | } else { |
| 250 | // Unsafe optimizations | ||
| 251 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||
| 252 | config.unsafe_optimizations = true; | ||
| 253 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 254 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 255 | } | ||
| 256 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 257 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 258 | } | ||
| 259 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 260 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 261 | } | ||
| 262 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 263 | config.fastmem_address_space_bits = 64; | ||
| 264 | } | ||
| 265 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 266 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 267 | } | ||
| 268 | } | ||
| 250 | 269 | ||
| 251 | // Unsafe optimizations | 270 | // Curated optimizations |
| 252 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 271 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { |
| 253 | config.unsafe_optimizations = true; | 272 | config.unsafe_optimizations = true; |
| 254 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 255 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 273 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 256 | } | ||
| 257 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 258 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 259 | } | ||
| 260 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 261 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 274 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 262 | } | ||
| 263 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 264 | config.fastmem_address_space_bits = 64; | 275 | config.fastmem_address_space_bits = 64; |
| 265 | } | ||
| 266 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 267 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | 276 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; |
| 268 | } | 277 | } |
| 269 | } | ||
| 270 | 278 | ||
| 271 | // Curated optimizations | 279 | // Paranoia mode for debugging optimizations |
| 272 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | 280 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) { |
| 273 | config.unsafe_optimizations = true; | 281 | config.unsafe_optimizations = false; |
| 274 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 282 | config.optimizations = Dynarmic::no_optimizations; |
| 275 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 283 | } |
| 276 | config.fastmem_address_space_bits = 64; | ||
| 277 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 278 | } | 284 | } |
| 279 | 285 | ||
| 280 | return std::make_shared<Dynarmic::A64::Jit>(config); | 286 | return std::make_shared<Dynarmic::A64::Jit>(config); |