[PATCH v2 02/23] target/riscv: Split out vext_ldst_nf_tlb

Richard Henderson <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-devel
Message-ID <[email protected]>
Provide a helper that calls ldst_tlb for all NF vectors.

Signed-off-by: Richard Henderson <[email protected]>
---
 target/riscv/tcg/vector_helper.c | 77 +++++++++++++++-----------------
 1 file changed, 35 insertions(+), 42 deletions(-)

diff --git a/target/riscv/tcg/vector_helper.c b/target/riscv/tcg/vector_helper.c
index 20a8f95efb..b04d461c08 100644
--- a/target/riscv/tcg/vector_helper.c
+++ b/target/riscv/tcg/vector_helper.c
@@ -337,6 +337,16 @@ static void vext_set_nf_elems_1s(void *vd, uint32_t i, uint32_t nf,
     }
 }
 
+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,
+                             vext_ldst_elem_fn_tlb *ldst_tlb, uintptr_t ra)
+{
+    for (uint32_t k = 0; k < nf; k++, addr += esz) {
+        ldst_tlb(env, adjust_addr(env, addr), i + k * max_elems, vd, ra);
+    }
+}
+
 /*
  * stride: access vector element from strided memory
  */
@@ -354,16 +364,11 @@ vext_ldst_stride(void *vd, void *v0, target_ulong base, target_ulong stride,
     VSTART_CHECK_EARLY_EXIT(env, env->vl);
 
     for (uint32_t i = env->vstart; i < env->vl; env->vstart = ++i) {
-        if (!vm && !vext_elem_mask(v0, i)) {
-            if (vma) {
-                vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
-            }
-            continue;
-        }
-
-        for (uint32_t k = 0; k < nf; ++k) {
-            target_ulong addr = base + stride * i + (k << log2_esz);
-            ldst_elem(env, adjust_addr(env, addr), i + k * max_elems, vd, ra);
+        if (vm || vext_elem_mask(v0, i)) {
+            vext_ldst_nf_tlb(env, vd, base + stride * i, i, nf,
+                             esz, max_elems, ldst_elem, ra);
+        } else if (vma) {
+            vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
         }
     }
 
@@ -417,6 +422,7 @@ vext_page_ldst_us(CPURISCVState *env, void *vd, target_ulong addr,
     int i, k, 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;
     MMUAccessType access_type = is_load ? MMU_DATA_LOAD : MMU_DATA_STORE;
 
@@ -459,15 +465,10 @@ 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 {
-            /* load bytes from guest memory */
             for (i = env->vstart; i < evl; env->vstart = ++i) {
-                k = 0;
-                while (k < nf) {
-                    ldst_tlb(env, adjust_addr(env, addr), i + k * max_elems,
-                             vd, ra);
-                    addr += esz;
-                    k++;
-                }
+                vext_ldst_nf_tlb(env, vd, addr, i, nf, esz,
+                                 max_elems, ldst_tlb, ra);
+                addr += msize;
             }
         }
     }
@@ -479,7 +480,6 @@ vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
              vext_ldst_elem_fn_host *ldst_host, uint32_t log2_esz,
              uint32_t evl, uintptr_t ra, bool is_load)
 {
-    uint32_t k;
     target_ulong page_split, elems, addr;
     uint32_t nf = vext_nf(desc);
     uint32_t max_elems = vext_max_elems(desc, log2_esz);
@@ -522,17 +522,16 @@ vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
 
     /* Load/store elements in the second page */
     if (unlikely(env->vstart < evl)) {
+        addr = base + env->vstart * msize;
+
         /* Cross page element */
         if (unlikely(page_split % msize)) {
-            for (k = 0; k < nf; k++) {
-                addr = base + ((env->vstart * nf + k) << log2_esz);
-                ldst_tlb(env, adjust_addr(env, addr),
-                        env->vstart + k * max_elems, vd, ra);
-            }
+            vext_ldst_nf_tlb(env, vd, addr, env->vstart,
+                             nf, esz, max_elems, ldst_tlb, ra);
             env->vstart++;
+            addr += msize;
         }
 
-        addr = base + ((env->vstart * nf) << log2_esz);
         /* Get number of elements of second page */
         elems = evl - env->vstart;
 
@@ -723,7 +722,7 @@ vext_ldff(void *vd, void *v0, 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, uintptr_t ra)
 {
-    uint32_t i, k, vl = 0;
+    uint32_t i, vl = 0;
     uint32_t nf = vext_nf(desc);
     uint32_t vm = vext_vm(desc);
     uint32_t max_elems = vext_max_elems(desc, log2_esz);
@@ -805,17 +804,16 @@ ProbeSuccess:
 
             /* Load/store elements in the second page */
             if (unlikely(env->vstart < env->vl)) {
+                addr = base + env->vstart * msize;
+
                 /* Cross page element */
                 if (unlikely(page_split % msize)) {
-                    for (k = 0; k < nf; k++) {
-                        addr = base + ((env->vstart * nf + k) << log2_esz);
-                        ldst_tlb(env, adjust_addr(env, addr),
-                                 env->vstart + k * max_elems, vd, ra);
-                    }
+                    vext_ldst_nf_tlb(env, vd, addr, env->vstart, nf,
+                                     esz, max_elems, ldst_tlb, ra);
                     env->vstart++;
+                    addr += msize;
                 }
 
-                addr = base + ((env->vstart * nf) << log2_esz);
                 /* Get number of elements of second page */
                 elems = env->vl - env->vstart;
 
@@ -826,16 +824,11 @@ ProbeSuccess:
             }
         } else {
             for (i = env->vstart; i < env->vl; i++) {
-                if (!vext_elem_mask(v0, i)) {
-                    if (vma) {
-                        vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
-                    }
-                    continue;
-                }
-                for (k = 0; k < nf; ++k) {
-                    addr = base + ((i * nf + k) << log2_esz);
-                    ldst_tlb(env, adjust_addr(env, addr), i + k * max_elems,
-                             vd, ra);
+                if (vext_elem_mask(v0, i)) {
+                    vext_ldst_nf_tlb(env, vd, base + i * msize, i, nf,
+                                     esz, max_elems, ldst_tlb, ra);
+                } else if (vma) {
+                    vext_set_nf_elems_1s(vd, i, nf, esz, max_elems);
                 }
             }
         }
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.