ptx_parser/parser/instruction/
bfind.rs

1//! Original PTX specification:
2//!
3//! bfind.type           d, a;
4//! bfind.shiftamt.type  d, a;
5//! .type = { .u32, .u64, .s32, .s64 };
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::bfind::section_0::*;
16
17    // ============================================================================
18    // Generated enum parsers
19    // ============================================================================
20
21    impl PtxParser for Type {
22        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
23            // Try U32
24            {
25                let saved_pos = stream.position();
26                if stream.expect_string(".u32").is_ok() {
27                    return Ok(Type::U32);
28                }
29                stream.set_position(saved_pos);
30            }
31            let saved_pos = stream.position();
32            // Try U64
33            {
34                let saved_pos = stream.position();
35                if stream.expect_string(".u64").is_ok() {
36                    return Ok(Type::U64);
37                }
38                stream.set_position(saved_pos);
39            }
40            stream.set_position(saved_pos);
41            let saved_pos = stream.position();
42            // Try S32
43            {
44                let saved_pos = stream.position();
45                if stream.expect_string(".s32").is_ok() {
46                    return Ok(Type::S32);
47                }
48                stream.set_position(saved_pos);
49            }
50            stream.set_position(saved_pos);
51            let saved_pos = stream.position();
52            // Try S64
53            {
54                let saved_pos = stream.position();
55                if stream.expect_string(".s64").is_ok() {
56                    return Ok(Type::S64);
57                }
58                stream.set_position(saved_pos);
59            }
60            stream.set_position(saved_pos);
61            let span = stream
62                .peek()
63                .map(|(_, s)| s.clone())
64                .unwrap_or(Span { start: 0, end: 0 });
65            let expected = &[".u32", ".u64", ".s32", ".s64"];
66            let found = stream
67                .peek()
68                .map(|(t, _)| format!("{:?}", t))
69                .unwrap_or_else(|_| "<end of input>".to_string());
70            Err(crate::parser::unexpected_value(span, expected, found))
71        }
72    }
73
74    impl PtxParser for BfindType {
75        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
76            stream.expect_string("bfind")?;
77            let type_ = Type::parse(stream)?;
78            stream.expect_complete()?;
79            let d = GeneralOperand::parse(stream)?;
80            stream.expect_complete()?;
81            stream.expect(&PtxToken::Comma)?;
82            let a = GeneralOperand::parse(stream)?;
83            stream.expect_complete()?;
84            stream.expect_complete()?;
85            stream.expect(&PtxToken::Semicolon)?;
86            Ok(BfindType { type_, d, a })
87        }
88    }
89
90    impl PtxParser for BfindShiftamtType {
91        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
92            stream.expect_string("bfind")?;
93            stream.expect_string(".shiftamt")?;
94            let shiftamt = ();
95            stream.expect_complete()?;
96            let type_ = Type::parse(stream)?;
97            stream.expect_complete()?;
98            let d = GeneralOperand::parse(stream)?;
99            stream.expect_complete()?;
100            stream.expect(&PtxToken::Comma)?;
101            let a = GeneralOperand::parse(stream)?;
102            stream.expect_complete()?;
103            stream.expect_complete()?;
104            stream.expect(&PtxToken::Semicolon)?;
105            Ok(BfindShiftamtType {
106                shiftamt,
107                type_,
108                d,
109                a,
110            })
111        }
112    }
113}