verbose_debugging_output: Use actual names
This commit is contained in:
parent
8c9a3e16f5
commit
2636da8821
9 changed files with 15 additions and 20 deletions
|
@ -242,17 +242,16 @@ void RegAlloc::AssertNoMoreUses() const {
|
||||||
ASSERT(std::all_of(spills.begin(), spills.end(), is_empty));
|
ASSERT(std::all_of(spills.begin(), spills.end(), is_empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegAlloc::EmitVerboseDebuggingOutput(EmitContext& ctx) {
|
void RegAlloc::EmitVerboseDebuggingOutput() {
|
||||||
code.MOV(X19, mcl::bit_cast<u64>(&PrintVerboseDebuggingOutputLine)); // Non-volatile register
|
code.MOV(X19, mcl::bit_cast<u64>(&PrintVerboseDebuggingOutputLine)); // Non-volatile register
|
||||||
|
|
||||||
const auto do_location = [&](HostLocInfo& info, HostLocType type, size_t index) {
|
const auto do_location = [&](HostLocInfo& info, HostLocType type, size_t index) {
|
||||||
using namespace oaknut::util;
|
using namespace oaknut::util;
|
||||||
for (const IR::Inst* value : info.values) {
|
for (const IR::Inst* value : info.values) {
|
||||||
const auto inst_offset = std::distance(ctx.block.begin(), IR::Block::iterator(const_cast<IR::Inst*>(value)));
|
|
||||||
code.MOV(X0, SP);
|
code.MOV(X0, SP);
|
||||||
code.MOV(X1, static_cast<u64>(type));
|
code.MOV(X1, static_cast<u64>(type));
|
||||||
code.MOV(X2, index);
|
code.MOV(X2, index);
|
||||||
code.MOV(X3, mcl::bit_cast<u64>(inst_offset));
|
code.MOV(X3, value->GetName());
|
||||||
code.MOV(X4, static_cast<u64>(value->GetType()));
|
code.MOV(X4, static_cast<u64>(value->GetType()));
|
||||||
code.BLR(X19);
|
code.BLR(X19);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
namespace Dynarmic::Backend::Arm64 {
|
namespace Dynarmic::Backend::Arm64 {
|
||||||
|
|
||||||
struct EmitContext;
|
|
||||||
class FpsrManager;
|
class FpsrManager;
|
||||||
class RegAlloc;
|
class RegAlloc;
|
||||||
|
|
||||||
|
@ -296,7 +295,7 @@ public:
|
||||||
void AssertAllUnlocked() const;
|
void AssertAllUnlocked() const;
|
||||||
void AssertNoMoreUses() const;
|
void AssertNoMoreUses() const;
|
||||||
|
|
||||||
void EmitVerboseDebuggingOutput(EmitContext& ctx);
|
void EmitVerboseDebuggingOutput();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend struct Argument;
|
friend struct Argument;
|
||||||
|
|
|
@ -33,7 +33,7 @@ void EmitVerboseDebuggingOutput(oaknut::CodeGenerator& code, EmitContext& ctx) {
|
||||||
code.ADD(X0, SP, sizeof(RegisterData) + offsetof(StackLayout, spill));
|
code.ADD(X0, SP, sizeof(RegisterData) + offsetof(StackLayout, spill));
|
||||||
code.STR(X0, SP, offsetof(RegisterData, spill));
|
code.STR(X0, SP, offsetof(RegisterData, spill));
|
||||||
|
|
||||||
ctx.reg_alloc.EmitVerboseDebuggingOutput(ctx);
|
ctx.reg_alloc.EmitVerboseDebuggingOutput();
|
||||||
|
|
||||||
code.LDR(X0, SP, offsetof(RegisterData, nzcv));
|
code.LDR(X0, SP, offsetof(RegisterData, nzcv));
|
||||||
code.MSR(oaknut::SystemReg::NZCV, X0);
|
code.MSR(oaknut::SystemReg::NZCV, X0);
|
||||||
|
|
|
@ -150,7 +150,7 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) {
|
||||||
reg_alloc.EndOfAllocScope();
|
reg_alloc.EndOfAllocScope();
|
||||||
|
|
||||||
if (conf.very_verbose_debugging_output) {
|
if (conf.very_verbose_debugging_output) {
|
||||||
EmitVerboseDebuggingOutput(reg_alloc, block);
|
EmitVerboseDebuggingOutput(reg_alloc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,7 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) {
|
||||||
ctx.reg_alloc.EndOfAllocScope();
|
ctx.reg_alloc.EndOfAllocScope();
|
||||||
|
|
||||||
if (conf.very_verbose_debugging_output) {
|
if (conf.very_verbose_debugging_output) {
|
||||||
EmitVerboseDebuggingOutput(reg_alloc, block);
|
EmitVerboseDebuggingOutput(reg_alloc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ void EmitX64::PushRSBHelper(Xbyak::Reg64 loc_desc_reg, Xbyak::Reg64 index_reg, I
|
||||||
code.mov(dword[r15 + code.GetJitStateInfo().offsetof_rsb_ptr], index_reg.cvt32());
|
code.mov(dword[r15 + code.GetJitStateInfo().offsetof_rsb_ptr], index_reg.cvt32());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitX64::EmitVerboseDebuggingOutput(RegAlloc& reg_alloc, const IR::Block& block) {
|
void EmitX64::EmitVerboseDebuggingOutput(RegAlloc& reg_alloc) {
|
||||||
code.sub(rsp, sizeof(RegisterData));
|
code.sub(rsp, sizeof(RegisterData));
|
||||||
code.stmxcsr(dword[rsp + offsetof(RegisterData, mxcsr)]);
|
code.stmxcsr(dword[rsp + offsetof(RegisterData, mxcsr)]);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
|
@ -114,7 +114,7 @@ void EmitX64::EmitVerboseDebuggingOutput(RegAlloc& reg_alloc, const IR::Block& b
|
||||||
code.lea(rax, ptr[rsp + sizeof(RegisterData) + offsetof(StackLayout, spill)]);
|
code.lea(rax, ptr[rsp + sizeof(RegisterData) + offsetof(StackLayout, spill)]);
|
||||||
code.mov(xword[rsp + offsetof(RegisterData, spill)], rax);
|
code.mov(xword[rsp + offsetof(RegisterData, spill)], rax);
|
||||||
|
|
||||||
reg_alloc.EmitVerboseDebuggingOutput(block);
|
reg_alloc.EmitVerboseDebuggingOutput();
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
if (rsp.getIdx() == i) {
|
if (rsp.getIdx() == i) {
|
||||||
|
|
|
@ -107,7 +107,7 @@ protected:
|
||||||
BlockDescriptor RegisterBlock(const IR::LocationDescriptor& location_descriptor, CodePtr entrypoint, size_t size);
|
BlockDescriptor RegisterBlock(const IR::LocationDescriptor& location_descriptor, CodePtr entrypoint, 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);
|
||||||
|
|
||||||
void EmitVerboseDebuggingOutput(RegAlloc& reg_alloc, const IR::Block& block);
|
void EmitVerboseDebuggingOutput(RegAlloc& reg_alloc);
|
||||||
|
|
||||||
// Terminal instruction emitters
|
// Terminal instruction emitters
|
||||||
void EmitTerminal(IR::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step);
|
void EmitTerminal(IR::Terminal terminal, IR::LocationDescriptor initial_location, bool is_single_step);
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "dynarmic/backend/x64/abi.h"
|
#include "dynarmic/backend/x64/abi.h"
|
||||||
#include "dynarmic/backend/x64/stack_layout.h"
|
#include "dynarmic/backend/x64/stack_layout.h"
|
||||||
#include "dynarmic/backend/x64/verbose_debugging_output.h"
|
#include "dynarmic/backend/x64/verbose_debugging_output.h"
|
||||||
#include "dynarmic/ir/basic_block.h"
|
|
||||||
|
|
||||||
namespace Dynarmic::Backend::X64 {
|
namespace Dynarmic::Backend::X64 {
|
||||||
|
|
||||||
|
@ -158,13 +157,12 @@ void HostLocInfo::AddValue(IR::Inst* inst) {
|
||||||
max_bit_width = std::max(max_bit_width, GetBitWidth(inst->GetType()));
|
max_bit_width = std::max(max_bit_width, GetBitWidth(inst->GetType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void HostLocInfo::EmitVerboseDebuggingOutput(BlockOfCode& code, size_t host_loc_index, const IR::Block& block) const {
|
void HostLocInfo::EmitVerboseDebuggingOutput(BlockOfCode& code, size_t host_loc_index) const {
|
||||||
using namespace Xbyak::util;
|
using namespace Xbyak::util;
|
||||||
for (IR::Inst* value : values) {
|
for (IR::Inst* value : values) {
|
||||||
const auto inst_offset = std::distance(block.begin(), IR::Block::const_iterator(value));
|
|
||||||
code.mov(code.ABI_PARAM1, rsp);
|
code.mov(code.ABI_PARAM1, rsp);
|
||||||
code.mov(code.ABI_PARAM2, host_loc_index);
|
code.mov(code.ABI_PARAM2, host_loc_index);
|
||||||
code.mov(code.ABI_PARAM3, mcl::bit_cast<u64>(inst_offset));
|
code.mov(code.ABI_PARAM3, value->GetName());
|
||||||
code.mov(code.ABI_PARAM4, GetBitWidth(value->GetType()));
|
code.mov(code.ABI_PARAM4, GetBitWidth(value->GetType()));
|
||||||
code.CallFunction(PrintVerboseDebuggingOutputLine);
|
code.CallFunction(PrintVerboseDebuggingOutputLine);
|
||||||
}
|
}
|
||||||
|
@ -515,9 +513,9 @@ void RegAlloc::AssertNoMoreUses() {
|
||||||
ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), [](const auto& i) { return i.IsEmpty(); }));
|
ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), [](const auto& i) { return i.IsEmpty(); }));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegAlloc::EmitVerboseDebuggingOutput(const IR::Block& block) {
|
void RegAlloc::EmitVerboseDebuggingOutput() {
|
||||||
for (size_t i = 0; i < hostloc_info.size(); i++) {
|
for (size_t i = 0; i < hostloc_info.size(); i++) {
|
||||||
hostloc_info[i].EmitVerboseDebuggingOutput(code, i, block);
|
hostloc_info[i].EmitVerboseDebuggingOutput(code, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
namespace Dynarmic::IR {
|
namespace Dynarmic::IR {
|
||||||
enum class AccType;
|
enum class AccType;
|
||||||
class Block;
|
|
||||||
} // namespace Dynarmic::IR
|
} // namespace Dynarmic::IR
|
||||||
|
|
||||||
namespace Dynarmic::Backend::X64 {
|
namespace Dynarmic::Backend::X64 {
|
||||||
|
@ -49,7 +48,7 @@ public:
|
||||||
|
|
||||||
void AddValue(IR::Inst* inst);
|
void AddValue(IR::Inst* inst);
|
||||||
|
|
||||||
void EmitVerboseDebuggingOutput(BlockOfCode& code, size_t host_loc_index, const IR::Block& block) const;
|
void EmitVerboseDebuggingOutput(BlockOfCode& code, size_t host_loc_index) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Current instruction state
|
// Current instruction state
|
||||||
|
@ -148,7 +147,7 @@ public:
|
||||||
|
|
||||||
void AssertNoMoreUses();
|
void AssertNoMoreUses();
|
||||||
|
|
||||||
void EmitVerboseDebuggingOutput(const IR::Block& block);
|
void EmitVerboseDebuggingOutput();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend struct Argument;
|
friend struct Argument;
|
||||||
|
|
Loading…
Reference in a new issue