1#![allow(unused)]
30
31use crate::lexer::PtxToken;
32use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
33use crate::r#type::common::*;
34
35pub mod section_0 {
36 use super::*;
37 use crate::r#type::instruction::red::section_0::*;
38
39 impl PtxParser for LevelCacheHint {
44 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
45 {
47 let saved_pos = stream.position();
48 if stream.expect_string(".L2::cache_hint").is_ok() {
49 return Ok(LevelCacheHint::L2CacheHint);
50 }
51 stream.set_position(saved_pos);
52 }
53 let span = stream
54 .peek()
55 .map(|(_, s)| s.clone())
56 .unwrap_or(Span { start: 0, end: 0 });
57 let expected = &[".L2::cache_hint"];
58 let found = stream
59 .peek()
60 .map(|(t, _)| format!("{:?}", t))
61 .unwrap_or_else(|_| "<end of input>".to_string());
62 Err(crate::parser::unexpected_value(span, expected, found))
63 }
64 }
65
66 impl PtxParser for Op {
67 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
68 {
70 let saved_pos = stream.position();
71 if stream.expect_string(".and").is_ok() {
72 return Ok(Op::And);
73 }
74 stream.set_position(saved_pos);
75 }
76 let saved_pos = stream.position();
77 {
79 let saved_pos = stream.position();
80 if stream.expect_string(".xor").is_ok() {
81 return Ok(Op::Xor);
82 }
83 stream.set_position(saved_pos);
84 }
85 stream.set_position(saved_pos);
86 let saved_pos = stream.position();
87 {
89 let saved_pos = stream.position();
90 if stream.expect_string(".add").is_ok() {
91 return Ok(Op::Add);
92 }
93 stream.set_position(saved_pos);
94 }
95 stream.set_position(saved_pos);
96 let saved_pos = stream.position();
97 {
99 let saved_pos = stream.position();
100 if stream.expect_string(".inc").is_ok() {
101 return Ok(Op::Inc);
102 }
103 stream.set_position(saved_pos);
104 }
105 stream.set_position(saved_pos);
106 let saved_pos = stream.position();
107 {
109 let saved_pos = stream.position();
110 if stream.expect_string(".dec").is_ok() {
111 return Ok(Op::Dec);
112 }
113 stream.set_position(saved_pos);
114 }
115 stream.set_position(saved_pos);
116 let saved_pos = stream.position();
117 {
119 let saved_pos = stream.position();
120 if stream.expect_string(".min").is_ok() {
121 return Ok(Op::Min);
122 }
123 stream.set_position(saved_pos);
124 }
125 stream.set_position(saved_pos);
126 let saved_pos = stream.position();
127 {
129 let saved_pos = stream.position();
130 if stream.expect_string(".max").is_ok() {
131 return Ok(Op::Max);
132 }
133 stream.set_position(saved_pos);
134 }
135 stream.set_position(saved_pos);
136 let saved_pos = stream.position();
137 {
139 let saved_pos = stream.position();
140 if stream.expect_string(".or").is_ok() {
141 return Ok(Op::Or);
142 }
143 stream.set_position(saved_pos);
144 }
145 stream.set_position(saved_pos);
146 let span = stream
147 .peek()
148 .map(|(_, s)| s.clone())
149 .unwrap_or(Span { start: 0, end: 0 });
150 let expected = &[
151 ".and", ".xor", ".add", ".inc", ".dec", ".min", ".max", ".or",
152 ];
153 let found = stream
154 .peek()
155 .map(|(t, _)| format!("{:?}", t))
156 .unwrap_or_else(|_| "<end of input>".to_string());
157 Err(crate::parser::unexpected_value(span, expected, found))
158 }
159 }
160
161 impl PtxParser for Scope {
162 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
163 {
165 let saved_pos = stream.position();
166 if stream.expect_string(".cluster").is_ok() {
167 return Ok(Scope::Cluster);
168 }
169 stream.set_position(saved_pos);
170 }
171 let saved_pos = stream.position();
172 {
174 let saved_pos = stream.position();
175 if stream.expect_string(".cta").is_ok() {
176 return Ok(Scope::Cta);
177 }
178 stream.set_position(saved_pos);
179 }
180 stream.set_position(saved_pos);
181 let saved_pos = stream.position();
182 {
184 let saved_pos = stream.position();
185 if stream.expect_string(".gpu").is_ok() {
186 return Ok(Scope::Gpu);
187 }
188 stream.set_position(saved_pos);
189 }
190 stream.set_position(saved_pos);
191 let saved_pos = stream.position();
192 {
194 let saved_pos = stream.position();
195 if stream.expect_string(".sys").is_ok() {
196 return Ok(Scope::Sys);
197 }
198 stream.set_position(saved_pos);
199 }
200 stream.set_position(saved_pos);
201 let span = stream
202 .peek()
203 .map(|(_, s)| s.clone())
204 .unwrap_or(Span { start: 0, end: 0 });
205 let expected = &[".cluster", ".cta", ".gpu", ".sys"];
206 let found = stream
207 .peek()
208 .map(|(t, _)| format!("{:?}", t))
209 .unwrap_or_else(|_| "<end of input>".to_string());
210 Err(crate::parser::unexpected_value(span, expected, found))
211 }
212 }
213
214 impl PtxParser for Sem {
215 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
216 {
218 let saved_pos = stream.position();
219 if stream.expect_string(".relaxed").is_ok() {
220 return Ok(Sem::Relaxed);
221 }
222 stream.set_position(saved_pos);
223 }
224 let saved_pos = stream.position();
225 {
227 let saved_pos = stream.position();
228 if stream.expect_string(".release").is_ok() {
229 return Ok(Sem::Release);
230 }
231 stream.set_position(saved_pos);
232 }
233 stream.set_position(saved_pos);
234 let span = stream
235 .peek()
236 .map(|(_, s)| s.clone())
237 .unwrap_or(Span { start: 0, end: 0 });
238 let expected = &[".relaxed", ".release"];
239 let found = stream
240 .peek()
241 .map(|(t, _)| format!("{:?}", t))
242 .unwrap_or_else(|_| "<end of input>".to_string());
243 Err(crate::parser::unexpected_value(span, expected, found))
244 }
245 }
246
247 impl PtxParser for Space {
248 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
249 {
251 let saved_pos = stream.position();
252 if stream.expect_string(".shared::cluster").is_ok() {
253 return Ok(Space::SharedCluster);
254 }
255 stream.set_position(saved_pos);
256 }
257 let saved_pos = stream.position();
258 {
260 let saved_pos = stream.position();
261 if stream.expect_string(".shared::cta").is_ok() {
262 return Ok(Space::SharedCta);
263 }
264 stream.set_position(saved_pos);
265 }
266 stream.set_position(saved_pos);
267 let saved_pos = stream.position();
268 {
270 let saved_pos = stream.position();
271 if stream.expect_string(".global").is_ok() {
272 return Ok(Space::Global);
273 }
274 stream.set_position(saved_pos);
275 }
276 stream.set_position(saved_pos);
277 let saved_pos = stream.position();
278 {
280 let saved_pos = stream.position();
281 if stream.expect_string(".shared").is_ok() {
282 return Ok(Space::Shared);
283 }
284 stream.set_position(saved_pos);
285 }
286 stream.set_position(saved_pos);
287 let span = stream
288 .peek()
289 .map(|(_, s)| s.clone())
290 .unwrap_or(Span { start: 0, end: 0 });
291 let expected = &[".shared::cluster", ".shared::cta", ".global", ".shared"];
292 let found = stream
293 .peek()
294 .map(|(t, _)| format!("{:?}", t))
295 .unwrap_or_else(|_| "<end of input>".to_string());
296 Err(crate::parser::unexpected_value(span, expected, found))
297 }
298 }
299
300 impl PtxParser for Type {
301 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
302 {
304 let saved_pos = stream.position();
305 if stream.expect_string(".b32").is_ok() {
306 return Ok(Type::B32);
307 }
308 stream.set_position(saved_pos);
309 }
310 let saved_pos = stream.position();
311 {
313 let saved_pos = stream.position();
314 if stream.expect_string(".b64").is_ok() {
315 return Ok(Type::B64);
316 }
317 stream.set_position(saved_pos);
318 }
319 stream.set_position(saved_pos);
320 let saved_pos = stream.position();
321 {
323 let saved_pos = stream.position();
324 if stream.expect_string(".u32").is_ok() {
325 return Ok(Type::U32);
326 }
327 stream.set_position(saved_pos);
328 }
329 stream.set_position(saved_pos);
330 let saved_pos = stream.position();
331 {
333 let saved_pos = stream.position();
334 if stream.expect_string(".u64").is_ok() {
335 return Ok(Type::U64);
336 }
337 stream.set_position(saved_pos);
338 }
339 stream.set_position(saved_pos);
340 let saved_pos = stream.position();
341 {
343 let saved_pos = stream.position();
344 if stream.expect_string(".s32").is_ok() {
345 return Ok(Type::S32);
346 }
347 stream.set_position(saved_pos);
348 }
349 stream.set_position(saved_pos);
350 let saved_pos = stream.position();
351 {
353 let saved_pos = stream.position();
354 if stream.expect_string(".s64").is_ok() {
355 return Ok(Type::S64);
356 }
357 stream.set_position(saved_pos);
358 }
359 stream.set_position(saved_pos);
360 let saved_pos = stream.position();
361 {
363 let saved_pos = stream.position();
364 if stream.expect_string(".f32").is_ok() {
365 return Ok(Type::F32);
366 }
367 stream.set_position(saved_pos);
368 }
369 stream.set_position(saved_pos);
370 let saved_pos = stream.position();
371 {
373 let saved_pos = stream.position();
374 if stream.expect_string(".f64").is_ok() {
375 return Ok(Type::F64);
376 }
377 stream.set_position(saved_pos);
378 }
379 stream.set_position(saved_pos);
380 let span = stream
381 .peek()
382 .map(|(_, s)| s.clone())
383 .unwrap_or(Span { start: 0, end: 0 });
384 let expected = &[
385 ".b32", ".b64", ".u32", ".u64", ".s32", ".s64", ".f32", ".f64",
386 ];
387 let found = stream
388 .peek()
389 .map(|(t, _)| format!("{:?}", t))
390 .unwrap_or_else(|_| "<end of input>".to_string());
391 Err(crate::parser::unexpected_value(span, expected, found))
392 }
393 }
394
395 impl PtxParser for RedOpSpaceSemScopeLevelCacheHintType {
396 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
397 stream.expect_string("red")?;
398 let op = Op::parse(stream)?;
399 stream.expect_complete()?;
400 let saved_pos = stream.position();
401 let space = match Space::parse(stream) {
402 Ok(val) => Some(val),
403 Err(_) => {
404 stream.set_position(saved_pos);
405 None
406 }
407 };
408 stream.expect_complete()?;
409 let saved_pos = stream.position();
410 let sem = match Sem::parse(stream) {
411 Ok(val) => Some(val),
412 Err(_) => {
413 stream.set_position(saved_pos);
414 None
415 }
416 };
417 stream.expect_complete()?;
418 let saved_pos = stream.position();
419 let scope = match Scope::parse(stream) {
420 Ok(val) => Some(val),
421 Err(_) => {
422 stream.set_position(saved_pos);
423 None
424 }
425 };
426 stream.expect_complete()?;
427 let saved_pos = stream.position();
428 let level_cache_hint = match LevelCacheHint::parse(stream) {
429 Ok(val) => Some(val),
430 Err(_) => {
431 stream.set_position(saved_pos);
432 None
433 }
434 };
435 stream.expect_complete()?;
436 let type_ = Type::parse(stream)?;
437 stream.expect_complete()?;
438 let a = AddressOperand::parse(stream)?;
439 stream.expect_complete()?;
440 stream.expect(&PtxToken::Comma)?;
441 let b = GeneralOperand::parse(stream)?;
442 stream.expect_complete()?;
443 let saved_pos = stream.position();
444 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
445 if !has_comma {
446 stream.set_position(saved_pos);
447 }
448 let saved_pos = stream.position();
449 let cache_policy = match GeneralOperand::parse(stream) {
450 Ok(val) => Some(val),
451 Err(_) => {
452 stream.set_position(saved_pos);
453 None
454 }
455 };
456 stream.expect_complete()?;
457 stream.expect_complete()?;
458 stream.expect(&PtxToken::Semicolon)?;
459 Ok(RedOpSpaceSemScopeLevelCacheHintType {
460 op,
461 space,
462 sem,
463 scope,
464 level_cache_hint,
465 type_,
466 a,
467 b,
468 cache_policy,
469 })
470 }
471 }
472
473 impl PtxParser for RedAddSpaceSemScopeNoftzLevelCacheHintF16 {
474 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
475 stream.expect_string("red")?;
476 stream.expect_string(".add")?;
477 let add = ();
478 stream.expect_complete()?;
479 let saved_pos = stream.position();
480 let space = match Space::parse(stream) {
481 Ok(val) => Some(val),
482 Err(_) => {
483 stream.set_position(saved_pos);
484 None
485 }
486 };
487 stream.expect_complete()?;
488 let saved_pos = stream.position();
489 let sem = match Sem::parse(stream) {
490 Ok(val) => Some(val),
491 Err(_) => {
492 stream.set_position(saved_pos);
493 None
494 }
495 };
496 stream.expect_complete()?;
497 let saved_pos = stream.position();
498 let scope = match Scope::parse(stream) {
499 Ok(val) => Some(val),
500 Err(_) => {
501 stream.set_position(saved_pos);
502 None
503 }
504 };
505 stream.expect_complete()?;
506 stream.expect_string(".noftz")?;
507 let noftz = ();
508 stream.expect_complete()?;
509 let saved_pos = stream.position();
510 let level_cache_hint = match LevelCacheHint::parse(stream) {
511 Ok(val) => Some(val),
512 Err(_) => {
513 stream.set_position(saved_pos);
514 None
515 }
516 };
517 stream.expect_complete()?;
518 stream.expect_string(".f16")?;
519 let f16 = ();
520 stream.expect_complete()?;
521 let a = AddressOperand::parse(stream)?;
522 stream.expect_complete()?;
523 stream.expect(&PtxToken::Comma)?;
524 let b = GeneralOperand::parse(stream)?;
525 stream.expect_complete()?;
526 let saved_pos = stream.position();
527 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
528 if !has_comma {
529 stream.set_position(saved_pos);
530 }
531 let saved_pos = stream.position();
532 let cache_policy = match GeneralOperand::parse(stream) {
533 Ok(val) => Some(val),
534 Err(_) => {
535 stream.set_position(saved_pos);
536 None
537 }
538 };
539 stream.expect_complete()?;
540 stream.expect_complete()?;
541 stream.expect(&PtxToken::Semicolon)?;
542 Ok(RedAddSpaceSemScopeNoftzLevelCacheHintF16 {
543 add,
544 space,
545 sem,
546 scope,
547 noftz,
548 level_cache_hint,
549 f16,
550 a,
551 b,
552 cache_policy,
553 })
554 }
555 }
556
557 impl PtxParser for RedAddSpaceSemScopeNoftzLevelCacheHintF16x2 {
558 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
559 stream.expect_string("red")?;
560 stream.expect_string(".add")?;
561 let add = ();
562 stream.expect_complete()?;
563 let saved_pos = stream.position();
564 let space = match Space::parse(stream) {
565 Ok(val) => Some(val),
566 Err(_) => {
567 stream.set_position(saved_pos);
568 None
569 }
570 };
571 stream.expect_complete()?;
572 let saved_pos = stream.position();
573 let sem = match Sem::parse(stream) {
574 Ok(val) => Some(val),
575 Err(_) => {
576 stream.set_position(saved_pos);
577 None
578 }
579 };
580 stream.expect_complete()?;
581 let saved_pos = stream.position();
582 let scope = match Scope::parse(stream) {
583 Ok(val) => Some(val),
584 Err(_) => {
585 stream.set_position(saved_pos);
586 None
587 }
588 };
589 stream.expect_complete()?;
590 stream.expect_string(".noftz")?;
591 let noftz = ();
592 stream.expect_complete()?;
593 let saved_pos = stream.position();
594 let level_cache_hint = match LevelCacheHint::parse(stream) {
595 Ok(val) => Some(val),
596 Err(_) => {
597 stream.set_position(saved_pos);
598 None
599 }
600 };
601 stream.expect_complete()?;
602 stream.expect_string(".f16x2")?;
603 let f16x2 = ();
604 stream.expect_complete()?;
605 let a = AddressOperand::parse(stream)?;
606 stream.expect_complete()?;
607 stream.expect(&PtxToken::Comma)?;
608 let b = GeneralOperand::parse(stream)?;
609 stream.expect_complete()?;
610 let saved_pos = stream.position();
611 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
612 if !has_comma {
613 stream.set_position(saved_pos);
614 }
615 let saved_pos = stream.position();
616 let cache_policy = match GeneralOperand::parse(stream) {
617 Ok(val) => Some(val),
618 Err(_) => {
619 stream.set_position(saved_pos);
620 None
621 }
622 };
623 stream.expect_complete()?;
624 stream.expect_complete()?;
625 stream.expect(&PtxToken::Semicolon)?;
626 Ok(RedAddSpaceSemScopeNoftzLevelCacheHintF16x2 {
627 add,
628 space,
629 sem,
630 scope,
631 noftz,
632 level_cache_hint,
633 f16x2,
634 a,
635 b,
636 cache_policy,
637 })
638 }
639 }
640
641 impl PtxParser for RedAddSpaceSemScopeNoftzLevelCacheHintBf16 {
642 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
643 stream.expect_string("red")?;
644 stream.expect_string(".add")?;
645 let add = ();
646 stream.expect_complete()?;
647 let saved_pos = stream.position();
648 let space = match Space::parse(stream) {
649 Ok(val) => Some(val),
650 Err(_) => {
651 stream.set_position(saved_pos);
652 None
653 }
654 };
655 stream.expect_complete()?;
656 let saved_pos = stream.position();
657 let sem = match Sem::parse(stream) {
658 Ok(val) => Some(val),
659 Err(_) => {
660 stream.set_position(saved_pos);
661 None
662 }
663 };
664 stream.expect_complete()?;
665 let saved_pos = stream.position();
666 let scope = match Scope::parse(stream) {
667 Ok(val) => Some(val),
668 Err(_) => {
669 stream.set_position(saved_pos);
670 None
671 }
672 };
673 stream.expect_complete()?;
674 stream.expect_string(".noftz")?;
675 let noftz = ();
676 stream.expect_complete()?;
677 let saved_pos = stream.position();
678 let level_cache_hint = match LevelCacheHint::parse(stream) {
679 Ok(val) => Some(val),
680 Err(_) => {
681 stream.set_position(saved_pos);
682 None
683 }
684 };
685 stream.expect_complete()?;
686 stream.expect_string(".bf16")?;
687 let bf16 = ();
688 stream.expect_complete()?;
689 let a = AddressOperand::parse(stream)?;
690 stream.expect_complete()?;
691 stream.expect(&PtxToken::Comma)?;
692 let b = GeneralOperand::parse(stream)?;
693 stream.expect_complete()?;
694 let saved_pos = stream.position();
695 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
696 if !has_comma {
697 stream.set_position(saved_pos);
698 }
699 let saved_pos = stream.position();
700 let cache_policy = match GeneralOperand::parse(stream) {
701 Ok(val) => Some(val),
702 Err(_) => {
703 stream.set_position(saved_pos);
704 None
705 }
706 };
707 stream.expect_complete()?;
708 stream.expect_complete()?;
709 stream.expect(&PtxToken::Semicolon)?;
710 Ok(RedAddSpaceSemScopeNoftzLevelCacheHintBf16 {
711 add,
712 space,
713 sem,
714 scope,
715 noftz,
716 level_cache_hint,
717 bf16,
718 a,
719 b,
720 cache_policy,
721 })
722 }
723 }
724
725 impl PtxParser for RedAddSpaceSemScopeNoftzLevelCacheHintBf16x2 {
726 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
727 stream.expect_string("red")?;
728 stream.expect_string(".add")?;
729 let add = ();
730 stream.expect_complete()?;
731 let saved_pos = stream.position();
732 let space = match Space::parse(stream) {
733 Ok(val) => Some(val),
734 Err(_) => {
735 stream.set_position(saved_pos);
736 None
737 }
738 };
739 stream.expect_complete()?;
740 let saved_pos = stream.position();
741 let sem = match Sem::parse(stream) {
742 Ok(val) => Some(val),
743 Err(_) => {
744 stream.set_position(saved_pos);
745 None
746 }
747 };
748 stream.expect_complete()?;
749 let saved_pos = stream.position();
750 let scope = match Scope::parse(stream) {
751 Ok(val) => Some(val),
752 Err(_) => {
753 stream.set_position(saved_pos);
754 None
755 }
756 };
757 stream.expect_complete()?;
758 stream.expect_string(".noftz")?;
759 let noftz = ();
760 stream.expect_complete()?;
761 let saved_pos = stream.position();
762 let level_cache_hint = match LevelCacheHint::parse(stream) {
763 Ok(val) => Some(val),
764 Err(_) => {
765 stream.set_position(saved_pos);
766 None
767 }
768 };
769 stream.expect_complete()?;
770 stream.expect_string(".bf16x2")?;
771 let bf16x2 = ();
772 stream.expect_complete()?;
773 let a = AddressOperand::parse(stream)?;
774 stream.expect_complete()?;
775 stream.expect(&PtxToken::Comma)?;
776 let b = GeneralOperand::parse(stream)?;
777 stream.expect_complete()?;
778 let saved_pos = stream.position();
779 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
780 if !has_comma {
781 stream.set_position(saved_pos);
782 }
783 let saved_pos = stream.position();
784 let cache_policy = match GeneralOperand::parse(stream) {
785 Ok(val) => Some(val),
786 Err(_) => {
787 stream.set_position(saved_pos);
788 None
789 }
790 };
791 stream.expect_complete()?;
792 stream.expect_complete()?;
793 stream.expect(&PtxToken::Semicolon)?;
794 Ok(RedAddSpaceSemScopeNoftzLevelCacheHintBf16x2 {
795 add,
796 space,
797 sem,
798 scope,
799 noftz,
800 level_cache_hint,
801 bf16x2,
802 a,
803 b,
804 cache_policy,
805 })
806 }
807 }
808}
809
810pub mod section_1 {
811 use super::*;
812 use crate::r#type::instruction::red::section_1::*;
813
814 impl PtxParser for HalfWordType {
819 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
820 {
822 let saved_pos = stream.position();
823 if stream.expect_string(".bf16").is_ok() {
824 return Ok(HalfWordType::Bf16);
825 }
826 stream.set_position(saved_pos);
827 }
828 let saved_pos = stream.position();
829 {
831 let saved_pos = stream.position();
832 if stream.expect_string(".f16").is_ok() {
833 return Ok(HalfWordType::F16);
834 }
835 stream.set_position(saved_pos);
836 }
837 stream.set_position(saved_pos);
838 let span = stream
839 .peek()
840 .map(|(_, s)| s.clone())
841 .unwrap_or(Span { start: 0, end: 0 });
842 let expected = &[".bf16", ".f16"];
843 let found = stream
844 .peek()
845 .map(|(t, _)| format!("{:?}", t))
846 .unwrap_or_else(|_| "<end of input>".to_string());
847 Err(crate::parser::unexpected_value(span, expected, found))
848 }
849 }
850
851 impl PtxParser for LevelCacheHint {
852 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
853 {
855 let saved_pos = stream.position();
856 if stream.expect_string(".L2::cache_hint").is_ok() {
857 return Ok(LevelCacheHint::L2CacheHint);
858 }
859 stream.set_position(saved_pos);
860 }
861 let span = stream
862 .peek()
863 .map(|(_, s)| s.clone())
864 .unwrap_or(Span { start: 0, end: 0 });
865 let expected = &[".L2::cache_hint"];
866 let found = stream
867 .peek()
868 .map(|(t, _)| format!("{:?}", t))
869 .unwrap_or_else(|_| "<end of input>".to_string());
870 Err(crate::parser::unexpected_value(span, expected, found))
871 }
872 }
873
874 impl PtxParser for Op {
875 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
876 {
878 let saved_pos = stream.position();
879 if stream.expect_string(".add").is_ok() {
880 return Ok(Op::Add);
881 }
882 stream.set_position(saved_pos);
883 }
884 let saved_pos = stream.position();
885 {
887 let saved_pos = stream.position();
888 if stream.expect_string(".min").is_ok() {
889 return Ok(Op::Min);
890 }
891 stream.set_position(saved_pos);
892 }
893 stream.set_position(saved_pos);
894 let saved_pos = stream.position();
895 {
897 let saved_pos = stream.position();
898 if stream.expect_string(".max").is_ok() {
899 return Ok(Op::Max);
900 }
901 stream.set_position(saved_pos);
902 }
903 stream.set_position(saved_pos);
904 let span = stream
905 .peek()
906 .map(|(_, s)| s.clone())
907 .unwrap_or(Span { start: 0, end: 0 });
908 let expected = &[".add", ".min", ".max"];
909 let found = stream
910 .peek()
911 .map(|(t, _)| format!("{:?}", t))
912 .unwrap_or_else(|_| "<end of input>".to_string());
913 Err(crate::parser::unexpected_value(span, expected, found))
914 }
915 }
916
917 impl PtxParser for PackedType {
918 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
919 {
921 let saved_pos = stream.position();
922 if stream.expect_string(".bf16x2").is_ok() {
923 return Ok(PackedType::Bf16x2);
924 }
925 stream.set_position(saved_pos);
926 }
927 let saved_pos = stream.position();
928 {
930 let saved_pos = stream.position();
931 if stream.expect_string(".f16x2").is_ok() {
932 return Ok(PackedType::F16x2);
933 }
934 stream.set_position(saved_pos);
935 }
936 stream.set_position(saved_pos);
937 let span = stream
938 .peek()
939 .map(|(_, s)| s.clone())
940 .unwrap_or(Span { start: 0, end: 0 });
941 let expected = &[".bf16x2", ".f16x2"];
942 let found = stream
943 .peek()
944 .map(|(t, _)| format!("{:?}", t))
945 .unwrap_or_else(|_| "<end of input>".to_string());
946 Err(crate::parser::unexpected_value(span, expected, found))
947 }
948 }
949
950 impl PtxParser for Scope {
951 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
952 {
954 let saved_pos = stream.position();
955 if stream.expect_string(".cluster").is_ok() {
956 return Ok(Scope::Cluster);
957 }
958 stream.set_position(saved_pos);
959 }
960 let saved_pos = stream.position();
961 {
963 let saved_pos = stream.position();
964 if stream.expect_string(".cta").is_ok() {
965 return Ok(Scope::Cta);
966 }
967 stream.set_position(saved_pos);
968 }
969 stream.set_position(saved_pos);
970 let saved_pos = stream.position();
971 {
973 let saved_pos = stream.position();
974 if stream.expect_string(".gpu").is_ok() {
975 return Ok(Scope::Gpu);
976 }
977 stream.set_position(saved_pos);
978 }
979 stream.set_position(saved_pos);
980 let saved_pos = stream.position();
981 {
983 let saved_pos = stream.position();
984 if stream.expect_string(".sys").is_ok() {
985 return Ok(Scope::Sys);
986 }
987 stream.set_position(saved_pos);
988 }
989 stream.set_position(saved_pos);
990 let span = stream
991 .peek()
992 .map(|(_, s)| s.clone())
993 .unwrap_or(Span { start: 0, end: 0 });
994 let expected = &[".cluster", ".cta", ".gpu", ".sys"];
995 let found = stream
996 .peek()
997 .map(|(t, _)| format!("{:?}", t))
998 .unwrap_or_else(|_| "<end of input>".to_string());
999 Err(crate::parser::unexpected_value(span, expected, found))
1000 }
1001 }
1002
1003 impl PtxParser for Sem {
1004 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1005 {
1007 let saved_pos = stream.position();
1008 if stream.expect_string(".relaxed").is_ok() {
1009 return Ok(Sem::Relaxed);
1010 }
1011 stream.set_position(saved_pos);
1012 }
1013 let saved_pos = stream.position();
1014 {
1016 let saved_pos = stream.position();
1017 if stream.expect_string(".release").is_ok() {
1018 return Ok(Sem::Release);
1019 }
1020 stream.set_position(saved_pos);
1021 }
1022 stream.set_position(saved_pos);
1023 let span = stream
1024 .peek()
1025 .map(|(_, s)| s.clone())
1026 .unwrap_or(Span { start: 0, end: 0 });
1027 let expected = &[".relaxed", ".release"];
1028 let found = stream
1029 .peek()
1030 .map(|(t, _)| format!("{:?}", t))
1031 .unwrap_or_else(|_| "<end of input>".to_string());
1032 Err(crate::parser::unexpected_value(span, expected, found))
1033 }
1034 }
1035
1036 impl PtxParser for Space {
1037 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1038 {
1040 let saved_pos = stream.position();
1041 if stream.expect_string(".shared::cluster").is_ok() {
1042 return Ok(Space::SharedCluster);
1043 }
1044 stream.set_position(saved_pos);
1045 }
1046 let saved_pos = stream.position();
1047 {
1049 let saved_pos = stream.position();
1050 if stream.expect_string(".shared::cta").is_ok() {
1051 return Ok(Space::SharedCta);
1052 }
1053 stream.set_position(saved_pos);
1054 }
1055 stream.set_position(saved_pos);
1056 let saved_pos = stream.position();
1057 {
1059 let saved_pos = stream.position();
1060 if stream.expect_string(".global").is_ok() {
1061 return Ok(Space::Global);
1062 }
1063 stream.set_position(saved_pos);
1064 }
1065 stream.set_position(saved_pos);
1066 let saved_pos = stream.position();
1067 {
1069 let saved_pos = stream.position();
1070 if stream.expect_string(".shared").is_ok() {
1071 return Ok(Space::Shared);
1072 }
1073 stream.set_position(saved_pos);
1074 }
1075 stream.set_position(saved_pos);
1076 let span = stream
1077 .peek()
1078 .map(|(_, s)| s.clone())
1079 .unwrap_or(Span { start: 0, end: 0 });
1080 let expected = &[".shared::cluster", ".shared::cta", ".global", ".shared"];
1081 let found = stream
1082 .peek()
1083 .map(|(t, _)| format!("{:?}", t))
1084 .unwrap_or_else(|_| "<end of input>".to_string());
1085 Err(crate::parser::unexpected_value(span, expected, found))
1086 }
1087 }
1088
1089 impl PtxParser for Vec16Bit {
1090 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1091 {
1093 let saved_pos = stream.position();
1094 if stream.expect_string(".v2").is_ok() {
1095 return Ok(Vec16Bit::V2);
1096 }
1097 stream.set_position(saved_pos);
1098 }
1099 let saved_pos = stream.position();
1100 {
1102 let saved_pos = stream.position();
1103 if stream.expect_string(".v4").is_ok() {
1104 return Ok(Vec16Bit::V4);
1105 }
1106 stream.set_position(saved_pos);
1107 }
1108 stream.set_position(saved_pos);
1109 let saved_pos = stream.position();
1110 {
1112 let saved_pos = stream.position();
1113 if stream.expect_string(".v8").is_ok() {
1114 return Ok(Vec16Bit::V8);
1115 }
1116 stream.set_position(saved_pos);
1117 }
1118 stream.set_position(saved_pos);
1119 let span = stream
1120 .peek()
1121 .map(|(_, s)| s.clone())
1122 .unwrap_or(Span { start: 0, end: 0 });
1123 let expected = &[".v2", ".v4", ".v8"];
1124 let found = stream
1125 .peek()
1126 .map(|(t, _)| format!("{:?}", t))
1127 .unwrap_or_else(|_| "<end of input>".to_string());
1128 Err(crate::parser::unexpected_value(span, expected, found))
1129 }
1130 }
1131
1132 impl PtxParser for Vec32Bit {
1133 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1134 {
1136 let saved_pos = stream.position();
1137 if stream.expect_string(".v2").is_ok() {
1138 return Ok(Vec32Bit::V2);
1139 }
1140 stream.set_position(saved_pos);
1141 }
1142 let saved_pos = stream.position();
1143 {
1145 let saved_pos = stream.position();
1146 if stream.expect_string(".v4").is_ok() {
1147 return Ok(Vec32Bit::V4);
1148 }
1149 stream.set_position(saved_pos);
1150 }
1151 stream.set_position(saved_pos);
1152 let span = stream
1153 .peek()
1154 .map(|(_, s)| s.clone())
1155 .unwrap_or(Span { start: 0, end: 0 });
1156 let expected = &[".v2", ".v4"];
1157 let found = stream
1158 .peek()
1159 .map(|(t, _)| format!("{:?}", t))
1160 .unwrap_or_else(|_| "<end of input>".to_string());
1161 Err(crate::parser::unexpected_value(span, expected, found))
1162 }
1163 }
1164
1165 impl PtxParser for RedAddSpaceSemScopeLevelCacheHintVec32BitF32 {
1166 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1167 stream.expect_string("red")?;
1168 stream.expect_string(".add")?;
1169 let add = ();
1170 stream.expect_complete()?;
1171 let saved_pos = stream.position();
1172 let space = match Space::parse(stream) {
1173 Ok(val) => Some(val),
1174 Err(_) => {
1175 stream.set_position(saved_pos);
1176 None
1177 }
1178 };
1179 stream.expect_complete()?;
1180 let saved_pos = stream.position();
1181 let sem = match Sem::parse(stream) {
1182 Ok(val) => Some(val),
1183 Err(_) => {
1184 stream.set_position(saved_pos);
1185 None
1186 }
1187 };
1188 stream.expect_complete()?;
1189 let saved_pos = stream.position();
1190 let scope = match Scope::parse(stream) {
1191 Ok(val) => Some(val),
1192 Err(_) => {
1193 stream.set_position(saved_pos);
1194 None
1195 }
1196 };
1197 stream.expect_complete()?;
1198 let saved_pos = stream.position();
1199 let level_cache_hint = match LevelCacheHint::parse(stream) {
1200 Ok(val) => Some(val),
1201 Err(_) => {
1202 stream.set_position(saved_pos);
1203 None
1204 }
1205 };
1206 stream.expect_complete()?;
1207 let vec_32_bit = Vec32Bit::parse(stream)?;
1208 stream.expect_complete()?;
1209 stream.expect_string(".f32")?;
1210 let f32 = ();
1211 stream.expect_complete()?;
1212 let a = AddressOperand::parse(stream)?;
1213 stream.expect_complete()?;
1214 stream.expect(&PtxToken::Comma)?;
1215 let b = GeneralOperand::parse(stream)?;
1216 stream.expect_complete()?;
1217 let saved_pos = stream.position();
1218 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
1219 if !has_comma {
1220 stream.set_position(saved_pos);
1221 }
1222 let saved_pos = stream.position();
1223 let cache_policy = match GeneralOperand::parse(stream) {
1224 Ok(val) => Some(val),
1225 Err(_) => {
1226 stream.set_position(saved_pos);
1227 None
1228 }
1229 };
1230 stream.expect_complete()?;
1231 stream.expect_complete()?;
1232 stream.expect(&PtxToken::Semicolon)?;
1233 Ok(RedAddSpaceSemScopeLevelCacheHintVec32BitF32 {
1234 add,
1235 space,
1236 sem,
1237 scope,
1238 level_cache_hint,
1239 vec_32_bit,
1240 f32,
1241 a,
1242 b,
1243 cache_policy,
1244 })
1245 }
1246 }
1247
1248 impl PtxParser for RedOpSpaceSemScopeNoftzLevelCacheHintVec16BitHalfWordType {
1249 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1250 stream.expect_string("red")?;
1251 let op = Op::parse(stream)?;
1252 stream.expect_complete()?;
1253 let saved_pos = stream.position();
1254 let space = match Space::parse(stream) {
1255 Ok(val) => Some(val),
1256 Err(_) => {
1257 stream.set_position(saved_pos);
1258 None
1259 }
1260 };
1261 stream.expect_complete()?;
1262 let saved_pos = stream.position();
1263 let sem = match Sem::parse(stream) {
1264 Ok(val) => Some(val),
1265 Err(_) => {
1266 stream.set_position(saved_pos);
1267 None
1268 }
1269 };
1270 stream.expect_complete()?;
1271 let saved_pos = stream.position();
1272 let scope = match Scope::parse(stream) {
1273 Ok(val) => Some(val),
1274 Err(_) => {
1275 stream.set_position(saved_pos);
1276 None
1277 }
1278 };
1279 stream.expect_complete()?;
1280 stream.expect_string(".noftz")?;
1281 let noftz = ();
1282 stream.expect_complete()?;
1283 let saved_pos = stream.position();
1284 let level_cache_hint = match LevelCacheHint::parse(stream) {
1285 Ok(val) => Some(val),
1286 Err(_) => {
1287 stream.set_position(saved_pos);
1288 None
1289 }
1290 };
1291 stream.expect_complete()?;
1292 let vec_16_bit = Vec16Bit::parse(stream)?;
1293 stream.expect_complete()?;
1294 let half_word_type = HalfWordType::parse(stream)?;
1295 stream.expect_complete()?;
1296 let a = AddressOperand::parse(stream)?;
1297 stream.expect_complete()?;
1298 stream.expect(&PtxToken::Comma)?;
1299 let b = GeneralOperand::parse(stream)?;
1300 stream.expect_complete()?;
1301 let saved_pos = stream.position();
1302 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
1303 if !has_comma {
1304 stream.set_position(saved_pos);
1305 }
1306 let saved_pos = stream.position();
1307 let cache_policy = match GeneralOperand::parse(stream) {
1308 Ok(val) => Some(val),
1309 Err(_) => {
1310 stream.set_position(saved_pos);
1311 None
1312 }
1313 };
1314 stream.expect_complete()?;
1315 stream.expect_complete()?;
1316 stream.expect(&PtxToken::Semicolon)?;
1317 Ok(RedOpSpaceSemScopeNoftzLevelCacheHintVec16BitHalfWordType {
1318 op,
1319 space,
1320 sem,
1321 scope,
1322 noftz,
1323 level_cache_hint,
1324 vec_16_bit,
1325 half_word_type,
1326 a,
1327 b,
1328 cache_policy,
1329 })
1330 }
1331 }
1332
1333 impl PtxParser for RedOpSpaceSemScopeNoftzLevelCacheHintVec32BitPackedType {
1334 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
1335 stream.expect_string("red")?;
1336 let op = Op::parse(stream)?;
1337 stream.expect_complete()?;
1338 let saved_pos = stream.position();
1339 let space = match Space::parse(stream) {
1340 Ok(val) => Some(val),
1341 Err(_) => {
1342 stream.set_position(saved_pos);
1343 None
1344 }
1345 };
1346 stream.expect_complete()?;
1347 let saved_pos = stream.position();
1348 let sem = match Sem::parse(stream) {
1349 Ok(val) => Some(val),
1350 Err(_) => {
1351 stream.set_position(saved_pos);
1352 None
1353 }
1354 };
1355 stream.expect_complete()?;
1356 let saved_pos = stream.position();
1357 let scope = match Scope::parse(stream) {
1358 Ok(val) => Some(val),
1359 Err(_) => {
1360 stream.set_position(saved_pos);
1361 None
1362 }
1363 };
1364 stream.expect_complete()?;
1365 stream.expect_string(".noftz")?;
1366 let noftz = ();
1367 stream.expect_complete()?;
1368 let saved_pos = stream.position();
1369 let level_cache_hint = match LevelCacheHint::parse(stream) {
1370 Ok(val) => Some(val),
1371 Err(_) => {
1372 stream.set_position(saved_pos);
1373 None
1374 }
1375 };
1376 stream.expect_complete()?;
1377 let vec_32_bit = Vec32Bit::parse(stream)?;
1378 stream.expect_complete()?;
1379 let packed_type = PackedType::parse(stream)?;
1380 stream.expect_complete()?;
1381 let a = AddressOperand::parse(stream)?;
1382 stream.expect_complete()?;
1383 stream.expect(&PtxToken::Comma)?;
1384 let b = GeneralOperand::parse(stream)?;
1385 stream.expect_complete()?;
1386 let saved_pos = stream.position();
1387 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
1388 if !has_comma {
1389 stream.set_position(saved_pos);
1390 }
1391 let saved_pos = stream.position();
1392 let cache_policy = match GeneralOperand::parse(stream) {
1393 Ok(val) => Some(val),
1394 Err(_) => {
1395 stream.set_position(saved_pos);
1396 None
1397 }
1398 };
1399 stream.expect_complete()?;
1400 stream.expect_complete()?;
1401 stream.expect(&PtxToken::Semicolon)?;
1402 Ok(RedOpSpaceSemScopeNoftzLevelCacheHintVec32BitPackedType {
1403 op,
1404 space,
1405 sem,
1406 scope,
1407 noftz,
1408 level_cache_hint,
1409 vec_32_bit,
1410 packed_type,
1411 a,
1412 b,
1413 cache_policy,
1414 })
1415 }
1416 }
1417}