forked from MightyPork/crsn
parent
3a8895b790
commit
8ea60f52eb
@ -1,65 +0,0 @@ |
||||
//! Mask applied to a data source or destination
|
||||
|
||||
use crate::asm::error::AsmError; |
||||
|
||||
/// Bit mask to apply to a value
|
||||
#[derive(Debug, Clone, Copy, Eq, PartialEq)] |
||||
pub struct Mask { |
||||
/// Length of the selected bit slice
|
||||
len: u8, |
||||
/// Offset of the selected bit slice from bit zero
|
||||
offset: u8, |
||||
} |
||||
|
||||
impl Default for Mask { |
||||
fn default() -> Self { |
||||
Mask { |
||||
len: 64, |
||||
offset: 0, |
||||
} |
||||
} |
||||
} |
||||
|
||||
impl Mask { |
||||
pub const BYTE: Mask = Mask { |
||||
len: 8, |
||||
offset: 0, |
||||
}; |
||||
pub const HALF_WORD: Mask = Mask { |
||||
len: 16, |
||||
offset: 0, |
||||
}; |
||||
pub const WORD: Mask = Mask { |
||||
len: 32, |
||||
offset: 0, |
||||
}; |
||||
pub const DOUBLE_WORD: Mask = Mask { |
||||
len: 64, |
||||
offset: 0, |
||||
}; |
||||
pub const FULL: Mask = Self::DOUBLE_WORD; |
||||
|
||||
pub fn new(len: u8, offset: u8) -> Result<Self, AsmError> { |
||||
if len == 0 || offset >= 64 { |
||||
// create the invalid mask to display it in the error
|
||||
return Err(AsmError::BadMask(Mask { |
||||
len, |
||||
offset, |
||||
})); |
||||
} |
||||
|
||||
Ok(Self { |
||||
len: len.min(64 - offset), |
||||
offset, |
||||
}) |
||||
} |
||||
|
||||
/// Get a binary mask representing the span
|
||||
pub fn as_bitmask(self) -> u64 { |
||||
((1 << self.len) - 1) << self.offset |
||||
} |
||||
|
||||
pub fn is_default(self) -> bool { |
||||
self == Self::default() |
||||
} |
||||
} |
Loading…
Reference in new issue