On Thu, 2026-08-20 at 21:03 -0700, Richard Henderson wrote: > Split out vext_ldst_us_tail that doesn't use 'desc'. > > Signed-off-by: Richard Henderson <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > target/riscv/tcg/vector_helper.c | 34 +++++++++++++++++++++--------- > -- > 1 file changed, 23 insertions(+), 11 deletions(-) > > diff --git a/target/riscv/tcg/vector_helper.c > b/target/riscv/tcg/vector_helper.c > index abfd2ec45d..76f3babed6 100644 > --- a/target/riscv/tcg/vector_helper.c > +++ b/target/riscv/tcg/vector_helper.c > @@ -472,14 +472,14 @@ static void vext_test_alignment(CPURISCVState > *env, vaddr addr, uint32_t esz, > } > > static inline QEMU_ALWAYS_INLINE void > -vext_ldst_us(void *vd, 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, > - uint32_t evl, uintptr_t ra, bool is_load) > +vext_ldst_us_notail(void *vd, target_ulong base, CPURISCVState *env, > + uint32_t log2_esz, uint32_t nf, uint32_t evl, > + uint32_t max_elems, bool vma, > + vext_ldst_elem_fn_tlb *ldst_tlb, > + vext_ldst_elem_fn_host *ldst_host, > + uintptr_t ra, bool is_load) > { > target_ulong elems, addr, last, last_in_page, page_split; > - uint32_t nf = vext_nf(desc); > - uint32_t max_elems = vext_max_elems(desc, log2_esz); > uint32_t esz = 1 << log2_esz; > uint32_t msize = nf * esz; > int mmu_index = riscv_env_mmu_index(env, false); > @@ -503,7 +503,7 @@ vext_ldst_us(void *vd, target_ulong base, > CPURISCVState *env, uint32_t desc, > for (; i < evl; env->vstart = ++i, addr += esz) { > ldst_tlb(env, adjust_addr(env, addr), i, vd, ra); > } > - goto tail; > + return; > } > #endif > > @@ -535,7 +535,7 @@ vext_ldst_us(void *vd, target_ulong base, > CPURISCVState *env, uint32_t desc, > > /* Usually the first page contains the entire vector. */ > if (likely(page_evl == evl)) { > - goto tail; > + return; > } > env->vstart = i = page_evl; > addr += elems * msize; > @@ -545,7 +545,7 @@ vext_ldst_us(void *vd, target_ulong base, > CPURISCVState *env, uint32_t desc, > if (unlikely(page_split % msize)) { > vext_ldst_nf_tlb(env, vd, addr, i++, nf, esz, max_elems, > ldst_tlb, ra); > if (i == evl) { > - goto tail; > + return; > } > env->vstart = i; > addr += msize; > @@ -564,10 +564,22 @@ vext_ldst_us(void *vd, target_ulong base, > CPURISCVState *env, uint32_t desc, > vext_page_ldst_us_tlb(env, vd, addr, i, evl, nf, log2_esz, > max_elems, > ldst_tlb, mmu_index, ra); > } > +} > + > +static inline QEMU_ALWAYS_INLINE void > +vext_ldst_us(void *vd, 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, > + uint32_t evl, uintptr_t ra, bool is_load) > +{ > + uint32_t nf = vext_nf(desc); > + uint32_t max_elems = vext_max_elems(desc, log2_esz); > + > + vext_ldst_us_notail(vd, base, env, log2_esz, vext_nf(desc), evl, > max_elems, > + vext_vma(desc), ldst_tlb, ldst_host, ra, > is_load); > > - tail: > env->vstart = 0; > - vext_set_tail_elems_1s(evl, vd, desc, nf, esz, max_elems); > + vext_set_tail_elems_1s(evl, vd, desc, nf, 1 << log2_esz, > max_elems); > } > > /*
