diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-06-09 20:06:19 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-06-09 20:06:19 +0200 |
| commit | 0b1930307f41db3ea7552d6b2f4666b33c64d26a (patch) | |
| tree | 6a2558e391f5cc14fa22770cb2791e4a85d84e5e /src/cube_avx2.h | |
| parent | b218c803ae1110b08b4896be0a59177e280c9091 (diff) | |
| download | nissy-core-0b1930307f41db3ea7552d6b2f4666b33c64d26a.tar.gz nissy-core-0b1930307f41db3ea7552d6b2f4666b33c64d26a.zip | |
More cleanup
Diffstat (limited to 'src/cube_avx2.h')
| -rw-r--r-- | src/cube_avx2.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cube_avx2.h b/src/cube_avx2.h index 42ca9b5..b189023 100644 --- a/src/cube_avx2.h +++ b/src/cube_avx2.h | |||
| @@ -25,6 +25,7 @@ _static_inline cube_t compose_epcpeo(cube_t, cube_t); | |||
| 25 | _static_inline cube_t compose_edges(cube_t, cube_t); | 25 | _static_inline cube_t compose_edges(cube_t, cube_t); |
| 26 | _static_inline cube_t compose_corners(cube_t, cube_t); | 26 | _static_inline cube_t compose_corners(cube_t, cube_t); |
| 27 | _static_inline cube_t compose(cube_t, cube_t); | 27 | _static_inline cube_t compose(cube_t, cube_t); |
| 28 | _static_inline cube_t inverse(cube_t); | ||
| 28 | 29 | ||
| 29 | _static_inline int64_t coord_co(cube_t); | 30 | _static_inline int64_t coord_co(cube_t); |
| 30 | _static_inline int64_t coord_csep(cube_t); | 31 | _static_inline int64_t coord_csep(cube_t); |
| @@ -135,6 +136,58 @@ compose(cube_t c1, cube_t c2) | |||
| 135 | return s; | 136 | return s; |
| 136 | } | 137 | } |
| 137 | 138 | ||
| 139 | _static_inline cube_t | ||
| 140 | cleanaftershuffle(cube_t c) | ||
| 141 | { | ||
| 142 | __m256i b; | ||
| 143 | |||
| 144 | b = _mm256_set_epi8( | ||
| 145 | ~0, ~0, ~0, ~0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
| 146 | ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
| 147 | ); | ||
| 148 | |||
| 149 | return _mm256_andnot_si256(b, c); | ||
| 150 | } | ||
| 151 | |||
| 152 | _static_inline cube_t | ||
| 153 | inverse(cube_t c) | ||
| 154 | { | ||
| 155 | /* Method taken from Andrew Skalski's vcube[1]. The addition sequence | ||
| 156 | * was generated using [2]. | ||
| 157 | * [1] https://github.com/Voltara/vcube | ||
| 158 | * [2] http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html | ||
| 159 | */ | ||
| 160 | cube_t v3, vi, vo, vp, ret; | ||
| 161 | |||
| 162 | v3 = _mm256_shuffle_epi8(c, c); | ||
| 163 | v3 = _mm256_shuffle_epi8(v3, c); | ||
| 164 | vi = _mm256_shuffle_epi8(v3, v3); | ||
| 165 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 166 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 167 | vi = _mm256_shuffle_epi8(vi, v3); | ||
| 168 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 169 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 170 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 171 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 172 | vi = _mm256_shuffle_epi8(vi, c); | ||
| 173 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 174 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 175 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 176 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 177 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 178 | vi = _mm256_shuffle_epi8(vi, v3); | ||
| 179 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 180 | vi = _mm256_shuffle_epi8(vi, c); | ||
| 181 | |||
| 182 | vo = _mm256_and_si256(c, _mm256_or_si256(_eo_avx2, _co2_avx2)); | ||
| 183 | vo = _mm256_shuffle_epi8(vo, vi); | ||
| 184 | vp = _mm256_andnot_si256(_mm256_or_si256(_eo_avx2, _co2_avx2), vi); | ||
| 185 | ret = _mm256_or_si256(vp, vo); | ||
| 186 | ret = cleanaftershuffle(ret); | ||
| 187 | |||
| 188 | return invertco(ret); | ||
| 189 | } | ||
| 190 | |||
| 138 | _static_inline int64_t | 191 | _static_inline int64_t |
| 139 | coord_co(cube_t c) | 192 | coord_co(cube_t c) |
| 140 | { | 193 | { |
