ptx_parser/parser/instruction/
shf.rs

1//! Original PTX specification:
2//!
3//! shf.l.mode.b32  d, a, b, c;  // left shift
4//! shf.r.mode.b32  d, a, b, c;  // right shift
5//! .mode = { .clamp, .wrap };
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::shf::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 ShfLModeB32 {
49        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
50            stream.expect_string("shf")?;
51            stream.expect_string(".l")?;
52            let l = ();
53            stream.expect_complete()?;
54            let mode = Mode::parse(stream)?;
55            stream.expect_complete()?;
56            stream.expect_string(".b32")?;
57            let b32 = ();
58            stream.expect_complete()?;
59            let d = GeneralOperand::parse(stream)?;
60            stream.expect_complete()?;
61            stream.expect(&PtxToken::Comma)?;
62            let a = GeneralOperand::parse(stream)?;
63            stream.expect_complete()?;
64            stream.expect(&PtxToken::Comma)?;
65            let b = GeneralOperand::parse(stream)?;
66            stream.expect_complete()?;
67            stream.expect(&PtxToken::Comma)?;
68            let c = GeneralOperand::parse(stream)?;
69            stream.expect_complete()?;
70            stream.expect_complete()?;
71            stream.expect(&PtxToken::Semicolon)?;
72            Ok(ShfLModeB32 {
73                l,
74                mode,
75                b32,
76                d,
77                a,
78                b,
79                c,
80            })
81        }
82    }
83
84
85    impl PtxParser for ShfRModeB32 {
86        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
87            stream.expect_string("shf")?;
88            stream.expect_string(".r")?;
89            let r = ();
90            stream.expect_complete()?;
91            let mode = Mode::parse(stream)?;
92            stream.expect_complete()?;
93            stream.expect_string(".b32")?;
94            let b32 = ();
95            stream.expect_complete()?;
96            let d = GeneralOperand::parse(stream)?;
97            stream.expect_complete()?;
98            stream.expect(&PtxToken::Comma)?;
99            let a = GeneralOperand::parse(stream)?;
100            stream.expect_complete()?;
101            stream.expect(&PtxToken::Comma)?;
102            let b = GeneralOperand::parse(stream)?;
103            stream.expect_complete()?;
104            stream.expect(&PtxToken::Comma)?;
105            let c = GeneralOperand::parse(stream)?;
106            stream.expect_complete()?;
107            stream.expect_complete()?;
108            stream.expect(&PtxToken::Semicolon)?;
109            Ok(ShfRModeB32 {
110                r,
111                mode,
112                b32,
113                d,
114                a,
115                b,
116                c,
117            })
118        }
119    }
120
121
122}
123