dynarmic: Add Unsafe_InaccurateNaN optimization
This commit is contained in:
parent
1ff341f3dc
commit
57c9da1b39
|
@ -1 +1 @@
|
||||||
Subproject commit 4a9a0d07f7376b439430e686721e8176c7b56ce7
|
Subproject commit 6023bcd8ad8c95bb08edf48cb889bfe99ff86be7
|
|
@ -181,6 +181,9 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
|
||||||
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
||||||
}
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_unique<Dynarmic::A32::Jit>(config);
|
return std::make_unique<Dynarmic::A32::Jit>(config);
|
||||||
|
|
|
@ -212,6 +212,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
|
||||||
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
if (Settings::values.cpuopt_unsafe_reduce_fp_error) {
|
||||||
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP;
|
||||||
}
|
}
|
||||||
|
if (Settings::values.cpuopt_unsafe_inaccurate_nan) {
|
||||||
|
config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_shared<Dynarmic::A64::Jit>(config);
|
return std::make_shared<Dynarmic::A64::Jit>(config);
|
||||||
|
|
|
@ -131,6 +131,7 @@ struct Values {
|
||||||
|
|
||||||
bool cpuopt_unsafe_unfuse_fma;
|
bool cpuopt_unsafe_unfuse_fma;
|
||||||
bool cpuopt_unsafe_reduce_fp_error;
|
bool cpuopt_unsafe_reduce_fp_error;
|
||||||
|
bool cpuopt_unsafe_inaccurate_nan;
|
||||||
|
|
||||||
// Renderer
|
// Renderer
|
||||||
Setting<RendererBackend> renderer_backend;
|
Setting<RendererBackend> renderer_backend;
|
||||||
|
|
|
@ -764,6 +764,8 @@ void Config::ReadCpuValues() {
|
||||||
ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool();
|
ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool();
|
||||||
Settings::values.cpuopt_unsafe_reduce_fp_error =
|
Settings::values.cpuopt_unsafe_reduce_fp_error =
|
||||||
ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool();
|
ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool();
|
||||||
|
Settings::values.cpuopt_unsafe_inaccurate_nan =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
|
@ -1327,6 +1329,8 @@ void Config::SaveCpuValues() {
|
||||||
Settings::values.cpuopt_unsafe_unfuse_fma, true);
|
Settings::values.cpuopt_unsafe_unfuse_fma, true);
|
||||||
WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"),
|
WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"),
|
||||||
Settings::values.cpuopt_unsafe_reduce_fp_error, true);
|
Settings::values.cpuopt_unsafe_reduce_fp_error, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"),
|
||||||
|
Settings::values.cpuopt_unsafe_inaccurate_nan, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
|
|
|
@ -36,6 +36,8 @@ void ConfigureCpu::SetConfiguration() {
|
||||||
ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma);
|
ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma);
|
||||||
ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
|
ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
|
||||||
ui->cpuopt_unsafe_reduce_fp_error->setChecked(Settings::values.cpuopt_unsafe_reduce_fp_error);
|
ui->cpuopt_unsafe_reduce_fp_error->setChecked(Settings::values.cpuopt_unsafe_reduce_fp_error);
|
||||||
|
ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_unsafe_inaccurate_nan->setChecked(Settings::values.cpuopt_unsafe_inaccurate_nan);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureCpu::AccuracyUpdated(int index) {
|
void ConfigureCpu::AccuracyUpdated(int index) {
|
||||||
|
@ -61,6 +63,7 @@ void ConfigureCpu::ApplyConfiguration() {
|
||||||
static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
|
static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
|
||||||
Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked();
|
Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked();
|
||||||
Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked();
|
Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked();
|
||||||
|
Settings::values.cpuopt_unsafe_inaccurate_nan = ui->cpuopt_unsafe_inaccurate_nan->isChecked();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureCpu::changeEvent(QEvent* event) {
|
void ConfigureCpu::changeEvent(QEvent* event) {
|
||||||
|
|
|
@ -109,6 +109,18 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_unsafe_inaccurate_nan">
|
||||||
|
<property name="text">
|
||||||
|
<string>Inaccurate NaN handling</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
Reference in New Issue