On Thu, 2026-08-20 at 21:03 -0700, Richard Henderson wrote:
> Provide a helper that calls ldst_tlb for all NF vectors.
> 
> Signed-off-by: Richard Henderson <[email protected]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  target/riscv/tcg/vector_helper.c | 77 +++++++++++++++---------------
> --
>  1 file changed, 35 insertions(+), 42 deletions(-)
> 
> diff --git a/target/riscv/tcg/vector_helper.c
> b/target/riscv/tcg/vector_helper.c
> index 20a8f95efb..b04d461c08 100644
> --- a/target/riscv/tcg/vector_helper.c
> +++ b/target/riscv/tcg/vector_helper.c
> @@ -337,6 +337,16 @@ static void vext_set_nf_elems_1s(void *vd,
> uint32_t i, uint32_t nf,
>      }
>  }
>  
> +static void vext_ldst_nf_tlb(CPURISCVState *env, void *vd,
> target_ulong addr,
> +                             uint32_t i, uint32_t nf,
> +                             uint32_t esz, uint32_t max_elems,
> +                             vext_ldst_elem_fn_tlb *ldst_tlb,
> uintptr_t ra)
> +{
> +    for (uint32_t k = 0; k < nf; k++, addr += esz) {
> +        ldst_tlb(env, adjust_addr(env, addr), i + k * max_elems, vd,
> ra);
> +    }
> +}
> +
>  /*
>   * stride: access vector element from strided memory
>   */
> @@ -354,16 +364,11 @@ vext_ldst_stride(void *vd, void *v0,
> target_ulong base, target_ulong stride,
>      VSTART_CHECK_EARLY_EXIT(env, env->vl);
>  
>      for (uint32_t i = env->vstart; i < env->vl; env->vstart = ++i) {
> -        if (!vm && !vext_elem_mask(v0, i)) {
> -            if (vma) {
> -                vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
> -            }
> -            continue;
> -        }
> -
> -        for (uint32_t k = 0; k < nf; ++k) {
> -            target_ulong addr = base + stride * i + (k << log2_esz);
> -            ldst_elem(env, adjust_addr(env, addr), i + k *
> max_elems, vd, ra);
> +        if (vm || vext_elem_mask(v0, i)) {
> +            vext_ldst_nf_tlb(env, vd, base + stride * i, i, nf,
> +                             esz, max_elems, ldst_elem, ra);
> +        } else if (vma) {
> +            vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
>          }
>      }
>  
> @@ -417,6 +422,7 @@ vext_page_ldst_us(CPURISCVState *env, void *vd,
> target_ulong addr,
>      int i, k, flags;
>      uint32_t esz = 1 << log2_esz;
>      uint32_t size = (elems * nf) << log2_esz;
> +    uint32_t msize = nf * esz;
>      uint32_t evl = env->vstart + elems;
>      MMUAccessType access_type = is_load ? MMU_DATA_LOAD :
> MMU_DATA_STORE;
>  
> @@ -459,15 +465,10 @@ vext_page_ldst_us(CPURISCVState *env, void *vd,
> target_ulong addr,
>              vext_continuous_ldst_tlb(env, ldst_tlb, vd, evl, addr,
> env->vstart,
>                                     ra, esz, is_load);
>          } else {
> -            /* load bytes from guest memory */
>              for (i = env->vstart; i < evl; env->vstart = ++i) {
> -                k = 0;
> -                while (k < nf) {
> -                    ldst_tlb(env, adjust_addr(env, addr), i + k *
> max_elems,
> -                             vd, ra);
> -                    addr += esz;
> -                    k++;
> -                }
> +                vext_ldst_nf_tlb(env, vd, addr, i, nf, esz,
> +                                 max_elems, ldst_tlb, ra);
> +                addr += msize;
>              }
>          }
>      }
> @@ -479,7 +480,6 @@ vext_ldst_us(void *vd, target_ulong base,
> CPURISCVState *env, uint32_t desc,
>               vext_ldst_elem_fn_host *ldst_host, uint32_t log2_esz,
>               uint32_t evl, uintptr_t ra, bool is_load)
>  {
> -    uint32_t k;
>      target_ulong page_split, elems, addr;
>      uint32_t nf = vext_nf(desc);
>      uint32_t max_elems = vext_max_elems(desc, log2_esz);
> @@ -522,17 +522,16 @@ vext_ldst_us(void *vd, target_ulong base,
> CPURISCVState *env, uint32_t desc,
>  
>      /* Load/store elements in the second page */
>      if (unlikely(env->vstart < evl)) {
> +        addr = base + env->vstart * msize;
> +
>          /* Cross page element */
>          if (unlikely(page_split % msize)) {
> -            for (k = 0; k < nf; k++) {
> -                addr = base + ((env->vstart * nf + k) << log2_esz);
> -                ldst_tlb(env, adjust_addr(env, addr),
> -                        env->vstart + k * max_elems, vd, ra);
> -            }
> +            vext_ldst_nf_tlb(env, vd, addr, env->vstart,
> +                             nf, esz, max_elems, ldst_tlb, ra);
>              env->vstart++;
> +            addr += msize;
>          }
>  
> -        addr = base + ((env->vstart * nf) << log2_esz);
>          /* Get number of elements of second page */
>          elems = evl - env->vstart;
>  
> @@ -723,7 +722,7 @@ vext_ldff(void *vd, void *v0, target_ulong base,
> CPURISCVState *env,
>            uint32_t desc, vext_ldst_elem_fn_tlb *ldst_tlb,
>            vext_ldst_elem_fn_host *ldst_host, uint32_t log2_esz,
> uintptr_t ra)
>  {
> -    uint32_t i, k, vl = 0;
> +    uint32_t i, vl = 0;
>      uint32_t nf = vext_nf(desc);
>      uint32_t vm = vext_vm(desc);
>      uint32_t max_elems = vext_max_elems(desc, log2_esz);
> @@ -805,17 +804,16 @@ ProbeSuccess:
>  
>              /* Load/store elements in the second page */
>              if (unlikely(env->vstart < env->vl)) {
> +                addr = base + env->vstart * msize;
> +
>                  /* Cross page element */
>                  if (unlikely(page_split % msize)) {
> -                    for (k = 0; k < nf; k++) {
> -                        addr = base + ((env->vstart * nf + k) <<
> log2_esz);
> -                        ldst_tlb(env, adjust_addr(env, addr),
> -                                 env->vstart + k * max_elems, vd,
> ra);
> -                    }
> +                    vext_ldst_nf_tlb(env, vd, addr, env->vstart, nf,
> +                                     esz, max_elems, ldst_tlb, ra);
>                      env->vstart++;
> +                    addr += msize;
>                  }
>  
> -                addr = base + ((env->vstart * nf) << log2_esz);
>                  /* Get number of elements of second page */
>                  elems = env->vl - env->vstart;
>  
> @@ -826,16 +824,11 @@ ProbeSuccess:
>              }
>          } else {
>              for (i = env->vstart; i < env->vl; i++) {
> -                if (!vext_elem_mask(v0, i)) {
> -                    if (vma) {
> -                        vext_set_nf_elems_1s(vd, i, nf, esz,
> max_elems);
> -                    }
> -                    continue;
> -                }
> -                for (k = 0; k < nf; ++k) {
> -                    addr = base + ((i * nf + k) << log2_esz);
> -                    ldst_tlb(env, adjust_addr(env, addr), i + k *
> max_elems,
> -                             vd, ra);
> +                if (vext_elem_mask(v0, i)) {
> +                    vext_ldst_nf_tlb(env, vd, base + i * msize, i,
> nf,
> +                                     esz, max_elems, ldst_tlb, ra);
> +                } else if (vma) {
> +                    vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
>                  }
>              }
>          }

Reply via email to