From f2f0a8eb4795342a985c49d66eeda73d059e6033 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Mon, 27 Feb 2023 20:22:32 +0100 Subject: Initial support for immediate operands --- src/imm.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/imm.rs (limited to 'src/imm.rs') diff --git a/src/imm.rs b/src/imm.rs new file mode 100644 index 0000000..bcf0d31 --- /dev/null +++ b/src/imm.rs @@ -0,0 +1,35 @@ +/// Trait to interact with immediate operands. +pub(crate) trait Imm { + /// Get immediate operand as slice of bytes. + fn bytes(&self) -> &[u8]; +} + +macro_rules! impl_imm { + ($name:ident, $size:expr, from: $( $from:ty ),* $(,)?) => { + /// Immediate operand. + pub struct $name([u8; $size]); + + impl Imm for $name { + /// Get immediate operand as slice of bytes. + fn bytes(&self) -> &[u8] { + &self.0 + } + } + + $( + impl From<$from> for $name { + fn from(imm: $from) -> Self { + let mut buf = [0u8; $size]; + let imm = imm.to_ne_bytes(); + buf[0..imm.len()].copy_from_slice(&imm); + $name(buf) + } + } + )* + } +} + +impl_imm!(Imm8, 1, from: u8, i8); +impl_imm!(Imm16, 2, from: u16, i16, u8, i8); +impl_imm!(Imm32, 4, from: u32, i32, u16, i16, u8, i8); +impl_imm!(Imm64, 8, from: u64, i64, u32, i32, u16, i16, u8, i8); -- cgit v1.2.3