a32_get_set_elimination_pass: Add option to disable NZC -> NZ conversion

This commit is contained in:
Merry 2022-07-20 16:37:05 +01:00
parent 52aa68c31c
commit 6f106602ba
5 changed files with 11 additions and 7 deletions

View file

@ -174,7 +174,7 @@ private:
IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions});
Optimization::PolyfillPass(ir_block, polyfill_options); Optimization::PolyfillPass(ir_block, polyfill_options);
if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) { if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) {
Optimization::A32GetSetElimination(ir_block); Optimization::A32GetSetElimination(ir_block, {});
Optimization::DeadCodeElimination(ir_block); Optimization::DeadCodeElimination(ir_block);
} }
if (conf.HasOptimization(OptimizationFlag::ConstProp)) { if (conf.HasOptimization(OptimizationFlag::ConstProp)) {

View file

@ -17,7 +17,7 @@
namespace Dynarmic::Optimization { namespace Dynarmic::Optimization {
void A32GetSetElimination(IR::Block& block) { void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions opt) {
using Iterator = IR::Block::iterator; using Iterator = IR::Block::iterator;
struct RegisterInfo { struct RegisterInfo {
IR::Value register_value; IR::Value register_value;
@ -215,7 +215,7 @@ void A32GetSetElimination(IR::Block& block) {
break; break;
} }
case IR::Opcode::A32SetCpsrNZC: { case IR::Opcode::A32SetCpsrNZC: {
if (!inst->GetArg(1).IsImmediate() && inst->GetArg(1).GetInstRecursive()->GetOpcode() == IR::Opcode::A32GetCFlag) { if (opt.convert_nzc_to_nz && !inst->GetArg(1).IsImmediate() && inst->GetArg(1).GetInstRecursive()->GetOpcode() == IR::Opcode::A32GetCFlag) {
ir.SetInsertionPoint(inst); ir.SetInsertionPoint(inst);
ir.SetCpsrNZ(IR::NZCV{inst->GetArg(0)}); ir.SetCpsrNZ(IR::NZCV{inst->GetArg(0)});
inst->Invalidate(); inst->Invalidate();

View file

@ -26,9 +26,13 @@ struct PolyfillOptions {
bool operator==(const PolyfillOptions&) const = default; bool operator==(const PolyfillOptions&) const = default;
}; };
struct A32GetSetEliminationOptions {
bool convert_nzc_to_nz = false;
};
void PolyfillPass(IR::Block& block, const PolyfillOptions& opt); void PolyfillPass(IR::Block& block, const PolyfillOptions& opt);
void A32ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb); void A32ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb);
void A32GetSetElimination(IR::Block& block); void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions opt);
void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf); void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf);
void A64GetSetElimination(IR::Block& block); void A64GetSetElimination(IR::Block& block);
void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb); void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb);

View file

@ -176,7 +176,7 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn<Th
while (num_insts < instructions_to_execute_count) { while (num_insts < instructions_to_execute_count) {
A32::LocationDescriptor descriptor = {u32(num_insts * 4), cpsr, A32::FPSCR{}}; A32::LocationDescriptor descriptor = {u32(num_insts * 4), cpsr, A32::FPSCR{}};
IR::Block ir_block = A32::Translate(descriptor, &test_env, {}); IR::Block ir_block = A32::Translate(descriptor, &test_env, {});
Optimization::A32GetSetElimination(ir_block); Optimization::A32GetSetElimination(ir_block, {});
Optimization::DeadCodeElimination(ir_block); Optimization::DeadCodeElimination(ir_block);
Optimization::A32ConstantMemoryReads(ir_block, &test_env); Optimization::A32ConstantMemoryReads(ir_block, &test_env);
Optimization::ConstantPropagation(ir_block); Optimization::ConstantPropagation(ir_block);

View file

@ -64,7 +64,7 @@ void PrintA32Instruction(u32 instruction) {
fmt::print("IR:\n"); fmt::print("IR:\n");
fmt::print("{}\n", IR::DumpBlock(block)); fmt::print("{}\n", IR::DumpBlock(block));
Optimization::A32GetSetElimination(block); Optimization::A32GetSetElimination(block, {});
Optimization::DeadCodeElimination(block); Optimization::DeadCodeElimination(block);
Optimization::ConstantPropagation(block); Optimization::ConstantPropagation(block);
Optimization::DeadCodeElimination(block); Optimization::DeadCodeElimination(block);
@ -109,7 +109,7 @@ void PrintThumbInstruction(u32 instruction) {
fmt::print("IR:\n"); fmt::print("IR:\n");
fmt::print("{}\n", IR::DumpBlock(block)); fmt::print("{}\n", IR::DumpBlock(block));
Optimization::A32GetSetElimination(block); Optimization::A32GetSetElimination(block, {});
Optimization::DeadCodeElimination(block); Optimization::DeadCodeElimination(block);
Optimization::ConstantPropagation(block); Optimization::ConstantPropagation(block);
Optimization::DeadCodeElimination(block); Optimization::DeadCodeElimination(block);