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 SymbolOffset {
261 symbol: String,
262 offset: Immediate,
263 span: Span,
264 },
265}
266
267#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
269pub struct RegisterOperand {
270 pub name: String,
271 pub component: Option<String>,
273 pub span: Span,
274}
275
276#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
278pub struct PredicateRegister {
279 pub name: String,
280 pub span: Span,
281}
282
283#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
285pub enum AddressOperand {
286 Array {
288 base: VariableSymbol,
289 index: Immediate,
290 span: Span,
291 },
292 ImmediateAddress { addr: Immediate, span: Span },
294 Offset {
296 base: AddressBase,
297 offset: Option<AddressOffset>,
298 span: Span,
299 },
300}
301
302#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
304pub enum AddressBase {
305 Register {
306 operand: RegisterOperand,
307 span: Span,
308 },
309 Variable {
310 symbol: VariableSymbol,
311 span: Span,
312 },
313}
314
315#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
317pub enum AddressOffset {
318 Register {
319 operand: RegisterOperand,
320 span: Span,
321 },
322 Immediate {
323 sign: Sign,
324 value: Immediate,
325 span: Span,
326 },
327}
328
329#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
349pub struct Immediate {
350 pub value: String,
352 pub span: Span,
353}
354
355#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
361pub struct FunctionSymbol {
362 pub val: String,
363 pub span: Span,
364}
365
366#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
368pub struct VariableSymbol {
369 pub val: String,
370 pub span: Span,
371}
372
373#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
375pub struct Label {
376 pub val: String,
377 pub span: Span,
378}
379
380#[derive(Debug, Clone, PartialEq, Spanned, Serialize)]
386pub struct Predicate {
387 pub negated: bool,
388 pub operand: Operand,
389 pub span: Span,
390}
391
392#[derive(Debug, Clone, PartialEq, Spanned, Serialize)]
399pub struct Instruction {
400 pub predicate: Option<Predicate>,
401 pub inst: crate::r#type::instruction::Inst,
402 pub span: Span,
403}