backend/A64: update Optimization flags
This commit is contained in:
parent
b525a3c20f
commit
d57e1f9010
@ -185,7 +185,7 @@ void A32EmitA64::EmitCondPrelude(const A32EmitContext& ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void A32EmitA64::ClearFastDispatchTable() {
|
void A32EmitA64::ClearFastDispatchTable() {
|
||||||
if (config.enable_fast_dispatch) {
|
if (config.HasOptimization(OptimizationFlag::FastDispatch)) {
|
||||||
fast_dispatch_table.fill({});
|
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.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.LDR(INDEX_UNSIGNED, X8, code.ABI_SCRATCH1, offsetof(A32JitState, rsb_location_descriptors));
|
||||||
code.CMP(location_descriptor_reg, X8);
|
code.CMP(location_descriptor_reg, X8);
|
||||||
if (config.enable_fast_dispatch) {
|
if (config.HasOptimization(OptimizationFlag::FastDispatch)) {
|
||||||
rsb_cache_miss = code.B(CC_NEQ);
|
rsb_cache_miss = code.B(CC_NEQ);
|
||||||
} else {
|
} else {
|
||||||
code.B(CC_NEQ, code.GetReturnFromRunCodeAddress());
|
code.B(CC_NEQ, code.GetReturnFromRunCodeAddress());
|
||||||
@ -323,7 +323,7 @@ void A32EmitA64::GenTerminalHandlers() {
|
|||||||
code.BR(code.ABI_SCRATCH1);
|
code.BR(code.ABI_SCRATCH1);
|
||||||
PerfMapRegister(terminal_handler_pop_rsb_hint, code.GetCodePtr(), "a32_terminal_handler_pop_rsb_hint");
|
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();
|
terminal_handler_fast_dispatch_hint = code.AlignCode16();
|
||||||
calculate_location_descriptor(fast_dispatch_entry_reg, location_descriptor_reg);
|
calculate_location_descriptor(fast_dispatch_entry_reg, location_descriptor_reg);
|
||||||
code.SetJumpTarget(rsb_cache_miss);
|
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) {
|
void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
|
||||||
EmitSetUpperLocationDescriptor(terminal.next, initial_location);
|
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.MOVI2R(DecodeReg(code.ABI_SCRATCH1), A32::LocationDescriptor{terminal.next}.PC());
|
||||||
code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC));
|
code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC));
|
||||||
code.ReturnFromRunCode();
|
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) {
|
void A32EmitA64::EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
|
||||||
EmitSetUpperLocationDescriptor(terminal.next, initial_location);
|
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.MOVI2R(DecodeReg(code.ABI_SCRATCH1), A32::LocationDescriptor{terminal.next}.PC());
|
||||||
code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC));
|
code.STR(INDEX_UNSIGNED, DecodeReg(code.ABI_SCRATCH1), X28, MJitStateReg(A32::Reg::PC));
|
||||||
code.ReturnFromRunCode();
|
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) {
|
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();
|
code.ReturnFromRunCode();
|
||||||
return;
|
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) {
|
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);
|
code.B(terminal_handler_fast_dispatch_hint);
|
||||||
} else {
|
} else {
|
||||||
code.ReturnFromRunCode();
|
code.ReturnFromRunCode();
|
||||||
@ -1591,7 +1591,7 @@ void A32EmitA64::EmitPatchMovX0(CodePtr target_code_ptr) {
|
|||||||
|
|
||||||
void A32EmitA64::Unpatch(const IR::LocationDescriptor& location) {
|
void A32EmitA64::Unpatch(const IR::LocationDescriptor& location) {
|
||||||
EmitA64::Unpatch(location);
|
EmitA64::Unpatch(location);
|
||||||
if (config.enable_fast_dispatch) {
|
if (config.HasOptimization(OptimizationFlag::FastDispatch)) {
|
||||||
code.DisableWriting();
|
code.DisableWriting();
|
||||||
SCOPE_EXIT { code.EnableWriting(); };
|
SCOPE_EXIT { code.EnableWriting(); };
|
||||||
|
|
||||||
|
@ -159,14 +159,15 @@ private:
|
|||||||
PerformCacheInvalidation();
|
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});
|
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::A32GetSetElimination(ir_block);
|
||||||
Optimization::DeadCodeElimination(ir_block);
|
Optimization::DeadCodeElimination(ir_block);
|
||||||
|
}
|
||||||
|
if (config.HasOptimization(OptimizationFlag::ConstProp)) {
|
||||||
Optimization::A32ConstantMemoryReads(ir_block, config.callbacks);
|
Optimization::A32ConstantMemoryReads(ir_block, config.callbacks);
|
||||||
Optimization::ConstantPropagation(ir_block);
|
Optimization::ConstantPropagation(ir_block);
|
||||||
Optimization::DeadCodeElimination(ir_block);
|
Optimization::DeadCodeElimination(ir_block);
|
||||||
Optimization::A32MergeInterpretBlocksPass(ir_block, config.callbacks);
|
|
||||||
}
|
}
|
||||||
Optimization::VerificationPass(ir_block);
|
Optimization::VerificationPass(ir_block);
|
||||||
return emitter.Emit(ir_block);
|
return emitter.Emit(ir_block);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user