diff options
| author | 2021-06-11 14:26:54 -0400 | |
|---|---|---|
| committer | 2021-06-11 14:26:54 -0400 | |
| commit | 9951322e5a37a604e185ae7013af7c4cfc5c35f8 (patch) | |
| tree | 6d765e2d635990de4acb98c1e2b6ce125546f629 /src/core/arm | |
| parent | Merge pull request #6443 from Morph1984/k-light-condition-variable (diff) | |
| parent | common/host_memory: Implement a fallback if fastmem fails. (diff) | |
| download | yuzu-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.cpp | 6 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 12 |
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); |