[dynarmic] reduce opt pass latency
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
83730cd4c1
commit
0efdd0df3d
7 changed files with 3 additions and 119 deletions
|
@ -58,8 +58,6 @@ add_library(dynarmic
|
||||||
common/lut_from_list.h
|
common/lut_from_list.h
|
||||||
common/math_util.cpp
|
common/math_util.cpp
|
||||||
common/math_util.h
|
common/math_util.h
|
||||||
common/memory_pool.cpp
|
|
||||||
common/memory_pool.h
|
|
||||||
common/safe_ops.h
|
common/safe_ops.h
|
||||||
common/spin_lock.h
|
common/spin_lock.h
|
||||||
common/string_util.h
|
common/string_util.h
|
||||||
|
@ -80,7 +78,6 @@ add_library(dynarmic
|
||||||
ir/basic_block.cpp
|
ir/basic_block.cpp
|
||||||
ir/basic_block.h
|
ir/basic_block.h
|
||||||
ir/cond.h
|
ir/cond.h
|
||||||
ir/ir_emitter.cpp
|
|
||||||
ir/ir_emitter.h
|
ir/ir_emitter.h
|
||||||
ir/location_descriptor.cpp
|
ir/location_descriptor.cpp
|
||||||
ir/location_descriptor.h
|
ir/location_descriptor.h
|
||||||
|
|
|
@ -28,19 +28,7 @@ A32AddressSpace::A32AddressSpace(const A32::UserConfig& conf)
|
||||||
|
|
||||||
IR::Block A32AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
|
IR::Block A32AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
|
||||||
IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions});
|
IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions});
|
||||||
|
Optimization::Optimize(ir_block, conf, {});
|
||||||
Optimization::PolyfillPass(ir_block, {});
|
|
||||||
if (conf.HasOptimization(OptimizationFlag::GetSetElimination)) {
|
|
||||||
Optimization::A32GetSetElimination(ir_block, {.convert_nzc_to_nz = true});
|
|
||||||
Optimization::DeadCodeElimination(ir_block);
|
|
||||||
}
|
|
||||||
if (conf.HasOptimization(OptimizationFlag::ConstProp)) {
|
|
||||||
Optimization::A32ConstantMemoryReads(ir_block, conf.callbacks);
|
|
||||||
Optimization::ConstantPropagation(ir_block);
|
|
||||||
Optimization::DeadCodeElimination(ir_block);
|
|
||||||
}
|
|
||||||
Optimization::VerificationPass(ir_block);
|
|
||||||
|
|
||||||
return ir_block;
|
return ir_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
/* 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
|
|
|
@ -1,61 +0,0 @@
|
||||||
/* This file is part of the dynarmic project.
|
|
||||||
* Copyright (c) 2016 MerryMage
|
|
||||||
* SPDX-License-Identifier: 0BSD
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#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
|
|
|
@ -15,8 +15,6 @@
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
|
|
||||||
#include "dynarmic/common/memory_pool.h"
|
|
||||||
#include "dynarmic/frontend/A32/a32_types.h"
|
#include "dynarmic/frontend/A32/a32_types.h"
|
||||||
#include "dynarmic/frontend/A64/a64_types.h"
|
#include "dynarmic/frontend/A64/a64_types.h"
|
||||||
#include "dynarmic/ir/cond.h"
|
#include "dynarmic/ir/cond.h"
|
||||||
|
@ -27,8 +25,7 @@ namespace Dynarmic::IR {
|
||||||
Block::Block(const LocationDescriptor& location)
|
Block::Block(const LocationDescriptor& location)
|
||||||
: location{location},
|
: location{location},
|
||||||
end_location{location},
|
end_location{location},
|
||||||
cond{Cond::AL},
|
cond{Cond::AL}
|
||||||
instruction_alloc_pool{std::make_unique<std::remove_reference_t<decltype(*instruction_alloc_pool)>>()}
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,7 +37,7 @@ Block::Block(const LocationDescriptor& location)
|
||||||
/// @param args A sequence of Value instances used as arguments for the instruction.
|
/// @param args A sequence of Value instances used as arguments for the instruction.
|
||||||
/// @returns Iterator to the newly created instruction.
|
/// @returns Iterator to the newly created instruction.
|
||||||
Block::iterator Block::PrependNewInst(iterator insertion_point, Opcode opcode, std::initializer_list<Value> args) noexcept {
|
Block::iterator Block::PrependNewInst(iterator insertion_point, Opcode opcode, std::initializer_list<Value> args) noexcept {
|
||||||
IR::Inst* inst = new (instruction_alloc_pool->Alloc()) IR::Inst(opcode);
|
IR::Inst* inst = new IR::Inst(opcode);
|
||||||
DEBUG_ASSERT(args.size() == inst->NumArgs());
|
DEBUG_ASSERT(args.size() == inst->NumArgs());
|
||||||
std::for_each(args.begin(), args.end(), [&inst, index = size_t(0)](const auto& arg) mutable {
|
std::for_each(args.begin(), args.end(), [&inst, index = size_t(0)](const auto& arg) mutable {
|
||||||
inst->SetArg(index, arg);
|
inst->SetArg(index, arg);
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "dynarmic/ir/terminal.h"
|
#include "dynarmic/ir/terminal.h"
|
||||||
#include "dynarmic/ir/value.h"
|
#include "dynarmic/ir/value.h"
|
||||||
#include "dynarmic/ir/dense_list.h"
|
#include "dynarmic/ir/dense_list.h"
|
||||||
#include "dynarmic/common/memory_pool.h"
|
|
||||||
|
|
||||||
namespace Dynarmic::IR {
|
namespace Dynarmic::IR {
|
||||||
|
|
||||||
|
@ -174,8 +173,6 @@ private:
|
||||||
LocationDescriptor end_location;
|
LocationDescriptor end_location;
|
||||||
/// Conditional to pass in order to execute this block
|
/// Conditional to pass in order to execute this block
|
||||||
Cond cond;
|
Cond cond;
|
||||||
/// Memory pool for instruction list
|
|
||||||
std::unique_ptr<Common::Pool<sizeof(Inst), 2097152UL / sizeof(Inst)>> instruction_alloc_pool;
|
|
||||||
/// Terminal instruction of this block.
|
/// Terminal instruction of this block.
|
||||||
Terminal terminal = Term::Invalid{};
|
Terminal terminal = Term::Invalid{};
|
||||||
/// Number of cycles this block takes to execute if the conditional fails.
|
/// Number of cycles this block takes to execute if the conditional fails.
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
// 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
|
|
Loading…
Add table
Add a link
Reference in a new issue