[PATCH 09/23] target/riscv: Split out vext_page_ldst_us_{host,tlb}
Richard Henderson <[email protected]>
| Newsgroups | org.nongnu.qemu-riscv,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
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