From 611bfe49df44f02fd022b5d0c546475cc82d847c Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 1 May 2020 13:20:19 +0200 Subject: [PATCH] Display list of read and write registers. --- server/TracySourceView.cpp | 221 ++++++++++++++++++++++++------------- server/TracySourceView.hpp | 3 +- 2 files changed, 144 insertions(+), 80 deletions(-) diff --git a/server/TracySourceView.cpp b/server/TracySourceView.cpp index 349583c3..b324a3c0 100644 --- a/server/TracySourceView.cpp +++ b/server/TracySourceView.cpp @@ -47,6 +47,17 @@ static constexpr MicroArchUx s_uArchUx[] = { { "AMD Zen 2", "Ryzen 7 3700X", "ZEN2" }, }; +static constexpr const char* s_regNameX86[] = { + "invalid", + "rax", "rbx", "rcx", "rdx", "rsi", "rdi", "rbp", "rsp", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", + "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", "xmm16", "xmm17", "xmm18", "xmm19", + "xmm20", "xmm21", "xmm22", "xmm23", "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", + "xmm30", "xmm31", "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" +}; +static_assert( sizeof( s_regNameX86 ) / sizeof( *s_regNameX86 ) == (size_t)SourceView::RegsX86::NUMBER_OF_ENTRIES, "Invalid x86 register name table" ); + static SourceView::RegsX86 s_regMapX86[X86_REG_ENDING]; @@ -2077,104 +2088,156 @@ void SourceView::RenderAsmLine( const AsmLine& line, uint32_t ipcnt, uint32_t ip memcpy( buf+m_maxMnemonicLen, line.operands.c_str(), line.operands.size() + 1 ); ImGui::TextUnformatted( buf ); - if( asmVar && ImGui::IsItemHovered() ) + if( ImGui::IsItemHovered() ) { - const auto& var = *asmVar; - if( m_font ) ImGui::PopFont(); - ImGui::BeginTooltip(); - TextFocused( "Throughput:", RealToString( var.tp ) ); - ImGui::SameLine(); - TextDisabledUnformatted( "(cycles per instruction, lower is better)" ); - if( var.maxlat >= 0 ) + if( asmVar ) { - TextDisabledUnformatted( "Latency:" ); + const auto& var = *asmVar; + if( m_font ) ImGui::PopFont(); + ImGui::BeginTooltip(); + TextFocused( "Throughput:", RealToString( var.tp ) ); ImGui::SameLine(); - if( var.minlat == var.maxlat && var.minbound == var.maxbound ) + TextDisabledUnformatted( "(cycles per instruction, lower is better)" ); + if( var.maxlat >= 0 ) { - if( var.minbound ) + TextDisabledUnformatted( "Latency:" ); + ImGui::SameLine(); + if( var.minlat == var.maxlat && var.minbound == var.maxbound ) { - ImGui::Text( "\xe2\x89\xa4%s", RealToString( var.minlat ) ); + if( var.minbound ) + { + ImGui::Text( "\xe2\x89\xa4%s", RealToString( var.minlat ) ); + } + else + { + ImGui::TextUnformatted( RealToString( var.minlat ) ); + } } else { - ImGui::TextUnformatted( RealToString( var.minlat ) ); + if( var.minbound ) + { + ImGui::Text( "[\xe2\x89\xa4%s", RealToString( var.minlat ) ); + } + else + { + ImGui::Text( "[%s", RealToString( var.minlat ) ); + } + ImGui::SameLine( 0, 0 ); + if( var.maxbound ) + { + ImGui::Text( " \xE2\x80\x93 \xe2\x89\xa4%s]", RealToString( var.maxlat ) ); + } + else + { + ImGui::Text( " \xE2\x80\x93 %s]", RealToString( var.maxlat ) ); + } + } + ImGui::SameLine(); + TextDisabledUnformatted( "(cycles in execution, may vary by used output)" ); + } + TextFocused( "\xce\xbcops:", RealToString( var.uops ) ); + if( var.port != -1 ) TextFocused( "Ports:", PortList[var.port] ); + ImGui::Separator(); + TextFocused( "ISA set:", IsaList[var.isaSet] ); + TextDisabledUnformatted( "Operands:" ); + ImGui::SameLine(); + bool first = true; + for( int i=0; i