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
42                .peek()
43                .map(|(_, s)| s.clone())
44                .unwrap_or(Span { start: 0, end: 0 });
45            let expected = &[".clamp", ".wrap"];
46            let found = stream
47                .peek()
48                .map(|(t, _)| format!("{:?}", t))
49                .unwrap_or_else(|_| "<end of input>".to_string());
50            Err(crate::parser::unexpected_value(span, expected, found))
51        }
52    }
53
54    impl PtxParser for ShfLModeB32 {
55        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
56            stream.expect_string("shf")?;
57            stream.expect_string(".l")?;
58            let l = ();
59            stream.expect_complete()?;
60            let mode = Mode::parse(stream)?;
61            stream.expect_complete()?;
62            stream.expect_string(".b32")?;
63            let b32 = ();
64            stream.expect_complete()?;
65            let d = GeneralOperand::parse(stream)?;
66            stream.expect_complete()?;
67            stream.expect(&PtxToken::Comma)?;
68            let a = GeneralOperand::parse(stream)?;
69            stream.expect_complete()?;
70            stream.expect(&PtxToken::Comma)?;
71            let b = GeneralOperand::parse(stream)?;
72            stream.expect_complete()?;
73            stream.expect(&PtxToken::Comma)?;
74            let c = GeneralOperand::parse(stream)?;
75            stream.expect_complete()?;
76            stream.expect_complete()?;
77            stream.expect(&PtxToken::Semicolon)?;
78            Ok(ShfLModeB32 {
79                l,
80                mode,
81                b32,
82                d,
83                a,
84                b,
85                c,
86            })
87        }
88    }
89
90    impl PtxParser for ShfRModeB32 {
91        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
92            stream.expect_string("shf")?;
93            stream.expect_string(".r")?;
94            let r = ();
95            stream.expect_complete()?;
96            let mode = Mode::parse(stream)?;
97            stream.expect_complete()?;
98            stream.expect_string(".b32")?;
99            let b32 = ();
100            stream.expect_complete()?;
101            let d = GeneralOperand::parse(stream)?;
102            stream.expect_complete()?;
103            stream.expect(&PtxToken::Comma)?;
104            let a = GeneralOperand::parse(stream)?;
105            stream.expect_complete()?;
106            stream.expect(&PtxToken::Comma)?;
107            let b = GeneralOperand::parse(stream)?;
108            stream.expect_complete()?;
109            stream.expect(&PtxToken::Comma)?;
110            let c = GeneralOperand::parse(stream)?;
111            stream.expect_complete()?;
112            stream.expect_complete()?;
113            stream.expect(&PtxToken::Semicolon)?;
114            Ok(ShfRModeB32 {
115                r,
116                mode,
117                b32,
118                d,
119                a,
120                b,
121                c,
122            })
123        }
124    }
125}