diff --git a/riscv/decode.h b/riscv/decode.h index 390e3d16..b4bb2e67 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -487,19 +487,22 @@ static inline bool is_aligned(const unsigned val, const unsigned pos) #define VI_CHECK_LD_INDEX(elt_width) \ VI_CHECK_ST_INDEX(elt_width); \ - if (elt_width > P.VU.vsew) { \ - if (insn.rd() != insn.rs2()) \ - require_noover(insn.rd(), P.VU.vflmul, insn.rs2(), vemul); \ - } else if (elt_width < P.VU.vsew) { \ - if (vemul < 1) {\ - require_noover(insn.rd(), P.VU.vflmul, insn.rs2(), vemul); \ - } else {\ - require_noover_widen(insn.rd(), P.VU.vflmul, insn.rs2(), vemul); \ + for (reg_t idx = 0; idx < nf; ++idx) { \ + reg_t flmul = P.VU.vflmul < 1 ? 1 : P.VU.vflmul; \ + reg_t seg_vd = insn.rd() + flmul * idx; \ + if (elt_width > P.VU.vsew) { \ + if (seg_vd != insn.rs2()) \ + require_noover(seg_vd, P.VU.vflmul, insn.rs2(), vemul); \ + } else if (elt_width < P.VU.vsew) { \ + if (vemul < 1) {\ + require_noover(seg_vd, P.VU.vflmul, insn.rs2(), vemul); \ + } else {\ + require_noover_widen(seg_vd, P.VU.vflmul, insn.rs2(), vemul); \ + } \ + } \ + if (nf >= 2) { \ + require_noover(seg_vd, P.VU.vflmul, insn.rs2(), vemul); \ } \ - } \ - if (insn.v_nf() > 0) {\ - require_noover(insn.rd(), P.VU.vflmul, insn.rs2(), vemul); \ - require_noover(vd, nf, insn.rs2(), 1); \ } \ require_vm; \ diff --git a/riscv/execute.cc b/riscv/execute.cc index 9a91ce69..a810d53c 100644 --- a/riscv/execute.cc +++ b/riscv/execute.cc @@ -76,7 +76,7 @@ static void commit_log_print_insn(processor_t *p, reg_t pc, insn_t insn) int flen = p->get_state()->last_inst_flen; // print core id on all lines so it is easy to grep - fprintf(log_file, "core%4" PRId64 ": ", p->get_id()); + fprintf(log_file, "core%4" PRId32 ": ", p->get_id()); fprintf(log_file, "%1d ", priv); commit_log_print_value(log_file, xlen, pc);