diff options
author | Chih-Min Chao <chihmin.chao@sifive.com> | 2020-12-13 23:28:41 -0800 |
---|---|---|
committer | Chih-Min Chao <chihmin.chao@sifive.com> | 2020-12-14 02:09:44 -0800 |
commit | e88a30c22957c2b75be8d6a0c69c3122d3d60b85 (patch) | |
tree | cec5ba8d134cde6007b587ae1c38e7bc8b3c2f8a /disasm | |
parent | bf3a588afd8445a572d1cef07abfd50c3db47f96 (diff) | |
download | riscv-isa-sim-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.zip riscv-isa-sim-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.tar.gz riscv-isa-sim-e88a30c22957c2b75be8d6a0c69c3122d3d60b85.tar.bz2 |
disasm: show fench's predecessor and successor
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'disasm')
-rw-r--r-- | disasm/disasm.cc | 26 |
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); |