ptx_parser/parser/instruction/
shr.rs

1//! Original PTX specification:
2//!
3//! shr.type d, a, b;
4//! .type = { .b16, .b32, .b64,
5//! .u16, .u32, .u64,
6//! .s16, .s32, .s64 };
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::shr::section_0::*;
17
18    // ============================================================================
19    // Generated enum parsers
20    // ============================================================================
21
22    impl PtxParser for Type {
23        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
24            // Try B16
25            {
26                let saved_pos = stream.position();
27                if stream.expect_string(".b16").is_ok() {
28                    return Ok(Type::B16);
29                }
30                stream.set_position(saved_pos);
31            }
32            let saved_pos = stream.position();
33            // Try B32
34            {
35                let saved_pos = stream.position();
36                if stream.expect_string(".b32").is_ok() {
37                    return Ok(Type::B32);
38                }
39                stream.set_position(saved_pos);
40            }
41            stream.set_position(saved_pos);
42            let saved_pos = stream.position();
43            // Try B64
44            {
45                let saved_pos = stream.position();
46                if stream.expect_string(".b64").is_ok() {
47                    return Ok(Type::B64);
48                }
49                stream.set_position(saved_pos);
50            }
51            stream.set_position(saved_pos);
52            let saved_pos = stream.position();
53            // Try U16
54            {
55                let saved_pos = stream.position();
56                if stream.expect_string(".u16").is_ok() {
57                    return Ok(Type::U16);
58                }
59                stream.set_position(saved_pos);
60            }
61            stream.set_position(saved_pos);
62            let saved_pos = stream.position();
63            // Try U32
64            {
65                let saved_pos = stream.position();
66                if stream.expect_string(".u32").is_ok() {
67                    return Ok(Type::U32);
68                }
69                stream.set_position(saved_pos);
70            }
71            stream.set_position(saved_pos);
72            let saved_pos = stream.position();
73            // Try U64
74            {
75                let saved_pos = stream.position();
76                if stream.expect_string(".u64").is_ok() {
77                    return Ok(Type::U64);
78                }
79                stream.set_position(saved_pos);
80            }
81            stream.set_position(saved_pos);
82            let saved_pos = stream.position();
83            // Try S16
84            {
85                let saved_pos = stream.position();
86                if stream.expect_string(".s16").is_ok() {
87                    return Ok(Type::S16);
88                }
89                stream.set_position(saved_pos);
90            }
91            stream.set_position(saved_pos);
92            let saved_pos = stream.position();
93            // Try S32
94            {
95                let saved_pos = stream.position();
96                if stream.expect_string(".s32").is_ok() {
97                    return Ok(Type::S32);
98                }
99                stream.set_position(saved_pos);
100            }
101            stream.set_position(saved_pos);
102            let saved_pos = stream.position();
103            // Try S64
104            {
105                let saved_pos = stream.position();
106                if stream.expect_string(".s64").is_ok() {
107                    return Ok(Type::S64);
108                }
109                stream.set_position(saved_pos);
110            }
111            stream.set_position(saved_pos);
112            let span = stream
113                .peek()
114                .map(|(_, s)| s.clone())
115                .unwrap_or(Span { start: 0, end: 0 });
116            let expected = &[
117                ".b16", ".b32", ".b64", ".u16", ".u32", ".u64", ".s16", ".s32", ".s64",
118            ];
119            let found = stream
120                .peek()
121                .map(|(t, _)| format!("{:?}", t))
122                .unwrap_or_else(|_| "<end of input>".to_string());
123            Err(crate::parser::unexpected_value(span, expected, found))
124        }
125    }
126
127    impl PtxParser for ShrType {
128        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
129            stream.expect_string("shr")?;
130            let type_ = Type::parse(stream)?;
131            stream.expect_complete()?;
132            let d = GeneralOperand::parse(stream)?;
133            stream.expect_complete()?;
134            stream.expect(&PtxToken::Comma)?;
135            let a = GeneralOperand::parse(stream)?;
136            stream.expect_complete()?;
137            stream.expect(&PtxToken::Comma)?;
138            let b = GeneralOperand::parse(stream)?;
139            stream.expect_complete()?;
140            stream.expect_complete()?;
141            stream.expect(&PtxToken::Semicolon)?;
142            Ok(ShrType { type_, d, a, b })
143        }
144    }
145}