Skip to main content

ptx_parser/parser/instruction/
sub.rs

1//! Original PTX specification:
2//!
3//! sub.type       d, a, b;
4//! sub{.sat}.s32  d, a, b;     // .sat applies only to .s32
5//! .type = { .u16, .u32, .u64,
6//! .s16, .s32, .s64 };
7//! --------------------------------------------
8//! sub{.rnd}{.ftz}{.sat}.f32  d, a, b;
9//! sub{.rnd}{.ftz}.f32x2      d, a, b;
10//! sub{.rnd}.f64              d, a, b;
11//! .rnd = { .rn, .rz, .rm, .rp };
12//! --------------------------------------------
13//! sub{.rnd}{.ftz}{.sat}.f16   d, a, b;
14//! sub{.rnd}{.ftz}{.sat}.f16x2 d, a, b;
15//! sub{.rnd}.bf16   d, a, b;
16//! sub{.rnd}.bf16x2 d, a, b;
17//! .rnd = { .rn };
18//! --------------------------------------------
19//! sub{.rnd}{.sat}.f32.atype  d, a, c;
20//! .atype = { .f16, .bf16};
21//! .rnd   = { .rn, .rz, .rm, .rp };
22
23#![allow(unused)]
24
25use crate::parser::{
26    PtxParseError, PtxParser, PtxTokenStream, Span,
27    util::{
28        between, comma_p, directive_p, exclamation_p, lbracket_p, lparen_p, map, minus_p, optional,
29        pipe_p, rbracket_p, rparen_p, semicolon_p, sep_by, string_p, try_map,
30    },
31};
32use crate::r#type::common::*;
33use crate::{alt, ok, seq_n};
34
35pub mod section_0 {
36    use super::*;
37    use crate::r#type::instruction::sub::section_0::*;
38
39    // ============================================================================
40    // Generated enum parsers
41    // ============================================================================
42
43    impl PtxParser for Type {
44        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
45            alt!(
46                map(string_p(".u16"), |_, _span| Type::U16),
47                map(string_p(".u32"), |_, _span| Type::U32),
48                map(string_p(".u64"), |_, _span| Type::U64),
49                map(string_p(".s16"), |_, _span| Type::S16),
50                map(string_p(".s32"), |_, _span| Type::S32),
51                map(string_p(".s64"), |_, _span| Type::S64)
52            )
53        }
54    }
55
56    impl PtxParser for SubType {
57        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
58            try_map(
59                seq_n!(
60                    string_p("sub"),
61                    Type::parse(),
62                    GeneralOperand::parse(),
63                    comma_p(),
64                    GeneralOperand::parse(),
65                    comma_p(),
66                    GeneralOperand::parse(),
67                    semicolon_p()
68                ),
69                |(_, type_, d, _, a, _, b, _), span| {
70                    ok!(SubType {
71                        type_ = type_,
72                        d = d,
73                        a = a,
74                        b = b,
75
76                    })
77                },
78            )
79        }
80    }
81
82    impl PtxParser for SubSatS32 {
83        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
84            try_map(
85                seq_n!(
86                    string_p("sub"),
87                    map(optional(string_p(".sat")), |value, _| value.is_some()),
88                    string_p(".s32"),
89                    GeneralOperand::parse(),
90                    comma_p(),
91                    GeneralOperand::parse(),
92                    comma_p(),
93                    GeneralOperand::parse(),
94                    semicolon_p()
95                ),
96                |(_, sat, s32, d, _, a, _, b, _), span| {
97                    ok!(SubSatS32 {
98                        sat = sat,
99                        s32 = s32,
100                        d = d,
101                        a = a,
102                        b = b,
103
104                    })
105                },
106            )
107        }
108    }
109}
110
111pub mod section_1 {
112    use super::*;
113    use crate::r#type::instruction::sub::section_1::*;
114
115    // ============================================================================
116    // Generated enum parsers
117    // ============================================================================
118
119    impl PtxParser for Rnd {
120        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
121            alt!(
122                map(string_p(".rn"), |_, _span| Rnd::Rn),
123                map(string_p(".rz"), |_, _span| Rnd::Rz),
124                map(string_p(".rm"), |_, _span| Rnd::Rm),
125                map(string_p(".rp"), |_, _span| Rnd::Rp)
126            )
127        }
128    }
129
130    impl PtxParser for SubRndFtzSatF32 {
131        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
132            try_map(
133                seq_n!(
134                    string_p("sub"),
135                    optional(Rnd::parse()),
136                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
137                    map(optional(string_p(".sat")), |value, _| value.is_some()),
138                    string_p(".f32"),
139                    GeneralOperand::parse(),
140                    comma_p(),
141                    GeneralOperand::parse(),
142                    comma_p(),
143                    GeneralOperand::parse(),
144                    semicolon_p()
145                ),
146                |(_, rnd, ftz, sat, f32, d, _, a, _, b, _), span| {
147                    ok!(SubRndFtzSatF32 {
148                        rnd = rnd,
149                        ftz = ftz,
150                        sat = sat,
151                        f32 = f32,
152                        d = d,
153                        a = a,
154                        b = b,
155
156                    })
157                },
158            )
159        }
160    }
161
162    impl PtxParser for SubRndFtzF32x2 {
163        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
164            try_map(
165                seq_n!(
166                    string_p("sub"),
167                    optional(Rnd::parse()),
168                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
169                    string_p(".f32x2"),
170                    GeneralOperand::parse(),
171                    comma_p(),
172                    GeneralOperand::parse(),
173                    comma_p(),
174                    GeneralOperand::parse(),
175                    semicolon_p()
176                ),
177                |(_, rnd, ftz, f32x2, d, _, a, _, b, _), span| {
178                    ok!(SubRndFtzF32x2 {
179                        rnd = rnd,
180                        ftz = ftz,
181                        f32x2 = f32x2,
182                        d = d,
183                        a = a,
184                        b = b,
185
186                    })
187                },
188            )
189        }
190    }
191
192    impl PtxParser for SubRndF64 {
193        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
194            try_map(
195                seq_n!(
196                    string_p("sub"),
197                    optional(Rnd::parse()),
198                    string_p(".f64"),
199                    GeneralOperand::parse(),
200                    comma_p(),
201                    GeneralOperand::parse(),
202                    comma_p(),
203                    GeneralOperand::parse(),
204                    semicolon_p()
205                ),
206                |(_, rnd, f64, d, _, a, _, b, _), span| {
207                    ok!(SubRndF64 {
208                        rnd = rnd,
209                        f64 = f64,
210                        d = d,
211                        a = a,
212                        b = b,
213
214                    })
215                },
216            )
217        }
218    }
219}
220
221pub mod section_2 {
222    use super::*;
223    use crate::r#type::instruction::sub::section_2::*;
224
225    // ============================================================================
226    // Generated enum parsers
227    // ============================================================================
228
229    impl PtxParser for Rnd {
230        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
231            alt!(map(string_p(".rn"), |_, _span| Rnd::Rn))
232        }
233    }
234
235    impl PtxParser for SubRndFtzSatF16 {
236        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
237            try_map(
238                seq_n!(
239                    string_p("sub"),
240                    optional(Rnd::parse()),
241                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
242                    map(optional(string_p(".sat")), |value, _| value.is_some()),
243                    string_p(".f16"),
244                    GeneralOperand::parse(),
245                    comma_p(),
246                    GeneralOperand::parse(),
247                    comma_p(),
248                    GeneralOperand::parse(),
249                    semicolon_p()
250                ),
251                |(_, rnd, ftz, sat, f16, d, _, a, _, b, _), span| {
252                    ok!(SubRndFtzSatF16 {
253                        rnd = rnd,
254                        ftz = ftz,
255                        sat = sat,
256                        f16 = f16,
257                        d = d,
258                        a = a,
259                        b = b,
260
261                    })
262                },
263            )
264        }
265    }
266
267    impl PtxParser for SubRndFtzSatF16x2 {
268        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
269            try_map(
270                seq_n!(
271                    string_p("sub"),
272                    optional(Rnd::parse()),
273                    map(optional(string_p(".ftz")), |value, _| value.is_some()),
274                    map(optional(string_p(".sat")), |value, _| value.is_some()),
275                    string_p(".f16x2"),
276                    GeneralOperand::parse(),
277                    comma_p(),
278                    GeneralOperand::parse(),
279                    comma_p(),
280                    GeneralOperand::parse(),
281                    semicolon_p()
282                ),
283                |(_, rnd, ftz, sat, f16x2, d, _, a, _, b, _), span| {
284                    ok!(SubRndFtzSatF16x2 {
285                        rnd = rnd,
286                        ftz = ftz,
287                        sat = sat,
288                        f16x2 = f16x2,
289                        d = d,
290                        a = a,
291                        b = b,
292
293                    })
294                },
295            )
296        }
297    }
298
299    impl PtxParser for SubRndBf16 {
300        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
301            try_map(
302                seq_n!(
303                    string_p("sub"),
304                    optional(Rnd::parse()),
305                    string_p(".bf16"),
306                    GeneralOperand::parse(),
307                    comma_p(),
308                    GeneralOperand::parse(),
309                    comma_p(),
310                    GeneralOperand::parse(),
311                    semicolon_p()
312                ),
313                |(_, rnd, bf16, d, _, a, _, b, _), span| {
314                    ok!(SubRndBf16 {
315                        rnd = rnd,
316                        bf16 = bf16,
317                        d = d,
318                        a = a,
319                        b = b,
320
321                    })
322                },
323            )
324        }
325    }
326
327    impl PtxParser for SubRndBf16x2 {
328        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
329            try_map(
330                seq_n!(
331                    string_p("sub"),
332                    optional(Rnd::parse()),
333                    string_p(".bf16x2"),
334                    GeneralOperand::parse(),
335                    comma_p(),
336                    GeneralOperand::parse(),
337                    comma_p(),
338                    GeneralOperand::parse(),
339                    semicolon_p()
340                ),
341                |(_, rnd, bf16x2, d, _, a, _, b, _), span| {
342                    ok!(SubRndBf16x2 {
343                        rnd = rnd,
344                        bf16x2 = bf16x2,
345                        d = d,
346                        a = a,
347                        b = b,
348
349                    })
350                },
351            )
352        }
353    }
354}
355
356pub mod section_3 {
357    use super::*;
358    use crate::r#type::instruction::sub::section_3::*;
359
360    // ============================================================================
361    // Generated enum parsers
362    // ============================================================================
363
364    impl PtxParser for Atype {
365        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
366            alt!(
367                map(string_p(".bf16"), |_, _span| Atype::Bf16),
368                map(string_p(".f16"), |_, _span| Atype::F16)
369            )
370        }
371    }
372
373    impl PtxParser for Rnd {
374        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
375            alt!(
376                map(string_p(".rn"), |_, _span| Rnd::Rn),
377                map(string_p(".rz"), |_, _span| Rnd::Rz),
378                map(string_p(".rm"), |_, _span| Rnd::Rm),
379                map(string_p(".rp"), |_, _span| Rnd::Rp)
380            )
381        }
382    }
383
384    impl PtxParser for SubRndSatF32Atype {
385        fn parse() -> impl Fn(&mut PtxTokenStream) -> Result<(Self, Span), PtxParseError> {
386            try_map(
387                seq_n!(
388                    string_p("sub"),
389                    optional(Rnd::parse()),
390                    map(optional(string_p(".sat")), |value, _| value.is_some()),
391                    string_p(".f32"),
392                    Atype::parse(),
393                    GeneralOperand::parse(),
394                    comma_p(),
395                    GeneralOperand::parse(),
396                    comma_p(),
397                    GeneralOperand::parse(),
398                    semicolon_p()
399                ),
400                |(_, rnd, sat, f32, atype, d, _, a, _, c, _), span| {
401                    ok!(SubRndSatF32Atype {
402                        rnd = rnd,
403                        sat = sat,
404                        f32 = f32,
405                        atype = atype,
406                        d = d,
407                        a = a,
408                        c = c,
409
410                    })
411                },
412            )
413        }
414    }
415}