use std::fmt;
use super::register::Register;
#[derive(Debug, Clone)]
pub enum Operand {
Reg(Register),
ImmI32(i32),
ImmU32(u32),
ImmI64(i64),
ImmU64(u64),
ImmF32(f32),
ImmF64(f64),
SpecialReg(SpecialReg),
SharedAddr(String),
}
impl fmt::Display for Operand {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Reg(r) => write!(f, "{r}"),
Self::ImmI32(v) => write!(f, "{v}"),
Self::ImmU32(v) => write!(f, "{v}"),
Self::ImmI64(v) => write!(f, "{v}"),
Self::ImmU64(v) => write!(f, "{v}"),
Self::ImmF32(v) => {
if v.fract() == 0.0 {
write!(f, "{v:.1}")
} else {
write!(f, "{v}")
}
}
Self::ImmF64(v) => {
if v.fract() == 0.0 {
write!(f, "{v:.1}")
} else {
write!(f, "{v}")
}
}
Self::SpecialReg(sr) => write!(f, "{}", sr.ptx_name()),
Self::SharedAddr(name) => write!(f, "{name}"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SpecialReg {
TidX,
TidY,
TidZ,
NtidX,
NtidY,
NtidZ,
CtaidX,
CtaidY,
CtaidZ,
NctaidX,
NctaidY,
NctaidZ,
}
impl SpecialReg {
pub fn ptx_name(&self) -> &'static str {
match self {
Self::TidX => "%tid.x",
Self::TidY => "%tid.y",
Self::TidZ => "%tid.z",
Self::NtidX => "%ntid.x",
Self::NtidY => "%ntid.y",
Self::NtidZ => "%ntid.z",
Self::CtaidX => "%ctaid.x",
Self::CtaidY => "%ctaid.y",
Self::CtaidZ => "%ctaid.z",
Self::NctaidX => "%nctaid.x",
Self::NctaidY => "%nctaid.y",
Self::NctaidZ => "%nctaid.z",
}
}
}