Skip to main content

ptx_parser/unparser/instruction/
sured.rs

1//! Original PTX specification:
2//!
3//! sured.b.op.geom.ctype.mode [a,b],c; // byte addressing
4//! .op    = { .add, .min, .max, .and, .or };
5//! .geom  = { .1d, .2d, .3d };
6//! .ctype = { .u32, .u64, .s32, .b32, .s64 };  // for sured.b
7//! .mode  = { .trap, .clamp, .zero };
8//! ----------------------------------------------------
9//! sured.p.op.geom.ctype.mode [a,b],c; // sample addressing
10//! .op    = { .add, .min, .max, .and, .or };
11//! .geom  = { .1d, .2d, .3d };
12//! .ctype = { .b32, .b64 };                    // for sured.p
13//! .mode  = { .trap, .clamp, .zero };
14
15#![allow(unused)]
16
17use crate::lexer::PtxToken;
18use crate::unparser::{PtxUnparser, common::*};
19
20pub mod section_0 {
21    use super::*;
22    use crate::r#type::instruction::sured::section_0::*;
23
24    impl PtxUnparser for SuredBOpGeomCtypeMode {
25        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
26            self.unparse_tokens_mode(tokens, false);
27        }
28        fn unparse_tokens_mode(&self, tokens: &mut ::std::vec::Vec<PtxToken>, spaced: bool) {
29            push_opcode(tokens, "sured");
30            push_directive(tokens, "b");
31            match &self.op {
32                Op::Add => {
33                    push_directive(tokens, "add");
34                }
35                Op::Min => {
36                    push_directive(tokens, "min");
37                }
38                Op::Max => {
39                    push_directive(tokens, "max");
40                }
41                Op::And => {
42                    push_directive(tokens, "and");
43                }
44                Op::Or => {
45                    push_directive(tokens, "or");
46                }
47            }
48            match &self.geom {
49                Geom::_1d => {
50                    push_directive(tokens, "1d");
51                }
52                Geom::_2d => {
53                    push_directive(tokens, "2d");
54                }
55                Geom::_3d => {
56                    push_directive(tokens, "3d");
57                }
58            }
59            match &self.ctype {
60                Ctype::U32 => {
61                    push_directive(tokens, "u32");
62                }
63                Ctype::U64 => {
64                    push_directive(tokens, "u64");
65                }
66                Ctype::S32 => {
67                    push_directive(tokens, "s32");
68                }
69                Ctype::B32 => {
70                    push_directive(tokens, "b32");
71                }
72                Ctype::S64 => {
73                    push_directive(tokens, "s64");
74                }
75            }
76            match &self.mode {
77                Mode::Clamp => {
78                    push_directive(tokens, "clamp");
79                }
80                Mode::Trap => {
81                    push_directive(tokens, "trap");
82                }
83                Mode::Zero => {
84                    push_directive(tokens, "zero");
85                }
86            }
87            if spaced {
88                tokens.push(PtxToken::Space);
89            }
90            self.a.unparse_tokens_mode(tokens, spaced);
91            tokens.push(PtxToken::Comma);
92            if spaced {
93                tokens.push(PtxToken::Space);
94            }
95            self.c.unparse_tokens_mode(tokens, spaced);
96            tokens.push(PtxToken::Semicolon);
97            if spaced {
98                tokens.push(PtxToken::Newline);
99            }
100        }
101    }
102}
103
104pub mod section_1 {
105    use super::*;
106    use crate::r#type::instruction::sured::section_1::*;
107
108    impl PtxUnparser for SuredPOpGeomCtypeMode {
109        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
110            self.unparse_tokens_mode(tokens, false);
111        }
112        fn unparse_tokens_mode(&self, tokens: &mut ::std::vec::Vec<PtxToken>, spaced: bool) {
113            push_opcode(tokens, "sured");
114            push_directive(tokens, "p");
115            match &self.op {
116                Op::Add => {
117                    push_directive(tokens, "add");
118                }
119                Op::Min => {
120                    push_directive(tokens, "min");
121                }
122                Op::Max => {
123                    push_directive(tokens, "max");
124                }
125                Op::And => {
126                    push_directive(tokens, "and");
127                }
128                Op::Or => {
129                    push_directive(tokens, "or");
130                }
131            }
132            match &self.geom {
133                Geom::_1d => {
134                    push_directive(tokens, "1d");
135                }
136                Geom::_2d => {
137                    push_directive(tokens, "2d");
138                }
139                Geom::_3d => {
140                    push_directive(tokens, "3d");
141                }
142            }
143            match &self.ctype {
144                Ctype::B32 => {
145                    push_directive(tokens, "b32");
146                }
147                Ctype::B64 => {
148                    push_directive(tokens, "b64");
149                }
150            }
151            match &self.mode {
152                Mode::Clamp => {
153                    push_directive(tokens, "clamp");
154                }
155                Mode::Trap => {
156                    push_directive(tokens, "trap");
157                }
158                Mode::Zero => {
159                    push_directive(tokens, "zero");
160                }
161            }
162            if spaced {
163                tokens.push(PtxToken::Space);
164            }
165            self.a.unparse_tokens_mode(tokens, spaced);
166            tokens.push(PtxToken::Comma);
167            if spaced {
168                tokens.push(PtxToken::Space);
169            }
170            self.c.unparse_tokens_mode(tokens, spaced);
171            tokens.push(PtxToken::Semicolon);
172            if spaced {
173                tokens.push(PtxToken::Newline);
174            }
175        }
176    }
177}