use crate::Spanned;
use crate::parser::Span;
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum CodeLinkage {
Visible { span: Span },
Extern { span: Span },
Weak { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum DataLinkage {
Visible { span: Span },
Extern { span: Span },
Weak { span: Span },
Common { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum AttributeDirective {
Unified { uuid1: u64, uuid2: u64, span: Span },
Managed { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
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 },
TexRef { span: Span },
SamplerRef { span: Span },
SurfRef { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum Sign {
Negative { span: Span },
Positive { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum Axis {
None {
span: Span,
},
X {
span: Span,
},
Y {
span: Span,
},
Z {
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
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 },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct TexHandler2 {
pub operands: [GeneralOperand; 2],
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct TexHandler3Optional {
pub handle: GeneralOperand,
pub sampler: Option<GeneralOperand>,
pub coords: GeneralOperand,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct TexHandler3 {
pub handle: GeneralOperand,
pub sampler: GeneralOperand,
pub coords: GeneralOperand,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum GeneralOperand {
Vec { operand: VectorOperand, span: Span },
Single { operand: Operand, span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
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 },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
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,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct RegisterOperand {
pub name: String,
pub component: Option<String>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct PredicateRegister {
pub name: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum AddressOperand {
Array {
base: VariableSymbol,
index: Immediate,
span: Span,
},
ImmediateAddress { addr: Immediate, span: Span },
Offset {
base: AddressBase,
offset: Option<AddressOffset>,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum AddressBase {
Register {
operand: RegisterOperand,
span: Span,
},
Variable {
symbol: VariableSymbol,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum AddressOffset {
Register {
operand: RegisterOperand,
span: Span,
},
Immediate {
sign: Sign,
value: Immediate,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct Immediate {
pub value: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct FunctionSymbol {
pub val: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct VariableSymbol {
pub val: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct Label {
pub val: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Spanned)]
pub struct Predicate {
pub negated: bool,
pub operand: Operand,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Spanned)]
pub struct Instruction {
pub predicate: Option<Predicate>,
pub inst: crate::r#type::instruction::Inst,
pub span: Span,
}