1use crate::Spanned;
6use crate::parser::Span;
7
8#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
9pub enum CodeLinkage {
10 Visible { span: Span },
12 Extern { span: Span },
14 Weak { span: Span },
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
19pub enum DataLinkage {
20 Visible { span: Span },
22 Extern { span: Span },
24 Weak { span: Span },
26 Common { span: Span },
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
31pub enum AttributeDirective {
32 Unified { uuid1: u64, uuid2: u64, span: Span },
34 Managed { span: Span },
36}
37
38#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
39pub enum DataType {
40 U8 { span: Span },
42 U16 { span: Span },
44 U32 { span: Span },
46 U64 { span: Span },
48 S8 { span: Span },
50 S16 { span: Span },
52 S32 { span: Span },
54 S64 { span: Span },
56 F16 { span: Span },
58 F16x2 { span: Span },
60 F32 { span: Span },
62 F64 { span: Span },
64 B8 { span: Span },
66 B16 { span: Span },
68 B32 { span: Span },
70 B64 { span: Span },
72 B128 { span: Span },
74 Pred { span: Span },
76 TexRef { span: Span },
78 SamplerRef { span: Span },
80 SurfRef { span: Span },
82}
83
84#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
89pub enum Sign {
90 Negative { span: Span },
91 Positive { span: Span },
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
96pub enum Axis {
97 None {
99 span: Span,
100 },
101 X {
102 span: Span,
103 },
104 Y {
105 span: Span,
106 },
107 Z {
108 span: Span,
109 },
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
117pub enum SpecialRegister {
118 AggrSmemSize { span: Span },
120 DynamicSmemSize { span: Span },
122 LanemaskGt { span: Span },
124 ReservedSmemOffsetBegin { span: Span },
126 Clock { span: Span },
128 Envreg { index: u8, span: Span },
130 LanemaskLe { span: Span },
132 ReservedSmemOffsetCap { span: Span },
134 Clock64 { span: Span },
136 Globaltimer { span: Span },
138 LanemaskLt { span: Span },
140 ReservedSmemOffsetEnd { span: Span },
142 ClusterCtaid { axis: Axis, span: Span },
144 GlobaltimerHi { span: Span },
146 Nclusterid { span: Span },
148 Smid { span: Span },
150 ClusterCtarank { axis: Axis, span: Span },
152 GlobaltimerLo { span: Span },
154 Nctaid { axis: Axis, span: Span },
156 Tid { axis: Axis, span: Span },
158 ClusterNctaid { axis: Axis, span: Span },
160 Gridid { span: Span },
162 Nsmid { span: Span },
164 TotalSmemSize { span: Span },
166 ClusterNctarank { axis: Axis, span: Span },
168 IsExplicitCluster { span: Span },
170 Ntid { axis: Axis, span: Span },
172 Warpid { span: Span },
174 Clusterid { span: Span },
176 Laneid { span: Span },
178 Nwarpid { span: Span },
180 WARPSZ { span: Span },
182 Ctaid { axis: Axis, span: Span },
184 LanemaskEq { span: Span },
186 Pm { index: u8, span: Span },
188 Pm64 { index: u8, span: Span },
190 CurrentGraphExec { span: Span },
192 LanemaskGe { span: Span },
194 ReservedSmemOffset { index: u8, span: Span },
196}
197
198#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
204pub struct TexHandler2 {
205 pub operands: [GeneralOperand; 2],
206 pub span: Span,
207}
208
209#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
211pub struct TexHandler3Optional {
212 pub handle: GeneralOperand,
213 pub sampler: Option<GeneralOperand>,
214 pub coords: GeneralOperand,
215 pub span: Span,
216}
217
218#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
220pub struct TexHandler3 {
221 pub handle: GeneralOperand,
222 pub sampler: GeneralOperand,
223 pub coords: GeneralOperand,
224 pub span: Span,
225}
226
227#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
228pub enum GeneralOperand {
229 Vec { operand: VectorOperand, span: Span },
230 Single { operand: Operand, span: Span },
231}
232
233#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
234pub enum VectorOperand {
235 Vector1 { operand: Operand, span: Span },
237 Vector2 { operands: [Operand; 2], span: Span },
239 Vector3 { operands: [Operand; 3], span: Span },
241 Vector4 { operands: [Operand; 4], span: Span },
243 Vector8 { operands: [Operand; 8], span: Span },
245}
246
247#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
248pub enum Operand {
249 Register {
251 operand: RegisterOperand,
252 span: Span,
253 },
254 Immediate { operand: Immediate, span: Span },
256 Symbol { name: String, span: Span },
258 SymbolOffset {
260 symbol: String,
261 offset: Immediate,
262 span: Span,
263 },
264}
265
266#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
268pub struct RegisterOperand {
269 pub name: String,
270 pub component: Option<String>,
272 pub span: Span,
273}
274
275#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
277pub struct PredicateRegister {
278 pub name: String,
279 pub span: Span,
280}
281
282#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
284pub enum AddressOperand {
285 Array {
287 base: VariableSymbol,
288 index: Immediate,
289 span: Span,
290 },
291 ImmediateAddress { addr: Immediate, span: Span },
293 Offset {
295 base: AddressBase,
296 offset: Option<AddressOffset>,
297 span: Span,
298 },
299}
300
301#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
303pub enum AddressBase {
304 Register {
305 operand: RegisterOperand,
306 span: Span,
307 },
308 Variable {
309 symbol: VariableSymbol,
310 span: Span,
311 },
312}
313
314#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
316pub enum AddressOffset {
317 Register {
318 operand: RegisterOperand,
319 span: Span,
320 },
321 Immediate {
322 sign: Sign,
323 value: Immediate,
324 span: Span,
325 },
326}
327
328#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
348pub struct Immediate {
349 pub value: String,
351 pub span: Span,
352}
353
354#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
360pub struct FunctionSymbol {
361 pub val: String,
362 pub span: Span,
363}
364
365#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
367pub struct VariableSymbol {
368 pub val: String,
369 pub span: Span,
370}
371
372#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
374pub struct Label {
375 pub val: String,
376 pub span: Span,
377}
378
379#[derive(Debug, Clone, PartialEq, Spanned)]
385pub struct Predicate {
386 pub negated: bool,
387 pub operand: Operand,
388 pub span: Span,
389}
390
391#[derive(Debug, Clone, PartialEq, Spanned)]
398pub struct Instruction {
399 pub predicate: Option<Predicate>,
400 pub inst: crate::r#type::instruction::Inst,
401 pub span: Span,
402}