From 476a2366f216df385e979c5a46cc295ae8d211c2 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 12 Aug 2026 22:11:07 +0000 Subject: [PATCH] appropriate new terminals --- .../src/dynarmic/backend/ppc64/emit_ppc64.cpp | 36 +++++++++++++++---- .../ppc64/emit_ppc64_data_processing.cpp | 4 +-- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp index 0f66940339..100558f939 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp @@ -144,7 +144,9 @@ void EmitIR(powah::Context&, EmitContext&, IR:: } namespace { -void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step); + +void EmitLeafTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LeafTerminal const& terminal, IR::LocationDescriptor initial_location, bool is_single_step); +void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::Terminal const terminal, IR::LocationDescriptor initial_location, bool is_single_step); void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::ReturnToDispatch, IR::LocationDescriptor, bool) { ASSERT(false && "unimp"); @@ -206,11 +208,11 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::CheckBit ter code.CMPLDI(tmp, 0); code.BEQ(powah::CR0, l_else); // CheckBit == 1 - EmitTerminal(code, ctx, terminal.then_, initial_location, is_single_step); + EmitLeafTerminal(code, ctx, terminal.then_, initial_location, is_single_step); code.B(l_end); // CheckBit == 0 code.LABEL(l_else); - EmitTerminal(code, ctx, terminal.else_, initial_location, is_single_step); + EmitLeafTerminal(code, ctx, terminal.else_, initial_location, is_single_step); code.LABEL(l_end); } @@ -218,10 +220,30 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::CheckHalt te ASSERT(false && "unimp"); } -void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step) { - boost::apply_visitor([&](const auto& t) { - EmitTerminal(code, ctx, t, initial_location, is_single_step); - }, terminal); +void EmitLeafTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LeafTerminal const terminal, IR::LocationDescriptor initial_location, bool is_single_step) { + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + UNREACHABLE(); +} + +void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::Terminal const terminal, IR::LocationDescriptor initial_location, bool is_single_step) { + if (auto const x = std::get_if(&terminal)) + return EmitLeafTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + if (auto const x = std::get_if(&terminal)) + return EmitTerminal(code, ctx, *x, initial_location, is_single_step); + UNREACHABLE(); } } diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp index e3b599b31c..ce211bbc48 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp @@ -329,7 +329,7 @@ void EmitIR(powah::Context& code, EmitContex // __builtin_rotateright32 template<> -void EmitIR(powah::Context& code, EmitContext& ctx, IR::Inst* inst) { +void EmitIR(powah::Context& code, EmitContext& ctx, IR::Inst* inst) { auto const result = ctx.reg_alloc.ScratchGpr(); auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0)); auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0)); @@ -340,7 +340,7 @@ void EmitIR(powah::Context& code, EmitContext& ctx, I } template<> -void EmitIR(powah::Context& code, EmitContext& ctx, IR::Inst* inst) { +void EmitIR(powah::Context& code, EmitContext& ctx, IR::Inst* inst) { auto const result = ctx.reg_alloc.ScratchGpr(); auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0)); auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0));