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

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

Alistair

> ---
>  target/riscv/tcg/vector_helper.c | 23 ++++++++++++++---------
>  1 file changed, 14 insertions(+), 9 deletions(-)
> 
> diff --git a/target/riscv/tcg/vector_helper.c
> b/target/riscv/tcg/vector_helper.c
> index b04d461c08..6108cf3a6c 100644
> --- a/target/riscv/tcg/vector_helper.c
> +++ b/target/riscv/tcg/vector_helper.c
> @@ -337,6 +337,15 @@ static void vext_set_nf_elems_1s(void *vd,
> uint32_t i, uint32_t nf,
>      }
>  }
>  
> +static void vext_ldst_nf_host(void *vd, void *host, uint32_t i,
> uint32_t nf,
> +                              uint32_t esz, uint32_t max_elems,
> +                              vext_ldst_elem_fn_host *ldst_host)
> +{
> +    for (uint32_t k = 0; k < nf; k++, host += esz) {
> +        ldst_host(vd, i + k * max_elems, host);
> +    }
> +}
> +
>  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,
> @@ -419,7 +428,7 @@ vext_page_ldst_us(CPURISCVState *env, void *vd,
> target_ulong addr,
>                    vext_ldst_elem_fn_host *ldst_host, uintptr_t ra)
>  {
>      void *host;
> -    int i, k, flags;
> +    int flags;
>      uint32_t esz = 1 << log2_esz;
>      uint32_t size = (elems * nf) << log2_esz;
>      uint32_t msize = nf * esz;
> @@ -450,13 +459,9 @@ vext_page_ldst_us(CPURISCVState *env, void *vd,
> target_ulong addr,
>              vext_continuous_ldst_host(env, ldst_host, vd, evl, env-
> >vstart,
>                                        host, esz, is_load);
>          } else {
> -            for (i = env->vstart; i < evl; ++i) {
> -                k = 0;
> -                while (k < nf) {
> -                    ldst_host(vd, i + k * max_elems, host);
> -                    host += esz;
> -                    k++;
> -                }
> +            for (uint32_t i = env->vstart; i < evl; ++i) {
> +                vext_ldst_nf_host(vd, host, i, nf, esz, max_elems,
> ldst_host);
> +                host += msize;
>              }
>          }
>          env->vstart += elems;
> @@ -465,7 +470,7 @@ 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 {
> -            for (i = env->vstart; i < evl; env->vstart = ++i) {
> +            for (uint32_t i = env->vstart; i < evl; env->vstart =
> ++i) {
>                  vext_ldst_nf_tlb(env, vd, addr, i, nf, esz,
>                                   max_elems, ldst_tlb, ra);
>                  addr += msize;

Reply via email to