diff options
author | Andrew Waterman <andrew@sifive.com> | 2021-10-18 19:21:47 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2021-10-18 19:21:47 -0700 |
commit | ddcfa6cc3d80818140a459e590296c3079c5a3ec (patch) | |
tree | b1c1fa75a969cb8698a12062a74c3adf484764c8 /disasm/disasm.cc | |
parent | 3490b195c7e31c360766ef2894b3a426dc8864c5 (diff) | |
download | spike-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.cc | 31 |
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; |