On Tue, Jul 21, 2020 at 6:38 AM LIU Zhiwei <zhiwei_...@c-sky.com> wrote:
>
> Although not explicitly specified that the the destination
> vector register groups cannot overlap the source vector register group,
> it is still necessary.
>
> And this constraint has been added to the v0.8 spec.
>
> Signed-off-by: LIU Zhiwei <zhiwei_...@c-sky.com>

Reviewed-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  target/riscv/insn_trans/trans_rvv.inc.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
> b/target/riscv/insn_trans/trans_rvv.inc.c
> index 7b4752b911..887c6b8883 100644
> --- a/target/riscv/insn_trans/trans_rvv.inc.c
> +++ b/target/riscv/insn_trans/trans_rvv.inc.c
> @@ -513,13 +513,21 @@ static bool ld_index_op(DisasContext *s, arg_rnfvm *a, 
> uint8_t seq)
>      return ldst_index_trans(a->rd, a->rs1, a->rs2, data, fn, s);
>  }
>
> +/*
> + * For vector indexed segment loads, the destination vector register
> + * groups cannot overlap the source vector register group (specified by
> + * `vs2`), else an illegal instruction exception is raised.
> + */
>  static bool ld_index_check(DisasContext *s, arg_rnfvm* a)
>  {
>      return (vext_check_isa_ill(s) &&
>              vext_check_overlap_mask(s, a->rd, a->vm, false) &&
>              vext_check_reg(s, a->rd, false) &&
>              vext_check_reg(s, a->rs2, false) &&
> -            vext_check_nf(s, a->nf));
> +            vext_check_nf(s, a->nf) &&
> +            ((a->nf == 1) ||
> +             vext_check_overlap_group(a->rd, a->nf << s->lmul,
> +                                      a->rs2, 1 << s->lmul)));
>  }
>
>  GEN_VEXT_TRANS(vlxb_v, 0, rnfvm, ld_index_op, ld_index_check)
> --
> 2.23.0
>
>

Reply via email to