@@ -8,7 +8,6 @@ Author: Daniel Kroening, kroening@kroening.com
88
99#include " mp_arith.h"
1010
11- #include < cassert>
1211#include < cctype>
1312#include < cstdlib>
1413#include < limits>
@@ -257,9 +256,9 @@ mp_integer arith_left_shift(
257256 std::size_t true_size)
258257{
259258 PRECONDITION (a.is_long () && b.is_ulong ());
259+ PRECONDITION (b <= true_size || a == 0 );
260+
260261 ullong_t shift=b.to_ulong ();
261- if (shift>true_size && a!=mp_integer (0 ))
262- throw " shift value out of range" ;
263262
264263 llong_t result=a.to_long ()<<shift;
265264 llong_t mask=
@@ -280,8 +279,7 @@ mp_integer arith_right_shift(
280279 PRECONDITION (a.is_long () && b.is_ulong ());
281280 llong_t number=a.to_long ();
282281 ullong_t shift=b.to_ulong ();
283- if (shift>true_size)
284- throw " shift value out of range" ;
282+ PRECONDITION (shift <= true_size);
285283
286284 const llong_t sign = (1LL << (true_size - 1 )) & number;
287285 const llong_t pad = (sign == 0 ) ? 0 : ~((1LL << (true_size - shift)) - 1 );
@@ -298,9 +296,9 @@ mp_integer logic_left_shift(
298296 std::size_t true_size)
299297{
300298 PRECONDITION (a.is_long () && b.is_ulong ());
299+ PRECONDITION (b <= true_size || a == 0 );
300+
301301 ullong_t shift=b.to_ulong ();
302- if (shift>true_size && a!=mp_integer (0 ))
303- throw " shift value out of range" ;
304302 llong_t result=a.to_long ()<<shift;
305303 if (true_size<(sizeof (llong_t )*8 ))
306304 {
@@ -324,10 +322,9 @@ mp_integer logic_right_shift(
324322 std::size_t true_size)
325323{
326324 PRECONDITION (a.is_long () && b.is_ulong ());
327- ullong_t shift=b.to_ulong ();
328- if (shift>true_size)
329- throw " shift value out of range" ;
325+ PRECONDITION (b <= true_size);
330326
327+ ullong_t shift = b.to_ulong ();
331328 ullong_t result=((ullong_t )a.to_long ()) >> shift;
332329 return result;
333330}
@@ -341,10 +338,10 @@ mp_integer rotate_right(
341338 std::size_t true_size)
342339{
343340 PRECONDITION (a.is_ulong () && b.is_ulong ());
341+ PRECONDITION (b <= true_size);
342+
344343 ullong_t number=a.to_ulong ();
345344 ullong_t shift=b.to_ulong ();
346- if (shift>true_size)
347- throw " shift value out of range" ;
348345
349346 ullong_t revShift=true_size-shift;
350347 const ullong_t filter = 1ULL << (true_size - 1 );
@@ -361,10 +358,10 @@ mp_integer rotate_left(
361358 std::size_t true_size)
362359{
363360 PRECONDITION (a.is_ulong () && b.is_ulong ());
361+ PRECONDITION (b <= true_size);
362+
364363 ullong_t number=a.to_ulong ();
365364 ullong_t shift=b.to_ulong ();
366- if (shift>true_size)
367- throw " shift value out of range" ;
368365
369366 ullong_t revShift=true_size-shift;
370367 const ullong_t filter = 1ULL << (true_size - 1 );
0 commit comments