elwidth-ify rv_sl and rv_sr
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 6 Nov 2018 11:20:34 +0000 (11:20 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 6 Nov 2018 11:20:34 +0000 (11:20 +0000)
riscv/sv_insn_redirect.cc

index 12ae22005e87cac41e18030fb673825f3c672751..5b410c55698c4aa8c7d881050eafa6cd0cb5bf73 100644 (file)
@@ -541,12 +541,26 @@ sv_reg_t sv_proc_t::rv_xor(sv_reg_t const & lhs, sv_reg_t const & rhs)
 
 sv_reg_t sv_proc_t::rv_sl(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
-    return lhs << rhs;
+    uint8_t bitwidth = _insn->src_bitwidth;
+    uint64_t vlhs = 0;
+    uint64_t vrhs = 0;
+    if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
+        return lhs << rhs;
+    }
+    uint64_t result = vlhs << vrhs;
+    return rv_int_op_finish(lhs, rhs, result, bitwidth);
 }
 
 sv_reg_t sv_proc_t::rv_sr(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
-    return lhs >> rhs;
+    uint8_t bitwidth = _insn->src_bitwidth;
+    uint64_t vlhs = 0;
+    uint64_t vrhs = 0;
+    if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
+        return lhs >> rhs;
+    }
+    uint64_t result = vlhs >> vrhs;
+    return rv_int_op_finish(lhs, rhs, result, bitwidth);
 }
 
 bool sv_proc_t::rv_lt(sv_reg_t const & lhs, sv_reg_t const & rhs)