Skip to main content

ptx_parser/parser/instruction/
sqrt.rs

1//! Original PTX specification:
2//!
3//! sqrt.approx{.ftz}.f32  d, a; // fast, approximate square root
4//! sqrt.rnd{.ftz}.f32     d, a; // IEEE 754 compliant rounding
5//! sqrt.rnd.f64           d, a; // IEEE 754 compliant rounding
6//! .rnd = { .rn, .rz, .rm, .rp };
7
8#![allow(unused)]
9
10use crate::parser::{
11    PtxParseError, PtxParser, PtxTokenStream, Span,
12    util::{
13        between, comma_p, directive_p, exclamation_p, lbracket_p, lparen_p, map, minus_p, optional,
14        pipe_p, rbracket_p, rparen_p, semicolon_p, sep_by, string_p, try_map,
15    },
16};
17use crate::r#type::common::*;
18use crate::{alt, ok, seq_n};
19
20pub mod section_0 {
21    use super::*;
22    use crate::r#type::instruction::sqrt::section_0::*;
23
24    // ============================================================================
25    // Generated enum parsers
26    // ============================================================================
27
28    impl PtxParser for Rnd {
29        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
30            alt!(
31                map(string_p(".rn"), |_, _span| Rnd::Rn),
32                map(string_p(".rz"), |_, _span| Rnd::Rz),
33                map(string_p(".rm"), |_, _span| Rnd::Rm),
34                map(string_p(".rp"), |_, _span| Rnd::Rp)
35            )
36        }
37    }
38
39    impl PtxParser for SqrtApproxFtzF32 {
40        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
41            try_map(
42                seq_n!(
43                    string_p("sqrt"),
44                    string_p(".approx"),
45                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
46                    string_p(".f32"),
47                    GeneralOperand::parse(),
48                    comma_p(),
49                    GeneralOperand::parse(),
50                    semicolon_p()
51                ),
52                |(_, approx, ftz, f32, d, _, a, _), span| {
53                    ok!(SqrtApproxFtzF32 {
54                        approx = approx,
55                        ftz = ftz,
56                        f32 = f32,
57                        d = d,
58                        a = a,
59
60                    })
61                },
62            )
63        }
64    }
65
66    impl PtxParser for SqrtRndFtzF32 {
67        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
68            try_map(
69                seq_n!(
70                    string_p("sqrt"),
71                    Rnd::parse(),
72                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
73                    string_p(".f32"),
74                    GeneralOperand::parse(),
75                    comma_p(),
76                    GeneralOperand::parse(),
77                    semicolon_p()
78                ),
79                |(_, rnd, ftz, f32, d, _, a, _), span| {
80                    ok!(SqrtRndFtzF32 {
81                        rnd = rnd,
82                        ftz = ftz,
83                        f32 = f32,
84                        d = d,
85                        a = a,
86
87                    })
88                },
89            )
90        }
91    }
92
93    impl PtxParser for SqrtRndF64 {
94        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
95            try_map(
96                seq_n!(
97                    string_p("sqrt"),
98                    Rnd::parse(),
99                    string_p(".f64"),
100                    GeneralOperand::parse(),
101                    comma_p(),
102                    GeneralOperand::parse(),
103                    semicolon_p()
104                ),
105                |(_, rnd, f64, d, _, a, _), span| {
106                    ok!(SqrtRndF64 {
107                        rnd = rnd,
108                        f64 = f64,
109                        d = d,
110                        a = a,
111
112                    })
113                },
114            )
115        }
116    }
117}