aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenricotenuti <tenutz_27@outlook.it>2024-08-08 15:39:37 +0200
committerenricotenuti <tenutz_27@outlook.it>2024-08-08 15:39:37 +0200
commit4e7906014664ba878a8a7b5b3d30124234900dc0 (patch)
tree8550d254e62620f7fe6f7d9d498d0362e64c3706
parentc92122402bc82fb23c9021364f47c8f67455f81f (diff)
downloadnissy-core-4e7906014664ba878a8a7b5b3d30124234900dc0.tar.gz
nissy-core-4e7906014664ba878a8a7b5b3d30124234900dc0.zip
spaces fix
-rw-r--r--src/cube_neon.h110
-rwxr-xr-xtest/test.sh2
2 files changed, 39 insertions, 73 deletions
diff --git a/src/cube_neon.h b/src/cube_neon.h
index e01ea4c..fadc58d 100644
--- a/src/cube_neon.h
+++ b/src/cube_neon.h
@@ -6,18 +6,18 @@ typedef struct
6} cube_t; 6} cube_t;
7 7
8// static cube 8// static cube
9#define static_cube(c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl, \ 9#define static_cube(c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl, \
10 e_uf, e_ub, e_db, e_df, e_ur, e_ul, e_dl, e_dr, e_fr, e_fl, e_bl, e_br) \ 10 e_uf, e_ub, e_db, e_df, e_ur, e_ul, e_dl, e_dr, e_fr, e_fl, e_bl, e_br) \
11 ((cube_t){ \ 11 ((cube_t){ \
12 .corner = {c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl, 0, 0, 0, 0, 0, 0, 0, 0}, \ 12 .corner = {c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl, 0, 0, 0, 0, 0, 0, 0, 0}, \
13 .edge = {e_uf, e_ub, e_db, e_df, e_ur, e_ul, e_dl, e_dr, e_fr, e_fl, e_bl, e_br, 0, 0, 0, 0}}) 13 .edge = {e_uf, e_ub, e_db, e_df, e_ur, e_ul, e_dl, e_dr, e_fr, e_fl, e_bl, e_br, 0, 0, 0, 0}})
14 14
15// zero cube 15// zero cube
16#define zero \ 16#define zero \
17 (cube_t) \ 17 (cube_t) \
18 { \ 18 { \
19 .corner = vdupq_n_u8(0), \ 19 .corner = vdupq_n_u8(0), \
20 .edge = vdupq_n_u8(0) \ 20 .edge = vdupq_n_u8(0) \
21 } 21 }
22 22
23// solved cube 23// solved cube
@@ -28,10 +28,10 @@ typedef struct
28_static void pieces(cube_t *, uint8_t[static 8], uint8_t[static 12]); 28_static void pieces(cube_t *, uint8_t[static 8], uint8_t[static 12]);
29_static_inline bool equal(cube_t, cube_t); 29_static_inline bool equal(cube_t, cube_t);
30_static_inline cube_t invertco(cube_t); 30_static_inline cube_t invertco(cube_t);
31_static_inline cube_t compose_edges(cube_t, cube_t); // implementation similar to portable compose_edges_inplace 31_static_inline cube_t compose_edges(cube_t, cube_t);
32_static_inline cube_t compose_corners(cube_t, cube_t); // implementation similar to portable compose_corners_inplace 32_static_inline cube_t compose_corners(cube_t, cube_t);
33_static_inline uint8x16_t compose_edges_slim(uint8x16_t, uint8x16_t); // similar to compose_edges but without the cube_t struct 33_static_inline uint8x16_t compose_edges_slim(uint8x16_t, uint8x16_t);
34_static_inline uint8x16_t compose_corners_slim(uint8x16_t, uint8x16_t); // similar to compose_corners but without the cube_t struct 34_static_inline uint8x16_t compose_corners_slim(uint8x16_t, uint8x16_t);
35_static_inline cube_t compose(cube_t, cube_t); 35_static_inline cube_t compose(cube_t, cube_t);
36_static_inline cube_t inverse(cube_t); 36_static_inline cube_t inverse(cube_t);
37 37
@@ -82,7 +82,8 @@ equal(cube_t c1, cube_t c2)
82 return vgetq_lane_u64(cmp_result, 0) == ~0ULL && vgetq_lane_u64(cmp_result, 1) == ~0ULL; 82 return vgetq_lane_u64(cmp_result, 0) == ~0ULL && vgetq_lane_u64(cmp_result, 1) == ~0ULL;
83} 83}
84 84
85_static_inline cube_t invertco(cube_t c) 85_static_inline cube_t
86invertco(cube_t c)
86{ 87{
87 cube_t ret; 88 cube_t ret;
88 89
@@ -117,67 +118,24 @@ _static_inline cube_t invertco(cube_t c)
117 return ret; 118 return ret;
118} 119}
119 120
120_static_inline cube_t compose_edges(cube_t c1, cube_t c2) 121_static_inline cube_t
122compose_edges(cube_t c1, cube_t c2)
121{ 123{
122 cube_t ret = {0}; 124 cube_t ret = {0};
123 125 ret.edge = compose_edges_slim(c1.edge, c2.edge);
124 uint8x16_t edge1 = c1.edge;
125 uint8x16_t edge2 = c2.edge;
126
127 // Masks
128 uint8x16_t p_bits = vdupq_n_u8(_pbits);
129 uint8x16_t eo_bit = vdupq_n_u8(_eobit);
130
131 // Find the index and permutation
132 uint8x16_t p = vandq_u8(edge2, p_bits);
133 uint8x16_t piece1 = vqtbl1q_u8(edge1, p);
134
135 // Calculate the orientation through XOR
136 uint8x16_t orien = vandq_u8(veorq_u8(edge2, piece1), eo_bit);
137
138 // Combine the results
139 uint8x16_t result = vorrq_u8(vandq_u8(piece1, p_bits), orien);
140
141 // Mask to clear the last 32 bits of the result
142 uint8x16_t mask_last_32 = vsetq_lane_u32(0, vreinterpretq_u32_u8(result), 3);
143 result = vreinterpretq_u8_u32(mask_last_32);
144
145 ret.edge = result;
146 return ret; 126 return ret;
147} 127}
148 128
149_static_inline cube_t compose_corners(cube_t c1, cube_t c2) 129_static_inline cube_t
130compose_corners(cube_t c1, cube_t c2)
150{ 131{
151 cube_t ret = {0}; 132 cube_t ret = {0};
152 uint8x16_t corner1 = c1.corner; 133 ret.corner = compose_corners_slim(c1.corner, c2.corner);
153 uint8x16_t corner2 = c2.corner;
154
155 // Masks
156 uint8x16_t p_bits = vdupq_n_u8(_pbits);
157 uint8x16_t cobits = vdupq_n_u8(_cobits);
158 uint8x16_t cobits2 = vdupq_n_u8(_cobits2);
159 uint8x16_t twist_cw = vdupq_n_u8(_ctwist_cw);
160
161 // Find the index and permutation
162 uint8x16_t p = vandq_u8(corner2, p_bits);
163 uint8x16_t piece1 = vqtbl1q_u8(corner1, p);
164
165 // Calculate the orientation
166 uint8x16_t aux = vaddq_u8(vandq_u8(corner2, cobits), vandq_u8(piece1, cobits));
167 uint8x16_t auy = vshrq_n_u8(vaddq_u8(aux, twist_cw), 2);
168 uint8x16_t orien = vandq_u8(vaddq_u8(aux, auy), cobits2);
169
170 // Combine the results
171 uint8x16_t result = vorrq_u8(vandq_u8(piece1, p_bits), orien);
172
173 // Mask to clear the last 64 bits of the result
174 uint8x16_t mask_last_64 = vsetq_lane_u64(0, vreinterpretq_u64_u8(result), 1);
175 result = vreinterpretq_u8_u64(mask_last_64);
176
177 ret.corner = result;
178 return ret; 134 return ret;
179} 135}
180_static_inline uint8x16_t compose_edges_slim(uint8x16_t edge1, uint8x16_t edge2) 136
137_static_inline uint8x16_t
138compose_edges_slim(uint8x16_t edge1, uint8x16_t edge2)
181{ 139{
182 // Masks 140 // Masks
183 uint8x16_t p_bits = vdupq_n_u8(_pbits); 141 uint8x16_t p_bits = vdupq_n_u8(_pbits);
@@ -199,7 +157,9 @@ _static_inline uint8x16_t compose_edges_slim(uint8x16_t edge1, uint8x16_t edge2)
199 157
200 return ret; 158 return ret;
201} 159}
202_static_inline uint8x16_t compose_corners_slim(uint8x16_t corner1, uint8x16_t corner2) 160
161_static_inline uint8x16_t
162compose_corners_slim(uint8x16_t corner1, uint8x16_t corner2)
203{ 163{
204 // Masks 164 // Masks
205 uint8x16_t p_bits = vdupq_n_u8(_pbits); 165 uint8x16_t p_bits = vdupq_n_u8(_pbits);
@@ -225,7 +185,9 @@ _static_inline uint8x16_t compose_corners_slim(uint8x16_t corner1, uint8x16_t co
225 185
226 return ret; 186 return ret;
227} 187}
228_static_inline cube_t compose(cube_t c1, cube_t c2) 188
189_static_inline cube_t
190compose(cube_t c1, cube_t c2)
229{ 191{
230 cube_t ret = {0}; 192 cube_t ret = {0};
231 193
@@ -235,7 +197,8 @@ _static_inline cube_t compose(cube_t c1, cube_t c2)
235 return ret; 197 return ret;
236} 198}
237 199
238_static_inline cube_t inverse(cube_t cube) 200_static_inline cube_t
201inverse(cube_t cube)
239{ 202{
240 uint8_t i, piece, orien; 203 uint8_t i, piece, orien;
241 cube_t ret; 204 cube_t ret;
@@ -274,7 +237,8 @@ _static_inline cube_t inverse(cube_t cube)
274 return ret; 237 return ret;
275} 238}
276 239
277_static_inline int64_t coord_co(cube_t c) 240_static_inline int64_t
241coord_co(cube_t c)
278{ 242{
279 // Temp array to store the NEON vector 243 // Temp array to store the NEON vector
280 uint8_t mem[16]; 244 uint8_t mem[16];
@@ -311,7 +275,8 @@ coord_cocsep(cube_t c)
311 return (coord_co(c) << 7) + coord_csep(c); 275 return (coord_co(c) << 7) + coord_csep(c);
312} 276}
313 277
314_static_inline int64_t coord_eo(cube_t c) 278_static_inline int64_t
279coord_eo(cube_t c)
315{ 280{
316 int64_t ret = 0; 281 int64_t ret = 0;
317 int64_t p = 1; 282 int64_t p = 1;
@@ -328,7 +293,8 @@ _static_inline int64_t coord_eo(cube_t c)
328 return ret; 293 return ret;
329} 294}
330 295
331_static_inline int64_t coord_esep(cube_t c) 296_static_inline int64_t
297coord_esep(cube_t c)
332{ 298{
333 int64_t i, j, jj, k, l, ret1, ret2, bit1, bit2, is1; 299 int64_t i, j, jj, k, l, ret1, ret2, bit1, bit2, is1;
334 300
diff --git a/test/test.sh b/test/test.sh
index 4325c91..ce120eb 100755
--- a/test/test.sh
+++ b/test/test.sh
@@ -12,7 +12,7 @@ for t in test/*; do
12 continue 12 continue
13 fi 13 fi
14 14
15 # Verifica se $t รจ una directory e se il suo nome inizia con tre cifre 15 # Verify if $t is a directory and if its name starts with three digits
16 if [ -d "$t" ] && echo "$(basename "$t")" | grep -Eq '^[0-9]{3}'; then 16 if [ -d "$t" ] && echo "$(basename "$t")" | grep -Eq '^[0-9]{3}'; then
17 $CC -o $TESTBIN $t/*.c $CUBEOBJ || exit 1 17 $CC -o $TESTBIN $t/*.c $CUBEOBJ || exit 1
18 for cin in $t/*.in; do 18 for cin in $t/*.in; do

Generated with cgit - Back to sebastiano.tronto.net