Split out the tail of vext_page_ldst_us, after probing.
Signed-off-by: Richard Henderson <[email protected]>
---
target/riscv/tcg/vector_helper.c | 60 ++++++++++++++++++++------------
1 file changed, 38 insertions(+), 22 deletions(-)
diff --git a/target/riscv/tcg/vector_helper.c b/target/riscv/tcg/vector_helper.c
index 12ef020840..7f721dc24d 100644
--- a/target/riscv/tcg/vector_helper.c
+++ b/target/riscv/tcg/vector_helper.c
@@ -403,6 +403,39 @@ GEN_VEXT_ST_STRIDE(vsse64_v, int64_t, ste_d_tlb)
*/
/* unmasked unit-stride load and store operation */
+static inline QEMU_ALWAYS_INLINE void
+vext_page_ldst_us_host(void *vd, void *host, uint32_t i, uint32_t evl,
+ uint32_t nf, uint32_t log2_esz, uint32_t max_elems,
+ vext_ldst_elem_fn_host *ldst_host)
+{
+ if (nf == 1) {
+ ldst_host(vd, host, i, evl);
+ } else {
+ uint32_t esz = 1 << log2_esz;
+ uint32_t msize = nf << log2_esz;
+ do {
+ vext_ldst_nf_host(vd, host, i, nf, esz, max_elems, ldst_host);
+ host += msize;
+ } while (++i < evl);
+ }
+}
+
+static inline QEMU_ALWAYS_INLINE void
+vext_page_ldst_us_tlb(CPURISCVState *env, void *vd, target_ulong addr,
+ uint32_t i, uint32_t evl, uint32_t nf,
+ uint32_t log2_esz, uint32_t max_elems,
+ vext_ldst_elem_fn_tlb *ldst_tlb,
+ int mmu_index, uintptr_t ra)
+{
+ uint32_t esz = 1 << log2_esz;
+ uint32_t msize = nf << log2_esz;
+ do {
+ vext_ldst_nf_tlb(env, vd, addr, i, nf, esz, max_elems, ldst_tlb, ra);
+ addr += msize;
+ env->vstart = ++i;
+ } while (i < evl);
+}
+
static inline QEMU_ALWAYS_INLINE void
vext_page_ldst_us(CPURISCVState *env, void *vd, target_ulong addr,
uint32_t elems, uint32_t nf, uint32_t max_elems,
@@ -412,38 +445,21 @@ vext_page_ldst_us(CPURISCVState *env, void *vd,
target_ulong addr,
{
void *host;
int 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;
+ uint32_t i = env->vstart;
MMUAccessType access_type = is_load ? MMU_DATA_LOAD : MMU_DATA_STORE;
- /*
- * Maximum vector length is VLMAX == 2^16 == LMUL * VL / SEW, and
- * occurs for LMUL == 8, SEW == 8, VL == 2^16.
- */
- g_assert(env->vstart < UINT16_MAX && UINT16_MAX - env->vstart >= elems);
-
/* Check page permission/pmp/watchpoint/etc. */
probe_pages(env, addr, size, ra, access_type, mmu_index, &host, &flags,
true);
if (flags == 0) {
- if (nf == 1) {
- ldst_host(vd, host, env->vstart, evl);
- } else {
- for (uint32_t i = env->vstart; i < evl; ++i) {
- vext_ldst_nf_host(vd, host, i, nf, esz, max_elems, ldst_host);
- host += msize;
- }
- }
+ vext_page_ldst_us_host(vd, host, i, i + elems, nf,
+ log2_esz, max_elems, ldst_host);
env->vstart += elems;
} else {
- 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;
- }
+ vext_page_ldst_us_tlb(env, vd, addr, i, i + elems, nf, log2_esz,
+ max_elems, ldst_tlb, mmu_index, ra);
}
}
--
2.43.0