#[repr(u8)]pub enum ShiftVariant {
Sll = 0,
Slr = 1,
Sar = 2,
Rotr = 3,
Sll32 = 4,
Srl32 = 5,
Sra32 = 6,
Rotr32 = 7,
}Expand description
A different variants of shifting a value.
Note that there is no shift left arithmetic because it is redundant.
The discriminant is stored in a single byte.
Variants§
Sll = 0
Shift logical left.
Slr = 1
Shift logical right.
Sar = 2
Shift arithmetic right.
This is similar to the logical shift right but instead of shifting in 0 bits it will replicate the sign bit.
Rotr = 3
Rotate right.
Rotates bits to the right, with bits shifted off the right end wrapping around to the left.
Sll32 = 4
Shift logical left on 32-bit halves.
Performs independent logical left shifts on the upper and lower 32-bit halves of the word. Only uses the lower 5 bits of the shift amount (0-31).
Srl32 = 5
Shift logical right on 32-bit halves.
Performs independent logical right shifts on the upper and lower 32-bit halves of the word. Only uses the lower 5 bits of the shift amount (0-31).
Sra32 = 6
Shift arithmetic right on 32-bit halves.
Performs independent arithmetic right shifts on the upper and lower 32-bit halves of the word. Sign extends each 32-bit half independently. Only uses the lower 5 bits of the shift amount (0-31).
Rotr32 = 7
Rotate right on 32-bit halves.
Performs independent rotate right operations on the upper and lower 32-bit halves of the word. Bits shifted off the right end wrap around to the left within each 32-bit half. Only uses the lower 5 bits of the shift amount (0-31).
Implementations§
Source§impl ShiftVariant
impl ShiftVariant
Sourcepub const ALL: [Self; 8]
pub const ALL: [Self; 8]
Every variant, ordered so that the array index equals the discriminant.
Callers that must cover all variants iterate this: random fixtures, exhaustive checks.
Sourcepub const fn from_u8(byte: u8) -> Option<Self>
pub const fn from_u8(byte: u8) -> Option<Self>
Decodes a variant from its u8 discriminant.
The discriminants match the #[repr(u8)] layout: 0..=7 map to the eight variants.
Any other byte returns None.
Sourcepub const fn is_half_word(self) -> bool
pub const fn is_half_word(self) -> bool
Whether this variant operates on the two 32-bit halves independently.
- The
*32family shifts each half on its own. - It reads only the lower 5 bits of the amount.
- Every other variant acts on the whole 64-bit word.
Sourcepub const fn is_cyclic(self) -> bool
pub const fn is_cyclic(self) -> bool
Whether this variant wraps the bits it moves out, rather than discarding them.
A cyclic variant loses nothing, so any two of its shifts compose however far they move; every other variant drops what it carries past the end.
Sourcepub const fn max_amount(self) -> usize
pub const fn max_amount(self) -> usize
The exclusive upper bound on a valid shift amount for this variant.
- Half-word (
*32) variants read only the lower 5 bits, so amounts run0..32. - Full-width variants take amounts
0..64.
Construction, validation, and deserialization all enforce this same bound. A value that passes any of them therefore denotes the same shift everywhere.
Sourcepub fn apply(self, word: Word, amount: usize) -> Word
pub fn apply(self, word: Word, amount: usize) -> Word
Applies this shift to a 64-bit word and returns the result.
Full-width variants act on the whole 64-bit word. The half-word variants act on the upper and lower 32-bit halves independently.
§Arguments
- The word to shift.
- The shift amount in bits.
§Performance
Which operation to run is decided on every call. To shift many words by one fixed variant, resolve the variant once instead.
Sourcepub fn write_shifted(
self,
out: &mut [MaybeUninit<Word>],
src: &[Word],
amount: u32,
)
pub fn write_shifted( self, out: &mut [MaybeUninit<Word>], src: &[Word], amount: u32, )
Applies this shift to each source word and writes the result to the matching output cell.
Every output cell is written, so the caller need not initialize them first. Cells past the end of either slice are left alone.
§Arguments
out: the cells to initialize, one per source word.src: the words to shift.amount: the shift amount in bits, below this variant’s upper bound.
Sourcepub fn xor_shifted(self, out: &mut [Word], src: &[Word], amount: u32)
pub fn xor_shifted(self, out: &mut [Word], src: &[Word], amount: u32)
Applies this shift to each source word and XORs the result into the matching output cell.
Cells past the end of either slice are left alone.
§Arguments
out: the cells to accumulate into, one per source word.src: the words to shift.amount: the shift amount in bits, below this variant’s upper bound.
Trait Implementations§
Source§impl Clone for ShiftVariant
impl Clone for ShiftVariant
Source§fn clone(&self) -> ShiftVariant
fn clone(&self) -> ShiftVariant
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ShiftVariant
impl Debug for ShiftVariant
Source§impl DeserializeBytes for ShiftVariant
impl DeserializeBytes for ShiftVariant
fn deserialize(read_buf: impl Buf) -> Result<Self, SerializationError>where
Self: Sized,
Source§impl Hash for ShiftVariant
impl Hash for ShiftVariant
Source§impl Ord for ShiftVariant
impl Ord for ShiftVariant
Source§fn cmp(&self, other: &ShiftVariant) -> Ordering
fn cmp(&self, other: &ShiftVariant) -> Ordering
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for ShiftVariant
impl PartialEq for ShiftVariant
Source§fn eq(&self, other: &ShiftVariant) -> bool
fn eq(&self, other: &ShiftVariant) -> bool
self and other values to be equal, and is used by ==.Source§impl PartialOrd for ShiftVariant
impl PartialOrd for ShiftVariant
Source§impl SerializeBytes for ShiftVariant
impl SerializeBytes for ShiftVariant
impl Copy for ShiftVariant
impl Eq for ShiftVariant
impl StructuralPartialEq for ShiftVariant
Auto Trait Implementations§
impl Freeze for ShiftVariant
impl RefUnwindSafe for ShiftVariant
impl Send for ShiftVariant
impl Sync for ShiftVariant
impl Unpin for ShiftVariant
impl UnsafeUnpin for ShiftVariant
impl UnwindSafe for ShiftVariant
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more