blob: bad0c40796495e855787c06696d5c0d99918258f [file] [log] [blame]
Eric Kunzee5e26762020-10-13 16:11:07 -07001
2// Copyright (c) 2020, ARM Limited.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#include "op_factory.h"
17#include "activation_funcs.h"
18#include "comparison.h"
19#include "control_flow.h"
20#include "custom.h"
21#include "data_layout.h"
22#include "data_nodes.h"
23#include "ewise_binary.h"
24#include "ewise_ternary.h"
25#include "ewise_unary.h"
26#include "image.h"
27#include "reduction.h"
28#include "scatter_gather.h"
29#include "tensor_ops.h"
30#include "type_conversion.h"
31
32using namespace TosaReference;
33using namespace tosa;
34
35GraphNode* OpFactory::newOp(TosaSerializationHandler* tsh,
36 Op opType,
37 TosaAttributeBase* attribute,
38 TosaQuantInfoBase* qinfo,
39 uint64_t id,
40 DType inputDType,
41 int inputRank,
42 DType outputDType,
43 int outputRank,
44 DType weightDType,
45 int weightRank)
46{
47 switch (opType)
48 {
49 // tensor_ops
50 case Op_ARGMAX:
51 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, FLOAT);
52 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, AINT8);
53 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, INT16);
54 break;
55 case Op_AVG_POOL2D:
56 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, FLOAT);
57 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, AINT8);
58 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, INT16);
59 break;
60 case Op_CONV2D:
61 DEF_FACTORY_TWO_TYPE(OpConv2d, FLOAT, FLOAT);
62 DEF_FACTORY_TWO_TYPE(OpConv2d, AINT8, INT4);
63 DEF_FACTORY_TWO_TYPE(OpConv2d, AINT8, INT8);
64 DEF_FACTORY_TWO_TYPE(OpConv2d, AINT8, AINT8);
65 DEF_FACTORY_TWO_TYPE(OpConv2d, INT16, INT8);
66 break;
67 case Op_DEPTHWISE_CONV2D:
68 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, FLOAT, FLOAT);
69 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, AINT8, INT4);
70 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, AINT8, INT8);
71 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, AINT8, AINT8);
72 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, INT16, INT8);
73 break;
74 case Op_FULLY_CONNECTED:
75 DEF_FACTORY_TWO_TYPE(OpFullyConnected, FLOAT, FLOAT);
76 DEF_FACTORY_TWO_TYPE(OpFullyConnected, AINT8, INT4);
77 DEF_FACTORY_TWO_TYPE(OpFullyConnected, AINT8, INT8);
78 DEF_FACTORY_TWO_TYPE(OpFullyConnected, AINT8, AINT8);
79 DEF_FACTORY_TWO_TYPE(OpFullyConnected, INT16, INT8);
80 break;
81 case Op_MATMUL:
82 DEF_FACTORY_ONE_TYPE(OpMatMul, FLOAT);
83 DEF_FACTORY_ONE_TYPE(OpMatMul, AINT8);
84 DEF_FACTORY_ONE_TYPE(OpMatMul, INT16);
85 break;
86 case Op_MAX_POOL2D:
87 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, FLOAT);
88 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, AINT8);
89 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, INT16);
90 break;
91 case Op_TRANSPOSE_CONV2D:
92 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, FLOAT, FLOAT);
93 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, AINT8, INT4);
94 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, AINT8, INT8);
95 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, AINT8, AINT8);
96 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, INT16, INT8);
97 break;
98
99 // activation_funcs
100 case Op_CLAMP:
101 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, FLOAT);
102 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, AINT8);
103 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, INT16);
104 break;
105 case Op_RELUN:
106 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReluN, FLOAT);
107 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReluN, INT32);
108 break;
109 case Op_SIGMOID:
110 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSigmoid, FLOAT);
111 break;
112 case Op_TANH:
113 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTanh, FLOAT);
114 break;
115
116 // ewise_binary
117 case Op_ADD:
118 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAdd, FLOAT);
119 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAdd, INT32);
120 break;
121 case Op_ARITHMETIC_RIGHT_SHIFT:
122 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT8);
123 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT16);
124 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT32);
125 break;
126 case Op_BITWISE_AND:
127 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, AINT8);
128 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, INT16);
129 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, INT32);
130 break;
131 case Op_BITWISE_OR:
132 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, AINT8);
133 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, INT16);
134 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, INT32);
135 break;
136 case Op_BITWISE_XOR:
137 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, AINT8);
138 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, INT16);
139 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, INT32);
140 break;
141 case Op_LOGICAL_AND:
142 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalAnd, BOOL);
143 break;
144 case Op_LOGICAL_LEFT_SHIFT:
145 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT8);
146 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT16);
147 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT32);
148 break;
149 case Op_LOGICAL_RIGHT_SHIFT:
150 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT8);
151 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT16);
152 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT32);
153 break;
154 case Op_LOGICAL_OR:
155 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalOr, BOOL);
156 break;
157 case Op_LOGICAL_XOR:
158 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalOr, BOOL);
159 break;
160 case Op_MAXIMUM:
161 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMaximum, FLOAT);
162 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMaximum, INT32);
163 break;
164 case Op_MINIMUM:
165 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMinimum, FLOAT);
166 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMinimum, INT32);
167 break;
168 case Op_MUL:
169 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, FLOAT, FLOAT);
170 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT8, INT32);
171 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT16, INT32);
172 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT32, INT32);
173 break;
174 case Op_POW:
175 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpPow, FLOAT);
176 break;
177 case Op_SUB:
178 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSub, FLOAT);
179 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSub, INT32);
180 break;
181 case Op_TABLE:
182 DEF_FACTORY_ONE_RANK_0_6(OpTable);
183 break;
184
185 // ewise_unary
186 case Op_ABS:
187 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAbs, FLOAT);
188 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAbs, INT32);
189 break;
190 case Op_BITWISE_NOT:
191 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, AINT8);
192 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, INT16);
193 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, INT32);
194 break;
195 case Op_CEIL:
196 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpCeil, FLOAT);
197 break;
198 case Op_CLZ:
199 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClz, INT32);
200 break;
201 case Op_EXP:
202 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpExp, FLOAT);
203 break;
204 case Op_FLOOR:
205 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpFloor, FLOAT);
206 break;
207 case Op_LOG:
208 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLog, FLOAT);
209 break;
210 case Op_LOGICAL_NOT:
211 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalNot, BOOL);
212 break;
213 case Op_NEGATE:
214 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, FLOAT);
215 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, AINT8);
216 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, INT16);
217 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, INT32);
218 break;
219 case Op_RECIPROCAL:
220 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReciprocal, FLOAT);
221 break;
222 case Op_RSQRT:
223 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpRsqrt, FLOAT);
224 break;
225
226 // ewise_ternary
227 case Op_SELECT:
228 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, FLOAT);
229 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, AINT8);
230 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT8);
231 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT16);
232 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT32);
233 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, BOOL);
234 break;
235
236 // comparison
237 case Op_EQUAL:
238 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpEqual, FLOAT);
239 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpEqual, INT32);
240 break;
241 case Op_GREATER:
242 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreater, FLOAT);
243 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreater, INT32);
244 break;
245 case Op_GREATER_EQUAL:
246 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreaterEqual, FLOAT);
247 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreaterEqual, INT32);
248 break;
249
250 // reduction
251 case Op_REDUCE_ALL:
252 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceAll, BOOL);
253 break;
254 case Op_REDUCE_ANY:
255 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceAny, BOOL);
256 break;
257 case Op_REDUCE_MAX:
258 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, FLOAT);
259 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, AINT8);
260 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, INT16);
261 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, INT32);
262 break;
263 case Op_REDUCE_MIN:
264 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, FLOAT);
265 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, AINT8);
266 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, INT16);
267 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, INT32);
268 break;
269 case Op_REDUCE_PRODUCT:
270 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceProduct, FLOAT);
271 break;
272 case Op_REDUCE_SUM:
273 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceSum, FLOAT);
274 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceSum, INT32);
275 break;
276
277 // data layout
278 case Op_CONCAT:
279 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, FLOAT);
280 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, AINT8);
281 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT8);
282 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT16);
283 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT32);
284 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, BOOL);
285 break;
286 case Op_PAD:
287 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, FLOAT);
288 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT32);
289 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, AINT8);
290 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT8);
291 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT16);
292 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, BOOL);
293 break;
294 case Op_RESHAPE:
295 DEF_FACTORY_RESHAPE(OpReshape, FLOAT);
296 DEF_FACTORY_RESHAPE(OpReshape, AINT8);
297 DEF_FACTORY_RESHAPE(OpReshape, INT8);
298 DEF_FACTORY_RESHAPE(OpReshape, INT16);
299 DEF_FACTORY_RESHAPE(OpReshape, INT32);
300 DEF_FACTORY_RESHAPE(OpReshape, BOOL);
301 break;
302 case Op_REVERSE:
303 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, FLOAT);
304 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, AINT8);
305 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT8);
306 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT16);
307 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT32);
308 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, BOOL);
309 break;
310 case Op_SLICE:
311 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, FLOAT);
312 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, AINT8);
313 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT8);
314 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT16);
315 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT32);
316 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, BOOL);
317 break;
318 case Op_TILE:
319 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, FLOAT);
320 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, AINT8);
321 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT8);
322 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT16);
323 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT32);
324 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, BOOL);
325 break;
326 case Op_TRANSPOSE:
327 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, BOOL);
328 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, FLOAT);
329 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, AINT8);
330 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT8);
331 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT16);
332 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT32);
333 break;
334
335 // scatter_gather
336 case Op_GATHER:
337 {
338 // output.rank = input.rank - 1 + index.rank
339 int32_t index_rank = outputRank - inputRank + 1;
340 DEF_FACTORY_GATHER(OpGather, AINT8);
341 DEF_FACTORY_GATHER(OpGather, INT16);
342 DEF_FACTORY_GATHER(OpGather, INT32);
343 }
344 break;
345
346 // image
347 case Op_RESIZE:
348 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT8, INT32);
349 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT8, INT8);
350 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT16, INT48);
351 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT16, INT16);
352 break;
353
354 // data_nodes
355 case Op_CONST:
356 return new OpConst(id);
357 case Op_PLACEHOLDER:
358 return new OpPlaceholder(id);
359 case Op_IDENTITY:
360 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, FLOAT);
361 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT32);
362 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, AINT8);
363 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT8);
364 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT16);
365 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, BOOL);
366 break;
367 case Op_IDENTITYN:
368 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, FLOAT);
369 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, INT32);
370 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, AINT8);
371 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, INT8);
372 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, INT16);
373 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentityN, BOOL);
374 break;
375
376 // type_conversion
377 case Op_CAST:
378 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT8);
379 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT16);
380 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT32);
381 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, BOOL);
382 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, INT16);
383 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, INT32);
384 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, FLOAT);
385 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, BOOL);
386 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, INT8);
387 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, INT32);
388 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, FLOAT);
389 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, BOOL);
390 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, INT8);
391 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, INT16);
392 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, FLOAT);
393 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT8);
394 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT16);
395 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT32);
396 break;
397 case Op_RESCALE:
398 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, AINT8, AINT8);
399 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, AINT8, INT16);
400 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, AINT8, INT32);
401 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, AINT8);
402 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, INT16);
403 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, INT32);
404 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, AINT8);
405 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, INT16);
406 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, INT32);
407 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, AINT8);
408 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, INT16);
409 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, INT32);
410 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, UINT8, AINT8);
411 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, AINT8, UINT8);
412 break;
413
414 // custom
415 case Op_CUSTOM:
416 return new OpCustom(id);
417
418 // control_flow
419 case Op_COND_IF:
420 return new OpCondIf(tsh, attribute, id);
421 case Op_WHILE_LOOP:
422 return new OpWhileLoop(tsh, attribute, id);
423
424 // Ops not recognized
425 default:
426 goto done;
427
428 } // End of switch(opType)
429
430done:
431 return nullptr;
432}