use std::fmt::{Debug, Formatter}; use std::fmt; use crate::asm::data::{DataDisp, Mask, RdData, Register}; use crate::asm::data::literal::Value; /// Data source argument (read-only) #[derive(Clone, Copy, Eq, PartialEq)] pub struct Rd(pub RdData, pub Mask); impl Rd { pub const fn new(src: RdData) -> Self { Rd(src, Mask::FULL) } pub fn data(self) -> RdData { self.0 } pub fn mask(self) -> Mask { self.1 } pub fn immediate(val: Value) -> Rd { Rd(RdData::Immediate(val), Mask::default()) } } impl Debug for Rd { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!(f, "Rd(")?; let disp: DataDisp = self.0.into(); write!(f, "{}", disp)?; if !self.mask().is_default() { write!(f, ",{:?}", self.mask())?; } write!(f, ")") } } /// Reference an object through a handle #[derive(Clone, Copy, Eq, PartialEq)] pub struct RdObj(Register); impl RdObj { pub fn new(reg: Register) -> Self { RdObj(reg) } pub const fn reg(self) -> Register { self.0 } } impl Debug for RdObj { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!(f, "Obj(")?; write!(f, "{}", self.reg())?; write!(f, ")") } }