ptx_parser/unparser/instruction/
div.rs

1//! Original PTX specification:
2//!
3//! div.type  d, a, b;
4//! .type = { .u16, .u32, .u64,
5//! .s16, .s32, .s64 };
6//!
7//! div.approx{.ftz}.f32  d, a, b;  // fast, approximate divide
8//! div.full{.ftz}.f32    d, a, b;  // full-range approximate divide
9//! div.rnd{.ftz}.f32     d, a, b;  // IEEE 754 compliant rounding
10//! div.rnd.f64           d, a, b;  // IEEE 754 compliant rounding
11//! .rnd = { .rn, .rz, .rm, .rp };
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::div::section_0::*;
21
22    impl PtxUnparser for DivType {
23        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
24            push_opcode(tokens, "div");
25            match &self.type_ {
26                Type::U16 => {
27                    push_directive(tokens, "u16");
28                }
29                Type::U32 => {
30                    push_directive(tokens, "u32");
31                }
32                Type::U64 => {
33                    push_directive(tokens, "u64");
34                }
35                Type::S16 => {
36                    push_directive(tokens, "s16");
37                }
38                Type::S32 => {
39                    push_directive(tokens, "s32");
40                }
41                Type::S64 => {
42                    push_directive(tokens, "s64");
43                }
44            }
45            self.d.unparse_tokens(tokens);
46            tokens.push(PtxToken::Comma);
47            self.a.unparse_tokens(tokens);
48            tokens.push(PtxToken::Comma);
49            self.b.unparse_tokens(tokens);
50            tokens.push(PtxToken::Semicolon);
51        }
52    }
53
54    impl PtxUnparser for DivApproxFtzF32 {
55        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
56            push_opcode(tokens, "div");
57            push_directive(tokens, "approx");
58            if self.ftz {
59                push_directive(tokens, "ftz");
60            }
61            push_directive(tokens, "f32");
62            self.d.unparse_tokens(tokens);
63            tokens.push(PtxToken::Comma);
64            self.a.unparse_tokens(tokens);
65            tokens.push(PtxToken::Comma);
66            self.b.unparse_tokens(tokens);
67            tokens.push(PtxToken::Semicolon);
68        }
69    }
70
71    impl PtxUnparser for DivFullFtzF32 {
72        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
73            push_opcode(tokens, "div");
74            push_directive(tokens, "full");
75            if self.ftz {
76                push_directive(tokens, "ftz");
77            }
78            push_directive(tokens, "f32");
79            self.d.unparse_tokens(tokens);
80            tokens.push(PtxToken::Comma);
81            self.a.unparse_tokens(tokens);
82            tokens.push(PtxToken::Comma);
83            self.b.unparse_tokens(tokens);
84            tokens.push(PtxToken::Semicolon);
85        }
86    }
87
88    impl PtxUnparser for DivRndFtzF32 {
89        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
90            push_opcode(tokens, "div");
91            match &self.rnd {
92                Rnd::Rn => {
93                    push_directive(tokens, "rn");
94                }
95                Rnd::Rz => {
96                    push_directive(tokens, "rz");
97                }
98                Rnd::Rm => {
99                    push_directive(tokens, "rm");
100                }
101                Rnd::Rp => {
102                    push_directive(tokens, "rp");
103                }
104            }
105            if self.ftz {
106                push_directive(tokens, "ftz");
107            }
108            push_directive(tokens, "f32");
109            self.d.unparse_tokens(tokens);
110            tokens.push(PtxToken::Comma);
111            self.a.unparse_tokens(tokens);
112            tokens.push(PtxToken::Comma);
113            self.b.unparse_tokens(tokens);
114            tokens.push(PtxToken::Semicolon);
115        }
116    }
117
118    impl PtxUnparser for DivRndF64 {
119        fn unparse_tokens(&self, tokens: &mut ::std::vec::Vec<PtxToken>) {
120            push_opcode(tokens, "div");
121            match &self.rnd {
122                Rnd::Rn => {
123                    push_directive(tokens, "rn");
124                }
125                Rnd::Rz => {
126                    push_directive(tokens, "rz");
127                }
128                Rnd::Rm => {
129                    push_directive(tokens, "rm");
130                }
131                Rnd::Rp => {
132                    push_directive(tokens, "rp");
133                }
134            }
135            push_directive(tokens, "f64");
136            self.d.unparse_tokens(tokens);
137            tokens.push(PtxToken::Comma);
138            self.a.unparse_tokens(tokens);
139            tokens.push(PtxToken::Comma);
140            self.b.unparse_tokens(tokens);
141            tokens.push(PtxToken::Semicolon);
142        }
143    }
144}