aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-11-01 19:26:09 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2023-11-01 19:26:09 +0100
commit08efbd62ef956327924aaea1fcfa97fde4dc1678 (patch)
tree656d9f6ab50eee73a6e7fd79098e0dcfa1fc9034
parentd65ce8e86b517ef3f7d48cf5ded1101444e05b2b (diff)
downloadnissy-core-08efbd62ef956327924aaea1fcfa97fde4dc1678.tar.gz
nissy-core-08efbd62ef956327924aaea1fcfa97fde4dc1678.zip
Reworked moves and transformations, moved some stuff
Diffstat (limited to '')
-rw-r--r--README.md44
-rw-r--r--old/_trans_move_arr.c (renamed from src/_trans_move_arr.c)0
-rw-r--r--old/inverses.c71
-rw-r--r--old/manualsimd/cube.c (renamed from experiments/cube.c)0
-rw-r--r--old/manualsimd/cube.h (renamed from experiments/cube.h)0
-rw-r--r--src/_constants.c286
-rw-r--r--src/_move_logic_avx2.c6
-rw-r--r--src/_moves_arr.c (renamed from src/_move_logic_arr.c)167
-rw-r--r--src/_moves_avx2.c2
-rw-r--r--src/_trans_arr.c952
-rw-r--r--src/_trans_avx2.c0
-rw-r--r--src/_trans_move_avx2.c2
-rw-r--r--src/cube.c438
-rw-r--r--src/cube.h3
-rwxr-xr-xutils/gentranscode.sh47
-rwxr-xr-xutils/gentransswitch.sh8
16 files changed, 1597 insertions, 429 deletions
diff --git a/README.md b/README.md
index 59a6bcc..b2e9424 100644
--- a/README.md
+++ b/README.md
@@ -13,51 +13,29 @@ $ make test
13 13
14## TODO: 14## TODO:
15 15
16### Tests 16### Make AVX2 work
17 17
18* inverse_move 18* writecube to AVX2-src format (+ tests)
19* inverse_trans 19* generate moves and transformations with scripts in utils/
20 20* fix base get_ and set_ macros (constant arguments?)
21### Simple additions 21* optimize things that use get_ and set_
22
23* Write to AVX2-src format
24* move() that takes a string (alg) as input
25
26### Changes
27
28* write one function (static inline or public?) for each move (and trans)
29* only call the specific functions in performance-critical steps (i.e. solve
30 - if the functions are static inline, all performance-critical steps must
31 be internal to cube.c)
32* this also enables skipping some unnecessary work (e.g. flip edges, twist
33 corners) for many moves (and mirror transformations)
34* add benchmarks with moves / trans called directly instead of via the
35 generic function
36* keep generic move and trans functions with big switch case
37* bring back constants into cube.c, and maybe also moves (TBD: what to
38 do with architecture-specific code? leave in separate files like now,
39 use just one file for each architecture...)
40 22
41### Documentation and interface 23### Documentation and interface
42 24
43* inline some documentation as comments in cube.h or cube.c 25* inline some documentation as comments in cube.h or cube.c
44* README.md (maybe convert to txt?) becomes the reference documentation 26* README.md (maybe convert to txt?) becomes the reference documentation
45 27
46### AVX2
47
48* fix base get_ and set_ macros (constant arguments?)
49* implement missing stuff (moves, transform)
50* optimize things that use get_ and set_
51
52### More features 28### More features
53 29
30* move() that takes a string (alg) as input
54* coordinates: co, eo, epsep, cpsep_sym, cocpsep_sym, cphtr_sym, cocphtr_sym 31* coordinates: co, eo, epsep, cpsep_sym, cocpsep_sym, cphtr_sym, cocphtr_sym
55* pruning tables (1 bit per entry + fallback)
56* solve.c
57 32
58### Optimizations: 33### Solving
59 34
60* multi-move (up to 4/5 moves at once) 35* Fixed depth
36* pruning tables (1 bit per entry + fallback)
37* Takes as parameters the amount of memory to use and a FILE for the tables
38* Use multi-move (up to 4/5 moves at once)
61 39
62### Things I need to learn: 40### Things I need to learn:
63 41
diff --git a/src/_trans_move_arr.c b/old/_trans_move_arr.c
index a00105f..a00105f 100644
--- a/src/_trans_move_arr.c
+++ b/old/_trans_move_arr.c
diff --git a/old/inverses.c b/old/inverses.c
new file mode 100644
index 0000000..eb8e80b
--- /dev/null
+++ b/old/inverses.c
@@ -0,0 +1,71 @@
1static move_t inverse_move_arr[] = {
2 [U] = U3,
3 [U2] = U2,
4 [U3] = U,
5 [D] = D3,
6 [D2] = D2,
7 [D3] = D,
8 [R] = R3,
9 [R2] = R2,
10 [R3] = R,
11 [L] = L3,
12 [L2] = L2,
13 [L3] = L,
14 [F] = F3,
15 [F2] = F2,
16 [F3] = F,
17 [B] = B3,
18 [B2] = B2,
19 [B3] = B,
20};
21
22static trans_t inverse_trans_arr[] = {
23 [UFr] = UFr,
24 [ULr] = URr,
25 [UBr] = UBr,
26 [URr] = URr,
27 [DFr] = DFr,
28 [DLr] = DLr,
29 [DRr] = DRr,
30 [DBr] = DBr,
31 [RUr] = FRr,
32 [RFr] = LFr,
33 [RDr] = BLr,
34 [RBr] = RBr,
35 [LUr] = FLr,
36 [LFr] = RFr,
37 [LDr] = BRr,
38 [LBr] = LBr,
39 [FUr] = FUr,
40 [FRr] = RUr,
41 [FDr] = BUr,
42 [FLr] = LUr,
43 [BUr] = FDr,
44 [BLr] = RDr,
45 [BDr] = BDr,
46 [BRr] = LDr,
47 [UFm] = UFm,
48 [ULm] = ULm,
49 [UBm] = UBm,
50 [URm] = ULm,
51 [DFm] = DFm,
52 [DLm] = DRm,
53 [DRm] = DLm,
54 [DBm] = DBm,
55 [RUm] = FLm,
56 [RFm] = RFm,
57 [RDm] = BRm,
58 [RBm] = LBm,
59 [LUm] = FRm,
60 [LFm] = LFm,
61 [LDm] = BLm,
62 [LBm] = RBm,
63 [FUm] = FUm,
64 [FRm] = LUm,
65 [FDm] = BUm,
66 [FLm] = RUm,
67 [BUm] = FDm,
68 [BLm] = LDm,
69 [BDm] = BDm,
70 [BRm] = RDm,
71};
diff --git a/experiments/cube.c b/old/manualsimd/cube.c
index 4372b5e..4372b5e 100644
--- a/experiments/cube.c
+++ b/old/manualsimd/cube.c
diff --git a/experiments/cube.h b/old/manualsimd/cube.h
index b916f96..b916f96 100644
--- a/experiments/cube.h
+++ b/old/manualsimd/cube.h
diff --git a/src/_constants.c b/src/_constants.c
deleted file mode 100644
index a6b19fe..0000000
--- a/src/_constants.c
+++ /dev/null
@@ -1,286 +0,0 @@
1#define U 0U
2#define U2 1U
3#define U3 2U
4#define D 3U
5#define D2 4U
6#define D3 5U
7#define R 6U
8#define R2 7U
9#define R3 8U
10#define L 9U
11#define L2 10U
12#define L3 11U
13#define F 12U
14#define F2 13U
15#define F3 14U
16#define B 15U
17#define B2 16U
18#define B3 17U
19
20#define UFr 0
21#define ULr 1
22#define UBr 2
23#define URr 3
24#define DFr 4
25#define DLr 5
26#define DBr 6
27#define DRr 7
28#define RUr 8
29#define RFr 9
30#define RDr 10
31#define RBr 11
32#define LUr 12
33#define LFr 13
34#define LDr 14
35#define LBr 15
36#define FUr 16
37#define FRr 17
38#define FDr 18
39#define FLr 19
40#define BUr 20
41#define BRr 21
42#define BDr 22
43#define BLr 23
44
45#define UFm 24
46#define ULm 25
47#define UBm 26
48#define URm 27
49#define DFm 28
50#define DLm 29
51#define DBm 30
52#define DRm 31
53#define RUm 32
54#define RFm 33
55#define RDm 34
56#define RBm 35
57#define LUm 36
58#define LFm 37
59#define LDm 38
60#define LBm 39
61#define FUm 40
62#define FRm 41
63#define FDm 42
64#define FLm 43
65#define BUm 44
66#define BRm 45
67#define BDm 46
68#define BLm 47
69
70#define errormove 99U
71#define errortrans 99U
72
73#define _c_ufr 0U
74#define _c_ubl 1U
75#define _c_dfl 2U
76#define _c_dbr 3U
77#define _c_ufl 4U
78#define _c_ubr 5U
79#define _c_dfr 6U
80#define _c_dbl 7U
81
82#define _e_uf 0U
83#define _e_ub 1U
84#define _e_db 2U
85#define _e_df 3U
86#define _e_ur 4U
87#define _e_ul 5U
88#define _e_dl 6U
89#define _e_dr 7U
90#define _e_fr 8U
91#define _e_fl 9U
92#define _e_bl 10U
93#define _e_br 11U
94
95#define _eoshift 4U
96#define _coshift 5U
97
98#define _pbits 0xFU
99#define _eobit 0x10U
100#define _cobits 0xF0U
101#define _cobits2 0x60U
102#define _ctwist_cw 0x20U
103#define _ctwist_ccw 0x40U
104#define _eflip 0x10U
105#define _error 0xFFU
106
107static move_t inverse_move_arr[] = {
108 [U] = U3,
109 [U2] = U2,
110 [U3] = U,
111 [D] = D3,
112 [D2] = D2,
113 [D3] = D,
114 [R] = R3,
115 [R2] = R2,
116 [R3] = R,
117 [L] = L3,
118 [L2] = L2,
119 [L3] = L,
120 [F] = F3,
121 [F2] = F2,
122 [F3] = F,
123 [B] = B3,
124 [B2] = B2,
125 [B3] = B,
126};
127
128static trans_t inverse_trans_arr[] = {
129 [UFr] = UFr,
130 [ULr] = URr,
131 [UBr] = UBr,
132 [URr] = URr,
133 [DFr] = DFr,
134 [DLr] = DLr,
135 [DRr] = DRr,
136 [DBr] = DBr,
137 [RUr] = FRr,
138 [RFr] = LFr,
139 [RDr] = BLr,
140 [RBr] = RBr,
141 [LUr] = FLr,
142 [LFr] = RFr,
143 [LDr] = BRr,
144 [LBr] = LBr,
145 [FUr] = FUr,
146 [FRr] = RUr,
147 [FDr] = BUr,
148 [FLr] = LUr,
149 [BUr] = FDr,
150 [BLr] = RDr,
151 [BDr] = BDr,
152 [BRr] = LDr,
153 [UFm] = UFm,
154 [ULm] = ULm,
155 [UBm] = UBm,
156 [URm] = ULm,
157 [DFm] = DFm,
158 [DLm] = DRm,
159 [DRm] = DLm,
160 [DBm] = DBm,
161 [RUm] = FLm,
162 [RFm] = RFm,
163 [RDm] = BRm,
164 [RBm] = LBm,
165 [LUm] = FRm,
166 [LFm] = LFm,
167 [LDm] = BLm,
168 [LBm] = RBm,
169 [FUm] = FUm,
170 [FRm] = LUm,
171 [FDm] = BUm,
172 [FLm] = RUm,
173 [BUm] = FDm,
174 [BLm] = LDm,
175 [BDm] = BDm,
176 [BRm] = RDm,
177};
178
179static char *cornerstr[] = {
180 [_c_ufr] = "UFR",
181 [_c_ubl] = "UBL",
182 [_c_dfl] = "DFL",
183 [_c_dbr] = "DBR",
184 [_c_ufl] = "UFL",
185 [_c_ubr] = "UBR",
186 [_c_dfr] = "DFR",
187 [_c_dbl] = "DBL"
188};
189
190static char *cornerstralt[] = {
191 [_c_ufr] = "URF",
192 [_c_ubl] = "ULB",
193 [_c_dfl] = "DLF",
194 [_c_dbr] = "DRB",
195 [_c_ufl] = "ULF",
196 [_c_ubr] = "URB",
197 [_c_dfr] = "DRF",
198 [_c_dbl] = "DLB"
199};
200
201static char *edgestr[] = {
202 [_e_uf] = "UF",
203 [_e_ub] = "UB",
204 [_e_db] = "DB",
205 [_e_df] = "DF",
206 [_e_ur] = "UR",
207 [_e_ul] = "UL",
208 [_e_dl] = "DL",
209 [_e_dr] = "DR",
210 [_e_fr] = "FR",
211 [_e_fl] = "FL",
212 [_e_bl] = "BL",
213 [_e_br] = "BR"
214};
215
216static char *movestr[] = {
217 [U] = "U",
218 [U2] = "U2",
219 [U3] = "U'",
220 [D] = "D",
221 [D2] = "D2",
222 [D3] = "D'",
223 [R] = "R",
224 [R2] = "R2",
225 [R3] = "R'",
226 [L] = "L",
227 [L2] = "L2",
228 [L3] = "L'",
229 [F] = "F",
230 [F2] = "F2",
231 [F3] = "F'",
232 [B] = "B",
233 [B2] = "B2",
234 [B3] = "B'",
235};
236
237static char *transstr[] = {
238 [UFr] = "rotation UF",
239 [UFm] = "mirrored UF",
240 [ULr] = "rotation UL",
241 [ULm] = "mirrored UL",
242 [UBr] = "rotation UB",
243 [UBm] = "mirrored UB",
244 [URr] = "rotation UR",
245 [URm] = "mirrored UR",
246 [DFr] = "rotation DF",
247 [DFm] = "mirrored DF",
248 [DLr] = "rotation DL",
249 [DLm] = "mirrored DL",
250 [DBr] = "rotation DB",
251 [DBm] = "mirrored DB",
252 [DRr] = "rotation DR",
253 [DRm] = "mirrored DR",
254 [RUr] = "rotation RU",
255 [RUm] = "mirrored RU",
256 [RFr] = "rotation RF",
257 [RFm] = "mirrored RF",
258 [RDr] = "rotation RD",
259 [RDm] = "mirrored RD",
260 [RBr] = "rotation RB",
261 [RBm] = "mirrored RB",
262 [LUr] = "rotation LU",
263 [LUm] = "mirrored LU",
264 [LFr] = "rotation LF",
265 [LFm] = "mirrored LF",
266 [LDr] = "rotation LD",
267 [LDm] = "mirrored LD",
268 [LBr] = "rotation LB",
269 [LBm] = "mirrored LB",
270 [FUr] = "rotation FU",
271 [FUm] = "mirrored FU",
272 [FRr] = "rotation FR",
273 [FRm] = "mirrored FR",
274 [FDr] = "rotation FD",
275 [FDm] = "mirrored FD",
276 [FLr] = "rotation FL",
277 [FLm] = "mirrored FL",
278 [BUr] = "rotation BU",
279 [BUm] = "mirrored BU",
280 [BRr] = "rotation BR",
281 [BRm] = "mirrored BR",
282 [BDr] = "rotation BD",
283 [BDm] = "mirrored BD",
284 [BLr] = "rotation BL",
285 [BLm] = "mirrored BL",
286};
diff --git a/src/_move_logic_avx2.c b/src/_move_logic_avx2.c
deleted file mode 100644
index 29df776..0000000
--- a/src/_move_logic_avx2.c
+++ /dev/null
@@ -1,6 +0,0 @@
1/* TODO:
2static cube_t move_cube[18];
3return compose(move_cube[m], c);
4*/
5
6goto move_error;
diff --git a/src/_move_logic_arr.c b/src/_moves_arr.c
index d8aec10..bea0fee 100644
--- a/src/_move_logic_arr.c
+++ b/src/_moves_arr.c
@@ -27,79 +27,164 @@
27 r[k] ^= _eobit; \ 27 r[k] ^= _eobit; \
28 r[l] ^= _eobit; 28 r[l] ^= _eobit;
29 29
30uint8_t aux, auy, auz; 30static inline cube_t
31cube_t ret = c; 31inline_move_U(cube_t c)
32{
33 uint8_t aux;
34 cube_t ret = c;
32 35
33switch (m) {
34case U:
35 PERM4(ret.e, _e_uf, _e_ul, _e_ub, _e_ur) 36 PERM4(ret.e, _e_uf, _e_ul, _e_ub, _e_ur)
36 PERM4(ret.c, _c_ufr, _c_ufl, _c_ubl, _c_ubr) 37 PERM4(ret.c, _c_ufr, _c_ufl, _c_ubl, _c_ubr)
37 38
38 return ret; 39 return ret;
39case U2: 40}
41
42static inline cube_t
43inline_move_U2(cube_t c)
44{
45 uint8_t aux;
46 cube_t ret = c;
47
40 PERM22(ret.e, _e_uf, _e_ub, _e_ul, _e_ur) 48 PERM22(ret.e, _e_uf, _e_ub, _e_ul, _e_ur)
41 PERM22(ret.c, _c_ufr, _c_ubl, _c_ufl, _c_ubr) 49 PERM22(ret.c, _c_ufr, _c_ubl, _c_ufl, _c_ubr)
42 50
43 return ret; 51 return ret;
44case U3: 52}
53
54static inline cube_t
55inline_move_U3(cube_t c)
56{
57 uint8_t aux;
58 cube_t ret = c;
59
45 PERM4(ret.e, _e_uf, _e_ur, _e_ub, _e_ul) 60 PERM4(ret.e, _e_uf, _e_ur, _e_ub, _e_ul)
46 PERM4(ret.c, _c_ufr, _c_ubr, _c_ubl, _c_ufl) 61 PERM4(ret.c, _c_ufr, _c_ubr, _c_ubl, _c_ufl)
47 62
48 return ret; 63 return ret;
49case D: 64}
65
66static inline cube_t
67inline_move_D(cube_t c)
68{
69 uint8_t aux;
70 cube_t ret = c;
71
50 PERM4(ret.e, _e_df, _e_dr, _e_db, _e_dl) 72 PERM4(ret.e, _e_df, _e_dr, _e_db, _e_dl)
51 PERM4(ret.c, _c_dfr, _c_dbr, _c_dbl, _c_dfl) 73 PERM4(ret.c, _c_dfr, _c_dbr, _c_dbl, _c_dfl)
52 74
53 return ret; 75 return ret;
54case D2: 76}
77
78static inline cube_t
79inline_move_D2(cube_t c)
80{
81 uint8_t aux;
82 cube_t ret = c;
83
55 PERM22(ret.e, _e_df, _e_db, _e_dr, _e_dl) 84 PERM22(ret.e, _e_df, _e_db, _e_dr, _e_dl)
56 PERM22(ret.c, _c_dfr, _c_dbl, _c_dbr, _c_dfl) 85 PERM22(ret.c, _c_dfr, _c_dbl, _c_dbr, _c_dfl)
57 86
58 return ret; 87 return ret;
59case D3: 88}
89
90static inline cube_t
91inline_move_D3(cube_t c)
92{
93 uint8_t aux;
94 cube_t ret = c;
95
60 PERM4(ret.e, _e_df, _e_dl, _e_db, _e_dr) 96 PERM4(ret.e, _e_df, _e_dl, _e_db, _e_dr)
61 PERM4(ret.c, _c_dfr, _c_dfl, _c_dbl, _c_dbr) 97 PERM4(ret.c, _c_dfr, _c_dfl, _c_dbl, _c_dbr)
62 98
63 return ret; 99 return ret;
64case R: 100}
101
102static inline cube_t
103inline_move_R(cube_t c)
104{
105 uint8_t aux, auy, auz;
106 cube_t ret = c;
107
65 PERM4(ret.e, _e_ur, _e_br, _e_dr, _e_fr) 108 PERM4(ret.e, _e_ur, _e_br, _e_dr, _e_fr)
66 PERM4(ret.c, _c_ufr, _c_ubr, _c_dbr, _c_dfr) 109 PERM4(ret.c, _c_ufr, _c_ubr, _c_dbr, _c_dfr)
67 110
68 CO4(ret.c, _c_ubr, _c_dfr, _c_ufr, _c_dbr) 111 CO4(ret.c, _c_ubr, _c_dfr, _c_ufr, _c_dbr)
69 112
70 return ret; 113 return ret;
71case R2: 114}
115
116static inline cube_t
117inline_move_R2(cube_t c)
118{
119 uint8_t aux;
120 cube_t ret = c;
121
72 PERM22(ret.e, _e_ur, _e_dr, _e_fr, _e_br) 122 PERM22(ret.e, _e_ur, _e_dr, _e_fr, _e_br)
73 PERM22(ret.c, _c_ufr, _c_dbr, _c_ubr, _c_dfr) 123 PERM22(ret.c, _c_ufr, _c_dbr, _c_ubr, _c_dfr)
74 124
75 return ret; 125 return ret;
76case R3: 126}
127
128static inline cube_t
129inline_move_R3(cube_t c)
130{
131 uint8_t aux, auy, auz;
132 cube_t ret = c;
133
77 PERM4(ret.e, _e_ur, _e_fr, _e_dr, _e_br) 134 PERM4(ret.e, _e_ur, _e_fr, _e_dr, _e_br)
78 PERM4(ret.c, _c_ufr, _c_dfr, _c_dbr, _c_ubr) 135 PERM4(ret.c, _c_ufr, _c_dfr, _c_dbr, _c_ubr)
79 136
80 CO4(ret.c, _c_ubr, _c_dfr, _c_ufr, _c_dbr) 137 CO4(ret.c, _c_ubr, _c_dfr, _c_ufr, _c_dbr)
81 138
82 return ret; 139 return ret;
83case L: 140}
141
142static inline cube_t
143inline_move_L(cube_t c)
144{
145 uint8_t aux, auy, auz;
146 cube_t ret = c;
147
84 PERM4(ret.e, _e_ul, _e_fl, _e_dl, _e_bl) 148 PERM4(ret.e, _e_ul, _e_fl, _e_dl, _e_bl)
85 PERM4(ret.c, _c_ufl, _c_dfl, _c_dbl, _c_ubl) 149 PERM4(ret.c, _c_ufl, _c_dfl, _c_dbl, _c_ubl)
86 150
87 CO4(ret.c, _c_ufl, _c_dbl, _c_dfl, _c_ubl) 151 CO4(ret.c, _c_ufl, _c_dbl, _c_dfl, _c_ubl)
88 152
89 return ret; 153 return ret;
90case L2: 154}
155
156static inline cube_t
157inline_move_L2(cube_t c)
158{
159 uint8_t aux;
160 cube_t ret = c;
161
91 PERM22(ret.e, _e_ul, _e_dl, _e_fl, _e_bl) 162 PERM22(ret.e, _e_ul, _e_dl, _e_fl, _e_bl)
92 PERM22(ret.c, _c_ufl, _c_dbl, _c_ubl, _c_dfl) 163 PERM22(ret.c, _c_ufl, _c_dbl, _c_ubl, _c_dfl)
93 164
94 return ret; 165 return ret;
95case L3: 166}
167
168static inline cube_t
169inline_move_L3(cube_t c)
170{
171 uint8_t aux, auy, auz;
172 cube_t ret = c;
173
96 PERM4(ret.e, _e_ul, _e_bl, _e_dl, _e_fl) 174 PERM4(ret.e, _e_ul, _e_bl, _e_dl, _e_fl)
97 PERM4(ret.c, _c_ufl, _c_ubl, _c_dbl, _c_dfl) 175 PERM4(ret.c, _c_ufl, _c_ubl, _c_dbl, _c_dfl)
98 176
99 CO4(ret.c, _c_ufl, _c_dbl, _c_dfl, _c_ubl) 177 CO4(ret.c, _c_ufl, _c_dbl, _c_dfl, _c_ubl)
100 178
101 return ret; 179 return ret;
102case F: 180}
181
182static inline cube_t
183inline_move_F(cube_t c)
184{
185 uint8_t aux, auy, auz;
186 cube_t ret = c;
187
103 PERM4(ret.e, _e_uf, _e_fr, _e_df, _e_fl) 188 PERM4(ret.e, _e_uf, _e_fr, _e_df, _e_fl)
104 PERM4(ret.c, _c_ufr, _c_dfr, _c_dfl, _c_ufl) 189 PERM4(ret.c, _c_ufr, _c_dfr, _c_dfl, _c_ufl)
105 190
@@ -107,12 +192,26 @@ case F:
107 CO4(ret.c, _c_ufr, _c_dfl, _c_dfr, _c_ufl) 192 CO4(ret.c, _c_ufr, _c_dfl, _c_dfr, _c_ufl)
108 193
109 return ret; 194 return ret;
110case F2: 195}
196
197static inline cube_t
198inline_move_F2(cube_t c)
199{
200 uint8_t aux;
201 cube_t ret = c;
202
111 PERM22(ret.e, _e_uf, _e_df, _e_fr, _e_fl) 203 PERM22(ret.e, _e_uf, _e_df, _e_fr, _e_fl)
112 PERM22(ret.c, _c_ufr, _c_dfl, _c_ufl, _c_dfr) 204 PERM22(ret.c, _c_ufr, _c_dfl, _c_ufl, _c_dfr)
113 205
114 return ret; 206 return ret;
115case F3: 207}
208
209static inline cube_t
210inline_move_F3(cube_t c)
211{
212 uint8_t aux, auy, auz;
213 cube_t ret = c;
214
116 PERM4(ret.e, _e_uf, _e_fl, _e_df, _e_fr) 215 PERM4(ret.e, _e_uf, _e_fl, _e_df, _e_fr)
117 PERM4(ret.c, _c_ufr, _c_ufl, _c_dfl, _c_dfr) 216 PERM4(ret.c, _c_ufr, _c_ufl, _c_dfl, _c_dfr)
118 217
@@ -120,7 +219,14 @@ case F3:
120 CO4(ret.c, _c_ufr, _c_dfl, _c_dfr, _c_ufl) 219 CO4(ret.c, _c_ufr, _c_dfl, _c_dfr, _c_ufl)
121 220
122 return ret; 221 return ret;
123case B: 222}
223
224static inline cube_t
225inline_move_B(cube_t c)
226{
227 uint8_t aux, auy, auz;
228 cube_t ret = c;
229
124 PERM4(ret.e, _e_ub, _e_bl, _e_db, _e_br) 230 PERM4(ret.e, _e_ub, _e_bl, _e_db, _e_br)
125 PERM4(ret.c, _c_ubr, _c_ubl, _c_dbl, _c_dbr) 231 PERM4(ret.c, _c_ubr, _c_ubl, _c_dbl, _c_dbr)
126 232
@@ -128,12 +234,26 @@ case B:
128 CO4(ret.c, _c_ubl, _c_dbr, _c_dbl, _c_ubr) 234 CO4(ret.c, _c_ubl, _c_dbr, _c_dbl, _c_ubr)
129 235
130 return ret; 236 return ret;
131case B2: 237}
238
239static inline cube_t
240inline_move_B2(cube_t c)
241{
242 uint8_t aux;
243 cube_t ret = c;
244
132 PERM22(ret.e, _e_ub, _e_db, _e_br, _e_bl) 245 PERM22(ret.e, _e_ub, _e_db, _e_br, _e_bl)
133 PERM22(ret.c, _c_ubr, _c_dbl, _c_ubl, _c_dbr) 246 PERM22(ret.c, _c_ubr, _c_dbl, _c_ubl, _c_dbr)
134 247
135 return ret; 248 return ret;
136case B3: 249}
250
251static inline cube_t
252inline_move_B3(cube_t c)
253{
254 uint8_t aux, auy, auz;
255 cube_t ret = c;
256
137 PERM4(ret.e, _e_ub, _e_br, _e_db, _e_bl) 257 PERM4(ret.e, _e_ub, _e_br, _e_db, _e_bl)
138 PERM4(ret.c, _c_ubr, _c_dbr, _c_dbl, _c_ubl) 258 PERM4(ret.c, _c_ubr, _c_dbr, _c_dbl, _c_ubl)
139 259
@@ -141,9 +261,4 @@ case B3:
141 CO4(ret.c, _c_ubl, _c_dbr, _c_dbl, _c_ubr) 261 CO4(ret.c, _c_ubl, _c_dbr, _c_dbl, _c_ubr)
142 262
143 return ret; 263 return ret;
144default:
145#ifdef DEBUG
146 fprintf(stderr, "mover error, unknown move\n");
147#endif
148 goto move_error;
149} 264}
diff --git a/src/_moves_avx2.c b/src/_moves_avx2.c
new file mode 100644
index 0000000..d72f45f
--- /dev/null
+++ b/src/_moves_avx2.c
@@ -0,0 +1,2 @@
1/* TODO: return compose(c, (some avx garbage));
2*/
diff --git a/src/_trans_arr.c b/src/_trans_arr.c
new file mode 100644
index 0000000..3a7c843
--- /dev/null
+++ b/src/_trans_arr.c
@@ -0,0 +1,952 @@
1static inline cube_t
2flipallcorners(cube_t c)
3{
4 uint8_t i, piece, orien;
5 cube_t ret;
6
7 ret = c;
8 for (i = 0; i < 8; i++) {
9 piece = get_corner(c, i);
10 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
11 set_corner(ret, i, (piece & _pbits) | orien);
12 }
13
14 return ret;
15}
16
17static inline cube_t
18inline_trans_UFr(cube_t c)
19{
20 cube_t ret;
21 cube_t tn = {
22 .c = {0, 1, 2, 3, 4, 5, 6, 7},
23 .e = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
24 };
25 cube_t ti = {
26 .c = {0, 1, 2, 3, 4, 5, 6, 7},
27 .e = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
28 };
29
30 ret = compose(tn, c);
31 ret = compose(ret, ti);
32
33 return ret;
34}
35
36static inline cube_t
37inline_trans_ULr(cube_t c)
38{
39 cube_t ret;
40 cube_t tn = {
41 .c = {4, 5, 7, 6, 1, 0, 2, 3},
42 .e = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24}
43 };
44 cube_t ti = {
45 .c = {5, 4, 6, 7, 0, 1, 3, 2},
46 .e = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26}
47 };
48
49 ret = compose(tn, c);
50 ret = compose(ret, ti);
51
52 return ret;
53}
54
55static inline cube_t
56inline_trans_UBr(cube_t c)
57{
58 cube_t ret;
59 cube_t tn = {
60 .c = {1, 0, 3, 2, 5, 4, 7, 6},
61 .e = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9}
62 };
63 cube_t ti = {
64 .c = {1, 0, 3, 2, 5, 4, 7, 6},
65 .e = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9}
66 };
67
68 ret = compose(tn, c);
69 ret = compose(ret, ti);
70
71 return ret;
72}
73
74static inline cube_t
75inline_trans_URr(cube_t c)
76{
77 cube_t ret;
78 cube_t tn = {
79 .c = {5, 4, 6, 7, 0, 1, 3, 2},
80 .e = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26}
81 };
82 cube_t ti = {
83 .c = {4, 5, 7, 6, 1, 0, 2, 3},
84 .e = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24}
85 };
86
87 ret = compose(tn, c);
88 ret = compose(ret, ti);
89
90 return ret;
91}
92
93static inline cube_t
94inline_trans_DFr(cube_t c)
95{
96 cube_t ret;
97 cube_t tn = {
98 .c = {2, 3, 0, 1, 6, 7, 4, 5},
99 .e = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10}
100 };
101 cube_t ti = {
102 .c = {2, 3, 0, 1, 6, 7, 4, 5},
103 .e = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10}
104 };
105
106 ret = compose(tn, c);
107 ret = compose(ret, ti);
108
109 return ret;
110}
111
112static inline cube_t
113inline_trans_DLr(cube_t c)
114{
115 cube_t ret;
116 cube_t tn = {
117 .c = {7, 6, 4, 5, 2, 3, 1, 0},
118 .e = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27}
119 };
120 cube_t ti = {
121 .c = {7, 6, 4, 5, 2, 3, 1, 0},
122 .e = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27}
123 };
124
125 ret = compose(tn, c);
126 ret = compose(ret, ti);
127
128 return ret;
129}
130
131static inline cube_t
132inline_trans_DBr(cube_t c)
133{
134 cube_t ret;
135 cube_t tn = {
136 .c = {3, 2, 1, 0, 7, 6, 5, 4},
137 .e = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8}
138 };
139 cube_t ti = {
140 .c = {3, 2, 1, 0, 7, 6, 5, 4},
141 .e = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8}
142 };
143
144 ret = compose(tn, c);
145 ret = compose(ret, ti);
146
147 return ret;
148}
149
150static inline cube_t
151inline_trans_DRr(cube_t c)
152{
153 cube_t ret;
154 cube_t tn = {
155 .c = {6, 7, 5, 4, 3, 2, 0, 1},
156 .e = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25}
157 };
158 cube_t ti = {
159 .c = {6, 7, 5, 4, 3, 2, 0, 1},
160 .e = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25}
161 };
162
163 ret = compose(tn, c);
164 ret = compose(ret, ti);
165
166 return ret;
167}
168
169static inline cube_t
170inline_trans_RUr(cube_t c)
171{
172 cube_t ret;
173 cube_t tn = {
174 .c = {64, 67, 65, 66, 37, 38, 36, 39},
175 .e = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3}
176 };
177 cube_t ti = {
178 .c = {32, 34, 35, 33, 70, 68, 69, 71},
179 .e = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21}
180 };
181
182 ret = compose(tn, c);
183 ret = compose(ret, ti);
184
185 return ret;
186}
187
188static inline cube_t
189inline_trans_RFr(cube_t c)
190{
191 cube_t ret;
192 cube_t tn = {
193 .c = {38, 37, 36, 39, 64, 67, 66, 65},
194 .e = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18}
195 };
196 cube_t ti = {
197 .c = {36, 39, 38, 37, 66, 65, 64, 67},
198 .e = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17}
199 };
200
201 ret = compose(tn, c);
202 ret = compose(ret, ti);
203
204 return ret;
205}
206
207static inline cube_t
208inline_trans_RDr(cube_t c)
209{
210 cube_t ret;
211 cube_t tn = {
212 .c = {67, 64, 66, 65, 38, 37, 39, 36},
213 .e = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1}
214 };
215 cube_t ti = {
216 .c = {33, 35, 34, 32, 71, 69, 68, 70},
217 .e = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20}
218 };
219
220 ret = compose(tn, c);
221 ret = compose(ret, ti);
222
223 return ret;
224}
225
226static inline cube_t
227inline_trans_RBr(cube_t c)
228{
229 cube_t ret;
230 cube_t tn = {
231 .c = {37, 38, 39, 36, 67, 64, 65, 66},
232 .e = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16}
233 };
234 cube_t ti = {
235 .c = {37, 38, 39, 36, 67, 64, 65, 66},
236 .e = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16}
237 };
238
239 ret = compose(tn, c);
240 ret = compose(ret, ti);
241
242 return ret;
243}
244
245static inline cube_t
246inline_trans_LUr(cube_t c)
247{
248 cube_t ret;
249 cube_t tn = {
250 .c = {65, 66, 64, 67, 36, 39, 37, 38},
251 .e = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2}
252 };
253 cube_t ti = {
254 .c = {34, 32, 33, 35, 68, 70, 71, 69},
255 .e = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23}
256 };
257
258 ret = compose(tn, c);
259 ret = compose(ret, ti);
260
261 return ret;
262}
263
264static inline cube_t
265inline_trans_LFr(cube_t c)
266{
267 cube_t ret;
268 cube_t tn = {
269 .c = {36, 39, 38, 37, 66, 65, 64, 67},
270 .e = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17}
271 };
272 cube_t ti = {
273 .c = {38, 37, 36, 39, 64, 67, 66, 65},
274 .e = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18}
275 };
276
277 ret = compose(tn, c);
278 ret = compose(ret, ti);
279
280 return ret;
281}
282
283static inline cube_t
284inline_trans_LDr(cube_t c)
285{
286 cube_t ret;
287 cube_t tn = {
288 .c = {66, 65, 67, 64, 39, 36, 38, 37},
289 .e = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0}
290 };
291 cube_t ti = {
292 .c = {35, 33, 32, 34, 69, 71, 70, 68},
293 .e = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22}
294 };
295
296 ret = compose(tn, c);
297 ret = compose(ret, ti);
298
299 return ret;
300}
301
302static inline cube_t
303inline_trans_LBr(cube_t c)
304{
305 cube_t ret;
306 cube_t tn = {
307 .c = {39, 36, 37, 38, 65, 66, 67, 64},
308 .e = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19}
309 };
310 cube_t ti = {
311 .c = {39, 36, 37, 38, 65, 66, 67, 64},
312 .e = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19}
313 };
314
315 ret = compose(tn, c);
316 ret = compose(ret, ti);
317
318 return ret;
319}
320
321static inline cube_t
322inline_trans_FUr(cube_t c)
323{
324 cube_t ret;
325 cube_t tn = {
326 .c = {68, 70, 69, 71, 32, 34, 33, 35},
327 .e = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6}
328 };
329 cube_t ti = {
330 .c = {68, 70, 69, 71, 32, 34, 33, 35},
331 .e = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6}
332 };
333
334 ret = compose(tn, c);
335 ret = compose(ret, ti);
336
337 return ret;
338}
339
340static inline cube_t
341inline_trans_FRr(cube_t c)
342{
343 cube_t ret;
344 cube_t tn = {
345 .c = {32, 34, 35, 33, 70, 68, 69, 71},
346 .e = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21}
347 };
348 cube_t ti = {
349 .c = {64, 67, 65, 66, 37, 38, 36, 39},
350 .e = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3}
351 };
352
353 ret = compose(tn, c);
354 ret = compose(ret, ti);
355
356 return ret;
357}
358
359static inline cube_t
360inline_trans_FDr(cube_t c)
361{
362 cube_t ret;
363 cube_t tn = {
364 .c = {70, 68, 71, 69, 34, 32, 35, 33},
365 .e = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4}
366 };
367 cube_t ti = {
368 .c = {69, 71, 68, 70, 33, 35, 32, 34},
369 .e = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7}
370 };
371
372 ret = compose(tn, c);
373 ret = compose(ret, ti);
374
375 return ret;
376}
377
378static inline cube_t
379inline_trans_FLr(cube_t c)
380{
381 cube_t ret;
382 cube_t tn = {
383 .c = {34, 32, 33, 35, 68, 70, 71, 69},
384 .e = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23}
385 };
386 cube_t ti = {
387 .c = {65, 66, 64, 67, 36, 39, 37, 38},
388 .e = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2}
389 };
390
391 ret = compose(tn, c);
392 ret = compose(ret, ti);
393
394 return ret;
395}
396
397static inline cube_t
398inline_trans_BUr(cube_t c)
399{
400 cube_t ret;
401 cube_t tn = {
402 .c = {69, 71, 68, 70, 33, 35, 32, 34},
403 .e = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7}
404 };
405 cube_t ti = {
406 .c = {70, 68, 71, 69, 34, 32, 35, 33},
407 .e = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4}
408 };
409
410 ret = compose(tn, c);
411 ret = compose(ret, ti);
412
413 return ret;
414}
415
416static inline cube_t
417inline_trans_BRr(cube_t c)
418{
419 cube_t ret;
420 cube_t tn = {
421 .c = {35, 33, 32, 34, 69, 71, 70, 68},
422 .e = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22}
423 };
424 cube_t ti = {
425 .c = {66, 65, 67, 64, 39, 36, 38, 37},
426 .e = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0}
427 };
428
429 ret = compose(tn, c);
430 ret = compose(ret, ti);
431
432 return ret;
433}
434
435static inline cube_t
436inline_trans_BDr(cube_t c)
437{
438 cube_t ret;
439 cube_t tn = {
440 .c = {71, 69, 70, 68, 35, 33, 34, 32},
441 .e = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5}
442 };
443 cube_t ti = {
444 .c = {71, 69, 70, 68, 35, 33, 34, 32},
445 .e = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5}
446 };
447
448 ret = compose(tn, c);
449 ret = compose(ret, ti);
450
451 return ret;
452}
453
454static inline cube_t
455inline_trans_BLr(cube_t c)
456{
457 cube_t ret;
458 cube_t tn = {
459 .c = {33, 35, 34, 32, 71, 69, 68, 70},
460 .e = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20}
461 };
462 cube_t ti = {
463 .c = {67, 64, 66, 65, 38, 37, 39, 36},
464 .e = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1}
465 };
466
467 ret = compose(tn, c);
468 ret = compose(ret, ti);
469
470 return ret;
471}
472
473static inline cube_t
474inline_trans_UFm(cube_t c)
475{
476 cube_t ret;
477 cube_t tn = {
478 .c = {4, 5, 6, 7, 0, 1, 2, 3},
479 .e = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10}
480 };
481 cube_t ti = {
482 .c = {4, 5, 6, 7, 0, 1, 2, 3},
483 .e = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10}
484 };
485
486 ret = compose(tn, c);
487 ret = compose(ret, ti);
488 ret = flipallcorners(ret);
489
490 return ret;
491}
492
493static inline cube_t
494inline_trans_ULm(cube_t c)
495{
496 cube_t ret;
497 cube_t tn = {
498 .c = {0, 1, 3, 2, 5, 4, 6, 7},
499 .e = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25}
500 };
501 cube_t ti = {
502 .c = {0, 1, 3, 2, 5, 4, 6, 7},
503 .e = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25}
504 };
505
506 ret = compose(tn, c);
507 ret = compose(ret, ti);
508 ret = flipallcorners(ret);
509
510 return ret;
511}
512
513static inline cube_t
514inline_trans_UBm(cube_t c)
515{
516 cube_t ret;
517 cube_t tn = {
518 .c = {5, 4, 7, 6, 1, 0, 3, 2},
519 .e = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8}
520 };
521 cube_t ti = {
522 .c = {5, 4, 7, 6, 1, 0, 3, 2},
523 .e = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8}
524 };
525
526 ret = compose(tn, c);
527 ret = compose(ret, ti);
528 ret = flipallcorners(ret);
529
530 return ret;
531}
532
533static inline cube_t
534inline_trans_URm(cube_t c)
535{
536 cube_t ret;
537 cube_t tn = {
538 .c = {1, 0, 2, 3, 4, 5, 7, 6},
539 .e = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27}
540 };
541 cube_t ti = {
542 .c = {1, 0, 2, 3, 4, 5, 7, 6},
543 .e = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27}
544 };
545
546 ret = compose(tn, c);
547 ret = compose(ret, ti);
548 ret = flipallcorners(ret);
549
550 return ret;
551}
552
553static inline cube_t
554inline_trans_DFm(cube_t c)
555{
556 cube_t ret;
557 cube_t tn = {
558 .c = {6, 7, 4, 5, 2, 3, 0, 1},
559 .e = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11}
560 };
561 cube_t ti = {
562 .c = {6, 7, 4, 5, 2, 3, 0, 1},
563 .e = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11}
564 };
565
566 ret = compose(tn, c);
567 ret = compose(ret, ti);
568 ret = flipallcorners(ret);
569
570 return ret;
571}
572
573static inline cube_t
574inline_trans_DLm(cube_t c)
575{
576 cube_t ret;
577 cube_t tn = {
578 .c = {3, 2, 0, 1, 6, 7, 5, 4},
579 .e = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26}
580 };
581 cube_t ti = {
582 .c = {2, 3, 1, 0, 7, 6, 4, 5},
583 .e = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24}
584 };
585
586 ret = compose(tn, c);
587 ret = compose(ret, ti);
588 ret = flipallcorners(ret);
589
590 return ret;
591}
592
593static inline cube_t
594inline_trans_DBm(cube_t c)
595{
596 cube_t ret;
597 cube_t tn = {
598 .c = {7, 6, 5, 4, 3, 2, 1, 0},
599 .e = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9}
600 };
601 cube_t ti = {
602 .c = {7, 6, 5, 4, 3, 2, 1, 0},
603 .e = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9}
604 };
605
606 ret = compose(tn, c);
607 ret = compose(ret, ti);
608 ret = flipallcorners(ret);
609
610 return ret;
611}
612
613static inline cube_t
614inline_trans_DRm(cube_t c)
615{
616 cube_t ret;
617 cube_t tn = {
618 .c = {2, 3, 1, 0, 7, 6, 4, 5},
619 .e = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24}
620 };
621 cube_t ti = {
622 .c = {3, 2, 0, 1, 6, 7, 5, 4},
623 .e = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26}
624 };
625
626 ret = compose(tn, c);
627 ret = compose(ret, ti);
628 ret = flipallcorners(ret);
629
630 return ret;
631}
632
633static inline cube_t
634inline_trans_RUm(cube_t c)
635{
636 cube_t ret;
637 cube_t tn = {
638 .c = {68, 71, 69, 70, 33, 34, 32, 35},
639 .e = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3}
640 };
641 cube_t ti = {
642 .c = {70, 68, 69, 71, 32, 34, 35, 33},
643 .e = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22}
644 };
645
646 ret = compose(tn, c);
647 ret = compose(ret, ti);
648 ret = flipallcorners(ret);
649
650 return ret;
651}
652
653static inline cube_t
654inline_trans_RFm(cube_t c)
655{
656 cube_t ret;
657 cube_t tn = {
658 .c = {34, 33, 32, 35, 68, 71, 70, 69},
659 .e = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18}
660 };
661 cube_t ti = {
662 .c = {66, 65, 64, 67, 36, 39, 38, 37},
663 .e = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18}
664 };
665
666 ret = compose(tn, c);
667 ret = compose(ret, ti);
668 ret = flipallcorners(ret);
669
670 return ret;
671}
672
673static inline cube_t
674inline_trans_RDm(cube_t c)
675{
676 cube_t ret;
677 cube_t tn = {
678 .c = {71, 68, 70, 69, 34, 33, 35, 32},
679 .e = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1}
680 };
681 cube_t ti = {
682 .c = {71, 69, 68, 70, 33, 35, 34, 32},
683 .e = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23}
684 };
685
686 ret = compose(tn, c);
687 ret = compose(ret, ti);
688 ret = flipallcorners(ret);
689
690 return ret;
691}
692
693static inline cube_t
694inline_trans_RBm(cube_t c)
695{
696 cube_t ret;
697 cube_t tn = {
698 .c = {33, 34, 35, 32, 71, 68, 69, 70},
699 .e = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16}
700 };
701 cube_t ti = {
702 .c = {67, 64, 65, 66, 37, 38, 39, 36},
703 .e = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19}
704 };
705
706 ret = compose(tn, c);
707 ret = compose(ret, ti);
708 ret = flipallcorners(ret);
709
710 return ret;
711}
712
713static inline cube_t
714inline_trans_LUm(cube_t c)
715{
716 cube_t ret;
717 cube_t tn = {
718 .c = {69, 70, 68, 71, 32, 35, 33, 34},
719 .e = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2}
720 };
721 cube_t ti = {
722 .c = {68, 70, 71, 69, 34, 32, 33, 35},
723 .e = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20}
724 };
725
726 ret = compose(tn, c);
727 ret = compose(ret, ti);
728 ret = flipallcorners(ret);
729
730 return ret;
731}
732
733static inline cube_t
734inline_trans_LFm(cube_t c)
735{
736 cube_t ret;
737 cube_t tn = {
738 .c = {32, 35, 34, 33, 70, 69, 68, 71},
739 .e = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17}
740 };
741 cube_t ti = {
742 .c = {64, 67, 66, 65, 38, 37, 36, 39},
743 .e = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17}
744 };
745
746 ret = compose(tn, c);
747 ret = compose(ret, ti);
748 ret = flipallcorners(ret);
749
750 return ret;
751}
752
753static inline cube_t
754inline_trans_LDm(cube_t c)
755{
756 cube_t ret;
757 cube_t tn = {
758 .c = {70, 69, 71, 68, 35, 32, 34, 33},
759 .e = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0}
760 };
761 cube_t ti = {
762 .c = {69, 71, 70, 68, 35, 33, 32, 34},
763 .e = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21}
764 };
765
766 ret = compose(tn, c);
767 ret = compose(ret, ti);
768 ret = flipallcorners(ret);
769
770 return ret;
771}
772
773static inline cube_t
774inline_trans_LBm(cube_t c)
775{
776 cube_t ret;
777 cube_t tn = {
778 .c = {35, 32, 33, 34, 69, 70, 71, 68},
779 .e = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19}
780 };
781 cube_t ti = {
782 .c = {65, 66, 67, 64, 39, 36, 37, 38},
783 .e = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16}
784 };
785
786 ret = compose(tn, c);
787 ret = compose(ret, ti);
788 ret = flipallcorners(ret);
789
790 return ret;
791}
792
793static inline cube_t
794inline_trans_FUm(cube_t c)
795{
796 cube_t ret;
797 cube_t tn = {
798 .c = {64, 66, 65, 67, 36, 38, 37, 39},
799 .e = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7}
800 };
801 cube_t ti = {
802 .c = {32, 34, 33, 35, 68, 70, 69, 71},
803 .e = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7}
804 };
805
806 ret = compose(tn, c);
807 ret = compose(ret, ti);
808 ret = flipallcorners(ret);
809
810 return ret;
811}
812
813static inline cube_t
814inline_trans_FRm(cube_t c)
815{
816 cube_t ret;
817 cube_t tn = {
818 .c = {36, 38, 39, 37, 66, 64, 65, 67},
819 .e = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20}
820 };
821 cube_t ti = {
822 .c = {37, 38, 36, 39, 64, 67, 65, 66},
823 .e = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2}
824 };
825
826 ret = compose(tn, c);
827 ret = compose(ret, ti);
828 ret = flipallcorners(ret);
829
830 return ret;
831}
832
833static inline cube_t
834inline_trans_FDm(cube_t c)
835{
836 cube_t ret;
837 cube_t tn = {
838 .c = {66, 64, 67, 65, 38, 36, 39, 37},
839 .e = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5}
840 };
841 cube_t ti = {
842 .c = {33, 35, 32, 34, 69, 71, 68, 70},
843 .e = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6}
844 };
845
846 ret = compose(tn, c);
847 ret = compose(ret, ti);
848 ret = flipallcorners(ret);
849
850 return ret;
851}
852
853static inline cube_t
854inline_trans_FLm(cube_t c)
855{
856 cube_t ret;
857 cube_t tn = {
858 .c = {38, 36, 37, 39, 64, 66, 67, 65},
859 .e = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22}
860 };
861 cube_t ti = {
862 .c = {36, 39, 37, 38, 65, 66, 64, 67},
863 .e = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3}
864 };
865
866 ret = compose(tn, c);
867 ret = compose(ret, ti);
868 ret = flipallcorners(ret);
869
870 return ret;
871}
872
873static inline cube_t
874inline_trans_BUm(cube_t c)
875{
876 cube_t ret;
877 cube_t tn = {
878 .c = {65, 67, 64, 66, 37, 39, 36, 38},
879 .e = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6}
880 };
881 cube_t ti = {
882 .c = {34, 32, 35, 33, 70, 68, 71, 69},
883 .e = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5}
884 };
885
886 ret = compose(tn, c);
887 ret = compose(ret, ti);
888 ret = flipallcorners(ret);
889
890 return ret;
891}
892
893static inline cube_t
894inline_trans_BRm(cube_t c)
895{
896 cube_t ret;
897 cube_t tn = {
898 .c = {39, 37, 36, 38, 65, 67, 66, 64},
899 .e = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23}
900 };
901 cube_t ti = {
902 .c = {39, 36, 38, 37, 66, 65, 67, 64},
903 .e = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1}
904 };
905
906 ret = compose(tn, c);
907 ret = compose(ret, ti);
908 ret = flipallcorners(ret);
909
910 return ret;
911}
912
913static inline cube_t
914inline_trans_BDm(cube_t c)
915{
916 cube_t ret;
917 cube_t tn = {
918 .c = {67, 65, 66, 64, 39, 37, 38, 36},
919 .e = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4}
920 };
921 cube_t ti = {
922 .c = {35, 33, 34, 32, 71, 69, 70, 68},
923 .e = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4}
924 };
925
926 ret = compose(tn, c);
927 ret = compose(ret, ti);
928 ret = flipallcorners(ret);
929
930 return ret;
931}
932
933static inline cube_t
934inline_trans_BLm(cube_t c)
935{
936 cube_t ret;
937 cube_t tn = {
938 .c = {37, 39, 38, 36, 67, 65, 64, 66},
939 .e = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21}
940 };
941 cube_t ti = {
942 .c = {38, 37, 39, 36, 67, 64, 66, 65},
943 .e = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0}
944 };
945
946 ret = compose(tn, c);
947 ret = compose(ret, ti);
948 ret = flipallcorners(ret);
949
950 return ret;
951}
952
diff --git a/src/_trans_avx2.c b/src/_trans_avx2.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/_trans_avx2.c
diff --git a/src/_trans_move_avx2.c b/src/_trans_move_avx2.c
deleted file mode 100644
index 38b825e..0000000
--- a/src/_trans_move_avx2.c
+++ /dev/null
@@ -1,2 +0,0 @@
1static cube_t trans_move_cube[48];
2static cube_t trans_move_cube_inverse[48];
diff --git a/src/cube.c b/src/cube.c
index fc04ee7..bb36447 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -2,17 +2,121 @@
2#include <stdbool.h> 2#include <stdbool.h>
3#include <string.h> 3#include <string.h>
4 4
5#ifdef CUBE_AVX2
6#include <immintrin.h>
7#endif
8
9#ifdef DEBUG 5#ifdef DEBUG
10#include <stdio.h> 6#include <stdio.h>
11#endif 7#endif
12 8
9#ifdef AVX2
10#include <immintrin.h>
11#endif
12
13#include "cube.h" 13#include "cube.h"
14 14
15#include "_constants.c" 15#define U 0U
16#define U2 1U
17#define U3 2U
18#define D 3U
19#define D2 4U
20#define D3 5U
21#define R 6U
22#define R2 7U
23#define R3 8U
24#define L 9U
25#define L2 10U
26#define L3 11U
27#define F 12U
28#define F2 13U
29#define F3 14U
30#define B 15U
31#define B2 16U
32#define B3 17U
33
34#define UFr 0
35#define ULr 1
36#define UBr 2
37#define URr 3
38#define DFr 4
39#define DLr 5
40#define DBr 6
41#define DRr 7
42#define RUr 8
43#define RFr 9
44#define RDr 10
45#define RBr 11
46#define LUr 12
47#define LFr 13
48#define LDr 14
49#define LBr 15
50#define FUr 16
51#define FRr 17
52#define FDr 18
53#define FLr 19
54#define BUr 20
55#define BRr 21
56#define BDr 22
57#define BLr 23
58
59#define UFm 24
60#define ULm 25
61#define UBm 26
62#define URm 27
63#define DFm 28
64#define DLm 29
65#define DBm 30
66#define DRm 31
67#define RUm 32
68#define RFm 33
69#define RDm 34
70#define RBm 35
71#define LUm 36
72#define LFm 37
73#define LDm 38
74#define LBm 39
75#define FUm 40
76#define FRm 41
77#define FDm 42
78#define FLm 43
79#define BUm 44
80#define BRm 45
81#define BDm 46
82#define BLm 47
83
84#define errormove 99U
85#define errortrans 99U
86
87#define _c_ufr 0U
88#define _c_ubl 1U
89#define _c_dfl 2U
90#define _c_dbr 3U
91#define _c_ufl 4U
92#define _c_ubr 5U
93#define _c_dfr 6U
94#define _c_dbl 7U
95
96#define _e_uf 0U
97#define _e_ub 1U
98#define _e_db 2U
99#define _e_df 3U
100#define _e_ur 4U
101#define _e_ul 5U
102#define _e_dl 6U
103#define _e_dr 7U
104#define _e_fr 8U
105#define _e_fl 9U
106#define _e_bl 10U
107#define _e_br 11U
108
109#define _eoshift 4U
110#define _coshift 5U
111
112#define _pbits 0xFU
113#define _eobit 0x10U
114#define _cobits 0xF0U
115#define _cobits2 0x60U
116#define _ctwist_cw 0x20U
117#define _ctwist_ccw 0x40U
118#define _eflip 0x10U
119#define _error 0xFFU
16 120
17cube_arr_t solvedcube_arr = { 121cube_arr_t solvedcube_arr = {
18 .c = {0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 122 .c = {0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -36,18 +140,133 @@ cube_arr_t zerocube_arr = { .e = {0}, .c = {0} };
36 _mm256_andnot_si256(cube, _mm256_slli_si256(_c, 0)), \ 140 _mm256_andnot_si256(cube, _mm256_slli_si256(_c, 0)), \
37 _mm256_and_si256(_mm256_set1_epi8(p), _mm256_slli_si256(_c, 0))) 141 _mm256_and_si256(_mm256_set1_epi8(p), _mm256_slli_si256(_c, 0)))
38 142
143#include "_moves_avx2.c"
144#include "_trans_avx2.c"
145
39#else 146#else
40 147
41#define setsolved(cube) cube = solvedcube_arr 148#define setsolved(cube) cube = solvedcube_arr
42#define setzero(cube) cube = zerocube_arr 149#define setzero(cube) cube = zerocube_arr
43#define _c _mm256_set_epi64x(0, 0, 0, 0xFF)
44#define get_edge(cube, i) (cube).e[(i)] 150#define get_edge(cube, i) (cube).e[(i)]
45#define get_corner(cube, i) (cube).c[(i)] 151#define get_corner(cube, i) (cube).c[(i)]
46#define set_edge(cube, i, p) (cube).e[(i)] = (p) 152#define set_edge(cube, i, p) (cube).e[(i)] = (p)
47#define set_corner(cube, i, p) (cube).c[(i)] = (p) 153#define set_corner(cube, i, p) (cube).c[(i)] = (p)
48 154
155#include "_moves_arr.c"
156#include "_trans_arr.c"
157
49#endif 158#endif
50 159
160
161static char *cornerstr[] = {
162 [_c_ufr] = "UFR",
163 [_c_ubl] = "UBL",
164 [_c_dfl] = "DFL",
165 [_c_dbr] = "DBR",
166 [_c_ufl] = "UFL",
167 [_c_ubr] = "UBR",
168 [_c_dfr] = "DFR",
169 [_c_dbl] = "DBL"
170};
171
172static char *cornerstralt[] = {
173 [_c_ufr] = "URF",
174 [_c_ubl] = "ULB",
175 [_c_dfl] = "DLF",
176 [_c_dbr] = "DRB",
177 [_c_ufl] = "ULF",
178 [_c_ubr] = "URB",
179 [_c_dfr] = "DRF",
180 [_c_dbl] = "DLB"
181};
182
183static char *edgestr[] = {
184 [_e_uf] = "UF",
185 [_e_ub] = "UB",
186 [_e_db] = "DB",
187 [_e_df] = "DF",
188 [_e_ur] = "UR",
189 [_e_ul] = "UL",
190 [_e_dl] = "DL",
191 [_e_dr] = "DR",
192 [_e_fr] = "FR",
193 [_e_fl] = "FL",
194 [_e_bl] = "BL",
195 [_e_br] = "BR"
196};
197
198static char *movestr[] = {
199 [U] = "U",
200 [U2] = "U2",
201 [U3] = "U'",
202 [D] = "D",
203 [D2] = "D2",
204 [D3] = "D'",
205 [R] = "R",
206 [R2] = "R2",
207 [R3] = "R'",
208 [L] = "L",
209 [L2] = "L2",
210 [L3] = "L'",
211 [F] = "F",
212 [F2] = "F2",
213 [F3] = "F'",
214 [B] = "B",
215 [B2] = "B2",
216 [B3] = "B'",
217};
218
219static char *transstr[] = {
220 [UFr] = "rotation UF",
221 [UFm] = "mirrored UF",
222 [ULr] = "rotation UL",
223 [ULm] = "mirrored UL",
224 [UBr] = "rotation UB",
225 [UBm] = "mirrored UB",
226 [URr] = "rotation UR",
227 [URm] = "mirrored UR",
228 [DFr] = "rotation DF",
229 [DFm] = "mirrored DF",
230 [DLr] = "rotation DL",
231 [DLm] = "mirrored DL",
232 [DBr] = "rotation DB",
233 [DBm] = "mirrored DB",
234 [DRr] = "rotation DR",
235 [DRm] = "mirrored DR",
236 [RUr] = "rotation RU",
237 [RUm] = "mirrored RU",
238 [RFr] = "rotation RF",
239 [RFm] = "mirrored RF",
240 [RDr] = "rotation RD",
241 [RDm] = "mirrored RD",
242 [RBr] = "rotation RB",
243 [RBm] = "mirrored RB",
244 [LUr] = "rotation LU",
245 [LUm] = "mirrored LU",
246 [LFr] = "rotation LF",
247 [LFm] = "mirrored LF",
248 [LDr] = "rotation LD",
249 [LDm] = "mirrored LD",
250 [LBr] = "rotation LB",
251 [LBm] = "mirrored LB",
252 [FUr] = "rotation FU",
253 [FUm] = "mirrored FU",
254 [FRr] = "rotation FR",
255 [FRm] = "mirrored FR",
256 [FDr] = "rotation FD",
257 [FDm] = "mirrored FD",
258 [FLr] = "rotation FL",
259 [FLm] = "mirrored FL",
260 [BUr] = "rotation BU",
261 [BUm] = "mirrored BU",
262 [BRr] = "rotation BR",
263 [BRm] = "mirrored BR",
264 [BDr] = "rotation BD",
265 [BDm] = "mirrored BD",
266 [BLr] = "rotation BL",
267 [BLm] = "mirrored BL",
268};
269
51static bool isconsistent(cube_t); 270static bool isconsistent(cube_t);
52static cube_t flipallcorners(cube_t); 271static cube_t flipallcorners(cube_t);
53static uint8_t readco(char *); 272static uint8_t readco(char *);
@@ -187,9 +406,9 @@ readcube(format_t format, char *buf)
187 ret = readcube_H48(buf); 406 ret = readcube_H48(buf);
188 break; 407 break;
189 default: 408 default:
190 #ifdef DEBUG 409#ifdef DEBUG
191 fprintf(stderr, "Cannot read cube in the given format\n"); 410 fprintf(stderr, "Cannot read cube in the given format\n");
192 #endif 411#endif
193 setzero(ret); 412 setzero(ret);
194 } 413 }
195 414
@@ -421,18 +640,6 @@ writetrans(trans_t t, char *buf)
421 buf[11] = '\0'; 640 buf[11] = '\0';
422} 641}
423 642
424move_t
425inverse_move(move_t m)
426{
427 return inverse_move_arr[m];
428}
429
430trans_t
431inverse_trans(trans_t t)
432{
433 return inverse_trans_arr[t];
434}
435
436static int 643static int
437permsign(uint8_t *a, int n) 644permsign(uint8_t *a, int n)
438{ 645{
@@ -617,11 +824,49 @@ move(cube_t c, move_t m)
617 } 824 }
618#endif 825#endif
619 826
620#ifdef CUBE_AVX2 827 switch (m) {
621#include "_move_logic_avx2.c" 828 case U:
622#else 829 return inline_move_U(c);
623#include "_move_logic_arr.c" 830 case U2:
831 return inline_move_U2(c);
832 case U3:
833 return inline_move_U3(c);
834 case D:
835 return inline_move_D(c);
836 case D2:
837 return inline_move_D2(c);
838 case D3:
839 return inline_move_D3(c);
840 case R:
841 return inline_move_R(c);
842 case R2:
843 return inline_move_R2(c);
844 case R3:
845 return inline_move_R3(c);
846 case L:
847 return inline_move_L(c);
848 case L2:
849 return inline_move_L2(c);
850 case L3:
851 return inline_move_L3(c);
852 case F:
853 return inline_move_F(c);
854 case F2:
855 return inline_move_F2(c);
856 case F3:
857 return inline_move_F3(c);
858 case B:
859 return inline_move_B(c);
860 case B2:
861 return inline_move_B2(c);
862 case B3:
863 return inline_move_B3(c);
864 default:
865#ifdef DEBUG
866 fprintf(stderr, "mover error, unknown move\n");
624#endif 867#endif
868 goto move_error;
869 }
625 870
626move_error: 871move_error:
627 setzero(err); 872 setzero(err);
@@ -696,56 +941,123 @@ compose(cube_t c1, cube_t c2)
696 return ret; 941 return ret;
697} 942}
698 943
699static cube_t
700flipallcorners(cube_t c)
701{
702/* TODO: optimize for avx2, can be a couple of instructions */
703
704 uint8_t i, piece, orien;
705 cube_t ret;
706
707 ret = c;
708 for (i = 0; i < 8; i++) {
709 piece = get_corner(c, i);
710 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
711 set_corner(ret, i, (piece & _pbits) | orien);
712 }
713
714 return ret;
715}
716
717cube_t 944cube_t
718transform(cube_t c, trans_t t) 945transform(cube_t c, trans_t t)
719{ 946{
720 cube_t ret, solved; 947 cube_t ret;
721 948
722#ifdef DEBUG 949#ifdef DEBUG
723 setzero(ret);
724 if (!isconsistent(c)) { 950 if (!isconsistent(c)) {
725 fprintf(stderr, "transform error, inconsistent cube\n"); 951 fprintf(stderr, "transform error, inconsistent cube\n");
726 return ret; 952 goto trans_error;
727 }
728 if (t >= 48) {
729 fprintf(stderr, "transform error, unknown transformation\n");
730 return ret;
731 } 953 }
732#endif 954#endif
733 955
734#ifdef CUBE_AVX2 956 switch (t) {
735#include "_trans_move_avx2.c" 957 case UFr:
736#else 958 return inline_trans_UFr(c);
737#include "_trans_move_arr.c" 959 case ULr:
960 return inline_trans_ULr(c);
961 case UBr:
962 return inline_trans_UBr(c);
963 case URr:
964 return inline_trans_URr(c);
965 case DFr:
966 return inline_trans_DFr(c);
967 case DLr:
968 return inline_trans_DLr(c);
969 case DBr:
970 return inline_trans_DBr(c);
971 case DRr:
972 return inline_trans_DRr(c);
973 case RUr:
974 return inline_trans_RUr(c);
975 case RFr:
976 return inline_trans_RFr(c);
977 case RDr:
978 return inline_trans_RDr(c);
979 case RBr:
980 return inline_trans_RBr(c);
981 case LUr:
982 return inline_trans_LUr(c);
983 case LFr:
984 return inline_trans_LFr(c);
985 case LDr:
986 return inline_trans_LDr(c);
987 case LBr:
988 return inline_trans_LBr(c);
989 case FUr:
990 return inline_trans_FUr(c);
991 case FRr:
992 return inline_trans_FRr(c);
993 case FDr:
994 return inline_trans_FDr(c);
995 case FLr:
996 return inline_trans_FLr(c);
997 case BUr:
998 return inline_trans_BUr(c);
999 case BRr:
1000 return inline_trans_BRr(c);
1001 case BDr:
1002 return inline_trans_BDr(c);
1003 case BLr:
1004 return inline_trans_BLr(c);
1005 case UFm:
1006 return inline_trans_UFm(c);
1007 case ULm:
1008 return inline_trans_ULm(c);
1009 case UBm:
1010 return inline_trans_UBm(c);
1011 case URm:
1012 return inline_trans_URm(c);
1013 case DFm:
1014 return inline_trans_DFm(c);
1015 case DLm:
1016 return inline_trans_DLm(c);
1017 case DBm:
1018 return inline_trans_DBm(c);
1019 case DRm:
1020 return inline_trans_DRm(c);
1021 case RUm:
1022 return inline_trans_RUm(c);
1023 case RFm:
1024 return inline_trans_RFm(c);
1025 case RDm:
1026 return inline_trans_RDm(c);
1027 case RBm:
1028 return inline_trans_RBm(c);
1029 case LUm:
1030 return inline_trans_LUm(c);
1031 case LFm:
1032 return inline_trans_LFm(c);
1033 case LDm:
1034 return inline_trans_LDm(c);
1035 case LBm:
1036 return inline_trans_LBm(c);
1037 case FUm:
1038 return inline_trans_FUm(c);
1039 case FRm:
1040 return inline_trans_FRm(c);
1041 case FDm:
1042 return inline_trans_FDm(c);
1043 case FLm:
1044 return inline_trans_FLm(c);
1045 case BUm:
1046 return inline_trans_BUm(c);
1047 case BRm:
1048 return inline_trans_BRm(c);
1049 case BDm:
1050 return inline_trans_BDm(c);
1051 case BLm:
1052 return inline_trans_BLm(c);
1053 default:
1054#ifdef DEBUG
1055 fprintf(stderr, "transform error, unknown transformation\n");
738#endif 1056#endif
1057 goto trans_error;
1058 }
739 1059
740 setsolved(solved); 1060trans_error:
741 1061 setzero(ret);
742 ret = compose(solved, trans_move_cube[t]);
743 ret = compose(ret, c);
744 ret = compose(ret, trans_move_cube_inverse[t]);
745
746 /* TODO: work out a better way to do this */
747 if (t >= 24)
748 ret = flipallcorners(ret);
749
750 return ret; 1062 return ret;
751} 1063}
diff --git a/src/cube.h b/src/cube.h
index fd0d3e8..9ddeefa 100644
--- a/src/cube.h
+++ b/src/cube.h
@@ -16,9 +16,6 @@ void writemoves(move_t *, int, char *);
16trans_t readtrans(char *); 16trans_t readtrans(char *);
17void writetrans(trans_t, char *); 17void writetrans(trans_t, char *);
18 18
19move_t inverse_move(move_t);
20trans_t inverse_trans(trans_t);
21
22typedef enum {H48, SRC} format_t; 19typedef enum {H48, SRC} format_t;
23cube_t readcube(format_t, char *); /* Supports: H48 */ 20cube_t readcube(format_t, char *); /* Supports: H48 */
24void writecube(format_t, cube_t, char *); /* Supports: H48, SRC */ 21void writecube(format_t, cube_t, char *); /* Supports: H48, SRC */
diff --git a/utils/gentranscode.sh b/utils/gentranscode.sh
index f820d7c..63888c6 100755
--- a/utils/gentranscode.sh
+++ b/utils/gentranscode.sh
@@ -3,15 +3,42 @@
3gcc -DDEBUG h48_to_src.c ../src/cube.c -o h48_to_src 3gcc -DDEBUG h48_to_src.c ../src/cube.c -o h48_to_src
4gcc -DDEBUG invert.c ../src/cube.c -o invert 4gcc -DDEBUG invert.c ../src/cube.c -o invert
5 5
6for f in transform_??_???.txt; do 6# Old version
7 trans="$(echo $f | sed 's/.*_// ; s/\.txt//')" 7genarray() {
8 printf '[%s] = ' "$trans" 8 for f in transform_??_???.txt; do
9 if [ "$1" = "-i" ]; then 9 trans="$(echo $f | sed 's/.*_// ; s/\.txt//')"
10 ./invert <"$f" | ./h48_to_src 10 printf '[%s] = ' "$trans"
11 else 11 if [ "$1" = "-i" ]; then
12 ./h48_to_src <"$f" 12 ./invert <"$f" | ./h48_to_src
13 fi 13 else
14 printf ',\n' 14 ./h48_to_src <"$f"
15done 15 fi
16 printf ',\n'
17 done
18}
16 19
20genfuncs() {
21 for f in transform_??_???.txt; do
22 trans="$(echo $f | sed 's/.*_// ; s/\.txt//')"
23 printf 'static inline cube_t\ninline_trans_%s' "$trans"
24 [ "$1" = "-i" ] && printf '_inverse'
25 printf '(cube_t c)\n{\n'
26 printf '\tcube_t ret;\n'
27 printf '\tcube_t tn = {\n'
28 ./h48_to_src <"$f" | sed 's/^/\t/' | \
29 tail -n 3 | head -n 2
30 printf '\t};\n\tcube_t ti = {\n'
31 ./invert <"$f" | ./h48_to_src | sed 's/^/\t/' | \
32 tail -n 3 | head -n 2
33 printf '\t};\n\n'
34 printf '\tret = compose(tn, c);\n'
35 printf '\tret = compose(ret, ti);\n'
36 if [ -n "$(echo "$trans" | grep "m")" ]; then
37 printf '\tret = flipallcorners(ret);\n'
38 fi
39 printf '\n\treturn ret;\n}\n\n'
40 done
41}
42
43genfuncs
17rm -f h48_to_src invert 44rm -f h48_to_src invert
diff --git a/utils/gentransswitch.sh b/utils/gentransswitch.sh
new file mode 100755
index 0000000..6883973
--- /dev/null
+++ b/utils/gentransswitch.sh
@@ -0,0 +1,8 @@
1#!/bin/sh
2
3printf '\tswitch (t) {\n'
4for f in transform_??_???.txt; do
5 t="$(echo $f | sed 's/.*_// ; s/\.txt//')"
6 printf '\tcase %s:\n\t\treturn inline_trans_%s(c);\n' "$t" "$t"
7done
8printf '\t}\n'

Generated with cgit - Back to sebastiano.tronto.net