1  // Adapted from https://github.com/Alexhuszagh/rust-lexical.
2  
3  //! Bit-shift helpers.
4  
5  use super::float::ExtendedFloat;
6  use core::mem;
7  
8  // Shift extended-precision float right `shift` bytes.
9  #[inline]
shr(fp: &mut ExtendedFloat, shift: i32)10  pub(crate) fn shr(fp: &mut ExtendedFloat, shift: i32) {
11      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
12      debug_assert!((shift as u64) < bits, "shr() overflow in shift right.");
13  
14      fp.mant >>= shift;
15      fp.exp += shift;
16  }
17  
18  // Shift extended-precision float right `shift` bytes.
19  //
20  // Accepts when the shift is the same as the type size, and
21  // sets the value to 0.
22  #[inline]
overflowing_shr(fp: &mut ExtendedFloat, shift: i32)23  pub(crate) fn overflowing_shr(fp: &mut ExtendedFloat, shift: i32) {
24      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
25      debug_assert!(
26          (shift as u64) <= bits,
27          "overflowing_shr() overflow in shift right."
28      );
29  
30      fp.mant = if shift as u64 == bits {
31          0
32      } else {
33          fp.mant >> shift
34      };
35      fp.exp += shift;
36  }
37  
38  // Shift extended-precision float left `shift` bytes.
39  #[inline]
shl(fp: &mut ExtendedFloat, shift: i32)40  pub(crate) fn shl(fp: &mut ExtendedFloat, shift: i32) {
41      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
42      debug_assert!((shift as u64) < bits, "shl() overflow in shift left.");
43  
44      fp.mant <<= shift;
45      fp.exp -= shift;
46  }
47