aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-11-02 22:17:14 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2023-11-02 22:17:14 +0100
commit9b1c9371333e20611ec5422e660ebec7e66c4261 (patch)
tree4d0d0dbb27056871ab7c81c2903899e4e639b566 /src
parenta61382e9dec22ea1ff3fea2d59d3c605c0aa2aac (diff)
downloadnissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.tar.gz
nissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.zip
Added avx2 moves
Diffstat (limited to '')
-rw-r--r--src/_moves_avx2.c199
-rw-r--r--src/cube.c49
2 files changed, 241 insertions, 7 deletions
diff --git a/src/_moves_avx2.c b/src/_moves_avx2.c
index d72f45f..0c1f6a3 100644
--- a/src/_moves_avx2.c
+++ b/src/_moves_avx2.c
@@ -1,2 +1,197 @@
1/* TODO: return compose(c, (some avx garbage)); 1static inline cube_t
2*/ 2inline_move_U(cube_t c)
3{
4 cube_t m = _mm256_set_epi8(
5 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 0, 1, 3, 2, 5, 4,
6 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 1, 0, 3, 2, 4, 5
7 );
8
9 return _mm256_shuffle_epi8(c, m);
10}
11
12static inline cube_t
13inline_move_U2(cube_t c)
14{
15 cube_t m = _mm256_set_epi8(
16 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1,
17 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 4, 5, 3, 2, 0, 1
18 );
19
20 return _mm256_shuffle_epi8(c, m);
21}
22
23static inline cube_t
24inline_move_U3(cube_t c)
25{
26 cube_t m = _mm256_set_epi8(
27 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 1, 0, 3, 2, 4, 5,
28 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 0, 1, 3, 2, 5, 4
29 );
30
31 return _mm256_shuffle_epi8(c, m);
32}
33
34static inline cube_t
35inline_move_D(cube_t c)
36{
37 cube_t m = _mm256_set_epi8(
38 0, 0, 0, 0, 11, 10, 9, 8, 3, 2, 5, 4, 6, 7, 1, 0,
39 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, 4, 6, 7, 1, 0
40 );
41
42 return _mm256_shuffle_epi8(c, m);
43}
44
45static inline cube_t
46inline_move_D2(cube_t c)
47{
48 cube_t m = _mm256_set_epi8(
49 0, 0, 0, 0, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0,
50 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 5, 4, 2, 3, 1, 0
51 );
52
53 return _mm256_shuffle_epi8(c, m);
54}
55
56static inline cube_t
57inline_move_D3(cube_t c)
58{
59 cube_t m = _mm256_set_epi8(
60 0, 0, 0, 0, 11, 10, 9, 8, 2, 3, 5, 4, 7, 6, 1, 0,
61 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 4, 7, 6, 1, 0
62 );
63
64 return _mm256_shuffle_epi8(c, m);
65}
66
67static inline cube_t
68inline_move_R(cube_t c)
69{
70 cube_t m = _mm256_set_epi8(
71 0, 0, 0, 0, 4, 10, 9, 7, 11, 6, 5, 8, 3, 2, 1, 0,
72 0, 0, 0, 0, 0, 0, 0, 0, 7, 35, 32, 4, 69, 2, 1, 70
73 );
74
75 return compose(c, m);
76}
77
78static inline cube_t
79inline_move_R2(cube_t c)
80{
81 cube_t m = _mm256_set_epi8(
82 0, 0, 0, 0, 8, 10, 9, 11, 4, 6, 5, 7, 3, 2, 1, 0,
83 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 6, 4, 0, 2, 1, 3
84 );
85
86 return _mm256_shuffle_epi8(c, m);
87}
88
89static inline cube_t
90inline_move_R3(cube_t c)
91{
92 cube_t m = _mm256_set_epi8(
93 0, 0, 0, 0, 7, 10, 9, 4, 8, 6, 5, 11, 3, 2, 1, 0,
94 0, 0, 0, 0, 0, 0, 0, 0, 7, 32, 35, 4, 70, 2, 1, 69
95 );
96
97 return compose(c, m);
98}
99
100static inline cube_t
101inline_move_L(cube_t c)
102{
103 cube_t m = _mm256_set_epi8(
104 0, 0, 0, 0, 11, 6, 5, 8, 7, 9, 10, 4, 3, 2, 1, 0,
105 0, 0, 0, 0, 0, 0, 0, 0, 34, 6, 5, 33, 3, 68, 71, 0
106 );
107
108 return compose(c, m);
109}
110
111static inline cube_t
112inline_move_L2(cube_t c)
113{
114 cube_t m = _mm256_set_epi8(
115 0, 0, 0, 0, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0,
116 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 5, 7, 3, 1, 2, 0
117 );
118
119 return _mm256_shuffle_epi8(c, m);
120}
121
122static inline cube_t
123inline_move_L3(cube_t c)
124{
125 cube_t m = _mm256_set_epi8(
126 0, 0, 0, 0, 11, 5, 6, 8, 7, 10, 9, 4, 3, 2, 1, 0,
127 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 5, 34, 3, 71, 68, 0
128 );
129
130 return compose(c, m);
131}
132
133static inline cube_t
134inline_move_F(cube_t c)
135{
136 cube_t m = _mm256_set_epi8(
137 0, 0, 0, 0, 11, 10, 19, 16, 7, 6, 5, 4, 24, 2, 1, 25,
138 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 5, 66, 3, 38, 1, 36
139 );
140
141 return compose(c, m);
142}
143
144static inline cube_t
145inline_move_F2(cube_t c)
146{
147 cube_t m = _mm256_set_epi8(
148 0, 0, 0, 0, 11, 10, 8, 9, 7, 6, 5, 4, 0, 2, 1, 3,
149 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 5, 6, 3, 0, 1, 2
150 );
151
152 return _mm256_shuffle_epi8(c, m);
153}
154
155static inline cube_t
156inline_move_F3(cube_t c)
157{
158 cube_t m = _mm256_set_epi8(
159 0, 0, 0, 0, 11, 10, 16, 19, 7, 6, 5, 4, 25, 2, 1, 24,
160 0, 0, 0, 0, 0, 0, 0, 0, 7, 66, 5, 64, 3, 36, 1, 38
161 );
162
163 return compose(c, m);
164}
165
166static inline cube_t
167inline_move_B(cube_t c)
168{
169 cube_t m = _mm256_set_epi8(
170 0, 0, 0, 0, 18, 17, 9, 8, 7, 6, 5, 4, 3, 26, 27, 0,
171 0, 0, 0, 0, 0, 0, 0, 0, 65, 6, 67, 4, 39, 2, 37, 0
172 );
173
174 return compose(c, m);
175}
176
177static inline cube_t
178inline_move_B2(cube_t c)
179{
180 cube_t m = _mm256_set_epi8(
181 0, 0, 0, 0, 10, 11, 9, 8, 7, 6, 5, 4, 3, 1, 2, 0,
182 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 4, 1, 2, 3, 0
183 );
184
185 return _mm256_shuffle_epi8(c, m);
186}
187
188static inline cube_t
189inline_move_B3(cube_t c)
190{
191 cube_t m = _mm256_set_epi8(
192 0, 0, 0, 0, 17, 18, 9, 8, 7, 6, 5, 4, 3, 27, 26, 0,
193 0, 0, 0, 0, 0, 0, 0, 0, 67, 6, 65, 4, 37, 2, 39, 0
194 );
195
196 return compose(c, m);
197}
diff --git a/src/cube.c b/src/cube.c
index 73f50af..401895e 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -269,6 +269,7 @@ static char *transstr[] = {
269 [BLm] = "mirrored BL", 269 [BLm] = "mirrored BL",
270}; 270};
271 271
272static inline cube_t inline_compose(cube_t, cube_t);
272static bool isconsistent(cube_t); 273static bool isconsistent(cube_t);
273static cube_t flipallcorners(cube_t); 274static cube_t flipallcorners(cube_t);
274static uint8_t readco(char *); 275static uint8_t readco(char *);
@@ -909,18 +910,49 @@ cube_t
909inverse(cube_t c) 910inverse(cube_t c)
910{ 911{
911 /* TODO: optimize for avx2 */ 912 /* TODO: optimize for avx2 */
912 uint8_t i, piece, orien;
913 cube_t ret; 913 cube_t ret;
914 914
915 setzero(ret);
916
917#ifdef DEBUG 915#ifdef DEBUG
918 if (!isconsistent(c)) { 916 if (!isconsistent(c)) {
919 fprintf(stderr, "inverse error, inconsistent cube\n"); 917 fprintf(stderr, "inverse error, inconsistent cube\n");
918 setzero(ret);
920 return ret; 919 return ret;
921 } 920 }
922#endif 921#endif
923 922
923#ifdef CUBE_AVX2
924 /* Method taken from Andrew Skalski's vcube[1]. The addition sequence
925 * was generated using [2].
926 * [1] https://github.com/Voltara/vcube
927 * [2] http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html
928 */
929 cube_t v3, vi;
930
931 v3 = _mm256_shuffle_epi8(c, c);
932 v3 = _mm256_shuffle_epi8(v3, c);
933 vi = _mm256_shuffle_epi8(v3, v3);
934 vi = _mm256_shuffle_epi8(vi, vi);
935 vi = _mm256_shuffle_epi8(vi, vi);
936 vi = _mm256_shuffle_epi8(vi, v3);
937 vi = _mm256_shuffle_epi8(vi, vi);
938 vi = _mm256_shuffle_epi8(vi, vi);
939 vi = _mm256_shuffle_epi8(vi, vi);
940 vi = _mm256_shuffle_epi8(vi, c);
941 vi = _mm256_shuffle_epi8(vi, vi);
942 vi = _mm256_shuffle_epi8(vi, vi);
943 vi = _mm256_shuffle_epi8(vi, vi);
944 vi = _mm256_shuffle_epi8(vi, vi);
945 vi = _mm256_shuffle_epi8(vi, vi);
946 vi = _mm256_shuffle_epi8(vi, v3);
947 vi = _mm256_shuffle_epi8(vi, vi);
948 ret = _mm256_shuffle_epi8(vi, c);
949
950 return flipallcorners(ret);
951#else
952 uint8_t i, piece, orien;
953
954 setzero(ret);
955
924 for (i = 0; i < 12; i++) { 956 for (i = 0; i < 12; i++) {
925 piece = get_edge(c, i); 957 piece = get_edge(c, i);
926 orien = piece & _eobit; 958 orien = piece & _eobit;
@@ -932,12 +964,13 @@ inverse(cube_t c)
932 orien = ((piece << 1) | (piece >> 1)) & _cobits2; 964 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
933 set_corner(ret, piece & _pbits, i | orien); 965 set_corner(ret, piece & _pbits, i | orien);
934 } 966 }
967#endif
935 968
936 return ret; 969 return ret;
937} 970}
938 971
939cube_t 972static inline cube_t
940compose(cube_t c1, cube_t c2) 973inline_compose(cube_t c1, cube_t c2)
941{ 974{
942 cube_t ret; 975 cube_t ret;
943 976
@@ -992,6 +1025,12 @@ compose(cube_t c1, cube_t c2)
992} 1025}
993 1026
994cube_t 1027cube_t
1028compose(cube_t c1, cube_t c2)
1029{
1030 return inline_compose(c1, c2);
1031}
1032
1033cube_t
995transform(cube_t c, trans_t t) 1034transform(cube_t c, trans_t t)
996{ 1035{
997 cube_t ret; 1036 cube_t ret;

Generated with cgit - Back to sebastiano.tronto.net