diff options
Diffstat (limited to 'src/cube.c')
| -rw-r--r-- | src/cube.c | 21 |
1 files changed, 13 insertions, 8 deletions
| @@ -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; |
