Browse Source
Revert "[dynarmic] Refactoring to reduce latency hit from recompilation (#358)"
Revert "[dynarmic] Refactoring to reduce latency hit from recompilation (#358)"
This reverts commit a5996c7511.
pull/3012/head
35 changed files with 460 additions and 346 deletions
-
7src/core/arm/dynarmic/arm_dynarmic_32.cpp
-
7src/core/arm/dynarmic/arm_dynarmic_64.cpp
-
4src/dynarmic/src/dynarmic/CMakeLists.txt
-
18src/dynarmic/src/dynarmic/backend/exception_handler.h
-
14src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp
-
1src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp
-
6src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
-
10src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp
-
8src/dynarmic/src/dynarmic/backend/x64/abi.cpp
-
4src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp
-
6src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp
-
7src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp
-
93src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc
-
16src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp
-
61src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp
-
9src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h
-
13src/dynarmic/src/dynarmic/common/memory_pool.cpp
-
65src/dynarmic/src/dynarmic/common/memory_pool.h
-
29src/dynarmic/src/dynarmic/common/variant_util.h
-
22src/dynarmic/src/dynarmic/frontend/A32/a32_types.h
-
20src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h
-
54src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h
-
24src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb16.h
-
24src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h
-
36src/dynarmic/src/dynarmic/frontend/A32/decoder/vfp.h
-
2src/dynarmic/src/dynarmic/frontend/A32/translate/translate_thumb.cpp
-
43src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h
-
12src/dynarmic/src/dynarmic/frontend/A64/translate/impl/a64_branch.cpp
-
69src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h
-
51src/dynarmic/src/dynarmic/frontend/decoder/matcher.h
-
21src/dynarmic/src/dynarmic/ir/basic_block.cpp
-
11src/dynarmic/src/dynarmic/ir/basic_block.h
-
21src/dynarmic/src/dynarmic/ir/ir_emitter.cpp
-
2src/dynarmic/tests/decoder_tests.cpp
-
16src/dynarmic/tests/print_info.cpp
@ -0,0 +1,13 @@ |
|||||
|
/* This file is part of the dynarmic project.
|
||||
|
* Copyright (c) 2016 MerryMage |
||||
|
* SPDX-License-Identifier: 0BSD |
||||
|
*/ |
||||
|
|
||||
|
#include "dynarmic/common/memory_pool.h"
|
||||
|
|
||||
|
#include <cstdlib>
|
||||
|
|
||||
|
namespace Dynarmic::Common { |
||||
|
|
||||
|
|
||||
|
} // namespace Dynarmic::Common
|
||||
@ -0,0 +1,65 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2025 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 |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <cstddef> |
||||
|
#include <cstdlib> |
||||
|
#include <vector> |
||||
|
|
||||
|
namespace Dynarmic::Common { |
||||
|
|
||||
|
/// @tparam object_size Byte-size of objects to construct |
||||
|
/// @tparam slab_size Number of objects to have per slab |
||||
|
template<size_t object_size, size_t slab_size> |
||||
|
class Pool { |
||||
|
public: |
||||
|
inline Pool() noexcept { |
||||
|
AllocateNewSlab(); |
||||
|
} |
||||
|
inline ~Pool() noexcept { |
||||
|
std::free(current_slab); |
||||
|
for (char* slab : slabs) { |
||||
|
std::free(slab); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Pool(const Pool&) = delete; |
||||
|
Pool(Pool&&) = delete; |
||||
|
|
||||
|
Pool& operator=(const Pool&) = delete; |
||||
|
Pool& operator=(Pool&&) = delete; |
||||
|
|
||||
|
/// @brief Returns a pointer to an `object_size`-bytes block of memory. |
||||
|
[[nodiscard]] void* Alloc() noexcept { |
||||
|
if (remaining == 0) { |
||||
|
slabs.push_back(current_slab); |
||||
|
AllocateNewSlab(); |
||||
|
} |
||||
|
void* ret = static_cast<void*>(current_ptr); |
||||
|
current_ptr += object_size; |
||||
|
remaining--; |
||||
|
return ret; |
||||
|
} |
||||
|
private: |
||||
|
/// @brief Allocates a completely new memory slab. |
||||
|
/// Used when an entirely new slab is needed |
||||
|
/// due the current one running out of usable space. |
||||
|
void AllocateNewSlab() noexcept { |
||||
|
current_slab = static_cast<char*>(std::malloc(object_size * slab_size)); |
||||
|
current_ptr = current_slab; |
||||
|
remaining = slab_size; |
||||
|
} |
||||
|
|
||||
|
std::vector<char*> slabs; |
||||
|
char* current_slab = nullptr; |
||||
|
char* current_ptr = nullptr; |
||||
|
size_t remaining = 0; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Dynarmic::Common |
||||
@ -0,0 +1,29 @@ |
|||||
|
/* This file is part of the dynarmic project. |
||||
|
* Copyright (c) 2016 MerryMage |
||||
|
* SPDX-License-Identifier: 0BSD |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <boost/variant.hpp> |
||||
|
|
||||
|
namespace Dynarmic::Common { |
||||
|
namespace detail { |
||||
|
|
||||
|
template<typename ReturnT, typename Lambda> |
||||
|
struct VariantVisitor : boost::static_visitor<ReturnT> |
||||
|
, Lambda { |
||||
|
VariantVisitor(Lambda&& lambda) |
||||
|
: Lambda(std::move(lambda)) {} |
||||
|
|
||||
|
using Lambda::operator(); |
||||
|
}; |
||||
|
|
||||
|
} // namespace detail |
||||
|
|
||||
|
template<typename ReturnT, typename Variant, typename Lambda> |
||||
|
inline ReturnT VisitVariant(Variant&& variant, Lambda&& lambda) { |
||||
|
return boost::apply_visitor(detail::VariantVisitor<ReturnT, Lambda>(std::move(lambda)), variant); |
||||
|
} |
||||
|
|
||||
|
} // namespace Dynarmic::Common |
||||
@ -0,0 +1,21 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
|
||||
|
/* This file is part of the dynarmic project.
|
||||
|
* Copyright (c) 2016 MerryMage |
||||
|
* SPDX-License-Identifier: 0BSD |
||||
|
*/ |
||||
|
|
||||
|
#include "dynarmic/ir/ir_emitter.h"
|
||||
|
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "dynarmic/common/assert.h"
|
||||
|
#include <mcl/bit_cast.hpp>
|
||||
|
|
||||
|
#include "dynarmic/ir/opcodes.h"
|
||||
|
|
||||
|
namespace Dynarmic::IR { |
||||
|
|
||||
|
|
||||
|
} // namespace Dynarmic::IR
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue