46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
// Adapted from https://github.com/Alexhuszagh/rust-lexical.
|
|
|
|
//! Bit-shift helpers.
|
|
|
|
use super::float::ExtendedFloat;
|
|
use core::mem;
|
|
|
|
// Shift extended-precision float right `shift` bytes.
|
|
#[inline]
|
|
pub(crate) fn shr(fp: &mut ExtendedFloat, shift: i32) {
|
|
let bits: u64 = mem::size_of::<u64>() as u64 * 8;
|
|
debug_assert!((shift as u64) < bits, "shr() overflow in shift right.");
|
|
|
|
fp.mant >>= shift;
|
|
fp.exp += shift;
|
|
}
|
|
|
|
// Shift extended-precision float right `shift` bytes.
|
|
//
|
|
// Accepts when the shift is the same as the type size, and
|
|
// sets the value to 0.
|
|
#[inline]
|
|
pub(crate) fn overflowing_shr(fp: &mut ExtendedFloat, shift: i32) {
|
|
let bits: u64 = mem::size_of::<u64>() as u64 * 8;
|
|
debug_assert!(
|
|
(shift as u64) <= bits,
|
|
"overflowing_shr() overflow in shift right."
|
|
);
|
|
|
|
fp.mant = if shift as u64 == bits {
|
|
0
|
|
} else {
|
|
fp.mant >> shift
|
|
};
|
|
fp.exp += shift;
|
|
}
|
|
|
|
// Shift extended-precision float left `shift` bytes.
|
|
#[inline]
|
|
pub(crate) fn shl(fp: &mut ExtendedFloat, shift: i32) {
|
|
let bits: u64 = mem::size_of::<u64>() as u64 * 8;
|
|
debug_assert!((shift as u64) < bits, "shl() overflow in shift left.");
|
|
|
|
fp.mant <<= shift;
|
|
fp.exp -= shift;
|
|
}
|