convert rv_sl to same extra bitwidth arg
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 6 Nov 2018 11:35:42 +0000 (11:35 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 6 Nov 2018 11:35:42 +0000 (11:35 +0000)
riscv/insns/sll.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h

index ec337b5e82e3e3fceefd6b5de4ea0235effa46c1..9042da77bc477ea709528d2d1fc9c584daa43f09 100644 (file)
@@ -1 +1 @@
-WRITE_RD(sext_xlen(rv_sl(RS1, rv_and(RS2, sv_reg_t(xlen-1)))));
+WRITE_RD(sext_xlen(rv_sl(RS1, RS2, xlen)));
index 7b799f128266a966aa76975aaa7ad48896ea40cb..64754350acd72a0934ab2e49a92a65c95f77baa1 100644 (file)
@@ -540,14 +540,20 @@ 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 rv_sl(lhs, rhs, xlen);
+}
+
+sv_reg_t sv_proc_t::rv_sl(sv_reg_t const & lhs, sv_reg_t const & rhs,
+                          unsigned int dflt_bitwidth)
 {
     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;
+        return lhs << rv_and(rhs, sv_reg_t(dflt_bitwidth-1U));
     }
-    uint64_t result = vlhs << vrhs;
+    uint64_t result = vlhs << (vrhs & (bitwidth-1));
     return rv_int_op_finish(lhs, rhs, result, bitwidth);
 }
 
index a39ba85bb05cb198ef3791fa6dfa90e6b8360c24..82100c5027739bb5f8e3957d6cc60bc8b7f60c0e 100644 (file)
@@ -134,6 +134,8 @@ public:
     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);
     sv_reg_t rv_sl(sv_reg_t const & lhs, sv_reg_t const & rhs);
+    sv_reg_t rv_sl(sv_reg_t const & lhs, sv_reg_t const & rhs,
+                   unsigned int dflt_bitwidth);
     sv_reg_t rv_sr(sv_reg_t const & lhs, sv_reg_t const & rhs);
     sv_reg_t rv_sr(sv_reg_t const & lhs, sv_reg_t const & rhs,
                    unsigned int dflt_bitwidth);