diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2023-11-02 22:17:14 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2023-11-02 22:17:14 +0100 |
| commit | 9b1c9371333e20611ec5422e660ebec7e66c4261 (patch) | |
| tree | 4d0d0dbb27056871ab7c81c2903899e4e639b566 /src/cube.c | |
| parent | a61382e9dec22ea1ff3fea2d59d3c605c0aa2aac (diff) | |
| download | nissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.tar.gz nissy-core-9b1c9371333e20611ec5422e660ebec7e66c4261.zip | |
Added avx2 moves
Diffstat (limited to '')
| -rw-r--r-- | src/cube.c | 49 |
1 files changed, 44 insertions, 5 deletions
| @@ -269,6 +269,7 @@ static char *transstr[] = { | |||
| 269 | [BLm] = "mirrored BL", | 269 | [BLm] = "mirrored BL", |
| 270 | }; | 270 | }; |
| 271 | 271 | ||
| 272 | static inline cube_t inline_compose(cube_t, cube_t); | ||
| 272 | static bool isconsistent(cube_t); | 273 | static bool isconsistent(cube_t); |
| 273 | static cube_t flipallcorners(cube_t); | 274 | static cube_t flipallcorners(cube_t); |
| 274 | static uint8_t readco(char *); | 275 | static uint8_t readco(char *); |
| @@ -909,18 +910,49 @@ cube_t | |||
| 909 | inverse(cube_t c) | 910 | inverse(cube_t c) |
| 910 | { | 911 | { |
| 911 | /* TODO: optimize for avx2 */ | 912 | /* TODO: optimize for avx2 */ |
| 912 | uint8_t i, piece, orien; | ||
| 913 | cube_t ret; | 913 | cube_t ret; |
| 914 | 914 | ||
| 915 | setzero(ret); | ||
| 916 | |||
| 917 | #ifdef DEBUG | 915 | #ifdef DEBUG |
| 918 | if (!isconsistent(c)) { | 916 | if (!isconsistent(c)) { |
| 919 | fprintf(stderr, "inverse error, inconsistent cube\n"); | 917 | fprintf(stderr, "inverse error, inconsistent cube\n"); |
| 918 | setzero(ret); | ||
| 920 | return ret; | 919 | return ret; |
| 921 | } | 920 | } |
| 922 | #endif | 921 | #endif |
| 923 | 922 | ||
| 923 | #ifdef CUBE_AVX2 | ||
| 924 | /* Method taken from Andrew Skalski's vcube[1]. The addition sequence | ||
| 925 | * was generated using [2]. | ||
| 926 | * [1] https://github.com/Voltara/vcube | ||
| 927 | * [2] http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html | ||
| 928 | */ | ||
| 929 | cube_t v3, vi; | ||
| 930 | |||
| 931 | v3 = _mm256_shuffle_epi8(c, c); | ||
| 932 | v3 = _mm256_shuffle_epi8(v3, c); | ||
| 933 | vi = _mm256_shuffle_epi8(v3, v3); | ||
| 934 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 935 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 936 | vi = _mm256_shuffle_epi8(vi, v3); | ||
| 937 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 938 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 939 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 940 | vi = _mm256_shuffle_epi8(vi, c); | ||
| 941 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 942 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 943 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 944 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 945 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 946 | vi = _mm256_shuffle_epi8(vi, v3); | ||
| 947 | vi = _mm256_shuffle_epi8(vi, vi); | ||
| 948 | ret = _mm256_shuffle_epi8(vi, c); | ||
| 949 | |||
| 950 | return flipallcorners(ret); | ||
| 951 | #else | ||
| 952 | uint8_t i, piece, orien; | ||
| 953 | |||
| 954 | setzero(ret); | ||
| 955 | |||
| 924 | for (i = 0; i < 12; i++) { | 956 | for (i = 0; i < 12; i++) { |
| 925 | piece = get_edge(c, i); | 957 | piece = get_edge(c, i); |
| 926 | orien = piece & _eobit; | 958 | orien = piece & _eobit; |
| @@ -932,12 +964,13 @@ inverse(cube_t c) | |||
| 932 | orien = ((piece << 1) | (piece >> 1)) & _cobits2; | 964 | orien = ((piece << 1) | (piece >> 1)) & _cobits2; |
| 933 | set_corner(ret, piece & _pbits, i | orien); | 965 | set_corner(ret, piece & _pbits, i | orien); |
| 934 | } | 966 | } |
| 967 | #endif | ||
| 935 | 968 | ||
| 936 | return ret; | 969 | return ret; |
| 937 | } | 970 | } |
| 938 | 971 | ||
| 939 | cube_t | 972 | static inline cube_t |
| 940 | compose(cube_t c1, cube_t c2) | 973 | inline_compose(cube_t c1, cube_t c2) |
| 941 | { | 974 | { |
| 942 | cube_t ret; | 975 | cube_t ret; |
| 943 | 976 | ||
| @@ -992,6 +1025,12 @@ compose(cube_t c1, cube_t c2) | |||
| 992 | } | 1025 | } |
| 993 | 1026 | ||
| 994 | cube_t | 1027 | cube_t |
| 1028 | compose(cube_t c1, cube_t c2) | ||
| 1029 | { | ||
| 1030 | return inline_compose(c1, c2); | ||
| 1031 | } | ||
| 1032 | |||
| 1033 | cube_t | ||
| 995 | transform(cube_t c, trans_t t) | 1034 | transform(cube_t c, trans_t t) |
| 996 | { | 1035 | { |
| 997 | cube_t ret; | 1036 | cube_t ret; |
