diff --git a/.patch/mcl/0001-assert-macro.patch b/.patch/mcl/0001-assert-macro.patch new file mode 100644 index 0000000000..2d7d0dd1b0 --- /dev/null +++ b/.patch/mcl/0001-assert-macro.patch @@ -0,0 +1,55 @@ +diff --git a/include/mcl/assert.hpp b/include/mcl/assert.hpp +index f77dbe7..9ec0b9c 100644 +--- a/include/mcl/assert.hpp ++++ b/include/mcl/assert.hpp +@@ -23,8 +23,11 @@ template + + } // namespace mcl::detail + ++#ifndef UNREACHABLE + #define UNREACHABLE() ASSERT_FALSE("Unreachable code!") ++#endif + ++#ifndef ASSERT + #define ASSERT(expr) \ + [&] { \ + if (std::is_constant_evaluated()) { \ +@@ -37,7 +40,9 @@ template + } \ + } \ + }() ++#endif + ++#ifndef ASSERT_MSG + #define ASSERT_MSG(expr, ...) \ + [&] { \ + if (std::is_constant_evaluated()) { \ +@@ -50,13 +55,24 @@ template + } \ + } \ + }() ++#endif + ++#ifndef ASSERT_FALSE + #define ASSERT_FALSE(...) ::mcl::detail::assert_terminate("false", __VA_ARGS__) ++#endif + + #if defined(NDEBUG) || defined(MCL_IGNORE_ASSERTS) +-# define DEBUG_ASSERT(expr) ASSUME(expr) +-# define DEBUG_ASSERT_MSG(expr, ...) ASSUME(expr) ++# ifndef DEBUG_ASSERT ++# define DEBUG_ASSERT(expr) ASSUME(expr) ++# endif ++# ifndef DEBUG_ASSERT_MSG ++# define DEBUG_ASSERT_MSG(expr, ...) ASSUME(expr) ++# endif + #else +-# define DEBUG_ASSERT(expr) ASSERT(expr) +-# define DEBUG_ASSERT_MSG(expr, ...) ASSERT_MSG(expr, __VA_ARGS__) ++# ifndef DEBUG_ASSERT ++# define DEBUG_ASSERT(expr) ASSERT(expr) ++# endif ++# ifndef DEBUG_ASSERT_MSG ++# define DEBUG_ASSERT_MSG(expr, ...) ASSERT_MSG(expr, __VA_ARGS__) ++# endif + #endif diff --git a/CMakeLists.txt b/CMakeLists.txt index 4afadff0a3..1a40ba0f9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -565,6 +565,7 @@ if (NOT YUZU_STATIC_ROOM) find_package(SPIRV-Tools) find_package(sirit) find_package(gamemode) + find_package(mcl) find_package(frozen) if (ARCHITECTURE_riscv64) diff --git a/docs/Deps.md b/docs/Deps.md index a34e838534..fe1f7a14b2 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -76,6 +76,7 @@ Certain other dependencies will be fetched by CPM regardless. System packages *c * This package is known to be broken on the AUR. * [cpp-jwt](https://github.com/arun11299/cpp-jwt) 1.4+ - if `ENABLE_WEB_SERVICE` is on * [unordered-dense](https://github.com/martinus/unordered_dense) +* [mcl](https://github.com/azahar-emu/mcl) - subject to removal On amd64: diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 2ebc09113b..7f80bb5d43 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -76,6 +76,9 @@ if (ARCHITECTURE_riscv64) AddJsonPackage(biscuit) endif() +# mcl +AddJsonPackage(mcl) + # Vulkan stuff AddDependentPackages(vulkan-headers vulkan-utility-libraries) diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 45400f0801..99aee2a396 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -210,6 +210,18 @@ "version": "0.9.1", "git_version": "0.19.0" }, + "mcl": { + "version": "0.1.12", + "repo": "azahar-emu/mcl", + "sha": "7b08d83418", + "hash": "9c6ba624cb22ef622f78046a82abb99bf5026284ba17dfacaf46ac842cbd3b0f515f5ba45a1598c7671318a78a2e648db72ce8d10e7537f34e39800bdcb57694", + "options": [ + "MCL_INSTALL OFF" + ], + "patches": [ + "0001-assert-macro.patch" + ] + }, "libusb": { "repo": "libusb/libusb", "tag": "v%VERSION%", diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt index faa35bc3eb..46b75197d5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt @@ -133,11 +133,8 @@ class GamePropertiesFragment : Fragment() { } override fun onDestroy() { - val isChangingConfigurations = activity?.isChangingConfigurations == true super.onDestroy() - if (!isChangingConfigurations) { - gamesViewModel.reloadGames(true) - } + gamesViewModel.reloadGames(true) } private fun getPlayTime() { diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 11f03867d5..042033ba28 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -34,8 +34,6 @@ #endif #include #include -#elif defined(__FreeBSD__) -#include #endif // FreeBSD @@ -509,7 +507,8 @@ public: fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); #elif defined(__OpenBSD__) fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) && __FreeBSD__ < 13 + // XXX Drop after FreeBSD 12.* reaches EOL on 2024-06-30 fd = shm_open(SHM_ANON, O_RDWR, 0600); #elif defined(__APPLE__) // macOS doesn't have memfd_create, use anonymous temporary file @@ -576,9 +575,9 @@ public: if (True(perms & MemoryPermission::Execute)) prot_flags |= PROT_EXEC; #endif - int flags = (fd >= 0 ? MAP_SHARED : MAP_PRIVATE) | MAP_FIXED; + int flags = (fd > 0 ? MAP_SHARED : MAP_PRIVATE) | MAP_FIXED; void* ret = mmap(virtual_base + virtual_offset, length, prot_flags, flags, fd, host_offset); - ASSERT_MSG(ret != MAP_FAILED, "mmap: {} {}", strerror(errno), fd); + ASSERT_MSG(ret != MAP_FAILED, "mmap: {}", strerror(errno)); } void Unmap(size_t virtual_offset, size_t length) { @@ -592,8 +591,9 @@ public: auto [merged_pointer, merged_size] = free_manager.FreeBlock(virtual_base + virtual_offset, length); - void* ret = mmap(merged_pointer, merged_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - ASSERT_MSG(ret != MAP_FAILED, "mmap: {}", strerror(errno)); + void* ret = mmap(merged_pointer, merged_size, PROT_NONE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + ASSERT_MSG(ret != MAP_FAILED, "mmap failed: {}", strerror(errno)); } void Protect(size_t virtual_offset, size_t length, bool read, bool write, bool execute) { diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 54848c4dd1..f549169cd2 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -186,7 +186,7 @@ bool IsFastmemEnabled() { // Only 4kb systems support host MMU right now // TODO: Support this return getpagesize() == 4096; -#elif !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32) && !defined(__linux__) && !defined(__FreeBSD__) +#elif !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32) && !defined(__linux__) return false; #else return true; diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1520f128cf..912a15475b 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -186,7 +186,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { config.only_detect_misalignment_via_page_table_on_page_boundary = true; config.fastmem_pointer = page_table->fastmem_arena ? - std::optional{uintptr_t(page_table->fastmem_arena)} : + std::optional{reinterpret_cast(page_table->fastmem_arena)} : std::nullopt; config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt; @@ -286,6 +286,10 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Curated optimizations case Settings::CpuAccuracy::Auto: config.unsafe_optimizations = true; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__NetBSD__) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; @@ -300,10 +304,6 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { default: break; } - if (!Settings::IsFastmemEnabled()) { - config.fastmem_pointer = std::nullopt; - config.fastmem_exclusive_access = false; - } m_jit.emplace(config); } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index fe7fb5983f..55584d0e38 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -338,6 +338,10 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Safe optimisations case Settings::CpuAccuracy::Auto: config.unsafe_optimizations = true; +#if !defined(__APPLE__) && !defined(__linux__) && !defined(__ANDROID__) && !defined(_WIN32) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.fastmem_address_space_bits = 64; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; @@ -351,10 +355,6 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s default: break; } - if (!Settings::IsFastmemEnabled()) { - config.fastmem_pointer = std::nullopt; - config.fastmem_exclusive_access = false; - } m_jit.emplace(config); } diff --git a/src/core/hle/service/vi/shared_buffer_manager.cpp b/src/core/hle/service/vi/shared_buffer_manager.cpp index 21e42e2094..1568344830 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.cpp +++ b/src/core/hle/service/vi/shared_buffer_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -373,8 +373,6 @@ Result SharedBufferManager::PresentSharedFrameBuffer(android::Fence fence, android::Status::NoError, VI::ResultOperationFailed); - (void)m_container.SetLayerZIndex(layer_id, 100000); - // We succeeded. R_SUCCEED(); } diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index dd1def5273..e0d1f942f0 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -78,9 +78,7 @@ if (MSVC) /Zc:throwingNew # Assumes new (without std::nothrow) never returns null. /volatile:iso # Use strict standard-abiding volatile semantics /bigobj # Increase number of sections in .obj files - /DNOMINMAX - /GR- - ) + /DNOMINMAX) if (CXX_CLANG) list(APPEND DYNARMIC_CXX_FLAGS @@ -93,10 +91,8 @@ else() -Wextra -Wcast-qual -pedantic - -Wno-missing-braces - -fno-rtti - #-fno-exceptions - ) + -Wno-missing-braces) + if (CXX_GCC) # GCC produces bogus -Warray-bounds warnings from xbyak headers for code paths that are not # actually reachable. Specifically, it happens in cases where some code casts an Operand& @@ -106,6 +102,7 @@ else() list(APPEND DYNARMIC_CXX_FLAGS -Wno-array-bounds) list(APPEND DYNARMIC_CXX_FLAGS -Wstack-usage=4096) endif() + if (CXX_CLANG) # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. # And this in turns limits the size of a std::array. @@ -120,6 +117,7 @@ if (NOT Boost_FOUND) endif() find_package(fmt 8 CONFIG) +find_package(mcl 0.1.12 REQUIRED) find_package(unordered_dense REQUIRED) if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) diff --git a/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake b/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake index 82c6c3bae0..82b3078a11 100644 --- a/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake +++ b/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake @@ -1,6 +1,3 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - string(TOUPPER "${arch}" arch) file(READ "${input_file}" f_contents) -file(WRITE "${output_file}" "#if defined(ARCHITECTURE_${arch})\n${f_contents}\n#endif\n") +file(WRITE "${output_file}" "#include \n#if defined(MCL_ARCHITECTURE_${arch})\n${f_contents}\n#endif\n") diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index f79d18c15a..2f05d8a34b 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -3,12 +3,6 @@ include(TargetArchitectureSpecificSources) add_library(dynarmic STATIC - mcl/bit.hpp - mcl/function_info.hpp - mcl/integer_of_size.hpp - mcl/intrusive_list.hpp - mcl/is_instance_of_template.hpp - backend/block_range_information.cpp backend/block_range_information.h backend/exception_handler.h @@ -359,7 +353,7 @@ set_target_properties(dynarmic PROPERTIES target_compile_options(dynarmic PRIVATE ${DYNARMIC_CXX_FLAGS}) target_link_libraries(dynarmic PRIVATE unordered_dense::unordered_dense) -target_link_libraries(dynarmic PUBLIC fmt::fmt) +target_link_libraries(dynarmic PUBLIC fmt::fmt merry::mcl) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic PRIVATE Boost::variant Boost::icl Boost::pool) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp index d16a34275b..91adc5783b 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,6 +11,7 @@ #include #include "dynarmic/common/assert.h" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/arm64/a32_address_space.h" @@ -35,9 +36,14 @@ struct Jit::Impl final { PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&halt_reason))); jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + HaltReason hr = core.Run(current_address_space, current_state, &halt_reason); + PerformRequestedCacheInvalidation(hr); - jit_interface->is_executing = false; + return hr; } @@ -46,9 +52,14 @@ struct Jit::Impl final { PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&halt_reason))); jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + HaltReason hr = core.Step(current_address_space, current_state, &halt_reason); + PerformRequestedCacheInvalidation(hr); - jit_interface->is_executing = false; + return hr; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp index 0ce51d0e17..67390a311d 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #include "dynarmic/backend/arm64/a32_jitstate.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" namespace Dynarmic::Backend::Arm64 { diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp index b230f455c5..10324394a5 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,6 +11,7 @@ #include #include "dynarmic/common/assert.h" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/arm64/a64_address_space.h" @@ -33,20 +34,32 @@ struct Jit::Impl final { HaltReason Run() { ASSERT(!is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&halt_reason))); + is_executing = true; + SCOPE_EXIT { + is_executing = false; + }; + HaltReason hr = core.Run(current_address_space, current_state, &halt_reason); + PerformRequestedCacheInvalidation(hr); - is_executing = false; + return hr; } HaltReason Step() { ASSERT(!is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&halt_reason))); + is_executing = true; + SCOPE_EXIT { + is_executing = false; + }; + HaltReason hr = core.Step(current_address_space, current_state, &halt_reason); + PerformRequestedCacheInvalidation(hr); - is_executing = false; + return hr; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/abi.cpp b/src/dynarmic/src/dynarmic/backend/arm64/abi.cpp index acff6a89f0..04d8ca2eaf 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/abi.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/abi.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include diff --git a/src/dynarmic/src/dynarmic/backend/arm64/abi.h b/src/dynarmic/src/dynarmic/backend/arm64/abi.h index b2e29d49e0..f2b6b1dca1 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/abi.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/abi.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,6 +12,7 @@ #include #include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/assert.h" #include @@ -36,7 +37,7 @@ constexpr auto Rscratch0() { } else if constexpr (bitsize == 64) { return Xscratch0; } else { - return Xscratch0; //UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -47,7 +48,7 @@ constexpr auto Rscratch1() { } else if constexpr (bitsize == 64) { return Xscratch1; } else { - return Xscratch1; //UNREACHABLE(); + static_assert(Common::always_false_v>); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h b/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h index 737a6572e3..60ce823066 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/function_info.hpp" +#include namespace Dynarmic::Backend::Arm64 { diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_a32.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_a32.cpp index 213403b4ba..a65efb3c59 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_a32.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_a32.cpp @@ -6,7 +6,7 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include #include "dynarmic/backend/arm64/a32_jitstate.h" diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp index c773d5a339..a8c3aa02bf 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,6 +6,7 @@ * SPDX-License-Identifier: 0BSD */ +#include #include #include "dynarmic/backend/arm64/a32_jitstate.h" @@ -45,7 +46,7 @@ static void EmitTwoOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, IR: } else if constexpr (size == 64) { emit(Qresult->D2(), Qoperand->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -68,7 +69,7 @@ static void EmitTwoOpArrangedWiden(oaknut::CodeGenerator& code, EmitContext& ctx } else if constexpr (size == 32) { emit(Qresult->D2(), Qoperand->toD().S2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -83,7 +84,7 @@ static void EmitTwoOpArrangedNarrow(oaknut::CodeGenerator& code, EmitContext& ct } else if constexpr (size == 64) { emit(Qresult->toD().S2(), Qoperand->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -106,7 +107,7 @@ static void EmitTwoOpArrangedPairWiden(oaknut::CodeGenerator& code, EmitContext& } else if constexpr (size == 32) { emit(Qresult->D2(), Qoperand->S4()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -121,7 +122,7 @@ static void EmitTwoOpArrangedLower(oaknut::CodeGenerator& code, EmitContext& ctx } else if constexpr (size == 32) { emit(Qresult->toD().S2(), Qoperand->toD().S2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -149,7 +150,7 @@ static void EmitThreeOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, I } else if constexpr (size == 64) { emit(Qresult->D2(), Qa->D2(), Qb->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -174,7 +175,7 @@ static void EmitThreeOpArrangedWiden(oaknut::CodeGenerator& code, EmitContext& c } else if constexpr (size == 64) { emit(Qresult->Q1(), Qa->toD().D1(), Qb->toD().D1()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -197,7 +198,7 @@ static void EmitThreeOpArrangedLower(oaknut::CodeGenerator& code, EmitContext& c } else if constexpr (size == 32) { emit(Qresult->toD().S2(), Qa->toD().S2(), Qb->toD().S2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -219,7 +220,7 @@ static void EmitSaturatedAccumulate(oaknut::CodeGenerator&, EmitContext& ctx, IR } else if constexpr (size == 64) { emit(Qaccumulator->D2(), Qoperand->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -240,7 +241,7 @@ static void EmitImmShift(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* ins } else if constexpr (size == 64) { emit(Qresult->D2(), Qoperand->D2(), shift_amount); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -268,7 +269,7 @@ static void EmitReduce(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, } else if constexpr (size == 64) { emit(Vresult, Qoperand->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index 557d6284ed..431d51c081 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -7,8 +7,14 @@ */ #include -#include "dynarmic/mcl/function_info.hpp" -#include "dynarmic/mcl/integer_of_size.hpp" +#include +#include +#include +#include +#include +#include +#include +#include #include #include "dynarmic/backend/arm64/a32_jitstate.h" @@ -32,6 +38,8 @@ namespace Dynarmic::Backend::Arm64 { using namespace oaknut::util; +namespace mp = mcl::mp; + using A64FullVectorWidth = std::integral_constant; // Array alias that always sizes itself according to the given type T @@ -75,7 +83,7 @@ static void EmitTwoOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, IR: } else if constexpr (size == 64) { emit(Qresult->D2(), Qa->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -103,7 +111,7 @@ static void EmitThreeOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, I } else if constexpr (size == 64) { emit(Qresult->D2(), Qa->D2(), Qb->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -126,7 +134,7 @@ static void EmitFMA(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* ins } else if constexpr (size == 64) { emit(Qresult->D2(), Qm->D2(), Qn->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -148,7 +156,7 @@ static void EmitFromFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Ins } else if constexpr (size == 64) { emit(Qto->D2(), Qfrom->D2(), fbits); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }); } @@ -170,7 +178,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) } else if constexpr (fsize == 64) { return Qto->D2(); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }(); auto Vfrom = [&] { @@ -179,7 +187,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) } else if constexpr (fsize == 64) { return Qfrom->D2(); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } }(); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_saturation.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_saturation.cpp index d63c1d92d0..722a09176b 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_saturation.cpp @@ -1,11 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD */ +#include #include #include "dynarmic/backend/arm64/a32_jitstate.h" @@ -41,7 +39,7 @@ static void Emit(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, EmitF } else if constexpr (size == 64) { emit(Qresult->D2(), Qa->D2(), Qb->D2()); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h b/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h index 953fc3783e..cae05bcf23 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,10 +10,11 @@ #include #include + +#include +#include "dynarmic/common/common_types.h" #include -#include "dynarmic/mcl/bit.hpp" -#include "dynarmic/common/common_types.h" #include "dynarmic/backend/exception_handler.h" #include "dynarmic/ir/location_descriptor.h" @@ -21,16 +22,9 @@ namespace Dynarmic::Backend::Arm64 { using DoNotFastmemMarker = std::tuple; -constexpr size_t xmrx(size_t x) noexcept { - x ^= x >> 32; - x *= 0xff51afd7ed558ccd; - x ^= mcl::bit::rotate_right(x, 47) ^ mcl::bit::rotate_right(x, 23); - return x; -} - struct DoNotFastmemMarkerHash { - [[nodiscard]] constexpr size_t operator()(const DoNotFastmemMarker& value) const noexcept { - return xmrx(std::get<0>(value).Value() ^ u64(std::get<1>(value))); + size_t operator()(const DoNotFastmemMarker& value) const { + return mcl::hash::xmrx(std::get<0>(value).Value() ^ static_cast(std::get<1>(value))); } }; diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp index 47d83f2362..e98a2f6e71 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -13,8 +13,9 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/arm64/abi.h" @@ -298,7 +299,7 @@ int RegAlloc::GenerateImmediate(const IR::Value& value) { return 0; } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -365,7 +366,7 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) { } else if constexpr (required_kind == HostLoc::Kind::Flags) { UNREACHABLE(); //A simple read from flags is likely a logic error } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -389,7 +390,7 @@ int RegAlloc::RealizeWriteImpl(const IR::Inst* value) { flags.SetupLocation(value); return 0; } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -409,7 +410,7 @@ int RegAlloc::RealizeReadWriteImpl(const IR::Value& read_value, const IR::Inst* } else if constexpr (kind == HostLoc::Kind::Flags) { ASSERT(false && "Incorrect function for ReadWrite of flags"); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h index 22ab5af662..87446a240b 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h @@ -16,7 +16,7 @@ #include "dynarmic/common/assert.h" #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/is_instance_of_template.hpp" +#include #include #include diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler.h b/src/dynarmic/src/dynarmic/backend/exception_handler.h index ff116c5775..cd274b111f 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler.h +++ b/src/dynarmic/src/dynarmic/backend/exception_handler.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,6 +12,7 @@ #include #include +#include #include "dynarmic/common/common_types.h" #if defined(ARCHITECTURE_x86_64) diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp index be44207f0a..622f86816f 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -16,10 +16,11 @@ #include #include #include -#include #include #include "dynarmic/common/assert.h" +#include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/exception_handler.h" diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c b/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c index ebbe5a079f..25678ab115 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c @@ -3,6 +3,8 @@ * SPDX-License-Identifier: 0BSD */ +#include + #if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/mig/mach_exc_server.c" #elif defined(ARCHITECTURE_arm64) diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp index 8b52437930..58a3325e17 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,6 +6,8 @@ * SPDX-License-Identifier: 0BSD */ +#include + #if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/exception_handler_windows.cpp" #elif defined(ARCHITECTURE_arm64) diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp index edb24761f6..05f43774b6 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp @@ -99,7 +99,7 @@ void A32AddressSpace::SetCursorPtr(CodePtr ptr) { } size_t A32AddressSpace::GetRemainingSize() { - return conf.code_cache_size - (GetCursorPtr() - GetMemPtr()); + return conf.code_cache_size - (GetCursorPtr() - GetMemPtr()); } EmittedBlockInfo A32AddressSpace::Emit(IR::Block block) { diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h index e882a9e2e6..24148b192c 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h @@ -41,25 +41,25 @@ private: template T GetMemPtr() { - static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); + static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); return reinterpret_cast(as.GetBufferPointer(0)); } template T GetMemPtr() const { - static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); + static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); return reinterpret_cast(as.GetBufferPointer(0)); } template T GetCursorPtr() { - static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); + static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); return reinterpret_cast(as.GetCursorPointer()); } template T GetCursorPtr() const { - static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); + static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); return reinterpret_cast(as.GetCursorPointer()); } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp index 3f395bfafb..c0f65a49ed 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,6 +11,7 @@ #include #include "dynarmic/common/assert.h" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/riscv64/a32_address_space.h" @@ -33,18 +34,28 @@ struct Jit::Impl final { HaltReason Run() { ASSERT(!jit_interface->is_executing); jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + HaltReason hr = core.Run(current_address_space, current_state, &halt_reason); + RequestCacheInvalidation(); - jit_interface->is_executing = false; + return hr; } HaltReason Step() { ASSERT(!jit_interface->is_executing); jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + UNIMPLEMENTED(); + RequestCacheInvalidation(); - jit_interface->is_executing = false; + return HaltReason{}; } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_jitstate.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_jitstate.cpp index 70cd6bf0f1..87eeab6b0f 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_jitstate.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_jitstate.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #include "dynarmic/backend/riscv64/a32_jitstate.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" namespace Dynarmic::Backend::RV64 { diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/code_block.h b/src/dynarmic/src/dynarmic/backend/riscv64/code_block.h index 02bfa44eec..7d53486a48 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/code_block.h +++ b/src/dynarmic/src/dynarmic/backend/riscv64/code_block.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -30,7 +30,7 @@ public: template T ptr() const noexcept { - static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); + static_assert(std::is_pointer_v || std::is_same_v || std::is_same_v); return reinterpret_cast(mem); } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp index 5ce7dee1e1..50cbaf9526 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp @@ -12,7 +12,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/backend/riscv64/a32_jitstate.h" #include "dynarmic/backend/riscv64/abi.h" diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.cpp index 4ab5d43db8..49489c40a4 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,6 +12,7 @@ #include #include "dynarmic/common/assert.h" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/always_false.h" @@ -163,8 +164,9 @@ u32 RegAlloc::GenerateImmediate(const IR::Value& value) { } else if constexpr (kind == HostLoc::Kind::Fpr) { UNIMPLEMENTED(); } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } + return 0; } @@ -223,7 +225,7 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) { fprs[new_location_index].realized = true; return new_location_index; } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } @@ -250,7 +252,7 @@ u32 RegAlloc::RealizeWriteImpl(const IR::Inst* value) { setup_location(fprs[new_location_index]); return new_location_index; } else { - UNREACHABLE(); + static_assert(Common::always_false_v>); } } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h index be826e63f6..e8fd471ae1 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -18,7 +18,7 @@ #include #include "dynarmic/common/assert.h" #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/is_instance_of_template.hpp" +#include #include #include "dynarmic/backend/riscv64/stack_layout.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp index 80f0f9cc2f..f037919eb0 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -15,7 +15,8 @@ #include #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp index f138b5f137..a6b99b545f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp @@ -13,7 +13,7 @@ #include #include -#include "dynarmic/mcl/integer_of_size.hpp" +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/a32_emit_x64.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp index b48dcf9046..e540839fd5 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp @@ -14,6 +14,7 @@ #include #include "dynarmic/common/assert.h" #include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/llvm_disassemble.h" @@ -76,7 +77,12 @@ struct Jit::Impl { HaltReason Run() { ASSERT(!jit_interface->is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&jit_state.halt_reason))); + jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + const CodePtr current_codeptr = [this] { // RSB optimization const u32 new_rsb_ptr = (jit_state.rsb_ptr - 1) & A32JitState::RSBPtrMask; @@ -87,19 +93,27 @@ struct Jit::Impl { return GetCurrentBlock(); }(); + const HaltReason hr = block_of_code.RunCode(&jit_state, current_codeptr); + PerformRequestedCacheInvalidation(hr); - jit_interface->is_executing = false; + return hr; } HaltReason Step() { ASSERT(!jit_interface->is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&jit_state.halt_reason))); + jit_interface->is_executing = true; + SCOPE_EXIT { + jit_interface->is_executing = false; + }; + const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep()); + PerformRequestedCacheInvalidation(hr); - jit_interface->is_executing = false; + return hr; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.cpp index 066b931350..ed5a8f9454 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include "dynarmic/backend/x64/a32_jitstate.h" #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/x64/block_of_code.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp index 832cfdcce2..ff82d8b05c 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp @@ -11,8 +11,9 @@ #include #include #include "dynarmic/common/assert.h" +#include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/integer_of_size.hpp" +#include #include #include "dynarmic/backend/x64/a64_jitstate.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp index 4b7054b4b2..6b3d4d86a5 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp @@ -13,7 +13,7 @@ #include #include -#include "dynarmic/mcl/integer_of_size.hpp" +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/a64_emit_x64.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp index 96440d273e..44c63bdfc5 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp @@ -15,6 +15,7 @@ #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/llvm_disassemble.h" #include +#include #include "dynarmic/backend/x64/a64_emit_x64.h" #include "dynarmic/backend/x64/a64_jitstate.h" @@ -74,8 +75,14 @@ public: HaltReason Run() { ASSERT(!is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&jit_state.halt_reason))); + is_executing = true; + SCOPE_EXIT { + this->is_executing = false; + }; + // TODO: Check code alignment + const CodePtr current_code_ptr = [this] { // RSB optimization const u32 new_rsb_ptr = (jit_state.rsb_ptr - 1) & A64JitState::RSBPtrMask; @@ -85,19 +92,27 @@ public: } return CodePtr((uintptr_t(GetCurrentBlock()) + 15) & ~uintptr_t(15)); }(); + const HaltReason hr = block_of_code.RunCode(&jit_state, current_code_ptr); + PerformRequestedCacheInvalidation(hr); - is_executing = false; + return hr; } HaltReason Step() { ASSERT(!is_executing); PerformRequestedCacheInvalidation(static_cast(Atomic::Load(&jit_state.halt_reason))); + is_executing = true; + SCOPE_EXIT { + this->is_executing = false; + }; + const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep()); + PerformRequestedCacheInvalidation(hr); - is_executing = false; + return hr; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp index 3f04ed63f0..9f983f3955 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,7 +5,7 @@ #include "dynarmic/backend/x64/a64_jitstate.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A64/a64_location_descriptor.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 3a161fca6b..28c821ab59 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -25,7 +25,7 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/a32_jitstate.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h index f6c12edaaa..5ccab7a3ed 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h @@ -13,7 +13,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/abi.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/constants.h b/src/dynarmic/src/dynarmic/backend/x64/constants.h index a0ae9f3c1e..65c5a09a53 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/constants.h +++ b/src/dynarmic/src/dynarmic/backend/x64/constants.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/rounding_mode.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/devirtualize.h b/src/dynarmic/src/dynarmic/backend/x64/devirtualize.h index 422d21169f..6f22646157 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/devirtualize.h +++ b/src/dynarmic/src/dynarmic/backend/x64/devirtualize.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -13,7 +13,7 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/function_info.hpp" +#include #include "dynarmic/backend/x64/callback.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp index 4e515fef2f..2b0540e4a7 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp @@ -12,7 +12,8 @@ #include "dynarmic/common/assert.h" #include -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h index 301f4ffc89..5de5f2dc7a 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h @@ -16,7 +16,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include #include "dynarmic/backend/x64/xbyak.h" #include diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp index d073991fbe..abe04b53ff 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp @@ -11,8 +11,14 @@ #include #include "dynarmic/common/assert.h" +#include +#include +#include +#include +#include +#include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/integer_of_size.hpp" +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/abi.h" @@ -35,6 +41,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; +namespace mp = mcl::mp; namespace { diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc index 54fc595214..aaed8b43f2 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc @@ -3,8 +3,7 @@ * SPDX-License-Identifier: 0BSD */ -#define CONCATENATE_TOKENS(x, y) CONCATENATE_TOKENS_IMPL(x, y) -#define CONCATENATE_TOKENS_IMPL(x, y) x##y +#include #define AxxEmitX64 CONCATENATE_TOKENS(Axx, EmitX64) #define AxxEmitContext CONCATENATE_TOKENS(Axx, EmitContext) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp index 63827979df..85ee3584eb 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp @@ -9,9 +9,9 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/integer_of_size.hpp" +#include #include "dynarmic/backend/x64/block_of_code.h" #include "dynarmic/backend/x64/emit_x64.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp index d94f0329f8..1f96939d88 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp @@ -13,9 +13,11 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include +#include #include "dynarmic/common/common_types.h" -#include "dynarmic/mcl/function_info.hpp" +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/abi.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index 70edfbd0bc..ee9ec39f46 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -13,8 +13,14 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/function_info.hpp" -#include "dynarmic/mcl/integer_of_size.hpp" +#include +#include +#include +#include +#include +#include +#include +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/abi.h" @@ -35,6 +41,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; +namespace mp = mcl::mp; namespace { @@ -1993,7 +2000,6 @@ void EmitX64::EmitFPVectorToHalf32(EmitContext& ctx, IR::Inst* inst) { } } - // Assembly thunk; just remember not to specialise too much otherwise i-cache death! // template // static void EmitFPVectorToFixedThunk(VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { diff --git a/src/dynarmic/src/dynarmic/backend/x64/perf_map.cpp b/src/dynarmic/src/dynarmic/backend/x64/perf_map.cpp index 095d6194f6..a0b5c4fdde 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/perf_map.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/perf_map.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,16 +6,17 @@ * SPDX-License-Identifier: 0BSD */ +#include "dynarmic/backend/x64/perf_map.h" + #include #include -#include -#include "dynarmic/backend/x64/perf_map.h" -#include "dynarmic/common/common_types.h" #if defined(__linux__) && !defined(__ANDROID__) # include # include # include +# include +# include # include # include diff --git a/src/dynarmic/src/dynarmic/common/cast_util.h b/src/dynarmic/src/dynarmic/common/cast_util.h index aed9067977..92c9a259b3 100644 --- a/src/dynarmic/src/dynarmic/common/cast_util.h +++ b/src/dynarmic/src/dynarmic/common/cast_util.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,7 +5,7 @@ #pragma once -#include "dynarmic/mcl/function_info.hpp" +#include namespace Dynarmic::Common { diff --git a/src/dynarmic/src/dynarmic/common/fp/fpcr.h b/src/dynarmic/src/dynarmic/common/fp/fpcr.h index 948917bc35..be963a2099 100644 --- a/src/dynarmic/src/dynarmic/common/fp/fpcr.h +++ b/src/dynarmic/src/dynarmic/common/fp/fpcr.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,7 +11,7 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/rounding_mode.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/fpsr.h b/src/dynarmic/src/dynarmic/common/fp/fpsr.h index caa5cb92c7..9308132879 100644 --- a/src/dynarmic/src/dynarmic/common/fp/fpsr.h +++ b/src/dynarmic/src/dynarmic/common/fp/fpsr.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #pragma once -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" namespace Dynarmic::FP { diff --git a/src/dynarmic/src/dynarmic/common/fp/fused.cpp b/src/dynarmic/src/dynarmic/common/fp/fused.cpp index a965575a5a..5c32b05eb4 100644 --- a/src/dynarmic/src/dynarmic/common/fp/fused.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/fused.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,7 +5,7 @@ #include "dynarmic/common/fp/fused.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/fp/unpacked.h" #include "dynarmic/common/u128.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/info.h b/src/dynarmic/src/dynarmic/common/fp/info.h index eebca0fc0c..3969843f0f 100644 --- a/src/dynarmic/src/dynarmic/common/fp/info.h +++ b/src/dynarmic/src/dynarmic/common/fp/info.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #pragma once -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" namespace Dynarmic::FP { diff --git a/src/dynarmic/src/dynarmic/common/fp/mantissa_util.h b/src/dynarmic/src/dynarmic/common/fp/mantissa_util.h index 43bb5fe604..3999f97c27 100644 --- a/src/dynarmic/src/dynarmic/common/fp/mantissa_util.h +++ b/src/dynarmic/src/dynarmic/common/fp/mantissa_util.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,8 @@ #pragma once -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" namespace Dynarmic::FP { diff --git a/src/dynarmic/src/dynarmic/common/fp/op/FPConvert.cpp b/src/dynarmic/src/dynarmic/common/fp/op/FPConvert.cpp index 82803f715d..906aa781a1 100644 --- a/src/dynarmic/src/dynarmic/common/fp/op/FPConvert.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/op/FPConvert.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,8 @@ #include "dynarmic/common/fp/op/FPConvert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/op/FPRecipExponent.cpp b/src/dynarmic/src/dynarmic/common/fp/op/FPRecipExponent.cpp index 332870eb8a..e932e02803 100644 --- a/src/dynarmic/src/dynarmic/common/fp/op/FPRecipExponent.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/op/FPRecipExponent.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #include "dynarmic/common/fp/op/FPRecipExponent.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/op/FPRoundInt.cpp b/src/dynarmic/src/dynarmic/common/fp/op/FPRoundInt.cpp index 4bcfcd7c8a..198a71c807 100644 --- a/src/dynarmic/src/dynarmic/common/fp/op/FPRoundInt.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/op/FPRoundInt.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include "dynarmic/common/fp/op/FPRoundInt.h" #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp b/src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp index 2f37797b70..8e3474952a 100644 --- a/src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,8 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/process_nan.cpp b/src/dynarmic/src/dynarmic/common/fp/process_nan.cpp index 7f47852d98..ff1b09f4ba 100644 --- a/src/dynarmic/src/dynarmic/common/fp/process_nan.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/process_nan.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,7 +11,7 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp b/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp index d6bb615cb4..f853ab07e1 100644 --- a/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -10,7 +7,8 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/fp/info.h" diff --git a/src/dynarmic/src/dynarmic/common/fp/unpacked.h b/src/dynarmic/src/dynarmic/common/fp/unpacked.h index effc604fb0..49dca74304 100644 --- a/src/dynarmic/src/dynarmic/common/fp/unpacked.h +++ b/src/dynarmic/src/dynarmic/common/fp/unpacked.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/common/safe_ops.h b/src/dynarmic/src/dynarmic/common/safe_ops.h index 5cc8cb5049..f494bdb24b 100644 --- a/src/dynarmic/src/dynarmic/common/safe_ops.h +++ b/src/dynarmic/src/dynarmic/common/safe_ops.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/u128.h" diff --git a/src/dynarmic/src/dynarmic/common/u128.h b/src/dynarmic/src/dynarmic/common/u128.h index 363c8dfec4..9ab4aa0bd5 100644 --- a/src/dynarmic/src/dynarmic/common/u128.h +++ b/src/dynarmic/src/dynarmic/common/u128.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,7 +11,8 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" namespace Dynarmic { diff --git a/src/dynarmic/src/dynarmic/frontend/A32/FPSCR.h b/src/dynarmic/src/dynarmic/frontend/A32/FPSCR.h index 7e0532ee93..7a4c738e9e 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/FPSCR.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/FPSCR.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/rounding_mode.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/ITState.h b/src/dynarmic/src/dynarmic/frontend/A32/ITState.h index baabc1ca15..eeddaeb6b5 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/ITState.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/ITState.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #pragma once -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/ir/cond.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/PSR.h b/src/dynarmic/src/dynarmic/frontend/A32/PSR.h index 16ca86aeac..328fdb17c0 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/PSR.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/PSR.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #pragma once -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/frontend/A32/ITState.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp b/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp index 704179ecfb..a47ce0b78b 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD @@ -11,7 +8,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include namespace Dynarmic::A32 { diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h index bbf128d797..c6f034ae21 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -15,7 +15,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/frontend/decoder/decoder_detail.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h index a16caedd87..6bf52b87e6 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -15,7 +15,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/frontend/decoder/decoder_detail.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp index 82d25f1337..8c55588a28 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp @@ -32,7 +32,8 @@ bool CondCanContinue(const ConditionalState cond_state, const A32::IREmitter& ir } bool IsConditionPassed(TranslatorVisitor& v, IR::Cond cond) { - ASSERT(v.cond_state != ConditionalState::Break && "This should never happen. We requested a break but that wasn't honored."); + ASSERT_MSG(v.cond_state != ConditionalState::Break, + "This should never happen. We requested a break but that wasn't honored."); if (cond == IR::Cond::NV) { // NV conditional is obsolete diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_branch.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_branch.cpp index 63b40b8c31..d87cfcfe82 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_branch.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_branch.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_translate_impl.h b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_translate_impl.h index a8888c355f..a03b2e666b 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_translate_impl.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_translate_impl.h @@ -9,7 +9,8 @@ #pragma once #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/frontend/A32/a32_ir_emitter.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_load_store_structures.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_load_store_structures.cpp index 8d0f78396a..68c0d983af 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_load_store_structures.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_load_store_structures.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_misc.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_misc.cpp index 9aa50c6b8c..9d73e7d4ae 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_misc.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_misc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,8 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_one_reg_modified_immediate.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_one_reg_modified_immediate.cpp index c5bdb1b551..459cbfea06 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_one_reg_modified_immediate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_one_reg_modified_immediate.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -7,7 +7,7 @@ */ #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_three_regs.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_three_regs.cpp index 8d5e694bca..da8f43f2fb 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_three_regs.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_three_regs.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2020 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/frontend/A32/translate/impl/common.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_misc.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_misc.cpp index 45455aa444..ddae1f420b 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_misc.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_misc.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2020 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,7 +5,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/frontend/A32/translate/impl/common.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_scalar.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_scalar.cpp index d9cc3b1e64..4d6855f1ed 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_scalar.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_scalar.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_shift.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_shift.cpp index e5a4eb537f..27e94628a8 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_shift.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_shift.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -7,7 +7,8 @@ */ #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/load_store.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/load_store.cpp index d7c667aecf..49c5d65b3a 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/load_store.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/load_store.cpp @@ -6,7 +6,8 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp index bb33c3c47c..ef54b66827 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/status_register_access.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/status_register_access.cpp index 7a0640598c..8dfc64d6d7 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/status_register_access.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/status_register_access.cpp @@ -6,7 +6,7 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb16.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb16.cpp index a8c75e22b9..926c499222 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb16.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb16.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,7 +6,7 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/interface/A32/config.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp index 7ea31d40ee..090e98d1aa 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -7,7 +7,7 @@ */ #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/frontend/A32/translate/impl/common.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_dual.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_dual.cpp index e76666ecc2..eb574d773c 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_dual.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_dual.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2021 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/frontend/A32/translate/impl/common.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_multiple.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_multiple.cpp index b68a2cb7c5..d446fbf3dd 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_multiple.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_multiple.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2021 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A32/translate/impl/a32_translate_impl.h" #include "dynarmic/frontend/A32/translate/impl/common.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp b/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp index 309dd080f9..e0333e487d 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp @@ -9,7 +9,8 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/frontend/A32/a32_ir_emitter.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/a64_location_descriptor.h b/src/dynarmic/src/dynarmic/frontend/A64/a64_location_descriptor.h index a8be0232ca..4bfc5f890e 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/a64_location_descriptor.h +++ b/src/dynarmic/src/dynarmic/frontend/A64/a64_location_descriptor.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -13,7 +13,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/fp/fpcr.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h index 4ac04731ea..68422ed40d 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h +++ b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h @@ -15,7 +15,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/frontend/decoder/decoder_detail.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp index f3ecd7c604..de63f560bc 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp @@ -8,7 +8,9 @@ #include "dynarmic/frontend/A64/translate/impl/impl.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include +#include #include "dynarmic/ir/terminal.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_copy.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_copy.cpp index 9354b54fa5..b33bc8f5ad 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_copy.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_copy.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A64/translate/impl/impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_modified_immediate.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_modified_immediate.cpp index 2afece1c46..db8e83631a 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_modified_immediate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_modified_immediate.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A64/translate/impl/impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_shift_by_immediate.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_shift_by_immediate.cpp index 332eb35ebe..5d60cb31c3 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_shift_by_immediate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_shift_by_immediate.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/fp/rounding_mode.h" #include "dynarmic/frontend/A64/translate/impl/impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_three_same.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_three_same.cpp index ad5b89df3a..d551605bda 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_three_same.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_three_same.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,7 +5,7 @@ #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/frontend/A64/translate/impl/impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_shift_by_immediate.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_shift_by_immediate.cpp index 33debd1062..559721a22a 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_shift_by_immediate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_shift_by_immediate.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/fp/rounding_mode.h" #include "dynarmic/frontend/A64/translate/impl/impl.h" diff --git a/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h b/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h index 3ab360c287..0d9da6169c 100644 --- a/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h +++ b/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -13,8 +13,8 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" -#include "dynarmic/mcl/function_info.hpp" +#include +#include namespace Dynarmic::Decoder { namespace detail { @@ -75,11 +75,11 @@ struct detail { /// An argument is specified by a continuous string of the same character. template static consteval auto GetArgInfo(std::array bitstring) { - //static_assert(N > 0, "unexpected field"); std::array masks = {}; std::array shifts = {}; size_t arg_index = 0; char ch = 0; + for (size_t i = 0; i < opcode_bitsize; i++) { if (bitstring[i] == '0' || bitstring[i] == '1' || bitstring[i] == '-') { if (ch != 0) { @@ -93,10 +93,17 @@ struct detail { ch = bitstring[i]; arg_index++; } - const size_t bit_position = opcode_bitsize - i - 1; - //static_assert(arg_index >= N, "unexpected field"); - masks[arg_index] |= opcode_type(1) << bit_position; - shifts[arg_index] = bit_position; + + if constexpr (N > 0) { + const size_t bit_position = opcode_bitsize - i - 1; + if (arg_index >= N) + throw std::out_of_range("Unexpected field"); + + masks[arg_index] |= static_cast(1) << bit_position; + shifts[arg_index] = bit_position; + } else { + throw std::out_of_range("Unexpected field"); + } } } #if !defined(DYNARMIC_IGNORE_ASSERTS) && !defined(__ANDROID__) diff --git a/src/dynarmic/src/dynarmic/frontend/imm.cpp b/src/dynarmic/src/dynarmic/frontend/imm.cpp index aeb7b5d3f6..95e24206d7 100644 --- a/src/dynarmic/src/dynarmic/frontend/imm.cpp +++ b/src/dynarmic/src/dynarmic/frontend/imm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include "dynarmic/frontend/imm.h" #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" namespace Dynarmic { diff --git a/src/dynarmic/src/dynarmic/frontend/imm.h b/src/dynarmic/src/dynarmic/frontend/imm.h index 3a6c10316a..4e277ede3b 100644 --- a/src/dynarmic/src/dynarmic/frontend/imm.h +++ b/src/dynarmic/src/dynarmic/frontend/imm.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,7 +11,8 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/math_util.h" diff --git a/src/dynarmic/src/dynarmic/ir/basic_block.h b/src/dynarmic/src/dynarmic/ir/basic_block.h index bbf1319957..4044005bd0 100644 --- a/src/dynarmic/src/dynarmic/ir/basic_block.h +++ b/src/dynarmic/src/dynarmic/ir/basic_block.h @@ -16,7 +16,7 @@ #include #include #include -#include "dynarmic/mcl/intrusive_list.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/ir/location_descriptor.h" diff --git a/src/dynarmic/src/dynarmic/ir/ir_emitter.h b/src/dynarmic/src/dynarmic/ir/ir_emitter.h index 37f7c18065..2b5c7d5cdd 100644 --- a/src/dynarmic/src/dynarmic/ir/ir_emitter.h +++ b/src/dynarmic/src/dynarmic/ir/ir_emitter.h @@ -12,7 +12,7 @@ #include "dynarmic/common/common_types.h" #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/ir/opcodes.h" #include "dynarmic/ir/acc_type.h" diff --git a/src/dynarmic/src/dynarmic/ir/microinstruction.h b/src/dynarmic/src/dynarmic/ir/microinstruction.h index fb3ac1f49a..1700eb110b 100644 --- a/src/dynarmic/src/dynarmic/ir/microinstruction.h +++ b/src/dynarmic/src/dynarmic/ir/microinstruction.h @@ -10,7 +10,7 @@ #include -#include "dynarmic/mcl/intrusive_list.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/ir/value.h" diff --git a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp index ee29081d4d..f22e8aaa69 100644 --- a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp +++ b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp @@ -27,8 +27,8 @@ #include "dynarmic/ir/opcodes.h" #include "dynarmic/ir/opt_passes.h" #include "dynarmic/ir/type.h" -#include "dynarmic/mcl/bit.hpp" -#include "dynarmic/mcl/bit.hpp" +#include "mcl/bit/swap.hpp" +#include "mcl/bit/rotate.hpp" namespace Dynarmic::Optimization { diff --git a/src/dynarmic/src/dynarmic/ir/value.cpp b/src/dynarmic/src/dynarmic/ir/value.cpp index 451036b1fd..59b17b5a7b 100644 --- a/src/dynarmic/src/dynarmic/ir/value.cpp +++ b/src/dynarmic/src/dynarmic/ir/value.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,7 +9,7 @@ #include "dynarmic/ir/value.h" #include "dynarmic/common/assert.h" -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/opcodes.h" diff --git a/src/dynarmic/src/dynarmic/mcl/bit.hpp b/src/dynarmic/src/dynarmic/mcl/bit.hpp deleted file mode 100644 index 1ef9880a5f..0000000000 --- a/src/dynarmic/src/dynarmic/mcl/bit.hpp +++ /dev/null @@ -1,311 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2022 merryhime -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include -#include - -#include "dynarmic/common/common_types.h" -#include "dynarmic/common/assert.h" - -namespace mcl { -namespace detail { -template -concept SameHelper = std::is_same_v; -} // namespace detail -template -concept SameAs = detail::SameHelper && detail::SameHelper; -template -concept IsAnyOf = (SameAs || ...); -/// Integral upon which bit operations can be safely performed. -template -concept BitIntegral = IsAnyOf; - -template -constexpr std::size_t bitsizeof = CHAR_BIT * sizeof(T); - -} // namespace mcl - -namespace mcl::bit { - -constexpr u16 swap_bytes_16(u16 value) { - return static_cast(u32{value} >> 8 | u32{value} << 8); -} - -constexpr u32 swap_bytes_32(u32 value) { - return ((value & 0xff000000u) >> 24) - | ((value & 0x00ff0000u) >> 8) - | ((value & 0x0000ff00u) << 8) - | ((value & 0x000000ffu) << 24); -} - -constexpr u64 swap_bytes_64(u64 value) { - return ((value & 0xff00000000000000ull) >> 56) - | ((value & 0x00ff000000000000ull) >> 40) - | ((value & 0x0000ff0000000000ull) >> 24) - | ((value & 0x000000ff00000000ull) >> 8) - | ((value & 0x00000000ff000000ull) << 8) - | ((value & 0x0000000000ff0000ull) << 24) - | ((value & 0x000000000000ff00ull) << 40) - | ((value & 0x00000000000000ffull) << 56); -} - -constexpr u32 swap_halves_32(u32 value) { - return ((value & 0xffff0000u) >> 16) - | ((value & 0x0000ffffu) << 16); -} - -constexpr u64 swap_halves_64(u64 value) { - return ((value & 0xffff000000000000ull) >> 48) - | ((value & 0x0000ffff00000000ull) >> 16) - | ((value & 0x00000000ffff0000ull) << 16) - | ((value & 0x000000000000ffffull) << 48); -} - -constexpr u64 swap_words_64(u64 value) { - return ((value & 0xffffffff00000000ull) >> 32) - | ((value & 0x00000000ffffffffull) << 32); -} - -template -constexpr T rotate_right(T x, size_t amount) { - amount %= bitsizeof; - if (amount == 0) { - return x; - } - return static_cast((x >> amount) | (x << (bitsizeof - amount))); -} - -template -constexpr T rotate_left(T x, size_t amount) { - amount %= bitsizeof; - if (amount == 0) { - return x; - } - return static_cast((x << amount) | (x >> (bitsizeof - amount))); -} - -/// Create a mask with `count` number of one bits. -template -constexpr T ones() { - static_assert(count <= bitsizeof, "count larger than bitsize of T"); - - if constexpr (count == 0) { - return 0; - } else { - return static_cast(~static_cast(0)) >> (bitsizeof - count); - } -} - -/// Create a mask with `count` number of one bits. -template -constexpr T ones(size_t count) { - ASSERT(count <= bitsizeof && "count larger than bitsize of T"); - if (count == 0) { - return 0; - } - return static_cast(~static_cast(0)) >> (bitsizeof - count); -} - -/// Create a mask of type T for bits [begin_bit, end_bit] inclusive. -template -constexpr T mask() { - static_assert(begin_bit <= end_bit, "invalid bit range (position of beginning bit cannot be greater than that of end bit)"); - static_assert(begin_bit < bitsizeof, "begin_bit must be smaller than size of T"); - static_assert(end_bit < bitsizeof, "end_bit must be smaller than size of T"); - - return ones() << begin_bit; -} - -/// Create a mask of type T for bits [begin_bit, end_bit] inclusive. -template -constexpr T mask(size_t begin_bit, size_t end_bit) { - ASSERT(begin_bit <= end_bit && "invalid bit range (position of beginning bit cannot be greater than that of end bit)"); - ASSERT(begin_bit < bitsizeof && "begin_bit must be smaller than size of T"); - ASSERT(end_bit < bitsizeof && "end_bit must be smaller than size of T"); - return ones(end_bit - begin_bit + 1) << begin_bit; -} - -/// Extract bits [begin_bit, end_bit] inclusive from value of type T. -template -constexpr T get_bits(T value) { - constexpr T m = mask(); - return (value & m) >> begin_bit; -} - -/// Extract bits [begin_bit, end_bit] inclusive from value of type T. -template -constexpr T get_bits(size_t begin_bit, size_t end_bit, T value) { - const T m = mask(begin_bit, end_bit); - return (value & m) >> begin_bit; -} - -/// Clears bits [begin_bit, end_bit] inclusive of value of type T. -template -constexpr T clear_bits(T value) { - constexpr T m = mask(); - return value & ~m; -} - -/// Clears bits [begin_bit, end_bit] inclusive of value of type T. -template -constexpr T clear_bits(size_t begin_bit, size_t end_bit, T value) { - const T m = mask(begin_bit, end_bit); - return value & ~m; -} - -/// Modifies bits [begin_bit, end_bit] inclusive of value of type T. -template -constexpr T set_bits(T value, T new_bits) { - constexpr T m = mask(); - return (value & ~m) | ((new_bits << begin_bit) & m); -} - -/// Modifies bits [begin_bit, end_bit] inclusive of value of type T. -template -constexpr T set_bits(size_t begin_bit, size_t end_bit, T value, T new_bits) { - const T m = mask(begin_bit, end_bit); - return (value & ~m) | ((new_bits << begin_bit) & m); -} - -/// Extract bit at bit_position from value of type T. -template -constexpr bool get_bit(T value) { - constexpr T m = mask(); - return (value & m) != 0; -} - -/// Extract bit at bit_position from value of type T. -template -constexpr bool get_bit(size_t bit_position, T value) { - const T m = mask(bit_position, bit_position); - return (value & m) != 0; -} - -/// Clears bit at bit_position of value of type T. -template -constexpr T clear_bit(T value) { - constexpr T m = mask(); - return value & ~m; -} - -/// Clears bit at bit_position of value of type T. -template -constexpr T clear_bit(size_t bit_position, T value) { - const T m = mask(bit_position, bit_position); - return value & ~m; -} - -/// Modifies bit at bit_position of value of type T. -template -constexpr T set_bit(T value, bool new_bit) { - constexpr T m = mask(); - return (value & ~m) | (new_bit ? m : static_cast(0)); -} - -/// Modifies bit at bit_position of value of type T. -template -constexpr T set_bit(size_t bit_position, T value, bool new_bit) { - const T m = mask(bit_position, bit_position); - return (value & ~m) | (new_bit ? m : static_cast(0)); -} - -/// Sign-extends a value that has bit_count bits to the full bitwidth of type T. -template -constexpr T sign_extend(T value) { - static_assert(bit_count != 0, "cannot sign-extend zero-sized value"); - - using S = std::make_signed_t; - constexpr size_t shift_amount = bitsizeof - bit_count; - return static_cast(static_cast(value << shift_amount) >> shift_amount); -} - -/// Sign-extends a value that has bit_count bits to the full bitwidth of type T. -template -constexpr T sign_extend(size_t bit_count, T value) { - ASSERT(bit_count != 0 && "cannot sign-extend zero-sized value"); - using S = std::make_signed_t; - const size_t shift_amount = bitsizeof - bit_count; - return T(S(value << shift_amount) >> shift_amount); -} - -/// Replicate an element across a value of type T. -template -constexpr T replicate_element(T value) { - static_assert(element_size <= bitsizeof, "element_size is too large"); - static_assert(bitsizeof % element_size == 0, "bitsize of T not divisible by element_size"); - - if constexpr (element_size == bitsizeof) { - return value; - } else { - return replicate_element(static_cast(value | (value << element_size))); - } -} - -/// Replicate an element of type U across a value of type T. -template -constexpr T replicate_element(T value) { - static_assert(bitsizeof <= bitsizeof, "element_size is too large"); - - return replicate_element, T>(value); -} - -/// Replicate an element across a value of type T. -template -constexpr T replicate_element(size_t element_size, T value) { - ASSERT(element_size <= bitsizeof && "element_size is too large"); - ASSERT(bitsizeof % element_size == 0 && "bitsize of T not divisible by element_size"); - if (element_size == bitsizeof) - return value; - return replicate_element(element_size * 2, static_cast(value | (value << element_size))); -} - -template -constexpr bool most_significant_bit(T value) { - return get_bit - 1, T>(value); -} - -template -inline size_t count_ones(T x) { - return std::bitset>(x).count(); -} - -template -constexpr size_t count_leading_zeros(T x) { - size_t result = bitsizeof; - while (x != 0) { - x >>= 1; - result--; - } - return result; -} - -template -constexpr int highest_set_bit(T x) { - int result = -1; - while (x != 0) { - x >>= 1; - result++; - } - return result; -} - -template -constexpr size_t lowest_set_bit(T x) { - if (x == 0) { - return bitsizeof; - } - - size_t result = 0; - while ((x & 1) == 0) { - x >>= 1; - result++; - } - return result; -} - -} // namespace mcl::bit diff --git a/src/dynarmic/src/dynarmic/mcl/function_info.hpp b/src/dynarmic/src/dynarmic/mcl/function_info.hpp deleted file mode 100644 index 452bd88bfc..0000000000 --- a/src/dynarmic/src/dynarmic/mcl/function_info.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2022 merryhime -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include - -namespace mcl { - -/// Contains a list of types -template -struct type_list {}; - -template -struct function_info : function_info {}; - -template -struct function_info { - using return_type = R; - using parameter_list = type_list; - static constexpr std::size_t parameter_count = sizeof...(As); - - using equivalent_function_type = R(As...); - - template - struct parameter { - static_assert(I < parameter_count, "Non-existent parameter"); - using type = std::tuple_element_t>; - }; -}; - -template -struct function_info : function_info {}; - -template -struct function_info : function_info { - using class_type = C; - - using equivalent_function_type_with_class = R(C*, As...); -}; - -template -struct function_info : function_info { - using class_type = C; - - using equivalent_function_type_with_class = R(C*, As...); -}; - -template -constexpr size_t parameter_count_v = function_info::parameter_count; - -template -using parameter_list = typename function_info::parameter_list; - -template -using get_parameter = typename function_info::template parameter::type; - -template -using equivalent_function_type = typename function_info::equivalent_function_type; - -template -using equivalent_function_type_with_class = typename function_info::equivalent_function_type_with_class; - -template -using return_type = typename function_info::return_type; - -template -using class_type = typename function_info::class_type; - -} // namespace mcl diff --git a/src/dynarmic/src/dynarmic/mcl/integer_of_size.hpp b/src/dynarmic/src/dynarmic/mcl/integer_of_size.hpp deleted file mode 100644 index 8bdecc955d..0000000000 --- a/src/dynarmic/src/dynarmic/mcl/integer_of_size.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2022 merryhime -// SPDX-License-Identifier: MIT - -#pragma once - -#include "dynarmic/common/common_types.h" - -namespace mcl { - -namespace detail { - -template -struct integer_of_size_impl {}; - -template<> -struct integer_of_size_impl<8> { - using unsigned_type = u8; - using signed_type = s8; -}; - -template<> -struct integer_of_size_impl<16> { - using unsigned_type = u16; - using signed_type = s16; -}; - -template<> -struct integer_of_size_impl<32> { - using unsigned_type = u32; - using signed_type = s32; -}; - -template<> -struct integer_of_size_impl<64> { - using unsigned_type = u64; - using signed_type = s64; -}; - -} // namespace detail - -template -using unsigned_integer_of_size = typename detail::integer_of_size_impl::unsigned_type; - -template -using signed_integer_of_size = typename detail::integer_of_size_impl::signed_type; - -} // namespace mcl diff --git a/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp b/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp deleted file mode 100644 index 3b1c1d6699..0000000000 --- a/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp +++ /dev/null @@ -1,408 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2022 merryhime -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include -#include -#include -#include "dynarmic/common/assert.h" - -namespace mcl { - -template -class intrusive_list; -template -class intrusive_list_iterator; - -template -class intrusive_list_node { -public: - bool is_sentinel() const - { - return is_sentinel_; - } - -protected: - intrusive_list_node* next = nullptr; - intrusive_list_node* prev = nullptr; - bool is_sentinel_ = false; - - friend class intrusive_list; - friend class intrusive_list_iterator; - friend class intrusive_list_iterator; -}; - -template -class intrusive_list_sentinel final : public intrusive_list_node { - using intrusive_list_node::next; - using intrusive_list_node::prev; - using intrusive_list_node::is_sentinel_; - -public: - intrusive_list_sentinel() - { - next = this; - prev = this; - is_sentinel_ = true; - } -}; - -template -class intrusive_list_iterator { -public: - using iterator_category = std::bidirectional_iterator_tag; - using difference_type = std::ptrdiff_t; - using value_type = T; - using pointer = value_type*; - using const_pointer = const value_type*; - using reference = value_type&; - using const_reference = const value_type&; - - // If value_type is const, we want "const intrusive_list_node", not "intrusive_list_node" - using node_type = std::conditional_t::value, - const intrusive_list_node>, - intrusive_list_node>; - using node_pointer = node_type*; - using node_reference = node_type&; - - intrusive_list_iterator() = default; - intrusive_list_iterator(const intrusive_list_iterator& other) = default; - intrusive_list_iterator& operator=(const intrusive_list_iterator& other) = default; - - explicit intrusive_list_iterator(node_pointer list_node) - : node(list_node) {} - explicit intrusive_list_iterator(pointer data) - : node(data) {} - explicit intrusive_list_iterator(reference data) - : node(&data) {} - - intrusive_list_iterator& operator++() - { - node = node->next; - return *this; - } - intrusive_list_iterator& operator--() - { - node = node->prev; - return *this; - } - intrusive_list_iterator operator++(int) - { - intrusive_list_iterator it(*this); - ++*this; - return it; - } - intrusive_list_iterator operator--(int) - { - intrusive_list_iterator it(*this); - --*this; - return it; - } - - bool operator==(const intrusive_list_iterator& other) const - { - return node == other.node; - } - bool operator!=(const intrusive_list_iterator& other) const - { - return !operator==(other); - } - - reference operator*() const - { - DEBUG_ASSERT(!node->is_sentinel()); - return static_cast(*node); - } - pointer operator->() const - { - return std::addressof(operator*()); - } - - node_pointer AsNodePointer() const - { - return node; - } - -private: - friend class intrusive_list; - node_pointer node = nullptr; -}; - -template -class intrusive_list { -public: - using difference_type = std::ptrdiff_t; - using size_type = std::size_t; - using value_type = T; - using pointer = value_type*; - using const_pointer = const value_type*; - using reference = value_type&; - using const_reference = const value_type&; - using iterator = intrusive_list_iterator; - using const_iterator = intrusive_list_iterator; - using reverse_iterator = std::reverse_iterator; - using const_reverse_iterator = std::reverse_iterator; - - /** - * Inserts a node at the given location indicated by an iterator. - * - * @param location The location to insert the node. - * @param new_node The node to add. - */ - iterator insert(iterator location, pointer new_node) - { - return insert_before(location, new_node); - } - - /** - * Inserts a node at the given location, moving the previous - * node occupant ahead of the one inserted. - * - * @param location The location to insert the new node. - * @param new_node The node to insert into the list. - */ - iterator insert_before(iterator location, pointer new_node) - { - auto existing_node = location.AsNodePointer(); - - new_node->next = existing_node; - new_node->prev = existing_node->prev; - existing_node->prev->next = new_node; - existing_node->prev = new_node; - - return iterator(new_node); - } - - /** - * Inserts a new node into the list ahead of the position indicated. - * - * @param position Location to insert the node in front of. - * @param new_node The node to be inserted into the list. - */ - iterator insert_after(iterator position, pointer new_node) - { - if (empty()) - return insert(begin(), new_node); - - return insert(++position, new_node); - } - - /** - * Add an entry to the start of the list. - * @param node Node to add to the list. - */ - void push_front(pointer node) - { - insert(begin(), node); - } - - /** - * Add an entry to the end of the list - * @param node Node to add to the list. - */ - void push_back(pointer node) - { - insert(end(), node); - } - - /** - * Erases the node at the front of the list. - * @note Must not be called on an empty list. - */ - void pop_front() - { - DEBUG_ASSERT(!empty()); - erase(begin()); - } - - /** - * Erases the node at the back of the list. - * @note Must not be called on an empty list. - */ - void pop_back() - { - DEBUG_ASSERT(!empty()); - erase(--end()); - } - - /** - * Removes a node from this list - * @param it An iterator that points to the node to remove from list. - */ - pointer remove(iterator& it) - { - DEBUG_ASSERT(it != end()); - - pointer node = &*it++; - - node->prev->next = node->next; - node->next->prev = node->prev; -#if !defined(NDEBUG) - node->next = nullptr; - node->prev = nullptr; -#endif - - return node; - } - - /** - * Removes a node from this list - * @param it A constant iterator that points to the node to remove from list. - */ - pointer remove(const iterator& it) - { - iterator copy = it; - return remove(copy); - } - - /** - * Removes a node from this list. - * @param node A pointer to the node to remove. - */ - pointer remove(pointer node) - { - return remove(iterator(node)); - } - - /** - * Removes a node from this list. - * @param node A reference to the node to remove. - */ - pointer remove(reference node) - { - return remove(iterator(node)); - } - - /** - * Is this list empty? - * @returns true if there are no nodes in this list. - */ - bool empty() const - { - return root->next == root.get(); - } - - /** - * Gets the total number of elements within this list. - * @return the number of elements in this list. - */ - size_type size() const - { - return static_cast(std::distance(begin(), end())); - } - - /** - * Retrieves a reference to the node at the front of the list. - * @note Must not be called on an empty list. - */ - reference front() - { - DEBUG_ASSERT(!empty()); - return *begin(); - } - - /** - * Retrieves a constant reference to the node at the front of the list. - * @note Must not be called on an empty list. - */ - const_reference front() const - { - DEBUG_ASSERT(!empty()); - return *begin(); - } - - /** - * Retrieves a reference to the node at the back of the list. - * @note Must not be called on an empty list. - */ - reference back() - { - DEBUG_ASSERT(!empty()); - return *--end(); - } - - /** - * Retrieves a constant reference to the node at the back of the list. - * @note Must not be called on an empty list. - */ - const_reference back() const - { - DEBUG_ASSERT(!empty()); - return *--end(); - } - - // Iterator interface - iterator begin() { return iterator(root->next); } - const_iterator begin() const { return const_iterator(root->next); } - const_iterator cbegin() const { return begin(); } - - iterator end() { return iterator(root.get()); } - const_iterator end() const { return const_iterator(root.get()); } - const_iterator cend() const { return end(); } - - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } - const_reverse_iterator crbegin() const { return rbegin(); } - - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } - const_reverse_iterator crend() const { return rend(); } - - /** - * Erases a node from the list, indicated by an iterator. - * @param it The iterator that points to the node to erase. - */ - iterator erase(iterator it) - { - remove(it); - return it; - } - - /** - * Erases a node from this list. - * @param node A pointer to the node to erase from this list. - */ - iterator erase(pointer node) - { - return erase(iterator(node)); - } - - /** - * Erases a node from this list. - * @param node A reference to the node to erase from this list. - */ - iterator erase(reference node) - { - return erase(iterator(node)); - } - - /** - * Exchanges contents of this list with another list instance. - * @param other The other list to swap with. - */ - void swap(intrusive_list& other) noexcept - { - root.swap(other.root); - } - -private: - std::shared_ptr> root = std::make_shared>(); -}; - -/** - * Exchanges contents of an intrusive list with another intrusive list. - * @tparam T The type of data being kept track of by the lists. - * @param lhs The first list. - * @param rhs The second list. - */ -template -void swap(intrusive_list& lhs, intrusive_list& rhs) noexcept -{ - lhs.swap(rhs); -} - -} // namespace mcl diff --git a/src/dynarmic/src/dynarmic/mcl/is_instance_of_template.hpp b/src/dynarmic/src/dynarmic/mcl/is_instance_of_template.hpp deleted file mode 100644 index 0cb143430d..0000000000 --- a/src/dynarmic/src/dynarmic/mcl/is_instance_of_template.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2022 merryhime -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include - -namespace mcl { - -/// A metavalue (of type VT and value v). -template using value = std::integral_constant; -/// A metavalue of type size_t (and value v). -template using size_value = value; -/// A metavalue of type bool (and value v). (Aliases to std::bool_constant.) -template using bool_value = value; -/// true metavalue (Aliases to std::true_type). -using true_type = bool_value; -/// false metavalue (Aliases to std::false_type). -using false_type = bool_value; - -/// Is type T an instance of template class C? -template class, class> -struct is_instance_of_template : false_type {}; - -template class C, class... As> -struct is_instance_of_template> : true_type {}; - -/// Is type T an instance of template class C? -template class C, class T> -constexpr bool is_instance_of_template_v = is_instance_of_template::value; - -} // namespace mcl diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp index e9834a6663..cd2eade884 100644 --- a/src/dynarmic/tests/A32/fuzz_arm.cpp +++ b/src/dynarmic/tests/A32/fuzz_arm.cpp @@ -15,7 +15,9 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include +#include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/tests/fuzz_util.h" @@ -354,67 +356,67 @@ static void RunTestInstance(Dynarmic::A32::Jit& jit, uni_env.ticks_left = instructions.size(); // Unicorn counts thumb instructions weirdly. uni.Run(); - // SCOPE_FAIL { - // fmt::print("Instruction Listing:\n"); - // fmt::print("{}\n", Common::DisassembleAArch32(std::is_same_v, initial_pc, (const u8*)instructions.data(), instructions.size() * sizeof(instructions[0]))); + SCOPE_FAIL { + fmt::print("Instruction Listing:\n"); + fmt::print("{}\n", Common::DisassembleAArch32(std::is_same_v, initial_pc, (const u8*)instructions.data(), instructions.size() * sizeof(instructions[0]))); - // fmt::print("Initial register listing:\n"); - // for (size_t i = 0; i < regs.size(); ++i) { - // fmt::print("{:3s}: {:08x}\n", static_cast(i), regs[i]); - // } - // for (size_t i = 0; i < vecs.size(); ++i) { - // fmt::print("{:3s}: {:08x}\n", static_cast(i), vecs[i]); - // } - // fmt::print("cpsr {:08x}\n", cpsr); - // fmt::print("fpcr {:08x}\n", fpscr); - // fmt::print("fpcr.AHP {}\n", FP::FPCR{fpscr}.AHP()); - // fmt::print("fpcr.DN {}\n", FP::FPCR{fpscr}.DN()); - // fmt::print("fpcr.FZ {}\n", FP::FPCR{fpscr}.FZ()); - // fmt::print("fpcr.RMode {}\n", static_cast(FP::FPCR{fpscr}.RMode())); - // fmt::print("fpcr.FZ16 {}\n", FP::FPCR{fpscr}.FZ16()); - // fmt::print("\n"); + fmt::print("Initial register listing:\n"); + for (size_t i = 0; i < regs.size(); ++i) { + fmt::print("{:3s}: {:08x}\n", static_cast(i), regs[i]); + } + for (size_t i = 0; i < vecs.size(); ++i) { + fmt::print("{:3s}: {:08x}\n", static_cast(i), vecs[i]); + } + fmt::print("cpsr {:08x}\n", cpsr); + fmt::print("fpcr {:08x}\n", fpscr); + fmt::print("fpcr.AHP {}\n", FP::FPCR{fpscr}.AHP()); + fmt::print("fpcr.DN {}\n", FP::FPCR{fpscr}.DN()); + fmt::print("fpcr.FZ {}\n", FP::FPCR{fpscr}.FZ()); + fmt::print("fpcr.RMode {}\n", static_cast(FP::FPCR{fpscr}.RMode())); + fmt::print("fpcr.FZ16 {}\n", FP::FPCR{fpscr}.FZ16()); + fmt::print("\n"); - // fmt::print("Final register listing:\n"); - // fmt::print(" unicorn dynarmic\n"); - // const auto uni_regs = uni.GetRegisters(); - // for (size_t i = 0; i < regs.size(); ++i) { - // fmt::print("{:3s}: {:08x} {:08x} {}\n", static_cast(i), uni_regs[i], jit.Regs()[i], uni_regs[i] != jit.Regs()[i] ? "*" : ""); - // } - // const auto uni_ext_regs = uni.GetExtRegs(); - // for (size_t i = 0; i < vecs.size(); ++i) { - // fmt::print("s{:2d}: {:08x} {:08x} {}\n", static_cast(i), uni_ext_regs[i], jit.ExtRegs()[i], uni_ext_regs[i] != jit.ExtRegs()[i] ? "*" : ""); - // } - // fmt::print("cpsr {:08x} {:08x} {}\n", uni.GetCpsr(), jit.Cpsr(), uni.GetCpsr() != jit.Cpsr() ? "*" : ""); - // fmt::print("fpsr {:08x} {:08x} {}\n", uni.GetFpscr(), jit.Fpscr(), (uni.GetFpscr() & 0xF0000000) != (jit.Fpscr() & 0xF0000000) ? "*" : ""); - // fmt::print("\n"); + fmt::print("Final register listing:\n"); + fmt::print(" unicorn dynarmic\n"); + const auto uni_regs = uni.GetRegisters(); + for (size_t i = 0; i < regs.size(); ++i) { + fmt::print("{:3s}: {:08x} {:08x} {}\n", static_cast(i), uni_regs[i], jit.Regs()[i], uni_regs[i] != jit.Regs()[i] ? "*" : ""); + } + const auto uni_ext_regs = uni.GetExtRegs(); + for (size_t i = 0; i < vecs.size(); ++i) { + fmt::print("s{:2d}: {:08x} {:08x} {}\n", static_cast(i), uni_ext_regs[i], jit.ExtRegs()[i], uni_ext_regs[i] != jit.ExtRegs()[i] ? "*" : ""); + } + fmt::print("cpsr {:08x} {:08x} {}\n", uni.GetCpsr(), jit.Cpsr(), uni.GetCpsr() != jit.Cpsr() ? "*" : ""); + fmt::print("fpsr {:08x} {:08x} {}\n", uni.GetFpscr(), jit.Fpscr(), (uni.GetFpscr() & 0xF0000000) != (jit.Fpscr() & 0xF0000000) ? "*" : ""); + fmt::print("\n"); - // fmt::print("Modified memory:\n"); - // fmt::print(" uni dyn\n"); - // auto uni_iter = uni_env.modified_memory.begin(); - // auto jit_iter = jit_env.modified_memory.begin(); - // while (uni_iter != uni_env.modified_memory.end() || jit_iter != jit_env.modified_memory.end()) { - // if (uni_iter == uni_env.modified_memory.end() || (jit_iter != jit_env.modified_memory.end() && uni_iter->first > jit_iter->first)) { - // fmt::print("{:08x}: {:02x} *\n", jit_iter->first, jit_iter->second); - // jit_iter++; - // } else if (jit_iter == jit_env.modified_memory.end() || jit_iter->first > uni_iter->first) { - // fmt::print("{:08x}: {:02x} *\n", uni_iter->first, uni_iter->second); - // uni_iter++; - // } else if (uni_iter->first == jit_iter->first) { - // fmt::print("{:08x}: {:02x} {:02x} {}\n", uni_iter->first, uni_iter->second, jit_iter->second, uni_iter->second != jit_iter->second ? "*" : ""); - // uni_iter++; - // jit_iter++; - // } - // } - // fmt::print("\n"); + fmt::print("Modified memory:\n"); + fmt::print(" uni dyn\n"); + auto uni_iter = uni_env.modified_memory.begin(); + auto jit_iter = jit_env.modified_memory.begin(); + while (uni_iter != uni_env.modified_memory.end() || jit_iter != jit_env.modified_memory.end()) { + if (uni_iter == uni_env.modified_memory.end() || (jit_iter != jit_env.modified_memory.end() && uni_iter->first > jit_iter->first)) { + fmt::print("{:08x}: {:02x} *\n", jit_iter->first, jit_iter->second); + jit_iter++; + } else if (jit_iter == jit_env.modified_memory.end() || jit_iter->first > uni_iter->first) { + fmt::print("{:08x}: {:02x} *\n", uni_iter->first, uni_iter->second); + uni_iter++; + } else if (uni_iter->first == jit_iter->first) { + fmt::print("{:08x}: {:02x} {:02x} {}\n", uni_iter->first, uni_iter->second, jit_iter->second, uni_iter->second != jit_iter->second ? "*" : ""); + uni_iter++; + jit_iter++; + } + } + fmt::print("\n"); - // fmt::print("x86_64:\n"); - // fmt::print("{}", jit.Disassemble()); + fmt::print("x86_64:\n"); + fmt::print("{}", jit.Disassemble()); - // fmt::print("Interrupts:\n"); - // for (const auto& i : uni_env.interrupts) { - // std::puts(i.c_str()); - // } - // }; + fmt::print("Interrupts:\n"); + for (const auto& i : uni_env.interrupts) { + std::puts(i.c_str()); + } + }; REQUIRE(uni_env.code_mem_modified_by_guest == jit_env.code_mem_modified_by_guest); if (uni_env.code_mem_modified_by_guest) { diff --git a/src/dynarmic/tests/A32/fuzz_thumb.cpp b/src/dynarmic/tests/A32/fuzz_thumb.cpp index 7fef968b95..f985e6f93d 100644 --- a/src/dynarmic/tests/A32/fuzz_thumb.cpp +++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp @@ -16,7 +16,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/tests/rand_int.h" diff --git a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp index 749cc77126..0c7a30a868 100644 --- a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp +++ b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp @@ -12,6 +12,7 @@ #include #include +#include #include "dynarmic/common/common_types.h" #include "dynarmic/tests/fuzz_util.h" @@ -204,82 +205,82 @@ static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv uni_env.ticks_left = instructions.size() * 4; uni.Run(); - // SCOPE_FAIL { - // fmt::print("Instruction Listing:\n"); - // for (u32 instruction : instructions) { - // fmt::print("{:08x} {}\n", instruction, Common::DisassembleAArch64(instruction)); - // } - // fmt::print("\n"); + SCOPE_FAIL { + fmt::print("Instruction Listing:\n"); + for (u32 instruction : instructions) { + fmt::print("{:08x} {}\n", instruction, Common::DisassembleAArch64(instruction)); + } + fmt::print("\n"); - // fmt::print("Initial register listing:\n"); - // for (size_t i = 0; i < regs.size(); ++i) { - // fmt::print("{:3s}: {:016x}\n", A64::RegToString(static_cast(i)), regs[i]); - // } - // for (size_t i = 0; i < vecs.size(); ++i) { - // fmt::print("{:3s}: {:016x}{:016x}\n", A64::VecToString(static_cast(i)), vecs[i][1], vecs[i][0]); - // } - // fmt::print("sp : {:016x}\n", initial_sp); - // fmt::print("pc : {:016x}\n", instructions_start); - // fmt::print("p : {:08x}\n", pstate); - // fmt::print("fpcr {:08x}\n", fpcr); - // fmt::print("fpcr.AHP {}\n", FP::FPCR{fpcr}.AHP()); - // fmt::print("fpcr.DN {}\n", FP::FPCR{fpcr}.DN()); - // fmt::print("fpcr.FZ {}\n", FP::FPCR{fpcr}.FZ()); - // fmt::print("fpcr.RMode {}\n", static_cast(FP::FPCR{fpcr}.RMode())); - // fmt::print("fpcr.FZ16 {}\n", FP::FPCR{fpcr}.FZ16()); - // fmt::print("\n"); + fmt::print("Initial register listing:\n"); + for (size_t i = 0; i < regs.size(); ++i) { + fmt::print("{:3s}: {:016x}\n", A64::RegToString(static_cast(i)), regs[i]); + } + for (size_t i = 0; i < vecs.size(); ++i) { + fmt::print("{:3s}: {:016x}{:016x}\n", A64::VecToString(static_cast(i)), vecs[i][1], vecs[i][0]); + } + fmt::print("sp : {:016x}\n", initial_sp); + fmt::print("pc : {:016x}\n", instructions_start); + fmt::print("p : {:08x}\n", pstate); + fmt::print("fpcr {:08x}\n", fpcr); + fmt::print("fpcr.AHP {}\n", FP::FPCR{fpcr}.AHP()); + fmt::print("fpcr.DN {}\n", FP::FPCR{fpcr}.DN()); + fmt::print("fpcr.FZ {}\n", FP::FPCR{fpcr}.FZ()); + fmt::print("fpcr.RMode {}\n", static_cast(FP::FPCR{fpcr}.RMode())); + fmt::print("fpcr.FZ16 {}\n", FP::FPCR{fpcr}.FZ16()); + fmt::print("\n"); - // fmt::print("Final register listing:\n"); - // fmt::print(" unicorn dynarmic\n"); - // const auto uni_regs = uni.GetRegisters(); - // for (size_t i = 0; i < regs.size(); ++i) { - // fmt::print("{:3s}: {:016x} {:016x} {}\n", A64::RegToString(static_cast(i)), uni_regs[i], jit.GetRegisters()[i], uni_regs[i] != jit.GetRegisters()[i] ? "*" : ""); - // } - // const auto uni_vecs = uni.GetVectors(); - // for (size_t i = 0; i < vecs.size(); ++i) { - // fmt::print("{:3s}: {:016x}{:016x} {:016x}{:016x} {}\n", A64::VecToString(static_cast(i)), - // uni_vecs[i][1], uni_vecs[i][0], - // jit.GetVectors()[i][1], jit.GetVectors()[i][0], - // uni_vecs[i] != jit.GetVectors()[i] ? "*" : ""); - // } - // fmt::print("sp : {:016x} {:016x} {}\n", uni.GetSP(), jit.GetSP(), uni.GetSP() != jit.GetSP() ? "*" : ""); - // fmt::print("pc : {:016x} {:016x} {}\n", uni.GetPC(), jit.GetPC(), uni.GetPC() != jit.GetPC() ? "*" : ""); - // fmt::print("p : {:08x} {:08x} {}\n", uni.GetPstate(), jit.GetPstate(), (uni.GetPstate() & 0xF0000000) != (jit.GetPstate() & 0xF0000000) ? "*" : ""); - // fmt::print("qc : {:08x} {:08x} {}\n", uni.GetFpsr(), jit.GetFpsr(), FP::FPSR{uni.GetFpsr()}.QC() != FP::FPSR{jit.GetFpsr()}.QC() ? "*" : ""); - // fmt::print("\n"); + fmt::print("Final register listing:\n"); + fmt::print(" unicorn dynarmic\n"); + const auto uni_regs = uni.GetRegisters(); + for (size_t i = 0; i < regs.size(); ++i) { + fmt::print("{:3s}: {:016x} {:016x} {}\n", A64::RegToString(static_cast(i)), uni_regs[i], jit.GetRegisters()[i], uni_regs[i] != jit.GetRegisters()[i] ? "*" : ""); + } + const auto uni_vecs = uni.GetVectors(); + for (size_t i = 0; i < vecs.size(); ++i) { + fmt::print("{:3s}: {:016x}{:016x} {:016x}{:016x} {}\n", A64::VecToString(static_cast(i)), + uni_vecs[i][1], uni_vecs[i][0], + jit.GetVectors()[i][1], jit.GetVectors()[i][0], + uni_vecs[i] != jit.GetVectors()[i] ? "*" : ""); + } + fmt::print("sp : {:016x} {:016x} {}\n", uni.GetSP(), jit.GetSP(), uni.GetSP() != jit.GetSP() ? "*" : ""); + fmt::print("pc : {:016x} {:016x} {}\n", uni.GetPC(), jit.GetPC(), uni.GetPC() != jit.GetPC() ? "*" : ""); + fmt::print("p : {:08x} {:08x} {}\n", uni.GetPstate(), jit.GetPstate(), (uni.GetPstate() & 0xF0000000) != (jit.GetPstate() & 0xF0000000) ? "*" : ""); + fmt::print("qc : {:08x} {:08x} {}\n", uni.GetFpsr(), jit.GetFpsr(), FP::FPSR{uni.GetFpsr()}.QC() != FP::FPSR{jit.GetFpsr()}.QC() ? "*" : ""); + fmt::print("\n"); - // fmt::print("Modified memory:\n"); - // fmt::print(" uni dyn\n"); - // auto uni_iter = uni_env.modified_memory.begin(); - // auto jit_iter = jit_env.modified_memory.begin(); - // while (uni_iter != uni_env.modified_memory.end() || jit_iter != jit_env.modified_memory.end()) { - // if (uni_iter == uni_env.modified_memory.end() || (jit_iter != jit_env.modified_memory.end() && uni_iter->first > jit_iter->first)) { - // fmt::print("{:016x}: {:02x} *\n", jit_iter->first, jit_iter->second); - // jit_iter++; - // } else if (jit_iter == jit_env.modified_memory.end() || jit_iter->first > uni_iter->first) { - // fmt::print("{:016x}: {:02x} *\n", uni_iter->first, uni_iter->second); - // uni_iter++; - // } else if (uni_iter->first == jit_iter->first) { - // fmt::print("{:016x}: {:02x} {:02x} {}\n", uni_iter->first, uni_iter->second, jit_iter->second, uni_iter->second != jit_iter->second ? "*" : ""); - // uni_iter++; - // jit_iter++; - // } - // } - // fmt::print("\n"); + fmt::print("Modified memory:\n"); + fmt::print(" uni dyn\n"); + auto uni_iter = uni_env.modified_memory.begin(); + auto jit_iter = jit_env.modified_memory.begin(); + while (uni_iter != uni_env.modified_memory.end() || jit_iter != jit_env.modified_memory.end()) { + if (uni_iter == uni_env.modified_memory.end() || (jit_iter != jit_env.modified_memory.end() && uni_iter->first > jit_iter->first)) { + fmt::print("{:016x}: {:02x} *\n", jit_iter->first, jit_iter->second); + jit_iter++; + } else if (jit_iter == jit_env.modified_memory.end() || jit_iter->first > uni_iter->first) { + fmt::print("{:016x}: {:02x} *\n", uni_iter->first, uni_iter->second); + uni_iter++; + } else if (uni_iter->first == jit_iter->first) { + fmt::print("{:016x}: {:02x} {:02x} {}\n", uni_iter->first, uni_iter->second, jit_iter->second, uni_iter->second != jit_iter->second ? "*" : ""); + uni_iter++; + jit_iter++; + } + } + fmt::print("\n"); - // const auto get_code = [&jit_env](u64 vaddr) { return jit_env.MemoryReadCode(vaddr); }; - // const A64::LocationDescriptor location{instructions_start, FP::FPCR{fpcr}}; - // IR::Block ir_block{location}; - // A64::Translate(ir_block, location, get_code, {}); - // fmt::print("IR:\n{}\n", IR::DumpBlock(ir_block)); - // Optimization::Optimize(ir_block, conf, {}); - // fmt::print("Optimized IR:\n{}\n", IR::DumpBlock(ir_block)); - // fmt::print("x86_64:\n{}", jit.Disassemble()); - // fmt::print("Interrupts:\n"); - // for (auto& i : uni_env.interrupts) { - // puts(i.c_str()); - // } - // }; + const auto get_code = [&jit_env](u64 vaddr) { return jit_env.MemoryReadCode(vaddr); }; + const A64::LocationDescriptor location{instructions_start, FP::FPCR{fpcr}}; + IR::Block ir_block{location}; + A64::Translate(ir_block, location, get_code, {}); + fmt::print("IR:\n{}\n", IR::DumpBlock(ir_block)); + Optimization::Optimize(ir_block, conf, {}); + fmt::print("Optimized IR:\n{}\n", IR::DumpBlock(ir_block)); + fmt::print("x86_64:\n{}", jit.Disassemble()); + fmt::print("Interrupts:\n"); + for (auto& i : uni_env.interrupts) { + puts(i.c_str()); + } + }; REQUIRE(uni_env.code_mem_modified_by_guest == jit_env.code_mem_modified_by_guest); if (uni_env.code_mem_modified_by_guest) { diff --git a/src/dynarmic/tests/CMakeLists.txt b/src/dynarmic/tests/CMakeLists.txt index ca44dce593..395181efe3 100644 --- a/src/dynarmic/tests/CMakeLists.txt +++ b/src/dynarmic/tests/CMakeLists.txt @@ -72,7 +72,7 @@ add_executable(dynarmic_print_info print_info.cpp ) create_target_directory_groups(dynarmic_print_info) -target_link_libraries(dynarmic_print_info PRIVATE dynarmic fmt::fmt unordered_dense::unordered_dense) +target_link_libraries(dynarmic_print_info PRIVATE dynarmic fmt::fmt merry::mcl unordered_dense::unordered_dense) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic_print_info PRIVATE Boost::variant Boost::icl Boost::pool) else() @@ -93,7 +93,7 @@ add_executable(dynarmic_test_generator create_target_directory_groups(dynarmic_test_generator) -target_link_libraries(dynarmic_test_generator PRIVATE dynarmic fmt::fmt unordered_dense::unordered_dense) +target_link_libraries(dynarmic_test_generator PRIVATE dynarmic fmt::fmt merry::mcl unordered_dense::unordered_dense) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic_test_generator PRIVATE Boost::variant Boost::icl Boost::pool) else() @@ -110,7 +110,7 @@ add_executable(dynarmic_test_reader test_reader.cpp ) create_target_directory_groups(dynarmic_test_reader) -target_link_libraries(dynarmic_test_reader PRIVATE dynarmic fmt::fmt unordered_dense::unordered_dense) +target_link_libraries(dynarmic_test_reader PRIVATE dynarmic fmt::fmt merry::mcl unordered_dense::unordered_dense) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic_test_reader PRIVATE Boost::variant Boost::icl Boost::pool) else() @@ -123,7 +123,7 @@ target_compile_definitions(dynarmic_test_reader PRIVATE FMT_USE_USER_DEFINED_LIT # create_target_directory_groups(dynarmic_tests) -target_link_libraries(dynarmic_tests PRIVATE dynarmic Catch2::Catch2WithMain fmt::fmt unordered_dense::unordered_dense) +target_link_libraries(dynarmic_tests PRIVATE dynarmic Catch2::Catch2WithMain fmt::fmt merry::mcl unordered_dense::unordered_dense) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic_tests PRIVATE Boost::variant Boost::icl Boost::pool) else() diff --git a/src/dynarmic/tests/print_info.cpp b/src/dynarmic/tests/print_info.cpp index 19e2ca38b2..33d84ba8cd 100644 --- a/src/dynarmic/tests/print_info.cpp +++ b/src/dynarmic/tests/print_info.cpp @@ -18,7 +18,7 @@ #include #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/common/common_types.h" #include "dynarmic/common/llvm_disassemble.h" diff --git a/src/dynarmic/tests/test_generator.cpp b/src/dynarmic/tests/test_generator.cpp index 43203c3e13..33e41099ff 100644 --- a/src/dynarmic/tests/test_generator.cpp +++ b/src/dynarmic/tests/test_generator.cpp @@ -16,7 +16,8 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include +#include #include "dynarmic/common/common_types.h" #include "./A32/testenv.h" diff --git a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp index 9a17bc5582..66c1e7fd24 100644 --- a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp +++ b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp @@ -8,7 +8,7 @@ #include #include -#include "dynarmic/mcl/bit.hpp" +#include #include "dynarmic/tests/unicorn_emu/a32_unicorn.h" #include "dynarmic/common/assert.h" #include "dynarmic/tests/A32/testenv.h" diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index d625617bd5..9355a88c4b 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -800,10 +800,6 @@ Result NPad::DisconnectNpad(u64 aruid, Core::HID::NpadIdType npad_id) { auto& controller = GetControllerFromNpadIdType(aruid, npad_id); auto* shared_memory = controller.shared_memory; - if (!shared_memory) { - LOG_WARNING(Service_HID, "DisconnectNpad: shared_memory is null for npad_id={}", npad_id); - return ResultSuccess; - } // Don't reset shared_memory->assignment_mode this value is persistent shared_memory->style_tag.raw = Core::HID::NpadStyleSet::None; // Zero out shared_memory->device_type.raw = 0; diff --git a/src/ios/AppUIObjC.h b/src/ios/AppUIObjC.h index 942cd111a7..921f333199 100644 --- a/src/ios/AppUIObjC.h +++ b/src/ios/AppUIObjC.h @@ -5,7 +5,6 @@ #import #import -#import #import "AppUIGameInformation.h"