aboutsummaryrefslogtreecommitdiff
path: root/disasm/disasm.cc
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2021-10-18 19:21:47 -0700
committerAndrew Waterman <andrew@sifive.com>2021-10-18 19:21:47 -0700
commitddcfa6cc3d80818140a459e590296c3079c5a3ec (patch)
treeb1c1fa75a969cb8698a12062a74c3adf484764c8 /disasm/disasm.cc
parent3490b195c7e31c360766ef2894b3a426dc8864c5 (diff)
downloadspike-ddcfa6cc3d80818140a459e590296c3079c5a3ec.zip
spike-ddcfa6cc3d80818140a459e590296c3079c5a3ec.tar.gz
spike-ddcfa6cc3d80818140a459e590296c3079c5a3ec.tar.bz2
Speed up operand disassembly
Stringstream is very slow, so avoid using it in cases where simply using a string doesn't make the code too ugly.
Diffstat (limited to 'disasm/disasm.cc')
-rw-r--r--disasm/disasm.cc31
1 files changed, 14 insertions, 17 deletions
diff --git a/disasm/disasm.cc b/disasm/disasm.cc
index e441f99..68567ad 100644
--- a/disasm/disasm.cc
+++ b/disasm/disasm.cc
@@ -124,11 +124,10 @@ struct : public arg_t {
struct : public arg_t {
std::string to_string(insn_t insn) const {
- std::stringstream s;
int32_t target = insn.sb_imm();
- char sign = target >= 0 ? '+' : '-';
- s << "pc " << sign << ' ' << abs(target);
- return s.str();
+ std::string s = target >= 0 ? "pc + " : "pc - ";
+ s += std::to_string(abs(target));
+ return s;
}
} branch_target;
@@ -260,21 +259,19 @@ struct : public arg_t {
struct : public arg_t {
std::string to_string(insn_t insn) const {
- std::stringstream s;
int32_t target = insn.rvc_b_imm();
- char sign = target >= 0 ? '+' : '-';
- s << "pc " << sign << ' ' << abs(target);
- return s.str();
+ std::string s = target >= 0 ? "pc + " : "pc - ";
+ s += std::to_string(abs(target));
+ return s;
}
} rvc_branch_target;
struct : public arg_t {
std::string to_string(insn_t insn) const {
- std::stringstream s;
int32_t target = insn.rvc_j_imm();
- char sign = target >= 0 ? '+' : '-';
- s << "pc " << sign << ' ' << abs(target);
- return s.str();
+ std::string s = target >= 0 ? "pc + " : "pc - ";
+ s += std::to_string(abs(target));
+ return s;
}
} rvc_jump_target;
@@ -366,25 +363,25 @@ struct : public arg_t {
struct : public arg_t {
std::string to_string(insn_t insn) const {
- std::stringstream s;
+ std::string s;
auto iorw = insn.iorw();
bool has_pre = false;
static const char type[] = "wroi";
for (int i = 7; i >= 4; --i) {
if (iorw & (1ul << i)) {
- s << type[i - 4];
+ s += type[i - 4];
has_pre = true;
}
}
- s << (has_pre ? "," : "");
+ s += (has_pre ? "," : "");
for (int i = 3; i >= 0; --i) {
if (iorw & (1ul << i)) {
- s << type[i];
+ s += type[i];
}
}
- return s.str();
+ return s;
}
} iorw;