ptx_parser/parser/instruction/
testp.rs

1//! Original PTX specification:
2//!
3//! testp.op.type  p, a;  // result is .pred
4//! .op   = { .finite, .infinite,
5//! .number, .notanumber,
6//! .normal, .subnormal };
7//! .type = { .f32, .f64 };
8
9#![allow(unused)]
10
11use crate::lexer::PtxToken;
12use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
13use crate::r#type::common::*;
14
15pub mod section_0 {
16    use super::*;
17    use crate::r#type::instruction::testp::section_0::*;
18
19    // ============================================================================
20    // Generated enum parsers
21    // ============================================================================
22
23    impl PtxParser for Op {
24        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
25            // Try Notanumber
26            {
27                let saved_pos = stream.position();
28                if stream.expect_string(".notanumber").is_ok() {
29                    return Ok(Op::Notanumber);
30                }
31                stream.set_position(saved_pos);
32            }
33            let saved_pos = stream.position();
34            // Try Subnormal
35            {
36                let saved_pos = stream.position();
37                if stream.expect_string(".subnormal").is_ok() {
38                    return Ok(Op::Subnormal);
39                }
40                stream.set_position(saved_pos);
41            }
42            stream.set_position(saved_pos);
43            let saved_pos = stream.position();
44            // Try Infinite
45            {
46                let saved_pos = stream.position();
47                if stream.expect_string(".infinite").is_ok() {
48                    return Ok(Op::Infinite);
49                }
50                stream.set_position(saved_pos);
51            }
52            stream.set_position(saved_pos);
53            let saved_pos = stream.position();
54            // Try Finite
55            {
56                let saved_pos = stream.position();
57                if stream.expect_string(".finite").is_ok() {
58                    return Ok(Op::Finite);
59                }
60                stream.set_position(saved_pos);
61            }
62            stream.set_position(saved_pos);
63            let saved_pos = stream.position();
64            // Try Number
65            {
66                let saved_pos = stream.position();
67                if stream.expect_string(".number").is_ok() {
68                    return Ok(Op::Number);
69                }
70                stream.set_position(saved_pos);
71            }
72            stream.set_position(saved_pos);
73            let saved_pos = stream.position();
74            // Try Normal
75            {
76                let saved_pos = stream.position();
77                if stream.expect_string(".normal").is_ok() {
78                    return Ok(Op::Normal);
79                }
80                stream.set_position(saved_pos);
81            }
82            stream.set_position(saved_pos);
83            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
84            let expected = &[".notanumber", ".subnormal", ".infinite", ".finite", ".number", ".normal"];
85            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
86            Err(crate::parser::unexpected_value(span, expected, found))
87        }
88    }
89
90    impl PtxParser for Type {
91        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
92            // Try F32
93            {
94                let saved_pos = stream.position();
95                if stream.expect_string(".f32").is_ok() {
96                    return Ok(Type::F32);
97                }
98                stream.set_position(saved_pos);
99            }
100            let saved_pos = stream.position();
101            // Try F64
102            {
103                let saved_pos = stream.position();
104                if stream.expect_string(".f64").is_ok() {
105                    return Ok(Type::F64);
106                }
107                stream.set_position(saved_pos);
108            }
109            stream.set_position(saved_pos);
110            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
111            let expected = &[".f32", ".f64"];
112            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
113            Err(crate::parser::unexpected_value(span, expected, found))
114        }
115    }
116
117    impl PtxParser for TestpOpType {
118        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
119            stream.expect_string("testp")?;
120            let op = Op::parse(stream)?;
121            stream.expect_complete()?;
122            let type_ = Type::parse(stream)?;
123            stream.expect_complete()?;
124            let p = GeneralOperand::parse(stream)?;
125            stream.expect_complete()?;
126            stream.expect(&PtxToken::Comma)?;
127            let a = GeneralOperand::parse(stream)?;
128            stream.expect_complete()?;
129            stream.expect_complete()?;
130            stream.expect(&PtxToken::Semicolon)?;
131            Ok(TestpOpType {
132                op,
133                type_,
134                p,
135                a,
136            })
137        }
138    }
139
140
141}
142