diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp index 54e334bbbe..356020c7b6 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp @@ -10,6 +10,7 @@ #include "dynarmic/common/common_types.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/frontend/A32/translate/a32_translate.h" +#include "dynarmic/frontend/A32/FPSCR.h" #include "dynarmic/interface/A32/config.h" #include "dynarmic/backend/ppc64/a32_core.h" #include "dynarmic/common/atomic.h" @@ -33,7 +34,8 @@ struct A32AddressSpace final { if (auto const it = block_entries.find(desc.Value()); it != block_entries.end()) return it->second; - IR::Block ir_block = A32::Translate(A32::LocationDescriptor{desc}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); + ir_block.Reset(A32::LocationDescriptor{desc}); + A32::Translate(ir_block, A32::LocationDescriptor{desc}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); Optimization::Optimize(ir_block, conf, {}); const EmittedBlockInfo block_info = Emit(std::move(ir_block)); @@ -61,6 +63,7 @@ struct A32AddressSpace final { //UNREACHABLE(); } + IR::Block ir_block = {LocationDescriptor(0, PSR(0), FPSCR(0), false)}; const A32::UserConfig conf; CodeBlock cb; powah::Context as; diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp index 29dc61ef62..b1fc35446f 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp @@ -25,7 +25,8 @@ struct A64AddressSpace final { explicit A64AddressSpace(const A64::UserConfig& conf) : conf(conf) , cb(conf.code_cache_size) - , as(cb.ptr(), conf.code_cache_size) { + , as(cb.ptr(), conf.code_cache_size) + { } @@ -35,7 +36,8 @@ struct A64AddressSpace final { auto const get_code = [this](u64 vaddr) { return conf.callbacks->MemoryReadCode(vaddr); }; - IR::Block ir_block = A64::Translate(A64::LocationDescriptor{desc}, get_code, {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); + ir_block.Reset(A64::LocationDescriptor{desc}); + A64::Translate(ir_block, A64::LocationDescriptor{desc}, get_code, {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); Optimization::Optimize(ir_block, conf, {}); fmt::print("IR:\n{}\n", IR::DumpBlock(ir_block)); const EmittedBlockInfo block_info = Emit(std::move(ir_block)); @@ -64,6 +66,7 @@ struct A64AddressSpace final { // UNREACHABLE(); } + IR::Block ir_block = {LocationDescriptor(0, FP::FPCR(0), false)}; const A64::UserConfig conf; CodeBlock cb; powah::Context as; diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp index 89eb3f0401..751ed1c19a 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp @@ -146,10 +146,6 @@ 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 EmitTerminal(powah::Context&, EmitContext&, IR::Term::Interpret, IR::LocationDescriptor, bool) { - ASSERT(false && "unimp"); -} - void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::ReturnToDispatch, IR::LocationDescriptor, bool) { ASSERT(false && "unimp"); } @@ -223,7 +219,7 @@ EmittedBlockInfo EmitPPC64(powah::Context& code, IR::Block block, const EmitConf size_t const stack_size = 112 + ABI_CALLEE_SAVED.size() * 8; auto const start_offset = code.offset; ebi.entry_point = &code.base[start_offset]; - if (!block.empty()) { + if (!block.instructions.empty()) { code.MFLR(powah::R0); code.STD(powah::R0, powah::R1, 16); // Non-volatile saves @@ -233,7 +229,7 @@ EmittedBlockInfo EmitPPC64(powah::Context& code, IR::Block block, const EmitConf code.STDU(powah::R1, powah::R1, uint32_t(-stack_size)); code.STD(powah::R2, powah::R1, 40); - for (auto iter = block.begin(); iter != block.end(); ++iter) { + for (auto iter = block.instructions.begin(); iter != block.instructions.end(); ++iter) { IR::Inst* inst = &*iter; switch (inst->GetOpcode()) { #define OPCODE(name, type, ...) \