aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-11-04 10:25:13 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2023-11-04 10:25:13 +0100
commit3051b2342d67dcba2fdc0010fb26f5850964c4d9 (patch)
treebc47ade8eb832d003e062ffaa2be6e26c185413a
parentade2ed050a2d472b4dd01e30666f5e7ec5030724 (diff)
downloadnissy-core-3051b2342d67dcba2fdc0010fb26f5850964c4d9.tar.gz
nissy-core-3051b2342d67dcba2fdc0010fb26f5850964c4d9.zip
avx2 fully works
-rw-r--r--README.md4
-rw-r--r--src/_trans_avx2.c13
-rw-r--r--src/cube.c21
3 files changed, 20 insertions, 18 deletions
diff --git a/README.md b/README.md
index 4aa18c7..b95977e 100644
--- a/README.md
+++ b/README.md
@@ -13,10 +13,6 @@ $ make test
13 13
14## TODO: 14## TODO:
15 15
16### Make AVX2 work
17
18* fix inverse, flipallcorners
19
20### Cleanup / refactor 16### Cleanup / refactor
21 17
22* see planner 18* see planner
diff --git a/src/_trans_avx2.c b/src/_trans_avx2.c
index e80bf79..c296f6d 100644
--- a/src/_trans_avx2.c
+++ b/src/_trans_avx2.c
@@ -1,14 +1,15 @@
1static inline cube_t 1static inline cube_t
2flipallcorners(cube_t c) 2flipallcorners(cube_t c)
3{ 3{
4 cube_t shleft, shright, summed, newco, cleanco, ret; 4 cube_t co, shleft, shright, summed, newco, cleanco, ret;
5 5
6 shleft = _mm256_slli_si256(c, 1); 6 co = _mm256_and_si256(c, _co2_avx2);
7 shright = _mm256_srli_si256(c, 1); 7 shleft = _mm256_slli_epi32(co, 1);
8 shright = _mm256_srli_epi32(co, 1);
8 summed = _mm256_or_si256(shleft, shright); 9 summed = _mm256_or_si256(shleft, shright);
9 newco = _mm256_and_si256(summed, _co_avx2); 10 newco = _mm256_and_si256(summed, _co2_avx2);
10 cleanco = _mm256_andnot_si256(c, _co_avx2); 11 cleanco = _mm256_xor_si256(c, co);
11 ret = _mm256_and_si256(cleanco, newco); 12 ret = _mm256_or_si256(cleanco, newco);
12 13
13 return ret; 14 return ret;
14} 15}
diff --git a/src/cube.c b/src/cube.c
index 768c1bb..4f92ea7 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -130,10 +130,14 @@ cube_arr_t zerocube_arr = { .e = {0}, .c = {0} };
130#define _co_avx2 _mm256_set_epi8( \ 130#define _co_avx2 _mm256_set_epi8( \
131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
132 0, 0, 0, 0, 0, 0, 0, 0, \ 132 0, 0, 0, 0, 0, 0, 0, 0, \
133 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70) 133 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0)
134#define _co2_avx2 _mm256_set_epi8( \
135 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
136 0, 0, 0, 0, 0, 0, 0, 0, \
137 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60)
134#define _eo_avx2 _mm256_set_epi8( \ 138#define _eo_avx2 _mm256_set_epi8( \
135 0, 0, 0, 0, 0x70, 0x70, 0x70, 0x70, \ 139 0, 0, 0, 0, 0x10, 0x10, 0x10, 0x10, \
136 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, \ 140 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, \
137 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
138#define setsolved(cube) cube = _mm256_loadu_si256((__m256i_u *)&solvedcube_arr) 142#define setsolved(cube) cube = _mm256_loadu_si256((__m256i_u *)&solvedcube_arr)
139#define setzero(cube) cube = _mm256_setzero_si256() 143#define setzero(cube) cube = _mm256_setzero_si256()
@@ -959,6 +963,7 @@ inverse(cube_t c)
959 vi = _mm256_shuffle_epi8(vi, vi); 963 vi = _mm256_shuffle_epi8(vi, vi);
960 vi = _mm256_shuffle_epi8(vi, vi); 964 vi = _mm256_shuffle_epi8(vi, vi);
961 vi = _mm256_shuffle_epi8(vi, vi); 965 vi = _mm256_shuffle_epi8(vi, vi);
966 vi = _mm256_shuffle_epi8(vi, vi);
962 vi = _mm256_shuffle_epi8(vi, c); 967 vi = _mm256_shuffle_epi8(vi, c);
963 vi = _mm256_shuffle_epi8(vi, vi); 968 vi = _mm256_shuffle_epi8(vi, vi);
964 vi = _mm256_shuffle_epi8(vi, vi); 969 vi = _mm256_shuffle_epi8(vi, vi);
@@ -969,9 +974,9 @@ inverse(cube_t c)
969 vi = _mm256_shuffle_epi8(vi, vi); 974 vi = _mm256_shuffle_epi8(vi, vi);
970 vi = _mm256_shuffle_epi8(vi, c); 975 vi = _mm256_shuffle_epi8(vi, c);
971 976
972 vo = _mm256_and_si256(c, _mm256_or_si256(_eo_avx2, _co_avx2)); 977 vo = _mm256_and_si256(c, _mm256_or_si256(_eo_avx2, _co2_avx2));
973 vo = _mm256_shuffle_epi8(vo, vi); 978 vo = _mm256_shuffle_epi8(vo, vi);
974 vp = _mm256_andnot_si256(_mm256_or_si256(_eo_avx2, _co_avx2), vi); 979 vp = _mm256_andnot_si256(_mm256_or_si256(_eo_avx2, _co2_avx2), vi);
975 ret = _mm256_or_si256(vp, vo); 980 ret = _mm256_or_si256(vp, vo);
976 981
977 return flipallcorners(ret); 982 return flipallcorners(ret);
@@ -1016,8 +1021,8 @@ inline_compose(cube_t c1, cube_t c2)
1016 eo2 = _mm256_and_si256(c2, _eo_avx2); 1021 eo2 = _mm256_and_si256(c2, _eo_avx2);
1017 s = _mm256_shuffle_epi8(c1, c2); 1022 s = _mm256_shuffle_epi8(c1, c2);
1018 ed = _mm256_xor_si256(s, eo2); 1023 ed = _mm256_xor_si256(s, eo2);
1019 co1 = _mm256_and_si256(s, _co_avx2); 1024 co1 = _mm256_and_si256(s, _co2_avx2);
1020 co2 = _mm256_and_si256(c2, _co_avx2); 1025 co2 = _mm256_and_si256(c2, _co2_avx2);
1021 aux = _mm256_add_epi8(co1, co2); 1026 aux = _mm256_add_epi8(co1, co2);
1022 cw = _mm256_set_epi8( 1027 cw = _mm256_set_epi8(
1023 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1028 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1033,7 +1038,7 @@ inline_compose(cube_t c1, cube_t c2)
1033 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60 1038 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60
1034 ); 1039 );
1035 auz2 = _mm256_and_si256(auz1, cwccw); 1040 auz2 = _mm256_and_si256(auz1, cwccw);
1036 coclean = _mm256_andnot_si256(_co_avx2, ed); 1041 coclean = _mm256_andnot_si256(_co2_avx2, ed);
1037 ret = _mm256_or_si256(coclean, auz2); 1042 ret = _mm256_or_si256(coclean, auz2);
1038#else 1043#else
1039 uint8_t i, piece1, piece2, p, orien, aux, auy; 1044 uint8_t i, piece1, piece2, p, orien, aux, auy;

Generated with cgit - Back to sebastiano.tronto.net