Fixed sign handling in const eval of sshl and sshr
authorClifford Wolf <clifford@clifford.at>
Tue, 5 Nov 2013 09:22:22 +0000 (10:22 +0100)
committerClifford Wolf <clifford@clifford.at>
Tue, 5 Nov 2013 09:22:22 +0000 (10:22 +0100)
kernel/calc.cc

index 2e9be437ce16c7f504c8cc8c9dbb7985e4115a21..efb09c3987706e975f1c75638117d2caec6cf855 100644 (file)
@@ -286,13 +286,17 @@ RTLIL::Const RTLIL::const_shr(const RTLIL::Const &arg1, const RTLIL::Const &arg2
        return const_shift(arg1_ext, arg2, false, +1, result_len);
 }
 
-RTLIL::Const RTLIL::const_sshl(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool, bool, int result_len)
+RTLIL::Const RTLIL::const_sshl(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
 {
+       if (!signed1)
+               return const_shl(arg1, arg2, signed1, signed2, result_len);
        return const_shift(arg1, arg2, true, -1, result_len);
 }
 
-RTLIL::Const RTLIL::const_sshr(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool, bool, int result_len)
+RTLIL::Const RTLIL::const_sshr(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
 {
+       if (!signed1)
+               return const_shr(arg1, arg2, signed1, signed2, result_len);
        return const_shift(arg1, arg2, true, +1, result_len);
 }