ptx_parser/unparser/instruction/
min.rs

1//! Original PTX specification:
2//!
3//! min.atype         d, a, b;
4//! min{.relu}.btype  d, a, b;
5//! .atype = { .u16, .u32, .u64, .u16x2, .s16, .s64 };
6//! .btype = { .s16x2, .s32 };
7//!
8//! min{.ftz}{.NaN}{.xorsign.abs}.f32  d, a, b;
9//! min{.ftz}{.NaN}{.abs}.f32          d, a, b, c;
10//! min.f64                            d, a, b;
11//!
12//! min{.ftz}{.NaN}{.xorsign.abs}.f16      d, a, b;
13//! min{.ftz}{.NaN}{.xorsign.abs}.f16x2    d, a, b;
14//! min{.NaN}{.xorsign.abs}.bf16           d, a, b;
15//! min{.NaN}{.xorsign.abs}.bf16x2         d, a, b;
16
17#![allow(unused)]
18
19use crate::lexer::PtxToken;
20use crate::unparser::{PtxUnparser, common::*};
21
22pub mod section_0 {
23    use super::*;
24    use crate::r#type::instruction::min::section_0::*;
25
26    impl PtxUnparser for MinAtype {
27        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
28            push_opcode(tokens, "min");
29            match &self.atype {
30                Atype::U16x2 => {
31                    push_directive(tokens, "u16x2");
32                }
33                Atype::U16 => {
34                    push_directive(tokens, "u16");
35                }
36                Atype::U32 => {
37                    push_directive(tokens, "u32");
38                }
39                Atype::U64 => {
40                    push_directive(tokens, "u64");
41                }
42                Atype::S16 => {
43                    push_directive(tokens, "s16");
44                }
45                Atype::S64 => {
46                    push_directive(tokens, "s64");
47                }
48            }
49            self.d.unparse_tokens(tokens);
50            tokens.push(PtxToken::Comma);
51            self.a.unparse_tokens(tokens);
52            tokens.push(PtxToken::Comma);
53            self.b.unparse_tokens(tokens);
54            tokens.push(PtxToken::Semicolon);
55        }
56    }
57
58    impl PtxUnparser for MinReluBtype {
59        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
60            push_opcode(tokens, "min");
61            if self.relu {
62                push_directive(tokens, "relu");
63            }
64            match &self.btype {
65                Btype::S16x2 => {
66                    push_directive(tokens, "s16x2");
67                }
68                Btype::S32 => {
69                    push_directive(tokens, "s32");
70                }
71            }
72            self.d.unparse_tokens(tokens);
73            tokens.push(PtxToken::Comma);
74            self.a.unparse_tokens(tokens);
75            tokens.push(PtxToken::Comma);
76            self.b.unparse_tokens(tokens);
77            tokens.push(PtxToken::Semicolon);
78        }
79    }
80
81    impl PtxUnparser for MinFtzNanXorsignAbsF32 {
82        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
83            push_opcode(tokens, "min");
84            if self.ftz {
85                push_directive(tokens, "ftz");
86            }
87            if self.nan {
88                push_directive(tokens, "NaN");
89            }
90            if self.xorsign_abs {
91                push_directive(tokens, "xorsign.abs");
92            }
93            push_directive(tokens, "f32");
94            self.d.unparse_tokens(tokens);
95            tokens.push(PtxToken::Comma);
96            self.a.unparse_tokens(tokens);
97            tokens.push(PtxToken::Comma);
98            self.b.unparse_tokens(tokens);
99            tokens.push(PtxToken::Semicolon);
100        }
101    }
102
103    impl PtxUnparser for MinFtzNanAbsF32 {
104        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
105            push_opcode(tokens, "min");
106            if self.ftz {
107                push_directive(tokens, "ftz");
108            }
109            if self.nan {
110                push_directive(tokens, "NaN");
111            }
112            if self.abs {
113                push_directive(tokens, "abs");
114            }
115            push_directive(tokens, "f32");
116            self.d.unparse_tokens(tokens);
117            tokens.push(PtxToken::Comma);
118            self.a.unparse_tokens(tokens);
119            tokens.push(PtxToken::Comma);
120            self.b.unparse_tokens(tokens);
121            tokens.push(PtxToken::Comma);
122            self.c.unparse_tokens(tokens);
123            tokens.push(PtxToken::Semicolon);
124        }
125    }
126
127    impl PtxUnparser for MinF64 {
128        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
129            push_opcode(tokens, "min");
130            push_directive(tokens, "f64");
131            self.d.unparse_tokens(tokens);
132            tokens.push(PtxToken::Comma);
133            self.a.unparse_tokens(tokens);
134            tokens.push(PtxToken::Comma);
135            self.b.unparse_tokens(tokens);
136            tokens.push(PtxToken::Semicolon);
137        }
138    }
139
140    impl PtxUnparser for MinFtzNanXorsignAbsF16 {
141        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
142            push_opcode(tokens, "min");
143            if self.ftz {
144                push_directive(tokens, "ftz");
145            }
146            if self.nan {
147                push_directive(tokens, "NaN");
148            }
149            if self.xorsign_abs {
150                push_directive(tokens, "xorsign.abs");
151            }
152            push_directive(tokens, "f16");
153            self.d.unparse_tokens(tokens);
154            tokens.push(PtxToken::Comma);
155            self.a.unparse_tokens(tokens);
156            tokens.push(PtxToken::Comma);
157            self.b.unparse_tokens(tokens);
158            tokens.push(PtxToken::Semicolon);
159        }
160    }
161
162    impl PtxUnparser for MinFtzNanXorsignAbsF16x2 {
163        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
164            push_opcode(tokens, "min");
165            if self.ftz {
166                push_directive(tokens, "ftz");
167            }
168            if self.nan {
169                push_directive(tokens, "NaN");
170            }
171            if self.xorsign_abs {
172                push_directive(tokens, "xorsign.abs");
173            }
174            push_directive(tokens, "f16x2");
175            self.d.unparse_tokens(tokens);
176            tokens.push(PtxToken::Comma);
177            self.a.unparse_tokens(tokens);
178            tokens.push(PtxToken::Comma);
179            self.b.unparse_tokens(tokens);
180            tokens.push(PtxToken::Semicolon);
181        }
182    }
183
184    impl PtxUnparser for MinNanXorsignAbsBf16 {
185        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
186            push_opcode(tokens, "min");
187            if self.nan {
188                push_directive(tokens, "NaN");
189            }
190            if self.xorsign_abs {
191                push_directive(tokens, "xorsign.abs");
192            }
193            push_directive(tokens, "bf16");
194            self.d.unparse_tokens(tokens);
195            tokens.push(PtxToken::Comma);
196            self.a.unparse_tokens(tokens);
197            tokens.push(PtxToken::Comma);
198            self.b.unparse_tokens(tokens);
199            tokens.push(PtxToken::Semicolon);
200        }
201    }
202
203    impl PtxUnparser for MinNanXorsignAbsBf16x2 {
204        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
205            push_opcode(tokens, "min");
206            if self.nan {
207                push_directive(tokens, "NaN");
208            }
209            if self.xorsign_abs {
210                push_directive(tokens, "xorsign.abs");
211            }
212            push_directive(tokens, "bf16x2");
213            self.d.unparse_tokens(tokens);
214            tokens.push(PtxToken::Comma);
215            self.a.unparse_tokens(tokens);
216            tokens.push(PtxToken::Comma);
217            self.b.unparse_tokens(tokens);
218            tokens.push(PtxToken::Semicolon);
219        }
220    }
221}