diff options
Diffstat (limited to 'riscv/insns/vmulhsu_vx.h')
-rw-r--r-- | riscv/insns/vmulhsu_vx.h | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/riscv/insns/vmulhsu_vx.h b/riscv/insns/vmulhsu_vx.h index 527c3b9..b0699f6 100644 --- a/riscv/insns/vmulhsu_vx.h +++ b/riscv/insns/vmulhsu_vx.h @@ -1,5 +1,38 @@ // vmulhsu.vx vd, vs2, rs1 -VI_VX_LOOP -({ +VI_CHECK_SSS(false); +VI_LOOP_BASE +switch(sew) { +case e8: { + auto &vd = P.VU.elt<int8_t>(rd_num, i, true); + auto vs2 = P.VU.elt<int8_t>(rs2_num, i); + uint8_t rs1 = RS1; + + vd = ((int16_t)vs2 * (uint16_t)rs1) >> sew; + break; +} +case e16: { + auto &vd = P.VU.elt<int16_t>(rd_num, i, true); + auto vs2 = P.VU.elt<int16_t>(rs2_num, i); + uint16_t rs1 = RS1; + + vd = ((int32_t)vs2 * (uint32_t)rs1) >> sew; + break; +} +case e32: { + auto &vd = P.VU.elt<int32_t>(rd_num, i, true); + auto vs2 = P.VU.elt<int32_t>(rs2_num, i); + uint32_t rs1 = RS1; + + vd = ((int64_t)vs2 * (uint64_t)rs1) >> sew; + break; +} +default: { + auto &vd = P.VU.elt<int64_t>(rd_num, i, true); + auto vs2 = P.VU.elt<int64_t>(rs2_num, i); + uint64_t rs1 = RS1; + vd = ((int128_t)vs2 * (uint128_t)rs1) >> sew; -}) + break; +} +} +VI_LOOP_END |