aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.patch/mcl/0001-assert-macro.patch55
-rw-r--r--CMakeLists.txt1
-rw-r--r--docs/Deps.md1
-rw-r--r--externals/CMakeLists.txt3
-rw-r--r--externals/cpmfile.json12
-rw-r--r--src/dynarmic/CMakeLists.txt12
-rw-r--r--src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake5
-rw-r--r--src/dynarmic/src/dynarmic/CMakeLists.txt8
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp17
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp19
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/abi.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/abi.h7
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h4
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_a32.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp25
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp24
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_saturation.cpp6
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/fastmem.h18
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp11
-rw-r--r--src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h2
-rw-r--r--src/dynarmic/src/dynarmic/backend/exception_handler.h3
-rw-r--r--src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c2
-rw-r--r--src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h8
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp17
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/a32_jitstate.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/code_block.h4
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.cpp10
-rw-r--r--src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h4
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp18
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp19
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/block_of_code.h2
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/constants.h4
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/devirtualize.h4
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64.h2
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp9
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc3
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp6
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp12
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/perf_map.cpp9
-rw-r--r--src/dynarmic/src/dynarmic/common/cast_util.h5
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/fpcr.h4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/fpsr.h4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/fused.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/info.h4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/mantissa_util.h5
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/op/FPConvert.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/op/FPRecipExponent.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/op/FPRoundInt.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/process_nan.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/unpacked.cpp6
-rw-r--r--src/dynarmic/src/dynarmic/common/fp/unpacked.h4
-rw-r--r--src/dynarmic/src/dynarmic/common/safe_ops.h4
-rw-r--r--src/dynarmic/src/dynarmic/common/u128.h5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/FPSCR.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/ITState.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/PSR.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_branch.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/a32_translate_impl.h3
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_load_store_structures.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_misc.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_one_reg_modified_immediate.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_three_regs.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_misc.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_scalar.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/asimd_two_regs_shift.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/load_store.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/status_register_access.cpp2
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb16.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_dual.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/impl/thumb32_load_store_multiple.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp3
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/a64_location_descriptor.h4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h2
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_copy.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_modified_immediate.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_shift_by_immediate.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_scalar_three_same.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/A64/translate/impl/simd_shift_by_immediate.cpp5
-rw-r--r--src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h23
-rw-r--r--src/dynarmic/src/dynarmic/frontend/imm.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/frontend/imm.h5
-rw-r--r--src/dynarmic/src/dynarmic/ir/basic_block.h2
-rw-r--r--src/dynarmic/src/dynarmic/ir/ir_emitter.h2
-rw-r--r--src/dynarmic/src/dynarmic/ir/microinstruction.h2
-rw-r--r--src/dynarmic/src/dynarmic/ir/opt_passes.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/ir/value.cpp4
-rw-r--r--src/dynarmic/src/dynarmic/mcl/bit.hpp311
-rw-r--r--src/dynarmic/src/dynarmic/mcl/function_info.hpp73
-rw-r--r--src/dynarmic/src/dynarmic/mcl/integer_of_size.hpp49
-rw-r--r--src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp408
-rw-r--r--src/dynarmic/src/dynarmic/mcl/is_instance_of_template.hpp35
-rw-r--r--src/dynarmic/tests/A32/fuzz_arm.cpp126
-rw-r--r--src/dynarmic/tests/A32/fuzz_thumb.cpp2
-rw-r--r--src/dynarmic/tests/A64/fuzz_with_unicorn.cpp153
-rw-r--r--src/dynarmic/tests/CMakeLists.txt8
-rw-r--r--src/dynarmic/tests/print_info.cpp2
-rw-r--r--src/dynarmic/tests/test_generator.cpp3
-rw-r--r--src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp2
120 files changed, 1293 insertions, 548 deletions
diff --git a/.patch/mcl/0001-assert-macro.patch b/.patch/mcl/0001-assert-macro.patch
deleted file mode 100644
index 2d7d0dd1b0..0000000000
--- a/.patch/mcl/0001-assert-macro.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-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<typename... Ts>
-
- } // 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<typename... Ts>
- } \
- } \
- }()
-+#endif
-
-+#ifndef ASSERT_MSG
- #define ASSERT_MSG(expr, ...) \
- [&] { \
- if (std::is_constant_evaluated()) { \
-@@ -50,13 +55,24 @@ template<typename... Ts>
- } \
- } \
- }()
-+#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 f2edd31d04..42717c496d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -526,7 +526,6 @@ 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 fe1f7a14b2..a34e838534 100644
--- a/docs/Deps.md
+++ b/docs/Deps.md
@@ -76,7 +76,6 @@ 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 1ab537f44d..00bdf10a4f 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -76,9 +76,6 @@ 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 d67348cd68..f849426a4d 100644
--- a/externals/cpmfile.json
+++ b/externals/cpmfile.json
@@ -208,18 +208,6 @@
"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/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt
index e0d1f942f0..dd1def5273 100644
--- a/src/dynarmic/CMakeLists.txt
+++ b/src/dynarmic/CMakeLists.txt
@@ -78,7 +78,9 @@ 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)
+ /DNOMINMAX
+ /GR-
+ )
if (CXX_CLANG)
list(APPEND DYNARMIC_CXX_FLAGS
@@ -91,8 +93,10 @@ else()
-Wextra
-Wcast-qual
-pedantic
- -Wno-missing-braces)
-
+ -Wno-missing-braces
+ -fno-rtti
+ #-fno-exceptions
+ )
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&
@@ -102,7 +106,6 @@ 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.
@@ -117,7 +120,6 @@ 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 82b3078a11..82c6c3bae0 100644
--- a/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake
+++ b/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake
@@ -1,3 +1,6 @@
+# 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}" "#include <mcl/macro/architecture.hpp>\n#if defined(MCL_ARCHITECTURE_${arch})\n${f_contents}\n#endif\n")
+file(WRITE "${output_file}" "#if defined(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 2f05d8a34b..f79d18c15a 100644
--- a/src/dynarmic/src/dynarmic/CMakeLists.txt
+++ b/src/dynarmic/src/dynarmic/CMakeLists.txt
@@ -3,6 +3,12 @@
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
@@ -353,7 +359,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 merry::mcl)
+target_link_libraries(dynarmic PUBLIC fmt::fmt)
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 91adc5783b..d16a34275b 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,7 +11,6 @@
#include <boost/icl/interval_set.hpp>
#include "dynarmic/common/assert.h"
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/arm64/a32_address_space.h"
@@ -36,14 +35,9 @@ struct Jit::Impl final {
PerformRequestedCacheInvalidation(static_cast<HaltReason>(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;
}
@@ -52,14 +46,9 @@ struct Jit::Impl final {
PerformRequestedCacheInvalidation(static_cast<HaltReason>(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 67390a311d..0ce51d0e17 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 10324394a5..b230f455c5 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,7 +11,6 @@
#include <boost/icl/interval_set.hpp>
#include "dynarmic/common/assert.h"
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/arm64/a64_address_space.h"
@@ -34,32 +33,20 @@ struct Jit::Impl final {
HaltReason Run() {
ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(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<HaltReason>(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 04d8ca2eaf..acff6a89f0 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <vector>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
#include <oaknut/oaknut.hpp>
diff --git a/src/dynarmic/src/dynarmic/backend/arm64/abi.h b/src/dynarmic/src/dynarmic/backend/arm64/abi.h
index f2b6b1dca1..b2e29d49e0 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -12,7 +12,6 @@
#include <stdexcept>
#include <type_traits>
-#include <mcl/mp/metavalue/lift_value.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/common/assert.h"
#include <oaknut/oaknut.hpp>
@@ -37,7 +36,7 @@ constexpr auto Rscratch0() {
} else if constexpr (bitsize == 64) {
return Xscratch0;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<bitsize>>);
+ return Xscratch0; //UNREACHABLE();
}
}
@@ -48,7 +47,7 @@ constexpr auto Rscratch1() {
} else if constexpr (bitsize == 64) {
return Xscratch1;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<bitsize>>);
+ return Xscratch1; //UNREACHABLE();
}
}
diff --git a/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h b/src/dynarmic/src/dynarmic/backend/arm64/devirtualize.h
index 60ce823066..737a6572e3 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <bit>
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/function_info.hpp>
+#include "dynarmic/mcl/function_info.hpp"
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 a65efb3c59..213403b4ba 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include <oaknut/oaknut.hpp>
#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 a8c3aa02bf..c773d5a339 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -6,7 +6,6 @@
* SPDX-License-Identifier: 0BSD
*/
-#include <mcl/mp/metavalue/lift_value.hpp>
#include <oaknut/oaknut.hpp>
#include "dynarmic/backend/arm64/a32_jitstate.h"
@@ -46,7 +45,7 @@ static void EmitTwoOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, IR:
} else if constexpr (size == 64) {
emit(Qresult->D2(), Qoperand->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -69,7 +68,7 @@ static void EmitTwoOpArrangedWiden(oaknut::CodeGenerator& code, EmitContext& ctx
} else if constexpr (size == 32) {
emit(Qresult->D2(), Qoperand->toD().S2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -84,7 +83,7 @@ static void EmitTwoOpArrangedNarrow(oaknut::CodeGenerator& code, EmitContext& ct
} else if constexpr (size == 64) {
emit(Qresult->toD().S2(), Qoperand->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -107,7 +106,7 @@ static void EmitTwoOpArrangedPairWiden(oaknut::CodeGenerator& code, EmitContext&
} else if constexpr (size == 32) {
emit(Qresult->D2(), Qoperand->S4());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -122,7 +121,7 @@ static void EmitTwoOpArrangedLower(oaknut::CodeGenerator& code, EmitContext& ctx
} else if constexpr (size == 32) {
emit(Qresult->toD().S2(), Qoperand->toD().S2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -150,7 +149,7 @@ static void EmitThreeOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, I
} else if constexpr (size == 64) {
emit(Qresult->D2(), Qa->D2(), Qb->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -175,7 +174,7 @@ static void EmitThreeOpArrangedWiden(oaknut::CodeGenerator& code, EmitContext& c
} else if constexpr (size == 64) {
emit(Qresult->Q1(), Qa->toD().D1(), Qb->toD().D1());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -198,7 +197,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 {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -220,7 +219,7 @@ static void EmitSaturatedAccumulate(oaknut::CodeGenerator&, EmitContext& ctx, IR
} else if constexpr (size == 64) {
emit(Qaccumulator->D2(), Qoperand->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
}
@@ -241,7 +240,7 @@ static void EmitImmShift(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* ins
} else if constexpr (size == 64) {
emit(Qresult->D2(), Qoperand->D2(), shift_amount);
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
}
@@ -269,7 +268,7 @@ static void EmitReduce(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst,
} else if constexpr (size == 64) {
emit(Vresult, Qoperand->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
}
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 431d51c081..557d6284ed 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,14 +7,8 @@
*/
#include <bit>
-#include <mcl/mp/metavalue/lift_value.hpp>
-#include <mcl/mp/typelist/cartesian_product.hpp>
-#include <mcl/mp/typelist/get.hpp>
-#include <mcl/mp/typelist/lift_sequence.hpp>
-#include <mcl/mp/typelist/list.hpp>
-#include <mcl/mp/typelist/lower_to_tuple.hpp>
-#include <mcl/type_traits/function_info.hpp>
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/function_info.hpp"
+#include "dynarmic/mcl/integer_of_size.hpp"
#include <oaknut/oaknut.hpp>
#include "dynarmic/backend/arm64/a32_jitstate.h"
@@ -38,8 +32,6 @@
namespace Dynarmic::Backend::Arm64 {
using namespace oaknut::util;
-namespace mp = mcl::mp;
-
using A64FullVectorWidth = std::integral_constant<size_t, 128>;
// Array alias that always sizes itself according to the given type T
@@ -83,7 +75,7 @@ static void EmitTwoOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, IR:
} else if constexpr (size == 64) {
emit(Qresult->D2(), Qa->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -111,7 +103,7 @@ static void EmitThreeOpArranged(oaknut::CodeGenerator& code, EmitContext& ctx, I
} else if constexpr (size == 64) {
emit(Qresult->D2(), Qa->D2(), Qb->D2());
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -134,7 +126,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 {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -156,7 +148,7 @@ static void EmitFromFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Ins
} else if constexpr (size == 64) {
emit(Qto->D2(), Qfrom->D2(), fbits);
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
});
}
@@ -178,7 +170,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst)
} else if constexpr (fsize == 64) {
return Qto->D2();
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<fsize>>);
+ UNREACHABLE();
}
}();
auto Vfrom = [&] {
@@ -187,7 +179,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst)
} else if constexpr (fsize == 64) {
return Qfrom->D2();
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<fsize>>);
+ UNREACHABLE();
}
}();
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 722a09176b..d63c1d92d0 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,9 +1,11 @@
+// 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 <mcl/mp/metavalue/lift_value.hpp>
#include <oaknut/oaknut.hpp>
#include "dynarmic/backend/arm64/a32_jitstate.h"
@@ -39,7 +41,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 {
- static_assert(Common::always_false_v<mcl::mp::lift_value<size>>);
+ UNREACHABLE();
}
}
diff --git a/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h b/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h
index cae05bcf23..953fc3783e 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,11 +10,10 @@
#include <cstddef>
#include <tuple>
-
-#include <mcl/hash/xmrx.hpp>
-#include "dynarmic/common/common_types.h"
#include <ankerl/unordered_dense.h>
+#include "dynarmic/mcl/bit.hpp"
+#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/exception_handler.h"
#include "dynarmic/ir/location_descriptor.h"
@@ -22,9 +21,16 @@ namespace Dynarmic::Backend::Arm64 {
using DoNotFastmemMarker = std::tuple<IR::LocationDescriptor, unsigned>;
+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 {
- size_t operator()(const DoNotFastmemMarker& value) const {
- return mcl::hash::xmrx(std::get<0>(value).Value() ^ static_cast<u64>(std::get<1>(value)));
+ [[nodiscard]] constexpr size_t operator()(const DoNotFastmemMarker& value) const noexcept {
+ return xmrx(std::get<0>(value).Value() ^ u64(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 e98a2f6e71..47d83f2362 100644
--- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp
+++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp
@@ -13,9 +13,8 @@
#include <iterator>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include <bit>
-#include <mcl/mp/metavalue/lift_value.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/arm64/abi.h"
@@ -299,7 +298,7 @@ int RegAlloc::GenerateImmediate(const IR::Value& value) {
return 0;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<kind>>);
+ UNREACHABLE();
}
}
@@ -366,7 +365,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 {
- static_assert(Common::always_false_v<mcl::mp::lift_value<required_kind>>);
+ UNREACHABLE();
}
}
@@ -390,7 +389,7 @@ int RegAlloc::RealizeWriteImpl(const IR::Inst* value) {
flags.SetupLocation(value);
return 0;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<kind>>);
+ UNREACHABLE();
}
}
@@ -410,7 +409,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 {
- static_assert(Common::always_false_v<mcl::mp::lift_value<kind>>);
+ UNREACHABLE();
}
}
diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h
index 87446a240b..22ab5af662 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 <mcl/type_traits/is_instance_of_template.hpp>
+#include "dynarmic/mcl/is_instance_of_template.hpp"
#include <oaknut/oaknut.hpp>
#include <ankerl/unordered_dense.h>
diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler.h b/src/dynarmic/src/dynarmic/backend/exception_handler.h
index cd274b111f..ff116c5775 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -12,7 +12,6 @@
#include <memory>
#include <optional>
-#include <mcl/macro/architecture.hpp>
#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 622f86816f..be44207f0a 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -16,11 +16,10 @@
#include <optional>
#include <thread>
#include <vector>
+#include <bit>
#include <fmt/format.h>
#include "dynarmic/common/assert.h"
-#include <bit>
-#include <mcl/macro/architecture.hpp>
#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 25678ab115..ebbe5a079f 100644
--- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c
+++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c
@@ -3,8 +3,6 @@
* SPDX-License-Identifier: 0BSD
*/
-#include <mcl/macro/architecture.hpp>
-
#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 58a3325e17..8b52437930 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -6,8 +6,6 @@
* SPDX-License-Identifier: 0BSD
*/
-#include <mcl/macro/architecture.hpp>
-
#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 05f43774b6..edb24761f6 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<sptr>() - GetMemPtr<sptr>());
+ return conf.code_cache_size - (GetCursorPtr<std::intptr_t>() - GetMemPtr<std::intptr_t>());
}
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 24148b192c..e882a9e2e6 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<typename T>
T GetMemPtr() {
- static_assert(std::is_pointer_v<T> || std::is_same_v<T, uptr> || std::is_same_v<T, sptr>);
+ static_assert(std::is_pointer_v<T> || std::is_same_v<T, std::uintptr_t> || std::is_same_v<T, std::intptr_t>);
return reinterpret_cast<T>(as.GetBufferPointer(0));
}
template<typename T>
T GetMemPtr() const {
- static_assert(std::is_pointer_v<T> || std::is_same_v<T, uptr> || std::is_same_v<T, sptr>);
+ static_assert(std::is_pointer_v<T> || std::is_same_v<T, std::uintptr_t> || std::is_same_v<T, std::intptr_t>);
return reinterpret_cast<const T>(as.GetBufferPointer(0));
}
template<typename T>
T GetCursorPtr() {
- static_assert(std::is_pointer_v<T> || std::is_same_v<T, uptr> || std::is_same_v<T, sptr>);
+ static_assert(std::is_pointer_v<T> || std::is_same_v<T, std::uintptr_t> || std::is_same_v<T, std::intptr_t>);
return reinterpret_cast<T>(as.GetCursorPointer());
}
template<typename T>
T GetCursorPtr() const {
- static_assert(std::is_pointer_v<T> || std::is_same_v<T, uptr> || std::is_same_v<T, sptr>);
+ static_assert(std::is_pointer_v<T> || std::is_same_v<T, std::uintptr_t> || std::is_same_v<T, std::intptr_t>);
return reinterpret_cast<const T>(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 c0f65a49ed..3f395bfafb 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,7 +11,6 @@
#include <boost/icl/interval_set.hpp>
#include "dynarmic/common/assert.h"
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/riscv64/a32_address_space.h"
@@ -34,28 +33,18 @@ 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 87eeab6b0f..70cd6bf0f1 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 7d53486a48..02bfa44eec 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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<typename T>
T ptr() const noexcept {
- static_assert(std::is_pointer_v<T> || std::is_same_v<T, uptr> || std::is_same_v<T, sptr>);
+ static_assert(std::is_pointer_v<T> || std::is_same_v<T, std::uintptr_t> || std::is_same_v<T, std::intptr_t>);
return reinterpret_cast<T>(mem);
}
diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64.cpp
index 50cbaf9526..5ce7dee1e1 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 <biscuit/assembler.hpp>
#include <fmt/ostream.h>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 49489c40a4..4ab5d43db8 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -12,7 +12,6 @@
#include <array>
#include "dynarmic/common/assert.h"
-#include <mcl/mp/metavalue/lift_value.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/common/always_false.h"
@@ -164,9 +163,8 @@ u32 RegAlloc::GenerateImmediate(const IR::Value& value) {
} else if constexpr (kind == HostLoc::Kind::Fpr) {
UNIMPLEMENTED();
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<kind>>);
+ UNREACHABLE();
}
-
return 0;
}
@@ -225,7 +223,7 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) {
fprs[new_location_index].realized = true;
return new_location_index;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<required_kind>>);
+ UNREACHABLE();
}
}
@@ -252,7 +250,7 @@ u32 RegAlloc::RealizeWriteImpl(const IR::Inst* value) {
setup_location(fprs[new_location_index]);
return new_location_index;
} else {
- static_assert(Common::always_false_v<mcl::mp::lift_value<required_kind>>);
+ UNREACHABLE();
}
}
diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/riscv64/reg_alloc.h
index e8fd471ae1..be826e63f6 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -18,7 +18,7 @@
#include <biscuit/registers.hpp>
#include "dynarmic/common/assert.h"
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/is_instance_of_template.hpp>
+#include "dynarmic/mcl/is_instance_of_template.hpp"
#include <ankerl/unordered_dense.h>
#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 f037919eb0..80f0f9cc2f 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp
@@ -15,8 +15,7 @@
#include <fmt/format.h>
#include <fmt/ostream.h>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/scope_exit.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
#include <boost/container/static_vector.hpp>
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 a6b99b545f..f138b5f137 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 <fmt/format.h>
#include <fmt/ostream.h>
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/integer_of_size.hpp"
#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 e540839fd5..b48dcf9046 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp
@@ -14,7 +14,6 @@
#include <fmt/format.h>
#include "dynarmic/common/assert.h"
#include <bit>
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/common/llvm_disassemble.h"
@@ -77,12 +76,7 @@ struct Jit::Impl {
HaltReason Run() {
ASSERT(!jit_interface->is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(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;
@@ -93,27 +87,19 @@ 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<HaltReason>(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 ed5a8f9454..066b931350 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 ff82d8b05c..832cfdcce2 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
@@ -11,9 +11,8 @@
#include <fmt/format.h>
#include <fmt/ostream.h>
#include "dynarmic/common/assert.h"
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/integer_of_size.hpp"
#include <boost/container/static_vector.hpp>
#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 6b3d4d86a5..4b7054b4b2 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 <fmt/format.h>
#include <fmt/ostream.h>
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/integer_of_size.hpp"
#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 44c63bdfc5..96440d273e 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp
@@ -15,7 +15,6 @@
#include "dynarmic/common/fp/fpcr.h"
#include "dynarmic/common/llvm_disassemble.h"
#include <bit>
-#include <mcl/scope_exit.hpp>
#include "dynarmic/backend/x64/a64_emit_x64.h"
#include "dynarmic/backend/x64/a64_jitstate.h"
@@ -75,14 +74,8 @@ public:
HaltReason Run() {
ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(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;
@@ -92,27 +85,19 @@ 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<HaltReason>(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 9f983f3955..3f04ed63f0 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.cpp
@@ -1,3 +1,6 @@
+// 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
@@ -5,7 +8,7 @@
#include "dynarmic/backend/x64/a64_jitstate.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 28c821ab59..3a161fca6b 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 <cstring>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 5ccab7a3ed..f6c12edaaa 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 <memory>
#include <type_traits>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 65c5a09a53..a0ae9f3c1e 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <optional>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 6f22646157..422d21169f 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -13,7 +13,7 @@
#include <bit>
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/function_info.hpp>
+#include "dynarmic/mcl/function_info.hpp"
#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 2b0540e4a7..4e515fef2f 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp
@@ -12,8 +12,7 @@
#include "dynarmic/common/assert.h"
#include <boost/variant/detail/apply_visitor_binary.hpp>
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/scope_exit.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
#include <ankerl/unordered_dense.h>
diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h
index 5de5f2dc7a..301f4ffc89 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 <type_traits>
#include <vector>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include <ankerl/unordered_dense.h>
#include "dynarmic/backend/x64/xbyak.h"
#include <boost/container/small_vector.hpp>
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 abe04b53ff..d073991fbe 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,14 +11,8 @@
#include <utility>
#include "dynarmic/common/assert.h"
-#include <mcl/mp/metavalue/lift_value.hpp>
-#include <mcl/mp/typelist/cartesian_product.hpp>
-#include <mcl/mp/typelist/get.hpp>
-#include <mcl/mp/typelist/lift_sequence.hpp>
-#include <mcl/mp/typelist/list.hpp>
-#include <mcl/mp/typelist/lower_to_tuple.hpp>
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/integer_of_size.hpp"
#include "dynarmic/backend/x64/xbyak.h"
#include "dynarmic/backend/x64/abi.h"
@@ -41,7 +35,6 @@
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 aaed8b43f2..54fc595214 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,7 +3,8 @@
* SPDX-License-Identifier: 0BSD
*/
-#include <mcl/macro/concatenate_tokens.hpp>
+#define CONCATENATE_TOKENS(x, y) CONCATENATE_TOKENS_IMPL(x, y)
+#define CONCATENATE_TOKENS_IMPL(x, y) x##y
#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 85ee3584eb..63827979df 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 <limits>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/integer_of_size.hpp"
#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 1f96939d88..d94f0329f8 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp
+++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp
@@ -13,11 +13,9 @@
#include <type_traits>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
-#include <mcl/type_traits/function_info.hpp>
+#include "dynarmic/mcl/function_info.hpp"
#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 ee9ec39f46..70edfbd0bc 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,14 +13,8 @@
#include <utility>
#include "dynarmic/common/assert.h"
-#include <mcl/mp/metavalue/lift_value.hpp>
-#include <mcl/mp/typelist/cartesian_product.hpp>
-#include <mcl/mp/typelist/get.hpp>
-#include <mcl/mp/typelist/lift_sequence.hpp>
-#include <mcl/mp/typelist/list.hpp>
-#include <mcl/mp/typelist/lower_to_tuple.hpp>
-#include <mcl/type_traits/function_info.hpp>
-#include <mcl/type_traits/integer_of_size.hpp>
+#include "dynarmic/mcl/function_info.hpp"
+#include "dynarmic/mcl/integer_of_size.hpp"
#include "dynarmic/backend/x64/xbyak.h"
#include "dynarmic/backend/x64/abi.h"
@@ -41,7 +35,6 @@
namespace Dynarmic::Backend::X64 {
using namespace Xbyak::util;
-namespace mp = mcl::mp;
namespace {
@@ -2000,6 +1993,7 @@ void EmitX64::EmitFPVectorToHalf32(EmitContext& ctx, IR::Inst* inst) {
}
}
+
// Assembly thunk; just remember not to specialise too much otherwise i-cache death!
// template<typename FPT, size_t fbits, FP::RoundingMode rounding_mode>
// static void EmitFPVectorToFixedThunk(VectorArray<FPT>& output, const VectorArray<FPT>& 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 a0b5c4fdde..095d6194f6 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -6,17 +6,16 @@
* SPDX-License-Identifier: 0BSD
*/
-#include "dynarmic/backend/x64/perf_map.h"
-
#include <cstddef>
#include <string>
+#include <fmt/format.h>
+#include "dynarmic/backend/x64/perf_map.h"
+#include "dynarmic/common/common_types.h"
#if defined(__linux__) && !defined(__ANDROID__)
# include <cstdio>
# include <cstdlib>
# include <mutex>
-# include <fmt/format.h>
-# include <mcl/stdint.hpp>
# include <sys/types.h>
# include <unistd.h>
diff --git a/src/dynarmic/src/dynarmic/common/cast_util.h b/src/dynarmic/src/dynarmic/common/cast_util.h
index 92c9a259b3..aed9067977 100644
--- a/src/dynarmic/src/dynarmic/common/cast_util.h
+++ b/src/dynarmic/src/dynarmic/common/cast_util.h
@@ -1,3 +1,6 @@
+// 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
@@ -5,7 +8,7 @@
#pragma once
-#include <mcl/type_traits/function_info.hpp>
+#include "dynarmic/mcl/function_info.hpp"
namespace Dynarmic::Common {
diff --git a/src/dynarmic/src/dynarmic/common/fp/fpcr.h b/src/dynarmic/src/dynarmic/common/fp/fpcr.h
index be963a2099..948917bc35 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,7 +11,7 @@
#include <optional>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 9308132879..caa5cb92c7 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 5c32b05eb4..a965575a5a 100644
--- a/src/dynarmic/src/dynarmic/common/fp/fused.cpp
+++ b/src/dynarmic/src/dynarmic/common/fp/fused.cpp
@@ -1,3 +1,6 @@
+// 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
@@ -5,7 +8,7 @@
#include "dynarmic/common/fp/fused.h"
-#include <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 3969843f0f..eebca0fc0c 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 3999f97c27..43bb5fe604 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -8,8 +8,7 @@
#pragma once
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 906aa781a1..82803f715d 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -8,8 +8,7 @@
#include "dynarmic/common/fp/op/FPConvert.h"
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 e932e02803..332870eb8a 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 198a71c807..4bcfcd7c8a 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 8e3474952a..2f37797b70 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,8 +10,7 @@
#include <fmt/format.h>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 ff1b09f4ba..7f47852d98 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,7 +11,7 @@
#include <optional>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 f853ab07e1..d6bb615cb4 100644
--- a/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp
+++ b/src/dynarmic/src/dynarmic/common/fp/unpacked.cpp
@@ -1,3 +1,6 @@
+// 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
@@ -7,8 +10,7 @@
#include <algorithm>
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 49dca74304..effc604fb0 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <tuple>
-#include <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 f494bdb24b..5cc8cb5049 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <type_traits>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 9ab4aa0bd5..363c8dfec4 100644
--- a/src/dynarmic/src/dynarmic/common/u128.h
+++ b/src/dynarmic/src/dynarmic/common/u128.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,8 +11,7 @@
#include <tuple>
#include <type_traits>
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 7a4c738e9e..7e0532ee93 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -10,7 +10,7 @@
#include <optional>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 eeddaeb6b5..baabc1ca15 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 328fdb17c0..16ca86aeac 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 a47ce0b78b..704179ecfb 100644
--- a/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/A32/a32_types.cpp
@@ -1,3 +1,6 @@
+// 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 +11,7 @@
#include <array>
#include <ostream>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
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 c6f034ae21..bbf128d797 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -15,7 +15,7 @@
#include <optional>
#include <vector>
-#include <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 6bf52b87e6..a16caedd87 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -15,7 +15,7 @@
#include <vector>
#include <iterator>
-#include <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 8c55588a28..82d25f1337 100644
--- a/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/conditional_state.cpp
@@ -32,8 +32,7 @@ bool CondCanContinue(const ConditionalState cond_state, const A32::IREmitter& ir
}
bool IsConditionPassed(TranslatorVisitor& v, IR::Cond cond) {
- ASSERT_MSG(v.cond_state != ConditionalState::Break,
- "This should never happen. We requested a break but that wasn't honored.");
+ ASSERT(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 d87cfcfe82..63b40b8c31 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,9 +1,12 @@
+// 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 a03b2e666b..a8888c355f 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,8 +9,7 @@
#pragma once
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bit/rotate.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 68c0d983af..8d0f78396a 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -9,7 +9,7 @@
#include <optional>
#include <tuple>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 9d73e7d4ae..9aa50c6b8c 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -9,8 +9,7 @@
#include <vector>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 459cbfea06..c5bdb1b551 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 da8f43f2fb..8d5e694bca 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,9 +1,12 @@
+// 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 ddae1f420b..45455aa444 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,3 +1,6 @@
+// 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
@@ -5,7 +8,7 @@
#include <array>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 4d6855f1ed..d9cc3b1e64 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -9,7 +9,7 @@
#include <utility>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 27e94628a8..e5a4eb537f 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -7,8 +7,7 @@
*/
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 49c5d65b3a..d7c667aecf 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,8 +6,7 @@
* SPDX-License-Identifier: 0BSD
*/
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 ef54b66827..bb33c3c47c 100644
--- a/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/impl/misc.cpp
@@ -1,9 +1,12 @@
+// 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 <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 8dfc64d6d7..7a0640598c 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 926c499222..a8c75e22b9 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 090e98d1aa..7ea31d40ee 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 eb574d773c..e76666ecc2 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,9 +1,12 @@
+// 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 d446fbf3dd..b68a2cb7c5 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,9 +1,12 @@
+// 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 e0333e487d..309dd080f9 100644
--- a/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp
@@ -9,8 +9,7 @@
#include <tuple>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bit/swap.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 4bfc5f890e..a8be0232ca 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -13,7 +13,7 @@
#include <tuple>
#include <fmt/format.h>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 68422ed40d..4ac04731ea 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 <string>
#include <vector>
-#include <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 de63f560bc..f3ecd7c604 100644
--- a/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/impl/impl.cpp
@@ -8,9 +8,7 @@
#include "dynarmic/frontend/A64/translate/impl/impl.h"
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bit/rotate.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 b33bc8f5ad..9354b54fa5 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,9 +1,12 @@
+// 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 db8e83631a..2afece1c46 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,9 +1,12 @@
+// 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 5d60cb31c3..332eb35ebe 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,9 +1,12 @@
+// 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 d551605bda..ad5b89df3a 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,3 +1,6 @@
+// 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
@@ -5,7 +8,7 @@
#include <optional>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 559721a22a..33debd1062 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,9 +1,12 @@
+// 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 <mcl/bit/bit_count.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 0d9da6169c..3ab360c287 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 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -13,8 +13,8 @@
#include <tuple>
#include "dynarmic/common/assert.h"
-#include <mcl/bitsizeof.hpp>
-#include <mcl/type_traits/function_info.hpp>
+#include "dynarmic/mcl/bit.hpp"
+#include "dynarmic/mcl/function_info.hpp"
namespace Dynarmic::Decoder {
namespace detail {
@@ -75,11 +75,11 @@ struct detail {
/// An argument is specified by a continuous string of the same character.
template<size_t N>
static consteval auto GetArgInfo(std::array<char, opcode_bitsize> bitstring) {
+ //static_assert(N > 0, "unexpected field");
std::array<opcode_type, N> masks = {};
std::array<size_t, N> 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,17 +93,10 @@ struct detail {
ch = bitstring[i];
arg_index++;
}
-
- 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<opcode_type>(1) << bit_position;
- shifts[arg_index] = bit_position;
- } else {
- throw std::out_of_range("Unexpected field");
- }
+ 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 !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 95e24206d7..aeb7b5d3f6 100644
--- a/src/dynarmic/src/dynarmic/frontend/imm.cpp
+++ b/src/dynarmic/src/dynarmic/frontend/imm.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 4e277ede3b..3a6c10316a 100644
--- a/src/dynarmic/src/dynarmic/frontend/imm.h
+++ b/src/dynarmic/src/dynarmic/frontend/imm.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project.
@@ -11,8 +11,7 @@
#include <type_traits>
#include "dynarmic/common/assert.h"
-#include <mcl/bit/bit_field.hpp>
-#include <mcl/bitsizeof.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 4044005bd0..bbf1319957 100644
--- a/src/dynarmic/src/dynarmic/ir/basic_block.h
+++ b/src/dynarmic/src/dynarmic/ir/basic_block.h
@@ -16,7 +16,7 @@
#include <boost/container/container_fwd.hpp>
#include <boost/container/static_vector.hpp>
#include <boost/container/stable_vector.hpp>
-#include <mcl/container/intrusive_list.hpp>
+#include "dynarmic/mcl/intrusive_list.hpp"
#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 2b5c7d5cdd..37f7c18065 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 <mcl/bit_cast.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 1700eb110b..fb3ac1f49a 100644
--- a/src/dynarmic/src/dynarmic/ir/microinstruction.h
+++ b/src/dynarmic/src/dynarmic/ir/microinstruction.h
@@ -10,7 +10,7 @@
#include <array>
-#include <mcl/container/intrusive_list.hpp>
+#include "dynarmic/mcl/intrusive_list.hpp"
#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 f22e8aaa69..ee29081d4d 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 "mcl/bit/swap.hpp"
-#include "mcl/bit/rotate.hpp"
+#include "dynarmic/mcl/bit.hpp"
+#include "dynarmic/mcl/bit.hpp"
namespace Dynarmic::Optimization {
diff --git a/src/dynarmic/src/dynarmic/ir/value.cpp b/src/dynarmic/src/dynarmic/ir/value.cpp
index 59b17b5a7b..451036b1fd 100644
--- a/src/dynarmic/src/dynarmic/ir/value.cpp
+++ b/src/dynarmic/src/dynarmic/ir/value.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 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 <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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
new file mode 100644
index 0000000000..1ef9880a5f
--- /dev/null
+++ b/src/dynarmic/src/dynarmic/mcl/bit.hpp
@@ -0,0 +1,311 @@
+// 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 <bitset>
+#include <climits>
+#include <cstddef>
+
+#include "dynarmic/common/common_types.h"
+#include "dynarmic/common/assert.h"
+
+namespace mcl {
+namespace detail {
+template<typename T, typename U>
+concept SameHelper = std::is_same_v<T, U>;
+} // namespace detail
+template<typename T, typename U>
+concept SameAs = detail::SameHelper<T, U> && detail::SameHelper<U, T>;
+template<typename T, typename... U>
+concept IsAnyOf = (SameAs<T, U> || ...);
+/// Integral upon which bit operations can be safely performed.
+template<typename T>
+concept BitIntegral = IsAnyOf<T, u8, u16, u32, u64, std::uintptr_t, size_t>;
+
+template<typename T>
+constexpr std::size_t bitsizeof = CHAR_BIT * sizeof(T);
+
+} // namespace mcl
+
+namespace mcl::bit {
+
+constexpr u16 swap_bytes_16(u16 value) {
+ return static_cast<u16>(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<BitIntegral T>
+constexpr T rotate_right(T x, size_t amount) {
+ amount %= bitsizeof<T>;
+ if (amount == 0) {
+ return x;
+ }
+ return static_cast<T>((x >> amount) | (x << (bitsizeof<T> - amount)));
+}
+
+template<BitIntegral T>
+constexpr T rotate_left(T x, size_t amount) {
+ amount %= bitsizeof<T>;
+ if (amount == 0) {
+ return x;
+ }
+ return static_cast<T>((x << amount) | (x >> (bitsizeof<T> - amount)));
+}
+
+/// Create a mask with `count` number of one bits.
+template<size_t count, BitIntegral T>
+constexpr T ones() {
+ static_assert(count <= bitsizeof<T>, "count larger than bitsize of T");
+
+ if constexpr (count == 0) {
+ return 0;
+ } else {
+ return static_cast<T>(~static_cast<T>(0)) >> (bitsizeof<T> - count);
+ }
+}
+
+/// Create a mask with `count` number of one bits.
+template<BitIntegral T>
+constexpr T ones(size_t count) {
+ ASSERT(count <= bitsizeof<T> && "count larger than bitsize of T");
+ if (count == 0) {
+ return 0;
+ }
+ return static_cast<T>(~static_cast<T>(0)) >> (bitsizeof<T> - count);
+}
+
+/// Create a mask of type T for bits [begin_bit, end_bit] inclusive.
+template<size_t begin_bit, size_t end_bit, BitIntegral T>
+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<T>, "begin_bit must be smaller than size of T");
+ static_assert(end_bit < bitsizeof<T>, "end_bit must be smaller than size of T");
+
+ return ones<end_bit - begin_bit + 1, T>() << begin_bit;
+}
+
+/// Create a mask of type T for bits [begin_bit, end_bit] inclusive.
+template<BitIntegral T>
+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<T> && "begin_bit must be smaller than size of T");
+ ASSERT(end_bit < bitsizeof<T> && "end_bit must be smaller than size of T");
+ return ones<T>(end_bit - begin_bit + 1) << begin_bit;
+}
+
+/// Extract bits [begin_bit, end_bit] inclusive from value of type T.
+template<size_t begin_bit, size_t end_bit, BitIntegral T>
+constexpr T get_bits(T value) {
+ constexpr T m = mask<begin_bit, end_bit, T>();
+ return (value & m) >> begin_bit;
+}
+
+/// Extract bits [begin_bit, end_bit] inclusive from value of type T.
+template<BitIntegral T>
+constexpr T get_bits(size_t begin_bit, size_t end_bit, T value) {
+ const T m = mask<T>(begin_bit, end_bit);
+ return (value & m) >> begin_bit;
+}
+
+/// Clears bits [begin_bit, end_bit] inclusive of value of type T.
+template<size_t begin_bit, size_t end_bit, BitIntegral T>
+constexpr T clear_bits(T value) {
+ constexpr T m = mask<begin_bit, end_bit, T>();
+ return value & ~m;
+}
+
+/// Clears bits [begin_bit, end_bit] inclusive of value of type T.
+template<BitIntegral T>
+constexpr T clear_bits(size_t begin_bit, size_t end_bit, T value) {
+ const T m = mask<T>(begin_bit, end_bit);
+ return value & ~m;
+}
+
+/// Modifies bits [begin_bit, end_bit] inclusive of value of type T.
+template<size_t begin_bit, size_t end_bit, BitIntegral T>
+constexpr T set_bits(T value, T new_bits) {
+ constexpr T m = mask<begin_bit, end_bit, T>();
+ return (value & ~m) | ((new_bits << begin_bit) & m);
+}
+
+/// Modifies bits [begin_bit, end_bit] inclusive of value of type T.
+template<BitIntegral T>
+constexpr T set_bits(size_t begin_bit, size_t end_bit, T value, T new_bits) {
+ const T m = mask<T>(begin_bit, end_bit);
+ return (value & ~m) | ((new_bits << begin_bit) & m);
+}
+
+/// Extract bit at bit_position from value of type T.
+template<size_t bit_position, BitIntegral T>
+constexpr bool get_bit(T value) {
+ constexpr T m = mask<bit_position, bit_position, T>();
+ return (value & m) != 0;
+}
+
+/// Extract bit at bit_position from value of type T.
+template<BitIntegral T>
+constexpr bool get_bit(size_t bit_position, T value) {
+ const T m = mask<T>(bit_position, bit_position);
+ return (value & m) != 0;
+}
+
+/// Clears bit at bit_position of value of type T.
+template<size_t bit_position, BitIntegral T>
+constexpr T clear_bit(T value) {
+ constexpr T m = mask<bit_position, bit_position, T>();
+ return value & ~m;
+}
+
+/// Clears bit at bit_position of value of type T.
+template<BitIntegral T>
+constexpr T clear_bit(size_t bit_position, T value) {
+ const T m = mask<T>(bit_position, bit_position);
+ return value & ~m;
+}
+
+/// Modifies bit at bit_position of value of type T.
+template<size_t bit_position, BitIntegral T>
+constexpr T set_bit(T value, bool new_bit) {
+ constexpr T m = mask<bit_position, bit_position, T>();
+ return (value & ~m) | (new_bit ? m : static_cast<T>(0));
+}
+
+/// Modifies bit at bit_position of value of type T.
+template<BitIntegral T>
+constexpr T set_bit(size_t bit_position, T value, bool new_bit) {
+ const T m = mask<T>(bit_position, bit_position);
+ return (value & ~m) | (new_bit ? m : static_cast<T>(0));
+}
+
+/// Sign-extends a value that has bit_count bits to the full bitwidth of type T.
+template<size_t bit_count, BitIntegral T>
+constexpr T sign_extend(T value) {
+ static_assert(bit_count != 0, "cannot sign-extend zero-sized value");
+
+ using S = std::make_signed_t<T>;
+ constexpr size_t shift_amount = bitsizeof<T> - bit_count;
+ return static_cast<T>(static_cast<S>(value << shift_amount) >> shift_amount);
+}
+
+/// Sign-extends a value that has bit_count bits to the full bitwidth of type T.
+template<BitIntegral T>
+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<T>;
+ const size_t shift_amount = bitsizeof<T> - bit_count;
+ return T(S(value << shift_amount) >> shift_amount);
+}
+
+/// Replicate an element across a value of type T.
+template<size_t element_size, BitIntegral T>
+constexpr T replicate_element(T value) {
+ static_assert(element_size <= bitsizeof<T>, "element_size is too large");
+ static_assert(bitsizeof<T> % element_size == 0, "bitsize of T not divisible by element_size");
+
+ if constexpr (element_size == bitsizeof<T>) {
+ return value;
+ } else {
+ return replicate_element<element_size * 2, T>(static_cast<T>(value | (value << element_size)));
+ }
+}
+
+/// Replicate an element of type U across a value of type T.
+template<BitIntegral U, BitIntegral T>
+constexpr T replicate_element(T value) {
+ static_assert(bitsizeof<U> <= bitsizeof<T>, "element_size is too large");
+
+ return replicate_element<bitsizeof<U>, T>(value);
+}
+
+/// Replicate an element across a value of type T.
+template<BitIntegral T>
+constexpr T replicate_element(size_t element_size, T value) {
+ ASSERT(element_size <= bitsizeof<T> && "element_size is too large");
+ ASSERT(bitsizeof<T> % element_size == 0 && "bitsize of T not divisible by element_size");
+ if (element_size == bitsizeof<T>)
+ return value;
+ return replicate_element<T>(element_size * 2, static_cast<T>(value | (value << element_size)));
+}
+
+template<BitIntegral T>
+constexpr bool most_significant_bit(T value) {
+ return get_bit<bitsizeof<T> - 1, T>(value);
+}
+
+template<BitIntegral T>
+inline size_t count_ones(T x) {
+ return std::bitset<bitsizeof<T>>(x).count();
+}
+
+template<BitIntegral T>
+constexpr size_t count_leading_zeros(T x) {
+ size_t result = bitsizeof<T>;
+ while (x != 0) {
+ x >>= 1;
+ result--;
+ }
+ return result;
+}
+
+template<BitIntegral T>
+constexpr int highest_set_bit(T x) {
+ int result = -1;
+ while (x != 0) {
+ x >>= 1;
+ result++;
+ }
+ return result;
+}
+
+template<BitIntegral T>
+constexpr size_t lowest_set_bit(T x) {
+ if (x == 0) {
+ return bitsizeof<T>;
+ }
+
+ 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
new file mode 100644
index 0000000000..452bd88bfc
--- /dev/null
+++ b/src/dynarmic/src/dynarmic/mcl/function_info.hpp
@@ -0,0 +1,73 @@
+// 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 <cstddef>
+#include <tuple>
+
+namespace mcl {
+
+/// Contains a list of types
+template<class... E>
+struct type_list {};
+
+template<class F>
+struct function_info : function_info<decltype(&F::operator())> {};
+
+template<class R, class... As>
+struct function_info<R(As...)> {
+ using return_type = R;
+ using parameter_list = type_list<As...>;
+ static constexpr std::size_t parameter_count = sizeof...(As);
+
+ using equivalent_function_type = R(As...);
+
+ template<std::size_t I>
+ struct parameter {
+ static_assert(I < parameter_count, "Non-existent parameter");
+ using type = std::tuple_element_t<I, std::tuple<As...>>;
+ };
+};
+
+template<class R, class... As>
+struct function_info<R (*)(As...)> : function_info<R(As...)> {};
+
+template<class C, class R, class... As>
+struct function_info<R (C::*)(As...)> : function_info<R(As...)> {
+ using class_type = C;
+
+ using equivalent_function_type_with_class = R(C*, As...);
+};
+
+template<class C, class R, class... As>
+struct function_info<R (C::*)(As...) const> : function_info<R(As...)> {
+ using class_type = C;
+
+ using equivalent_function_type_with_class = R(C*, As...);
+};
+
+template<class F>
+constexpr size_t parameter_count_v = function_info<F>::parameter_count;
+
+template<class F>
+using parameter_list = typename function_info<F>::parameter_list;
+
+template<class F, std::size_t I>
+using get_parameter = typename function_info<F>::template parameter<I>::type;
+
+template<class F>
+using equivalent_function_type = typename function_info<F>::equivalent_function_type;
+
+template<class F>
+using equivalent_function_type_with_class = typename function_info<F>::equivalent_function_type_with_class;
+
+template<class F>
+using return_type = typename function_info<F>::return_type;
+
+template<class F>
+using class_type = typename function_info<F>::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
new file mode 100644
index 0000000000..8bdecc955d
--- /dev/null
+++ b/src/dynarmic/src/dynarmic/mcl/integer_of_size.hpp
@@ -0,0 +1,49 @@
+// 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<size_t size>
+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<size_t size>
+using unsigned_integer_of_size = typename detail::integer_of_size_impl<size>::unsigned_type;
+
+template<size_t size>
+using signed_integer_of_size = typename detail::integer_of_size_impl<size>::signed_type;
+
+} // namespace mcl
diff --git a/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp b/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp
new file mode 100644
index 0000000000..3b1c1d6699
--- /dev/null
+++ b/src/dynarmic/src/dynarmic/mcl/intrusive_list.hpp
@@ -0,0 +1,408 @@
+// 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 <cstddef>
+#include <iterator>
+#include <memory>
+#include <type_traits>
+#include "dynarmic/common/assert.h"
+
+namespace mcl {
+
+template<typename T>
+class intrusive_list;
+template<typename T>
+class intrusive_list_iterator;
+
+template<typename T>
+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<T>;
+ friend class intrusive_list_iterator<T>;
+ friend class intrusive_list_iterator<const T>;
+};
+
+template<typename T>
+class intrusive_list_sentinel final : public intrusive_list_node<T> {
+ using intrusive_list_node<T>::next;
+ using intrusive_list_node<T>::prev;
+ using intrusive_list_node<T>::is_sentinel_;
+
+public:
+ intrusive_list_sentinel()
+ {
+ next = this;
+ prev = this;
+ is_sentinel_ = true;
+ }
+};
+
+template<typename T>
+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<value_type>", not "intrusive_list_node<const value_type>"
+ using node_type = std::conditional_t<std::is_const<value_type>::value,
+ const intrusive_list_node<std::remove_const_t<value_type>>,
+ intrusive_list_node<value_type>>;
+ 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<reference>(*node);
+ }
+ pointer operator->() const
+ {
+ return std::addressof(operator*());
+ }
+
+ node_pointer AsNodePointer() const
+ {
+ return node;
+ }
+
+private:
+ friend class intrusive_list<T>;
+ node_pointer node = nullptr;
+};
+
+template<typename T>
+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<value_type>;
+ using const_iterator = intrusive_list_iterator<const value_type>;
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = std::reverse_iterator<const_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<size_type>(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<intrusive_list_node<T>> root = std::make_shared<intrusive_list_sentinel<T>>();
+};
+
+/**
+ * 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<typename T>
+void swap(intrusive_list<T>& lhs, intrusive_list<T>& 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
new file mode 100644
index 0000000000..0cb143430d
--- /dev/null
+++ b/src/dynarmic/src/dynarmic/mcl/is_instance_of_template.hpp
@@ -0,0 +1,35 @@
+// 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 <cstddef>
+#include <type_traits>
+
+namespace mcl {
+
+/// A metavalue (of type VT and value v).
+template<class VT, VT v> using value = std::integral_constant<VT, v>;
+/// A metavalue of type size_t (and value v).
+template<size_t v> using size_value = value<size_t, v>;
+/// A metavalue of type bool (and value v). (Aliases to std::bool_constant.)
+template<bool v> using bool_value = value<bool, v>;
+/// true metavalue (Aliases to std::true_type).
+using true_type = bool_value<true>;
+/// false metavalue (Aliases to std::false_type).
+using false_type = bool_value<false>;
+
+/// Is type T an instance of template class C?
+template<template<class...> class, class>
+struct is_instance_of_template : false_type {};
+
+template<template<class...> class C, class... As>
+struct is_instance_of_template<C, C<As...>> : true_type {};
+
+/// Is type T an instance of template class C?
+template<template<class...> class C, class T>
+constexpr bool is_instance_of_template_v = is_instance_of_template<C, T>::value;
+
+} // namespace mcl
diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp
index cd2eade884..e9834a6663 100644
--- a/src/dynarmic/tests/A32/fuzz_arm.cpp
+++ b/src/dynarmic/tests/A32/fuzz_arm.cpp
@@ -15,9 +15,7 @@
#include <vector>
#include <catch2/catch_test_macros.hpp>
-#include <mcl/bit/bit_count.hpp>
-#include <mcl/bit/swap.hpp>
-#include <mcl/scope_exit.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/common/common_types.h"
#include "dynarmic/tests/fuzz_util.h"
@@ -356,67 +354,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<TestEnv, ThumbTestEnv>, 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<A32::Reg>(i), regs[i]);
- }
- for (size_t i = 0; i < vecs.size(); ++i) {
- fmt::print("{:3s}: {:08x}\n", static_cast<A32::ExtReg>(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<size_t>(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<A32::Reg>(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<size_t>(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("x86_64:\n");
- fmt::print("{}", jit.Disassemble());
-
- fmt::print("Interrupts:\n");
- for (const auto& i : uni_env.interrupts) {
- std::puts(i.c_str());
- }
- };
+ // SCOPE_FAIL {
+ // fmt::print("Instruction Listing:\n");
+ // fmt::print("{}\n", Common::DisassembleAArch32(std::is_same_v<TestEnv, ThumbTestEnv>, 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<A32::Reg>(i), regs[i]);
+ // }
+ // for (size_t i = 0; i < vecs.size(); ++i) {
+ // fmt::print("{:3s}: {:08x}\n", static_cast<A32::ExtReg>(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<size_t>(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<A32::Reg>(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<size_t>(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("x86_64:\n");
+ // fmt::print("{}", jit.Disassemble());
+
+ // 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 f985e6f93d..7fef968b95 100644
--- a/src/dynarmic/tests/A32/fuzz_thumb.cpp
+++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp
@@ -16,7 +16,7 @@
#include <tuple>
#include <catch2/catch_test_macros.hpp>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 0c7a30a868..749cc77126 100644
--- a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp
+++ b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp
@@ -12,7 +12,6 @@
#include <vector>
#include <catch2/catch_test_macros.hpp>
-#include <mcl/scope_exit.hpp>
#include "dynarmic/common/common_types.h"
#include "dynarmic/tests/fuzz_util.h"
@@ -205,82 +204,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");
-
- fmt::print("Initial register listing:\n");
- for (size_t i = 0; i < regs.size(); ++i) {
- fmt::print("{:3s}: {:016x}\n", A64::RegToString(static_cast<A64::Reg>(i)), regs[i]);
- }
- for (size_t i = 0; i < vecs.size(); ++i) {
- fmt::print("{:3s}: {:016x}{:016x}\n", A64::VecToString(static_cast<A64::Vec>(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<size_t>(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<A64::Reg>(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<A64::Vec>(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");
-
- 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());
- }
- };
+ // 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<A64::Reg>(i)), regs[i]);
+ // }
+ // for (size_t i = 0; i < vecs.size(); ++i) {
+ // fmt::print("{:3s}: {:016x}{:016x}\n", A64::VecToString(static_cast<A64::Vec>(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<size_t>(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<A64::Reg>(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<A64::Vec>(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");
+
+ // 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 395181efe3..ca44dce593 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 merry::mcl unordered_dense::unordered_dense)
+target_link_libraries(dynarmic_print_info PRIVATE dynarmic fmt::fmt 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 merry::mcl unordered_dense::unordered_dense)
+target_link_libraries(dynarmic_test_generator PRIVATE dynarmic fmt::fmt 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 merry::mcl unordered_dense::unordered_dense)
+target_link_libraries(dynarmic_test_reader PRIVATE dynarmic fmt::fmt 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 merry::mcl unordered_dense::unordered_dense)
+target_link_libraries(dynarmic_tests PRIVATE dynarmic Catch2::Catch2WithMain fmt::fmt 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 33d84ba8cd..19e2ca38b2 100644
--- a/src/dynarmic/tests/print_info.cpp
+++ b/src/dynarmic/tests/print_info.cpp
@@ -18,7 +18,7 @@
#include <fmt/format.h>
#include <fmt/ostream.h>
#include <fmt/ranges.h>
-#include <mcl/bit/swap.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 33e41099ff..43203c3e13 100644
--- a/src/dynarmic/tests/test_generator.cpp
+++ b/src/dynarmic/tests/test_generator.cpp
@@ -16,8 +16,7 @@
#include <tuple>
#include <vector>
-#include <mcl/bit/swap.hpp>
-#include <mcl/macro/architecture.hpp>
+#include "dynarmic/mcl/bit.hpp"
#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 66c1e7fd24..9a17bc5582 100644
--- a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp
+++ b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp
@@ -8,7 +8,7 @@
#include <type_traits>
#include <fmt/format.h>
-#include <mcl/bit/bit_field.hpp>
+#include "dynarmic/mcl/bit.hpp"
#include "dynarmic/tests/unicorn_emu/a32_unicorn.h"
#include "dynarmic/common/assert.h"
#include "dynarmic/tests/A32/testenv.h"