1use crate::Spanned;
6use crate::parser::Span;
7use serde::Serialize;
8
9#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
10pub enum CodeLinkage {
11 Visible { span: Span },
13 Extern { span: Span },
15 Weak { span: Span },
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
20pub enum DataLinkage {
21 Visible { span: Span },
23 Extern { span: Span },
25 Weak { span: Span },
27 Common { span: Span },
29}
30
31#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
32pub enum AttributeDirective {
33 Unified { uuid1: u64, uuid2: u64, span: Span },
35 Managed { span: Span },
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
40pub enum DataType {
41 U8 { span: Span },
43 U16 { span: Span },
45 U32 { span: Span },
47 U64 { span: Span },
49 S8 { span: Span },
51 S16 { span: Span },
53 S32 { span: Span },
55 S64 { span: Span },
57 F16 { span: Span },
59 F16x2 { span: Span },
61 F32 { span: Span },
63 F64 { span: Span },
65 B8 { span: Span },
67 B16 { span: Span },
69 B32 { span: Span },
71 B64 { span: Span },
73 B128 { span: Span },
75 Pred { span: Span },
77 TexRef { span: Span },
79 SamplerRef { span: Span },
81 SurfRef { span: Span },
83}
84
85#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
90pub enum Sign {
91 Negative { span: Span },
92 Positive { span: Span },
93}
94
95#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
97pub enum Axis {
98 None {
100 span: Span,
101 },
102 X {
103 span: Span,
104 },
105 Y {
106 span: Span,
107 },
108 Z {
109 span: Span,
110 },
111}
112
113#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
118pub enum SpecialRegister {
119 AggrSmemSize { span: Span },
121 DynamicSmemSize { span: Span },
123 LanemaskGt { span: Span },
125 ReservedSmemOffsetBegin { span: Span },
127 Clock { span: Span },
129 Envreg { index: u8, span: Span },
131 LanemaskLe { span: Span },
133 ReservedSmemOffsetCap { span: Span },
135 Clock64 { span: Span },
137 Globaltimer { span: Span },
139 LanemaskLt { span: Span },
141 ReservedSmemOffsetEnd { span: Span },
143 ClusterCtaid { axis: Axis, span: Span },
145 GlobaltimerHi { span: Span },
147 Nclusterid { span: Span },
149 Smid { span: Span },
151 ClusterCtarank { axis: Axis, span: Span },
153 GlobaltimerLo { span: Span },
155 Nctaid { axis: Axis, span: Span },
157 Tid { axis: Axis, span: Span },
159 ClusterNctaid { axis: Axis, span: Span },
161 Gridid { span: Span },
163 Nsmid { span: Span },
165 TotalSmemSize { span: Span },
167 ClusterNctarank { axis: Axis, span: Span },
169 IsExplicitCluster { span: Span },
171 Ntid { axis: Axis, span: Span },
173 Warpid { span: Span },
175 Clusterid { span: Span },
177 Laneid { span: Span },
179 Nwarpid { span: Span },
181 WARPSZ { span: Span },
183 Ctaid { axis: Axis, span: Span },
185 LanemaskEq { span: Span },
187 Pm { index: u8, span: Span },
189 Pm64 { index: u8, span: Span },
191 CurrentGraphExec { span: Span },
193 LanemaskGe { span: Span },
195 ReservedSmemOffset { index: u8, span: Span },
197}
198
199#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
205pub struct TexHandler2 {
206 pub operands: [GeneralOperand; 2],
207 pub span: Span,
208}
209
210#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
212pub struct TexHandler3Optional {
213 pub handle: GeneralOperand,
214 pub sampler: Option<GeneralOperand>,
215 pub coords: GeneralOperand,
216 pub span: Span,
217}
218
219#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
221pub struct TexHandler3 {
222 pub handle: GeneralOperand,
223 pub sampler: GeneralOperand,
224 pub coords: GeneralOperand,
225 pub span: Span,
226}
227
228#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
229pub enum GeneralOperand {
230 Vec { operand: VectorOperand, span: Span },
231 Single { operand: Operand, span: Span },
232}
233
234#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
235pub enum VectorOperand {
236 Vector1 { operand: Operand, span: Span },
238 Vector2 { operands: [Operand; 2], span: Span },
240 Vector3 { operands: [Operand; 3], span: Span },
242 Vector4 { operands: [Operand; 4], span: Span },
244 Vector8 { operands: [Operand; 8], span: Span },
246}
247
248#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
249pub enum Operand {
250 Register {
252 operand: RegisterOperand,
253 span: Span,
254 },
255 Immediate { operand: Immediate, span: Span },
257 Symbol { name: String, span: Span },
259 VectorSymbolComponent {
261 symbol: String,
262 component: String,
263 span: Span,
264 },
265 SymbolOffset {
267 symbol: String,
268 offset: Immediate,
269 span: Span,
270 },
271}
272
273#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
275pub struct RegisterOperand {
276 pub name: String,
277 pub component: Option<String>,
279 pub span: Span,
280}
281
282#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
284pub struct PredicateRegister {
285 pub name: String,
286 pub span: Span,
287}
288
289#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
291pub enum AddressOperand {
292 Array {
294 base: VariableSymbol,
295 index: Immediate,
296 span: Span,
297 },
298 ImmediateAddress { addr: Immediate, span: Span },
300 Offset {
302 base: AddressBase,
303 offset: Option<AddressOffset>,
304 span: Span,
305 },
306}
307
308#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
310pub enum AddressBase {
311 Register {
312 operand: RegisterOperand,
313 span: Span,
314 },
315 Variable {
316 symbol: VariableSymbol,
317 span: Span,
318 },
319}
320
321#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
323pub enum AddressOffset {
324 Register {
325 operand: RegisterOperand,
326 span: Span,
327 },
328 Immediate {
329 sign: Sign,
330 value: Immediate,
331 span: Span,
332 },
333}
334
335#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
355pub struct Immediate {
356 pub value: String,
358 pub span: Span,
359}
360
361#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
367pub struct FunctionSymbol {
368 pub val: String,
369 pub span: Span,
370}
371
372#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
374pub struct VariableSymbol {
375 pub val: String,
376 pub span: Span,
377}
378
379#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
381pub struct Label {
382 pub val: String,
383 pub span: Span,
384}
385
386#[derive(Debug, Clone, PartialEq, Spanned, Serialize)]
392pub struct Predicate {
393 pub negated: bool,
394 pub operand: Operand,
395 pub span: Span,
396}
397
398#[derive(Debug, Clone, PartialEq, Spanned, Serialize)]
405pub struct Instruction {
406 pub predicate: Option<Predicate>,
407 pub inst: crate::r#type::instruction::Inst,
408 pub span: Span,
409}