ptx_parser/parser/instruction/
szext.rs

1//! Original PTX specification:
2//!
3//! szext.mode.type  d, a, b;
4//! .mode = { .clamp, .wrap };
5//! .type = { .u32, .s32 };
6
7#![allow(unused)]
8
9use crate::lexer::PtxToken;
10use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
11use crate::r#type::common::*;
12
13pub mod section_0 {
14    use super::*;
15    use crate::r#type::instruction::szext::section_0::*;
16
17    // ============================================================================
18    // Generated enum parsers
19    // ============================================================================
20
21    impl PtxParser for Mode {
22        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
23            // Try Clamp
24            {
25                let saved_pos = stream.position();
26                if stream.expect_string(".clamp").is_ok() {
27                    return Ok(Mode::Clamp);
28                }
29                stream.set_position(saved_pos);
30            }
31            let saved_pos = stream.position();
32            // Try Wrap
33            {
34                let saved_pos = stream.position();
35                if stream.expect_string(".wrap").is_ok() {
36                    return Ok(Mode::Wrap);
37                }
38                stream.set_position(saved_pos);
39            }
40            stream.set_position(saved_pos);
41            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
42            let expected = &[".clamp", ".wrap"];
43            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
44            Err(crate::parser::unexpected_value(span, expected, found))
45        }
46    }
47
48    impl PtxParser for Type {
49        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
50            // Try U32
51            {
52                let saved_pos = stream.position();
53                if stream.expect_string(".u32").is_ok() {
54                    return Ok(Type::U32);
55                }
56                stream.set_position(saved_pos);
57            }
58            let saved_pos = stream.position();
59            // Try S32
60            {
61                let saved_pos = stream.position();
62                if stream.expect_string(".s32").is_ok() {
63                    return Ok(Type::S32);
64                }
65                stream.set_position(saved_pos);
66            }
67            stream.set_position(saved_pos);
68            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
69            let expected = &[".u32", ".s32"];
70            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
71            Err(crate::parser::unexpected_value(span, expected, found))
72        }
73    }
74
75    impl PtxParser for SzextModeType {
76        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
77            stream.expect_string("szext")?;
78            let mode = Mode::parse(stream)?;
79            stream.expect_complete()?;
80            let type_ = Type::parse(stream)?;
81            stream.expect_complete()?;
82            let d = GeneralOperand::parse(stream)?;
83            stream.expect_complete()?;
84            stream.expect(&PtxToken::Comma)?;
85            let a = GeneralOperand::parse(stream)?;
86            stream.expect_complete()?;
87            stream.expect(&PtxToken::Comma)?;
88            let b = GeneralOperand::parse(stream)?;
89            stream.expect_complete()?;
90            stream.expect_complete()?;
91            stream.expect(&PtxToken::Semicolon)?;
92            Ok(SzextModeType {
93                mode,
94                type_,
95                d,
96                a,
97                b,
98            })
99        }
100    }
101
102
103}
104