1/*******************************************************************************
2* Copyright 2016-2022 Intel Corporation
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
17#include <assert.h>
18
19#include <initializer_list>
20
21#include "c_types_map.hpp"
22#include "memory_desc_wrapper.hpp"
23#include "type_helpers.hpp"
24#include "utils.hpp"
25
26namespace dnnl {
27namespace impl {
28
29status_t fill_blocked(memory_desc_t &md, std::initializer_list<int> perm,
30 std::initializer_list<int> inner_blks,
31 std::initializer_list<int> inner_idxs) {
32 const bool ok = true && perm.size() == (size_t)md.ndims
33 && inner_blks.size() == inner_idxs.size();
34 if (!ok) return status::invalid_arguments;
35
36 md.offset0 = 0;
37
38 blocking_desc_t &blk = md.format_desc.blocking;
39
40 dim_t block_size = 1;
41 dims_t blocks = {0};
42 utils::array_set(blocks, 1, md.ndims);
43
44 blk.inner_nblks = (int)inner_blks.size();
45
46 int iblk = 0;
47 for (const auto &b : inner_idxs)
48 blk.inner_idxs[iblk++] = b;
49
50 iblk = 0;
51 for (const auto &b : inner_blks) {
52 int dim = blk.inner_idxs[iblk];
53 block_size *= b;
54 blocks[dim] *= b;
55 blk.inner_blks[iblk++] = b;
56 }
57
58 utils::array_set(md.padded_offsets, 0, md.ndims);
59 for (int d = 0; d < md.ndims; ++d)
60 md.padded_dims[d] = md.dims[d] == DNNL_RUNTIME_DIM_VAL
61 ? DNNL_RUNTIME_DIM_VAL
62 : utils::rnd_up(md.dims[d], blocks[d]);
63
64 // setting the strides
65 {
66 dim_t stride = block_size;
67 auto iter_d = perm.end(); // reverse iterator over perm
68 do {
69 const int d = *(--iter_d);
70 blk.strides[d] = stride;
71
72 const dim_t pdim = md.padded_dims[d];
73 if (utils::one_of(DNNL_RUNTIME_DIM_VAL, stride, pdim))
74 stride = DNNL_RUNTIME_DIM_VAL;
75 else if (pdim != 0)
76 stride *= pdim / blocks[d];
77
78 } while (iter_d != perm.begin());
79 }
80
81 return status::success;
82}
83
84void memory_desc_wrapper::compute_strides_compat(dims_t *strides_compat) const {
85
86 if (ndims() == 0) return;
87
88 const blocking_desc_t &blk = md_->format_desc.blocking;
89
90 dims_t blocks;
91 compute_blocks(blocks);
92
93 int perm_idx = 0;
94 int inner_perm[DNNL_MAX_NDIMS] = {};
95 bool seen[DNNL_MAX_NDIMS] = {};
96
97 for (int i = 0; i < blk.inner_nblks; i++) {
98 int blk_idx = blk.inner_idxs[i];
99 if (seen[blk_idx]) continue;
100
101 seen[blk_idx] = true;
102 inner_perm[perm_idx] = blk_idx;
103 perm_idx++;
104 }
105
106 for (int i = 0; i < ndims(); i++)
107 if (!seen[i]) {
108 inner_perm[perm_idx] = i;
109 perm_idx++;
110 }
111
112 dims_t inner_strides;
113 inner_strides[inner_perm[ndims() - 1]] = 1;
114 for (int d = 1; d < ndims(); ++d) {
115 const int prev_idx = inner_perm[ndims() - d];
116 const int curr_idx = inner_perm[ndims() - 1 - d];
117
118 inner_strides[curr_idx] = blocks[curr_idx] == 0
119 ? 1
120 : inner_strides[prev_idx]
121 * nstl::max((dim_t)1, blocks[prev_idx]);
122 }
123
124 utils::array_copy(strides_compat[0], blk.strides, ndims());
125 utils::array_copy(strides_compat[1], inner_strides, ndims());
126}
127
128status_t memory_desc_wrapper::compute_blocking(
129 memory_desc_t &memory_desc, format_tag_t tag) {
130 using namespace format_tag;
131
132 if (memory_desc.ndims == 0) return status::invalid_arguments;
133
134#define C(tag, ... /* perm, inner_blks, inner_idxs */) \
135 case tag: return fill_blocked(memory_desc, __VA_ARGS__)
136
137 switch (tag) {
138 C(a, {0}, {}, {});
139 C(ab, {0, 1}, {}, {});
140 C(abc, {0, 1, 2}, {}, {});
141 C(abcd, {0, 1, 2, 3}, {}, {});
142 C(acbd, {0, 2, 1, 3}, {}, {});
143 C(abcde, {0, 1, 2, 3, 4}, {}, {});
144 C(abcdef, {0, 1, 2, 3, 4, 5}, {}, {});
145 C(abcdefg, {0, 1, 2, 3, 4, 5, 6}, {}, {});
146 C(abcdefgh, {0, 1, 2, 3, 4, 5, 6, 7}, {}, {});
147 C(abcdefghi, {0, 1, 2, 3, 4, 5, 6, 7, 8}, {}, {});
148 C(abcdefghij, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {}, {});
149 C(abcdefghijk, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {}, {});
150 C(abcdefghijkl, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, {}, {});
151 C(abcdefghijlk, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10}, {}, {});
152 C(abcdefghikj, {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 9}, {}, {});
153 C(abcdefghji, {0, 1, 2, 3, 4, 5, 6, 7, 9, 8}, {}, {});
154 C(abcdefgih, {0, 1, 2, 3, 4, 5, 6, 8, 7}, {}, {});
155 C(abcdefhg, {0, 1, 2, 3, 4, 5, 7, 6}, {}, {});
156 C(abcdegf, {0, 1, 2, 3, 4, 6, 5}, {}, {});
157 C(abcdfe, {0, 1, 2, 3, 5, 4}, {}, {});
158 C(abced, {0, 1, 2, 4, 3}, {}, {});
159 C(abdc, {0, 1, 3, 2}, {}, {});
160 C(abdec, {0, 1, 3, 4, 2}, {}, {});
161 C(abdfce, {0, 1, 3, 5, 2, 4}, {}, {});
162 C(acb, {0, 2, 1}, {}, {});
163 C(acbde, {0, 2, 1, 3, 4}, {}, {});
164 C(acbdef, {0, 2, 1, 3, 4, 5}, {}, {});
165 C(abdefc, {0, 1, 3, 4, 5, 2}, {}, {});
166 C(acdb, {0, 2, 3, 1}, {}, {});
167 C(acdeb, {0, 2, 3, 4, 1}, {}, {});
168 C(adbc, {0, 3, 1, 2}, {}, {});
169 C(ba, {1, 0}, {}, {});
170 C(bac, {1, 0, 2}, {}, {});
171 C(bacd, {1, 0, 2, 3}, {}, {});
172 C(bacde, {1, 0, 2, 3, 4}, {}, {});
173 C(bca, {1, 2, 0}, {}, {});
174 C(bcda, {1, 2, 3, 0}, {}, {});
175 C(bcdea, {1, 2, 3, 4, 0}, {}, {});
176 C(cab, {2, 0, 1}, {}, {});
177 C(cba, {2, 1, 0}, {}, {});
178 C(cdab, {2, 3, 0, 1}, {}, {});
179 C(cdba, {2, 3, 1, 0}, {}, {});
180 C(dcab, {3, 2, 0, 1}, {}, {});
181 C(cdeab, {2, 3, 4, 0, 1}, {}, {});
182 C(cdeba, {2, 3, 4, 1, 0}, {}, {});
183 C(decab, {3, 4, 2, 0, 1}, {}, {});
184 C(defcab, {3, 4, 5, 2, 0, 1}, {}, {});
185
186 C(Abc4a, {0, 1, 2}, {4}, {0});
187 C(aBc4b, {0, 1, 2}, {4}, {1});
188
189 C(BA16a16b, {1, 0}, {16, 16}, {0, 1});
190 C(BA16a32b, {1, 0}, {16, 32}, {0, 1});
191 C(BA16a48b, {1, 0}, {16, 48}, {0, 1});
192 C(BA16a64b, {1, 0}, {16, 64}, {0, 1});
193 C(BA16a16b2a, {1, 0}, {16, 16, 2}, {0, 1, 0});
194 C(BA16a32b2a, {1, 0}, {16, 32, 2}, {0, 1, 0});
195 C(BA16a48b2a, {1, 0}, {16, 48, 2}, {0, 1, 0});
196 C(BA16a64b2a, {1, 0}, {16, 64, 2}, {0, 1, 0});
197 C(BA16a16b4a, {1, 0}, {16, 16, 4}, {0, 1, 0});
198 C(BA16a32b4a, {1, 0}, {16, 32, 4}, {0, 1, 0});
199 C(BA16a48b4a, {1, 0}, {16, 48, 4}, {0, 1, 0});
200 C(BA16a64b4a, {1, 0}, {16, 64, 4}, {0, 1, 0});
201 C(aCB16b16c, {0, 2, 1}, {16, 16}, {1, 2});
202 C(aCB16b32c, {0, 2, 1}, {16, 32}, {1, 2});
203 C(aCB16b48c, {0, 2, 1}, {16, 48}, {1, 2});
204 C(aCB16b64c, {0, 2, 1}, {16, 64}, {1, 2});
205 C(aCB16b16c2b, {0, 2, 1}, {16, 16, 2}, {1, 2, 1});
206 C(aCB16b32c2b, {0, 2, 1}, {16, 32, 2}, {1, 2, 1});
207 C(aCB16b48c2b, {0, 2, 1}, {16, 48, 2}, {1, 2, 1});
208 C(aCB16b64c2b, {0, 2, 1}, {16, 64, 2}, {1, 2, 1});
209 C(aCB16b16c4b, {0, 2, 1}, {16, 16, 4}, {1, 2, 1});
210 C(aCB16b32c4b, {0, 2, 1}, {16, 32, 4}, {1, 2, 1});
211 C(aCB16b48c4b, {0, 2, 1}, {16, 48, 4}, {1, 2, 1});
212 C(aCB16b64c4b, {0, 2, 1}, {16, 64, 4}, {1, 2, 1});
213
214 C(ABc4b16a4b, {0, 1, 2}, {4, 16, 4}, {1, 0, 1});
215 C(ABc4b32a4b, {0, 1, 2}, {4, 32, 4}, {1, 0, 1});
216 C(ABc4b64a4b, {0, 1, 2}, {4, 64, 4}, {1, 0, 1});
217 C(ABc2b8a4b, {0, 1, 2}, {2, 8, 4}, {1, 0, 1});
218 C(ABc16b16a4b, {0, 1, 2}, {16, 16, 4}, {1, 0, 1});
219 C(ABc16b32a4b, {0, 1, 2}, {16, 32, 4}, {1, 0, 1});
220 C(ABc16b48a4b, {0, 1, 2}, {16, 48, 4}, {1, 0, 1});
221 C(ABc16b64a4b, {0, 1, 2}, {16, 64, 4}, {1, 0, 1});
222 C(ABc16b16a2b, {0, 1, 2}, {16, 16, 2}, {1, 0, 1});
223 C(ABc16b32a2b, {0, 1, 2}, {16, 32, 2}, {1, 0, 1});
224 C(ABc16b48a2b, {0, 1, 2}, {16, 48, 2}, {1, 0, 1});
225 C(ABc16b64a2b, {0, 1, 2}, {16, 64, 2}, {1, 0, 1});
226 C(ABc16a16b2a, {0, 1, 2}, {16, 16, 2}, {0, 1, 0});
227 C(ABc2b8a16b4a, {0, 1, 2}, {2, 8, 16, 4}, {1, 0, 1, 0});
228 C(ABcd2b8a16b4a, {0, 1, 2, 3}, {2, 8, 16, 4}, {1, 0, 1, 0});
229 C(ABcde2b8a16b4a, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {1, 0, 1, 0});
230 C(ABc2a8b16a4b, {0, 1, 2}, {2, 8, 16, 4}, {0, 1, 0, 1});
231 C(ABcd2a8b16a4b, {0, 1, 2, 3}, {2, 8, 16, 4}, {0, 1, 0, 1});
232 C(ABcde2a8b16a4b, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {0, 1, 0, 1});
233 C(ABc2a8b16a2b, {0, 1, 2}, {2, 8, 16, 2}, {0, 1, 0, 1});
234 C(ABcd2a8b16a2b, {0, 1, 2, 3}, {2, 8, 16, 2}, {0, 1, 0, 1});
235 C(ABcde2a8b16a2b, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {0, 1, 0, 1});
236 C(aCBd2c8b16c2b, {0, 2, 1, 3}, {2, 8, 16, 2}, {2, 1, 2, 1});
237 C(aCBde2c8b16c2b, {0, 2, 1, 3, 4}, {2, 8, 16, 2}, {2, 1, 2, 1});
238 C(aCBdef2c8b16c2b, {0, 2, 1, 3, 4, 5}, {2, 8, 16, 2}, {2, 1, 2, 1});
239 C(aBCd2b8c16b2c, {0, 1, 2, 3}, {2, 8, 16, 2}, {1, 2, 1, 2});
240 C(aBCde2b8c16b2c, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {1, 2, 1, 2});
241 C(aBCdef2b8c16b2c, {0, 1, 2, 3, 4, 5}, {2, 8, 16, 2}, {1, 2, 1, 2});
242 C(aBCd2b8c16b4c, {0, 1, 2, 3}, {2, 8, 16, 4}, {1, 2, 1, 2});
243 C(aBCd2c8b16c2b, {0, 1, 2, 3}, {2, 8, 16, 2}, {2, 1, 2, 1});
244 C(aBCde2b8c16b4c, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {1, 2, 1, 2});
245 C(ABc4b4a, {0, 1, 2}, {4, 4}, {1, 0});
246 C(Abcd4a, {0, 1, 2, 3}, {4}, {0});
247 C(aBcd4b, {0, 1, 2, 3}, {4}, {1});
248 C(ABcd4b4a, {0, 1, 2, 3}, {4, 4}, {1, 0});
249 C(ABcd4a2b, {0, 1, 2, 3}, {4, 2}, {0, 1});
250 C(ABcd4a4b, {0, 1, 2, 3}, {4, 4}, {0, 1});
251 C(aBCd4c16b4c, {0, 1, 2, 3}, {4, 16, 4}, {2, 1, 2});
252 C(aBCd2c8b4c, {0, 1, 2, 3}, {2, 8, 4}, {2, 1, 2});
253 C(aBCd16c16b4c, {0, 1, 2, 3}, {16, 16, 4}, {2, 1, 2});
254 C(aBCd16c16b2c, {0, 1, 2, 3}, {16, 16, 2}, {2, 1, 2});
255 C(aBCd16b16c2b, {0, 1, 2, 3}, {16, 16, 2}, {1, 2, 1});
256 C(aBCdef16c16b4c, {0, 1, 2, 3, 4, 5}, {16, 16, 4}, {2, 1, 2});
257 C(aBCd4c4b, {0, 1, 2, 3}, {4, 4}, {2, 1});
258 C(aBCd4b4c, {0, 1, 2, 3}, {4, 4}, {1, 2});
259 C(Abcde4a, {0, 1, 2, 3, 4}, {4}, {0});
260 C(aBcde4b, {0, 1, 2, 3, 4}, {4}, {1});
261 C(ABcde4b4a, {0, 1, 2, 3, 4}, {4, 4}, {1, 0});
262 C(ABcde4a2b, {0, 1, 2, 3, 4}, {4, 2}, {0, 1});
263 C(ABcde4a4b, {0, 1, 2, 3, 4}, {4, 4}, {0, 1});
264 C(aBCde4c4b, {0, 1, 2, 3, 4}, {4, 4}, {2, 1});
265 C(aBcdef4b, {0, 1, 2, 3, 4, 5}, {4}, {1});
266 C(aBCdef4c4b, {0, 1, 2, 3, 4, 5}, {4, 4}, {2, 1});
267 C(aBCdef4b4c, {0, 1, 2, 3, 4, 5}, {4, 4}, {1, 2});
268 C(aBdc4b, {0, 1, 3, 2}, {4}, {1});
269 C(aBdec4b, {0, 1, 3, 4, 2}, {4}, {1});
270 C(aBdefc4b, {0, 1, 3, 4, 5, 2}, {4}, {1});
271 C(Acb4a, {0, 2, 1}, {4}, {0});
272 C(Acdb4a, {0, 2, 3, 1}, {4}, {0});
273 C(Acdeb4a, {0, 2, 3, 4, 1}, {4}, {0});
274
275 C(AB16b16a, {0, 1}, {16, 16}, {1, 0});
276 C(AB16b32a, {0, 1}, {16, 32}, {1, 0});
277 C(AB16b64a, {0, 1}, {16, 64}, {1, 0});
278 C(AB8b16a2b, {0, 1}, {8, 16, 2}, {1, 0, 1});
279 C(AB8b32a2b, {0, 1}, {8, 32, 2}, {1, 0, 1});
280 C(AB8b64a2b, {0, 1}, {8, 64, 2}, {1, 0, 1});
281 C(AB4b16a4b, {0, 1}, {4, 16, 4}, {1, 0, 1});
282 C(AB16b16a4b, {0, 1}, {16, 16, 4}, {1, 0, 1});
283 C(AB16b32a4b, {0, 1}, {16, 32, 4}, {1, 0, 1});
284 C(AB16b48a4b, {0, 1}, {16, 48, 4}, {1, 0, 1});
285 C(AB16b64a4b, {0, 1}, {16, 64, 4}, {1, 0, 1});
286 C(AB16b16a2b, {0, 1}, {16, 16, 2}, {1, 0, 1});
287 C(AB16b32a2b, {0, 1}, {16, 32, 2}, {1, 0, 1});
288 C(AB16b48a2b, {0, 1}, {16, 48, 2}, {1, 0, 1});
289 C(AB16b64a2b, {0, 1}, {16, 64, 2}, {1, 0, 1});
290 C(AB4b32a4b, {0, 1}, {4, 32, 4}, {1, 0, 1});
291 C(AB4b64a4b, {0, 1}, {4, 64, 4}, {1, 0, 1});
292 C(AB32a16b, {0, 1}, {32, 16}, {0, 1});
293 C(AB32a32b, {0, 1}, {32, 32}, {0, 1});
294 C(AB48a16b, {0, 1}, {48, 16}, {0, 1});
295 C(AB48a32b, {0, 1}, {48, 32}, {0, 1});
296 C(BA4b8a8b2a, {1, 0}, {4, 8, 8, 2}, {1, 0, 1, 0});
297 C(BA4b8a8b4a, {1, 0}, {4, 8, 8, 4}, {1, 0, 1, 0});
298 C(BA4b8a16b2a, {1, 0}, {4, 8, 16, 2}, {1, 0, 1, 0});
299 C(BA4b8a16b4a, {1, 0}, {4, 8, 16, 4}, {1, 0, 1, 0});
300 C(aBC32b16c, {0, 1, 2}, {32, 16}, {1, 2});
301 C(aBC32b32c, {0, 1, 2}, {32, 32}, {1, 2});
302 C(aBC48b16c, {0, 1, 2}, {48, 16}, {1, 2});
303 C(aBC48b32c, {0, 1, 2}, {48, 32}, {1, 2});
304 C(aCB4c8b8c2b, {0, 2, 1}, {4, 8, 8, 2}, {2, 1, 2, 1});
305 C(aCB4c8b8c4b, {0, 2, 1}, {4, 8, 8, 4}, {2, 1, 2, 1});
306 C(aCB4c8b16c2b, {0, 2, 1}, {4, 8, 16, 2}, {2, 1, 2, 1});
307 C(aCB4c8b16c4b, {0, 2, 1}, {4, 8, 16, 4}, {2, 1, 2, 1});
308 C(Abc16a, {0, 1, 2}, {16}, {0});
309 C(ABc16a16b, {0, 1, 2}, {16, 16}, {0, 1});
310 C(ABc4a2b, {0, 1, 2}, {4, 2}, {0, 1});
311 C(ABc4a4b, {0, 1, 2}, {4, 4}, {0, 1});
312 C(aBc16b, {0, 1, 2}, {16}, {1});
313 C(aBc32b, {0, 1, 2}, {32}, {1});
314 C(ABc16b16a, {0, 1, 2}, {16, 16}, {1, 0});
315 C(ABc16b32a, {0, 1, 2}, {16, 32}, {1, 0});
316 C(ABc16b64a, {0, 1, 2}, {16, 64}, {1, 0});
317 C(ABc8a16b2a, {0, 1, 2}, {8, 16, 2}, {0, 1, 0});
318 C(BAc8a16b2a, {1, 0, 2}, {8, 16, 2}, {0, 1, 0});
319 C(ABc8a8b, {0, 1, 2}, {8, 8}, {0, 1});
320 C(ABc8a2b, {0, 1, 2}, {8, 2}, {0, 1});
321 C(ABc8a4b, {0, 1, 2}, {8, 4}, {0, 1});
322 C(aBc8b, {0, 1, 2}, {8}, {1});
323 C(ABc8b16a2b, {0, 1, 2}, {8, 16, 2}, {1, 0, 1});
324 C(ABc8b32a2b, {0, 1, 2}, {8, 32, 2}, {1, 0, 1});
325 C(ABc8b64a2b, {0, 1, 2}, {8, 64, 2}, {1, 0, 1});
326 C(ABc8b8a, {0, 1, 2}, {8, 8}, {1, 0});
327 C(Abcd16a, {0, 1, 2, 3}, {16}, {0});
328 C(Abcd8a, {0, 1, 2, 3}, {8}, {0});
329 C(Abcd32a, {0, 1, 2, 3}, {32}, {0});
330 C(ABcd16a16b, {0, 1, 2, 3}, {16, 16}, {0, 1});
331 C(aBcd16b, {0, 1, 2, 3}, {16}, {1});
332 C(aBcd32b, {0, 1, 2, 3}, {32}, {1});
333 C(ABcd16b16a, {0, 1, 2, 3}, {16, 16}, {1, 0});
334 C(ABcd16b32a, {0, 1, 2, 3}, {16, 32}, {1, 0});
335 C(ABcd16b64a, {0, 1, 2, 3}, {16, 64}, {1, 0});
336 C(aBCd16b16c, {0, 1, 2, 3}, {16, 16}, {1, 2});
337 C(aBCd16c16b, {0, 1, 2, 3}, {16, 16}, {2, 1});
338 C(ABcd4b16a4b, {0, 1, 2, 3}, {4, 16, 4}, {1, 0, 1});
339 C(ABcd4b32a4b, {0, 1, 2, 3}, {4, 32, 4}, {1, 0, 1});
340 C(ABcd4b64a4b, {0, 1, 2, 3}, {4, 64, 4}, {1, 0, 1});
341 C(ABcd2b8a4b, {0, 1, 2, 3}, {2, 8, 4}, {1, 0, 1});
342 C(ABcd16b16a4b, {0, 1, 2, 3}, {16, 16, 4}, {1, 0, 1});
343 C(ABcd16b32a4b, {0, 1, 2, 3}, {16, 32, 4}, {1, 0, 1});
344 C(ABcd16b48a4b, {0, 1, 2, 3}, {16, 48, 4}, {1, 0, 1});
345 C(ABcd16b64a4b, {0, 1, 2, 3}, {16, 64, 4}, {1, 0, 1});
346 C(ABcd16b16a2b, {0, 1, 2, 3}, {16, 16, 2}, {1, 0, 1});
347 C(ABcd16b32a2b, {0, 1, 2, 3}, {16, 32, 2}, {1, 0, 1});
348 C(ABcd16b48a2b, {0, 1, 2, 3}, {16, 48, 2}, {1, 0, 1});
349 C(ABcd16b64a2b, {0, 1, 2, 3}, {16, 64, 2}, {1, 0, 1});
350 C(ABcd16a16b2a, {0, 1, 2, 3}, {16, 16, 2}, {0, 1, 0});
351 C(ABcde16b16a2b, {0, 1, 2, 3, 4}, {16, 16, 2}, {1, 0, 1});
352 C(ABcde16b32a2b, {0, 1, 2, 3, 4}, {16, 32, 2}, {1, 0, 1});
353 C(ABcde16b48a2b, {0, 1, 2, 3, 4}, {16, 48, 2}, {1, 0, 1});
354 C(ABcde16b64a2b, {0, 1, 2, 3, 4}, {16, 64, 2}, {1, 0, 1});
355 C(ABcd8a16b2a, {0, 1, 2, 3}, {8, 16, 2}, {0, 1, 0});
356 C(BAcd8a16b2a, {1, 0, 2, 3}, {8, 16, 2}, {0, 1, 0});
357 C(ABcd8a8b, {0, 1, 2, 3}, {8, 8}, {0, 1});
358 C(ABcd8a4b, {0, 1, 2, 3}, {8, 4}, {0, 1});
359 C(ABcd8a2b, {0, 1, 2, 3}, {8, 2}, {0, 1});
360 C(aBcd8b, {0, 1, 2, 3}, {8}, {1});
361 C(ABcd8b16a2b, {0, 1, 2, 3}, {8, 16, 2}, {1, 0, 1});
362 C(ABcd8b32a2b, {0, 1, 2, 3}, {8, 32, 2}, {1, 0, 1});
363 C(ABcd8b64a2b, {0, 1, 2, 3}, {8, 64, 2}, {1, 0, 1});
364 C(aBCd8b16c2b, {0, 1, 2, 3}, {8, 16, 2}, {1, 2, 1});
365 C(aCBd8b16c2b, {0, 2, 1, 3}, {8, 16, 2}, {1, 2, 1});
366 C(ABcd8b8a, {0, 1, 2, 3}, {8, 8}, {1, 0});
367 C(aBCd8b8c, {0, 1, 2, 3}, {8, 8}, {1, 2});
368 C(aBCd8b2c, {0, 1, 2, 3}, {8, 2}, {1, 2});
369 C(aBCd8b4c, {0, 1, 2, 3}, {8, 4}, {1, 2});
370 C(aBCd8c16b2c, {0, 1, 2, 3}, {8, 16, 2}, {2, 1, 2});
371 C(aBCd8c8b, {0, 1, 2, 3}, {8, 8}, {2, 1});
372 C(Abcde16a, {0, 1, 2, 3, 4}, {16}, {0});
373 C(Abcde32a, {0, 1, 2, 3, 4}, {32}, {0});
374 C(ABcde16a16b, {0, 1, 2, 3, 4}, {16, 16}, {0, 1});
375 C(ABcde16a16b2a, {0, 1, 2, 3, 4}, {16, 16, 2}, {0, 1, 0});
376 C(aBcde16b, {0, 1, 2, 3, 4}, {16}, {1});
377 C(aBcde32b, {0, 1, 2, 3, 4}, {32}, {1});
378 C(ABcde16b16a, {0, 1, 2, 3, 4}, {16, 16}, {1, 0});
379 C(ABcde16b32a, {0, 1, 2, 3, 4}, {16, 32}, {1, 0});
380 C(ABcde16b64a, {0, 1, 2, 3, 4}, {16, 64}, {1, 0});
381 C(aBCde16b16c, {0, 1, 2, 3, 4}, {16, 16}, {1, 2});
382 C(aBCde16c16b, {0, 1, 2, 3, 4}, {16, 16}, {2, 1});
383 C(aBCde2c8b4c, {0, 1, 2, 3, 4}, {2, 8, 4}, {2, 1, 2});
384 C(aBCde4b4c, {0, 1, 2, 3, 4}, {4, 4}, {1, 2});
385 C(aBCde4c16b4c, {0, 1, 2, 3, 4}, {4, 16, 4}, {2, 1, 2});
386 C(aBCde16c16b4c, {0, 1, 2, 3, 4}, {16, 16, 4}, {2, 1, 2});
387 C(aBCde16c16b2c, {0, 1, 2, 3, 4}, {16, 16, 2}, {2, 1, 2});
388 C(aBCde16b16c2b, {0, 1, 2, 3, 4}, {16, 16, 2}, {1, 2, 1});
389 C(aBCdef16c16b2c, {0, 1, 2, 3, 4, 5}, {16, 16, 2}, {2, 1, 2});
390 C(Abcde8a, {0, 1, 2, 3, 4}, {8}, {0});
391 C(ABcde8a8b, {0, 1, 2, 3, 4}, {8, 8}, {0, 1});
392 C(ABcde8a2b, {0, 1, 2, 3, 4}, {8, 2}, {0, 1});
393 C(ABcde8a4b, {0, 1, 2, 3, 4}, {8, 4}, {0, 1});
394 C(ABcde32a32b, {0, 1, 2, 3, 4}, {32, 32}, {0, 1});
395 C(ABcde40a32b, {0, 1, 2, 3, 4}, {40, 32}, {0, 1});
396 C(aBcde8b, {0, 1, 2, 3, 4}, {8}, {1});
397 C(ABcde8a16b2a, {0, 1, 2, 3, 4}, {8, 16, 2}, {0, 1, 0});
398 C(ABcde8b16a2b, {0, 1, 2, 3, 4}, {8, 16, 2}, {1, 0, 1});
399 C(ABcde8b32a2b, {0, 1, 2, 3, 4}, {8, 32, 2}, {1, 0, 1});
400 C(ABcde8b64a2b, {0, 1, 2, 3, 4}, {8, 64, 2}, {1, 0, 1});
401 C(BAcde8a16b2a, {1, 0, 2, 3, 4}, {8, 16, 2}, {0, 1, 0});
402 C(ABcde4b16a4b, {0, 1, 2, 3, 4}, {4, 16, 4}, {1, 0, 1});
403 C(ABcde4b32a4b, {0, 1, 2, 3, 4}, {4, 32, 4}, {1, 0, 1});
404 C(ABcde4b64a4b, {0, 1, 2, 3, 4}, {4, 64, 4}, {1, 0, 1});
405 C(ABcde16b16a4b, {0, 1, 2, 3, 4}, {16, 16, 4}, {1, 0, 1});
406 C(ABcde16b32a4b, {0, 1, 2, 3, 4}, {16, 32, 4}, {1, 0, 1});
407 C(ABcde16b48a4b, {0, 1, 2, 3, 4}, {16, 48, 4}, {1, 0, 1});
408 C(ABcde16b64a4b, {0, 1, 2, 3, 4}, {16, 64, 4}, {1, 0, 1});
409 C(ABcde2b8a4b, {0, 1, 2, 3, 4}, {2, 8, 4}, {1, 0, 1});
410 C(aBCde8b16c2b, {0, 1, 2, 3, 4}, {8, 16, 2}, {1, 2, 1});
411 C(aCBde8b16c2b, {0, 2, 1, 3, 4}, {8, 16, 2}, {1, 2, 1});
412 C(ABcde8b8a, {0, 1, 2, 3, 4}, {8, 8}, {1, 0});
413 C(aBCde8b8c, {0, 1, 2, 3, 4}, {8, 8}, {1, 2});
414 C(aBCde8b2c, {0, 1, 2, 3, 4}, {8, 2}, {1, 2});
415 C(aBCde8b4c, {0, 1, 2, 3, 4}, {8, 4}, {1, 2});
416 C(aBCde8c16b2c, {0, 1, 2, 3, 4}, {8, 16, 2}, {2, 1, 2});
417 C(aBCde8c8b, {0, 1, 2, 3, 4}, {8, 8}, {2, 1});
418 C(aBcdef16b, {0, 1, 2, 3, 4, 5}, {16}, {1});
419 C(aBCdef16b16c, {0, 1, 2, 3, 4, 5}, {16, 16}, {1, 2});
420 C(aBCdef16b16c2b, {0, 1, 2, 3, 4, 5}, {16, 16, 2}, {1, 2, 1});
421 C(aBCdef16c16b, {0, 1, 2, 3, 4, 5}, {16, 16}, {2, 1});
422 C(aBCdef4c16b4c, {0, 1, 2, 3, 4, 5}, {4, 16, 4}, {2, 1, 2});
423 C(aBCdef2c8b4c, {0, 1, 2, 3, 4, 5}, {2, 8, 4}, {2, 1, 2});
424 C(aBCdef8b8c, {0, 1, 2, 3, 4, 5}, {8, 8}, {1, 2});
425 C(aBCdef8b2c, {0, 1, 2, 3, 4, 5}, {8, 2}, {1, 2});
426 C(aBCdef8b4c, {0, 1, 2, 3, 4, 5}, {8, 4}, {1, 2});
427 C(aBCdef8b16c2b, {0, 1, 2, 3, 4, 5}, {8, 16, 2}, {1, 2, 1});
428 C(aBCdef8c16b2c, {0, 1, 2, 3, 4, 5}, {8, 16, 2}, {2, 1, 2});
429 C(aCBdef8b16c2b, {0, 2, 1, 3, 4, 5}, {8, 16, 2}, {1, 2, 1});
430 C(aBCdef8c8b, {0, 1, 2, 3, 4, 5}, {8, 8}, {2, 1});
431 C(aBdc16b, {0, 1, 3, 2}, {16}, {1});
432 C(aBdC16b2c, {0, 1, 3, 2}, {16, 2}, {1, 2});
433 C(aBdC16b4c, {0, 1, 3, 2}, {16, 4}, {1, 2});
434 C(aBdc8b, {0, 1, 3, 2}, {8}, {1});
435 C(aBdec16b, {0, 1, 3, 4, 2}, {16}, {1});
436 C(aBdeC16b2c, {0, 1, 3, 4, 2}, {16, 2}, {1, 2});
437 C(aBdeC16b4c, {0, 1, 3, 4, 2}, {16, 4}, {1, 2});
438 C(aBdec8b, {0, 1, 3, 4, 2}, {8}, {1});
439 C(aBdefc16b, {0, 1, 3, 4, 5, 2}, {16}, {1});
440 C(aBdefC16b2c, {0, 1, 3, 4, 5, 2}, {16, 2}, {1, 2});
441 C(aBdefC16b4c, {0, 1, 3, 4, 5, 2}, {16, 4}, {1, 2});
442 C(aBdefc8b, {0, 1, 3, 4, 5, 2}, {8}, {1});
443 C(aBdfec16b, {0, 1, 3, 5, 4, 2}, {16}, {1});
444 C(aBedc16b, {0, 1, 4, 3, 2}, {16}, {1});
445 C(Acb16a, {0, 2, 1}, {16}, {0});
446 C(AcB16a2b, {0, 2, 1}, {16, 2}, {0, 1});
447 C(AcB16a4b, {0, 2, 1}, {16, 4}, {0, 1});
448 C(Acb8a, {0, 2, 1}, {8}, {0});
449 C(aCBd16b16c, {0, 2, 1, 3}, {16, 16}, {1, 2});
450 C(aCBde16b16c, {0, 2, 1, 3, 4}, {16, 16}, {1, 2});
451 C(Acdb16a, {0, 2, 3, 1}, {16}, {0});
452 C(AcdB16a2b, {0, 2, 3, 1}, {16, 2}, {0, 1});
453 C(AcdB16a4b, {0, 2, 3, 1}, {16, 4}, {0, 1});
454 C(Acdb8a, {0, 2, 3, 1}, {8}, {0});
455 C(Acdeb16a, {0, 2, 3, 4, 1}, {16}, {0});
456 C(AcdeB16a2b, {0, 2, 3, 4, 1}, {16, 2}, {0, 1});
457 C(AcdeB16a4b, {0, 2, 3, 4, 1}, {16, 4}, {0, 1});
458 C(Acdeb8a, {0, 2, 3, 4, 1}, {8}, {0});
459 C(Acedb16a, {0, 2, 4, 3, 1}, {16}, {0});
460 C(Adcb16a, {0, 3, 2, 1}, {16}, {0});
461 C(BAc16a16b, {1, 0, 2}, {16, 16}, {0, 1});
462 C(BAcd16a16b, {1, 0, 2, 3}, {16, 16}, {0, 1});
463 C(ABc32a16b, {0, 1, 2}, {32, 16}, {0, 1});
464 C(ABcd32a16b, {0, 1, 2, 3}, {32, 16}, {0, 1});
465 C(ABcde32a16b, {0, 1, 2, 3, 4}, {32, 16}, {0, 1});
466 C(ABc40a16b, {0, 1, 2}, {40, 16}, {0, 1});
467 C(ABcd40a16b, {0, 1, 2, 3}, {40, 16}, {0, 1});
468 C(ABcde40a16b, {0, 1, 2, 3, 4}, {40, 16}, {0, 1});
469 C(ABc2b32a8b, {0, 1, 2}, {2, 32, 8}, {1, 0, 1});
470 C(ABcd2b32a8b, {0, 1, 2, 3}, {2, 32, 8}, {1, 0, 1});
471 C(ABcde2b32a8b, {0, 1, 2, 3, 4}, {2, 32, 8}, {1, 0, 1});
472 C(aBC2b8c16b2c, {0, 1, 2}, {2, 8, 16, 2}, {1, 2, 1, 2});
473 C(ABc40a32b, {0, 1, 2}, {40, 32}, {0, 1});
474 C(ABcd40a32b, {0, 1, 2, 3}, {40, 32}, {0, 1});
475 C(ABc32a32b, {0, 1, 2}, {32, 32}, {0, 1});
476 C(ABcd32a32b, {0, 1, 2, 3}, {32, 32}, {0, 1});
477 C(BAcde16b16a, {1, 0, 2, 3, 4}, {16, 16}, {1, 0});
478 C(ABc4a8b8a4b, {0, 1, 2}, {4, 8, 8, 4}, {0, 1, 0, 1});
479 C(ABcd4a8b8a4b, {0, 1, 2, 3}, {4, 8, 8, 4}, {0, 1, 0, 1});
480 C(ABcde4a8b8a4b, {0, 1, 2, 3, 4}, {4, 8, 8, 4}, {0, 1, 0, 1});
481 C(BAc4b8a8b4a, {1, 0, 2}, {4, 8, 8, 4}, {1, 0, 1, 0});
482 C(BAcd4b8a8b4a, {1, 0, 2, 3}, {4, 8, 8, 4}, {1, 0, 1, 0});
483 C(BAcde4b8a8b4a, {1, 0, 2, 3, 4}, {4, 8, 8, 4}, {1, 0, 1, 0});
484 C(BAc2b8a16b4a, {1, 0, 2}, {2, 8, 16, 4}, {1, 0, 1, 0});
485 C(BAcd2b8a16b4a, {1, 0, 2, 3}, {2, 8, 16, 4}, {1, 0, 1, 0});
486 C(BAcde2b8a16b4a, {1, 0, 2, 3, 4}, {2, 8, 16, 4}, {1, 0, 1, 0});
487 C(BAc2b8a16b2a, {1, 0, 2}, {2, 8, 16, 2}, {1, 0, 1, 0});
488 C(aBCde2c8b16c2b, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {2, 1, 2, 1});
489 C(aBCdef2c8b16c2b, {0, 1, 2, 3, 4, 5}, {2, 8, 16, 2}, {2, 1, 2, 1});
490 C(BAcd2b8a16b2a, {1, 0, 2, 3}, {2, 8, 16, 2}, {1, 0, 1, 0});
491 C(BAcde2b8a16b2a, {1, 0, 2, 3, 4}, {2, 8, 16, 2}, {1, 0, 1, 0});
492 C(aCBd4c8b8c4b, {0, 2, 1, 3}, {4, 8, 8, 4}, {2, 1, 2, 1});
493 C(aCBde4c8b8c4b, {0, 2, 1, 3, 4}, {4, 8, 8, 4}, {2, 1, 2, 1});
494 C(aCBdef4c8b8c4b, {0, 2, 1, 3, 4, 5}, {4, 8, 8, 4}, {2, 1, 2, 1});
495 C(aBCdef4b8c8b4c, {0, 1, 2, 3, 4, 5}, {4, 8, 8, 4}, {1, 2, 1, 2});
496 C(ABcd2a8b8a2b, {0, 1, 2, 3}, {2, 8, 8, 2}, {0, 1, 0, 1});
497 C(ABcde4a8b8a2b, {0, 1, 2, 3, 4}, {4, 8, 8, 2}, {0, 1, 0, 1});
498 C(ABcd4a8b8a2b, {0, 1, 2, 3}, {4, 8, 8, 2}, {0, 1, 0, 1});
499 C(ABc4a8b8a2b, {0, 1, 2}, {4, 8, 8, 2}, {0, 1, 0, 1});
500 C(aBCdef4b8c8b2c, {0, 1, 2, 3, 4, 5}, {4, 8, 8, 2}, {1, 2, 1, 2});
501 C(aBCde4b8c8b2c, {0, 1, 2, 3, 4}, {4, 8, 8, 2}, {1, 2, 1, 2});
502 C(aBCd4b8c8b2c, {0, 1, 2, 3}, {4, 8, 8, 2}, {1, 2, 1, 2});
503 C(BAcde4b8a8b2a, {1, 0, 2, 3, 4}, {4, 8, 8, 2}, {1, 0, 1, 0});
504 C(BAcd4b8a8b2a, {1, 0, 2, 3}, {4, 8, 8, 2}, {1, 0, 1, 0});
505 C(BAc4b8a8b2a, {1, 0, 2}, {4, 8, 8, 2}, {1, 0, 1, 0});
506 C(aCBdef4c8b8c2b, {0, 2, 1, 3, 4, 5}, {4, 8, 8, 2}, {2, 1, 2, 1});
507 C(aCBde4c8b8c2b, {0, 2, 1, 3, 4}, {4, 8, 8, 2}, {2, 1, 2, 1});
508 C(aCBd4c8b8c2b, {0, 2, 1, 3}, {4, 8, 8, 2}, {2, 1, 2, 1});
509 C(aBCd4b8c8b4c, {0, 1, 2, 3}, {4, 8, 8, 4}, {1, 2, 1, 2});
510 C(aBCde4b8c8b4c, {0, 1, 2, 3, 4}, {4, 8, 8, 4}, {1, 2, 1, 2});
511 C(aBCde2b8c8b2c, {0, 1, 2, 3, 4}, {2, 8, 8, 2}, {1, 2, 1, 2});
512 C(aBdec32b, {0, 1, 3, 4, 2}, {32}, {1});
513 C(aCBdef16c16b, {0, 2, 1, 3, 4, 5}, {16, 16}, {2, 1});
514 C(aCBdef16b16c, {0, 2, 1, 3, 4, 5}, {16, 16}, {1, 2});
515 C(Abcdef16a, {0, 1, 2, 3, 4, 5}, {16}, {0});
516 C(Abcdef32a, {0, 1, 2, 3, 4, 5}, {32}, {0});
517 C(aCBd16c16b, {0, 2, 1, 3}, {16, 16}, {2, 1});
518 C(aCBde16c16b, {0, 2, 1, 3, 4}, {16, 16}, {2, 1});
519 C(Acdb32a, {0, 2, 3, 1}, {32}, {0});
520 C(BAcd16b16a, {1, 0, 2, 3}, {16, 16}, {1, 0});
521 C(BAcde16a16b, {1, 0, 2, 3, 4}, {16, 16}, {0, 1});
522 C(BAc16b16a, {1, 0, 2}, {16, 16}, {1, 0});
523 C(aBCd2b4c2b, {0, 1, 2, 3}, {2, 4, 2}, {1, 2, 1});
524 C(aBCde2b4c2b, {0, 1, 2, 3, 4}, {2, 4, 2}, {1, 2, 1});
525 C(aBCdef2b4c2b, {0, 1, 2, 3, 4, 5}, {2, 4, 2}, {1, 2, 1});
526 C(aBCd2c4b2c, {0, 1, 2, 3}, {2, 4, 2}, {2, 1, 2});
527 C(aBCde2c4b2c, {0, 1, 2, 3, 4}, {2, 4, 2}, {2, 1, 2});
528 C(aBCdef2c4b2c, {0, 1, 2, 3, 4, 5}, {2, 4, 2}, {2, 1, 2});
529 C(aBCd4b8c2b, {0, 1, 2, 3}, {4, 8, 2}, {1, 2, 1});
530 C(aBCde4b8c2b, {0, 1, 2, 3, 4}, {4, 8, 2}, {1, 2, 1});
531 C(aBCdef4b8c2b, {0, 1, 2, 3, 4, 5}, {4, 8, 2}, {1, 2, 1});
532 C(aBCd4c8b2c, {0, 1, 2, 3}, {4, 8, 2}, {2, 1, 2});
533 C(aBCde4c8b2c, {0, 1, 2, 3, 4}, {4, 8, 2}, {2, 1, 2});
534 C(aBCdef4c8b2c, {0, 1, 2, 3, 4, 5}, {4, 8, 2}, {2, 1, 2});
535 C(AB32a32b8a4b, {0, 1}, {32, 32, 8, 4}, {0, 1, 0, 1});
536 C(AB8a4b, {0, 1}, {8, 4}, {0, 1});
537 C(AB32a32b8a2b, {0, 1}, {32, 32, 8, 2}, {0, 1, 0, 1});
538 C(AB8a2b, {0, 1}, {8, 2}, {0, 1});
539 C(abDc32d, {0, 1, 3, 2}, {32}, {3});
540 C(abDC32d4c, {0, 1, 3, 2}, {32, 4}, {3, 2});
541 C(abCd4c, {0, 1, 2, 3}, {4}, {2});
542 C(abCde4c, {0, 1, 2, 3, 4}, {4}, {2});
543 C(abCdef4c, {0, 1, 2, 3, 4, 5}, {4}, {2});
544 C(abCd32c, {0, 1, 2, 3}, {32}, {2});
545 C(abCde32c, {0, 1, 2, 3, 4}, {32}, {2});
546 C(abCdef32c, {0, 1, 2, 3, 4, 5}, {32}, {2});
547 C(abdEc32e, {0, 1, 3, 4, 2}, {32}, {4});
548 C(abdEC32e2c, {0, 1, 3, 4, 2}, {32, 2}, {4, 2});
549 C(abdEC32e4c, {0, 1, 3, 4, 2}, {32, 4}, {4, 2});
550 C(abdEC64e2c, {0, 1, 3, 4, 2}, {64, 2}, {4, 2});
551 C(abdEC64e4c, {0, 1, 3, 4, 2}, {64, 4}, {4, 2});
552 C(abdCe32c, {0, 1, 3, 2, 4}, {32}, {2});
553 C(abdCE32c2e, {0, 1, 3, 2, 4}, {32, 2}, {2, 4});
554
555 C(cBa2b, {2, 1, 0}, {2}, {1});
556 C(cBa4b, {2, 1, 0}, {4}, {1});
557 C(adcb, {0, 3, 2, 1}, {}, {});
558 C(adCb2c, {0, 3, 2, 1}, {2}, {2});
559 C(adCb4c, {0, 3, 2, 1}, {4}, {2});
560 C(cdBa2b, {2, 3, 1, 0}, {2}, {1});
561 C(cdBa4b, {2, 3, 1, 0}, {4}, {1});
562 C(adecb, {0, 3, 4, 2, 1}, {}, {});
563 C(adeCb2c, {0, 3, 4, 2, 1}, {2}, {2});
564 C(adeCb4c, {0, 3, 4, 2, 1}, {4}, {2});
565 C(cdeBa2b, {2, 3, 4, 1, 0}, {2}, {1});
566 C(cdeBa4b, {2, 3, 4, 1, 0}, {4}, {1});
567 C(adefcb, {0, 3, 4, 5, 2, 1}, {}, {});
568 C(adefCb2c, {0, 3, 4, 5, 2, 1}, {2}, {2});
569 C(adefCb4c, {0, 3, 4, 5, 2, 1}, {4}, {2});
570 C(aBdc32b, {0, 1, 3, 2}, {32}, {1});
571 C(aBdC32b2c, {0, 1, 3, 2}, {32, 2}, {1, 2});
572 C(aBdC32b4c, {0, 1, 3, 2}, {32, 4}, {1, 2});
573 C(aBdc48b, {0, 1, 3, 2}, {48}, {1});
574 C(aBdC48b2c, {0, 1, 3, 2}, {48, 2}, {1, 2});
575 C(aBdC48b4c, {0, 1, 3, 2}, {48, 4}, {1, 2});
576 C(aBdc64b, {0, 1, 3, 2}, {64}, {1});
577 C(aBdC64b2c, {0, 1, 3, 2}, {64, 2}, {1, 2});
578 C(aBdC64b4c, {0, 1, 3, 2}, {64, 4}, {1, 2});
579 C(aBdeC32b2c, {0, 1, 3, 4, 2}, {32, 2}, {1, 2});
580 C(aBdeC32b4c, {0, 1, 3, 4, 2}, {32, 4}, {1, 2});
581 C(aBdec48b, {0, 1, 3, 4, 2}, {48}, {1});
582 C(aBdeC48b2c, {0, 1, 3, 4, 2}, {48, 2}, {1, 2});
583 C(aBdeC48b4c, {0, 1, 3, 4, 2}, {48, 4}, {1, 2});
584 C(aBdec64b, {0, 1, 3, 4, 2}, {64}, {1});
585 C(aBdeC64b2c, {0, 1, 3, 4, 2}, {64, 2}, {1, 2});
586 C(aBdeC64b4c, {0, 1, 3, 4, 2}, {64, 4}, {1, 2});
587 C(aBdefc32b, {0, 1, 3, 4, 5, 2}, {32}, {1});
588 C(aBdefC32b2c, {0, 1, 3, 4, 5, 2}, {32, 2}, {1, 2});
589 C(aBdefC32b4c, {0, 1, 3, 4, 5, 2}, {32, 4}, {1, 2});
590 C(aBdefc48b, {0, 1, 3, 4, 5, 2}, {48}, {1});
591 C(aBdefC48b2c, {0, 1, 3, 4, 5, 2}, {48, 2}, {1, 2});
592 C(aBdefC48b4c, {0, 1, 3, 4, 5, 2}, {48, 4}, {1, 2});
593 C(aBdefc64b, {0, 1, 3, 4, 5, 2}, {64}, {1});
594 C(aBdefC64b2c, {0, 1, 3, 4, 5, 2}, {64, 2}, {1, 2});
595 C(aBdefC64b4c, {0, 1, 3, 4, 5, 2}, {64, 4}, {1, 2});
596 C(Acb32a, {0, 2, 1}, {32}, {0});
597 C(AcB32a2b, {0, 2, 1}, {32, 2}, {0, 1});
598 C(AcB32a4b, {0, 2, 1}, {32, 4}, {0, 1});
599 C(Acb48a, {0, 2, 1}, {48}, {0});
600 C(AcB48a2b, {0, 2, 1}, {48, 2}, {0, 1});
601 C(AcB48a4b, {0, 2, 1}, {48, 4}, {0, 1});
602 C(Acb64a, {0, 2, 1}, {64}, {0});
603 C(AcB64a2b, {0, 2, 1}, {64, 2}, {0, 1});
604 C(AcB64a4b, {0, 2, 1}, {64, 4}, {0, 1});
605 C(AcdB32a2b, {0, 2, 3, 1}, {32, 2}, {0, 1});
606 C(AcdB32a4b, {0, 2, 3, 1}, {32, 4}, {0, 1});
607 C(Acdb48a, {0, 2, 3, 1}, {48}, {0});
608 C(AcdB48a2b, {0, 2, 3, 1}, {48, 2}, {0, 1});
609 C(AcdB48a4b, {0, 2, 3, 1}, {48, 4}, {0, 1});
610 C(Acdb64a, {0, 2, 3, 1}, {64}, {0});
611 C(AcdB64a2b, {0, 2, 3, 1}, {64, 2}, {0, 1});
612 C(AcdB64a4b, {0, 2, 3, 1}, {64, 4}, {0, 1});
613 C(Acdeb32a, {0, 2, 3, 4, 1}, {32}, {0});
614 C(AcdeB32a2b, {0, 2, 3, 4, 1}, {32, 2}, {0, 1});
615 C(AcdeB32a4b, {0, 2, 3, 4, 1}, {32, 4}, {0, 1});
616 C(Acdeb48a, {0, 2, 3, 4, 1}, {48}, {0});
617 C(AcdeB48a2b, {0, 2, 3, 4, 1}, {48, 2}, {0, 1});
618 C(AcdeB48a4b, {0, 2, 3, 4, 1}, {48, 4}, {0, 1});
619 C(Acdeb64a, {0, 2, 3, 4, 1}, {64}, {0});
620 C(AcdeB64a2b, {0, 2, 3, 4, 1}, {64, 2}, {0, 1});
621 C(AcdeB64a4b, {0, 2, 3, 4, 1}, {64, 4}, {0, 1});
622 C(aBdeC16c16b2c, {0, 1, 3, 4, 2}, {16, 16, 2}, {2, 1, 2});
623 C(aBdeC16c16b4c, {0, 1, 3, 4, 2}, {16, 16, 4}, {2, 1, 2});
624 C(aBdefC16c16b2c, {0, 1, 3, 4, 5, 2}, {16, 16, 2}, {2, 1, 2});
625 C(aBdefC16c16b4c, {0, 1, 3, 4, 5, 2}, {16, 16, 4}, {2, 1, 2});
626 C(AcB16b16a2b, {0, 2, 1}, {16, 16, 2}, {1, 0, 1});
627 C(AcB16b16a4b, {0, 2, 1}, {16, 16, 4}, {1, 0, 1});
628 C(AcdB16b16a2b, {0, 2, 3, 1}, {16, 16, 2}, {1, 0, 1});
629 C(AcdB16b16a4b, {0, 2, 3, 1}, {16, 16, 4}, {1, 0, 1});
630 C(AcdeB16b16a2b, {0, 2, 3, 4, 1}, {16, 16, 2}, {1, 0, 1});
631 C(AcdeB16b16a4b, {0, 2, 3, 4, 1}, {16, 16, 4}, {1, 0, 1});
632 C(aBdC16c16b2c, {0, 1, 3, 2}, {16, 16, 2}, {2, 1, 2});
633 C(aBdC16c16b4c, {0, 1, 3, 2}, {16, 16, 4}, {2, 1, 2});
634 C(aBdC16c32b2c, {0, 1, 3, 2}, {16, 32, 2}, {2, 1, 2});
635 C(aBdC16c32b4c, {0, 1, 3, 2}, {16, 32, 4}, {2, 1, 2});
636 C(aBdC16c48b2c, {0, 1, 3, 2}, {16, 48, 2}, {2, 1, 2});
637 C(aBdC16c48b4c, {0, 1, 3, 2}, {16, 48, 4}, {2, 1, 2});
638 C(aBdC16c64b2c, {0, 1, 3, 2}, {16, 64, 2}, {2, 1, 2});
639 C(aBdC16c64b4c, {0, 1, 3, 2}, {16, 64, 4}, {2, 1, 2});
640 C(aBdeC16c32b2c, {0, 1, 3, 4, 2}, {16, 32, 2}, {2, 1, 2});
641 C(aBdeC16c32b4c, {0, 1, 3, 4, 2}, {16, 32, 4}, {2, 1, 2});
642 C(aBdeC16c48b2c, {0, 1, 3, 4, 2}, {16, 48, 2}, {2, 1, 2});
643 C(aBdeC16c48b4c, {0, 1, 3, 4, 2}, {16, 48, 4}, {2, 1, 2});
644 C(aBdeC16c64b2c, {0, 1, 3, 4, 2}, {16, 64, 2}, {2, 1, 2});
645 C(aBdeC16c64b4c, {0, 1, 3, 4, 2}, {16, 64, 4}, {2, 1, 2});
646 C(aBdefC16c32b2c, {0, 1, 3, 4, 5, 2}, {16, 32, 2}, {2, 1, 2});
647 C(aBdefC16c32b4c, {0, 1, 3, 4, 5, 2}, {16, 32, 4}, {2, 1, 2});
648 C(aBdefC16c48b2c, {0, 1, 3, 4, 5, 2}, {16, 48, 2}, {2, 1, 2});
649 C(aBdefC16c48b4c, {0, 1, 3, 4, 5, 2}, {16, 48, 4}, {2, 1, 2});
650 C(aBdefC16c64b2c, {0, 1, 3, 4, 5, 2}, {16, 64, 2}, {2, 1, 2});
651 C(aBdefC16c64b4c, {0, 1, 3, 4, 5, 2}, {16, 64, 4}, {2, 1, 2});
652 C(AcB16b32a2b, {0, 2, 1}, {16, 32, 2}, {1, 0, 1});
653 C(AcB16b32a4b, {0, 2, 1}, {16, 32, 4}, {1, 0, 1});
654 C(AcB16b48a2b, {0, 2, 1}, {16, 48, 2}, {1, 0, 1});
655 C(AcB16b48a4b, {0, 2, 1}, {16, 48, 4}, {1, 0, 1});
656 C(AcB16b64a2b, {0, 2, 1}, {16, 64, 2}, {1, 0, 1});
657 C(AcB16b64a4b, {0, 2, 1}, {16, 64, 4}, {1, 0, 1});
658 C(AcdB16b32a2b, {0, 2, 3, 1}, {16, 32, 2}, {1, 0, 1});
659 C(AcdB16b32a4b, {0, 2, 3, 1}, {16, 32, 4}, {1, 0, 1});
660 C(AcdB16b48a2b, {0, 2, 3, 1}, {16, 48, 2}, {1, 0, 1});
661 C(AcdB16b48a4b, {0, 2, 3, 1}, {16, 48, 4}, {1, 0, 1});
662 C(AcdB16b64a2b, {0, 2, 3, 1}, {16, 64, 2}, {1, 0, 1});
663 C(AcdB16b64a4b, {0, 2, 3, 1}, {16, 64, 4}, {1, 0, 1});
664 C(AcdeB16b32a2b, {0, 2, 3, 4, 1}, {16, 32, 2}, {1, 0, 1});
665 C(AcdeB16b32a4b, {0, 2, 3, 4, 1}, {16, 32, 4}, {1, 0, 1});
666 C(AcdeB16b48a2b, {0, 2, 3, 4, 1}, {16, 48, 2}, {1, 0, 1});
667 C(AcdeB16b48a4b, {0, 2, 3, 4, 1}, {16, 48, 4}, {1, 0, 1});
668 C(AcdeB16b64a2b, {0, 2, 3, 4, 1}, {16, 64, 2}, {1, 0, 1});
669 C(AcdeB16b64a4b, {0, 2, 3, 4, 1}, {16, 64, 4}, {1, 0, 1});
670 C(decbA16a, {3, 4, 2, 1, 0}, {16}, {0});
671 C(decbA8a, {3, 4, 2, 1, 0}, {8}, {0});
672 C(aCB16c2b, {0, 2, 1}, {16, 2}, {2, 1});
673 C(aCB16c4b, {0, 2, 1}, {16, 4}, {2, 1});
674 C(BA16b2a, {1, 0}, {16, 2}, {1, 0});
675 C(BA16b4a, {1, 0}, {16, 4}, {1, 0});
676 C(aBC16b16c, {0, 1, 2}, {16, 16}, {1, 2});
677 C(aBC16b32c, {0, 1, 2}, {16, 32}, {1, 2});
678 C(AB16a16b, {0, 1}, {16, 16}, {0, 1});
679 C(AB16a32b, {0, 1}, {16, 32}, {0, 1});
680 C(ABcd16a32b, {0, 1, 2, 3}, {16, 32}, {0, 1});
681
682 C(aCdefB16b32c2b, {0, 2, 3, 4, 5, 1}, {16, 32, 2}, {1, 2, 1});
683 C(aCdefB16b32c4b, {0, 2, 3, 4, 5, 1}, {16, 32, 4}, {1, 2, 1});
684 C(aCdefB16b48c2b, {0, 2, 3, 4, 5, 1}, {16, 48, 2}, {1, 2, 1});
685 C(aCdefB16b48c4b, {0, 2, 3, 4, 5, 1}, {16, 48, 4}, {1, 2, 1});
686 C(aCdefB16b64c2b, {0, 2, 3, 4, 5, 1}, {16, 64, 2}, {1, 2, 1});
687 C(aCdefB16b64c4b, {0, 2, 3, 4, 5, 1}, {16, 64, 4}, {1, 2, 1});
688 C(BcdeA16a32b2a, {1, 2, 3, 4, 0}, {16, 32, 2}, {0, 1, 0});
689 C(BcdeA16a32b4a, {1, 2, 3, 4, 0}, {16, 32, 4}, {0, 1, 0});
690 C(BcdeA16a48b2a, {1, 2, 3, 4, 0}, {16, 48, 2}, {0, 1, 0});
691 C(BcdeA16a48b4a, {1, 2, 3, 4, 0}, {16, 48, 4}, {0, 1, 0});
692 C(BcdeA16a64b2a, {1, 2, 3, 4, 0}, {16, 64, 2}, {0, 1, 0});
693 C(BcdeA16a64b4a, {1, 2, 3, 4, 0}, {16, 64, 4}, {0, 1, 0});
694 C(aCdefb32c, {0, 2, 3, 4, 5, 1}, {32}, {2});
695 C(aCdefB32c2b, {0, 2, 3, 4, 5, 1}, {32, 2}, {2, 1});
696 C(aCdefB32c4b, {0, 2, 3, 4, 5, 1}, {32, 4}, {2, 1});
697 C(aCdefb48c, {0, 2, 3, 4, 5, 1}, {48}, {2});
698 C(aCdefB48c2b, {0, 2, 3, 4, 5, 1}, {48, 2}, {2, 1});
699 C(aCdefB48c4b, {0, 2, 3, 4, 5, 1}, {48, 4}, {2, 1});
700 C(aCdefb64c, {0, 2, 3, 4, 5, 1}, {64}, {2});
701 C(aCdefB64c2b, {0, 2, 3, 4, 5, 1}, {64, 2}, {2, 1});
702 C(aCdefB64c4b, {0, 2, 3, 4, 5, 1}, {64, 4}, {2, 1});
703 C(Bcdea32b, {1, 2, 3, 4, 0}, {32}, {1});
704 C(BcdeA32b2a, {1, 2, 3, 4, 0}, {32, 2}, {1, 0});
705 C(BcdeA32b4a, {1, 2, 3, 4, 0}, {32, 4}, {1, 0});
706 C(Bcdea48b, {1, 2, 3, 4, 0}, {48}, {1});
707 C(BcdeA48b2a, {1, 2, 3, 4, 0}, {48, 2}, {1, 0});
708 C(BcdeA48b4a, {1, 2, 3, 4, 0}, {48, 4}, {1, 0});
709 C(Bcdea64b, {1, 2, 3, 4, 0}, {64}, {1});
710 C(BcdeA64b2a, {1, 2, 3, 4, 0}, {64, 2}, {1, 0});
711 C(BcdeA64b4a, {1, 2, 3, 4, 0}, {64, 4}, {1, 0});
712 C(Bca32b, {1, 2, 0}, {32}, {1});
713 C(BcA32b2a, {1, 2, 0}, {32, 2}, {1, 0});
714 C(BcA32b4a, {1, 2, 0}, {32, 4}, {1, 0});
715 C(Bca48b, {1, 2, 0}, {48}, {1});
716 C(BcA48b2a, {1, 2, 0}, {48, 2}, {1, 0});
717 C(BcA48b4a, {1, 2, 0}, {48, 4}, {1, 0});
718 C(Bca64b, {1, 2, 0}, {64}, {1});
719 C(BcA64b2a, {1, 2, 0}, {64, 2}, {1, 0});
720 C(BcA64b4a, {1, 2, 0}, {64, 4}, {1, 0});
721 C(aCdb32c, {0, 2, 3, 1}, {32}, {2});
722 C(aCdB32c2b, {0, 2, 3, 1}, {32, 2}, {2, 1});
723 C(aCdB32c4b, {0, 2, 3, 1}, {32, 4}, {2, 1});
724 C(aCdb48c, {0, 2, 3, 1}, {48}, {2});
725 C(aCdB48c2b, {0, 2, 3, 1}, {48, 2}, {2, 1});
726 C(aCdB48c4b, {0, 2, 3, 1}, {48, 4}, {2, 1});
727 C(aCdb64c, {0, 2, 3, 1}, {64}, {2});
728 C(aCdB64c2b, {0, 2, 3, 1}, {64, 2}, {2, 1});
729 C(aCdB64c4b, {0, 2, 3, 1}, {64, 4}, {2, 1});
730 C(BcA16a16b2a, {1, 2, 0}, {16, 16, 2}, {0, 1, 0});
731 C(BcA16a16b4a, {1, 2, 0}, {16, 16, 4}, {0, 1, 0});
732 C(BcdA16a16b2a, {1, 2, 3, 0}, {16, 16, 2}, {0, 1, 0});
733 C(BcdA16a16b4a, {1, 2, 3, 0}, {16, 16, 4}, {0, 1, 0});
734 C(BcdeA16a16b2a, {1, 2, 3, 4, 0}, {16, 16, 2}, {0, 1, 0});
735 C(BcdeA16a16b4a, {1, 2, 3, 4, 0}, {16, 16, 4}, {0, 1, 0});
736 C(aCdB16b16c2b, {0, 2, 3, 1}, {16, 16, 2}, {1, 2, 1});
737 C(aCdB16b16c4b, {0, 2, 3, 1}, {16, 16, 4}, {1, 2, 1});
738 C(aCdeB16b16c2b, {0, 2, 3, 4, 1}, {16, 16, 2}, {1, 2, 1});
739 C(aCdeB16b16c4b, {0, 2, 3, 4, 1}, {16, 16, 4}, {1, 2, 1});
740 C(aCdefB16b16c2b, {0, 2, 3, 4, 5, 1}, {16, 16, 2}, {1, 2, 1});
741 C(aCdefB16b16c4b, {0, 2, 3, 4, 5, 1}, {16, 16, 4}, {1, 2, 1});
742 C(BcA16a32b2a, {1, 2, 0}, {16, 32, 2}, {0, 1, 0});
743 C(BcA16a32b4a, {1, 2, 0}, {16, 32, 4}, {0, 1, 0});
744 C(BcA16a48b2a, {1, 2, 0}, {16, 48, 2}, {0, 1, 0});
745 C(BcA16a48b4a, {1, 2, 0}, {16, 48, 4}, {0, 1, 0});
746 C(BcA16a64b2a, {1, 2, 0}, {16, 64, 2}, {0, 1, 0});
747 C(BcA16a64b4a, {1, 2, 0}, {16, 64, 4}, {0, 1, 0});
748 C(aCdB16b32c2b, {0, 2, 3, 1}, {16, 32, 2}, {1, 2, 1});
749 C(aCdB16b32c4b, {0, 2, 3, 1}, {16, 32, 4}, {1, 2, 1});
750 C(aCdB16b48c2b, {0, 2, 3, 1}, {16, 48, 2}, {1, 2, 1});
751 C(aCdB16b48c4b, {0, 2, 3, 1}, {16, 48, 4}, {1, 2, 1});
752 C(aCdB16b64c2b, {0, 2, 3, 1}, {16, 64, 2}, {1, 2, 1});
753 C(aCdB16b64c4b, {0, 2, 3, 1}, {16, 64, 4}, {1, 2, 1});
754 C(BcdA16a32b2a, {1, 2, 3, 0}, {16, 32, 2}, {0, 1, 0});
755 C(BcdA16a32b4a, {1, 2, 3, 0}, {16, 32, 4}, {0, 1, 0});
756 C(BcdA16a48b2a, {1, 2, 3, 0}, {16, 48, 2}, {0, 1, 0});
757 C(BcdA16a48b4a, {1, 2, 3, 0}, {16, 48, 4}, {0, 1, 0});
758 C(BcdA16a64b2a, {1, 2, 3, 0}, {16, 64, 2}, {0, 1, 0});
759 C(BcdA16a64b4a, {1, 2, 3, 0}, {16, 64, 4}, {0, 1, 0});
760 C(aCdeB16b32c2b, {0, 2, 3, 4, 1}, {16, 32, 2}, {1, 2, 1});
761 C(aCdeB16b32c4b, {0, 2, 3, 4, 1}, {16, 32, 4}, {1, 2, 1});
762 C(aCdeB16b48c2b, {0, 2, 3, 4, 1}, {16, 48, 2}, {1, 2, 1});
763 C(aCdeB16b48c4b, {0, 2, 3, 4, 1}, {16, 48, 4}, {1, 2, 1});
764 C(aCdeB16b64c2b, {0, 2, 3, 4, 1}, {16, 64, 2}, {1, 2, 1});
765 C(aCdeB16b64c4b, {0, 2, 3, 4, 1}, {16, 64, 4}, {1, 2, 1});
766 C(Bca16b, {1, 2, 0}, {16}, {1});
767 C(BcA16b2a, {1, 2, 0}, {16, 2}, {1, 0});
768 C(BcA16b4a, {1, 2, 0}, {16, 4}, {1, 0});
769 C(Bcda16b, {1, 2, 3, 0}, {16}, {1});
770 C(BcdA16b2a, {1, 2, 3, 0}, {16, 2}, {1, 0});
771 C(BcdA16b4a, {1, 2, 3, 0}, {16, 4}, {1, 0});
772 C(Bcdea16b, {1, 2, 3, 4, 0}, {16}, {1});
773 C(BcdeA16b2a, {1, 2, 3, 4, 0}, {16, 2}, {1, 0});
774 C(BcdeA16b4a, {1, 2, 3, 4, 0}, {16, 4}, {1, 0});
775 C(aCdb16c, {0, 2, 3, 1}, {16}, {2});
776 C(aCdB16c2b, {0, 2, 3, 1}, {16, 2}, {2, 1});
777 C(aCdB16c4b, {0, 2, 3, 1}, {16, 4}, {2, 1});
778 C(aCdeb16c, {0, 2, 3, 4, 1}, {16}, {2});
779 C(aCdeB16c2b, {0, 2, 3, 4, 1}, {16, 2}, {2, 1});
780 C(aCdeB16c4b, {0, 2, 3, 4, 1}, {16, 4}, {2, 1});
781 C(aCdefb16c, {0, 2, 3, 4, 5, 1}, {16}, {2});
782 C(aCdefB16c2b, {0, 2, 3, 4, 5, 1}, {16, 2}, {2, 1});
783 C(aCdefB16c4b, {0, 2, 3, 4, 5, 1}, {16, 4}, {2, 1});
784 C(Bcda32b, {1, 2, 3, 0}, {32}, {1});
785 C(BcdA32b2a, {1, 2, 3, 0}, {32, 2}, {1, 0});
786 C(BcdA32b4a, {1, 2, 3, 0}, {32, 4}, {1, 0});
787 C(Bcda48b, {1, 2, 3, 0}, {48}, {1});
788 C(BcdA48b2a, {1, 2, 3, 0}, {48, 2}, {1, 0});
789 C(BcdA48b4a, {1, 2, 3, 0}, {48, 4}, {1, 0});
790 C(Bcda64b, {1, 2, 3, 0}, {64}, {1});
791 C(BcdA64b2a, {1, 2, 3, 0}, {64, 2}, {1, 0});
792 C(BcdA64b4a, {1, 2, 3, 0}, {64, 4}, {1, 0});
793 C(aCdeb32c, {0, 2, 3, 4, 1}, {32}, {2});
794 C(aCdeB32c2b, {0, 2, 3, 4, 1}, {32, 2}, {2, 1});
795 C(aCdeB32c4b, {0, 2, 3, 4, 1}, {32, 4}, {2, 1});
796 C(aCdeb48c, {0, 2, 3, 4, 1}, {48}, {2});
797 C(aCdeB48c2b, {0, 2, 3, 4, 1}, {48, 2}, {2, 1});
798 C(aCdeB48c4b, {0, 2, 3, 4, 1}, {48, 4}, {2, 1});
799 C(aCdeb64c, {0, 2, 3, 4, 1}, {64}, {2});
800 C(aCdeB64c2b, {0, 2, 3, 4, 1}, {64, 2}, {2, 1});
801 C(aCdeB64c4b, {0, 2, 3, 4, 1}, {64, 4}, {2, 1});
802
803 default: break;
804 }
805
806#undef C
807
808 return status::invalid_arguments;
809}
810
811} // namespace impl
812} // namespace dnnl
813
814// vim: et ts=4 sw=4 cindent cino+=l0,\:4,N-s
815