mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-14 04:24:31 +00:00
appropriate new terminals
This commit is contained in:
@@ -144,7 +144,9 @@ void EmitIR<IR::Opcode::NZCVFromPackedFlags>(powah::Context&, EmitContext&, IR::
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
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) {
|
void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::ReturnToDispatch, IR::LocationDescriptor, bool) {
|
||||||
ASSERT(false && "unimp");
|
ASSERT(false && "unimp");
|
||||||
@@ -206,11 +208,11 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::CheckBit ter
|
|||||||
code.CMPLDI(tmp, 0);
|
code.CMPLDI(tmp, 0);
|
||||||
code.BEQ(powah::CR0, l_else);
|
code.BEQ(powah::CR0, l_else);
|
||||||
// CheckBit == 1
|
// 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);
|
code.B(l_end);
|
||||||
// CheckBit == 0
|
// CheckBit == 0
|
||||||
code.LABEL(l_else);
|
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);
|
code.LABEL(l_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,10 +220,30 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::CheckHalt te
|
|||||||
ASSERT(false && "unimp");
|
ASSERT(false && "unimp");
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
boost::apply_visitor([&](const auto& t) {
|
if (auto const x = std::get_if<IR::Term::ReturnToDispatch>(&terminal))
|
||||||
EmitTerminal(code, ctx, t, initial_location, is_single_step);
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
}, terminal);
|
if (auto const x = std::get_if<IR::Term::LinkBlock>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::LinkBlockFast>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::PopRSBHint>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::FastDispatchHint>(&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<IR::Term::LeafTerminal>(&terminal))
|
||||||
|
return EmitLeafTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::If>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::CheckBit>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
if (auto const x = std::get_if<IR::Term::CheckHalt>(&terminal))
|
||||||
|
return EmitTerminal(code, ctx, *x, initial_location, is_single_step);
|
||||||
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ void EmitIR<IR::Opcode::ArithmeticShiftRight64>(powah::Context& code, EmitContex
|
|||||||
|
|
||||||
// __builtin_rotateright32
|
// __builtin_rotateright32
|
||||||
template<>
|
template<>
|
||||||
void EmitIR<IR::Opcode::RotateRight32>(powah::Context& code, EmitContext& ctx, IR::Inst* inst) {
|
void EmitIR<IR::Opcode::BitRotateRight32>(powah::Context& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto const result = ctx.reg_alloc.ScratchGpr();
|
auto const result = ctx.reg_alloc.ScratchGpr();
|
||||||
auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
||||||
auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
||||||
@@ -340,7 +340,7 @@ void EmitIR<IR::Opcode::RotateRight32>(powah::Context& code, EmitContext& ctx, I
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void EmitIR<IR::Opcode::RotateRight64>(powah::Context& code, EmitContext& ctx, IR::Inst* inst) {
|
void EmitIR<IR::Opcode::BitRotateRight64>(powah::Context& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto const result = ctx.reg_alloc.ScratchGpr();
|
auto const result = ctx.reg_alloc.ScratchGpr();
|
||||||
auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
auto const src_a = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
||||||
auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
auto const src_b = ctx.reg_alloc.UseGpr(inst->GetArg(0));
|
||||||
|
|||||||
Reference in New Issue
Block a user