a32_get_set_elimination_pass: Add option to disable NZC -> NZ conversion
This commit is contained in:
parent
52aa68c31c
commit
6f106602ba
5 changed files with 11 additions and 7 deletions
|
@ -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});
|
||||
Optimization::PolyfillPass(ir_block, polyfill_options);
|
||||
if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) {
|
||||
Optimization::A32GetSetElimination(ir_block);
|
||||
Optimization::A32GetSetElimination(ir_block, {});
|
||||
Optimization::DeadCodeElimination(ir_block);
|
||||
}
|
||||
if (conf.HasOptimization(OptimizationFlag::ConstProp)) {
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
namespace Dynarmic::Optimization {
|
||||
|
||||
void A32GetSetElimination(IR::Block& block) {
|
||||
void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions opt) {
|
||||
using Iterator = IR::Block::iterator;
|
||||
struct RegisterInfo {
|
||||
IR::Value register_value;
|
||||
|
@ -215,7 +215,7 @@ void A32GetSetElimination(IR::Block& block) {
|
|||
break;
|
||||
}
|
||||
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.SetCpsrNZ(IR::NZCV{inst->GetArg(0)});
|
||||
inst->Invalidate();
|
||||
|
|
|
@ -26,9 +26,13 @@ struct PolyfillOptions {
|
|||
bool operator==(const PolyfillOptions&) const = default;
|
||||
};
|
||||
|
||||
struct A32GetSetEliminationOptions {
|
||||
bool convert_nzc_to_nz = false;
|
||||
};
|
||||
|
||||
void PolyfillPass(IR::Block& block, const PolyfillOptions& opt);
|
||||
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 A64GetSetElimination(IR::Block& block);
|
||||
void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb);
|
||||
|
|
|
@ -176,7 +176,7 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn<Th
|
|||
while (num_insts < instructions_to_execute_count) {
|
||||
A32::LocationDescriptor descriptor = {u32(num_insts * 4), cpsr, A32::FPSCR{}};
|
||||
IR::Block ir_block = A32::Translate(descriptor, &test_env, {});
|
||||
Optimization::A32GetSetElimination(ir_block);
|
||||
Optimization::A32GetSetElimination(ir_block, {});
|
||||
Optimization::DeadCodeElimination(ir_block);
|
||||
Optimization::A32ConstantMemoryReads(ir_block, &test_env);
|
||||
Optimization::ConstantPropagation(ir_block);
|
||||
|
|
|
@ -64,7 +64,7 @@ void PrintA32Instruction(u32 instruction) {
|
|||
fmt::print("IR:\n");
|
||||
fmt::print("{}\n", IR::DumpBlock(block));
|
||||
|
||||
Optimization::A32GetSetElimination(block);
|
||||
Optimization::A32GetSetElimination(block, {});
|
||||
Optimization::DeadCodeElimination(block);
|
||||
Optimization::ConstantPropagation(block);
|
||||
Optimization::DeadCodeElimination(block);
|
||||
|
@ -109,7 +109,7 @@ void PrintThumbInstruction(u32 instruction) {
|
|||
fmt::print("IR:\n");
|
||||
fmt::print("{}\n", IR::DumpBlock(block));
|
||||
|
||||
Optimization::A32GetSetElimination(block);
|
||||
Optimization::A32GetSetElimination(block, {});
|
||||
Optimization::DeadCodeElimination(block);
|
||||
Optimization::ConstantPropagation(block);
|
||||
Optimization::DeadCodeElimination(block);
|
||||
|
|
Loading…
Reference in a new issue