5050enum { N = a2 - a1 , S = - N , E = b1 - a1 , W = - E }; // Derived geometry
5151
5252#define inPawnZone (square ) (rank(square)!=rank1 && rank(square)!=rank8)
53- #define conflict (wK , wP , bK ) (wK==wP || wP==bK || wK==bK )
53+ #define conflict (wKing , wPawn , bKing ) (wKing==wPawn || wPawn==bKing || wKing==bKing )
5454
55- #define taxi (a ,b ) (abs(file(a)-file(b)) | abs(rank(a)-rank(b))) // logical-or as max()
56- #define wInCheck (wK , wP , bK ) (taxi(wK,bK )==1)
57- #define bInCheck (wK , wP , bK ) (taxi(wK,bK )==1 \
58- || (file(wP )!=fileA && wP +N+W==bK ) \
59- || (file(wP )!=fileH && wP +N+E==bK ))
55+ #define dist (a ,b ) (abs(file(a)-file(b)) | abs(rank(a)-rank(b))) // logical-or as max()
56+ #define wInCheck (wKing , wPawn , bKing ) (dist(wKing,bKing )==1)
57+ #define bInCheck (wKing , wPawn , bKing ) (dist(wKing,bKing )==1 \
58+ || (file(wPawn )!=fileA && wPawn +N+W==bKing ) \
59+ || (file(wPawn )!=fileH && wPawn +N+E==bKing ))
6060
6161// Square set macros (no need to adopt these to the specific geometry)
6262#define bit (i ) (1ULL << (i))
@@ -65,14 +65,14 @@ enum { N = a2-a1, S = -N, E = b1-a1, W = -E }; // Derived geometry
6565#define allE (set ) ((set) << 8)
6666#define allS (set ) (((set) & ~mask) >> 1)
6767#define allN (set ) (((set) << 1) & ~mask)
68- #define king64 (set ) (allW(allN(set)) | allN(set) | allE(allN(set)) \
69- | allW(set) | allE(set) \
70- | allW(allS(set)) | allS(set) | allE(allS(set)))
68+ #define allKing (set ) (allW(allN(set)) | allN(set) | allE(allN(set)) \
69+ | allW(set) | allE(set) \
70+ | allW(allS(set)) | allS(set) | allE(allS(set)))
7171
7272#define arrayLen (a ) (sizeof(a) / sizeof((a)[0]))
7373enum { white , black };
74- #define wKsquare (ix ) ((ix)>>5)
75- #define wPsquare (ix ) square(((ix)>>3)&3, (ix)&7)
74+ #define wKingSquare (ix ) ((ix)>>5)
75+ #define wPawnSquare (ix ) square(((ix)>>3)&3, (ix)&7)
7676
7777/*----------------------------------------------------------------------+
7878 | Data |
@@ -85,75 +85,75 @@ static const int kingSteps[] = { N+W, N, N+E, W, E, S+W, S, S+E };
8585 | Functions |
8686 +----------------------------------------------------------------------*/
8787
88- int kpkProbe (int side , int wK , int wP , int bK )
88+ int kpkProbe (int side , int wKing , int wPawn , int bKing )
8989{
9090 if (!kpkTable [0 ][1 ]) kpkGenerate ();
9191
92- if (file (wP ) >= 4 ) {
93- wK = square (7 - file (wK ), rank (wK ));
94- wP = square (7 - file (wP ), rank (wP ));
95- bK = square (7 - file (bK ), rank (bK ));
92+ if (file (wPawn ) >= 4 ) {
93+ wKing = square (7 - file (wKing ), rank (wKing ));
94+ wPawn = square (7 - file (wPawn ), rank (wPawn ));
95+ bKing = square (7 - file (bKing ), rank (bKing ));
9696 }
97- int ix = (wK << 5 ) + (file (wP ) << 3 ) + rank (wP );
98- int bit = (kpkTable [side ][ix ] >> bK ) & 1 ;
97+ int ix = (wKing << 5 ) + (file (wPawn ) << 3 ) + rank (wPawn );
98+ int bit = (kpkTable [side ][ix ] >> bKing ) & 1 ;
9999 return (side == white ) ? bit : - bit ;
100100}
101101
102102int kpkGenerate (void )
103103{
104- uint64_t valid [64 * 32 ];
104+ uint64_t valid [ arrayLen ( kpkTable [ 0 ]) ];
105105
106106 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
107- int wK = wKsquare (ix ), wP = wPsquare (ix );
107+ int wKing = wKingSquare (ix ), wPawn = wPawnSquare (ix );
108108
109109 // Positions after winning pawn promotion
110- if (rank (wP ) == rank8 && wK != wP ) {
111- uint64_t lost = ~king64 (bit (wK )) & ~bit (wK ) & ~bit (wP );
112- if (taxi ( wK , wP ) > 1 )
113- lost &= ~king64 (bit (wP ));
110+ if (rank (wPawn ) == rank8 && wKing != wPawn ) {
111+ uint64_t lost = ~allKing (bit (wKing )) & ~bit (wKing ) & ~bit (wPawn );
112+ if (dist ( wKing , wPawn ) > 1 )
113+ lost &= ~allKing (bit (wPawn ));
114114 kpkTable [black ][ix ] = lost ;
115115 }
116116
117117 // Valid positions after black move, pawn capture allowed
118- valid [ix ] = ~king64 (bit (wK ));
119- if (file (wP ) != fileA ) valid [ix ] &= ~bit (wP + N + W );
120- if (file (wP ) != fileH ) valid [ix ] &= ~bit (wP + N + E );
118+ valid [ix ] = ~allKing (bit (wKing ));
119+ if (file (wPawn ) != fileA ) valid [ix ] &= ~bit (wPawn + N + W );
120+ if (file (wPawn ) != fileH ) valid [ix ] &= ~bit (wPawn + N + E );
121121 }
122122
123123 int changed ;
124124 do {
125125 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
126- int wK = wKsquare (ix ), wP = wPsquare (ix );
127- if (!inPawnZone (wP ))
126+ int wKing = wKingSquare (ix ), wPawn = wPawnSquare (ix );
127+ if (!inPawnZone (wPawn ))
128128 continue ;
129129
130130 // White king moves
131131 uint64_t won = 0 ;
132132 for (int i = 0 ; i < arrayLen (kingSteps ); i ++ ) {
133- int to = wK + kingSteps [i ];
133+ int to = wKing + kingSteps [i ];
134134 int jx = ix + (kingSteps [i ] << 5 );
135- if (taxi ( wK , to & 63 ) == 1 && to != wP )
136- won |= kpkTable [black ][jx ] & ~king64 (bit (to ));
135+ if (dist ( wKing , to & 63 ) == 1 && to != wPawn )
136+ won |= kpkTable [black ][jx ] & ~allKing (bit (to ));
137137 }
138138 // White pawn moves
139- if (wP + N != wK ) {
140- won |= kpkTable [black ][ix + rank2 - rank1 ] & ~bit (wP + N );
141- if (rank (wP ) == rank2 && wP + N + N != wK )
139+ if (wPawn + N != wKing ) {
140+ won |= kpkTable [black ][ix + rank2 - rank1 ] & ~bit (wPawn + N );
141+ if (rank (wPawn ) == rank2 && wPawn + N + N != wKing )
142142 won |= kpkTable [black ][ix + rank4 - rank2 ]
143- & ~bit (wP + N ) & ~bit (wP + N + N );
143+ & ~bit (wPawn + N ) & ~bit (wPawn + N + N );
144144 }
145- kpkTable [white ][ix ] = won & ~bit (wP );
145+ kpkTable [white ][ix ] = won & ~bit (wPawn );
146146 }
147147
148148 changed = 0 ;
149149 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
150- if (!inPawnZone (wPsquare (ix )))
150+ if (!inPawnZone (wPawnSquare (ix )))
151151 continue ;
152152
153153 // Black king moves
154154 uint64_t isBad = kpkTable [white ][ix ] | ~valid [ix ];
155- uint64_t canDraw = king64 (~isBad );
156- uint64_t hasMoves = king64 (valid [ix ]);
155+ uint64_t canDraw = allKing (~isBad );
156+ uint64_t hasMoves = allKing (valid [ix ]);
157157 uint64_t lost = hasMoves & ~canDraw ;
158158
159159 changed += (kpkTable [black ][ix ] != lost );
@@ -171,14 +171,14 @@ int kpkSelfCheck(void)
171171 124960 / 2 , 97604 / 2 // - Non-draw positions per side
172172 };
173173 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
174- int wK = wKsquare (ix ), wP = wPsquare (ix );
175- for (int bK = 0 ; bK < boardSize ; bK ++ ) {
176- if (!inPawnZone (wP ) || conflict (wK , wP , bK ))
174+ int wKing = wKingSquare (ix ), wPawn = wPawnSquare (ix );
175+ for (int bKing = 0 ; bKing < boardSize ; bKing ++ ) {
176+ if (!inPawnZone (wPawn ) || conflict (wKing , wPawn , bKing ))
177177 continue ;
178- counts [0 ] -= !bInCheck (wK , wP , bK );
179- counts [1 ] -= !wInCheck (wK , wP , bK );
180- counts [2 ] -= !bInCheck (wK , wP , bK ) && ((kpkTable [white ][ix ] >> bK ) & 1 );
181- counts [3 ] -= !wInCheck (wK , wP , bK ) && ((kpkTable [black ][ix ] >> bK ) & 1 );
178+ counts [0 ] -= !bInCheck (wKing , wPawn , bKing );
179+ counts [1 ] -= !wInCheck (wKing , wPawn , bKing );
180+ counts [2 ] -= !bInCheck (wKing , wPawn , bKing ) && ((kpkTable [white ][ix ] >> bKing ) & 1 );
181+ counts [3 ] -= !wInCheck (wKing , wPawn , bKing ) && ((kpkTable [black ][ix ] >> bKing ) & 1 );
182182 }
183183 }
184184 return !counts [0 ] && !counts [1 ] && !counts [2 ] && !counts [3 ];
0 commit comments