@@ -257,9 +257,9 @@ mp_integer arith_left_shift(
257257 std::size_t true_size)
258258{
259259 PRECONDITION (a.is_long () && b.is_ulong ());
260+ PRECONDITION (b <= true_size || a == 0 );
261+
260262 ullong_t shift=b.to_ulong ();
261- if (shift>true_size && a!=mp_integer (0 ))
262- throw " shift value out of range" ;
263263
264264 llong_t result=a.to_long ()<<shift;
265265 llong_t mask=
@@ -280,8 +280,7 @@ mp_integer arith_right_shift(
280280 PRECONDITION (a.is_long () && b.is_ulong ());
281281 llong_t number=a.to_long ();
282282 ullong_t shift=b.to_ulong ();
283- if (shift>true_size)
284- throw " shift value out of range" ;
283+ DATA_INVARIANT (shift <= true_size, " shift value must be in range" );
285284
286285 const llong_t sign = (1LL << (true_size - 1 )) & number;
287286 const llong_t pad = (sign == 0 ) ? 0 : ~((1LL << (true_size - shift)) - 1 );
@@ -298,9 +297,9 @@ mp_integer logic_left_shift(
298297 std::size_t true_size)
299298{
300299 PRECONDITION (a.is_long () && b.is_ulong ());
300+ PRECONDITION (b <= true_size || a == 0 );
301+
301302 ullong_t shift=b.to_ulong ();
302- if (shift>true_size && a!=mp_integer (0 ))
303- throw " shift value out of range" ;
304303 llong_t result=a.to_long ()<<shift;
305304 if (true_size<(sizeof (llong_t )*8 ))
306305 {
@@ -324,10 +323,9 @@ mp_integer logic_right_shift(
324323 std::size_t true_size)
325324{
326325 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" ;
326+ PRECONDITION (b <= true_size);
330327
328+ ullong_t shift = b.to_ulong ();
331329 ullong_t result=((ullong_t )a.to_long ()) >> shift;
332330 return result;
333331}
@@ -341,10 +339,10 @@ mp_integer rotate_right(
341339 std::size_t true_size)
342340{
343341 PRECONDITION (a.is_ulong () && b.is_ulong ());
342+ PRECONDITION (b <= true_size);
343+
344344 ullong_t number=a.to_ulong ();
345345 ullong_t shift=b.to_ulong ();
346- if (shift>true_size)
347- throw " shift value out of range" ;
348346
349347 ullong_t revShift=true_size-shift;
350348 const ullong_t filter = 1ULL << (true_size - 1 );
@@ -361,10 +359,10 @@ mp_integer rotate_left(
361359 std::size_t true_size)
362360{
363361 PRECONDITION (a.is_ulong () && b.is_ulong ());
362+ PRECONDITION (b <= true_size);
363+
364364 ullong_t number=a.to_ulong ();
365365 ullong_t shift=b.to_ulong ();
366- if (shift>true_size)
367- throw " shift value out of range" ;
368366
369367 ullong_t revShift=true_size-shift;
370368 const ullong_t filter = 1ULL << (true_size - 1 );
0 commit comments