diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index db2d536f68..274e553cd8 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.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. @@ -164,10 +164,10 @@ A32AddressSpace::A32AddressSpace(const A32::UserConfig& conf) EmitPrelude(); } -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}); +void A32AddressSpace::GenerateIR(IR::Block& ir_block, IR::LocationDescriptor descriptor) const { + ir_block.Reset(descriptor); + A32::Translate(ir_block, A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); Optimization::Optimize(ir_block, conf, {}); - return ir_block; } void A32AddressSpace::InvalidateCacheRanges(const boost::icl::interval_set& ranges) { diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.h index 3b9e9fb2f6..e7a8d01e17 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.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) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -17,7 +20,7 @@ class A32AddressSpace final : public AddressSpace { public: explicit A32AddressSpace(const A32::UserConfig& conf); - IR::Block GenerateIR(IR::LocationDescriptor) const override; + void GenerateIR(IR::Block& ir_block, IR::LocationDescriptor) const override; void InvalidateCacheRanges(const boost::icl::interval_set& ranges); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index 1b1242a7e7..a5a8306a6d 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.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. @@ -330,12 +330,11 @@ A64AddressSpace::A64AddressSpace(const A64::UserConfig& conf) EmitPrelude(); } -IR::Block A64AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const { +void A64AddressSpace::GenerateIR(IR::Block& ir_block, IR::LocationDescriptor descriptor) const { + ir_block.Reset(descriptor); const auto get_code = [this](u64 vaddr) { return conf.callbacks->MemoryReadCode(vaddr); }; - IR::Block ir_block = A64::Translate(A64::LocationDescriptor{descriptor}, get_code, - {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); + A64::Translate(ir_block, A64::LocationDescriptor{descriptor}, get_code, {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); Optimization::Optimize(ir_block, conf, {}); - return ir_block; } void A64AddressSpace::InvalidateCacheRanges(const boost::icl::interval_set& ranges) { diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.h index 86eae4dd39..512894fdce 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.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) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -17,7 +20,7 @@ class A64AddressSpace final : public AddressSpace { public: explicit A64AddressSpace(const A64::UserConfig& conf); - IR::Block GenerateIR(IR::LocationDescriptor) const override; + void GenerateIR(IR::Block& ir_block, IR::LocationDescriptor) const override; void InvalidateCacheRanges(const boost::icl::interval_set& ranges); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 67be731b18..6b59871b0a 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.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. @@ -20,14 +20,17 @@ #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/llvm_disassemble.h" #include "dynarmic/interface/exclusive_monitor.h" +#include "dynarmic/ir/location_descriptor.h" namespace Dynarmic::Backend::Arm64 { AddressSpace::AddressSpace(size_t code_cache_size) - : code_cache_size(code_cache_size) - , mem(code_cache_size) - , code(mem.ptr(), mem.ptr()) - , fastmem_manager(exception_handler) { + : ir_block{IR::LocationDescriptor{0}} + , code_cache_size(code_cache_size) + , mem(code_cache_size) + , code(mem.ptr(), mem.ptr()) + , fastmem_manager(exception_handler) +{ ASSERT(code_cache_size <= 128 * 1024 * 1024 && "code_cache_size > 128 MiB not currently supported"); exception_handler.Register(mem, code_cache_size); @@ -67,8 +70,7 @@ CodePtr AddressSpace::GetOrEmit(IR::LocationDescriptor descriptor) { if (CodePtr block_entry = Get(descriptor)) { return block_entry; } - - IR::Block ir_block = GenerateIR(descriptor); + GenerateIR(ir_block, descriptor); const EmittedBlockInfo block_info = Emit(std::move(ir_block)); return block_info.entry_point; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h index d7d8cf38b6..9fe9595c65 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.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. @@ -29,7 +29,7 @@ public: explicit AddressSpace(size_t code_cache_size); virtual ~AddressSpace(); - virtual IR::Block GenerateIR(IR::LocationDescriptor) const = 0; + virtual void GenerateIR(IR::Block& ir_block, IR::LocationDescriptor) const = 0; CodePtr Get(IR::LocationDescriptor descriptor); @@ -68,6 +68,7 @@ protected: FakeCall FastmemCallback(u64 host_pc); + IR::Block ir_block; const size_t code_cache_size; oaknut::CodeBlock mem; oaknut::CodeGenerator code; 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 8cde0049d8..05f43774b6 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.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. @@ -26,10 +26,9 @@ A32AddressSpace::A32AddressSpace(const A32::UserConfig& conf) EmitPrelude(); } -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}); +void A32AddressSpace::GenerateIR(IR::Block& ir_block, IR::LocationDescriptor descriptor) const { + A32::Translate(ir_block, A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); Optimization::Optimize(ir_block, conf, {}); - return ir_block; } CodePtr A32AddressSpace::Get(IR::LocationDescriptor descriptor) { @@ -44,7 +43,8 @@ CodePtr A32AddressSpace::GetOrEmit(IR::LocationDescriptor descriptor) { return block_entry; } - IR::Block ir_block = GenerateIR(descriptor); + IR::Block ir_block{descriptor}; + GenerateIR(ir_block, descriptor); const EmittedBlockInfo block_info = Emit(std::move(ir_block)); block_infos.insert_or_assign(descriptor.Value(), block_info); 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 e583dae61f..24148b192c 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.h +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.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) 2024 MerryMage * SPDX-License-Identifier: 0BSD @@ -23,7 +26,7 @@ class A32AddressSpace final { public: explicit A32AddressSpace(const A32::UserConfig& conf); - IR::Block GenerateIR(IR::LocationDescriptor) const; + void GenerateIR(IR::Block& ir_block, IR::LocationDescriptor) const; CodePtr Get(IR::LocationDescriptor descriptor);