Signed-off-by: Anton Blanchard <[email protected]>
---
 target/riscv/vector_helper.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index 5bec75edf6..b07e8f7b50 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -5075,12 +5075,17 @@ static void vmsetm(void *vd, void *v0, void *vs2, 
CPURISCVState *env,
     uint32_t vl = env->vl;
     uint32_t total_elems = riscv_cpu_cfg(env)->vlenb << 3;
     uint32_t vta_all_1s = vext_vta_all_1s(desc);
+    uint32_t mask_reg_full_update = vext_mask_reg_full_update(desc);
     uint32_t vma = vext_vma(desc);
     int i;
     bool first_mask_bit = false;
 
     VSTART_CHECK_EARLY_EXIT(env, vl);
 
+    if (mask_reg_full_update) {
+        vl = total_elems;
+    }
+
     for (i = env->vstart; i < vl; i++) {
         if (!vm && !vext_elem_mask(v0, i)) {
             /* set masked-off elements to 1s */
@@ -5094,6 +5099,17 @@ static void vmsetm(void *vd, void *v0, void *vs2, 
CPURISCVState *env,
             vext_set_elem_mask(vd, i, 0);
             continue;
         }
+
+        /* Handle elements past vl in mask_reg_full_update mode */
+        if (i >= env->vl) {
+            if (type == ONLY_FIRST) {
+                vext_set_elem_mask(vd, i, 0);
+            } else {
+                vext_set_elem_mask(vd, i, 1);
+            }
+            continue;
+        }
+
         if (vext_elem_mask(vs2, i)) {
             first_mask_bit = true;
             if (type == BEFORE_FIRST) {
-- 
2.34.1


Reply via email to