aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2019-03-28 19:30:08 -0700
committerChih-Min Chao <chihmin.chao@sifive.com>2019-03-28 19:43:39 -0700
commit7f8292335aaf2935dd012be9044d15287e85d318 (patch)
tree813de51c60bcaf99062ad1c0878a208d37160c17 /riscv
parentbdb71e8138085ba81ff01cce2b02f48c7519be1a (diff)
downloadspike-7f8292335aaf2935dd012be9044d15287e85d318.zip
spike-7f8292335aaf2935dd012be9044d15287e85d318.tar.gz
spike-7f8292335aaf2935dd012be9044d15287e85d318.tar.bz2
rvv: fix vmerge[xi] operand use and apply V_CHECK_MASK macro
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'riscv')
-rw-r--r--riscv/insns/vmerge_vi.h17
-rw-r--r--riscv/insns/vmerge_vx.h15
2 files changed, 11 insertions, 21 deletions
diff --git a/riscv/insns/vmerge_vi.h b/riscv/insns/vmerge_vi.h
index 8456770..db76af4 100644
--- a/riscv/insns/vmerge_vi.h
+++ b/riscv/insns/vmerge_vi.h
@@ -1,26 +1,21 @@
-// vmerge.vi vd, vs2, imm, vm
+// vmerge.vi vd, vs2, simm5, vm
VI_VI_LOOP
({
bool do_mask = false;
-
- if (insn.v_vm() == 0) {
- int midx = (STATE.VU.vmlen * i) / 32;
- int mpos = (STATE.VU.vmlen * i) % 32;
- do_mask = (STATE.VU.elt<uint32_t>(0, midx) >> mpos) & 0x1;
- }
+ V_CHECK_MASK(do_mask);
bool use_first = (insn.v_vm() == 1) || do_mask;
switch (STATE.VU.vsew) {
case e8:
- STATE.VU.elt<uint8_t>(rd_num, i) = use_first ? rs1 : vs2;
+ STATE.VU.elt<uint8_t>(rd_num, i) = use_first ? simm5 : vs2;
break;
case e16:
- STATE.VU.elt<uint16_t>(rd_num, i) = use_first ? rs1 : vs2;
+ STATE.VU.elt<uint16_t>(rd_num, i) = use_first ? simm5 : vs2;
break;
case e32:
- STATE.VU.elt<uint32_t>(rd_num, i) = use_first ? rs1 : vs2;
+ STATE.VU.elt<uint32_t>(rd_num, i) = use_first ? simm5 : vs2;
break;
default:
- STATE.VU.elt<uint64_t>(rd_num, i) = use_first ? rs1 : vs2;
+ STATE.VU.elt<uint64_t>(rd_num, i) = use_first ? simm5 : vs2;
}
})
diff --git a/riscv/insns/vmerge_vx.h b/riscv/insns/vmerge_vx.h
index efb34dd..fd363bb 100644
--- a/riscv/insns/vmerge_vx.h
+++ b/riscv/insns/vmerge_vx.h
@@ -2,25 +2,20 @@
VI_VX_LOOP
({
bool do_mask = false;
-
- if (insn.v_vm() == 0) {
- int midx = (STATE.VU.vmlen * i) / 32;
- int mpos = (STATE.VU.vmlen * i) % 32;
- do_mask = (STATE.VU.elt<uint32_t>(0, midx) >> mpos) & 0x1;
- }
+ V_CHECK_MASK(do_mask);
bool use_first = (insn.v_vm() == 1) || do_mask;
switch (STATE.VU.vsew) {
case e8:
- STATE.VU.elt<uint8_t>(rd_num, i) = use_first ? simm5 : vs2;
+ STATE.VU.elt<uint8_t>(rd_num, i) = use_first ? rs1 : vs2;
break;
case e16:
- STATE.VU.elt<uint16_t>(rd_num, i) = use_first ? simm5 : vs2;
+ STATE.VU.elt<uint16_t>(rd_num, i) = use_first ? rs1 : vs2;
break;
case e32:
- STATE.VU.elt<uint32_t>(rd_num, i) = use_first ? simm5 : vs2;
+ STATE.VU.elt<uint32_t>(rd_num, i) = use_first ? rs1 : vs2;
break;
default:
- STATE.VU.elt<uint64_t>(rd_num, i) = use_first ? simm5 : vs2;
+ STATE.VU.elt<uint64_t>(rd_num, i) = use_first ? rs1 : vs2;
}
})