aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-11-02 18:44:52 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2023-11-02 18:44:52 +0100
commita2b8556e3cdc59bbb4a89c2779d2094db975eaa5 (patch)
tree8d212d7e4a08113e5acaa288190d9931a114f06c
parentf034efca545cd215e878f525310910b27db24f36 (diff)
downloadnissy-core-a2b8556e3cdc59bbb4a89c2779d2094db975eaa5.tar.gz
nissy-core-a2b8556e3cdc59bbb4a89c2779d2094db975eaa5.zip
Added transformations for avx2
Diffstat (limited to '')
-rw-r--r--README.md2
-rw-r--r--src/_trans_avx2.c999
-rw-r--r--src/cube.c6
-rwxr-xr-xutils/gentranscode.sh25
-rw-r--r--utils/h48_to_avx.c19
5 files changed, 1035 insertions, 16 deletions
diff --git a/README.md b/README.md
index db0edb6..a0d2ae2 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ $ make test
15 15
16### Make AVX2 work 16### Make AVX2 work
17 17
18* generate moves and transformations with scripts in utils/ 18* inline moves for avx2
19* fix base get_ and set_ macros (constant arguments?) 19* fix base get_ and set_ macros (constant arguments?)
20* optimize things that use get_ and set_ 20* optimize things that use get_ and set_
21 21
diff --git a/src/_trans_avx2.c b/src/_trans_avx2.c
index e69de29..29ee942 100644
--- a/src/_trans_avx2.c
+++ b/src/_trans_avx2.c
@@ -0,0 +1,999 @@
1static inline cube_t
2flipallcorners(cube_t c)
3{
4 cube_t shleft, shright, summed, newco, cleanco, ret;
5
6 shleft = _mm256_slli_si256(c, 1);
7 shright = _mm256_srli_si256(c, 1);
8 summed = _mm256_or_si256(shleft, shright);
9 newco = _mm256_and_si256(summed, _co_avx2);
10 cleanco = _mm256_andnot_si256_(c, _co_avx2);
11 ret = _mm256_and_si256(cleanco, newco);
12
13 return ret;
14}
15
16static inline cube_t
17inline_trans_UFr(cube_t c)
18{
19 cube_t ret;
20
21 cube_t tn = _mm256_set_epi8(
22 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
23 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0
24 );
25 cube_t ti = _mm256_set_epi8(
26 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
27 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0
28 );
29
30 ret = compose(tn, c);
31 ret = compose(ret, ti);
32
33 return ret;
34}
35
36static inline cube_t
37inline_trans_ULr(cube_t c)
38{
39 cube_t ret;
40
41 cube_t tn = _mm256_set_epi8(
42 0, 0, 0, 0, 24, 27, 26, 25, 3, 2, 1, 0, 6, 7, 4, 5,
43 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 6, 7, 5, 4
44 );
45 cube_t ti = _mm256_set_epi8(
46 0, 0, 0, 0, 26, 25, 24, 27, 2, 3, 0, 1, 7, 6, 5, 4,
47 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 1, 0, 7, 6, 4, 5
48 );
49
50 ret = compose(tn, c);
51 ret = compose(ret, ti);
52
53 return ret;
54}
55
56static inline cube_t
57inline_trans_UBr(cube_t c)
58{
59 cube_t ret;
60
61 cube_t tn = _mm256_set_epi8(
62 0, 0, 0, 0, 9, 8, 11, 10, 6, 7, 4, 5, 2, 3, 0, 1,
63 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 4, 5, 2, 3, 0, 1
64 );
65 cube_t ti = _mm256_set_epi8(
66 0, 0, 0, 0, 9, 8, 11, 10, 6, 7, 4, 5, 2, 3, 0, 1,
67 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 4, 5, 2, 3, 0, 1
68 );
69
70 ret = compose(tn, c);
71 ret = compose(ret, ti);
72
73 return ret;
74}
75
76static inline cube_t
77inline_trans_URr(cube_t c)
78{
79 cube_t ret;
80
81 cube_t tn = _mm256_set_epi8(
82 0, 0, 0, 0, 26, 25, 24, 27, 2, 3, 0, 1, 7, 6, 5, 4,
83 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 1, 0, 7, 6, 4, 5
84 );
85 cube_t ti = _mm256_set_epi8(
86 0, 0, 0, 0, 24, 27, 26, 25, 3, 2, 1, 0, 6, 7, 4, 5,
87 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 6, 7, 5, 4
88 );
89
90 ret = compose(tn, c);
91 ret = compose(ret, ti);
92
93 return ret;
94}
95
96static inline cube_t
97inline_trans_DFr(cube_t c)
98{
99 cube_t ret;
100
101 cube_t tn = _mm256_set_epi8(
102 0, 0, 0, 0, 10, 11, 8, 9, 5, 4, 7, 6, 0, 1, 2, 3,
103 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 7, 6, 1, 0, 3, 2
104 );
105 cube_t ti = _mm256_set_epi8(
106 0, 0, 0, 0, 10, 11, 8, 9, 5, 4, 7, 6, 0, 1, 2, 3,
107 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 7, 6, 1, 0, 3, 2
108 );
109
110 ret = compose(tn, c);
111 ret = compose(ret, ti);
112
113 return ret;
114}
115
116static inline cube_t
117inline_trans_DLr(cube_t c)
118{
119 cube_t ret;
120
121 cube_t tn = _mm256_set_epi8(
122 0, 0, 0, 0, 27, 24, 25, 26, 1, 0, 3, 2, 5, 4, 7, 6,
123 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 2, 5, 4, 6, 7
124 );
125 cube_t ti = _mm256_set_epi8(
126 0, 0, 0, 0, 27, 24, 25, 26, 1, 0, 3, 2, 5, 4, 7, 6,
127 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 2, 5, 4, 6, 7
128 );
129
130 ret = compose(tn, c);
131 ret = compose(ret, ti);
132
133 return ret;
134}
135
136static inline cube_t
137inline_trans_DBr(cube_t c)
138{
139 cube_t ret;
140
141 cube_t tn = _mm256_set_epi8(
142 0, 0, 0, 0, 8, 9, 10, 11, 4, 5, 6, 7, 1, 0, 3, 2,
143 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 0, 1, 2, 3
144 );
145 cube_t ti = _mm256_set_epi8(
146 0, 0, 0, 0, 8, 9, 10, 11, 4, 5, 6, 7, 1, 0, 3, 2,
147 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 0, 1, 2, 3
148 );
149
150 ret = compose(tn, c);
151 ret = compose(ret, ti);
152
153 return ret;
154}
155
156static inline cube_t
157inline_trans_DRr(cube_t c)
158{
159 cube_t ret;
160
161 cube_t tn = _mm256_set_epi8(
162 0, 0, 0, 0, 25, 26, 27, 24, 0, 1, 2, 3, 4, 5, 6, 7,
163 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 7, 6
164 );
165 cube_t ti = _mm256_set_epi8(
166 0, 0, 0, 0, 25, 26, 27, 24, 0, 1, 2, 3, 4, 5, 6, 7,
167 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 7, 6
168 );
169
170 ret = compose(tn, c);
171 ret = compose(ret, ti);
172
173 return ret;
174}
175
176static inline cube_t
177inline_trans_RUr(cube_t c)
178{
179 cube_t ret;
180
181 cube_t tn = _mm256_set_epi8(
182 0, 0, 0, 0, 3, 2, 1, 0, 25, 26, 27, 24, 21, 22, 23, 20,
183 0, 0, 0, 0, 0, 0, 0, 0, 39, 36, 38, 37, 66, 65, 67, 64
184 );
185 cube_t ti = _mm256_set_epi8(
186 0, 0, 0, 0, 21, 22, 23, 20, 17, 18, 19, 16, 11, 10, 9, 8,
187 0, 0, 0, 0, 0, 0, 0, 0, 71, 69, 68, 70, 33, 35, 34, 32
188 );
189
190 ret = compose(tn, c);
191 ret = compose(ret, ti);
192
193 return ret;
194}
195
196static inline cube_t
197inline_trans_RFr(cube_t c)
198{
199 cube_t ret;
200
201 cube_t tn = _mm256_set_epi8(
202 0, 0, 0, 0, 18, 17, 16, 19, 22, 21, 20, 23, 25, 26, 27, 24,
203 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 64, 39, 36, 37, 38
204 );
205 cube_t ti = _mm256_set_epi8(
206 0, 0, 0, 0, 17, 18, 19, 16, 20, 23, 22, 21, 24, 27, 26, 25,
207 0, 0, 0, 0, 0, 0, 0, 0, 67, 64, 65, 66, 37, 38, 39, 36
208 );
209
210 ret = compose(tn, c);
211 ret = compose(ret, ti);
212
213 return ret;
214}
215
216static inline cube_t
217inline_trans_RDr(cube_t c)
218{
219 cube_t ret;
220
221 cube_t tn = _mm256_set_epi8(
222 0, 0, 0, 0, 1, 0, 3, 2, 26, 25, 24, 27, 22, 21, 20, 23,
223 0, 0, 0, 0, 0, 0, 0, 0, 36, 39, 37, 38, 65, 66, 64, 67
224 );
225 cube_t ti = _mm256_set_epi8(
226 0, 0, 0, 0, 20, 23, 22, 21, 16, 19, 18, 17, 9, 8, 11, 10,
227 0, 0, 0, 0, 0, 0, 0, 0, 70, 68, 69, 71, 32, 34, 35, 33
228 );
229
230 ret = compose(tn, c);
231 ret = compose(ret, ti);
232
233 return ret;
234}
235
236static inline cube_t
237inline_trans_RBr(cube_t c)
238{
239 cube_t ret;
240
241 cube_t tn = _mm256_set_epi8(
242 0, 0, 0, 0, 16, 19, 18, 17, 21, 22, 23, 20, 26, 25, 24, 27,
243 0, 0, 0, 0, 0, 0, 0, 0, 66, 65, 64, 67, 36, 39, 38, 37
244 );
245 cube_t ti = _mm256_set_epi8(
246 0, 0, 0, 0, 16, 19, 18, 17, 21, 22, 23, 20, 26, 25, 24, 27,
247 0, 0, 0, 0, 0, 0, 0, 0, 66, 65, 64, 67, 36, 39, 38, 37
248 );
249
250 ret = compose(tn, c);
251 ret = compose(ret, ti);
252
253 return ret;
254}
255
256static inline cube_t
257inline_trans_LUr(cube_t c)
258{
259 cube_t ret;
260
261 cube_t tn = _mm256_set_epi8(
262 0, 0, 0, 0, 2, 3, 0, 1, 27, 24, 25, 26, 20, 23, 22, 21,
263 0, 0, 0, 0, 0, 0, 0, 0, 38, 37, 39, 36, 67, 64, 66, 65
264 );
265 cube_t ti = _mm256_set_epi8(
266 0, 0, 0, 0, 23, 20, 21, 22, 18, 17, 16, 19, 10, 11, 8, 9,
267 0, 0, 0, 0, 0, 0, 0, 0, 69, 71, 70, 68, 35, 33, 32, 34
268 );
269
270 ret = compose(tn, c);
271 ret = compose(ret, ti);
272
273 return ret;
274}
275
276static inline cube_t
277inline_trans_LFr(cube_t c)
278{
279 cube_t ret;
280
281 cube_t tn = _mm256_set_epi8(
282 0, 0, 0, 0, 17, 18, 19, 16, 20, 23, 22, 21, 24, 27, 26, 25,
283 0, 0, 0, 0, 0, 0, 0, 0, 67, 64, 65, 66, 37, 38, 39, 36
284 );
285 cube_t ti = _mm256_set_epi8(
286 0, 0, 0, 0, 18, 17, 16, 19, 22, 21, 20, 23, 25, 26, 27, 24,
287 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 64, 39, 36, 37, 38
288 );
289
290 ret = compose(tn, c);
291 ret = compose(ret, ti);
292
293 return ret;
294}
295
296static inline cube_t
297inline_trans_LDr(cube_t c)
298{
299 cube_t ret;
300
301 cube_t tn = _mm256_set_epi8(
302 0, 0, 0, 0, 0, 1, 2, 3, 24, 27, 26, 25, 23, 20, 21, 22,
303 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 36, 39, 64, 67, 65, 66
304 );
305 cube_t ti = _mm256_set_epi8(
306 0, 0, 0, 0, 22, 21, 20, 23, 19, 16, 17, 18, 8, 9, 10, 11,
307 0, 0, 0, 0, 0, 0, 0, 0, 68, 70, 71, 69, 34, 32, 33, 35
308 );
309
310 ret = compose(tn, c);
311 ret = compose(ret, ti);
312
313 return ret;
314}
315
316static inline cube_t
317inline_trans_LBr(cube_t c)
318{
319 cube_t ret;
320
321 cube_t tn = _mm256_set_epi8(
322 0, 0, 0, 0, 19, 16, 17, 18, 23, 20, 21, 22, 27, 24, 25, 26,
323 0, 0, 0, 0, 0, 0, 0, 0, 64, 67, 66, 65, 38, 37, 36, 39
324 );
325 cube_t ti = _mm256_set_epi8(
326 0, 0, 0, 0, 19, 16, 17, 18, 23, 20, 21, 22, 27, 24, 25, 26,
327 0, 0, 0, 0, 0, 0, 0, 0, 64, 67, 66, 65, 38, 37, 36, 39
328 );
329
330 ret = compose(tn, c);
331 ret = compose(ret, ti);
332
333 return ret;
334}
335
336static inline cube_t
337inline_trans_FUr(cube_t c)
338{
339 cube_t ret;
340
341 cube_t tn = _mm256_set_epi8(
342 0, 0, 0, 0, 6, 7, 4, 5, 10, 11, 8, 9, 17, 18, 19, 16,
343 0, 0, 0, 0, 0, 0, 0, 0, 35, 33, 34, 32, 71, 69, 70, 68
344 );
345 cube_t ti = _mm256_set_epi8(
346 0, 0, 0, 0, 6, 7, 4, 5, 10, 11, 8, 9, 17, 18, 19, 16,
347 0, 0, 0, 0, 0, 0, 0, 0, 35, 33, 34, 32, 71, 69, 70, 68
348 );
349
350 ret = compose(tn, c);
351 ret = compose(ret, ti);
352
353 return ret;
354}
355
356static inline cube_t
357inline_trans_FRr(cube_t c)
358{
359 cube_t ret;
360
361 cube_t tn = _mm256_set_epi8(
362 0, 0, 0, 0, 21, 22, 23, 20, 17, 18, 19, 16, 11, 10, 9, 8,
363 0, 0, 0, 0, 0, 0, 0, 0, 71, 69, 68, 70, 33, 35, 34, 32
364 );
365 cube_t ti = _mm256_set_epi8(
366 0, 0, 0, 0, 3, 2, 1, 0, 25, 26, 27, 24, 21, 22, 23, 20,
367 0, 0, 0, 0, 0, 0, 0, 0, 39, 36, 38, 37, 66, 65, 67, 64
368 );
369
370 ret = compose(tn, c);
371 ret = compose(ret, ti);
372
373 return ret;
374}
375
376static inline cube_t
377inline_trans_FDr(cube_t c)
378{
379 cube_t ret;
380
381 cube_t tn = _mm256_set_epi8(
382 0, 0, 0, 0, 4, 5, 6, 7, 11, 10, 9, 8, 18, 17, 16, 19,
383 0, 0, 0, 0, 0, 0, 0, 0, 33, 35, 32, 34, 69, 71, 68, 70
384 );
385 cube_t ti = _mm256_set_epi8(
386 0, 0, 0, 0, 7, 6, 5, 4, 8, 9, 10, 11, 16, 19, 18, 17,
387 0, 0, 0, 0, 0, 0, 0, 0, 34, 32, 35, 33, 70, 68, 71, 69
388 );
389
390 ret = compose(tn, c);
391 ret = compose(ret, ti);
392
393 return ret;
394}
395
396static inline cube_t
397inline_trans_FLr(cube_t c)
398{
399 cube_t ret;
400
401 cube_t tn = _mm256_set_epi8(
402 0, 0, 0, 0, 23, 20, 21, 22, 18, 17, 16, 19, 10, 11, 8, 9,
403 0, 0, 0, 0, 0, 0, 0, 0, 69, 71, 70, 68, 35, 33, 32, 34
404 );
405 cube_t ti = _mm256_set_epi8(
406 0, 0, 0, 0, 2, 3, 0, 1, 27, 24, 25, 26, 20, 23, 22, 21,
407 0, 0, 0, 0, 0, 0, 0, 0, 38, 37, 39, 36, 67, 64, 66, 65
408 );
409
410 ret = compose(tn, c);
411 ret = compose(ret, ti);
412
413 return ret;
414}
415
416static inline cube_t
417inline_trans_BUr(cube_t c)
418{
419 cube_t ret;
420
421 cube_t tn = _mm256_set_epi8(
422 0, 0, 0, 0, 7, 6, 5, 4, 8, 9, 10, 11, 16, 19, 18, 17,
423 0, 0, 0, 0, 0, 0, 0, 0, 34, 32, 35, 33, 70, 68, 71, 69
424 );
425 cube_t ti = _mm256_set_epi8(
426 0, 0, 0, 0, 4, 5, 6, 7, 11, 10, 9, 8, 18, 17, 16, 19,
427 0, 0, 0, 0, 0, 0, 0, 0, 33, 35, 32, 34, 69, 71, 68, 70
428 );
429
430 ret = compose(tn, c);
431 ret = compose(ret, ti);
432
433 return ret;
434}
435
436static inline cube_t
437inline_trans_BRr(cube_t c)
438{
439 cube_t ret;
440
441 cube_t tn = _mm256_set_epi8(
442 0, 0, 0, 0, 22, 21, 20, 23, 19, 16, 17, 18, 8, 9, 10, 11,
443 0, 0, 0, 0, 0, 0, 0, 0, 68, 70, 71, 69, 34, 32, 33, 35
444 );
445 cube_t ti = _mm256_set_epi8(
446 0, 0, 0, 0, 0, 1, 2, 3, 24, 27, 26, 25, 23, 20, 21, 22,
447 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 36, 39, 64, 67, 65, 66
448 );
449
450 ret = compose(tn, c);
451 ret = compose(ret, ti);
452
453 return ret;
454}
455
456static inline cube_t
457inline_trans_BDr(cube_t c)
458{
459 cube_t ret;
460
461 cube_t tn = _mm256_set_epi8(
462 0, 0, 0, 0, 5, 4, 7, 6, 9, 8, 11, 10, 19, 16, 17, 18,
463 0, 0, 0, 0, 0, 0, 0, 0, 32, 34, 33, 35, 68, 70, 69, 71
464 );
465 cube_t ti = _mm256_set_epi8(
466 0, 0, 0, 0, 5, 4, 7, 6, 9, 8, 11, 10, 19, 16, 17, 18,
467 0, 0, 0, 0, 0, 0, 0, 0, 32, 34, 33, 35, 68, 70, 69, 71
468 );
469
470 ret = compose(tn, c);
471 ret = compose(ret, ti);
472
473 return ret;
474}
475
476static inline cube_t
477inline_trans_BLr(cube_t c)
478{
479 cube_t ret;
480
481 cube_t tn = _mm256_set_epi8(
482 0, 0, 0, 0, 20, 23, 22, 21, 16, 19, 18, 17, 9, 8, 11, 10,
483 0, 0, 0, 0, 0, 0, 0, 0, 70, 68, 69, 71, 32, 34, 35, 33
484 );
485 cube_t ti = _mm256_set_epi8(
486 0, 0, 0, 0, 1, 0, 3, 2, 26, 25, 24, 27, 22, 21, 20, 23,
487 0, 0, 0, 0, 0, 0, 0, 0, 36, 39, 37, 38, 65, 66, 64, 67
488 );
489
490 ret = compose(tn, c);
491 ret = compose(ret, ti);
492
493 return ret;
494}
495
496static inline cube_t
497inline_trans_UFm(cube_t c)
498{
499 cube_t ret;
500
501 cube_t tn = _mm256_set_epi8(
502 0, 0, 0, 0, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0,
503 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 7, 6, 5, 4
504 );
505 cube_t ti = _mm256_set_epi8(
506 0, 0, 0, 0, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0,
507 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 7, 6, 5, 4
508 );
509
510 ret = compose(tn, c);
511 ret = compose(ret, ti);
512 ret = flipallcorners(ret);
513
514 return ret;
515}
516
517static inline cube_t
518inline_trans_ULm(cube_t c)
519{
520 cube_t ret;
521
522 cube_t tn = _mm256_set_epi8(
523 0, 0, 0, 0, 25, 26, 27, 24, 3, 2, 1, 0, 7, 6, 5, 4,
524 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 4, 5, 2, 3, 1, 0
525 );
526 cube_t ti = _mm256_set_epi8(
527 0, 0, 0, 0, 25, 26, 27, 24, 3, 2, 1, 0, 7, 6, 5, 4,
528 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 4, 5, 2, 3, 1, 0
529 );
530
531 ret = compose(tn, c);
532 ret = compose(ret, ti);
533 ret = flipallcorners(ret);
534
535 return ret;
536}
537
538static inline cube_t
539inline_trans_UBm(cube_t c)
540{
541 cube_t ret;
542
543 cube_t tn = _mm256_set_epi8(
544 0, 0, 0, 0, 8, 9, 10, 11, 7, 6, 5, 4, 2, 3, 0, 1,
545 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 1, 6, 7, 4, 5
546 );
547 cube_t ti = _mm256_set_epi8(
548 0, 0, 0, 0, 8, 9, 10, 11, 7, 6, 5, 4, 2, 3, 0, 1,
549 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 1, 6, 7, 4, 5
550 );
551
552 ret = compose(tn, c);
553 ret = compose(ret, ti);
554 ret = flipallcorners(ret);
555
556 return ret;
557}
558
559static inline cube_t
560inline_trans_URm(cube_t c)
561{
562 cube_t ret;
563
564 cube_t tn = _mm256_set_epi8(
565 0, 0, 0, 0, 27, 24, 25, 26, 2, 3, 0, 1, 6, 7, 4, 5,
566 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 5, 4, 3, 2, 0, 1
567 );
568 cube_t ti = _mm256_set_epi8(
569 0, 0, 0, 0, 27, 24, 25, 26, 2, 3, 0, 1, 6, 7, 4, 5,
570 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 5, 4, 3, 2, 0, 1
571 );
572
573 ret = compose(tn, c);
574 ret = compose(ret, ti);
575 ret = flipallcorners(ret);
576
577 return ret;
578}
579
580static inline cube_t
581inline_trans_DFm(cube_t c)
582{
583 cube_t ret;
584
585 cube_t tn = _mm256_set_epi8(
586 0, 0, 0, 0, 11, 10, 9, 8, 4, 5, 6, 7, 0, 1, 2, 3,
587 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 5, 4, 7, 6
588 );
589 cube_t ti = _mm256_set_epi8(
590 0, 0, 0, 0, 11, 10, 9, 8, 4, 5, 6, 7, 0, 1, 2, 3,
591 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 5, 4, 7, 6
592 );
593
594 ret = compose(tn, c);
595 ret = compose(ret, ti);
596 ret = flipallcorners(ret);
597
598 return ret;
599}
600
601static inline cube_t
602inline_trans_DLm(cube_t c)
603{
604 cube_t ret;
605
606 cube_t tn = _mm256_set_epi8(
607 0, 0, 0, 0, 26, 25, 24, 27, 1, 0, 3, 2, 4, 5, 6, 7,
608 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 7, 6, 1, 0, 2, 3
609 );
610 cube_t ti = _mm256_set_epi8(
611 0, 0, 0, 0, 24, 27, 26, 25, 0, 1, 2, 3, 5, 4, 7, 6,
612 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 6, 7, 0, 1, 3, 2
613 );
614
615 ret = compose(tn, c);
616 ret = compose(ret, ti);
617 ret = flipallcorners(ret);
618
619 return ret;
620}
621
622static inline cube_t
623inline_trans_DBm(cube_t c)
624{
625 cube_t ret;
626
627 cube_t tn = _mm256_set_epi8(
628 0, 0, 0, 0, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2,
629 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7
630 );
631 cube_t ti = _mm256_set_epi8(
632 0, 0, 0, 0, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2,
633 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7
634 );
635
636 ret = compose(tn, c);
637 ret = compose(ret, ti);
638 ret = flipallcorners(ret);
639
640 return ret;
641}
642
643static inline cube_t
644inline_trans_DRm(cube_t c)
645{
646 cube_t ret;
647
648 cube_t tn = _mm256_set_epi8(
649 0, 0, 0, 0, 24, 27, 26, 25, 0, 1, 2, 3, 5, 4, 7, 6,
650 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 6, 7, 0, 1, 3, 2
651 );
652 cube_t ti = _mm256_set_epi8(
653 0, 0, 0, 0, 26, 25, 24, 27, 1, 0, 3, 2, 4, 5, 6, 7,
654 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 7, 6, 1, 0, 2, 3
655 );
656
657 ret = compose(tn, c);
658 ret = compose(ret, ti);
659 ret = flipallcorners(ret);
660
661 return ret;
662}
663
664static inline cube_t
665inline_trans_RUm(cube_t c)
666{
667 cube_t ret;
668
669 cube_t tn = _mm256_set_epi8(
670 0, 0, 0, 0, 3, 2, 1, 0, 24, 27, 26, 25, 20, 23, 22, 21,
671 0, 0, 0, 0, 0, 0, 0, 0, 35, 32, 34, 33, 70, 69, 71, 68
672 );
673 cube_t ti = _mm256_set_epi8(
674 0, 0, 0, 0, 22, 21, 20, 23, 18, 17, 16, 19, 11, 10, 9, 8,
675 0, 0, 0, 0, 0, 0, 0, 0, 33, 35, 34, 32, 71, 69, 68, 70
676 );
677
678 ret = compose(tn, c);
679 ret = compose(ret, ti);
680 ret = flipallcorners(ret);
681
682 return ret;
683}
684
685static inline cube_t
686inline_trans_RFm(cube_t c)
687{
688 cube_t ret;
689
690 cube_t tn = _mm256_set_epi8(
691 0, 0, 0, 0, 18, 17, 16, 19, 23, 20, 21, 22, 24, 27, 26, 25,
692 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 68, 35, 32, 33, 34
693 );
694 cube_t ti = _mm256_set_epi8(
695 0, 0, 0, 0, 18, 17, 16, 19, 23, 20, 21, 22, 24, 27, 26, 25,
696 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, 36, 67, 64, 65, 66
697 );
698
699 ret = compose(tn, c);
700 ret = compose(ret, ti);
701 ret = flipallcorners(ret);
702
703 return ret;
704}
705
706static inline cube_t
707inline_trans_RDm(cube_t c)
708{
709 cube_t ret;
710
711 cube_t tn = _mm256_set_epi8(
712 0, 0, 0, 0, 1, 0, 3, 2, 27, 24, 25, 26, 23, 20, 21, 22,
713 0, 0, 0, 0, 0, 0, 0, 0, 32, 35, 33, 34, 69, 70, 68, 71
714 );
715 cube_t ti = _mm256_set_epi8(
716 0, 0, 0, 0, 23, 20, 21, 22, 19, 16, 17, 18, 9, 8, 11, 10,
717 0, 0, 0, 0, 0, 0, 0, 0, 32, 34, 35, 33, 70, 68, 69, 71
718 );
719
720 ret = compose(tn, c);
721 ret = compose(ret, ti);
722 ret = flipallcorners(ret);
723
724 return ret;
725}
726
727static inline cube_t
728inline_trans_RBm(cube_t c)
729{
730 cube_t ret;
731
732 cube_t tn = _mm256_set_epi8(
733 0, 0, 0, 0, 16, 19, 18, 17, 20, 23, 22, 21, 27, 24, 25, 26,
734 0, 0, 0, 0, 0, 0, 0, 0, 70, 69, 68, 71, 32, 35, 34, 33
735 );
736 cube_t ti = _mm256_set_epi8(
737 0, 0, 0, 0, 19, 16, 17, 18, 22, 21, 20, 23, 26, 25, 24, 27,
738 0, 0, 0, 0, 0, 0, 0, 0, 36, 39, 38, 37, 66, 65, 64, 67
739 );
740
741 ret = compose(tn, c);
742 ret = compose(ret, ti);
743 ret = flipallcorners(ret);
744
745 return ret;
746}
747
748static inline cube_t
749inline_trans_LUm(cube_t c)
750{
751 cube_t ret;
752
753 cube_t tn = _mm256_set_epi8(
754 0, 0, 0, 0, 2, 3, 0, 1, 26, 25, 24, 27, 21, 22, 23, 20,
755 0, 0, 0, 0, 0, 0, 0, 0, 34, 33, 35, 32, 71, 68, 70, 69
756 );
757 cube_t ti = _mm256_set_epi8(
758 0, 0, 0, 0, 20, 23, 22, 21, 17, 18, 19, 16, 10, 11, 8, 9,
759 0, 0, 0, 0, 0, 0, 0, 0, 35, 33, 32, 34, 69, 71, 70, 68
760 );
761
762 ret = compose(tn, c);
763 ret = compose(ret, ti);
764 ret = flipallcorners(ret);
765
766 return ret;
767}
768
769static inline cube_t
770inline_trans_LFm(cube_t c)
771{
772 cube_t ret;
773
774 cube_t tn = _mm256_set_epi8(
775 0, 0, 0, 0, 17, 18, 19, 16, 21, 22, 23, 20, 25, 26, 27, 24,
776 0, 0, 0, 0, 0, 0, 0, 0, 71, 68, 69, 70, 33, 34, 35, 32
777 );
778 cube_t ti = _mm256_set_epi8(
779 0, 0, 0, 0, 17, 18, 19, 16, 21, 22, 23, 20, 25, 26, 27, 24,
780 0, 0, 0, 0, 0, 0, 0, 0, 39, 36, 37, 38, 65, 66, 67, 64
781 );
782
783 ret = compose(tn, c);
784 ret = compose(ret, ti);
785 ret = flipallcorners(ret);
786
787 return ret;
788}
789
790static inline cube_t
791inline_trans_LDm(cube_t c)
792{
793 cube_t ret;
794
795 cube_t tn = _mm256_set_epi8(
796 0, 0, 0, 0, 0, 1, 2, 3, 25, 26, 27, 24, 22, 21, 20, 23,
797 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 32, 35, 68, 71, 69, 70
798 );
799 cube_t ti = _mm256_set_epi8(
800 0, 0, 0, 0, 21, 22, 23, 20, 16, 19, 18, 17, 8, 9, 10, 11,
801 0, 0, 0, 0, 0, 0, 0, 0, 34, 32, 33, 35, 68, 70, 71, 69
802 );
803
804 ret = compose(tn, c);
805 ret = compose(ret, ti);
806 ret = flipallcorners(ret);
807
808 return ret;
809}
810
811static inline cube_t
812inline_trans_LBm(cube_t c)
813{
814 cube_t ret;
815
816 cube_t tn = _mm256_set_epi8(
817 0, 0, 0, 0, 19, 16, 17, 18, 22, 21, 20, 23, 26, 25, 24, 27,
818 0, 0, 0, 0, 0, 0, 0, 0, 68, 71, 70, 69, 34, 33, 32, 35
819 );
820 cube_t ti = _mm256_set_epi8(
821 0, 0, 0, 0, 16, 19, 18, 17, 20, 23, 22, 21, 27, 24, 25, 26,
822 0, 0, 0, 0, 0, 0, 0, 0, 38, 37, 36, 39, 64, 67, 66, 65
823 );
824
825 ret = compose(tn, c);
826 ret = compose(ret, ti);
827 ret = flipallcorners(ret);
828
829 return ret;
830}
831
832static inline cube_t
833inline_trans_FUm(cube_t c)
834{
835 cube_t ret;
836
837 cube_t tn = _mm256_set_epi8(
838 0, 0, 0, 0, 7, 6, 5, 4, 11, 10, 9, 8, 17, 18, 19, 16,
839 0, 0, 0, 0, 0, 0, 0, 0, 39, 37, 38, 36, 67, 65, 66, 64
840 );
841 cube_t ti = _mm256_set_epi8(
842 0, 0, 0, 0, 7, 6, 5, 4, 11, 10, 9, 8, 17, 18, 19, 16,
843 0, 0, 0, 0, 0, 0, 0, 0, 71, 69, 70, 68, 35, 33, 34, 32
844 );
845
846 ret = compose(tn, c);
847 ret = compose(ret, ti);
848 ret = flipallcorners(ret);
849
850 return ret;
851}
852
853static inline cube_t
854inline_trans_FRm(cube_t c)
855{
856 cube_t ret;
857
858 cube_t tn = _mm256_set_epi8(
859 0, 0, 0, 0, 20, 23, 22, 21, 17, 18, 19, 16, 10, 11, 8, 9,
860 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 64, 66, 37, 39, 38, 36
861 );
862 cube_t ti = _mm256_set_epi8(
863 0, 0, 0, 0, 2, 3, 0, 1, 26, 25, 24, 27, 21, 22, 23, 20,
864 0, 0, 0, 0, 0, 0, 0, 0, 66, 65, 67, 64, 39, 36, 38, 37
865 );
866
867 ret = compose(tn, c);
868 ret = compose(ret, ti);
869 ret = flipallcorners(ret);
870
871 return ret;
872}
873
874static inline cube_t
875inline_trans_FDm(cube_t c)
876{
877 cube_t ret;
878
879 cube_t tn = _mm256_set_epi8(
880 0, 0, 0, 0, 5, 4, 7, 6, 10, 11, 8, 9, 18, 17, 16, 19,
881 0, 0, 0, 0, 0, 0, 0, 0, 37, 39, 36, 38, 65, 67, 64, 66
882 );
883 cube_t ti = _mm256_set_epi8(
884 0, 0, 0, 0, 6, 7, 4, 5, 9, 8, 11, 10, 16, 19, 18, 17,
885 0, 0, 0, 0, 0, 0, 0, 0, 70, 68, 71, 69, 34, 32, 35, 33
886 );
887
888 ret = compose(tn, c);
889 ret = compose(ret, ti);
890 ret = flipallcorners(ret);
891
892 return ret;
893}
894
895static inline cube_t
896inline_trans_FLm(cube_t c)
897{
898 cube_t ret;
899
900 cube_t tn = _mm256_set_epi8(
901 0, 0, 0, 0, 22, 21, 20, 23, 18, 17, 16, 19, 11, 10, 9, 8,
902 0, 0, 0, 0, 0, 0, 0, 0, 65, 67, 66, 64, 39, 37, 36, 38
903 );
904 cube_t ti = _mm256_set_epi8(
905 0, 0, 0, 0, 3, 2, 1, 0, 24, 27, 26, 25, 20, 23, 22, 21,
906 0, 0, 0, 0, 0, 0, 0, 0, 67, 64, 66, 65, 38, 37, 39, 36
907 );
908
909 ret = compose(tn, c);
910 ret = compose(ret, ti);
911 ret = flipallcorners(ret);
912
913 return ret;
914}
915
916static inline cube_t
917inline_trans_BUm(cube_t c)
918{
919 cube_t ret;
920
921 cube_t tn = _mm256_set_epi8(
922 0, 0, 0, 0, 6, 7, 4, 5, 9, 8, 11, 10, 16, 19, 18, 17,
923 0, 0, 0, 0, 0, 0, 0, 0, 38, 36, 39, 37, 66, 64, 67, 65
924 );
925 cube_t ti = _mm256_set_epi8(
926 0, 0, 0, 0, 5, 4, 7, 6, 10, 11, 8, 9, 18, 17, 16, 19,
927 0, 0, 0, 0, 0, 0, 0, 0, 69, 71, 68, 70, 33, 35, 32, 34
928 );
929
930 ret = compose(tn, c);
931 ret = compose(ret, ti);
932 ret = flipallcorners(ret);
933
934 return ret;
935}
936
937static inline cube_t
938inline_trans_BRm(cube_t c)
939{
940 cube_t ret;
941
942 cube_t tn = _mm256_set_epi8(
943 0, 0, 0, 0, 23, 20, 21, 22, 19, 16, 17, 18, 9, 8, 11, 10,
944 0, 0, 0, 0, 0, 0, 0, 0, 64, 66, 67, 65, 38, 36, 37, 39
945 );
946 cube_t ti = _mm256_set_epi8(
947 0, 0, 0, 0, 1, 0, 3, 2, 27, 24, 25, 26, 23, 20, 21, 22,
948 0, 0, 0, 0, 0, 0, 0, 0, 64, 67, 65, 66, 37, 38, 36, 39
949 );
950
951 ret = compose(tn, c);
952 ret = compose(ret, ti);
953 ret = flipallcorners(ret);
954
955 return ret;
956}
957
958static inline cube_t
959inline_trans_BDm(cube_t c)
960{
961 cube_t ret;
962
963 cube_t tn = _mm256_set_epi8(
964 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 19, 16, 17, 18,
965 0, 0, 0, 0, 0, 0, 0, 0, 36, 38, 37, 39, 64, 66, 65, 67
966 );
967 cube_t ti = _mm256_set_epi8(
968 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 19, 16, 17, 18,
969 0, 0, 0, 0, 0, 0, 0, 0, 68, 70, 69, 71, 32, 34, 33, 35
970 );
971
972 ret = compose(tn, c);
973 ret = compose(ret, ti);
974 ret = flipallcorners(ret);
975
976 return ret;
977}
978
979static inline cube_t
980inline_trans_BLm(cube_t c)
981{
982 cube_t ret;
983
984 cube_t tn = _mm256_set_epi8(
985 0, 0, 0, 0, 21, 22, 23, 20, 16, 19, 18, 17, 8, 9, 10, 11,
986 0, 0, 0, 0, 0, 0, 0, 0, 66, 64, 65, 67, 36, 38, 39, 37
987 );
988 cube_t ti = _mm256_set_epi8(
989 0, 0, 0, 0, 0, 1, 2, 3, 25, 26, 27, 24, 22, 21, 20, 23,
990 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 64, 67, 36, 39, 37, 38
991 );
992
993 ret = compose(tn, c);
994 ret = compose(ret, ti);
995 ret = flipallcorners(ret);
996
997 return ret;
998}
999
diff --git a/src/cube.c b/src/cube.c
index 62ac6e3..6eb49f0 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -126,10 +126,12 @@ cube_arr_t zerocube_arr = { .e = {0}, .c = {0} };
126 126
127#ifdef CUBE_AVX2 127#ifdef CUBE_AVX2
128 128
129#define setsolved(cube) cube = _mm256_loadu_si256((__m256i_u *)&solvedcube_arr) 129#define _co_avx2 _mm256_set_epi64x(0, 0xF0F0F0F0F0F0F0F0, 0, 0)
130#define setzero(cube) cube = _mm256_setzero_si256() 130#define _eo_avx2 _mm256_set_epi64x(0, 0, 0xF0F0F0F0, 0xF0F0F0F0F0F0F0F0)
131#define _c _mm256_set_epi64x(0, 0, 0, 0xFF) 131#define _c _mm256_set_epi64x(0, 0, 0, 0xFF)
132#define _e _mm256_set_epi64x(0, 0xFF, 0, 0) 132#define _e _mm256_set_epi64x(0, 0xFF, 0, 0)
133#define setsolved(cube) cube = _mm256_loadu_si256((__m256i_u *)&solvedcube_arr)
134#define setzero(cube) cube = _mm256_setzero_si256()
133/* TODO: in the next 4 macros, all 0 should be i, but must be constant! */ 135/* TODO: in the next 4 macros, all 0 should be i, but must be constant! */
134#define get_edge(cube, i) _mm256_extract_epi8(cube, 0+16) 136#define get_edge(cube, i) _mm256_extract_epi8(cube, 0+16)
135#define get_corner(cube, i) _mm256_extract_epi8(cube, 0) 137#define get_corner(cube, i) _mm256_extract_epi8(cube, 0)
diff --git a/utils/gentranscode.sh b/utils/gentranscode.sh
index 63888c6..e874ad4 100755
--- a/utils/gentranscode.sh
+++ b/utils/gentranscode.sh
@@ -1,6 +1,8 @@
1#!/bin/sh 1#!/bin/sh
2 2
3gcc -DDEBUG h48_to_src.c ../src/cube.c -o h48_to_src 3type="${1:-src}"
4
5gcc -DDEBUG h48_to_"$type".c ../src/cube.c -o h48_to_"$type"
4gcc -DDEBUG invert.c ../src/cube.c -o invert 6gcc -DDEBUG invert.c ../src/cube.c -o invert
5 7
6# Old version 8# Old version
@@ -9,9 +11,9 @@ genarray() {
9 trans="$(echo $f | sed 's/.*_// ; s/\.txt//')" 11 trans="$(echo $f | sed 's/.*_// ; s/\.txt//')"
10 printf '[%s] = ' "$trans" 12 printf '[%s] = ' "$trans"
11 if [ "$1" = "-i" ]; then 13 if [ "$1" = "-i" ]; then
12 ./invert <"$f" | ./h48_to_src 14 ./invert <"$f" | ./h48_to_"$type"
13 else 15 else
14 ./h48_to_src <"$f" 16 ./h48_to_"$type" <"$f"
15 fi 17 fi
16 printf ',\n' 18 printf ',\n'
17 done 19 done
@@ -23,15 +25,12 @@ genfuncs() {
23 printf 'static inline cube_t\ninline_trans_%s' "$trans" 25 printf 'static inline cube_t\ninline_trans_%s' "$trans"
24 [ "$1" = "-i" ] && printf '_inverse' 26 [ "$1" = "-i" ] && printf '_inverse'
25 printf '(cube_t c)\n{\n' 27 printf '(cube_t c)\n{\n'
26 printf '\tcube_t ret;\n' 28 printf '\tcube_t ret;\n\n'
27 printf '\tcube_t tn = {\n' 29 printf '\tcube_t tn = '
28 ./h48_to_src <"$f" | sed 's/^/\t/' | \ 30 ./h48_to_"$type" <"$f" | sed '2,4s/^/\t/'
29 tail -n 3 | head -n 2 31 printf ';\n\tcube_t ti = '
30 printf '\t};\n\tcube_t ti = {\n' 32 ./invert <"$f" | ./h48_to_"$type" | sed '2,4 s/^/\t/'
31 ./invert <"$f" | ./h48_to_src | sed 's/^/\t/' | \ 33 printf ';\n\n\tret = compose(tn, c);\n'
32 tail -n 3 | head -n 2
33 printf '\t};\n\n'
34 printf '\tret = compose(tn, c);\n'
35 printf '\tret = compose(ret, ti);\n' 34 printf '\tret = compose(ret, ti);\n'
36 if [ -n "$(echo "$trans" | grep "m")" ]; then 35 if [ -n "$(echo "$trans" | grep "m")" ]; then
37 printf '\tret = flipallcorners(ret);\n' 36 printf '\tret = flipallcorners(ret);\n'
@@ -41,4 +40,4 @@ genfuncs() {
41} 40}
42 41
43genfuncs 42genfuncs
44rm -f h48_to_src invert 43rm -f h48_to_"$type" invert
diff --git a/utils/h48_to_avx.c b/utils/h48_to_avx.c
new file mode 100644
index 0000000..e1d8c2e
--- /dev/null
+++ b/utils/h48_to_avx.c
@@ -0,0 +1,19 @@
1#include <stdio.h>
2#include <inttypes.h>
3#include <stdbool.h>
4
5#include "../src/cube.h"
6
7#define STRLENMAX 1000
8
9int main() {
10 char str[STRLENMAX];
11 cube_t cube;
12
13 fgets(str, STRLENMAX, stdin);
14 cube = readcube(H48, str);
15 writecube(AVX, cube, str);
16 fputs(str, stdout);
17
18 return 0;
19}

Generated with cgit - Back to sebastiano.tronto.net