From 6f2a737322aecb9e088f0a79152264e6667ecf6c Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 20 Mar 2026 05:28:45 +0000 Subject: [PATCH] fix mk8d --- src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp | 5 +---- src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h | 4 ++-- src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp | 5 +---- src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h | 4 ++-- src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp | 2 +- src/dynarmic/src/dynarmic/backend/x64/emit_x64.h | 5 ++--- 6 files changed, 9 insertions(+), 16 deletions(-) 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 f4cb06764f..3376e0c4b0 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -60,7 +60,7 @@ static Xbyak::Address MJitStateExtReg(A32::ExtReg reg) { UNREACHABLE(); } -A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : EmitContext(reg_alloc, block, shared_labels) , conf(conf) {} @@ -113,9 +113,6 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { return gprs; }(), any_xmm); - // up to 2 labels per insn - if (auto const inst_count = block.instructions.size(); inst_count > shared_labels.capacity()) - shared_labels.reserve(inst_count * 16); A32EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h index 00beff3004..8e97dc7737 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h @@ -29,7 +29,7 @@ namespace Dynarmic::Backend::X64 { class RegAlloc; struct A32EmitContext final : public EmitContext { - A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels); + A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A32::LocationDescriptor Location() const; A32::LocationDescriptor EndLocation() const; @@ -130,7 +130,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; - std::vector shared_labels; + boost::container::stable_vector shared_labels; void (*memory_read_128)() = nullptr; // Dummy void (*memory_write_128)() = nullptr; // Dummy const void* terminal_handler_pop_rsb_hint; 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 0191ad8416..60f95d8819 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp @@ -38,7 +38,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : EmitContext(reg_alloc, block, shared_labels) , conf(conf) {} @@ -87,9 +87,6 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept { return gprs; }(), any_xmm}; - // up to 2 labels per insn - if (auto const inst_count = block.instructions.size(); inst_count > shared_labels.capacity()) - shared_labels.reserve(inst_count * 16); A64EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h index 94e9556f92..d57b1d81b9 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h @@ -27,7 +27,7 @@ namespace Dynarmic::Backend::X64 { struct A64EmitContext final : public EmitContext { - A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels); + A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A64::LocationDescriptor Location() const; bool IsSingleStep() const; @@ -126,7 +126,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; - std::vector shared_labels; + boost::container::stable_vector shared_labels; const void* terminal_handler_pop_rsb_hint = nullptr; const void* terminal_handler_fast_dispatch_hint = nullptr; FastDispatchEntry& (*fast_dispatch_table_lookup)(u64) = nullptr; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp index e498c2ec9c..7ee990774b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp @@ -33,7 +33,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : reg_alloc(reg_alloc) , block(block) , shared_labels(shared_labels) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h index 50fa550413..34f1dd05c6 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h @@ -55,20 +55,19 @@ using HalfVectorArray = std::array& shared_labels); + EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); virtual ~EmitContext(); virtual FP::FPCR FPCR(bool fpcr_controlled = true) const = 0; virtual bool HasOptimization(OptimizationFlag flag) const = 0; [[nodiscard]] inline Xbyak::Label* GenSharedLabel() noexcept { - DEBUG_ASSERT(shared_labels.size() + 1 <= shared_labels.capacity()); return &shared_labels.emplace_back(); } std::vector> deferred_emits; RegAlloc& reg_alloc; IR::Block& block; - std::vector& shared_labels; + boost::container::stable_vector& shared_labels; }; class EmitX64 {