[dynarmic] Refactoring to reduce latency hit from recompilation #358
4 changed files with 3 additions and 34 deletions
|
@ -63,7 +63,6 @@ add_library(dynarmic
|
||||||
common/string_util.h
|
common/string_util.h
|
||||||
common/u128.cpp
|
common/u128.cpp
|
||||||
common/u128.h
|
common/u128.h
|
||||||
common/variant_util.h
|
|
||||||
frontend/A32/a32_types.cpp
|
frontend/A32/a32_types.cpp
|
||||||
frontend/A32/a32_types.h
|
frontend/A32/a32_types.h
|
||||||
frontend/A64/a64_types.cpp
|
frontend/A64/a64_types.cpp
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include "dynarmic/backend/x64/nzcv_util.h"
|
#include "dynarmic/backend/x64/nzcv_util.h"
|
||||||
#include "dynarmic/backend/x64/perf_map.h"
|
#include "dynarmic/backend/x64/perf_map.h"
|
||||||
#include "dynarmic/backend/x64/stack_layout.h"
|
#include "dynarmic/backend/x64/stack_layout.h"
|
||||||
#include "dynarmic/common/variant_util.h"
|
|
||||||
#include "dynarmic/frontend/A32/a32_location_descriptor.h"
|
#include "dynarmic/frontend/A32/a32_location_descriptor.h"
|
||||||
#include "dynarmic/frontend/A32/a32_types.h"
|
#include "dynarmic/frontend/A32/a32_types.h"
|
||||||
#include "dynarmic/interface/A32/coprocessor.h"
|
#include "dynarmic/interface/A32/coprocessor.h"
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
|
#include <boost/variant/detail/apply_visitor_binary.hpp>
|
||||||
#include <mcl/bit/bit_field.hpp>
|
#include <mcl/bit/bit_field.hpp>
|
||||||
#include <mcl/scope_exit.hpp>
|
#include <mcl/scope_exit.hpp>
|
||||||
#include "dynarmic/common/common_types.h"
|
#include "dynarmic/common/common_types.h"
|
||||||
|
@ -21,7 +22,6 @@
|
||||||
#include "dynarmic/backend/x64/perf_map.h"
|
#include "dynarmic/backend/x64/perf_map.h"
|
||||||
#include "dynarmic/backend/x64/stack_layout.h"
|
#include "dynarmic/backend/x64/stack_layout.h"
|
||||||
#include "dynarmic/backend/x64/verbose_debugging_output.h"
|
#include "dynarmic/backend/x64/verbose_debugging_output.h"
|
||||||
#include "dynarmic/common/variant_util.h"
|
|
||||||
#include "dynarmic/ir/basic_block.h"
|
#include "dynarmic/ir/basic_block.h"
|
||||||
#include "dynarmic/ir/microinstruction.h"
|
#include "dynarmic/ir/microinstruction.h"
|
||||||
#include "dynarmic/ir/opcodes.h"
|
#include "dynarmic/ir/opcodes.h"
|
||||||
|
@ -347,14 +347,14 @@ EmitX64::BlockDescriptor EmitX64::RegisterBlock(const IR::LocationDescriptor& de
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitX64::EmitTerminal(IR::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
|
void EmitX64::EmitTerminal(IR::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
|
||||||
Common::VisitVariant<void>(terminal, [this, initial_location, is_single_step](auto x) {
|
boost::apply_visitor([this, initial_location, is_single_step](auto x) {
|
||||||
using T = std::decay_t<decltype(x)>;
|
using T = std::decay_t<decltype(x)>;
|
||||||
if constexpr (!std::is_same_v<T, IR::Term::Invalid>) {
|
if constexpr (!std::is_same_v<T, IR::Term::Invalid>) {
|
||||||
this->EmitTerminalImpl(x, initial_location, is_single_step);
|
this->EmitTerminalImpl(x, initial_location, is_single_step);
|
||||||
} else {
|
} else {
|
||||||
ASSERT_MSG(false, "Invalid terminal");
|
ASSERT_MSG(false, "Invalid terminal");
|
||||||
}
|
}
|
||||||
});
|
}, terminal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitX64::Patch(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr) {
|
void EmitX64::Patch(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr) {
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
/* 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
|
|
Loading…
Add table
Add a link
Reference in a new issue