aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cube.c6
-rw-r--r--src/cube_avx2.h25
-rw-r--r--src/cube_portable.h22
-rw-r--r--src/cube_routines.h41
4 files changed, 88 insertions, 6 deletions
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 @@
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
74corner(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
85edge(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
72cubetofast(cube_t a) 96cubetofast(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 @@
1typedef cube_t cube_fast_t; 1typedef 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
75corner(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
82edge(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
70cubetofast(cube_t cube) 90cubetofast(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
501b32toedge(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
510b32tocorner(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
522edgetob32(uint8_t edge)
523{
524 return edge <= 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26);
525}
526
527_static char
528cornertob32(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
497readmove(char c) 538readmove(char c)
498{ 539{
499 switch (c) { 540 switch (c) {

Generated with cgit - Back to sebastiano.tronto.net