diff options
Diffstat (limited to 'src/cube_avx2.h')
| -rw-r--r-- | src/cube_avx2.h | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/cube_avx2.h b/src/cube_avx2.h index ad4aadb..233afed 100644 --- a/src/cube_avx2.h +++ b/src/cube_avx2.h | |||
| @@ -1,10 +1,12 @@ | |||
| 1 | typedef __m256i cube_fast_t; | 1 | typedef __m256i cube_fast_t; |
| 2 | 2 | ||
| 3 | #define _co2_avx2 _mm256_set_epi64x(0, 0, 0, 0x6060606060606060) | 3 | #define _co2_avx2 _mm256_set_epi64x(0, 0, 0, INT64_C(0x6060606060606060)) |
| 4 | #define _cocw_avx2 _mm256_set_epi64x(0, 0, 0, 0x2020202020202020) | 4 | #define _cocw_avx2 _mm256_set_epi64x(0, 0, 0, INT64_C(0x2020202020202020)) |
| 5 | #define _cp_avx2 _mm256_set_epi64x(0, 0, 0, 0x0707070707070707) | 5 | #define _cp_avx2 _mm256_set_epi64x(0, 0, 0, INT64_C(0x0707070707070707)) |
| 6 | #define _ep_avx2 _mm256_set_epi64x(0x0F0F0F0F, 0x0F0F0F0F0F0F0F0F, 0, 0) | 6 | #define _ep_avx2 \ |
| 7 | #define _eo_avx2 _mm256_set_epi64x(0x10101010, 0x1010101010101010, 0, 0) | 7 | _mm256_set_epi64x(INT64_C(0x0F0F0F0F), INT64_C(0x0F0F0F0F0F0F0F0F), 0, 0) |
| 8 | #define _eo_avx2 \ | ||
| 9 | _mm256_set_epi64x(INT64_C(0x10101010), INT64_C(0x1010101010101010), 0, 0) | ||
| 8 | 10 | ||
| 9 | _static_inline cube_fast_t fastcube( | 11 | _static_inline cube_fast_t fastcube( |
| 10 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, | 12 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, |
| @@ -194,9 +196,9 @@ coord_fast_co(cube_fast_t c) | |||
| 194 | co = _mm256_and_si256(c, _co2_avx2); | 196 | co = _mm256_and_si256(c, _co2_avx2); |
| 195 | _mm256_storeu_si256((__m256i *)mem, co); | 197 | _mm256_storeu_si256((__m256i *)mem, co); |
| 196 | 198 | ||
| 197 | mem[0] >>= 5L; | 199 | mem[0] >>= 5; |
| 198 | for (i = 0, ret = 0, p = 1; i < 7; i++, mem[0] >>= 8L, p *= 3) | 200 | for (i = 0, ret = 0, p = 1; i < 7; i++, mem[0] >>= 8, p *= 3) |
| 199 | ret += (mem[0] & 3L) * p; | 201 | ret += (mem[0] & 3) * p; |
| 200 | 202 | ||
| 201 | return ret; | 203 | return ret; |
| 202 | } | 204 | } |
| @@ -242,14 +244,14 @@ coord_fast_esep(cube_fast_t c) | |||
| 242 | ep = _mm256_and_si256(c, _ep_avx2); | 244 | ep = _mm256_and_si256(c, _ep_avx2); |
| 243 | _mm256_storeu_si256((__m256i *)mem, ep); | 245 | _mm256_storeu_si256((__m256i *)mem, ep); |
| 244 | 246 | ||
| 245 | mem[3] <<= 8L; | 247 | mem[3] <<= 8; |
| 246 | ret1 = ret2 = 0; | 248 | ret1 = ret2 = 0; |
| 247 | k = l = 4; | 249 | k = l = 4; |
| 248 | for (i = 0, j = 0; i < 12; i++, mem[i/8 + 2] >>= 8L) { | 250 | for (i = 0, j = 0; i < 12; i++, mem[i/8 + 2] >>= 8) { |
| 249 | e = mem[i/8 + 2]; | 251 | e = mem[i/8 + 2]; |
| 250 | 252 | ||
| 251 | bit1 = (e & _esepbit1) >> 2L; | 253 | bit1 = (e & _esepbit1) >> 2; |
| 252 | bit2 = (e & _esepbit2) >> 3L; | 254 | bit2 = (e & _esepbit2) >> 3; |
| 253 | is1 = (1 - bit2) * bit1; | 255 | is1 = (1 - bit2) * bit1; |
| 254 | 256 | ||
| 255 | ret1 += bit2 * binomial[11-i][k]; | 257 | ret1 += bit2 * binomial[11-i][k]; |
| @@ -305,8 +307,8 @@ _static_inline cube_fast_t | |||
| 305 | invcoord_fast_esep(int64_t esep) | 307 | invcoord_fast_esep(int64_t esep) |
| 306 | { | 308 | { |
| 307 | cube_fast_t eee, ret; | 309 | cube_fast_t eee, ret; |
| 308 | int64_t i, j, jj, k, l, s, v, w, is1, set1, set2; | 310 | int64_t bit1, bit2, i, j, jj, k, l, s, v, w, is1, set1, set2; |
| 309 | uint8_t bit2, bit1, mem[32]; | 311 | uint8_t mem[32]; |
| 310 | uint8_t slice[3] = {0}; | 312 | uint8_t slice[3] = {0}; |
| 311 | 313 | ||
| 312 | set1 = esep % 70; | 314 | set1 = esep % 70; |
| @@ -327,7 +329,7 @@ invcoord_fast_esep(int64_t esep) | |||
| 327 | j += (1-bit2); | 329 | j += (1-bit2); |
| 328 | s = 2*bit2 + (1-bit2)*bit1; | 330 | s = 2*bit2 + (1-bit2)*bit1; |
| 329 | 331 | ||
| 330 | mem[i+16] = (slice[s]++) | (s << 2); | 332 | mem[i+16] = (slice[s]++) | (uint8_t)(s << 2); |
| 331 | } | 333 | } |
| 332 | 334 | ||
| 333 | ret = cubetofast(solved); | 335 | ret = cubetofast(solved); |
