diff options
author | Andrew Waterman <andrew@sifive.com> | 2021-11-29 14:33:05 -0800 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2021-11-29 14:33:05 -0800 |
commit | 6b0f6f46ee79929a0e358f645705c3e5ec7adab7 (patch) | |
tree | b18b73232b17899eb5f85de90d2c89c4a346a12d | |
parent | 3090cee163e4c38a2f33c28928fca623f549285c (diff) | |
download | spike-6b0f6f46ee79929a0e358f645705c3e5ec7adab7.zip spike-6b0f6f46ee79929a0e358f645705c3e5ec7adab7.tar.gz spike-6b0f6f46ee79929a0e358f645705c3e5ec7adab7.tar.bz2 |
Revert "Simplify vmulhsu (#863)"
This reverts commit 1a5b2d9dda8741e98444289135e0fbcb2c3f5740,
which is buggy (the vs1 argument is being sign-extended).
-rw-r--r-- | riscv/insns/vmulhsu_vv.h | 39 | ||||
-rw-r--r-- | riscv/insns/vmulhsu_vx.h | 39 |
2 files changed, 72 insertions, 6 deletions
diff --git a/riscv/insns/vmulhsu_vv.h b/riscv/insns/vmulhsu_vv.h index 028975c..f77a7d3 100644 --- a/riscv/insns/vmulhsu_vv.h +++ b/riscv/insns/vmulhsu_vv.h @@ -1,5 +1,38 @@ // vmulhsu.vv vd, vs2, vs1 -VI_VV_LOOP -({ +VI_CHECK_SSS(true); +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); + auto vs1 = P.VU.elt<uint8_t>(rs1_num, i); + + vd = ((int16_t)vs2 * (uint16_t)vs1) >> 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); + auto vs1 = P.VU.elt<uint16_t>(rs1_num, i); + + vd = ((int32_t)vs2 * (uint32_t)vs1) >> 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); + auto vs1 = P.VU.elt<uint32_t>(rs1_num, i); + + vd = ((int64_t)vs2 * (uint64_t)vs1) >> sew; + break; +} +default: { + auto &vd = P.VU.elt<int64_t>(rd_num, i, true); + auto vs2 = P.VU.elt<int64_t>(rs2_num, i); + auto vs1 = P.VU.elt<uint64_t>(rs1_num, i); + vd = ((int128_t)vs2 * (uint128_t)vs1) >> sew; -}) + break; +} +} +VI_LOOP_END 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 |