use crate::parser::Span;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CodeLinkage {
Visible { span: Span },
Extern { span: Span },
Weak { span: Span },
}
impl CodeLinkage {
pub fn span(&self) -> Span {
match self {
CodeLinkage::Visible { span } => span.clone(),
CodeLinkage::Extern { span } => span.clone(),
CodeLinkage::Weak { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DataLinkage {
Visible { span: Span },
Extern { span: Span },
Weak { span: Span },
Common { span: Span },
}
impl DataLinkage {
pub fn span(&self) -> Span {
match self {
DataLinkage::Visible { span } => span.clone(),
DataLinkage::Extern { span } => span.clone(),
DataLinkage::Weak { span } => span.clone(),
DataLinkage::Common { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CodeOrDataLinkage {
Visible { span: Span },
Extern { span: Span },
Weak { span: Span },
Common { span: Span },
}
impl CodeOrDataLinkage {
pub fn span(&self) -> Span {
match self {
CodeOrDataLinkage::Visible { span } => span.clone(),
CodeOrDataLinkage::Extern { span } => span.clone(),
CodeOrDataLinkage::Weak { span } => span.clone(),
CodeOrDataLinkage::Common { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TexType {
TexRef { span: Span },
SamplerRef { span: Span },
SurfRef { span: Span },
}
impl TexType {
pub fn span(&self) -> Span {
match self {
TexType::TexRef { span } => span.clone(),
TexType::SamplerRef { span } => span.clone(),
TexType::SurfRef { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressSpace {
Global { span: Span },
Const { span: Span },
Shared { span: Span },
Local { span: Span },
Param { span: Span },
Reg { span: Span },
}
impl AddressSpace {
pub fn span(&self) -> Span {
match self {
AddressSpace::Global { span } => span.clone(),
AddressSpace::Const { span } => span.clone(),
AddressSpace::Shared { span } => span.clone(),
AddressSpace::Local { span } => span.clone(),
AddressSpace::Param { span } => span.clone(),
AddressSpace::Reg { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AttributeDirective {
Unified { uuid1: u64, uuid2: u64, span: Span },
Managed { span: Span },
}
impl AttributeDirective {
pub fn span(&self) -> Span {
match self {
AttributeDirective::Unified { span, .. } => span.clone(),
AttributeDirective::Managed { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DataType {
U8 { span: Span },
U16 { span: Span },
U32 { span: Span },
U64 { span: Span },
S8 { span: Span },
S16 { span: Span },
S32 { span: Span },
S64 { span: Span },
F16 { span: Span },
F16x2 { span: Span },
F32 { span: Span },
F64 { span: Span },
B8 { span: Span },
B16 { span: Span },
B32 { span: Span },
B64 { span: Span },
B128 { span: Span },
Pred { span: Span },
}
impl DataType {
pub fn span(&self) -> Span {
match self {
DataType::U8 { span } => span.clone(),
DataType::U16 { span } => span.clone(),
DataType::U32 { span } => span.clone(),
DataType::U64 { span } => span.clone(),
DataType::S8 { span } => span.clone(),
DataType::S16 { span } => span.clone(),
DataType::S32 { span } => span.clone(),
DataType::S64 { span } => span.clone(),
DataType::F16 { span } => span.clone(),
DataType::F16x2 { span } => span.clone(),
DataType::F32 { span } => span.clone(),
DataType::F64 { span } => span.clone(),
DataType::B8 { span } => span.clone(),
DataType::B16 { span } => span.clone(),
DataType::B32 { span } => span.clone(),
DataType::B64 { span } => span.clone(),
DataType::B128 { span } => span.clone(),
DataType::Pred { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Sign {
Negative { span: Span },
Positive { span: Span },
}
impl Sign {
pub fn span(&self) -> Span {
match self {
Sign::Negative { span } => span.clone(),
Sign::Positive { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Axis {
None { span: Span },
X { span: Span },
Y { span: Span },
Z { span: Span },
}
impl Axis {
pub fn span(&self) -> Span {
match self {
Axis::None { span } => span.clone(),
Axis::X { span } => span.clone(),
Axis::Y { span } => span.clone(),
Axis::Z { span } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Label {
pub name: String,
pub span: Span,
}
impl Label {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SpecialRegister {
AggrSmemSize { span: Span },
DynamicSmemSize { span: Span },
LanemaskGt { span: Span },
ReservedSmemOffsetBegin { span: Span },
Clock { span: Span },
Envreg { index: u8, span: Span },
LanemaskLe { span: Span },
ReservedSmemOffsetCap { span: Span },
Clock64 { span: Span },
Globaltimer { span: Span },
LanemaskLt { span: Span },
ReservedSmemOffsetEnd { span: Span },
ClusterCtaid { axis: Axis, span: Span },
GlobaltimerHi { span: Span },
Nclusterid { span: Span },
Smid { span: Span },
ClusterCtarank { axis: Axis, span: Span },
GlobaltimerLo { span: Span },
Nctaid { axis: Axis, span: Span },
Tid { axis: Axis, span: Span },
ClusterNctaid { axis: Axis, span: Span },
Gridid { span: Span },
Nsmid { span: Span },
TotalSmemSize { span: Span },
ClusterNctarank { axis: Axis, span: Span },
IsExplicitCluster { span: Span },
Ntid { axis: Axis, span: Span },
Warpid { span: Span },
Clusterid { span: Span },
Laneid { span: Span },
Nwarpid { span: Span },
WARPSZ { span: Span },
Ctaid { axis: Axis, span: Span },
LanemaskEq { span: Span },
Pm { index: u8, span: Span },
Pm64 { index: u8, span: Span },
CurrentGraphExec { span: Span },
LanemaskGe { span: Span },
ReservedSmemOffset { index: u8, span: Span },
}
impl SpecialRegister {
pub fn span(&self) -> Span {
match self {
SpecialRegister::AggrSmemSize { span } => span.clone(),
SpecialRegister::DynamicSmemSize { span } => span.clone(),
SpecialRegister::LanemaskGt { span } => span.clone(),
SpecialRegister::ReservedSmemOffsetBegin { span } => span.clone(),
SpecialRegister::Clock { span } => span.clone(),
SpecialRegister::Envreg { span, .. } => span.clone(),
SpecialRegister::LanemaskLe { span } => span.clone(),
SpecialRegister::ReservedSmemOffsetCap { span } => span.clone(),
SpecialRegister::Clock64 { span } => span.clone(),
SpecialRegister::Globaltimer { span } => span.clone(),
SpecialRegister::LanemaskLt { span } => span.clone(),
SpecialRegister::ReservedSmemOffsetEnd { span } => span.clone(),
SpecialRegister::ClusterCtaid { span, .. } => span.clone(),
SpecialRegister::GlobaltimerHi { span } => span.clone(),
SpecialRegister::Nclusterid { span } => span.clone(),
SpecialRegister::Smid { span } => span.clone(),
SpecialRegister::ClusterCtarank { span, .. } => span.clone(),
SpecialRegister::GlobaltimerLo { span } => span.clone(),
SpecialRegister::Nctaid { span, .. } => span.clone(),
SpecialRegister::Tid { span, .. } => span.clone(),
SpecialRegister::ClusterNctaid { span, .. } => span.clone(),
SpecialRegister::Gridid { span } => span.clone(),
SpecialRegister::Nsmid { span } => span.clone(),
SpecialRegister::TotalSmemSize { span } => span.clone(),
SpecialRegister::ClusterNctarank { span, .. } => span.clone(),
SpecialRegister::IsExplicitCluster { span } => span.clone(),
SpecialRegister::Ntid { span, .. } => span.clone(),
SpecialRegister::Warpid { span } => span.clone(),
SpecialRegister::Clusterid { span } => span.clone(),
SpecialRegister::Laneid { span } => span.clone(),
SpecialRegister::Nwarpid { span } => span.clone(),
SpecialRegister::WARPSZ { span } => span.clone(),
SpecialRegister::Ctaid { span, .. } => span.clone(),
SpecialRegister::LanemaskEq { span } => span.clone(),
SpecialRegister::Pm { span, .. } => span.clone(),
SpecialRegister::Pm64 { span, .. } => span.clone(),
SpecialRegister::CurrentGraphExec { span } => span.clone(),
SpecialRegister::LanemaskGe { span } => span.clone(),
SpecialRegister::ReservedSmemOffset { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TexHandler2 {
pub operands: [GeneralOperand; 2],
pub span: Span,
}
impl TexHandler2 {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TexHandler3Optional {
pub handle: GeneralOperand,
pub sampler: Option<GeneralOperand>,
pub coords: GeneralOperand,
pub span: Span,
}
impl TexHandler3Optional {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TexHandler3 {
pub handle: GeneralOperand,
pub sampler: GeneralOperand,
pub coords: GeneralOperand,
pub span: Span,
}
impl TexHandler3 {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum GeneralOperand {
Vec { operand: VectorOperand, span: Span },
Single { operand: Operand, span: Span },
}
impl GeneralOperand {
pub fn span(&self) -> Span {
match self {
GeneralOperand::Vec { span, .. } => span.clone(),
GeneralOperand::Single { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VectorOperand {
Vector1 { operand: Operand, span: Span },
Vector2 { operands: [Operand; 2], span: Span },
Vector3 { operands: [Operand; 3], span: Span },
Vector4 { operands: [Operand; 4], span: Span },
Vector8 { operands: [Operand; 8], span: Span },
}
impl VectorOperand {
pub fn span(&self) -> Span {
match self {
VectorOperand::Vector1 { span, .. } => span.clone(),
VectorOperand::Vector2 { span, .. } => span.clone(),
VectorOperand::Vector3 { span, .. } => span.clone(),
VectorOperand::Vector4 { span, .. } => span.clone(),
VectorOperand::Vector8 { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Operand {
Register { operand: RegisterOperand, span: Span },
Immediate { operand: Immediate, span: Span },
Symbol { name: String, span: Span },
SymbolOffset { symbol: String, offset: Immediate, span: Span },
}
impl Operand {
pub fn span(&self) -> Span {
match self {
Operand::Register { span, .. } => span.clone(),
Operand::Immediate { span, .. } => span.clone(),
Operand::Symbol { span, .. } => span.clone(),
Operand::SymbolOffset { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RegisterOperand {
pub name: String,
pub span: Span,
}
impl RegisterOperand {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PredicateRegister {
pub name: String,
pub span: Span,
}
impl PredicateRegister {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressOperand {
Array { base: VariableSymbol, index: Immediate, span: Span },
ImmediateAddress { addr: Immediate, span: Span },
Offset { base: AddressBase, offset: Option<AddressOffset>, span: Span },
}
impl AddressOperand {
pub fn span(&self) -> Span {
match self {
AddressOperand::Array { span, .. } => span.clone(),
AddressOperand::ImmediateAddress { span, .. } => span.clone(),
AddressOperand::Offset { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressBase {
Register { operand: RegisterOperand, span: Span },
Variable { symbol: VariableSymbol, span: Span },
}
impl AddressBase {
pub fn span(&self) -> Span {
match self {
AddressBase::Register { span, .. } => span.clone(),
AddressBase::Variable { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressOffset {
Register { operand: RegisterOperand, span: Span },
Immediate { sign: Sign, value: Immediate, span: Span },
}
impl AddressOffset {
pub fn span(&self) -> Span {
match self {
AddressOffset::Register { span, .. } => span.clone(),
AddressOffset::Immediate { span, .. } => span.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Immediate {
pub value: String,
pub span: Span,
}
impl Immediate {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FunctionSymbol {
pub name: String,
pub span: Span,
}
impl FunctionSymbol {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VariableSymbol {
pub name: String,
pub span: Span,
}
impl VariableSymbol {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Predicate {
pub negated: bool,
pub operand: Operand,
pub span: Span,
}
impl Predicate {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Instruction {
pub predicate: Option<Predicate>,
pub inst: crate::r#type::instruction::Inst,
pub span: Span,
}
impl Instruction {
pub fn with_span(mut self, span: Span) -> Self {
self.span = span;
self
}
}