ptx_parser/parser/instruction/
mul24.rs

1//! Original PTX specification:
2//!
3//! mul24.mode.type  d, a, b;
4//! .mode = { .hi, .lo };
5//! .type = { .u32, .s32 };
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::mul24::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 Hi
24            {
25                let saved_pos = stream.position();
26                if stream.expect_string(".hi").is_ok() {
27                    return Ok(Mode::Hi);
28                }
29                stream.set_position(saved_pos);
30            }
31            let saved_pos = stream.position();
32            // Try Lo
33            {
34                let saved_pos = stream.position();
35                if stream.expect_string(".lo").is_ok() {
36                    return Ok(Mode::Lo);
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 = &[".hi", ".lo"];
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 Type {
55        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
56            // Try U32
57            {
58                let saved_pos = stream.position();
59                if stream.expect_string(".u32").is_ok() {
60                    return Ok(Type::U32);
61                }
62                stream.set_position(saved_pos);
63            }
64            let saved_pos = stream.position();
65            // Try S32
66            {
67                let saved_pos = stream.position();
68                if stream.expect_string(".s32").is_ok() {
69                    return Ok(Type::S32);
70                }
71                stream.set_position(saved_pos);
72            }
73            stream.set_position(saved_pos);
74            let span = stream
75                .peek()
76                .map(|(_, s)| s.clone())
77                .unwrap_or(Span { start: 0, end: 0 });
78            let expected = &[".u32", ".s32"];
79            let found = stream
80                .peek()
81                .map(|(t, _)| format!("{:?}", t))
82                .unwrap_or_else(|_| "<end of input>".to_string());
83            Err(crate::parser::unexpected_value(span, expected, found))
84        }
85    }
86
87    impl PtxParser for Mul24ModeType {
88        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
89            stream.expect_string("mul24")?;
90            let mode = Mode::parse(stream)?;
91            stream.expect_complete()?;
92            let type_ = Type::parse(stream)?;
93            stream.expect_complete()?;
94            let d = GeneralOperand::parse(stream)?;
95            stream.expect_complete()?;
96            stream.expect(&PtxToken::Comma)?;
97            let a = GeneralOperand::parse(stream)?;
98            stream.expect_complete()?;
99            stream.expect(&PtxToken::Comma)?;
100            let b = GeneralOperand::parse(stream)?;
101            stream.expect_complete()?;
102            stream.expect_complete()?;
103            stream.expect(&PtxToken::Semicolon)?;
104            Ok(Mul24ModeType {
105                mode,
106                type_,
107                d,
108                a,
109                b,
110            })
111        }
112    }
113}