diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cube.c | 6 | ||||
| -rw-r--r-- | src/cube_avx2.h | 25 | ||||
| -rw-r--r-- | src/cube_portable.h | 22 | ||||
| -rw-r--r-- | src/cube_routines.h | 41 |
4 files changed, 88 insertions, 6 deletions
| @@ -9,10 +9,8 @@ | |||
| 9 | #define DBG_LOG(...) fprintf(stderr, __VA_ARGS__) | 9 | #define DBG_LOG(...) fprintf(stderr, __VA_ARGS__) |
| 10 | #define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__); | 10 | #define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__); |
| 11 | #define DBG_ASSERT(condition, retval, ...) \ | 11 | #define DBG_ASSERT(condition, retval, ...) \ |
| 12 | if (!(condition)) { \ | 12 | if (!(condition)) { DBG_LOG(__VA_ARGS__); return retval; } |
| 13 | DBG_LOG(__VA_ARGS__); \ | 13 | |
| 14 | return retval; \ | ||
| 15 | } | ||
| 16 | #else | 14 | #else |
| 17 | #define _static static | 15 | #define _static static |
| 18 | #define _static_inline static inline | 16 | #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( | |||
| 14 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, | 14 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, |
| 15 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t | 15 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t |
| 16 | ); | 16 | ); |
| 17 | _static uint8_t corner(cube_fast_t, int); | ||
| 18 | _static uint8_t edge(cube_fast_t, int); | ||
| 17 | _static cube_fast_t cubetofast(cube_t); | 19 | _static cube_fast_t cubetofast(cube_t); |
| 18 | _static cube_t fasttocube(cube_fast_t); | 20 | _static cube_t fasttocube(cube_fast_t); |
| 19 | _static_inline bool equal_fast(cube_fast_t, cube_fast_t); | 21 | _static_inline bool equal_fast(cube_fast_t, cube_fast_t); |
| @@ -68,6 +70,28 @@ fastcube( | |||
| 68 | ); | 70 | ); |
| 69 | } | 71 | } |
| 70 | 72 | ||
| 73 | _static uint8_t | ||
| 74 | corner(cube_fast_t c, int i) | ||
| 75 | { | ||
| 76 | uint8_t aux[32]; | ||
| 77 | |||
| 78 | DBG_ASSERT(i >= 0 && i < 8, 255, "Corner must be between 0 and 7\n"); | ||
| 79 | _mm256_storeu_si256((__m256i_u *)aux, c); | ||
| 80 | |||
| 81 | return aux[i]; | ||
| 82 | } | ||
| 83 | |||
| 84 | _static uint8_t | ||
| 85 | edge(cube_fast_t c, int i) | ||
| 86 | { | ||
| 87 | uint8_t aux[32]; | ||
| 88 | |||
| 89 | DBG_ASSERT(i >= 0 && i < 12, 255, "Edge must be between 0 and 11\n"); | ||
| 90 | _mm256_storeu_si256((__m256i_u *)aux, c); | ||
| 91 | |||
| 92 | return aux[i+16]; | ||
| 93 | } | ||
| 94 | |||
| 71 | _static cube_fast_t | 95 | _static cube_fast_t |
| 72 | cubetofast(cube_t a) | 96 | cubetofast(cube_t a) |
| 73 | { | 97 | { |
| @@ -338,4 +362,3 @@ invcoord_fast_esep(int64_t esep) | |||
| 338 | 362 | ||
| 339 | return ret; | 363 | return ret; |
| 340 | } | 364 | } |
| 341 | |||
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 @@ | |||
| 1 | typedef cube_t cube_fast_t; | 1 | typedef struct { |
| 2 | uint8_t corner[8]; | ||
| 3 | uint8_t edge[12]; | ||
| 4 | } cube_fast_t; | ||
| 2 | 5 | ||
| 3 | _static_inline cube_fast_t fastcube( | 6 | _static_inline cube_fast_t fastcube( |
| 4 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, | 7 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, |
| @@ -6,6 +9,8 @@ _static_inline cube_fast_t fastcube( | |||
| 6 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, | 9 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, |
| 7 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t | 10 | uint8_t, uint8_t, uint8_t, uint8_t, uint8_t |
| 8 | ); | 11 | ); |
| 12 | _static uint8_t corner(cube_fast_t, int); | ||
| 13 | _static uint8_t edge(cube_fast_t, int); | ||
| 9 | _static cube_fast_t cubetofast(cube_t); | 14 | _static cube_fast_t cubetofast(cube_t); |
| 10 | _static cube_t fasttocube(cube_fast_t); | 15 | _static cube_t fasttocube(cube_fast_t); |
| 11 | _static_inline bool equal_fast(cube_fast_t, cube_fast_t); | 16 | _static_inline bool equal_fast(cube_fast_t, cube_fast_t); |
| @@ -66,6 +71,21 @@ fastcube( | |||
| 66 | return cube; | 71 | return cube; |
| 67 | } | 72 | } |
| 68 | 73 | ||
| 74 | _static uint8_t | ||
| 75 | corner(cube_fast_t c, int i) | ||
| 76 | { | ||
| 77 | DBG_ASSERT(i >= 0 && i < 8, 255, "Corner must be between 0 and 7\n"); | ||
| 78 | |||
| 79 | return c.corner[i]; | ||
| 80 | } | ||
| 81 | _static uint8_t | ||
| 82 | edge(cube_fast_t c, int i) | ||
| 83 | { | ||
| 84 | DBG_ASSERT(i >= 0 && i < 12, 255, "Edge must be between 0 and 11\n"); | ||
| 85 | |||
| 86 | return c.edge[i]; | ||
| 87 | } | ||
| 88 | |||
| 69 | _static cube_fast_t | 89 | _static cube_fast_t |
| 70 | cubetofast(cube_t cube) | 90 | cubetofast(cube_t cube) |
| 71 | { | 91 | { |
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 *); | |||
| 12 | _static int writepiece_LST(uint8_t, char *); | 12 | _static int writepiece_LST(uint8_t, char *); |
| 13 | _static void writecube_H48(cube_t, char *); | 13 | _static void writecube_H48(cube_t, char *); |
| 14 | _static void writecube_LST(cube_t, char *); | 14 | _static void writecube_LST(cube_t, char *); |
| 15 | _static uint8_t b32toedge(char); | ||
| 16 | _static uint8_t b32tocorner(char); | ||
| 17 | _static char edgetob32(uint8_t); | ||
| 18 | _static char cornertob32(uint8_t); | ||
| 15 | _static uint8_t readmove(char); | 19 | _static uint8_t readmove(char); |
| 16 | _static uint8_t readmodifier(char); | 20 | _static uint8_t readmodifier(char); |
| 17 | _static uint8_t readtrans(const char *); | 21 | _static uint8_t readtrans(const char *); |
| @@ -494,6 +498,43 @@ writecube_LST(cube_t cube, char *buf) | |||
| 494 | } | 498 | } |
| 495 | 499 | ||
| 496 | _static uint8_t | 500 | _static uint8_t |
| 501 | b32toedge(char c) | ||
| 502 | { | ||
| 503 | DBG_ASSERT((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'g'), 255, | ||
| 504 | "Error reading base32 piece"); | ||
| 505 | |||
| 506 | return c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a'); | ||
| 507 | } | ||
| 508 | |||
| 509 | _static uint8_t | ||
| 510 | b32tocorner(char c) { | ||
| 511 | uint8_t val; | ||
| 512 | |||
| 513 | DBG_ASSERT((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'g'), 255, | ||
| 514 | "Error reading base32 piece"); | ||
| 515 | |||
| 516 | val = c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; | ||
| 517 | |||
| 518 | return (val & 7) | ((val & 24) << 2); | ||
| 519 | } | ||
| 520 | |||
| 521 | _static char | ||
| 522 | edgetob32(uint8_t edge) | ||
| 523 | { | ||
| 524 | return edge <= 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26); | ||
| 525 | } | ||
| 526 | |||
| 527 | _static char | ||
| 528 | cornertob32(uint8_t corner) | ||
| 529 | { | ||
| 530 | uint8_t val; | ||
| 531 | |||
| 532 | val = (corner & 7) | ((corner & 96) >> 2); | ||
| 533 | |||
| 534 | return val <= 26 ? 'A' + (char)val : 'a' + (char)(val - 26); | ||
| 535 | } | ||
| 536 | |||
| 537 | _static uint8_t | ||
| 497 | readmove(char c) | 538 | readmove(char c) |
| 498 | { | 539 | { |
| 499 | switch (c) { | 540 | switch (c) { |
