Merge pull request #596 from degasus/fix_perf_register
backend/x64: Fix PerfMapRegister usages.
This commit is contained in:
commit
71491c0a4a
5 changed files with 19 additions and 4 deletions
|
@ -115,6 +115,9 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) {
|
||||||
// Start emitting.
|
// Start emitting.
|
||||||
code.align();
|
code.align();
|
||||||
const u8* const entrypoint = code.getCurr();
|
const u8* const entrypoint = code.getCurr();
|
||||||
|
code.SwitchToFarCode();
|
||||||
|
const u8* const entrypoint_far = code.getCurr();
|
||||||
|
code.SwitchToNearCode();
|
||||||
|
|
||||||
EmitCondPrelude(ctx);
|
EmitCondPrelude(ctx);
|
||||||
|
|
||||||
|
@ -160,7 +163,7 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) {
|
||||||
const auto range = boost::icl::discrete_interval<u32>::closed(descriptor.PC(), end_location.PC() - 1);
|
const auto range = boost::icl::discrete_interval<u32>::closed(descriptor.PC(), end_location.PC() - 1);
|
||||||
block_ranges.AddRange(range, descriptor);
|
block_ranges.AddRange(range, descriptor);
|
||||||
|
|
||||||
return RegisterBlock(descriptor, entrypoint, size);
|
return RegisterBlock(descriptor, entrypoint, entrypoint_far, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void A32EmitX64::ClearCache() {
|
void A32EmitX64::ClearCache() {
|
||||||
|
|
|
@ -81,6 +81,9 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) {
|
||||||
// Start emitting.
|
// Start emitting.
|
||||||
code.align();
|
code.align();
|
||||||
const u8* const entrypoint = code.getCurr();
|
const u8* const entrypoint = code.getCurr();
|
||||||
|
code.SwitchToFarCode();
|
||||||
|
const u8* const entrypoint_far = code.getCurr();
|
||||||
|
code.SwitchToNearCode();
|
||||||
|
|
||||||
ASSERT(block.GetCondition() == IR::Cond::AL);
|
ASSERT(block.GetCondition() == IR::Cond::AL);
|
||||||
|
|
||||||
|
@ -126,7 +129,7 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) {
|
||||||
const auto range = boost::icl::discrete_interval<u64>::closed(descriptor.PC(), end_location.PC() - 1);
|
const auto range = boost::icl::discrete_interval<u64>::closed(descriptor.PC(), end_location.PC() - 1);
|
||||||
block_ranges.AddRange(range, descriptor);
|
block_ranges.AddRange(range, descriptor);
|
||||||
|
|
||||||
return RegisterBlock(descriptor, entrypoint, size);
|
return RegisterBlock(descriptor, entrypoint, entrypoint_far, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::ClearCache() {
|
void A64EmitX64::ClearCache() {
|
||||||
|
@ -358,6 +361,7 @@ void A64EmitX64::GenTerminalHandlers() {
|
||||||
code.and_(code.ABI_PARAM1.cvt32(), fast_dispatch_table_mask);
|
code.and_(code.ABI_PARAM1.cvt32(), fast_dispatch_table_mask);
|
||||||
code.lea(code.ABI_RETURN, code.ptr[code.ABI_PARAM1 + code.ABI_PARAM2]);
|
code.lea(code.ABI_RETURN, code.ptr[code.ABI_PARAM1 + code.ABI_PARAM2]);
|
||||||
code.ret();
|
code.ret();
|
||||||
|
PerfMapRegister(fast_dispatch_table_lookup, code.getCurr(), "a64_fast_dispatch_table_lookup");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -264,8 +264,11 @@ Xbyak::Label EmitX64::EmitCond(IR::Cond cond) {
|
||||||
return pass;
|
return pass;
|
||||||
}
|
}
|
||||||
|
|
||||||
EmitX64::BlockDescriptor EmitX64::RegisterBlock(const IR::LocationDescriptor& descriptor, CodePtr entrypoint, size_t size) {
|
EmitX64::BlockDescriptor EmitX64::RegisterBlock(const IR::LocationDescriptor& descriptor, CodePtr entrypoint, CodePtr entrypoint_far, size_t size) {
|
||||||
PerfMapRegister(entrypoint, code.getCurr(), LocationDescriptorToFriendlyName(descriptor));
|
PerfMapRegister(entrypoint, code.getCurr(), LocationDescriptorToFriendlyName(descriptor));
|
||||||
|
code.SwitchToFarCode();
|
||||||
|
PerfMapRegister(entrypoint_far, code.getCurr(), LocationDescriptorToFriendlyName(descriptor) + "_far");
|
||||||
|
code.SwitchToNearCode();
|
||||||
Patch(descriptor, entrypoint);
|
Patch(descriptor, entrypoint);
|
||||||
|
|
||||||
BlockDescriptor block_desc{entrypoint, size};
|
BlockDescriptor block_desc{entrypoint, size};
|
||||||
|
|
|
@ -94,7 +94,7 @@ protected:
|
||||||
virtual std::string LocationDescriptorToFriendlyName(const IR::LocationDescriptor&) const = 0;
|
virtual std::string LocationDescriptorToFriendlyName(const IR::LocationDescriptor&) const = 0;
|
||||||
void EmitAddCycles(size_t cycles);
|
void EmitAddCycles(size_t cycles);
|
||||||
Xbyak::Label EmitCond(IR::Cond cond);
|
Xbyak::Label EmitCond(IR::Cond cond);
|
||||||
BlockDescriptor RegisterBlock(const IR::LocationDescriptor& location_descriptor, CodePtr entrypoint, size_t size);
|
BlockDescriptor RegisterBlock(const IR::LocationDescriptor& location_descriptor, CodePtr entrypoint, CodePtr entrypoint_far, size_t size);
|
||||||
void PushRSBHelper(Xbyak::Reg64 loc_desc_reg, Xbyak::Reg64 index_reg, IR::LocationDescriptor target);
|
void PushRSBHelper(Xbyak::Reg64 loc_desc_reg, Xbyak::Reg64 index_reg, IR::LocationDescriptor target);
|
||||||
|
|
||||||
// Terminal instruction emitters
|
// Terminal instruction emitters
|
||||||
|
|
|
@ -47,6 +47,11 @@ void OpenFile() {
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
void PerfMapRegister(const void* start, const void* end, std::string_view friendly_name) {
|
void PerfMapRegister(const void* start, const void* end, std::string_view friendly_name) {
|
||||||
|
if (start == end) {
|
||||||
|
// Nothing to register
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::lock_guard guard{mutex};
|
std::lock_guard guard{mutex};
|
||||||
|
|
||||||
if (!file) {
|
if (!file) {
|
||||||
|
|
Loading…
Reference in a new issue