From de04d37e8520079f5bba3b1a87d42313297543db Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 19 Dec 2025 07:32:09 +0100 Subject: Add coordinate solvers for corners --- src/arch/avx2.h | 12 +++++++++++- src/arch/common.h | 1 + src/arch/neon.h | 10 ++++++++++ src/arch/portable.h | 13 +++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) (limited to 'src/arch') 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) return ret; } +STATIC_INLINE void +copy_co(cube_t cube[static 1], cube_t co) +{ + cube_t coclean; + + coclean = _mm256_and_si256(co, CO2_AVX2); + *cube = _mm256_andnot_si256(CO2_AVX2, *cube); + *cube = _mm256_or_si256(*cube, coclean); +} + STATIC_INLINE cube_t invcoord_co(uint64_t coord) { @@ -174,7 +184,7 @@ invcoord_co(uint64_t coord) cc = _mm256_loadu_si256((__m256i *)mem); cube = SOLVED_CUBE; - copy_corners(&cube, cc); + copy_co(&cube, cc); return cube; } 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); STATIC_INLINE bool is_eo_even(cube_t); STATIC_INLINE void copy_corners(cube_t [static 1], cube_t); +STATIC_INLINE void copy_co(cube_t [static 1], cube_t); STATIC_INLINE void copy_edges(cube_t [static 1], cube_t); STATIC_INLINE void set_eo(cube_t [static 1], uint64_t); 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) return ret; } +STATIC_INLINE void +copy_co(cube_t cube[static 1], cube_t co) +{ + uint8x8_t coclean; + + coclean = vand_u8(co.corner, CO2_NEON); + cube->corner = vbic_u8(cube->corner, CO2_NEON); + cube->corner = vorr_u8(cube->corner, coclean); +} + STATIC_INLINE cube_t invcoord_co(uint64_t coord) { 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) return ret; } +STATIC_INLINE void +copy_co(cube_t cube[static 1], cube_t co) +{ + uint8_t c; + size_t i; + + for (i = 0; i < 8; i++) { + c = cube->corner[i] & COBITS; + cube->corner[i] ^= c; + cube->corner[i] |= co.corner[i] & COBITS; + } +} + STATIC_INLINE uint64_t coord_co(cube_t c) { -- cgit v1.3