summaryrefslogtreecommitdiff
path: root/src/core/arm
diff options
context:
space:
mode:
authorGravatar Mai M2021-06-11 14:26:54 -0400
committerGravatar GitHub2021-06-11 14:26:54 -0400
commit9951322e5a37a604e185ae7013af7c4cfc5c35f8 (patch)
tree6d765e2d635990de4acb98c1e2b6ce125546f629 /src/core/arm
parentMerge pull request #6443 from Morph1984/k-light-condition-variable (diff)
parentcommon/host_memory: Implement a fallback if fastmem fails. (diff)
downloadyuzu-9951322e5a37a604e185ae7013af7c4cfc5c35f8.tar.gz
yuzu-9951322e5a37a604e185ae7013af7c4cfc5c35f8.tar.xz
yuzu-9951322e5a37a604e185ae7013af7c4cfc5c35f8.zip
Merge pull request #6422 from FernandoS27/i-am-the-senate
Implement/Port Fastmem from Citra to Yuzu
Diffstat (limited to 'src/core/arm')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp6
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp12
2 files changed, 16 insertions, 2 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index cea7f0fb1..c8f6dc765 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -128,6 +128,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
128 if (page_table) { 128 if (page_table) {
129 config.page_table = reinterpret_cast<std::array<std::uint8_t*, NUM_PAGE_TABLE_ENTRIES>*>( 129 config.page_table = reinterpret_cast<std::array<std::uint8_t*, NUM_PAGE_TABLE_ENTRIES>*>(
130 page_table->pointers.data()); 130 page_table->pointers.data());
131 config.fastmem_pointer = page_table->fastmem_arena;
131 } 132 }
132 config.absolute_offset_page_table = true; 133 config.absolute_offset_page_table = true;
133 config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS; 134 config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS;
@@ -143,7 +144,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
143 144
144 // Code cache size 145 // Code cache size
145 config.code_cache_size = 512 * 1024 * 1024; 146 config.code_cache_size = 512 * 1024 * 1024;
146 config.far_code_offset = 256 * 1024 * 1024; 147 config.far_code_offset = 400 * 1024 * 1024;
147 148
148 // Safe optimizations 149 // Safe optimizations
149 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) { 150 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
@@ -171,6 +172,9 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
171 if (!Settings::values.cpuopt_reduce_misalign_checks) { 172 if (!Settings::values.cpuopt_reduce_misalign_checks) {
172 config.only_detect_misalignment_via_page_table_on_page_boundary = false; 173 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
173 } 174 }
175 if (!Settings::values.cpuopt_fastmem) {
176 config.fastmem_pointer = nullptr;
177 }
174 } 178 }
175 179
176 // Unsafe optimizations 180 // Unsafe optimizations
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 63193dcb1..ba524cd05 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -160,6 +160,10 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
160 config.absolute_offset_page_table = true; 160 config.absolute_offset_page_table = true;
161 config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; 161 config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
162 config.only_detect_misalignment_via_page_table_on_page_boundary = true; 162 config.only_detect_misalignment_via_page_table_on_page_boundary = true;
163
164 config.fastmem_pointer = page_table->fastmem_arena;
165 config.fastmem_address_space_bits = address_space_bits;
166 config.silently_mirror_fastmem = false;
163 } 167 }
164 168
165 // Multi-process state 169 // Multi-process state
@@ -181,7 +185,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
181 185
182 // Code cache size 186 // Code cache size
183 config.code_cache_size = 512 * 1024 * 1024; 187 config.code_cache_size = 512 * 1024 * 1024;
184 config.far_code_offset = 256 * 1024 * 1024; 188 config.far_code_offset = 400 * 1024 * 1024;
185 189
186 // Safe optimizations 190 // Safe optimizations
187 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) { 191 if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
@@ -209,6 +213,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
209 if (!Settings::values.cpuopt_reduce_misalign_checks) { 213 if (!Settings::values.cpuopt_reduce_misalign_checks) {
210 config.only_detect_misalignment_via_page_table_on_page_boundary = false; 214 config.only_detect_misalignment_via_page_table_on_page_boundary = false;
211 } 215 }
216 if (!Settings::values.cpuopt_fastmem) {
217 config.fastmem_pointer = nullptr;
218 }
212 } 219 }
213 220
214 // Unsafe optimizations 221 // Unsafe optimizations
@@ -223,6 +230,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
223 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { 230 if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) {
224 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; 231 config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN;
225 } 232 }
233 if (Settings::values.cpuopt_unsafe_fastmem_check.GetValue()) {
234 config.fastmem_address_space_bits = 64;
235 }
226 } 236 }
227 237
228 return std::make_shared<Dynarmic::A64::Jit>(config); 238 return std::make_shared<Dynarmic::A64::Jit>(config);