SPU Debugger: Implement float registers view + General debugger fixes (#9265)

* SPU Debugger: Fix try_get_insert_mask_info
* Debugger: Always update thread state on context's data change
No longer needing to press on thread's instructions for actions to work!
This commit is contained in:
Eladash 2020-11-15 07:45:28 +02:00 committed by GitHub
parent dfae7bd073
commit b1710bb712
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 67 additions and 22 deletions

View file

@ -1194,9 +1194,11 @@ std::string spu_thread::dump_regs() const
{
std::string ret;
const bool floats_only = debugger_float_mode.load();
for (u32 i = 0; i < 128; i++, ret += '\n')
{
fmt::append(ret, "r%d: ", i);
fmt::append(ret, "%s: ", spu_reg_name[i]);
const auto r = gpr[i];
@ -1217,9 +1219,25 @@ std::string spu_thread::dump_regs() const
}
}
const u32 i3 = r._u32[3];
auto to_f64 = [](u32 bits)
{
const u32 abs = bits & 0x7fff'ffff;
constexpr u32 scale = (1 << 23);
return std::copysign(abs < scale ? 0 : std::ldexp((scale + (abs % scale)) / f64{scale}, static_cast<int>(abs >> 23) - 127), bits >> 31 ? -1 : 1);
};
if (v128::from32p(i3) == r)
const double array[]{to_f64(r.u32r[0]), to_f64(r.u32r[1]), to_f64(r.u32r[2]), to_f64(r.u32r[3])};
const u32 i3 = r._u32[3];
const bool is_packed = v128::from32p(i3) == r;
if (floats_only)
{
fmt::append(ret, "%g, %g, %g, %g", array[0], array[1], array[2], array[3]);
continue;
}
if (is_packed)
{
// Shortand formatting
fmt::append(ret, "%08x", i3);
@ -1229,8 +1247,6 @@ std::string spu_thread::dump_regs() const
fmt::append(ret, "%08x %08x %08x %08x", r.u32r[0], r.u32r[1], r.u32r[2], r.u32r[3]);
}
// TODO: SPU floats fomatting
if (i3 >= 0x80 && is_exec_code(i3))
{
SPUDisAsm dis_asm(CPUDisAsm_NormalMode);
@ -1239,6 +1255,18 @@ std::string spu_thread::dump_regs() const
dis_asm.disasm(i3);
fmt::append(ret, " -> %s", dis_asm.last_opcode);
}
if (std::any_of(std::begin(array), std::end(array), [](f64 v){ return v != 0; }))
{
if (is_packed)
{
fmt::append(ret, " (%g)", array[0]);
}
else
{
fmt::append(ret, " (%g, %g, %g, %g)", array[0], array[1], array[2], array[3]);
}
}
}
const auto events = ch_events.load();