aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/viota_m.h
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/insns/viota_m.h')
-rw-r--r--riscv/insns/viota_m.h25
1 files changed, 10 insertions, 15 deletions
diff --git a/riscv/insns/viota_m.h b/riscv/insns/viota_m.h
index 1ee9229..00155db 100644
--- a/riscv/insns/viota_m.h
+++ b/riscv/insns/viota_m.h
@@ -12,36 +12,31 @@ require_noover(rd_num, P.VU.vflmul, rs2_num, 1);
int cnt = 0;
for (reg_t i = 0; i < vl; ++i) {
- const int midx = i / 64;
- const int mpos = i % 64;
-
- bool vs2_lsb = ((P.VU.elt<uint64_t>(rs2_num, midx) >> mpos) & 0x1) == 1;
- bool do_mask = (P.VU.elt<uint64_t>(0, midx) >> mpos) & 0x1;
+ bool do_mask = P.VU.mask_elt(0, i);
bool has_one = false;
if (insn.v_vm() == 1 || (insn.v_vm() == 0 && do_mask)) {
- if (vs2_lsb) {
+ if (P.VU.mask_elt(rs2_num, i)) {
has_one = true;
}
}
- bool use_ori = (insn.v_vm() == 0) && !do_mask;
+ // Bypass masked-off elements
+ if ((insn.v_vm() == 0) && !do_mask)
+ continue;
+
switch (sew) {
case e8:
- P.VU.elt<uint8_t>(rd_num, i, true) = use_ori ?
- P.VU.elt<uint8_t>(rd_num, i) : cnt;
+ P.VU.elt<uint8_t>(rd_num, i, true) = cnt;
break;
case e16:
- P.VU.elt<uint16_t>(rd_num, i, true) = use_ori ?
- P.VU.elt<uint16_t>(rd_num, i) : cnt;
+ P.VU.elt<uint16_t>(rd_num, i, true) = cnt;
break;
case e32:
- P.VU.elt<uint32_t>(rd_num, i, true) = use_ori ?
- P.VU.elt<uint32_t>(rd_num, i) : cnt;
+ P.VU.elt<uint32_t>(rd_num, i, true) = cnt;
break;
default:
- P.VU.elt<uint64_t>(rd_num, i, true) = use_ori ?
- P.VU.elt<uint64_t>(rd_num, i) : cnt;
+ P.VU.elt<uint64_t>(rd_num, i, true) = cnt;
break;
}