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() {
|
||||
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(); };
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user