sign/zero-extend result as well
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 26 Oct 2018 03:12:39 +0000 (04:12 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 26 Oct 2018 03:12:39 +0000 (04:12 +0100)
riscv/sv_insn_redirect.cc

index d98f0d8a8ed2e1377b96d45db29565415bc2ac06..3c9fa0551696f595419fabbb85c937c4047ab7e7 100644 (file)
@@ -347,6 +347,7 @@ sv_reg_t sv_proc_t::rv_add(sv_reg_t const & lhs, sv_reg_t const & rhs)
     }
     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?
@@ -356,7 +357,13 @@ sv_reg_t sv_proc_t::rv_add(sv_reg_t const & lhs, sv_reg_t const & rhs)
         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)