aboutsummaryrefslogtreecommitdiff
path: root/src/cube.c
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/cube.c
parenta61382e9dec22ea1ff3fea2d59d3c605c0aa2aac (diff)
downloadnissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.tar.gz
nissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.zip
Added avx2 moves
Diffstat (limited to '')
-rw-r--r--src/cube.c49
1 files changed, 44 insertions, 5 deletions
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