ptx_parser/parser/instruction/
ex2.rs

1//! Original PTX specification:
2//!
3//! ex2.approx{.ftz}.f32  d, a;
4//! 
5//! ex2.approx.atype     d, a;
6//! ex2.approx.ftz.btype d, a;
7//! .atype = { .f16,  .f16x2};
8//! .btype = { .bf16, .bf16x2};
9
10#![allow(unused)]
11
12use crate::lexer::PtxToken;
13use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
14use crate::r#type::common::*;
15
16pub mod section_0 {
17    use super::*;
18    use crate::r#type::instruction::ex2::section_0::*;
19
20    // ============================================================================
21    // Generated enum parsers
22    // ============================================================================
23
24    impl PtxParser for Atype {
25        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
26            // Try F16x2
27            {
28                let saved_pos = stream.position();
29                if stream.expect_string(".f16x2").is_ok() {
30                    return Ok(Atype::F16x2);
31                }
32                stream.set_position(saved_pos);
33            }
34            let saved_pos = stream.position();
35            // Try F16
36            {
37                let saved_pos = stream.position();
38                if stream.expect_string(".f16").is_ok() {
39                    return Ok(Atype::F16);
40                }
41                stream.set_position(saved_pos);
42            }
43            stream.set_position(saved_pos);
44            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
45            let expected = &[".f16x2", ".f16"];
46            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
47            Err(crate::parser::unexpected_value(span, expected, found))
48        }
49    }
50
51    impl PtxParser for Btype {
52        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
53            // Try Bf16x2
54            {
55                let saved_pos = stream.position();
56                if stream.expect_string(".bf16x2").is_ok() {
57                    return Ok(Btype::Bf16x2);
58                }
59                stream.set_position(saved_pos);
60            }
61            let saved_pos = stream.position();
62            // Try Bf16
63            {
64                let saved_pos = stream.position();
65                if stream.expect_string(".bf16").is_ok() {
66                    return Ok(Btype::Bf16);
67                }
68                stream.set_position(saved_pos);
69            }
70            stream.set_position(saved_pos);
71            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
72            let expected = &[".bf16x2", ".bf16"];
73            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
74            Err(crate::parser::unexpected_value(span, expected, found))
75        }
76    }
77
78    impl PtxParser for Ex2ApproxFtzF32 {
79        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
80            stream.expect_string("ex2")?;
81            stream.expect_string(".approx")?;
82            let approx = ();
83            stream.expect_complete()?;
84            let saved_pos = stream.position();
85            let ftz = stream.expect_string(".ftz").is_ok();
86            if !ftz {
87                stream.set_position(saved_pos);
88            }
89            stream.expect_complete()?;
90            stream.expect_string(".f32")?;
91            let f32 = ();
92            stream.expect_complete()?;
93            let d = GeneralOperand::parse(stream)?;
94            stream.expect_complete()?;
95            stream.expect(&PtxToken::Comma)?;
96            let a = GeneralOperand::parse(stream)?;
97            stream.expect_complete()?;
98            stream.expect_complete()?;
99            stream.expect(&PtxToken::Semicolon)?;
100            Ok(Ex2ApproxFtzF32 {
101                approx,
102                ftz,
103                f32,
104                d,
105                a,
106            })
107        }
108    }
109
110
111    impl PtxParser for Ex2ApproxAtype {
112        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
113            stream.expect_string("ex2")?;
114            stream.expect_string(".approx")?;
115            let approx = ();
116            stream.expect_complete()?;
117            let atype = Atype::parse(stream)?;
118            stream.expect_complete()?;
119            let d = GeneralOperand::parse(stream)?;
120            stream.expect_complete()?;
121            stream.expect(&PtxToken::Comma)?;
122            let a = GeneralOperand::parse(stream)?;
123            stream.expect_complete()?;
124            stream.expect_complete()?;
125            stream.expect(&PtxToken::Semicolon)?;
126            Ok(Ex2ApproxAtype {
127                approx,
128                atype,
129                d,
130                a,
131            })
132        }
133    }
134
135
136    impl PtxParser for Ex2ApproxFtzBtype {
137        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
138            stream.expect_string("ex2")?;
139            stream.expect_string(".approx")?;
140            let approx = ();
141            stream.expect_complete()?;
142            stream.expect_string(".ftz")?;
143            let ftz = ();
144            stream.expect_complete()?;
145            let btype = Btype::parse(stream)?;
146            stream.expect_complete()?;
147            let d = GeneralOperand::parse(stream)?;
148            stream.expect_complete()?;
149            stream.expect(&PtxToken::Comma)?;
150            let a = GeneralOperand::parse(stream)?;
151            stream.expect_complete()?;
152            stream.expect_complete()?;
153            stream.expect(&PtxToken::Semicolon)?;
154            Ok(Ex2ApproxFtzBtype {
155                approx,
156                ftz,
157                btype,
158                d,
159                a,
160            })
161        }
162    }
163
164
165}
166