diff --git a/src/dynarmic/backend/A64/a32_emit_a64.cpp b/src/dynarmic/backend/A64/a32_emit_a64.cpp index d22fcce4..82b5d539 100644 --- a/src/dynarmic/backend/A64/a32_emit_a64.cpp +++ b/src/dynarmic/backend/A64/a32_emit_a64.cpp @@ -185,7 +185,7 @@ void A32EmitA64::EmitCondPrelude(const A32EmitContext& ctx) { } void A32EmitA64::ClearFastDispatchTable() { - if (config.enable_fast_dispatch) { + if (config.HasOptimization(OptimizationFlag::FastDispatch)) { fast_dispatch_table.fill({}); } } @@ -314,7 +314,7 @@ void A32EmitA64::GenTerminalHandlers() { code.ADD(code.ABI_SCRATCH1, X28, code.ABI_SCRATCH1, ArithOption{code.ABI_SCRATCH1, ST_LSL, 3}); code.LDR(INDEX_UNSIGNED, X8, code.ABI_SCRATCH1, offsetof(A32JitState, rsb_location_descriptors)); code.CMP(location_descriptor_reg, X8); - if (config.enable_fast_dispatch) { + if (config.HasOptimization(OptimizationFlag::FastDispatch)) { rsb_cache_miss = code.B(CC_NEQ); } else { code.B(CC_NEQ, code.GetReturnFromRunCodeAddress()); @@ -323,7 +323,7 @@ void A32EmitA64::GenTerminalHandlers() { code.BR(code.ABI_SCRATCH1); PerfMapRegister(terminal_handler_pop_rsb_hint, code.GetCodePtr(), "a32_terminal_handler_pop_rsb_hint"); - if (config.enable_fast_dispatch) { + if (config.HasOptimization(OptimizationFlag::FastDispatch)) { terminal_handler_fast_dispatch_hint = code.AlignCode16(); calculate_location_descriptor(fast_dispatch_entry_reg, location_descriptor_reg); code.SetJumpTarget(rsb_cache_miss); @@ -1413,7 +1413,7 @@ void A32EmitA64::EmitSetUpperLocationDescriptor(IR::LocationDescriptor new_locat void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location, bool is_single_step) { EmitSetUpperLocationDescriptor(terminal.next, initial_location); - if (!config.enable_optimizations || is_single_step) { + if (!config.HasOptimization(OptimizationFlag::BlockLinking) || is_single_step) { code.MOVI2R(DecodeReg(code.ABI_SCRATCH1), A32::LocationDescriptor{terminal.next}.PC()); code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC)); code.ReturnFromRunCode(); @@ -1460,7 +1460,7 @@ void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDesc void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool is_single_step) { EmitSetUpperLocationDescriptor(terminal.next, initial_location); - if (!config.enable_optimizations || is_single_step) { + if (!config.HasOptimization(OptimizationFlag::BlockLinking) || is_single_step) { code.MOVI2R(DecodeReg(code.ABI_SCRATCH1), A32::LocationDescriptor{terminal.next}.PC()); code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC)); code.ReturnFromRunCode(); @@ -1476,7 +1476,7 @@ void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::Location } void A32EmitA64::EmitTerminalImpl(IR::Term::PopRSBHint, IR::LocationDescriptor, bool is_single_step) { - if (!config.enable_optimizations || is_single_step) { + if (!config.HasOptimization(OptimizationFlag::BlockLinking) || is_single_step) { code.ReturnFromRunCode(); return; } @@ -1484,7 +1484,7 @@ void A32EmitA64::EmitTerminalImpl(IR::Term::PopRSBHint, IR::LocationDescriptor, } void A32EmitA64::EmitTerminalImpl(IR::Term::FastDispatchHint, IR::LocationDescriptor, bool is_single_step) { - if (config.enable_fast_dispatch && !is_single_step) { + if (config.HasOptimization(OptimizationFlag::FastDispatch) && !is_single_step) { code.B(terminal_handler_fast_dispatch_hint); } else { code.ReturnFromRunCode(); @@ -1591,7 +1591,7 @@ void A32EmitA64::EmitPatchMovX0(CodePtr target_code_ptr) { void A32EmitA64::Unpatch(const IR::LocationDescriptor& location) { EmitA64::Unpatch(location); - if (config.enable_fast_dispatch) { + if (config.HasOptimization(OptimizationFlag::FastDispatch)) { code.DisableWriting(); SCOPE_EXIT { code.EnableWriting(); }; diff --git a/src/dynarmic/backend/A64/a32_interface.cpp b/src/dynarmic/backend/A64/a32_interface.cpp index adea12c2..bffc96f9 100644 --- a/src/dynarmic/backend/A64/a32_interface.cpp +++ b/src/dynarmic/backend/A64/a32_interface.cpp @@ -159,14 +159,15 @@ private: PerformCacheInvalidation(); } - if (config.enable_optimizations) { IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, config.callbacks, {config.arch_version, config.define_unpredictable_behaviour, config.hook_hint_instructions}); + if (config.HasOptimization(OptimizationFlag::GetSetElimination)) { Optimization::A32GetSetElimination(ir_block); Optimization::DeadCodeElimination(ir_block); + } + if (config.HasOptimization(OptimizationFlag::ConstProp)) { Optimization::A32ConstantMemoryReads(ir_block, config.callbacks); Optimization::ConstantPropagation(ir_block); Optimization::DeadCodeElimination(ir_block); - Optimization::A32MergeInterpretBlocksPass(ir_block, config.callbacks); } Optimization::VerificationPass(ir_block); return emitter.Emit(ir_block);