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