Browse Source

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.
pull/839/head
Andrew Waterman 5 years ago
parent
commit
ddcfa6cc3d
  1. 31
      disasm/disasm.cc

31
disasm/disasm.cc

@ -124,11 +124,10 @@ struct : public arg_t {
struct : public arg_t { struct : public arg_t {
std::string to_string(insn_t insn) const { std::string to_string(insn_t insn) const {
std::stringstream s;
int32_t target = insn.sb_imm(); int32_t target = insn.sb_imm();
char sign = target >= 0 ? '+' : '-'; std::string s = target >= 0 ? "pc + " : "pc - ";
s << "pc " << sign << ' ' << abs(target); s += std::to_string(abs(target));
return s.str(); return s;
} }
} branch_target; } branch_target;
@ -260,21 +259,19 @@ struct : public arg_t {
struct : public arg_t { struct : public arg_t {
std::string to_string(insn_t insn) const { std::string to_string(insn_t insn) const {
std::stringstream s;
int32_t target = insn.rvc_b_imm(); int32_t target = insn.rvc_b_imm();
char sign = target >= 0 ? '+' : '-'; std::string s = target >= 0 ? "pc + " : "pc - ";
s << "pc " << sign << ' ' << abs(target); s += std::to_string(abs(target));
return s.str(); return s;
} }
} rvc_branch_target; } rvc_branch_target;
struct : public arg_t { struct : public arg_t {
std::string to_string(insn_t insn) const { std::string to_string(insn_t insn) const {
std::stringstream s;
int32_t target = insn.rvc_j_imm(); int32_t target = insn.rvc_j_imm();
char sign = target >= 0 ? '+' : '-'; std::string s = target >= 0 ? "pc + " : "pc - ";
s << "pc " << sign << ' ' << abs(target); s += std::to_string(abs(target));
return s.str(); return s;
} }
} rvc_jump_target; } rvc_jump_target;
@ -366,25 +363,25 @@ struct : public arg_t {
struct : public arg_t { struct : public arg_t {
std::string to_string(insn_t insn) const { std::string to_string(insn_t insn) const {
std::stringstream s; std::string s;
auto iorw = insn.iorw(); auto iorw = insn.iorw();
bool has_pre = false; bool has_pre = false;
static const char type[] = "wroi"; static const char type[] = "wroi";
for (int i = 7; i >= 4; --i) { for (int i = 7; i >= 4; --i) {
if (iorw & (1ul << i)) { if (iorw & (1ul << i)) {
s << type[i - 4]; s += type[i - 4];
has_pre = true; has_pre = true;
} }
} }
s << (has_pre ? "," : ""); s += (has_pre ? "," : "");
for (int i = 3; i >= 0; --i) { for (int i = 3; i >= 0; --i) {
if (iorw & (1ul << i)) { if (iorw & (1ul << i)) {
s << type[i]; s += type[i];
} }
} }
return s.str(); return s;
} }
} iorw; } iorw;

Loading…
Cancel
Save