uint64_t vrhs = 0;
if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
sv_reg_t result = (lhs * rhs) >> 32;
- fprintf(stderr, "mul result %lx %lx %lx\n",
+ fprintf(stderr, "mulhu result %lx %lx %lx\n",
(uint64_t)lhs, (uint64_t)rhs, (uint64_t)result);
return result;
}
sv_sreg_t sv_proc_t::rv_mulhsu(sv_sreg_t const & lhs, sv_reg_t const & rhs)
{
- return rv_mul(lhs, rhs) >> 32;
+ uint8_t bitwidth = _insn->src_bitwidth;
+ int64_t vlhs = 0;
+ uint64_t vrhs = 0;
+ if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
+ sv_sreg_t result = (lhs * rhs) >> 32;
+ fprintf(stderr, "mulhsu result %lx %lx %lx\n",
+ (int64_t)lhs, (uint64_t)rhs, (int64_t)result);
+ return result;
+ }
+ uint8_t bw32 = std::min(bitwidth, (uint8_t)32);
+ int64_t result = (vlhs * vrhs) >> bw32;
+ result = sext_bwid(result, bw32);
+ fprintf(stderr, "mulhu result %lx %lx %lx bw %d\n",
+ (int64_t)lhs, (uint64_t)rhs, (int64_t)(result), bitwidth);
+ return rv_int_op_finish(lhs, rhs, result, bitwidth);
}
sv_sreg_t sv_proc_t::rv_mulh(sv_sreg_t const & lhs, sv_sreg_t const & rhs)