#[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 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 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.
The variant selects which word-level operation runs. Full-width variants act on the whole 64-bit word. The 32-bit variants act on the upper and lower halves independently.
§Arguments
- The word to shift.
- The shift amount in bits.
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