aboutsummaryrefslogtreecommitdiff
path: root/src/cube_avx2.h
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2024-06-09 20:06:19 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2024-06-09 20:06:19 +0200
commit0b1930307f41db3ea7552d6b2f4666b33c64d26a (patch)
tree6a2558e391f5cc14fa22770cb2791e4a85d84e5e /src/cube_avx2.h
parentb218c803ae1110b08b4896be0a59177e280c9091 (diff)
downloadnissy-core-0b1930307f41db3ea7552d6b2f4666b33c64d26a.tar.gz
nissy-core-0b1930307f41db3ea7552d6b2f4666b33c64d26a.zip
More cleanup
Diffstat (limited to 'src/cube_avx2.h')
-rw-r--r--src/cube_avx2.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cube_avx2.h b/src/cube_avx2.h
index 42ca9b5..b189023 100644
--- a/src/cube_avx2.h
+++ b/src/cube_avx2.h
@@ -25,6 +25,7 @@ _static_inline cube_t compose_epcpeo(cube_t, cube_t);
25_static_inline cube_t compose_edges(cube_t, cube_t); 25_static_inline cube_t compose_edges(cube_t, cube_t);
26_static_inline cube_t compose_corners(cube_t, cube_t); 26_static_inline cube_t compose_corners(cube_t, cube_t);
27_static_inline cube_t compose(cube_t, cube_t); 27_static_inline cube_t compose(cube_t, cube_t);
28_static_inline cube_t inverse(cube_t);
28 29
29_static_inline int64_t coord_co(cube_t); 30_static_inline int64_t coord_co(cube_t);
30_static_inline int64_t coord_csep(cube_t); 31_static_inline int64_t coord_csep(cube_t);
@@ -135,6 +136,58 @@ compose(cube_t c1, cube_t c2)
135 return s; 136 return s;
136} 137}
137 138
139_static_inline cube_t
140cleanaftershuffle(cube_t c)
141{
142 __m256i b;
143
144 b = _mm256_set_epi8(
145 ~0, ~0, ~0, ~0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
146 ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0, 0, 0, 0, 0, 0, 0, 0
147 );
148
149 return _mm256_andnot_si256(b, c);
150}
151
152_static_inline cube_t
153inverse(cube_t c)
154{
155 /* Method taken from Andrew Skalski's vcube[1]. The addition sequence
156 * was generated using [2].
157 * [1] https://github.com/Voltara/vcube
158 * [2] http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html
159 */
160 cube_t v3, vi, vo, vp, ret;
161
162 v3 = _mm256_shuffle_epi8(c, c);
163 v3 = _mm256_shuffle_epi8(v3, c);
164 vi = _mm256_shuffle_epi8(v3, v3);
165 vi = _mm256_shuffle_epi8(vi, vi);
166 vi = _mm256_shuffle_epi8(vi, vi);
167 vi = _mm256_shuffle_epi8(vi, v3);
168 vi = _mm256_shuffle_epi8(vi, vi);
169 vi = _mm256_shuffle_epi8(vi, vi);
170 vi = _mm256_shuffle_epi8(vi, vi);
171 vi = _mm256_shuffle_epi8(vi, vi);
172 vi = _mm256_shuffle_epi8(vi, c);
173 vi = _mm256_shuffle_epi8(vi, vi);
174 vi = _mm256_shuffle_epi8(vi, vi);
175 vi = _mm256_shuffle_epi8(vi, vi);
176 vi = _mm256_shuffle_epi8(vi, vi);
177 vi = _mm256_shuffle_epi8(vi, vi);
178 vi = _mm256_shuffle_epi8(vi, v3);
179 vi = _mm256_shuffle_epi8(vi, vi);
180 vi = _mm256_shuffle_epi8(vi, c);
181
182 vo = _mm256_and_si256(c, _mm256_or_si256(_eo_avx2, _co2_avx2));
183 vo = _mm256_shuffle_epi8(vo, vi);
184 vp = _mm256_andnot_si256(_mm256_or_si256(_eo_avx2, _co2_avx2), vi);
185 ret = _mm256_or_si256(vp, vo);
186 ret = cleanaftershuffle(ret);
187
188 return invertco(ret);
189}
190
138_static_inline int64_t 191_static_inline int64_t
139coord_co(cube_t c) 192coord_co(cube_t c)
140{ 193{

Generated with cgit - Back to sebastiano.tronto.net