From 28ad019d62583b7e89b4e76922aa73857d5876eb Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 28 May 2024 15:42:26 +0200 Subject: Added roadmap for refactor and some simple routines --- src/cube.c | 6 ++---- src/cube_avx2.h | 25 ++++++++++++++++++++++++- src/cube_portable.h | 22 +++++++++++++++++++++- src/cube_routines.h | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/cube.c b/src/cube.c index e1a53e5..df48d7e 100644 --- a/src/cube.c +++ b/src/cube.c @@ -9,10 +9,8 @@ #define DBG_LOG(...) fprintf(stderr, __VA_ARGS__) #define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__); #define DBG_ASSERT(condition, retval, ...) \ - if (!(condition)) { \ - DBG_LOG(__VA_ARGS__); \ - return retval; \ - } + if (!(condition)) { DBG_LOG(__VA_ARGS__); return retval; } + #else #define _static static #define _static_inline static inline diff --git a/src/cube_avx2.h b/src/cube_avx2.h index 233afed..f3fe731 100644 --- a/src/cube_avx2.h +++ b/src/cube_avx2.h @@ -14,6 +14,8 @@ _static_inline cube_fast_t fastcube( uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t ); +_static uint8_t corner(cube_fast_t, int); +_static uint8_t edge(cube_fast_t, int); _static cube_fast_t cubetofast(cube_t); _static cube_t fasttocube(cube_fast_t); _static_inline bool equal_fast(cube_fast_t, cube_fast_t); @@ -68,6 +70,28 @@ fastcube( ); } +_static uint8_t +corner(cube_fast_t c, int i) +{ + uint8_t aux[32]; + + DBG_ASSERT(i >= 0 && i < 8, 255, "Corner must be between 0 and 7\n"); + _mm256_storeu_si256((__m256i_u *)aux, c); + + return aux[i]; +} + +_static uint8_t +edge(cube_fast_t c, int i) +{ + uint8_t aux[32]; + + DBG_ASSERT(i >= 0 && i < 12, 255, "Edge must be between 0 and 11\n"); + _mm256_storeu_si256((__m256i_u *)aux, c); + + return aux[i+16]; +} + _static cube_fast_t cubetofast(cube_t a) { @@ -338,4 +362,3 @@ invcoord_fast_esep(int64_t esep) return ret; } - diff --git a/src/cube_portable.h b/src/cube_portable.h index 2999d8a..48885ff 100644 --- a/src/cube_portable.h +++ b/src/cube_portable.h @@ -1,4 +1,7 @@ -typedef cube_t cube_fast_t; +typedef struct { + uint8_t corner[8]; + uint8_t edge[12]; +} cube_fast_t; _static_inline cube_fast_t fastcube( uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, @@ -6,6 +9,8 @@ _static_inline cube_fast_t fastcube( uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t ); +_static uint8_t corner(cube_fast_t, int); +_static uint8_t edge(cube_fast_t, int); _static cube_fast_t cubetofast(cube_t); _static cube_t fasttocube(cube_fast_t); _static_inline bool equal_fast(cube_fast_t, cube_fast_t); @@ -66,6 +71,21 @@ fastcube( return cube; } +_static uint8_t +corner(cube_fast_t c, int i) +{ + DBG_ASSERT(i >= 0 && i < 8, 255, "Corner must be between 0 and 7\n"); + + return c.corner[i]; +} +_static uint8_t +edge(cube_fast_t c, int i) +{ + DBG_ASSERT(i >= 0 && i < 12, 255, "Edge must be between 0 and 11\n"); + + return c.edge[i]; +} + _static cube_fast_t cubetofast(cube_t cube) { diff --git a/src/cube_routines.h b/src/cube_routines.h index fb19355..3730e90 100644 --- a/src/cube_routines.h +++ b/src/cube_routines.h @@ -12,6 +12,10 @@ _static cube_t readcube_LST(const char *); _static int writepiece_LST(uint8_t, char *); _static void writecube_H48(cube_t, char *); _static void writecube_LST(cube_t, char *); +_static uint8_t b32toedge(char); +_static uint8_t b32tocorner(char); +_static char edgetob32(uint8_t); +_static char cornertob32(uint8_t); _static uint8_t readmove(char); _static uint8_t readmodifier(char); _static uint8_t readtrans(const char *); @@ -493,6 +497,43 @@ writecube_LST(cube_t cube, char *buf) *(buf+ptr-2) = 0; } +_static uint8_t +b32toedge(char c) +{ + DBG_ASSERT((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'g'), 255, + "Error reading base32 piece"); + + return c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a'); +} + +_static uint8_t +b32tocorner(char c) { + uint8_t val; + + DBG_ASSERT((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'g'), 255, + "Error reading base32 piece"); + + val = c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; + + return (val & 7) | ((val & 24) << 2); +} + +_static char +edgetob32(uint8_t edge) +{ + return edge <= 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26); +} + +_static char +cornertob32(uint8_t corner) +{ + uint8_t val; + + val = (corner & 7) | ((corner & 96) >> 2); + + return val <= 26 ? 'A' + (char)val : 'a' + (char)(val - 26); +} + _static uint8_t readmove(char c) { -- cgit v1.3