ptx_parser/parser/instruction/
suq.rs

1//! Original PTX specification:
2//!
3//! suq.query.b32   d, [a];
4//! .query = { .width, .height, .depth,
5//! .channel_data_type, .channel_order,
6//! .array_size, .memory_layout };
7
8#![allow(unused)]
9
10use crate::lexer::PtxToken;
11use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
12use crate::r#type::common::*;
13
14pub mod section_0 {
15    use super::*;
16    use crate::r#type::instruction::suq::section_0::*;
17
18    // ============================================================================
19    // Generated enum parsers
20    // ============================================================================
21
22    impl PtxParser for Query {
23        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
24            // Try ChannelDataType
25            {
26                let saved_pos = stream.position();
27                if stream.expect_string(".channel_data_type").is_ok() {
28                    return Ok(Query::ChannelDataType);
29                }
30                stream.set_position(saved_pos);
31            }
32            let saved_pos = stream.position();
33            // Try ChannelOrder
34            {
35                let saved_pos = stream.position();
36                if stream.expect_string(".channel_order").is_ok() {
37                    return Ok(Query::ChannelOrder);
38                }
39                stream.set_position(saved_pos);
40            }
41            stream.set_position(saved_pos);
42            let saved_pos = stream.position();
43            // Try MemoryLayout
44            {
45                let saved_pos = stream.position();
46                if stream.expect_string(".memory_layout").is_ok() {
47                    return Ok(Query::MemoryLayout);
48                }
49                stream.set_position(saved_pos);
50            }
51            stream.set_position(saved_pos);
52            let saved_pos = stream.position();
53            // Try ArraySize
54            {
55                let saved_pos = stream.position();
56                if stream.expect_string(".array_size").is_ok() {
57                    return Ok(Query::ArraySize);
58                }
59                stream.set_position(saved_pos);
60            }
61            stream.set_position(saved_pos);
62            let saved_pos = stream.position();
63            // Try Height
64            {
65                let saved_pos = stream.position();
66                if stream.expect_string(".height").is_ok() {
67                    return Ok(Query::Height);
68                }
69                stream.set_position(saved_pos);
70            }
71            stream.set_position(saved_pos);
72            let saved_pos = stream.position();
73            // Try Width
74            {
75                let saved_pos = stream.position();
76                if stream.expect_string(".width").is_ok() {
77                    return Ok(Query::Width);
78                }
79                stream.set_position(saved_pos);
80            }
81            stream.set_position(saved_pos);
82            let saved_pos = stream.position();
83            // Try Depth
84            {
85                let saved_pos = stream.position();
86                if stream.expect_string(".depth").is_ok() {
87                    return Ok(Query::Depth);
88                }
89                stream.set_position(saved_pos);
90            }
91            stream.set_position(saved_pos);
92            let span = stream
93                .peek()
94                .map(|(_, s)| s.clone())
95                .unwrap_or(Span { start: 0, end: 0 });
96            let expected = &[
97                ".channel_data_type",
98                ".channel_order",
99                ".memory_layout",
100                ".array_size",
101                ".height",
102                ".width",
103                ".depth",
104            ];
105            let found = stream
106                .peek()
107                .map(|(t, _)| format!("{:?}", t))
108                .unwrap_or_else(|_| "<end of input>".to_string());
109            Err(crate::parser::unexpected_value(span, expected, found))
110        }
111    }
112
113    impl PtxParser for SuqQueryB32 {
114        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
115            stream.expect_string("suq")?;
116            let query = Query::parse(stream)?;
117            stream.expect_complete()?;
118            stream.expect_string(".b32")?;
119            let b32 = ();
120            stream.expect_complete()?;
121            let d = GeneralOperand::parse(stream)?;
122            stream.expect_complete()?;
123            stream.expect(&PtxToken::Comma)?;
124            let a = AddressOperand::parse(stream)?;
125            stream.expect_complete()?;
126            stream.expect_complete()?;
127            stream.expect(&PtxToken::Semicolon)?;
128            Ok(SuqQueryB32 { query, b32, d, a })
129        }
130    }
131}