Split out vext_ldst_us_tail that doesn't use 'desc'.
Signed-off-by: Richard Henderson <[email protected]>
---
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);
}
/*
--
2.43.0