Browse Source

rvv: disasm: fix amo sub-opcode

Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
pull/535/head
Chih-Min Chao 6 years ago
parent
commit
526b9abb7c
  1. 9
      spike_main/disasm.cc

9
spike_main/disasm.cc

@ -1184,9 +1184,9 @@ disassembler_t::disassembler_t(int xlen)
std::vector<const arg_t *> v_fmt_amo = {&x0, &v_address, &vs2, &vd, &opt, &vm};
for (size_t elt = 0; elt <= 3; ++elt) {
const custom_fmt_t template_insn[] = {
{match_vamoswapei8_v | mask_wd, mask_vamoswapei8_v | mask_wd,
{match_vamoaddei8_v | mask_wd, mask_vamoaddei8_v | mask_wd,
"%sei%d.v", v_fmt_amo_wd},
{match_vamoswapei8_v, mask_vamoswapei8_v | mask_wd,
{match_vamoaddei8_v, mask_vamoaddei8_v | mask_wd,
"%sei%d.v", v_fmt_amo},
};
std::pair<const char*, reg_t> amo_map[] = {
@ -1199,7 +1199,7 @@ disassembler_t::disassembler_t(int xlen)
{"vamomax", 0x14ul << 27},
{"vamominu", 0x18ul << 27},
{"vamomaxu", 0x1cul << 27}};
const reg_t elt_map[] = {0x0ul << 12, 0x4ul << 12,
const reg_t elt_map[] = {0x0ul << 12, 0x5ul << 12,
0x6ul <<12, 0x7ul << 12};
for (size_t idx = 0; idx < sizeof(amo_map) / sizeof(amo_map[0]); ++idx) {
@ -1207,8 +1207,7 @@ disassembler_t::disassembler_t(int xlen)
char buf[128];
sprintf(buf, item.fmt, amo_map[idx].first, 8 << elt);
add_insn(new disasm_insn_t(buf,
(item.match & ~mask_width & ~mask_amoop) |
(amo_map[idx].second | elt_map[elt]),
item.match | amo_map[idx].second | elt_map[elt],
item.mask,
item.arg));
}

Loading…
Cancel
Save