sass-assembler 0.1.1

SASS (NVIDIA GPU) assembler for Gaia project
Documentation
//! SASS instructions for NVIDIA GPUs.

use serde::{Deserialize, Serialize};

/// SASS register
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SassReg {
    /// General purpose register
    R(u8),
    /// Uniform register
    UR(u8),
    /// Predicate register
    PR(u8),
}

impl std::fmt::Display for SassReg {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            SassReg::R(n) => write!(f, "R{}", n),
            SassReg::UR(n) => write!(f, "UR{}", n),
            SassReg::PR(n) => write!(f, "P{}", n),
        }
    }
}

/// SASS instruction set (Maxwell/Pascal/Ampere/Hopper base)
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SassInstruction {
    /// Floating-point add: FADD dst, src0, src1
    FAdd { dst: SassReg, src0: SassReg, src1: SassReg },
    /// Floating-point multiply: FMUL dst, src0, src1
    FMul { dst: SassReg, src0: SassReg, src1: SassReg },
    /// Tensor core multiply-accumulate: IMMA dst, src0, src1, src2
    Imma { dst: SassReg, src0: SassReg, src1: SassReg, src2: SassReg },
    /// Memory load: LDG.E dst, [addr]
    Ldg { dst: SassReg, addr: SassReg },
    /// Memory store: STG.E [addr], src
    Stg { addr: SassReg, src: SassReg },
    /// Control flow: EXIT
    Exit,
    /// Control flow: NOP
    Nop,
}