1#![allow(unused)]
26
27use crate::lexer::PtxToken;
28use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
29use crate::r#type::common::*;
30
31pub mod section_0 {
32 use super::*;
33 use crate::r#type::instruction::cp_reduce_async_bulk::section_0::*;
34
35 impl PtxParser for CompletionMechanism {
40 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
41 {
43 let saved_pos = stream.position();
44 if stream
45 .expect_string(".mbarrier::complete_tx::bytes")
46 .is_ok()
47 {
48 return Ok(CompletionMechanism::MbarrierCompleteTxBytes);
49 }
50 stream.set_position(saved_pos);
51 }
52 let span = stream
53 .peek()
54 .map(|(_, s)| s.clone())
55 .unwrap_or(Span { start: 0, end: 0 });
56 let expected = &[".mbarrier::complete_tx::bytes"];
57 let found = stream
58 .peek()
59 .map(|(t, _)| format!("{:?}", t))
60 .unwrap_or_else(|_| "<end of input>".to_string());
61 Err(crate::parser::unexpected_value(span, expected, found))
62 }
63 }
64
65 impl PtxParser for Dst {
66 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
67 {
69 let saved_pos = stream.position();
70 if stream.expect_string(".shared::cluster").is_ok() {
71 return Ok(Dst::SharedCluster);
72 }
73 stream.set_position(saved_pos);
74 }
75 let span = stream
76 .peek()
77 .map(|(_, s)| s.clone())
78 .unwrap_or(Span { start: 0, end: 0 });
79 let expected = &[".shared::cluster"];
80 let found = stream
81 .peek()
82 .map(|(t, _)| format!("{:?}", t))
83 .unwrap_or_else(|_| "<end of input>".to_string());
84 Err(crate::parser::unexpected_value(span, expected, found))
85 }
86 }
87
88 impl PtxParser for Redop {
89 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
90 {
92 let saved_pos = stream.position();
93 if stream.expect_string(".and").is_ok() {
94 return Ok(Redop::And);
95 }
96 stream.set_position(saved_pos);
97 }
98 let saved_pos = stream.position();
99 {
101 let saved_pos = stream.position();
102 if stream.expect_string(".xor").is_ok() {
103 return Ok(Redop::Xor);
104 }
105 stream.set_position(saved_pos);
106 }
107 stream.set_position(saved_pos);
108 let saved_pos = stream.position();
109 {
111 let saved_pos = stream.position();
112 if stream.expect_string(".add").is_ok() {
113 return Ok(Redop::Add);
114 }
115 stream.set_position(saved_pos);
116 }
117 stream.set_position(saved_pos);
118 let saved_pos = stream.position();
119 {
121 let saved_pos = stream.position();
122 if stream.expect_string(".inc").is_ok() {
123 return Ok(Redop::Inc);
124 }
125 stream.set_position(saved_pos);
126 }
127 stream.set_position(saved_pos);
128 let saved_pos = stream.position();
129 {
131 let saved_pos = stream.position();
132 if stream.expect_string(".dec").is_ok() {
133 return Ok(Redop::Dec);
134 }
135 stream.set_position(saved_pos);
136 }
137 stream.set_position(saved_pos);
138 let saved_pos = stream.position();
139 {
141 let saved_pos = stream.position();
142 if stream.expect_string(".min").is_ok() {
143 return Ok(Redop::Min);
144 }
145 stream.set_position(saved_pos);
146 }
147 stream.set_position(saved_pos);
148 let saved_pos = stream.position();
149 {
151 let saved_pos = stream.position();
152 if stream.expect_string(".max").is_ok() {
153 return Ok(Redop::Max);
154 }
155 stream.set_position(saved_pos);
156 }
157 stream.set_position(saved_pos);
158 let saved_pos = stream.position();
159 {
161 let saved_pos = stream.position();
162 if stream.expect_string(".or").is_ok() {
163 return Ok(Redop::Or);
164 }
165 stream.set_position(saved_pos);
166 }
167 stream.set_position(saved_pos);
168 let span = stream
169 .peek()
170 .map(|(_, s)| s.clone())
171 .unwrap_or(Span { start: 0, end: 0 });
172 let expected = &[
173 ".and", ".xor", ".add", ".inc", ".dec", ".min", ".max", ".or",
174 ];
175 let found = stream
176 .peek()
177 .map(|(t, _)| format!("{:?}", t))
178 .unwrap_or_else(|_| "<end of input>".to_string());
179 Err(crate::parser::unexpected_value(span, expected, found))
180 }
181 }
182
183 impl PtxParser for Src {
184 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
185 {
187 let saved_pos = stream.position();
188 if stream.expect_string(".shared::cta").is_ok() {
189 return Ok(Src::SharedCta);
190 }
191 stream.set_position(saved_pos);
192 }
193 let span = stream
194 .peek()
195 .map(|(_, s)| s.clone())
196 .unwrap_or(Span { start: 0, end: 0 });
197 let expected = &[".shared::cta"];
198 let found = stream
199 .peek()
200 .map(|(t, _)| format!("{:?}", t))
201 .unwrap_or_else(|_| "<end of input>".to_string());
202 Err(crate::parser::unexpected_value(span, expected, found))
203 }
204 }
205
206 impl PtxParser for Type {
207 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
208 {
210 let saved_pos = stream.position();
211 if stream.expect_string(".b32").is_ok() {
212 return Ok(Type::B32);
213 }
214 stream.set_position(saved_pos);
215 }
216 let saved_pos = stream.position();
217 {
219 let saved_pos = stream.position();
220 if stream.expect_string(".u32").is_ok() {
221 return Ok(Type::U32);
222 }
223 stream.set_position(saved_pos);
224 }
225 stream.set_position(saved_pos);
226 let saved_pos = stream.position();
227 {
229 let saved_pos = stream.position();
230 if stream.expect_string(".s32").is_ok() {
231 return Ok(Type::S32);
232 }
233 stream.set_position(saved_pos);
234 }
235 stream.set_position(saved_pos);
236 let saved_pos = stream.position();
237 {
239 let saved_pos = stream.position();
240 if stream.expect_string(".b64").is_ok() {
241 return Ok(Type::B64);
242 }
243 stream.set_position(saved_pos);
244 }
245 stream.set_position(saved_pos);
246 let saved_pos = stream.position();
247 {
249 let saved_pos = stream.position();
250 if stream.expect_string(".u64").is_ok() {
251 return Ok(Type::U64);
252 }
253 stream.set_position(saved_pos);
254 }
255 stream.set_position(saved_pos);
256 let span = stream
257 .peek()
258 .map(|(_, s)| s.clone())
259 .unwrap_or(Span { start: 0, end: 0 });
260 let expected = &[".b32", ".u32", ".s32", ".b64", ".u64"];
261 let found = stream
262 .peek()
263 .map(|(t, _)| format!("{:?}", t))
264 .unwrap_or_else(|_| "<end of input>".to_string());
265 Err(crate::parser::unexpected_value(span, expected, found))
266 }
267 }
268
269 impl PtxParser for CpReduceAsyncBulkDstSrcCompletionMechanismRedopType {
270 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
271 stream.expect_string("cp")?;
272 stream.expect_string(".reduce")?;
273 let reduce = ();
274 stream.expect_complete()?;
275 stream.expect_string(".async")?;
276 let async_ = ();
277 stream.expect_complete()?;
278 stream.expect_string(".bulk")?;
279 let bulk = ();
280 stream.expect_complete()?;
281 let dst = Dst::parse(stream)?;
282 stream.expect_complete()?;
283 let src = Src::parse(stream)?;
284 stream.expect_complete()?;
285 let completion_mechanism = CompletionMechanism::parse(stream)?;
286 stream.expect_complete()?;
287 let redop = Redop::parse(stream)?;
288 stream.expect_complete()?;
289 let type_ = Type::parse(stream)?;
290 stream.expect_complete()?;
291 let dstmem = AddressOperand::parse(stream)?;
292 stream.expect_complete()?;
293 stream.expect(&PtxToken::Comma)?;
294 let srcmem = AddressOperand::parse(stream)?;
295 stream.expect_complete()?;
296 stream.expect(&PtxToken::Comma)?;
297 let size = GeneralOperand::parse(stream)?;
298 stream.expect_complete()?;
299 stream.expect(&PtxToken::Comma)?;
300 let mbar = AddressOperand::parse(stream)?;
301 stream.expect_complete()?;
302 stream.expect_complete()?;
303 stream.expect(&PtxToken::Semicolon)?;
304 Ok(CpReduceAsyncBulkDstSrcCompletionMechanismRedopType {
305 reduce,
306 async_,
307 bulk,
308 dst,
309 src,
310 completion_mechanism,
311 redop,
312 type_,
313 dstmem,
314 srcmem,
315 size,
316 mbar,
317 })
318 }
319 }
320}
321
322pub mod section_1 {
323 use super::*;
324 use crate::r#type::instruction::cp_reduce_async_bulk::section_1::*;
325
326 impl PtxParser for CompletionMechanism {
331 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
332 {
334 let saved_pos = stream.position();
335 if stream
336 .expect_string(".mbarrier::complete_tx::bytes")
337 .is_ok()
338 {
339 return Ok(CompletionMechanism::MbarrierCompleteTxBytes);
340 }
341 stream.set_position(saved_pos);
342 }
343 let span = stream
344 .peek()
345 .map(|(_, s)| s.clone())
346 .unwrap_or(Span { start: 0, end: 0 });
347 let expected = &[".mbarrier::complete_tx::bytes"];
348 let found = stream
349 .peek()
350 .map(|(t, _)| format!("{:?}", t))
351 .unwrap_or_else(|_| "<end of input>".to_string());
352 Err(crate::parser::unexpected_value(span, expected, found))
353 }
354 }
355
356 impl PtxParser for Dst {
357 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
358 {
360 let saved_pos = stream.position();
361 if stream.expect_string(".global").is_ok() {
362 return Ok(Dst::Global);
363 }
364 stream.set_position(saved_pos);
365 }
366 let span = stream
367 .peek()
368 .map(|(_, s)| s.clone())
369 .unwrap_or(Span { start: 0, end: 0 });
370 let expected = &[".global"];
371 let found = stream
372 .peek()
373 .map(|(t, _)| format!("{:?}", t))
374 .unwrap_or_else(|_| "<end of input>".to_string());
375 Err(crate::parser::unexpected_value(span, expected, found))
376 }
377 }
378
379 impl PtxParser for Redop {
380 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
381 {
383 let saved_pos = stream.position();
384 if stream.expect_string(".and").is_ok() {
385 return Ok(Redop::And);
386 }
387 stream.set_position(saved_pos);
388 }
389 let saved_pos = stream.position();
390 {
392 let saved_pos = stream.position();
393 if stream.expect_string(".xor").is_ok() {
394 return Ok(Redop::Xor);
395 }
396 stream.set_position(saved_pos);
397 }
398 stream.set_position(saved_pos);
399 let saved_pos = stream.position();
400 {
402 let saved_pos = stream.position();
403 if stream.expect_string(".add").is_ok() {
404 return Ok(Redop::Add);
405 }
406 stream.set_position(saved_pos);
407 }
408 stream.set_position(saved_pos);
409 let saved_pos = stream.position();
410 {
412 let saved_pos = stream.position();
413 if stream.expect_string(".inc").is_ok() {
414 return Ok(Redop::Inc);
415 }
416 stream.set_position(saved_pos);
417 }
418 stream.set_position(saved_pos);
419 let saved_pos = stream.position();
420 {
422 let saved_pos = stream.position();
423 if stream.expect_string(".dec").is_ok() {
424 return Ok(Redop::Dec);
425 }
426 stream.set_position(saved_pos);
427 }
428 stream.set_position(saved_pos);
429 let saved_pos = stream.position();
430 {
432 let saved_pos = stream.position();
433 if stream.expect_string(".min").is_ok() {
434 return Ok(Redop::Min);
435 }
436 stream.set_position(saved_pos);
437 }
438 stream.set_position(saved_pos);
439 let saved_pos = stream.position();
440 {
442 let saved_pos = stream.position();
443 if stream.expect_string(".max").is_ok() {
444 return Ok(Redop::Max);
445 }
446 stream.set_position(saved_pos);
447 }
448 stream.set_position(saved_pos);
449 let saved_pos = stream.position();
450 {
452 let saved_pos = stream.position();
453 if stream.expect_string(".or").is_ok() {
454 return Ok(Redop::Or);
455 }
456 stream.set_position(saved_pos);
457 }
458 stream.set_position(saved_pos);
459 let span = stream
460 .peek()
461 .map(|(_, s)| s.clone())
462 .unwrap_or(Span { start: 0, end: 0 });
463 let expected = &[
464 ".and", ".xor", ".add", ".inc", ".dec", ".min", ".max", ".or",
465 ];
466 let found = stream
467 .peek()
468 .map(|(t, _)| format!("{:?}", t))
469 .unwrap_or_else(|_| "<end of input>".to_string());
470 Err(crate::parser::unexpected_value(span, expected, found))
471 }
472 }
473
474 impl PtxParser for Src {
475 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
476 {
478 let saved_pos = stream.position();
479 if stream.expect_string(".shared::cta").is_ok() {
480 return Ok(Src::SharedCta);
481 }
482 stream.set_position(saved_pos);
483 }
484 let span = stream
485 .peek()
486 .map(|(_, s)| s.clone())
487 .unwrap_or(Span { start: 0, end: 0 });
488 let expected = &[".shared::cta"];
489 let found = stream
490 .peek()
491 .map(|(t, _)| format!("{:?}", t))
492 .unwrap_or_else(|_| "<end of input>".to_string());
493 Err(crate::parser::unexpected_value(span, expected, found))
494 }
495 }
496
497 impl PtxParser for Type {
498 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
499 {
501 let saved_pos = stream.position();
502 if stream.expect_string(".b32").is_ok() {
503 return Ok(Type::B32);
504 }
505 stream.set_position(saved_pos);
506 }
507 let saved_pos = stream.position();
508 {
510 let saved_pos = stream.position();
511 if stream.expect_string(".u32").is_ok() {
512 return Ok(Type::U32);
513 }
514 stream.set_position(saved_pos);
515 }
516 stream.set_position(saved_pos);
517 let saved_pos = stream.position();
518 {
520 let saved_pos = stream.position();
521 if stream.expect_string(".s32").is_ok() {
522 return Ok(Type::S32);
523 }
524 stream.set_position(saved_pos);
525 }
526 stream.set_position(saved_pos);
527 let saved_pos = stream.position();
528 {
530 let saved_pos = stream.position();
531 if stream.expect_string(".b64").is_ok() {
532 return Ok(Type::B64);
533 }
534 stream.set_position(saved_pos);
535 }
536 stream.set_position(saved_pos);
537 let saved_pos = stream.position();
538 {
540 let saved_pos = stream.position();
541 if stream.expect_string(".u64").is_ok() {
542 return Ok(Type::U64);
543 }
544 stream.set_position(saved_pos);
545 }
546 stream.set_position(saved_pos);
547 let span = stream
548 .peek()
549 .map(|(_, s)| s.clone())
550 .unwrap_or(Span { start: 0, end: 0 });
551 let expected = &[".b32", ".u32", ".s32", ".b64", ".u64"];
552 let found = stream
553 .peek()
554 .map(|(t, _)| format!("{:?}", t))
555 .unwrap_or_else(|_| "<end of input>".to_string());
556 Err(crate::parser::unexpected_value(span, expected, found))
557 }
558 }
559
560 impl PtxParser for CpReduceAsyncBulkDstSrcCompletionMechanismLevelCacheHintRedopType {
561 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
562 stream.expect_string("cp")?;
563 stream.expect_string(".reduce")?;
564 let reduce = ();
565 stream.expect_complete()?;
566 stream.expect_string(".async")?;
567 let async_ = ();
568 stream.expect_complete()?;
569 stream.expect_string(".bulk")?;
570 let bulk = ();
571 stream.expect_complete()?;
572 let dst = Dst::parse(stream)?;
573 stream.expect_complete()?;
574 let src = Src::parse(stream)?;
575 stream.expect_complete()?;
576 let completion_mechanism = CompletionMechanism::parse(stream)?;
577 stream.expect_complete()?;
578 let saved_pos = stream.position();
579 let level_cache_hint = stream.expect_string(".level::cache_hint").is_ok();
580 if !level_cache_hint {
581 stream.set_position(saved_pos);
582 }
583 stream.expect_complete()?;
584 let redop = Redop::parse(stream)?;
585 stream.expect_complete()?;
586 let type_ = Type::parse(stream)?;
587 stream.expect_complete()?;
588 let dstmem = AddressOperand::parse(stream)?;
589 stream.expect_complete()?;
590 stream.expect(&PtxToken::Comma)?;
591 let srcmem = AddressOperand::parse(stream)?;
592 stream.expect_complete()?;
593 stream.expect(&PtxToken::Comma)?;
594 let size = GeneralOperand::parse(stream)?;
595 stream.expect_complete()?;
596 let saved_pos = stream.position();
597 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
598 if !has_comma {
599 stream.set_position(saved_pos);
600 }
601 let saved_pos = stream.position();
602 let cache_policy = match GeneralOperand::parse(stream) {
603 Ok(val) => Some(val),
604 Err(_) => {
605 stream.set_position(saved_pos);
606 None
607 }
608 };
609 stream.expect_complete()?;
610 stream.expect_complete()?;
611 stream.expect(&PtxToken::Semicolon)?;
612 Ok(
613 CpReduceAsyncBulkDstSrcCompletionMechanismLevelCacheHintRedopType {
614 reduce,
615 async_,
616 bulk,
617 dst,
618 src,
619 completion_mechanism,
620 level_cache_hint,
621 redop,
622 type_,
623 dstmem,
624 srcmem,
625 size,
626 cache_policy,
627 },
628 )
629 }
630 }
631}
632
633pub mod section_2 {
634 use super::*;
635 use crate::r#type::instruction::cp_reduce_async_bulk::section_2::*;
636
637 impl PtxParser for CompletionMechanism {
642 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
643 {
645 let saved_pos = stream.position();
646 if stream.expect_string(".bulk_group").is_ok() {
647 return Ok(CompletionMechanism::BulkGroup);
648 }
649 stream.set_position(saved_pos);
650 }
651 let span = stream
652 .peek()
653 .map(|(_, s)| s.clone())
654 .unwrap_or(Span { start: 0, end: 0 });
655 let expected = &[".bulk_group"];
656 let found = stream
657 .peek()
658 .map(|(t, _)| format!("{:?}", t))
659 .unwrap_or_else(|_| "<end of input>".to_string());
660 Err(crate::parser::unexpected_value(span, expected, found))
661 }
662 }
663
664 impl PtxParser for Dst {
665 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
666 {
668 let saved_pos = stream.position();
669 if stream.expect_string(".global").is_ok() {
670 return Ok(Dst::Global);
671 }
672 stream.set_position(saved_pos);
673 }
674 let span = stream
675 .peek()
676 .map(|(_, s)| s.clone())
677 .unwrap_or(Span { start: 0, end: 0 });
678 let expected = &[".global"];
679 let found = stream
680 .peek()
681 .map(|(t, _)| format!("{:?}", t))
682 .unwrap_or_else(|_| "<end of input>".to_string());
683 Err(crate::parser::unexpected_value(span, expected, found))
684 }
685 }
686
687 impl PtxParser for LevelCacheHint {
688 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
689 {
691 let saved_pos = stream.position();
692 if stream.expect_string(".L2::cache_hint").is_ok() {
693 return Ok(LevelCacheHint::L2CacheHint);
694 }
695 stream.set_position(saved_pos);
696 }
697 let span = stream
698 .peek()
699 .map(|(_, s)| s.clone())
700 .unwrap_or(Span { start: 0, end: 0 });
701 let expected = &[".L2::cache_hint"];
702 let found = stream
703 .peek()
704 .map(|(t, _)| format!("{:?}", t))
705 .unwrap_or_else(|_| "<end of input>".to_string());
706 Err(crate::parser::unexpected_value(span, expected, found))
707 }
708 }
709
710 impl PtxParser for Src {
711 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
712 {
714 let saved_pos = stream.position();
715 if stream.expect_string(".shared::cta").is_ok() {
716 return Ok(Src::SharedCta);
717 }
718 stream.set_position(saved_pos);
719 }
720 let span = stream
721 .peek()
722 .map(|(_, s)| s.clone())
723 .unwrap_or(Span { start: 0, end: 0 });
724 let expected = &[".shared::cta"];
725 let found = stream
726 .peek()
727 .map(|(t, _)| format!("{:?}", t))
728 .unwrap_or_else(|_| "<end of input>".to_string());
729 Err(crate::parser::unexpected_value(span, expected, found))
730 }
731 }
732
733 impl PtxParser for Type {
734 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
735 {
737 let saved_pos = stream.position();
738 if stream.expect_string(".bf16").is_ok() {
739 return Ok(Type::Bf16);
740 }
741 stream.set_position(saved_pos);
742 }
743 let saved_pos = stream.position();
744 {
746 let saved_pos = stream.position();
747 if stream.expect_string(".f16").is_ok() {
748 return Ok(Type::F16);
749 }
750 stream.set_position(saved_pos);
751 }
752 stream.set_position(saved_pos);
753 let span = stream
754 .peek()
755 .map(|(_, s)| s.clone())
756 .unwrap_or(Span { start: 0, end: 0 });
757 let expected = &[".bf16", ".f16"];
758 let found = stream
759 .peek()
760 .map(|(t, _)| format!("{:?}", t))
761 .unwrap_or_else(|_| "<end of input>".to_string());
762 Err(crate::parser::unexpected_value(span, expected, found))
763 }
764 }
765
766 impl PtxParser for CpReduceAsyncBulkDstSrcCompletionMechanismLevelCacheHintAddNoftzType {
767 fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
768 stream.expect_string("cp")?;
769 stream.expect_string(".reduce")?;
770 let reduce = ();
771 stream.expect_complete()?;
772 stream.expect_string(".async")?;
773 let async_ = ();
774 stream.expect_complete()?;
775 stream.expect_string(".bulk")?;
776 let bulk = ();
777 stream.expect_complete()?;
778 let dst = Dst::parse(stream)?;
779 stream.expect_complete()?;
780 let src = Src::parse(stream)?;
781 stream.expect_complete()?;
782 let completion_mechanism = CompletionMechanism::parse(stream)?;
783 stream.expect_complete()?;
784 let saved_pos = stream.position();
785 let level_cache_hint = match LevelCacheHint::parse(stream) {
786 Ok(val) => Some(val),
787 Err(_) => {
788 stream.set_position(saved_pos);
789 None
790 }
791 };
792 stream.expect_complete()?;
793 stream.expect_string(".add")?;
794 let add = ();
795 stream.expect_complete()?;
796 stream.expect_string(".noftz")?;
797 let noftz = ();
798 stream.expect_complete()?;
799 let type_ = Type::parse(stream)?;
800 stream.expect_complete()?;
801 let dstmem = AddressOperand::parse(stream)?;
802 stream.expect_complete()?;
803 stream.expect(&PtxToken::Comma)?;
804 let srcmem = AddressOperand::parse(stream)?;
805 stream.expect_complete()?;
806 stream.expect(&PtxToken::Comma)?;
807 let size = GeneralOperand::parse(stream)?;
808 stream.expect_complete()?;
809 let saved_pos = stream.position();
810 let has_comma = stream.expect(&PtxToken::Comma).is_ok();
811 if !has_comma {
812 stream.set_position(saved_pos);
813 }
814 let saved_pos = stream.position();
815 let cache_policy = match GeneralOperand::parse(stream) {
816 Ok(val) => Some(val),
817 Err(_) => {
818 stream.set_position(saved_pos);
819 None
820 }
821 };
822 stream.expect_complete()?;
823 stream.expect_complete()?;
824 stream.expect(&PtxToken::Semicolon)?;
825 Ok(
826 CpReduceAsyncBulkDstSrcCompletionMechanismLevelCacheHintAddNoftzType {
827 reduce,
828 async_,
829 bulk,
830 dst,
831 src,
832 completion_mechanism,
833 level_cache_hint,
834 add,
835 noftz,
836 type_,
837 dstmem,
838 srcmem,
839 size,
840 cache_policy,
841 },
842 )
843 }
844 }
845}