nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

constants.h (33544B)


      1 #define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0})
      2 #define SOLVED_ORIENTED_CUBE \
      3     ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 })
      4 
      5 #define MOVE_CUBE_U STATIC_CUBE( \
      6     5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
      7 #define MOVE_CUBE_U2 STATIC_CUBE( \
      8     1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
      9 #define MOVE_CUBE_U3 STATIC_CUBE( \
     10     4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
     11 #define MOVE_CUBE_D STATIC_CUBE( \
     12     0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
     13 #define MOVE_CUBE_D2 STATIC_CUBE( \
     14     0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
     15 #define MOVE_CUBE_D3 STATIC_CUBE( \
     16     0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
     17 #define MOVE_CUBE_R STATIC_CUBE( \
     18     70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
     19 #define MOVE_CUBE_R2 STATIC_CUBE( \
     20     3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
     21 #define MOVE_CUBE_R3 STATIC_CUBE( \
     22     69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
     23 #define MOVE_CUBE_L STATIC_CUBE( \
     24     0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
     25 #define MOVE_CUBE_L2 STATIC_CUBE( \
     26     0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
     27 #define MOVE_CUBE_L3 STATIC_CUBE( \
     28     0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
     29 #define MOVE_CUBE_F STATIC_CUBE( \
     30     36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
     31 #define MOVE_CUBE_F2 STATIC_CUBE( \
     32     2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
     33 #define MOVE_CUBE_F3 STATIC_CUBE( \
     34     38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
     35 #define MOVE_CUBE_B STATIC_CUBE( \
     36     0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
     37 #define MOVE_CUBE_B2 STATIC_CUBE( \
     38     0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
     39 #define MOVE_CUBE_B3 STATIC_CUBE( \
     40     0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
     41 
     42 #define TRANS_CUBE_UFr STATIC_CUBE( \
     43     0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
     44 #define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \
     45     0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
     46 #define TRANS_CUBE_ULr STATIC_CUBE( \
     47     4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
     48 #define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \
     49     5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
     50 #define TRANS_CUBE_UBr STATIC_CUBE( \
     51     1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
     52 #define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \
     53     1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
     54 #define TRANS_CUBE_URr STATIC_CUBE( \
     55     5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
     56 #define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \
     57     4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
     58 #define TRANS_CUBE_DFr STATIC_CUBE( \
     59     2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
     60 #define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \
     61     2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
     62 #define TRANS_CUBE_DLr STATIC_CUBE( \
     63     7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
     64 #define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \
     65     7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
     66 #define TRANS_CUBE_DBr STATIC_CUBE( \
     67     3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
     68 #define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \
     69     3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
     70 #define TRANS_CUBE_DRr STATIC_CUBE( \
     71     6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
     72 #define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \
     73     6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
     74 #define TRANS_CUBE_RUr STATIC_CUBE( \
     75     64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
     76 #define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \
     77     32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
     78 #define TRANS_CUBE_RFr STATIC_CUBE( \
     79     38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
     80 #define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \
     81     36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
     82 #define TRANS_CUBE_RDr STATIC_CUBE( \
     83     67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
     84 #define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \
     85     33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
     86 #define TRANS_CUBE_RBr STATIC_CUBE( \
     87     37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
     88 #define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \
     89     37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
     90 #define TRANS_CUBE_LUr STATIC_CUBE( \
     91     65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
     92 #define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \
     93     34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
     94 #define TRANS_CUBE_LFr STATIC_CUBE( \
     95     36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
     96 #define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \
     97     38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
     98 #define TRANS_CUBE_LDr STATIC_CUBE( \
     99     66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
    100 #define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \
    101     35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
    102 #define TRANS_CUBE_LBr STATIC_CUBE( \
    103     39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
    104 #define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \
    105     39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
    106 #define TRANS_CUBE_FUr STATIC_CUBE( \
    107     68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
    108 #define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \
    109     68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
    110 #define TRANS_CUBE_FRr STATIC_CUBE( \
    111     32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
    112 #define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \
    113     64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
    114 #define TRANS_CUBE_FDr STATIC_CUBE( \
    115     70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
    116 #define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \
    117     69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
    118 #define TRANS_CUBE_FLr STATIC_CUBE( \
    119     34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
    120 #define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \
    121     65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
    122 #define TRANS_CUBE_BUr STATIC_CUBE( \
    123     69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
    124 #define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \
    125     70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
    126 #define TRANS_CUBE_BRr STATIC_CUBE( \
    127     35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
    128 #define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \
    129     66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
    130 #define TRANS_CUBE_BDr STATIC_CUBE( \
    131     71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
    132 #define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \
    133     71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
    134 #define TRANS_CUBE_BLr STATIC_CUBE( \
    135     33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
    136 #define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \
    137     67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
    138 #define TRANS_CUBE_UFm STATIC_CUBE( \
    139     4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
    140 #define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \
    141     4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
    142 #define TRANS_CUBE_ULm STATIC_CUBE( \
    143     0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
    144 #define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \
    145     0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
    146 #define TRANS_CUBE_UBm STATIC_CUBE( \
    147     5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
    148 #define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \
    149     5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
    150 #define TRANS_CUBE_URm STATIC_CUBE( \
    151     1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
    152 #define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \
    153     1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
    154 #define TRANS_CUBE_DFm STATIC_CUBE( \
    155     6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
    156 #define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \
    157     6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
    158 #define TRANS_CUBE_DLm STATIC_CUBE( \
    159     3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
    160 #define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \
    161     2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
    162 #define TRANS_CUBE_DBm STATIC_CUBE( \
    163     7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
    164 #define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \
    165     7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
    166 #define TRANS_CUBE_DRm STATIC_CUBE( \
    167     2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
    168 #define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \
    169     3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
    170 #define TRANS_CUBE_RUm STATIC_CUBE( \
    171     68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
    172 #define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \
    173     70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
    174 #define TRANS_CUBE_RFm STATIC_CUBE( \
    175     34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
    176 #define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \
    177     66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
    178 #define TRANS_CUBE_RDm STATIC_CUBE( \
    179     71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
    180 #define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \
    181     71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
    182 #define TRANS_CUBE_RBm STATIC_CUBE( \
    183     33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
    184 #define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \
    185     67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
    186 #define TRANS_CUBE_LUm STATIC_CUBE( \
    187     69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
    188 #define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \
    189     68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
    190 #define TRANS_CUBE_LFm STATIC_CUBE( \
    191     32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
    192 #define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \
    193     64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
    194 #define TRANS_CUBE_LDm STATIC_CUBE( \
    195     70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
    196 #define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \
    197     69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
    198 #define TRANS_CUBE_LBm STATIC_CUBE( \
    199     35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
    200 #define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \
    201     65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
    202 #define TRANS_CUBE_FUm STATIC_CUBE( \
    203     64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
    204 #define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \
    205     32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
    206 #define TRANS_CUBE_FRm STATIC_CUBE( \
    207     36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
    208 #define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \
    209     37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
    210 #define TRANS_CUBE_FDm STATIC_CUBE( \
    211     66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
    212 #define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \
    213     33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
    214 #define TRANS_CUBE_FLm STATIC_CUBE( \
    215     38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
    216 #define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \
    217     36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
    218 #define TRANS_CUBE_BUm STATIC_CUBE( \
    219     65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
    220 #define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \
    221     34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
    222 #define TRANS_CUBE_BRm STATIC_CUBE( \
    223     39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
    224 #define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \
    225     39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
    226 #define TRANS_CUBE_BDm STATIC_CUBE( \
    227     67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
    228 #define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \
    229     35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
    230 #define TRANS_CUBE_BLm STATIC_CUBE( \
    231     37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
    232 #define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \
    233     38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
    234 
    235 #define MOVE_U  UINT8_C(0)
    236 #define MOVE_U2 UINT8_C(1)
    237 #define MOVE_U3 UINT8_C(2)
    238 #define MOVE_D  UINT8_C(3)
    239 #define MOVE_D2 UINT8_C(4)
    240 #define MOVE_D3 UINT8_C(5)
    241 #define MOVE_R  UINT8_C(6)
    242 #define MOVE_R2 UINT8_C(7)
    243 #define MOVE_R3 UINT8_C(8)
    244 #define MOVE_L  UINT8_C(9)
    245 #define MOVE_L2 UINT8_C(10)
    246 #define MOVE_L3 UINT8_C(11)
    247 #define MOVE_F  UINT8_C(12)
    248 #define MOVE_F2 UINT8_C(13)
    249 #define MOVE_F3 UINT8_C(14)
    250 #define MOVE_B  UINT8_C(15)
    251 #define MOVE_B2 UINT8_C(16)
    252 #define MOVE_B3 UINT8_C(17)
    253 
    254 #define MOVE_Uw  UINT8_C(18)
    255 #define MOVE_Uw2 UINT8_C(19)
    256 #define MOVE_Uw3 UINT8_C(20)
    257 #define MOVE_Dw  UINT8_C(21)
    258 #define MOVE_Dw2 UINT8_C(22)
    259 #define MOVE_Dw3 UINT8_C(23)
    260 #define MOVE_Rw  UINT8_C(24)
    261 #define MOVE_Rw2 UINT8_C(25)
    262 #define MOVE_Rw3 UINT8_C(26)
    263 #define MOVE_Lw  UINT8_C(27)
    264 #define MOVE_Lw2 UINT8_C(28)
    265 #define MOVE_Lw3 UINT8_C(29)
    266 #define MOVE_Fw  UINT8_C(30)
    267 #define MOVE_Fw2 UINT8_C(31)
    268 #define MOVE_Fw3 UINT8_C(32)
    269 #define MOVE_Bw  UINT8_C(33)
    270 #define MOVE_Bw2 UINT8_C(34)
    271 #define MOVE_Bw3 UINT8_C(35)
    272 
    273 #define MOVE_M   UINT8_C(36)
    274 #define MOVE_M2  UINT8_C(37)
    275 #define MOVE_M3  UINT8_C(38)
    276 #define MOVE_S   UINT8_C(39)
    277 #define MOVE_S2  UINT8_C(40)
    278 #define MOVE_S3  UINT8_C(41)
    279 #define MOVE_E   UINT8_C(42)
    280 #define MOVE_E2  UINT8_C(43)
    281 #define MOVE_E3  UINT8_C(44)
    282 
    283 #define MOVE_x   UINT8_C(45)
    284 #define MOVE_x2  UINT8_C(46)
    285 #define MOVE_x3  UINT8_C(47)
    286 #define MOVE_y   UINT8_C(48)
    287 #define MOVE_y2  UINT8_C(49)
    288 #define MOVE_y3  UINT8_C(50)
    289 #define MOVE_z   UINT8_C(51)
    290 #define MOVE_z2  UINT8_C(52)
    291 #define MOVE_z3  UINT8_C(53)
    292 
    293 #define TRANS_UFr UINT8_C(0)
    294 #define TRANS_ULr UINT8_C(1)
    295 #define TRANS_UBr UINT8_C(2)
    296 #define TRANS_URr UINT8_C(3)
    297 #define TRANS_DFr UINT8_C(4)
    298 #define TRANS_DLr UINT8_C(5)
    299 #define TRANS_DBr UINT8_C(6)
    300 #define TRANS_DRr UINT8_C(7)
    301 #define TRANS_RUr UINT8_C(8)
    302 #define TRANS_RFr UINT8_C(9)
    303 #define TRANS_RDr UINT8_C(10)
    304 #define TRANS_RBr UINT8_C(11)
    305 #define TRANS_LUr UINT8_C(12)
    306 #define TRANS_LFr UINT8_C(13)
    307 #define TRANS_LDr UINT8_C(14)
    308 #define TRANS_LBr UINT8_C(15)
    309 #define TRANS_FUr UINT8_C(16)
    310 #define TRANS_FRr UINT8_C(17)
    311 #define TRANS_FDr UINT8_C(18)
    312 #define TRANS_FLr UINT8_C(19)
    313 #define TRANS_BUr UINT8_C(20)
    314 #define TRANS_BRr UINT8_C(21)
    315 #define TRANS_BDr UINT8_C(22)
    316 #define TRANS_BLr UINT8_C(23)
    317 
    318 #define TRANS_UFm UINT8_C(24)
    319 #define TRANS_ULm UINT8_C(25)
    320 #define TRANS_UBm UINT8_C(26)
    321 #define TRANS_URm UINT8_C(27)
    322 #define TRANS_DFm UINT8_C(28)
    323 #define TRANS_DLm UINT8_C(29)
    324 #define TRANS_DBm UINT8_C(30)
    325 #define TRANS_DRm UINT8_C(31)
    326 #define TRANS_RUm UINT8_C(32)
    327 #define TRANS_RFm UINT8_C(33)
    328 #define TRANS_RDm UINT8_C(34)
    329 #define TRANS_RBm UINT8_C(35)
    330 #define TRANS_LUm UINT8_C(36)
    331 #define TRANS_LFm UINT8_C(37)
    332 #define TRANS_LDm UINT8_C(38)
    333 #define TRANS_LBm UINT8_C(39)
    334 #define TRANS_FUm UINT8_C(40)
    335 #define TRANS_FRm UINT8_C(41)
    336 #define TRANS_FDm UINT8_C(42)
    337 #define TRANS_FLm UINT8_C(43)
    338 #define TRANS_BUm UINT8_C(44)
    339 #define TRANS_BRm UINT8_C(45)
    340 #define TRANS_BDm UINT8_C(46)
    341 #define TRANS_BLm UINT8_C(47)
    342 
    343 #define AXIS_UD   UINT8_C(0)
    344 #define AXIS_RL   UINT8_C(1)
    345 #define AXIS_FB   UINT8_C(2)
    346 
    347 #define NMOVES           (1+MOVE_B3)
    348 #define NMOVES_EXTENDED  (1+MOVE_z3)
    349 #define NTRANS           (1+TRANS_BLm)
    350 
    351 #define MM_SINGLE(m)     (UINT64_C(1) << (uint64_t)(m))
    352 #define MM18_ALLMOVES    UINT64_C(0x3FFFF)
    353 #define MM18_NOHALFTURNS UINT64_C(0x2DB6D)
    354 #define MM18_FACE(m)     (UINT64_C(7) << (uint64_t)(m))
    355 #define MM18_EO          (\
    356     MM18_FACE(MOVE_U) | MM18_FACE(MOVE_D) |\
    357     MM18_FACE(MOVE_R) | MM18_FACE(MOVE_L) |\
    358     MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
    359 #define MM18_DR          (\
    360     MM18_FACE(MOVE_U) | MM18_FACE(MOVE_D) |\
    361     MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\
    362     MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2))
    363 #define MM18_HTR (MM18_ALLMOVES & ~MM18_NOHALFTURNS)
    364 
    365 #define TM_SINGLE(t)   (UINT64_C(1) << (uint64_t)(t))
    366 #define TM_ALLTRANS    UINT64_C(0xFFFFFFFFFFFF)
    367 #define TM_UDRLFIX     (\
    368     TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \
    369     TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \
    370     TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm))
    371 #define TM_UDFIX       (\
    372     TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
    373     TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
    374     TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
    375     TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
    376     TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
    377     TM_SINGLE(TRANS_DLm))
    378 
    379 #define CORNER_UFR      UINT8_C(0)
    380 #define CORNER_UBL      UINT8_C(1)
    381 #define CORNER_DFL      UINT8_C(2)
    382 #define CORNER_DBR      UINT8_C(3)
    383 #define CORNER_UFL      UINT8_C(4)
    384 #define CORNER_UBR      UINT8_C(5)
    385 #define CORNER_DFR      UINT8_C(6)
    386 #define CORNER_DBL      UINT8_C(7)
    387 
    388 #define EDGE_UF       UINT8_C(0)
    389 #define EDGE_UB       UINT8_C(1)
    390 #define EDGE_DB       UINT8_C(2)
    391 #define EDGE_DF       UINT8_C(3)
    392 #define EDGE_UR       UINT8_C(4)
    393 #define EDGE_UL       UINT8_C(5)
    394 #define EDGE_DL       UINT8_C(6)
    395 #define EDGE_DR       UINT8_C(7)
    396 #define EDGE_FR       UINT8_C(8)
    397 #define EDGE_FL       UINT8_C(9)
    398 #define EDGE_BL       UINT8_C(10)
    399 #define EDGE_BR       UINT8_C(11)
    400 
    401 #define ORIENTATION_UF UINT8_C(0)
    402 #define ORIENTATION_UR UINT8_C(1)
    403 #define ORIENTATION_UB UINT8_C(2)
    404 #define ORIENTATION_UL UINT8_C(3)
    405 #define ORIENTATION_DF UINT8_C(4)
    406 #define ORIENTATION_DR UINT8_C(5)
    407 #define ORIENTATION_DB UINT8_C(6)
    408 #define ORIENTATION_DL UINT8_C(7)
    409 #define ORIENTATION_RF UINT8_C(8)
    410 #define ORIENTATION_RD UINT8_C(9)
    411 #define ORIENTATION_RB UINT8_C(10)
    412 #define ORIENTATION_RU UINT8_C(11)
    413 #define ORIENTATION_LF UINT8_C(12)
    414 #define ORIENTATION_LD UINT8_C(13)
    415 #define ORIENTATION_LB UINT8_C(14)
    416 #define ORIENTATION_LU UINT8_C(15)
    417 #define ORIENTATION_FD UINT8_C(16)
    418 #define ORIENTATION_FR UINT8_C(17)
    419 #define ORIENTATION_FU UINT8_C(18)
    420 #define ORIENTATION_FL UINT8_C(19)
    421 #define ORIENTATION_BD UINT8_C(20)
    422 #define ORIENTATION_BR UINT8_C(21)
    423 #define ORIENTATION_BU UINT8_C(22)
    424 #define ORIENTATION_BL UINT8_C(23)
    425 
    426 /* This is only meant to work for the 18 base moves, for now */
    427 STATIC const uint64_t allowedmask[] = {
    428 	[MOVE_U  / 3] = UINT64_C(0x3FFF8),
    429 	[MOVE_D  / 3] = UINT64_C(0x3FFC0),
    430 	[MOVE_R  / 3] = UINT64_C(0x3FE3F),
    431 	[MOVE_L  / 3] = UINT64_C(0x3F03F),
    432 	[MOVE_F  / 3] = UINT64_C(0x38FFF),
    433 	[MOVE_B  / 3] = UINT64_C(0x00FFF),
    434 	[MOVE_Uw / 3] = 0,
    435 	[MOVE_Dw / 3] = 0,
    436 	[MOVE_Rw / 3] = 0,
    437 	[MOVE_Lw / 3] = 0,
    438 	[MOVE_Fw / 3] = 0,
    439 	[MOVE_Bw / 3] = 0,
    440 	[MOVE_M  / 3] = 0,
    441 	[MOVE_S  / 3] = 0,
    442 	[MOVE_E  / 3] = 0,
    443 	[MOVE_x  / 3] = 0,
    444 	[MOVE_y  / 3] = 0,
    445 	[MOVE_z  / 3] = 0,
    446 };
    447 
    448 STATIC const char *cornerstr[] = {
    449 	[CORNER_UFR] = "UFR",
    450 	[CORNER_UBL] = "UBL",
    451 	[CORNER_DFL] = "DFL",
    452 	[CORNER_DBR] = "DBR",
    453 	[CORNER_UFL] = "UFL",
    454 	[CORNER_UBR] = "UBR",
    455 	[CORNER_DFR] = "DFR",
    456 	[CORNER_DBL] = "DBL"
    457 };
    458 
    459 STATIC const char *cornerstralt[] = {
    460 	[CORNER_UFR] = "URF",
    461 	[CORNER_UBL] = "ULB",
    462 	[CORNER_DFL] = "DLF",
    463 	[CORNER_DBR] = "DRB",
    464 	[CORNER_UFL] = "ULF",
    465 	[CORNER_UBR] = "URB",
    466 	[CORNER_DFR] = "DRF",
    467 	[CORNER_DBL] = "DLB"
    468 };
    469 
    470 STATIC const char *edgestr[] = {
    471 	[EDGE_UF] = "UF",
    472 	[EDGE_UB] = "UB",
    473 	[EDGE_DB] = "DB",
    474 	[EDGE_DF] = "DF",
    475 	[EDGE_UR] = "UR",
    476 	[EDGE_UL] = "UL",
    477 	[EDGE_DL] = "DL",
    478 	[EDGE_DR] = "DR",
    479 	[EDGE_FR] = "FR",
    480 	[EDGE_FL] = "FL",
    481 	[EDGE_BL] = "BL",
    482 	[EDGE_BR] = "BR"
    483 };
    484 
    485 STATIC const char *movestr[] = {
    486 	[MOVE_U]  = "U",
    487 	[MOVE_U2] = "U2",
    488 	[MOVE_U3] = "U'",
    489 	[MOVE_D]  = "D",
    490 	[MOVE_D2] = "D2",
    491 	[MOVE_D3] = "D'",
    492 	[MOVE_R]  = "R",
    493 	[MOVE_R2] = "R2",
    494 	[MOVE_R3] = "R'",
    495 	[MOVE_L]  = "L",
    496 	[MOVE_L2] = "L2",
    497 	[MOVE_L3] = "L'",
    498 	[MOVE_F]  = "F",
    499 	[MOVE_F2] = "F2",
    500 	[MOVE_F3] = "F'",
    501 	[MOVE_B]  = "B",
    502 	[MOVE_B2] = "B2",
    503 	[MOVE_B3] = "B'",
    504 
    505 	[MOVE_Uw]  = "Uw",
    506 	[MOVE_Uw2] = "Uw2",
    507 	[MOVE_Uw3] = "Uw'",
    508 	[MOVE_Dw]  = "Dw",
    509 	[MOVE_Dw2] = "Dw2",
    510 	[MOVE_Dw3] = "Dw'",
    511 	[MOVE_Rw]  = "Rw",
    512 	[MOVE_Rw2] = "Rw2",
    513 	[MOVE_Rw3] = "Rw'",
    514 	[MOVE_Lw]  = "Lw",
    515 	[MOVE_Lw2] = "Lw2",
    516 	[MOVE_Lw3] = "Lw'",
    517 	[MOVE_Fw]  = "Fw",
    518 	[MOVE_Fw2] = "Fw2",
    519 	[MOVE_Fw3] = "Fw'",
    520 	[MOVE_Bw]  = "Bw",
    521 	[MOVE_Bw2] = "Bw2",
    522 	[MOVE_Bw3] = "Bw'",
    523 
    524 	[MOVE_M]  = "M",
    525 	[MOVE_M2] = "M2",
    526 	[MOVE_M3] = "M'",
    527 	[MOVE_S]  = "S",
    528 	[MOVE_S2] = "S2",
    529 	[MOVE_S3] = "S'",
    530 	[MOVE_E]  = "E",
    531 	[MOVE_E2] = "E2",
    532 	[MOVE_E3] = "E'",
    533 
    534 	[MOVE_x]  = "x",
    535 	[MOVE_x2] = "x2",
    536 	[MOVE_x3] = "x'",
    537 	[MOVE_y]  = "y",
    538 	[MOVE_y2] = "y2",
    539 	[MOVE_y3] = "y'",
    540 	[MOVE_z]  = "z",
    541 	[MOVE_z2] = "z2",
    542 	[MOVE_z3] = "z'",
    543 };
    544 
    545 STATIC const char *transstr[] = {
    546 	[TRANS_UFr] = "rotation UF",
    547 	[TRANS_UFm] = "mirrored UF",
    548 	[TRANS_ULr] = "rotation UL",
    549 	[TRANS_ULm] = "mirrored UL",
    550 	[TRANS_UBr] = "rotation UB",
    551 	[TRANS_UBm] = "mirrored UB",
    552 	[TRANS_URr] = "rotation UR",
    553 	[TRANS_URm] = "mirrored UR",
    554 	[TRANS_DFr] = "rotation DF",
    555 	[TRANS_DFm] = "mirrored DF",
    556 	[TRANS_DLr] = "rotation DL",
    557 	[TRANS_DLm] = "mirrored DL",
    558 	[TRANS_DBr] = "rotation DB",
    559 	[TRANS_DBm] = "mirrored DB",
    560 	[TRANS_DRr] = "rotation DR",
    561 	[TRANS_DRm] = "mirrored DR",
    562 	[TRANS_RUr] = "rotation RU",
    563 	[TRANS_RUm] = "mirrored RU",
    564 	[TRANS_RFr] = "rotation RF",
    565 	[TRANS_RFm] = "mirrored RF",
    566 	[TRANS_RDr] = "rotation RD",
    567 	[TRANS_RDm] = "mirrored RD",
    568 	[TRANS_RBr] = "rotation RB",
    569 	[TRANS_RBm] = "mirrored RB",
    570 	[TRANS_LUr] = "rotation LU",
    571 	[TRANS_LUm] = "mirrored LU",
    572 	[TRANS_LFr] = "rotation LF",
    573 	[TRANS_LFm] = "mirrored LF",
    574 	[TRANS_LDr] = "rotation LD",
    575 	[TRANS_LDm] = "mirrored LD",
    576 	[TRANS_LBr] = "rotation LB",
    577 	[TRANS_LBm] = "mirrored LB",
    578 	[TRANS_FUr] = "rotation FU",
    579 	[TRANS_FUm] = "mirrored FU",
    580 	[TRANS_FRr] = "rotation FR",
    581 	[TRANS_FRm] = "mirrored FR",
    582 	[TRANS_FDr] = "rotation FD",
    583 	[TRANS_FDm] = "mirrored FD",
    584 	[TRANS_FLr] = "rotation FL",
    585 	[TRANS_FLm] = "mirrored FL",
    586 	[TRANS_BUr] = "rotation BU",
    587 	[TRANS_BUm] = "mirrored BU",
    588 	[TRANS_BRr] = "rotation BR",
    589 	[TRANS_BRm] = "mirrored BR",
    590 	[TRANS_BDr] = "rotation BD",
    591 	[TRANS_BDm] = "mirrored BD",
    592 	[TRANS_BLr] = "rotation BL",
    593 	[TRANS_BLm] = "mirrored BL",
    594 };
    595 
    596 STATIC uint8_t inverse_trans_table[] = {
    597 	[TRANS_UFr] = TRANS_UFr,
    598 	[TRANS_UFm] = TRANS_UFm,
    599 	[TRANS_ULr] = TRANS_URr,
    600 	[TRANS_ULm] = TRANS_ULm,
    601 	[TRANS_UBr] = TRANS_UBr,
    602 	[TRANS_UBm] = TRANS_UBm,
    603 	[TRANS_URr] = TRANS_ULr,
    604 	[TRANS_URm] = TRANS_URm,
    605 	[TRANS_DFr] = TRANS_DFr,
    606 	[TRANS_DFm] = TRANS_DFm,
    607 	[TRANS_DLr] = TRANS_DLr,
    608 	[TRANS_DLm] = TRANS_DRm,
    609 	[TRANS_DBr] = TRANS_DBr,
    610 	[TRANS_DBm] = TRANS_DBm,
    611 	[TRANS_DRr] = TRANS_DRr,
    612 	[TRANS_DRm] = TRANS_DLm,
    613 	[TRANS_RUr] = TRANS_FRr,
    614 	[TRANS_RUm] = TRANS_FLm,
    615 	[TRANS_RFr] = TRANS_LFr,
    616 	[TRANS_RFm] = TRANS_RFm,
    617 	[TRANS_RDr] = TRANS_BLr,
    618 	[TRANS_RDm] = TRANS_BRm,
    619 	[TRANS_RBr] = TRANS_RBr,
    620 	[TRANS_RBm] = TRANS_LBm,
    621 	[TRANS_LUr] = TRANS_FLr,
    622 	[TRANS_LUm] = TRANS_FRm,
    623 	[TRANS_LFr] = TRANS_RFr,
    624 	[TRANS_LFm] = TRANS_LFm,
    625 	[TRANS_LDr] = TRANS_BRr,
    626 	[TRANS_LDm] = TRANS_BLm,
    627 	[TRANS_LBr] = TRANS_LBr,
    628 	[TRANS_LBm] = TRANS_RBm,
    629 	[TRANS_FUr] = TRANS_FUr,
    630 	[TRANS_FUm] = TRANS_FUm,
    631 	[TRANS_FRr] = TRANS_RUr,
    632 	[TRANS_FRm] = TRANS_LUm,
    633 	[TRANS_FDr] = TRANS_BUr,
    634 	[TRANS_FDm] = TRANS_BUm,
    635 	[TRANS_FLr] = TRANS_LUr,
    636 	[TRANS_FLm] = TRANS_RUm,
    637 	[TRANS_BUr] = TRANS_FDr,
    638 	[TRANS_BUm] = TRANS_FDm,
    639 	[TRANS_BRr] = TRANS_LDr,
    640 	[TRANS_BRm] = TRANS_RDm,
    641 	[TRANS_BDr] = TRANS_BDr,
    642 	[TRANS_BDm] = TRANS_BDm,
    643 	[TRANS_BLr] = TRANS_RDr,
    644 	[TRANS_BLm] = TRANS_LDm,
    645 };
    646 
    647 STATIC uint8_t trans_move_table[][3] = {
    648 	[TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F },
    649 	[TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F },
    650 	[TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L },
    651 	[TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R },
    652 	[TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B },
    653 	[TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B },
    654 	[TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R },
    655 	[TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L },
    656 	[TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F },
    657 	[TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F },
    658 	[TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L },
    659 	[TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R },
    660 	[TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B },
    661 	[TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B },
    662 	[TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R },
    663 	[TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L },
    664 	[TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U },
    665 	[TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U },
    666 	[TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F },
    667 	[TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F },
    668 	[TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D },
    669 	[TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D },
    670 	[TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B },
    671 	[TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B },
    672 	[TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U },
    673 	[TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U },
    674 	[TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F },
    675 	[TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F },
    676 	[TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D },
    677 	[TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D },
    678 	[TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B },
    679 	[TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B },
    680 	[TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U },
    681 	[TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U },
    682 	[TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R },
    683 	[TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L },
    684 	[TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D },
    685 	[TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D },
    686 	[TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L },
    687 	[TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R },
    688 	[TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U },
    689 	[TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U },
    690 	[TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R },
    691 	[TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L },
    692 	[TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D },
    693 	[TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D },
    694 	[TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L },
    695 	[TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R },
    696 };
    697 
    698 STATIC uint8_t orientation_moves[][3] = {
    699 	[ORIENTATION_UF] = { UINT8_MAX },
    700 	[ORIENTATION_UR] = { MOVE_y, UINT8_MAX },
    701 	[ORIENTATION_UB] = { MOVE_y2, UINT8_MAX },
    702 	[ORIENTATION_UL] = { MOVE_y3, UINT8_MAX },
    703 	[ORIENTATION_DF] = { MOVE_z2, UINT8_MAX },
    704 	[ORIENTATION_DR] = { MOVE_y, MOVE_z2, UINT8_MAX },
    705 	[ORIENTATION_DB] = { MOVE_y2, MOVE_z2, UINT8_MAX },
    706 	[ORIENTATION_DL] = { MOVE_y3, MOVE_z2, UINT8_MAX },
    707 	[ORIENTATION_RF] = { MOVE_z3, UINT8_MAX },
    708 	[ORIENTATION_RD] = { MOVE_z3, MOVE_y, UINT8_MAX },
    709 	[ORIENTATION_RB] = { MOVE_z3, MOVE_y2, UINT8_MAX },
    710 	[ORIENTATION_RU] = { MOVE_z3, MOVE_y3, UINT8_MAX },
    711 	[ORIENTATION_LF] = { MOVE_z, UINT8_MAX },
    712 	[ORIENTATION_LD] = { MOVE_z, MOVE_y3, UINT8_MAX },
    713 	[ORIENTATION_LB] = { MOVE_z, MOVE_y2, UINT8_MAX },
    714 	[ORIENTATION_LU] = { MOVE_z, MOVE_y, UINT8_MAX },
    715 	[ORIENTATION_FD] = { MOVE_x, UINT8_MAX },
    716 	[ORIENTATION_FR] = { MOVE_x, MOVE_y, UINT8_MAX },
    717 	[ORIENTATION_FU] = { MOVE_x, MOVE_y2, UINT8_MAX },
    718 	[ORIENTATION_FL] = { MOVE_x, MOVE_y3, UINT8_MAX },
    719 	[ORIENTATION_BD] = { MOVE_x3, MOVE_y2, UINT8_MAX },
    720 	[ORIENTATION_BR] = { MOVE_x3, MOVE_y, UINT8_MAX },
    721 	[ORIENTATION_BU] = { MOVE_x3, UINT8_MAX },
    722 	[ORIENTATION_BL] = { MOVE_x3, MOVE_y3, UINT8_MAX },
    723 };
    724 
    725 STATIC uint8_t orientation_transition_table[][3] = {
    726 	[ORIENTATION_UF] = { ORIENTATION_FD, ORIENTATION_UR, ORIENTATION_LF },
    727 	[ORIENTATION_UR] = { ORIENTATION_RD, ORIENTATION_UB, ORIENTATION_FR },
    728 	[ORIENTATION_UB] = { ORIENTATION_BD, ORIENTATION_UL, ORIENTATION_RB },
    729 	[ORIENTATION_UL] = { ORIENTATION_LD, ORIENTATION_UF, ORIENTATION_BL },
    730 	[ORIENTATION_DF] = { ORIENTATION_FU, ORIENTATION_DL, ORIENTATION_RF },
    731 	[ORIENTATION_DR] = { ORIENTATION_RU, ORIENTATION_DF, ORIENTATION_BR },
    732 	[ORIENTATION_DB] = { ORIENTATION_BU, ORIENTATION_DR, ORIENTATION_LB },
    733 	[ORIENTATION_DL] = { ORIENTATION_LU, ORIENTATION_DB, ORIENTATION_FL },
    734 	[ORIENTATION_RF] = { ORIENTATION_FL, ORIENTATION_RD, ORIENTATION_UF },
    735 	[ORIENTATION_RD] = { ORIENTATION_DL, ORIENTATION_RB, ORIENTATION_FD },
    736 	[ORIENTATION_RB] = { ORIENTATION_BL, ORIENTATION_RU, ORIENTATION_DB },
    737 	[ORIENTATION_RU] = { ORIENTATION_UL, ORIENTATION_RF, ORIENTATION_BU },
    738 	[ORIENTATION_LF] = { ORIENTATION_FR, ORIENTATION_LU, ORIENTATION_DF },
    739 	[ORIENTATION_LD] = { ORIENTATION_DR, ORIENTATION_LF, ORIENTATION_BD },
    740 	[ORIENTATION_LB] = { ORIENTATION_BR, ORIENTATION_LD, ORIENTATION_UB },
    741 	[ORIENTATION_LU] = { ORIENTATION_UR, ORIENTATION_LB, ORIENTATION_FU },
    742 	[ORIENTATION_FD] = { ORIENTATION_DB, ORIENTATION_FR, ORIENTATION_LD },
    743 	[ORIENTATION_FR] = { ORIENTATION_RB, ORIENTATION_FU, ORIENTATION_DR },
    744 	[ORIENTATION_FU] = { ORIENTATION_UB, ORIENTATION_FL, ORIENTATION_RU },
    745 	[ORIENTATION_FL] = { ORIENTATION_LB, ORIENTATION_FD, ORIENTATION_UL },
    746 	[ORIENTATION_BD] = { ORIENTATION_DF, ORIENTATION_BL, ORIENTATION_RD },
    747 	[ORIENTATION_BR] = { ORIENTATION_RF, ORIENTATION_BD, ORIENTATION_UR },
    748 	[ORIENTATION_BU] = { ORIENTATION_UF, ORIENTATION_BR, ORIENTATION_LU },
    749 	[ORIENTATION_BL] = { ORIENTATION_LF, ORIENTATION_BU, ORIENTATION_DL },
    750 };
    751 
    752 STATIC uint8_t orientation_trans[] = {
    753 	[ORIENTATION_UF] = TRANS_UFr,
    754 	[ORIENTATION_UR] = TRANS_URr,
    755 	[ORIENTATION_UB] = TRANS_UBr,
    756 	[ORIENTATION_UL] = TRANS_ULr,
    757 	[ORIENTATION_DF] = TRANS_DFr,
    758 	[ORIENTATION_DR] = TRANS_DRr,
    759 	[ORIENTATION_DB] = TRANS_DBr,
    760 	[ORIENTATION_DL] = TRANS_DLr,
    761 	[ORIENTATION_RF] = TRANS_RFr,
    762 	[ORIENTATION_RD] = TRANS_RDr,
    763 	[ORIENTATION_RB] = TRANS_RBr,
    764 	[ORIENTATION_RU] = TRANS_RUr,
    765 	[ORIENTATION_LF] = TRANS_LFr,
    766 	[ORIENTATION_LD] = TRANS_LDr,
    767 	[ORIENTATION_LB] = TRANS_LBr,
    768 	[ORIENTATION_LU] = TRANS_LUr,
    769 	[ORIENTATION_FD] = TRANS_FDr,
    770 	[ORIENTATION_FR] = TRANS_FRr,
    771 	[ORIENTATION_FU] = TRANS_FUr,
    772 	[ORIENTATION_FL] = TRANS_FLr,
    773 	[ORIENTATION_BD] = TRANS_BDr,
    774 	[ORIENTATION_BR] = TRANS_BRr,
    775 	[ORIENTATION_BU] = TRANS_BUr,
    776 	[ORIENTATION_BL] = TRANS_BLr,
    777 };
    778 
    779 typedef struct {
    780 	uint8_t move[3];
    781 	uint8_t rotation[4];
    782 } equivalent_moves_t;
    783 
    784 STATIC equivalent_moves_t equivalent_moves_table[] = {
    785 	[MOVE_U]   = {{MOVE_U,  UINT8_MAX}, {UINT8_MAX}},
    786 	[MOVE_U2]  = {{MOVE_U2, UINT8_MAX}, {UINT8_MAX}},
    787 	[MOVE_U3]  = {{MOVE_U3, UINT8_MAX}, {UINT8_MAX}},
    788 	[MOVE_D]   = {{MOVE_D,  UINT8_MAX}, {UINT8_MAX}},
    789 	[MOVE_D2]  = {{MOVE_D2, UINT8_MAX}, {UINT8_MAX}},
    790 	[MOVE_D3]  = {{MOVE_D3, UINT8_MAX}, {UINT8_MAX}},
    791 	[MOVE_R]   = {{MOVE_R,  UINT8_MAX}, {UINT8_MAX}},
    792 	[MOVE_R2]  = {{MOVE_R2, UINT8_MAX}, {UINT8_MAX}},
    793 	[MOVE_R3]  = {{MOVE_R3, UINT8_MAX}, {UINT8_MAX}},
    794 	[MOVE_L]   = {{MOVE_L,  UINT8_MAX}, {UINT8_MAX}},
    795 	[MOVE_L2]  = {{MOVE_L2, UINT8_MAX}, {UINT8_MAX}},
    796 	[MOVE_L3]  = {{MOVE_L3, UINT8_MAX}, {UINT8_MAX}},
    797 	[MOVE_F]   = {{MOVE_F,  UINT8_MAX}, {UINT8_MAX}},
    798 	[MOVE_F2]  = {{MOVE_F2, UINT8_MAX}, {UINT8_MAX}},
    799 	[MOVE_F3]  = {{MOVE_F3, UINT8_MAX}, {UINT8_MAX}},
    800 	[MOVE_B]   = {{MOVE_B,  UINT8_MAX}, {UINT8_MAX}},
    801 	[MOVE_B2]  = {{MOVE_B2, UINT8_MAX}, {UINT8_MAX}},
    802 	[MOVE_B3]  = {{MOVE_B3, UINT8_MAX}, {UINT8_MAX}},
    803 
    804 	[MOVE_Uw]  = {{MOVE_D,  UINT8_MAX}, {1, UINT8_MAX}},
    805 	[MOVE_Uw2] = {{MOVE_D2, UINT8_MAX}, {1, 1, UINT8_MAX}},
    806 	[MOVE_Uw3] = {{MOVE_D3, UINT8_MAX}, {1, 1, 1, UINT8_MAX}},
    807 	[MOVE_Dw]  = {{MOVE_U,  UINT8_MAX}, {1, 1, 1, UINT8_MAX}},
    808 	[MOVE_Dw2] = {{MOVE_U2, UINT8_MAX}, {1, 1, UINT8_MAX}},
    809 	[MOVE_Dw3] = {{MOVE_U3, UINT8_MAX}, {1, UINT8_MAX}},
    810 	[MOVE_Rw]  = {{MOVE_L,  UINT8_MAX}, {0, UINT8_MAX}},
    811 	[MOVE_Rw2] = {{MOVE_L2, UINT8_MAX}, {0, 0, UINT8_MAX}},
    812 	[MOVE_Rw3] = {{MOVE_L3, UINT8_MAX}, {0, 0, 0, UINT8_MAX}},
    813 	[MOVE_Lw]  = {{MOVE_R,  UINT8_MAX}, {0, 0, 0, UINT8_MAX}},
    814 	[MOVE_Lw2] = {{MOVE_R2, UINT8_MAX}, {0, 0, UINT8_MAX}},
    815 	[MOVE_Lw3] = {{MOVE_R3, UINT8_MAX}, {0, UINT8_MAX}},
    816 	[MOVE_Fw]  = {{MOVE_B,  UINT8_MAX}, {2, UINT8_MAX}},
    817 	[MOVE_Fw2] = {{MOVE_B2, UINT8_MAX}, {2, 2, UINT8_MAX}},
    818 	[MOVE_Fw3] = {{MOVE_B3, UINT8_MAX}, {2, 2, 2, UINT8_MAX}},
    819 	[MOVE_Bw]  = {{MOVE_F,  UINT8_MAX}, {2, 2, 2, UINT8_MAX}},
    820 	[MOVE_Bw2] = {{MOVE_F2, UINT8_MAX}, {2, 2, UINT8_MAX}},
    821 	[MOVE_Bw3] = {{MOVE_F3, UINT8_MAX}, {2, UINT8_MAX}},
    822 	
    823 	[MOVE_M]   = {{MOVE_R,  MOVE_L3, UINT8_MAX}, {0, 0, 0, UINT8_MAX}},
    824 	[MOVE_M2]  = {{MOVE_R2, MOVE_L2, UINT8_MAX}, {0, 0, UINT8_MAX}},
    825 	[MOVE_M3]  = {{MOVE_R3, MOVE_L,  UINT8_MAX}, {0, UINT8_MAX}},
    826 	[MOVE_S]   = {{MOVE_F3, MOVE_B,  UINT8_MAX}, {2, UINT8_MAX}},
    827 	[MOVE_S2]  = {{MOVE_F2, MOVE_B2, UINT8_MAX}, {2, 2, UINT8_MAX}},
    828 	[MOVE_S3]  = {{MOVE_F,  MOVE_B3, UINT8_MAX}, {2, 2, 2, UINT8_MAX}},
    829 	[MOVE_E]   = {{MOVE_U,  MOVE_D3, UINT8_MAX}, {1, 1, 1, UINT8_MAX}},
    830 	[MOVE_E2]  = {{MOVE_U2, MOVE_D2, UINT8_MAX}, {1, 1, UINT8_MAX}},
    831 	[MOVE_E3]  = {{MOVE_U3, MOVE_D,  UINT8_MAX}, {1, UINT8_MAX}},
    832 
    833 	[MOVE_x]   = {{UINT8_MAX}, {0, UINT8_MAX}},
    834 	[MOVE_x2]  = {{UINT8_MAX}, {0, 0, UINT8_MAX}},
    835 	[MOVE_x3]  = {{UINT8_MAX}, {0, 0, 0, UINT8_MAX}},
    836 	[MOVE_y]   = {{UINT8_MAX}, {1, UINT8_MAX}},
    837 	[MOVE_y2]  = {{UINT8_MAX}, {1, 1, UINT8_MAX}},
    838 	[MOVE_y3]  = {{UINT8_MAX}, {1, 1, 1, UINT8_MAX}},
    839 	[MOVE_z]   = {{UINT8_MAX}, {2, UINT8_MAX}},
    840 	[MOVE_z2]  = {{UINT8_MAX}, {2, 2, UINT8_MAX}},
    841 	[MOVE_z3]  = {{UINT8_MAX}, {2, 2, 2, UINT8_MAX}},
    842 };