summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp28
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp32
-rw-r--r--src/core/settings.h11
3 files changed, 60 insertions, 11 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 0d4ab95b7..369a081cd 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -142,10 +142,30 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
142 // Timing 142 // Timing
143 config.wall_clock_cntpct = uses_wall_clock; 143 config.wall_clock_cntpct = uses_wall_clock;
144 144
145 // Optimizations 145 // Safe optimizations
146 if (Settings::values.disable_cpu_opt) { 146 if (!Settings::values.cpuopt_page_tables) {
147 config.enable_optimizations = false; 147 config.page_table = nullptr;
148 config.enable_fast_dispatch = false; 148 }
149 if (!Settings::values.cpuopt_block_linking) {
150 config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
151 }
152 if (!Settings::values.cpuopt_return_stack_buffer) {
153 config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
154 }
155 if (!Settings::values.cpuopt_fast_dispatcher) {
156 config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
157 }
158 if (!Settings::values.cpuopt_context_elimination) {
159 config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
160 }
161 if (!Settings::values.cpuopt_const_prop) {
162 config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
163 }
164 if (!Settings::values.cpuopt_misc_ir) {
165 config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
166 }
167 if (!Settings::values.cpuopt_reduce_misalign_checks) {
168 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
149 } 169 }
150 170
151 return std::make_unique<Dynarmic::A32::Jit>(config); 171 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 790981034..e208a4aa7 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -191,15 +191,35 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
191 // Unpredictable instructions 191 // Unpredictable instructions
192 config.define_unpredictable_behaviour = true; 192 config.define_unpredictable_behaviour = true;
193 193
194 // Optimizations
195 if (Settings::values.disable_cpu_opt) {
196 config.enable_optimizations = false;
197 config.enable_fast_dispatch = false;
198 }
199
200 // Timing 194 // Timing
201 config.wall_clock_cntpct = uses_wall_clock; 195 config.wall_clock_cntpct = uses_wall_clock;
202 196
197 // Safe optimizations
198 if (!Settings::values.cpuopt_page_tables) {
199 config.page_table = nullptr;
200 }
201 if (!Settings::values.cpuopt_block_linking) {
202 config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
203 }
204 if (!Settings::values.cpuopt_return_stack_buffer) {
205 config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
206 }
207 if (!Settings::values.cpuopt_fast_dispatcher) {
208 config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
209 }
210 if (!Settings::values.cpuopt_context_elimination) {
211 config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
212 }
213 if (!Settings::values.cpuopt_const_prop) {
214 config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
215 }
216 if (!Settings::values.cpuopt_misc_ir) {
217 config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
218 }
219 if (!Settings::values.cpuopt_reduce_misalign_checks) {
220 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
221 }
222
203 return std::make_shared<Dynarmic::A64::Jit>(config); 223 return std::make_shared<Dynarmic::A64::Jit>(config);
204} 224}
205 225
diff --git a/src/core/settings.h b/src/core/settings.h
index 850ca4072..c081c083f 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -427,6 +427,16 @@ struct Values {
427 // Core 427 // Core
428 Setting<bool> use_multi_core; 428 Setting<bool> use_multi_core;
429 429
430 // Cpu
431 bool cpuopt_page_tables;
432 bool cpuopt_block_linking;
433 bool cpuopt_return_stack_buffer;
434 bool cpuopt_fast_dispatcher;
435 bool cpuopt_context_elimination;
436 bool cpuopt_const_prop;
437 bool cpuopt_misc_ir;
438 bool cpuopt_reduce_misalign_checks;
439
430 // Renderer 440 // Renderer
431 Setting<RendererBackend> renderer_backend; 441 Setting<RendererBackend> renderer_backend;
432 bool renderer_debug; 442 bool renderer_debug;
@@ -505,7 +515,6 @@ struct Values {
505 bool dump_nso; 515 bool dump_nso;
506 bool reporting_services; 516 bool reporting_services;
507 bool quest_flag; 517 bool quest_flag;
508 bool disable_cpu_opt;
509 bool disable_macro_jit; 518 bool disable_macro_jit;
510 519
511 // Misceallaneous 520 // Misceallaneous