[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH qemu v6 02/10] target/riscv: rvv: Add mask agnostic for vecto
From: |
Alistair Francis |
Subject: |
Re: [PATCH qemu v6 02/10] target/riscv: rvv: Add mask agnostic for vector load / store instructions |
Date: |
Thu, 21 Jul 2022 10:11:09 +1000 |
On Mon, Jun 20, 2022 at 4:51 PM ~eopxd <eopxd@git.sr.ht> wrote:
>
> From: Yueh-Ting (eop) Chen <eop.chen@sifive.com>
>
> Signed-off-by: eop Chen <eop.chen@sifive.com>
> Reviewed-by: Frank Chang <frank.chang@sifive.com>
> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/insn_trans/trans_rvv.c.inc | 5 ++++
> target/riscv/vector_helper.c | 35 +++++++++++++++++--------
> 2 files changed, 29 insertions(+), 11 deletions(-)
>
> diff --git a/target/riscv/insn_trans/trans_rvv.c.inc
> b/target/riscv/insn_trans/trans_rvv.c.inc
> index 5ec113f6fd..0627eda0c0 100644
> --- a/target/riscv/insn_trans/trans_rvv.c.inc
> +++ b/target/riscv/insn_trans/trans_rvv.c.inc
> @@ -712,6 +712,7 @@ static bool ld_us_op(DisasContext *s, arg_r2nfvm *a,
> uint8_t eew)
> data = FIELD_DP32(data, VDATA, LMUL, emul);
> data = FIELD_DP32(data, VDATA, NF, a->nf);
> data = FIELD_DP32(data, VDATA, VTA, s->vta);
> + data = FIELD_DP32(data, VDATA, VMA, s->vma);
> return ldst_us_trans(a->rd, a->rs1, data, fn, s, false);
> }
>
> @@ -777,6 +778,7 @@ static bool ld_us_mask_op(DisasContext *s, arg_vlm_v *a,
> uint8_t eew)
> data = FIELD_DP32(data, VDATA, NF, 1);
> /* Mask destination register are always tail-agnostic */
> data = FIELD_DP32(data, VDATA, VTA, s->cfg_vta_all_1s);
> + data = FIELD_DP32(data, VDATA, VMA, s->vma);
> return ldst_us_trans(a->rd, a->rs1, data, fn, s, false);
> }
>
> @@ -866,6 +868,7 @@ static bool ld_stride_op(DisasContext *s, arg_rnfvm *a,
> uint8_t eew)
> data = FIELD_DP32(data, VDATA, LMUL, emul);
> data = FIELD_DP32(data, VDATA, NF, a->nf);
> data = FIELD_DP32(data, VDATA, VTA, s->vta);
> + data = FIELD_DP32(data, VDATA, VMA, s->vma);
> return ldst_stride_trans(a->rd, a->rs1, a->rs2, data, fn, s, false);
> }
>
> @@ -996,6 +999,7 @@ static bool ld_index_op(DisasContext *s, arg_rnfvm *a,
> uint8_t eew)
> data = FIELD_DP32(data, VDATA, LMUL, emul);
> data = FIELD_DP32(data, VDATA, NF, a->nf);
> data = FIELD_DP32(data, VDATA, VTA, s->vta);
> + data = FIELD_DP32(data, VDATA, VMA, s->vma);
> return ldst_index_trans(a->rd, a->rs1, a->rs2, data, fn, s, false);
> }
>
> @@ -1114,6 +1118,7 @@ static bool ldff_op(DisasContext *s, arg_r2nfvm *a,
> uint8_t eew)
> data = FIELD_DP32(data, VDATA, LMUL, emul);
> data = FIELD_DP32(data, VDATA, NF, a->nf);
> data = FIELD_DP32(data, VDATA, VTA, s->vta);
> + data = FIELD_DP32(data, VDATA, VMA, s->vma);
> return ldff_trans(a->rd, a->rs1, data, fn, s);
> }
>
> diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
> index de895050e0..e3810d2bc3 100644
> --- a/target/riscv/vector_helper.c
> +++ b/target/riscv/vector_helper.c
> @@ -283,14 +283,18 @@ vext_ldst_stride(void *vd, void *v0, target_ulong base,
> uint32_t esz = 1 << log2_esz;
> uint32_t total_elems = vext_get_total_elems(env, desc, esz);
> uint32_t vta = vext_vta(desc);
> + uint32_t vma = vext_vma(desc);
>
> for (i = env->vstart; i < env->vl; i++, env->vstart++) {
> - if (!vm && !vext_elem_mask(v0, i)) {
> - continue;
> - }
> -
> k = 0;
> while (k < nf) {
> + if (!vm && !vext_elem_mask(v0, i)) {
> + /* set masked-off elements to 1s */
> + vext_set_elems_1s(vd, vma, (i + k * max_elems) * esz,
> + (i + k * max_elems + 1) * esz);
> + k++;
> + continue;
> + }
> target_ulong addr = base + stride * i + (k << log2_esz);
> ldst_elem(env, adjust_addr(env, addr), i + k * max_elems, vd,
> ra);
> k++;
> @@ -482,15 +486,19 @@ vext_ldst_index(void *vd, void *v0, target_ulong base,
> uint32_t esz = 1 << log2_esz;
> uint32_t total_elems = vext_get_total_elems(env, desc, esz);
> uint32_t vta = vext_vta(desc);
> + uint32_t vma = vext_vma(desc);
>
> /* load bytes from guest memory */
> for (i = env->vstart; i < env->vl; i++, env->vstart++) {
> - if (!vm && !vext_elem_mask(v0, i)) {
> - continue;
> - }
> -
> k = 0;
> while (k < nf) {
> + if (!vm && !vext_elem_mask(v0, i)) {
> + /* set masked-off elements to 1s */
> + vext_set_elems_1s(vd, vma, (i + k * max_elems) * esz,
> + (i + k * max_elems + 1) * esz);
> + k++;
> + continue;
> + }
> abi_ptr addr = get_index_addr(base, i, vs2) + (k << log2_esz);
> ldst_elem(env, adjust_addr(env, addr), i + k * max_elems, vd,
> ra);
> k++;
> @@ -579,6 +587,7 @@ vext_ldff(void *vd, void *v0, target_ulong base,
> uint32_t esz = 1 << log2_esz;
> uint32_t total_elems = vext_get_total_elems(env, desc, esz);
> uint32_t vta = vext_vta(desc);
> + uint32_t vma = vext_vma(desc);
> target_ulong addr, offset, remain;
>
> /* probe every access*/
> @@ -624,10 +633,14 @@ ProbeSuccess:
> }
> for (i = env->vstart; i < env->vl; i++) {
> k = 0;
> - if (!vm && !vext_elem_mask(v0, i)) {
> - continue;
> - }
> while (k < nf) {
> + if (!vm && !vext_elem_mask(v0, i)) {
> + /* set masked-off elements to 1s */
> + vext_set_elems_1s(vd, vma, (i + k * max_elems) * esz,
> + (i + k * max_elems + 1) * esz);
> + k++;
> + continue;
> + }
> target_ulong addr = base + ((i * nf + k) << log2_esz);
> ldst_elem(env, adjust_addr(env, addr), i + k * max_elems, vd,
> ra);
> k++;
> --
> 2.34.2
>
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [PATCH qemu v6 02/10] target/riscv: rvv: Add mask agnostic for vector load / store instructions,
Alistair Francis <=