1#include "taichi/ir/stmt_op_types.h"
2
3#include "taichi/common/logging.h"
4
5namespace taichi::lang {
6std::string unary_op_type_name(UnaryOpType type) {
7 switch (type) {
8#define PER_UNARY_OP(i) \
9 case UnaryOpType::i: \
10 return #i;
11
12#include "taichi/inc/unary_op.inc.h"
13
14#undef PER_UNARY_OP
15 default:
16 TI_NOT_IMPLEMENTED
17 }
18}
19
20std::string binary_op_type_name(BinaryOpType type) {
21 switch (type) {
22#define PER_BINARY_OP(x) \
23 case BinaryOpType::x: \
24 return #x;
25
26#include "taichi/inc/binary_op.inc.h"
27
28#undef PER_BINARY_OP
29 default:
30 TI_NOT_IMPLEMENTED
31 }
32}
33
34std::string binary_op_type_symbol(BinaryOpType type) {
35 switch (type) {
36#define REGISTER_TYPE(i, s) \
37 case BinaryOpType::i: \
38 return #s;
39
40 REGISTER_TYPE(mul, *);
41 REGISTER_TYPE(add, +);
42 REGISTER_TYPE(sub, -);
43 REGISTER_TYPE(div, /);
44 REGISTER_TYPE(truediv, /);
45 REGISTER_TYPE(floordiv, /);
46 REGISTER_TYPE(mod, %);
47 REGISTER_TYPE(max, max);
48 REGISTER_TYPE(min, min);
49 REGISTER_TYPE(atan2, atan2);
50 REGISTER_TYPE(cmp_lt, <);
51 REGISTER_TYPE(cmp_le, <=);
52 REGISTER_TYPE(cmp_gt, >);
53 REGISTER_TYPE(cmp_ge, >=);
54 REGISTER_TYPE(cmp_ne, !=);
55 REGISTER_TYPE(cmp_eq, ==);
56 REGISTER_TYPE(bit_and, &);
57 REGISTER_TYPE(bit_or, |);
58 REGISTER_TYPE(logical_and, &&);
59 REGISTER_TYPE(logical_or, ||);
60 REGISTER_TYPE(bit_xor, ^);
61 REGISTER_TYPE(pow, pow);
62 REGISTER_TYPE(bit_shl, <<);
63 REGISTER_TYPE(bit_sar, >>);
64 REGISTER_TYPE(bit_shr, shr);
65
66#undef REGISTER_TYPE
67 default:
68 TI_NOT_IMPLEMENTED
69 }
70}
71
72std::string ternary_type_name(TernaryOpType type) {
73 switch (type) {
74#define REGISTER_TYPE(i) \
75 case TernaryOpType::i: \
76 return #i;
77
78 REGISTER_TYPE(select);
79 REGISTER_TYPE(ifte);
80
81#undef REGISTER_TYPE
82 default:
83 TI_NOT_IMPLEMENTED
84 }
85}
86
87std::string atomic_op_type_name(AtomicOpType type) {
88 switch (type) {
89#define REGISTER_TYPE(i) \
90 case AtomicOpType::i: \
91 return #i;
92
93 REGISTER_TYPE(add);
94 REGISTER_TYPE(sub);
95 REGISTER_TYPE(max);
96 REGISTER_TYPE(min);
97 REGISTER_TYPE(bit_and);
98 REGISTER_TYPE(bit_or);
99 REGISTER_TYPE(bit_xor);
100
101#undef REGISTER_TYPE
102 default:
103 TI_NOT_IMPLEMENTED
104 }
105}
106
107BinaryOpType atomic_to_binary_op_type(AtomicOpType type) {
108 switch (type) {
109#define REGISTER_TYPE(i) \
110 case AtomicOpType::i: \
111 return BinaryOpType::i;
112
113 REGISTER_TYPE(add);
114 REGISTER_TYPE(sub);
115 REGISTER_TYPE(max);
116 REGISTER_TYPE(min);
117 REGISTER_TYPE(bit_and);
118 REGISTER_TYPE(bit_or);
119 REGISTER_TYPE(bit_xor);
120
121#undef REGISTER_TYPE
122 default:
123 TI_NOT_IMPLEMENTED
124 }
125}
126
127std::string snode_op_type_name(SNodeOpType type) {
128 switch (type) {
129#define REGISTER_TYPE(i) \
130 case SNodeOpType::i: \
131 return #i;
132
133 REGISTER_TYPE(is_active);
134 REGISTER_TYPE(length);
135 REGISTER_TYPE(get_addr);
136 REGISTER_TYPE(activate);
137 REGISTER_TYPE(deactivate);
138 REGISTER_TYPE(append);
139 REGISTER_TYPE(allocate);
140 REGISTER_TYPE(clear);
141 REGISTER_TYPE(undefined);
142
143#undef REGISTER_TYPE
144 default:
145 TI_NOT_IMPLEMENTED
146 }
147}
148
149std::string texture_op_type_name(TextureOpType type) {
150 switch (type) {
151#define REGISTER_TYPE(i) \
152 case TextureOpType::i: \
153 return #i;
154
155 REGISTER_TYPE(kUndefined);
156 REGISTER_TYPE(kSampleLod);
157 REGISTER_TYPE(kFetchTexel);
158 REGISTER_TYPE(kLoad);
159 REGISTER_TYPE(kStore);
160
161#undef REGISTER_TYPE
162 default:
163 TI_NOT_IMPLEMENTED
164 }
165}
166
167} // namespace taichi::lang
168