}
uint64_t vlhs = 0;
uint64_t vrhs = 0;
+ uint64_t result = 0;
// sign-extend or zero-extend to max bitwidth of lhs and rhs?
// has the effect of truncating, as well.
if (_insn->signextended) { // sign-extend?
vlhs = zext_bwid(lhs, bitwidth);
vrhs = zext_bwid(rhs, bitwidth);
}
- return sv_reg_t(vlhs + vrhs, xlen); // XXX TODO: bitwidth
+ result = vlhs + vrhs;
+ if (_insn->signextended) { // sign-extend?
+ result = sext_bwid(result, bitwidth);
+ } else { // nope: zero-extend.
+ result = zext_bwid(result, bitwidth);
+ }
+ return sv_reg_t(result, xlen); // XXX TODO: bitwidth
}
sv_reg_t sv_proc_t::rv_sub(sv_reg_t const & lhs, sv_reg_t const & rhs)