emit_x86: Introduce the concept of deferred emits
Remove the concept of the far code region
This commit is contained in:
parent
b6ddeeea0f
commit
6c38ed8a89
3 changed files with 21 additions and 0 deletions
|
@ -155,6 +155,11 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) {
|
||||||
EmitX64::EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep());
|
EmitX64::EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep());
|
||||||
code.int3();
|
code.int3();
|
||||||
|
|
||||||
|
for (auto& deferred_emit : ctx.deferred_emits) {
|
||||||
|
deferred_emit();
|
||||||
|
}
|
||||||
|
code.int3();
|
||||||
|
|
||||||
const size_t size = static_cast<size_t>(code.getCurr() - entrypoint);
|
const size_t size = static_cast<size_t>(code.getCurr() - entrypoint);
|
||||||
|
|
||||||
const A32::LocationDescriptor descriptor{block.Location()};
|
const A32::LocationDescriptor descriptor{block.Location()};
|
||||||
|
|
|
@ -126,6 +126,11 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) {
|
||||||
EmitX64::EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep());
|
EmitX64::EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep());
|
||||||
code.int3();
|
code.int3();
|
||||||
|
|
||||||
|
for (auto& deferred_emit : ctx.deferred_emits) {
|
||||||
|
deferred_emit();
|
||||||
|
}
|
||||||
|
code.int3();
|
||||||
|
|
||||||
const size_t size = static_cast<size_t>(code.getCurr() - entrypoint);
|
const size_t size = static_cast<size_t>(code.getCurr() - entrypoint);
|
||||||
|
|
||||||
const A64::LocationDescriptor descriptor{block.Location()};
|
const A64::LocationDescriptor descriptor{block.Location()};
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
@ -14,6 +16,7 @@
|
||||||
#include <mcl/bitsizeof.hpp>
|
#include <mcl/bitsizeof.hpp>
|
||||||
#include <tsl/robin_map.h>
|
#include <tsl/robin_map.h>
|
||||||
#include <tsl/robin_set.h>
|
#include <tsl/robin_set.h>
|
||||||
|
#include <xbyak/xbyak.h>
|
||||||
#include <xbyak/xbyak_util.h>
|
#include <xbyak/xbyak_util.h>
|
||||||
|
|
||||||
#include "dynarmic/backend/x64/exception_handler.h"
|
#include "dynarmic/backend/x64/exception_handler.h"
|
||||||
|
@ -58,8 +61,16 @@ struct EmitContext {
|
||||||
|
|
||||||
RegAlloc& reg_alloc;
|
RegAlloc& reg_alloc;
|
||||||
IR::Block& block;
|
IR::Block& block;
|
||||||
|
|
||||||
|
std::vector<std::function<void()>> deferred_emits;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using SharedLabel = std::shared_ptr<Xbyak::Label>;
|
||||||
|
|
||||||
|
inline SharedLabel GenSharedLabel() {
|
||||||
|
return std::make_shared<Xbyak::Label>();
|
||||||
|
}
|
||||||
|
|
||||||
class EmitX64 {
|
class EmitX64 {
|
||||||
public:
|
public:
|
||||||
struct BlockDescriptor {
|
struct BlockDescriptor {
|
||||||
|
|
Loading…
Reference in a new issue