fix decode instruction logging

This commit is contained in:
Blaise Tine
2021-06-16 01:35:31 -04:00
parent 1e677c8e5e
commit 7ce0127e37

View File

@@ -193,30 +193,54 @@ static const char* op_string(const Instr &instr) {
namespace vortex { namespace vortex {
std::ostream &operator<<(std::ostream &os, const Instr &instr) { std::ostream &operator<<(std::ostream &os, const Instr &instr) {
os << op_string(instr) << ": "; os << op_string(instr) << ": ";
int rdt = instr.getRDType(); auto opcode = instr.getOpcode();
int rd = instr.getRDest();
switch (rdt) { auto rd_to_string = [&]() {
case 1: os << "r" << std::dec << rd << " <- "; break; int rdt = instr.getRDType();
case 2: os << "fr" << std::dec << rd << " <- "; break; int rd = instr.getRDest();
case 3: os << "vr" << std::dec << rd << " <- "; break; switch (rdt) {
default: break; case 1: os << "r" << std::dec << rd << " <- "; break;
} case 2: os << "fr" << std::dec << rd << " <- "; break;
int i = 0; case 3: os << "vr" << std::dec << rd << " <- "; break;
for (; i < instr.getNRSrc(); ++i) { default: break;
}
};
auto rs_to_string = [&](int i) {
int rst = instr.getRSType(i); int rst = instr.getRSType(i);
int rs = instr.getRSrc(i); int rs = instr.getRSrc(i);
if (i) os << ", ";
switch (rst) { switch (rst) {
case 1: os << "r" << std::dec << rs; break; case 1: os << "r" << std::dec << rs; break;
case 2: os << "fr" << std::dec << rs; break; case 2: os << "fr" << std::dec << rs; break;
case 3: os << "vr" << std::dec << rs; break; case 3: os << "vr" << std::dec << rs; break;
default: break; default: break;
} }
};
if (opcode == S_INST
|| opcode == FS
|| opcode == VS) {
os << "M[r" << std::dec << instr.getRSrc(0) << " + 0x" << std::hex << instr.getImm() << "] <- ";
rs_to_string(1);
} else
if (opcode == L_INST
|| opcode == FL
|| opcode == VL) {
rd_to_string();
os << "M[r" << std::dec << instr.getRSrc(0) << " + 0x" << std::hex << instr.getImm() << "]";
} else {
rd_to_string();
int i = 0;
for (; i < instr.getNRSrc(); ++i) {
if (i) os << ", ";
rs_to_string(i);
}
if (instr.hasImm()) {
if (i) os << ", ";
os << "imm=0x" << std::hex << instr.getImm();
}
} }
if (instr.hasImm()) {
if (i) os << ", ";
os << "imm=0x" << std::hex << instr.getImm();
}
return os; return os;
} }
} }