h48

A prototype for an optimal Rubik's cube solver, work in progress.
git clone https://git.tronto.net/h48
Download | Log | Files | Refs | README | LICENSE

commit f034efca545cd215e878f525310910b27db24f36
parent 08efbd62ef956327924aaea1fcfa97fde4dc1678
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Thu,  2 Nov 2023 18:09:13 +0100

Added writecube AVX

Diffstat:
MREADME.md | 1-
Msrc/cube.c | 30++++++++++++++++++++++++++++++
Msrc/cube.h | 4++--
Atest/012_io_AVX_write/01_solved.in | 1+
Atest/012_io_AVX_write/01_solved.out | 4++++
Atest/012_io_AVX_write/02_scrambled.in | 1+
Atest/012_io_AVX_write/02_scrambled.out | 4++++
Atest/012_io_AVX_write/io_AVX_tests.c | 28++++++++++++++++++++++++++++
8 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md @@ -15,7 +15,6 @@ $ make test ### Make AVX2 work -* writecube to AVX2-src format (+ tests) * generate moves and transformations with scripts in utils/ * fix base get_ and set_ macros (constant arguments?) * optimize things that use get_ and set_ diff --git a/src/cube.c b/src/cube.c @@ -276,6 +276,7 @@ static uint8_t readep(char *); static uint8_t readmove(char); static uint8_t readmodifier(char); static cube_t readcube_H48(char *); +static void writecube_AVX(cube_t, char *); static void writecube_H48(cube_t, char *); static int writepiece_SRC(uint8_t, char *); static void writecube_SRC(cube_t, char *); @@ -420,6 +421,32 @@ readcube(format_t format, char *buf) } static void +writecube_AVX(cube_t cube, char *buf) +{ + int i, ptr; + uint8_t piece; + + memcpy(buf, "_mm256_set_epi8(\n\t0, 0, 0, 0, ", 30); + ptr = 30; + + for (i = 11; i >= 0; i--) { + piece = get_edge(cube, i); + ptr += writepiece_SRC(piece, buf + ptr); + } + + memcpy(buf+ptr-2, ",\n\t0, 0, 0, 0, 0, 0, 0, 0, ", 27); + ptr += 25; + + for (i = 7; i >= 0; i--) { + piece = get_corner(cube, i); + ptr += writepiece_SRC(piece, buf + ptr); + } + + memcpy(buf+ptr-2, "\n)\0", 3); +} + + +static void writecube_H48(cube_t cube, char *buf) { uint8_t piece, perm, orient; @@ -508,6 +535,9 @@ writecube(format_t format, cube_t cube, char *buf) } switch (format) { + case AVX: + writecube_AVX(cube, buf); + break; case H48: writecube_H48(cube, buf); break; diff --git a/src/cube.h b/src/cube.h @@ -16,9 +16,9 @@ void writemoves(move_t *, int, char *); trans_t readtrans(char *); void writetrans(trans_t, char *); -typedef enum {H48, SRC} format_t; +typedef enum {AVX, H48, SRC} format_t; cube_t readcube(format_t, char *); /* Supports: H48 */ -void writecube(format_t, cube_t, char *); /* Supports: H48, SRC */ +void writecube(format_t, cube_t, char *); /* Supports: AVX, H48, SRC */ cube_t solvedcube(void); cube_t zerocube(void); diff --git a/test/012_io_AVX_write/01_solved.in b/test/012_io_AVX_write/01_solved.in @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/test/012_io_AVX_write/01_solved.out b/test/012_io_AVX_write/01_solved.out @@ -0,0 +1,4 @@ +_mm256_set_epi8( + 0, 0, 0, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0 +) diff --git a/test/012_io_AVX_write/02_scrambled.in b/test/012_io_AVX_write/02_scrambled.in @@ -0,0 +1 @@ +FL0 DB0 UB1 FR0 UR0 DF0 UF0 BR1 UL1 BL1 DL0 DR0 DFR1 UFR1 UBR1 UFL2 DBR2 DFL0 DBL2 UBL0 diff --git a/test/012_io_AVX_write/02_scrambled.out b/test/012_io_AVX_write/02_scrambled.out @@ -0,0 +1,4 @@ +_mm256_set_epi8( + 0, 0, 0, 0, 7, 6, 26, 21, 27, 0, 3, 4, 8, 17, 2, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 71, 2, 67, 68, 37, 32, 38 +) diff --git a/test/012_io_AVX_write/io_AVX_tests.c b/test/012_io_AVX_write/io_AVX_tests.c @@ -0,0 +1,28 @@ +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> + +#include "../../src/cube.h" + +#define STRLENMAX 10000 + +int main() { + char *c, str[STRLENMAX]; + cube_t cube; + + for (c = str; (*c = getchar()) != EOF; c++) ; + *c = '\0'; + + cube = readcube(H48, str); + + if (iserror(cube)) { + printf("Error reading cube\n"); + } else if (!issolvable(cube)) { + printf("Cube is not solvable\n"); + } else { + writecube(AVX, cube, str); + printf("%s\n", str); + } + + return 0; +}