Skip to main content

ptx_parser/unparser/instruction/
vset2.rs

1//! Original PTX specification:
2//!
3//! // SIMD instruction with secondary SIMD merge operation
4//! vset2.atype.btype.cmp  d{.mask}, a{.asel}, b{.bsel}, c;
5//! // SIMD instruction with secondary accumulate operation
6//! vset2.atype.btype.cmp.add  d{.mask}, a{.asel}, b{.bsel}, c;
7//! .atype = .btype = { .u32, .s32 };
8//! .cmp   = { .eq, .ne, .lt, .le, .gt, .ge };
9//! .mask  = { .h0, .h1, .h10 };  // defaults to .h10
10//! .asel  = .bsel  = { .h00, .h01, .h02, .h03, .h10, .h11, .h12, .h13, .h20, .h21, .h22, .h23, .h30, .h31, .h32, .h33 }; // { .hxy, where x,y are from { 0, 1, 2, 3 } };
11//! // .asel defaults to .h10
12//! // .bsel defaults to .h32
13
14#![allow(unused)]
15
16use crate::lexer::PtxToken;
17use crate::unparser::{PtxUnparser, common::*};
18
19pub mod section_0 {
20    use super::*;
21    use crate::r#type::instruction::vset2::section_0::*;
22
23    impl PtxUnparser for Vset2AtypeBtypeCmp {
24        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
25            self.unparse_tokens_mode(tokens, false);
26        }
27        fn unparse_tokens_mode(&self, tokens: &mut ::std::vec::Vec<PtxToken>, spaced: bool) {
28            push_opcode(tokens, "vset2");
29            match &self.atype {
30                Atype::U32 => {
31                    push_directive(tokens, "u32");
32                }
33                Atype::S32 => {
34                    push_directive(tokens, "s32");
35                }
36            }
37            match &self.btype {
38                Btype::U32 => {
39                    push_directive(tokens, "u32");
40                }
41                Btype::S32 => {
42                    push_directive(tokens, "s32");
43                }
44            }
45            match &self.cmp {
46                Cmp::Eq => {
47                    push_directive(tokens, "eq");
48                }
49                Cmp::Ne => {
50                    push_directive(tokens, "ne");
51                }
52                Cmp::Lt => {
53                    push_directive(tokens, "lt");
54                }
55                Cmp::Le => {
56                    push_directive(tokens, "le");
57                }
58                Cmp::Gt => {
59                    push_directive(tokens, "gt");
60                }
61                Cmp::Ge => {
62                    push_directive(tokens, "ge");
63                }
64            }
65            if spaced {
66                tokens.push(PtxToken::Space);
67            }
68            self.d.unparse_tokens_mode(tokens, spaced);
69            if let Some(mask_0) = self.mask.as_ref() {
70                match mask_0 {
71                    Mask::H10 => {
72                        push_directive(tokens, "h10");
73                    }
74                    Mask::H0 => {
75                        push_directive(tokens, "h0");
76                    }
77                    Mask::H1 => {
78                        push_directive(tokens, "h1");
79                    }
80                }
81            }
82            tokens.push(PtxToken::Comma);
83            if spaced {
84                tokens.push(PtxToken::Space);
85            }
86            self.a.unparse_tokens_mode(tokens, spaced);
87            if let Some(asel_1) = self.asel.as_ref() {
88                match asel_1 {
89                    Asel::H00 => {
90                        push_directive(tokens, "h00");
91                    }
92                    Asel::H01 => {
93                        push_directive(tokens, "h01");
94                    }
95                    Asel::H02 => {
96                        push_directive(tokens, "h02");
97                    }
98                    Asel::H03 => {
99                        push_directive(tokens, "h03");
100                    }
101                    Asel::H10 => {
102                        push_directive(tokens, "h10");
103                    }
104                    Asel::H11 => {
105                        push_directive(tokens, "h11");
106                    }
107                    Asel::H12 => {
108                        push_directive(tokens, "h12");
109                    }
110                    Asel::H13 => {
111                        push_directive(tokens, "h13");
112                    }
113                    Asel::H20 => {
114                        push_directive(tokens, "h20");
115                    }
116                    Asel::H21 => {
117                        push_directive(tokens, "h21");
118                    }
119                    Asel::H22 => {
120                        push_directive(tokens, "h22");
121                    }
122                    Asel::H23 => {
123                        push_directive(tokens, "h23");
124                    }
125                    Asel::H30 => {
126                        push_directive(tokens, "h30");
127                    }
128                    Asel::H31 => {
129                        push_directive(tokens, "h31");
130                    }
131                    Asel::H32 => {
132                        push_directive(tokens, "h32");
133                    }
134                    Asel::H33 => {
135                        push_directive(tokens, "h33");
136                    }
137                }
138            }
139            tokens.push(PtxToken::Comma);
140            if spaced {
141                tokens.push(PtxToken::Space);
142            }
143            self.b.unparse_tokens_mode(tokens, spaced);
144            if let Some(bsel_2) = self.bsel.as_ref() {
145                match bsel_2 {
146                    Bsel::H00 => {
147                        push_directive(tokens, "h00");
148                    }
149                    Bsel::H01 => {
150                        push_directive(tokens, "h01");
151                    }
152                    Bsel::H02 => {
153                        push_directive(tokens, "h02");
154                    }
155                    Bsel::H03 => {
156                        push_directive(tokens, "h03");
157                    }
158                    Bsel::H10 => {
159                        push_directive(tokens, "h10");
160                    }
161                    Bsel::H11 => {
162                        push_directive(tokens, "h11");
163                    }
164                    Bsel::H12 => {
165                        push_directive(tokens, "h12");
166                    }
167                    Bsel::H13 => {
168                        push_directive(tokens, "h13");
169                    }
170                    Bsel::H20 => {
171                        push_directive(tokens, "h20");
172                    }
173                    Bsel::H21 => {
174                        push_directive(tokens, "h21");
175                    }
176                    Bsel::H22 => {
177                        push_directive(tokens, "h22");
178                    }
179                    Bsel::H23 => {
180                        push_directive(tokens, "h23");
181                    }
182                    Bsel::H30 => {
183                        push_directive(tokens, "h30");
184                    }
185                    Bsel::H31 => {
186                        push_directive(tokens, "h31");
187                    }
188                    Bsel::H32 => {
189                        push_directive(tokens, "h32");
190                    }
191                    Bsel::H33 => {
192                        push_directive(tokens, "h33");
193                    }
194                }
195            }
196            tokens.push(PtxToken::Comma);
197            if spaced {
198                tokens.push(PtxToken::Space);
199            }
200            self.c.unparse_tokens_mode(tokens, spaced);
201            tokens.push(PtxToken::Semicolon);
202            if spaced {
203                tokens.push(PtxToken::Newline);
204            }
205        }
206    }
207
208    impl PtxUnparser for Vset2AtypeBtypeCmpAdd {
209        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
210            self.unparse_tokens_mode(tokens, false);
211        }
212        fn unparse_tokens_mode(&self, tokens: &mut ::std::vec::Vec<PtxToken>, spaced: bool) {
213            push_opcode(tokens, "vset2");
214            match &self.atype {
215                Atype::U32 => {
216                    push_directive(tokens, "u32");
217                }
218                Atype::S32 => {
219                    push_directive(tokens, "s32");
220                }
221            }
222            match &self.btype {
223                Btype::U32 => {
224                    push_directive(tokens, "u32");
225                }
226                Btype::S32 => {
227                    push_directive(tokens, "s32");
228                }
229            }
230            match &self.cmp {
231                Cmp::Eq => {
232                    push_directive(tokens, "eq");
233                }
234                Cmp::Ne => {
235                    push_directive(tokens, "ne");
236                }
237                Cmp::Lt => {
238                    push_directive(tokens, "lt");
239                }
240                Cmp::Le => {
241                    push_directive(tokens, "le");
242                }
243                Cmp::Gt => {
244                    push_directive(tokens, "gt");
245                }
246                Cmp::Ge => {
247                    push_directive(tokens, "ge");
248                }
249            }
250            push_directive(tokens, "add");
251            if spaced {
252                tokens.push(PtxToken::Space);
253            }
254            self.d.unparse_tokens_mode(tokens, spaced);
255            if let Some(mask_3) = self.mask.as_ref() {
256                match mask_3 {
257                    Mask::H10 => {
258                        push_directive(tokens, "h10");
259                    }
260                    Mask::H0 => {
261                        push_directive(tokens, "h0");
262                    }
263                    Mask::H1 => {
264                        push_directive(tokens, "h1");
265                    }
266                }
267            }
268            tokens.push(PtxToken::Comma);
269            if spaced {
270                tokens.push(PtxToken::Space);
271            }
272            self.a.unparse_tokens_mode(tokens, spaced);
273            if let Some(asel_4) = self.asel.as_ref() {
274                match asel_4 {
275                    Asel::H00 => {
276                        push_directive(tokens, "h00");
277                    }
278                    Asel::H01 => {
279                        push_directive(tokens, "h01");
280                    }
281                    Asel::H02 => {
282                        push_directive(tokens, "h02");
283                    }
284                    Asel::H03 => {
285                        push_directive(tokens, "h03");
286                    }
287                    Asel::H10 => {
288                        push_directive(tokens, "h10");
289                    }
290                    Asel::H11 => {
291                        push_directive(tokens, "h11");
292                    }
293                    Asel::H12 => {
294                        push_directive(tokens, "h12");
295                    }
296                    Asel::H13 => {
297                        push_directive(tokens, "h13");
298                    }
299                    Asel::H20 => {
300                        push_directive(tokens, "h20");
301                    }
302                    Asel::H21 => {
303                        push_directive(tokens, "h21");
304                    }
305                    Asel::H22 => {
306                        push_directive(tokens, "h22");
307                    }
308                    Asel::H23 => {
309                        push_directive(tokens, "h23");
310                    }
311                    Asel::H30 => {
312                        push_directive(tokens, "h30");
313                    }
314                    Asel::H31 => {
315                        push_directive(tokens, "h31");
316                    }
317                    Asel::H32 => {
318                        push_directive(tokens, "h32");
319                    }
320                    Asel::H33 => {
321                        push_directive(tokens, "h33");
322                    }
323                }
324            }
325            tokens.push(PtxToken::Comma);
326            if spaced {
327                tokens.push(PtxToken::Space);
328            }
329            self.b.unparse_tokens_mode(tokens, spaced);
330            if let Some(bsel_5) = self.bsel.as_ref() {
331                match bsel_5 {
332                    Bsel::H00 => {
333                        push_directive(tokens, "h00");
334                    }
335                    Bsel::H01 => {
336                        push_directive(tokens, "h01");
337                    }
338                    Bsel::H02 => {
339                        push_directive(tokens, "h02");
340                    }
341                    Bsel::H03 => {
342                        push_directive(tokens, "h03");
343                    }
344                    Bsel::H10 => {
345                        push_directive(tokens, "h10");
346                    }
347                    Bsel::H11 => {
348                        push_directive(tokens, "h11");
349                    }
350                    Bsel::H12 => {
351                        push_directive(tokens, "h12");
352                    }
353                    Bsel::H13 => {
354                        push_directive(tokens, "h13");
355                    }
356                    Bsel::H20 => {
357                        push_directive(tokens, "h20");
358                    }
359                    Bsel::H21 => {
360                        push_directive(tokens, "h21");
361                    }
362                    Bsel::H22 => {
363                        push_directive(tokens, "h22");
364                    }
365                    Bsel::H23 => {
366                        push_directive(tokens, "h23");
367                    }
368                    Bsel::H30 => {
369                        push_directive(tokens, "h30");
370                    }
371                    Bsel::H31 => {
372                        push_directive(tokens, "h31");
373                    }
374                    Bsel::H32 => {
375                        push_directive(tokens, "h32");
376                    }
377                    Bsel::H33 => {
378                        push_directive(tokens, "h33");
379                    }
380                }
381            }
382            tokens.push(PtxToken::Comma);
383            if spaced {
384                tokens.push(PtxToken::Space);
385            }
386            self.c.unparse_tokens_mode(tokens, spaced);
387            tokens.push(PtxToken::Semicolon);
388            if spaced {
389                tokens.push(PtxToken::Newline);
390            }
391        }
392    }
393}