aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/arch/avx2.h12
-rw-r--r--src/arch/common.h1
-rw-r--r--src/arch/neon.h10
-rw-r--r--src/arch/portable.h13
4 files changed, 35 insertions, 1 deletions
diff --git a/src/arch/avx2.h b/src/arch/avx2.h
index 5a62213..b80b0fb 100644
--- a/src/arch/avx2.h
+++ b/src/arch/avx2.h
@@ -160,6 +160,16 @@ coord_co(cube_t c)
160 return ret; 160 return ret;
161} 161}
162 162
163STATIC_INLINE void
164copy_co(cube_t cube[static 1], cube_t co)
165{
166 cube_t coclean;
167
168 coclean = _mm256_and_si256(co, CO2_AVX2);
169 *cube = _mm256_andnot_si256(CO2_AVX2, *cube);
170 *cube = _mm256_or_si256(*cube, coclean);
171}
172
163STATIC_INLINE cube_t 173STATIC_INLINE cube_t
164invcoord_co(uint64_t coord) 174invcoord_co(uint64_t coord)
165{ 175{
@@ -174,7 +184,7 @@ invcoord_co(uint64_t coord)
174 184
175 cc = _mm256_loadu_si256((__m256i *)mem); 185 cc = _mm256_loadu_si256((__m256i *)mem);
176 cube = SOLVED_CUBE; 186 cube = SOLVED_CUBE;
177 copy_corners(&cube, cc); 187 copy_co(&cube, cc);
178 188
179 return cube; 189 return cube;
180} 190}
diff --git a/src/arch/common.h b/src/arch/common.h
index f06f8d7..4412562 100644
--- a/src/arch/common.h
+++ b/src/arch/common.h
@@ -35,6 +35,7 @@ STATIC_INLINE cube_t invcoord_epudsep(uint64_t);
35STATIC_INLINE bool is_eo_even(cube_t); 35STATIC_INLINE bool is_eo_even(cube_t);
36 36
37STATIC_INLINE void copy_corners(cube_t [static 1], cube_t); 37STATIC_INLINE void copy_corners(cube_t [static 1], cube_t);
38STATIC_INLINE void copy_co(cube_t [static 1], cube_t);
38STATIC_INLINE void copy_edges(cube_t [static 1], cube_t); 39STATIC_INLINE void copy_edges(cube_t [static 1], cube_t);
39STATIC_INLINE void set_eo(cube_t [static 1], uint64_t); 40STATIC_INLINE void set_eo(cube_t [static 1], uint64_t);
40 41
diff --git a/src/arch/neon.h b/src/arch/neon.h
index 9871125..f997813 100644
--- a/src/arch/neon.h
+++ b/src/arch/neon.h
@@ -232,6 +232,16 @@ coord_co(cube_t c)
232 return ret; 232 return ret;
233} 233}
234 234
235STATIC_INLINE void
236copy_co(cube_t cube[static 1], cube_t co)
237{
238 uint8x8_t coclean;
239
240 coclean = vand_u8(co.corner, CO2_NEON);
241 cube->corner = vbic_u8(cube->corner, CO2_NEON);
242 cube->corner = vorr_u8(cube->corner, coclean);
243}
244
235STATIC_INLINE cube_t 245STATIC_INLINE cube_t
236invcoord_co(uint64_t coord) 246invcoord_co(uint64_t coord)
237{ 247{
diff --git a/src/arch/portable.h b/src/arch/portable.h
index c7f2de0..4b66fb6 100644
--- a/src/arch/portable.h
+++ b/src/arch/portable.h
@@ -154,6 +154,19 @@ inverse(cube_t cube)
154 return ret; 154 return ret;
155} 155}
156 156
157STATIC_INLINE void
158copy_co(cube_t cube[static 1], cube_t co)
159{
160 uint8_t c;
161 size_t i;
162
163 for (i = 0; i < 8; i++) {
164 c = cube->corner[i] & COBITS;
165 cube->corner[i] ^= c;
166 cube->corner[i] |= co.corner[i] & COBITS;
167 }
168}
169
157STATIC_INLINE uint64_t 170STATIC_INLINE uint64_t
158coord_co(cube_t c) 171coord_co(cube_t c)
159{ 172{

Generated with cgit - Back to sebastiano.tronto.net