Browse Source

rvv: check extra dst for index segment load

each segment register group has to follow overlapping rule

Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
pull/586/head
Chih-Min Chao 6 years ago
parent
commit
30a45bb89c
  1. 27
      riscv/decode.h

27
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; \

Loading…
Cancel
Save