Skip to main content

ptx_parser/parser/instruction/
add.rs

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