aboutsummaryrefslogtreecommitdiff
path: root/disasm/disasm.cc
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2020-12-13 23:28:41 -0800
committerChih-Min Chao <chihmin.chao@sifive.com>2020-12-14 02:09:44 -0800
commite88a30c22957c2b75be8d6a0c69c3122d3d60b85 (patch)
treecec5ba8d134cde6007b587ae1c38e7bc8b3c2f8a /disasm/disasm.cc
parentbf3a588afd8445a572d1cef07abfd50c3db47f96 (diff)
downloadspike-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.zip
spike-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.tar.gz
spike-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.tar.bz2
disasm: show fench's predecessor and successor
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'disasm/disasm.cc')
-rw-r--r--disasm/disasm.cc26
1 files changed, 25 insertions, 1 deletions
diff --git a/disasm/disasm.cc b/disasm/disasm.cc
index 9fc3e20..e4358b0 100644
--- a/disasm/disasm.cc
+++ b/disasm/disasm.cc
@@ -353,6 +353,30 @@ struct : public arg_t {
}
} x0;
+struct : public arg_t {
+ std::string to_string(insn_t insn) const {
+ std::stringstream 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];
+ has_pre = true;
+ }
+ }
+
+ s << (has_pre ? "," : "");
+ for (int i = 3; i >= 0; --i) {
+ if (iorw & (1ul << i)) {
+ s << type[i];
+ }
+ }
+
+ return s.str();
+ }
+} iorw;
+
typedef struct {
reg_t match;
reg_t mask;
@@ -562,7 +586,7 @@ disassembler_t::disassembler_t(int xlen)
DEFINE_NOARG(mret);
DEFINE_NOARG(dret);
DEFINE_NOARG(wfi);
- DEFINE_NOARG(fence);
+ add_insn(new disasm_insn_t("fence", match_fence, mask_fence, {&iorw}));
DEFINE_NOARG(fence_i);
DEFINE_SFENCE_TYPE(sfence_vma);