mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-25 21:06:58 -05:00
Merge pull request #8089 from merryhime/paranoia
configuration: Add Paranoid CPU accuracy level
This commit is contained in:
commit
f114436120
4 changed files with 63 additions and 45 deletions
|
@ -38,6 +38,7 @@ enum class CPUAccuracy : u32 {
|
||||||
Auto = 0,
|
Auto = 0,
|
||||||
Accurate = 1,
|
Accurate = 1,
|
||||||
Unsafe = 2,
|
Unsafe = 2,
|
||||||
|
Paranoid = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class FullscreenMode : u32 {
|
enum class FullscreenMode : u32 {
|
||||||
|
@ -470,7 +471,7 @@ struct Values {
|
||||||
|
|
||||||
// Cpu
|
// Cpu
|
||||||
RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto,
|
RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto,
|
||||||
CPUAccuracy::Unsafe, "cpu_accuracy"};
|
CPUAccuracy::Paranoid, "cpu_accuracy"};
|
||||||
// TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021
|
// TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021
|
||||||
BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"};
|
BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"};
|
||||||
BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"};
|
BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"};
|
||||||
|
|
|
@ -186,35 +186,41 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
|
||||||
if (!Settings::values.cpuopt_recompile_exclusives) {
|
if (!Settings::values.cpuopt_recompile_exclusives) {
|
||||||
config.recompile_on_exclusive_fastmem_failure = false;
|
config.recompile_on_exclusive_fastmem_failure = false;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
// Unsafe optimizations
|
||||||
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
|
||||||
|
config.unsafe_optimizations = true;
|
||||||
|
if (Settings::values.cpuopt_unsafe_unfuse_fma) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Unsafe optimizations
|
// Curated optimizations
|
||||||
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
|
||||||
config.unsafe_optimizations = true;
|
config.unsafe_optimizations = true;
|
||||||
if (Settings::values.cpuopt_unsafe_unfuse_fma) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Curated optimizations
|
// Paranoia mode for debugging optimizations
|
||||||
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) {
|
||||||
config.unsafe_optimizations = true;
|
config.unsafe_optimizations = false;
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
config.optimizations = Dynarmic::no_optimizations;
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue;
|
}
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_unique<Dynarmic::A32::Jit>(config);
|
return std::make_unique<Dynarmic::A32::Jit>(config);
|
||||||
|
|
|
@ -248,35 +248,41 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
|
||||||
if (!Settings::values.cpuopt_recompile_exclusives) {
|
if (!Settings::values.cpuopt_recompile_exclusives) {
|
||||||
config.recompile_on_exclusive_fastmem_failure = false;
|
config.recompile_on_exclusive_fastmem_failure = false;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
// Unsafe optimizations
|
||||||
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
|
||||||
|
config.unsafe_optimizations = true;
|
||||||
|
if (Settings::values.cpuopt_unsafe_unfuse_fma) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_fastmem_check) {
|
||||||
|
config.fastmem_address_space_bits = 64;
|
||||||
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Unsafe optimizations
|
// Curated optimizations
|
||||||
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) {
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
|
||||||
config.unsafe_optimizations = true;
|
config.unsafe_optimizations = true;
|
||||||
if (Settings::values.cpuopt_unsafe_unfuse_fma) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_fastmem_check) {
|
|
||||||
config.fastmem_address_space_bits = 64;
|
config.fastmem_address_space_bits = 64;
|
||||||
}
|
|
||||||
if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Curated optimizations
|
// Paranoia mode for debugging optimizations
|
||||||
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) {
|
if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) {
|
||||||
config.unsafe_optimizations = true;
|
config.unsafe_optimizations = false;
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA;
|
config.optimizations = Dynarmic::no_optimizations;
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
}
|
||||||
config.fastmem_address_space_bits = 64;
|
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_shared<Dynarmic::A64::Jit>(config);
|
return std::make_shared<Dynarmic::A64::Jit>(config);
|
||||||
|
|
|
@ -52,6 +52,11 @@
|
||||||
<string>Unsafe</string>
|
<string>Unsafe</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Paranoid (disables most optimizations)</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
Loading…
Reference in a new issue