diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | src/_trans_avx2.c | 13 | ||||
| -rw-r--r-- | src/cube.c | 21 |
3 files changed, 20 insertions, 18 deletions
| @@ -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 @@ | |||
| 1 | static inline cube_t | 1 | static inline cube_t |
| 2 | flipallcorners(cube_t c) | 2 | flipallcorners(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 | } |
| @@ -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; |
