ptx_parser/parser/instruction/
lop3.rs

1//! Original PTX specification:
2//!
3//! lop3.b32 d, a, b, c, immLut;
4//! lop3.BoolOp.b32 d|p, a, b, c, immLut, q;
5//! .BoolOp   = { .or , .and };
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::lop3::section_0::*;
16
17    // ============================================================================
18    // Generated enum parsers
19    // ============================================================================
20
21    impl PtxParser for Boolop {
22        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
23            // Try And
24            {
25                let saved_pos = stream.position();
26                if stream.expect_string(".and").is_ok() {
27                    return Ok(Boolop::And);
28                }
29                stream.set_position(saved_pos);
30            }
31            let saved_pos = stream.position();
32            // Try Or
33            {
34                let saved_pos = stream.position();
35                if stream.expect_string(".or").is_ok() {
36                    return Ok(Boolop::Or);
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 = &[".and", ".or"];
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 Lop3B32 {
49        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
50            stream.expect_string("lop3")?;
51            stream.expect_string(".b32")?;
52            let b32 = ();
53            stream.expect_complete()?;
54            let d = GeneralOperand::parse(stream)?;
55            stream.expect_complete()?;
56            stream.expect(&PtxToken::Comma)?;
57            let a = GeneralOperand::parse(stream)?;
58            stream.expect_complete()?;
59            stream.expect(&PtxToken::Comma)?;
60            let b = GeneralOperand::parse(stream)?;
61            stream.expect_complete()?;
62            stream.expect(&PtxToken::Comma)?;
63            let c = GeneralOperand::parse(stream)?;
64            stream.expect_complete()?;
65            stream.expect(&PtxToken::Comma)?;
66            let immlut = GeneralOperand::parse(stream)?;
67            stream.expect_complete()?;
68            stream.expect_complete()?;
69            stream.expect(&PtxToken::Semicolon)?;
70            Ok(Lop3B32 {
71                b32,
72                d,
73                a,
74                b,
75                c,
76                immlut,
77            })
78        }
79    }
80
81
82    impl PtxParser for Lop3BoolopB32 {
83        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
84            stream.expect_string("lop3")?;
85            let boolop = Boolop::parse(stream)?;
86            stream.expect_complete()?;
87            stream.expect_string(".b32")?;
88            let b32 = ();
89            stream.expect_complete()?;
90            let d = GeneralOperand::parse(stream)?;
91            stream.expect(&PtxToken::Pipe)?;
92            let p = GeneralOperand::parse(stream)?;
93            stream.expect_complete()?;
94            stream.expect(&PtxToken::Comma)?;
95            let a = GeneralOperand::parse(stream)?;
96            stream.expect_complete()?;
97            stream.expect(&PtxToken::Comma)?;
98            let b = GeneralOperand::parse(stream)?;
99            stream.expect_complete()?;
100            stream.expect(&PtxToken::Comma)?;
101            let c = GeneralOperand::parse(stream)?;
102            stream.expect_complete()?;
103            stream.expect(&PtxToken::Comma)?;
104            let immlut = GeneralOperand::parse(stream)?;
105            stream.expect_complete()?;
106            stream.expect(&PtxToken::Comma)?;
107            let q = GeneralOperand::parse(stream)?;
108            stream.expect_complete()?;
109            stream.expect_complete()?;
110            stream.expect(&PtxToken::Semicolon)?;
111            Ok(Lop3BoolopB32 {
112                boolop,
113                b32,
114                d,
115                p,
116                a,
117                b,
118                c,
119                immlut,
120                q,
121            })
122        }
123    }
124
125
126}
127