From fb3b828158b2d41ab7434fdc8d96fe260a6b2a52 Mon Sep 17 00:00:00 2001 From: Merry Date: Fri, 22 Jul 2022 19:59:23 +0100 Subject: [PATCH] backend/arm64: Implement Identity --- src/dynarmic/backend/arm64/emit_arm64.cpp | 9 ++++----- src/dynarmic/backend/arm64/reg_alloc.cpp | 6 ++++++ src/dynarmic/backend/arm64/reg_alloc.h | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/dynarmic/backend/arm64/emit_arm64.cpp b/src/dynarmic/backend/arm64/emit_arm64.cpp index ee35945a..1195d29b 100644 --- a/src/dynarmic/backend/arm64/emit_arm64.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64.cpp @@ -24,11 +24,10 @@ template<> void EmitIR(oaknut::CodeGenerator&, EmitContext&, IR::Inst*) {} template<> -void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { - (void)code; - (void)ctx; - (void)inst; - ASSERT_FALSE("Unimplemented"); +void EmitIR(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + + ctx.reg_alloc.DefineAsExisting(inst, args[0]); } template<> diff --git a/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/backend/arm64/reg_alloc.cpp index f60d4faa..3cc12d4c 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -92,6 +92,12 @@ bool RegAlloc::IsValueLive(IR::Inst* inst) const { return !!ValueLocation(inst); } +void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) { + auto& info = ValueInfo(arg.value.GetInst()); + info.values.emplace_back(inst); + info.expected_uses += inst->UseCount(); +} + void RegAlloc::AssertNoMoreUses() const { const auto is_empty = [](const auto& i) { return i.values.empty() && !i.locked && !i.realized && !i.accumulated_uses && !i.expected_uses; }; ASSERT(std::all_of(gprs.begin(), gprs.end(), is_empty)); diff --git a/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/backend/arm64/reg_alloc.h index b34d8059..864d8f56 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.h +++ b/src/dynarmic/backend/arm64/reg_alloc.h @@ -204,6 +204,8 @@ public: } } + void DefineAsExisting(IR::Inst* inst, Argument& arg); + void SpillFlags(); void SpillAll();