ptx_parser/unparser/instruction/
sust.rs

1//! Original PTX specification:
2//!
3//! sust.b.dim{.cop}.vec.ctype{.mode} [a, b], c;  // unformatted
4//! sust.p.dim.vec.b32{.mode}       [a, b], c;  // formatted
5//! sust.b.adim{.cop}.vec.ctype{.mode}   [a, b], c;  // unformatted
6//! .cop   = { .wb, .cg, .cs, .wt };                     // cache operation
7//! .vec   = { none, .v2, .v4 };
8//! .ctype = { .b8 , .b16, .b32, .b64 };
9//! .mode  = { .trap, .clamp, .zero };
10//! .dim   = { .1d, .2d, .3d };
11//! .adim  = { .a1d, .a2d };
12
13#![allow(unused)]
14
15use crate::lexer::PtxToken;
16use crate::unparser::{PtxUnparser, common::*};
17
18pub mod section_0 {
19    use super::*;
20    use crate::r#type::instruction::sust::section_0::*;
21
22    impl PtxUnparser for SustBDimCopVecCtypeMode {
23        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
24            push_opcode(tokens, "sust");
25            push_directive(tokens, "b");
26            match &self.dim {
27                Dim::_1d => {
28                    push_directive(tokens, "1d");
29                }
30                Dim::_2d => {
31                    push_directive(tokens, "2d");
32                }
33                Dim::_3d => {
34                    push_directive(tokens, "3d");
35                }
36            }
37            if let Some(cop_0) = self.cop.as_ref() {
38                match cop_0 {
39                    Cop::Wb => {
40                        push_directive(tokens, "wb");
41                    }
42                    Cop::Cg => {
43                        push_directive(tokens, "cg");
44                    }
45                    Cop::Cs => {
46                        push_directive(tokens, "cs");
47                    }
48                    Cop::Wt => {
49                        push_directive(tokens, "wt");
50                    }
51                }
52            }
53            match &self.vec {
54                Vec::None => {
55                    push_token_from_str(tokens, "none");
56                }
57                Vec::V2 => {
58                    push_directive(tokens, "v2");
59                }
60                Vec::V4 => {
61                    push_directive(tokens, "v4");
62                }
63            }
64            match &self.ctype {
65                Ctype::B16 => {
66                    push_directive(tokens, "b16");
67                }
68                Ctype::B32 => {
69                    push_directive(tokens, "b32");
70                }
71                Ctype::B64 => {
72                    push_directive(tokens, "b64");
73                }
74                Ctype::B8 => {
75                    push_directive(tokens, "b8");
76                }
77            }
78            if let Some(mode_1) = self.mode.as_ref() {
79                match mode_1 {
80                    Mode::Clamp => {
81                        push_directive(tokens, "clamp");
82                    }
83                    Mode::Trap => {
84                        push_directive(tokens, "trap");
85                    }
86                    Mode::Zero => {
87                        push_directive(tokens, "zero");
88                    }
89                }
90            }
91            self.a.unparse_tokens(tokens);
92            tokens.push(PtxToken::Comma);
93            self.c.unparse_tokens(tokens);
94            tokens.push(PtxToken::Semicolon);
95        }
96    }
97
98    impl PtxUnparser for SustPDimVecB32Mode {
99        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
100            push_opcode(tokens, "sust");
101            push_directive(tokens, "p");
102            match &self.dim {
103                Dim::_1d => {
104                    push_directive(tokens, "1d");
105                }
106                Dim::_2d => {
107                    push_directive(tokens, "2d");
108                }
109                Dim::_3d => {
110                    push_directive(tokens, "3d");
111                }
112            }
113            match &self.vec {
114                Vec::None => {
115                    push_token_from_str(tokens, "none");
116                }
117                Vec::V2 => {
118                    push_directive(tokens, "v2");
119                }
120                Vec::V4 => {
121                    push_directive(tokens, "v4");
122                }
123            }
124            push_directive(tokens, "b32");
125            if let Some(mode_2) = self.mode.as_ref() {
126                match mode_2 {
127                    Mode::Clamp => {
128                        push_directive(tokens, "clamp");
129                    }
130                    Mode::Trap => {
131                        push_directive(tokens, "trap");
132                    }
133                    Mode::Zero => {
134                        push_directive(tokens, "zero");
135                    }
136                }
137            }
138            self.a.unparse_tokens(tokens);
139            tokens.push(PtxToken::Comma);
140            self.c.unparse_tokens(tokens);
141            tokens.push(PtxToken::Semicolon);
142        }
143    }
144
145    impl PtxUnparser for SustBAdimCopVecCtypeMode {
146        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
147            push_opcode(tokens, "sust");
148            push_directive(tokens, "b");
149            match &self.adim {
150                Adim::A1d => {
151                    push_directive(tokens, "a1d");
152                }
153                Adim::A2d => {
154                    push_directive(tokens, "a2d");
155                }
156            }
157            if let Some(cop_3) = self.cop.as_ref() {
158                match cop_3 {
159                    Cop::Wb => {
160                        push_directive(tokens, "wb");
161                    }
162                    Cop::Cg => {
163                        push_directive(tokens, "cg");
164                    }
165                    Cop::Cs => {
166                        push_directive(tokens, "cs");
167                    }
168                    Cop::Wt => {
169                        push_directive(tokens, "wt");
170                    }
171                }
172            }
173            match &self.vec {
174                Vec::None => {
175                    push_token_from_str(tokens, "none");
176                }
177                Vec::V2 => {
178                    push_directive(tokens, "v2");
179                }
180                Vec::V4 => {
181                    push_directive(tokens, "v4");
182                }
183            }
184            match &self.ctype {
185                Ctype::B16 => {
186                    push_directive(tokens, "b16");
187                }
188                Ctype::B32 => {
189                    push_directive(tokens, "b32");
190                }
191                Ctype::B64 => {
192                    push_directive(tokens, "b64");
193                }
194                Ctype::B8 => {
195                    push_directive(tokens, "b8");
196                }
197            }
198            if let Some(mode_4) = self.mode.as_ref() {
199                match mode_4 {
200                    Mode::Clamp => {
201                        push_directive(tokens, "clamp");
202                    }
203                    Mode::Trap => {
204                        push_directive(tokens, "trap");
205                    }
206                    Mode::Zero => {
207                        push_directive(tokens, "zero");
208                    }
209                }
210            }
211            self.a.unparse_tokens(tokens);
212            tokens.push(PtxToken::Comma);
213            self.c.unparse_tokens(tokens);
214            tokens.push(PtxToken::Semicolon);
215        }
216    }
217}