From a5bb81a97cc18ae9695bbbeaa0ef09c1f7de8913 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sat, 8 Apr 2017 10:04:53 +0100 Subject: [PATCH] backend_x64: Remove dispatch loop in Jit::Run --- src/backend_x64/emit_x64.cpp | 13 ++++++++----- src/backend_x64/emit_x64.h | 2 +- src/backend_x64/interface_x64.cpp | 5 +---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/backend_x64/emit_x64.cpp b/src/backend_x64/emit_x64.cpp index 1d9d3b82..d75f9a6d 100644 --- a/src/backend_x64/emit_x64.cpp +++ b/src/backend_x64/emit_x64.cpp @@ -3397,9 +3397,9 @@ void EmitX64::EmitTerminal(IR::Term::LinkBlock terminal, IR::LocationDescriptor patch_information[terminal.next.UniqueHash()].jg.emplace_back(code->getCurr()); if (auto next_bb = GetBasicBlock(terminal.next)) { - EmitPatchJg(next_bb->entrypoint); + EmitPatchJg(terminal.next, next_bb->entrypoint); } else { - EmitPatchJg(); + EmitPatchJg(terminal.next); } code->mov(MJitStateReg(Arm::Reg::PC), terminal.next.PC()); @@ -3474,7 +3474,7 @@ void EmitX64::Patch(const IR::LocationDescriptor& desc, CodePtr bb) { for (CodePtr location : patch_info.jg) { code->SetCodePtr(location); - EmitPatchJg(bb); + EmitPatchJg(desc, bb); } for (CodePtr location : patch_info.jmp) { @@ -3494,12 +3494,15 @@ void EmitX64::Unpatch(const IR::LocationDescriptor& desc) { Patch(desc, nullptr); } -void EmitX64::EmitPatchJg(CodePtr target_code_ptr) { +void EmitX64::EmitPatchJg(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr) { const CodePtr patch_location = code->getCurr(); if (target_code_ptr) { code->jg(target_code_ptr); + } else { + code->mov(MJitStateReg(Arm::Reg::PC), target_desc.PC()); + code->jg(code->GetReturnFromRunCodeAddress()); } - code->EnsurePatchLocationSize(patch_location, 6); + code->EnsurePatchLocationSize(patch_location, 14); } void EmitX64::EmitPatchJmp(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr) { diff --git a/src/backend_x64/emit_x64.h b/src/backend_x64/emit_x64.h index 5eb8af51..37905673 100644 --- a/src/backend_x64/emit_x64.h +++ b/src/backend_x64/emit_x64.h @@ -91,7 +91,7 @@ private: }; void Patch(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr); void Unpatch(const IR::LocationDescriptor& target_desc); - void EmitPatchJg(CodePtr target_code_ptr = nullptr); + void EmitPatchJg(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr = nullptr); void EmitPatchJmp(const IR::LocationDescriptor& target_desc, CodePtr target_code_ptr = nullptr); void EmitPatchMovRcx(CodePtr target_code_ptr = nullptr); diff --git a/src/backend_x64/interface_x64.cpp b/src/backend_x64/interface_x64.cpp index 151c16e6..4f0c1322 100644 --- a/src/backend_x64/interface_x64.cpp +++ b/src/backend_x64/interface_x64.cpp @@ -152,10 +152,7 @@ size_t Jit::Run(size_t cycle_count) { impl->jit_state.halt_requested = false; - size_t cycles_executed = 0; - while (cycles_executed < cycle_count && !impl->jit_state.halt_requested) { - cycles_executed += impl->Execute(cycle_count - cycles_executed); - } + size_t cycles_executed = impl->Execute(cycle_count); impl->PerformCacheInvalidation();