if (xlen == 64)
WRITE_RD(mulh(RS1, RS2));
else
- WRITE_RD(sext32(rv_sr(rv_mul(sext32(RS1), sext32(RS2)),
- sv_reg_t(32U))));
+ WRITE_RD(sext32(rv_mulh(sext32(RS1), sext32(RS2))));
if (xlen == 64)
WRITE_RD(mulhsu(RS1, RS2));
else
- WRITE_RD(sext32(rv_sr((rv_mul(sext32(RS1), sv_reg_uint32(RS2))),
- sv_reg_t(32U))));
+ WRITE_RD(sext32((rv_mulhsu(sext32(RS1), sv_reg_uint32(RS2)))));
if (xlen == 64)
WRITE_RD(mulhu(RS1, RS2));
else
- WRITE_RD(sext32(rv_sr(rv_mul(sv_reg_uint32(RS1),
- sv_reg_uint32(RS2)),
- sv_reg_t(32U))));
+ WRITE_RD(sext32(rv_mulhu(sv_reg_uint32(RS1), sv_reg_uint32(RS2))));
uint8_t &bitwidth) \
{ \
bitwidth = _insn->src_bitwidth; \
+ if (bitwidth == 0) { \
+ bitwidth = xlen; \
+ } \
if (bitwidth == xlen) { \
return true; \
} \
return lhs * rhs;
}
+sv_reg_t sv_proc_t::rv_mulhu(sv_reg_t const & lhs, sv_reg_t const & rhs)
+{
+ return (lhs * rhs) >> 32;
+}
+
+sv_sreg_t sv_proc_t::rv_mulhsu(sv_sreg_t const & lhs, sv_reg_t const & rhs)
+{
+ return (lhs * rhs) >> 32;
+}
+
+sv_sreg_t sv_proc_t::rv_mulh(sv_sreg_t const & lhs, sv_sreg_t const & rhs)
+{
+ return (lhs * rhs) >> 32;
+}
+
sv_reg_t sv_proc_t::rv_and(sv_reg_t const & lhs, sv_reg_t const & rhs)
{
return lhs & rhs;
sv_reg_t rv_mul(sv_reg_t const & lhs, sv_reg_t const & rhs);
sv_sreg_t rv_mul(sv_sreg_t const & lhs, sv_reg_t const & rhs);
sv_sreg_t rv_mul(sv_sreg_t const & lhs, sv_sreg_t const & rhs);
+ sv_reg_t rv_mulhu(sv_reg_t const & lhs, sv_reg_t const & rhs);
+ sv_sreg_t rv_mulh(sv_sreg_t const & lhs, sv_sreg_t const & rhs);
+ sv_sreg_t rv_mulhsu(sv_sreg_t const & lhs, sv_reg_t const & rhs);
sv_reg_t rv_and(sv_reg_t const & lhs, sv_reg_t const & rhs);
sv_reg_t rv_or(sv_reg_t const & lhs, sv_reg_t const & rhs);
sv_reg_t rv_xor(sv_reg_t const & lhs, sv_reg_t const & rhs);