use regalloc2::PReg;
pub use regalloc2::RegClass;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Reg(PReg);
pub(crate) type WritableReg = cranelift_codegen::Writable<Reg>;
macro_rules! writable {
($e:expr) => {
cranelift_codegen::Writable::from_reg($e)
};
}
pub(crate) use writable;
impl Reg {
pub fn from(class: RegClass, enc: usize) -> Self {
Self::new(PReg::new(enc, class))
}
pub const fn new(raw: PReg) -> Self {
Reg(raw)
}
pub fn int(enc: usize) -> Self {
Self::new(PReg::new(enc, RegClass::Int))
}
pub fn float(enc: usize) -> Self {
Self::new(PReg::new(enc, RegClass::Float))
}
pub const fn hw_enc(self) -> usize {
self.0.hw_enc()
}
pub(super) fn inner(&self) -> PReg {
self.0
}
pub fn class(&self) -> RegClass {
self.0.class()
}
pub fn is_int(&self) -> bool {
self.class() == RegClass::Int
}
pub fn is_float(&self) -> bool {
self.class() == RegClass::Float
}
}
impl From<Reg> for cranelift_codegen::Reg {
fn from(reg: Reg) -> Self {
reg.inner().into()
}
}
impl std::fmt::Debug for Reg {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}