|
|
|
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, ")")
|
|
|
|
}
|
|
|
|
}
|