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});
|
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)) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue