6 #define BAddMoveCap(piece) \
7 utemp = From2Move(from) | Piece2Move(piece); \
8 while ( BBTest( bb_move ) ) { \
9 to = LastOne( bb_move ); \
10 *pmove++ = To2Move(to) | Cap2Move(-BOARD[to]) | utemp; \
13 #define BAddMove(piece) utemp = From2Move(from) | Piece2Move(piece); \
14 while ( BBTest( bb_move ) ) { \
15 to = LastOne( bb_move ); \
16 *pmove++ = To2Move(to) | utemp; \
20 #define WAddMoveCap(piece) \
21 utemp = From2Move(from) | Piece2Move(piece); \
22 while ( BBTest( bb_move ) ) { \
23 to = FirstOne( bb_move ); \
24 *pmove++ = To2Move(to) | Cap2Move(BOARD[to]) | utemp; \
27 #define WAddMove(piece) utemp = From2Move(from) | Piece2Move(piece); \
28 while ( BBTest( bb_move ) ) { \
29 to = FirstOne( bb_move ); \
30 *pmove++ = To2Move(to) | utemp; \
35 b_gen_cap_nopro_ex2( const tree_t * restrict ptree,
36 unsigned int * restrict pmove )
39 unsigned int utemp, ubb_piece0, ubb_piece1, ubb_piece2, ubb_move0;
40 bitboard_t bb_target, bb_move, bb_piece;
42 bb_target = BB_WOCCUPY;
44 ubb_move0 = BB_BPAWN_ATK.p[0] & bb_target.p[0] & 0x003ffffU;
47 to = last_one0( ubb_move0 );
49 *pmove++ = To2Move(to) | From2Move(from)
50 | Cap2Move(-BOARD[to]) | Piece2Move(pawn);
51 ubb_move0 ^= abb_mask[to].p[0];
54 ubb_piece1 = BB_BBISHOP.p[1];
55 ubb_piece2 = BB_BBISHOP.p[2];
56 while( ubb_piece1 | ubb_piece2 )
58 from = last_one12( ubb_piece1, ubb_piece2 );
59 ubb_move0 = BishopAttack0(from) & bb_target.p[0];
60 utemp = From2Move(from) | Piece2Move(bishop);
63 to = last_one0( ubb_move0 );
64 *pmove++ = To2Move(to) | Cap2Move(-BOARD[to]) | utemp;
65 ubb_move0 ^= abb_mask[to].p[0];
67 ubb_piece1 ^= abb_mask[from].p[1];
68 ubb_piece2 ^= abb_mask[from].p[2];
70 ubb_piece0 = BB_BBISHOP.p[0];
73 from = last_one0( ubb_piece0 );
74 AttackBishop( bb_move, from );
75 BBAnd( bb_move, bb_move, bb_target );
76 BAddMoveCap( bishop );
77 ubb_piece0 ^= abb_mask[from].p[0];
80 ubb_piece1 = BB_BROOK.p[1];
81 ubb_piece2 = BB_BROOK.p[2];
82 while( ubb_piece1 | ubb_piece2 )
84 from = last_one12( ubb_piece1, ubb_piece2 );
85 AttackRook( bb_move, from );
86 ubb_move0 = bb_move.p[0] & bb_target.p[0];
87 utemp = From2Move(from) | Piece2Move(rook);
90 to = last_one0( ubb_move0 );
91 *pmove++ = To2Move(to) | Cap2Move(-BOARD[to]) | utemp;
92 ubb_move0 ^= abb_mask[to].p[0];
94 ubb_piece1 ^= abb_mask[from].p[1];
95 ubb_piece2 ^= abb_mask[from].p[2];
97 ubb_piece0 = BB_BROOK.p[0];
100 from = last_one0( ubb_piece0 );
101 AttackRook( bb_move, from );
102 BBAnd( bb_move, bb_move, bb_target );
104 ubb_piece0 ^= abb_mask[from].p[0];
107 bb_piece = BB_BLANCE;
108 bb_target.p[0] &= 0x3fe00;
109 while( BBTest( bb_piece ) )
111 from = LastOne( bb_piece );
112 ubb_move0 = AttackFile(from).p[0]
113 & abb_minus_rays[from].p[0] & bb_target.p[0];
114 utemp = From2Move(from) | Piece2Move(lance);
117 to = last_one0( ubb_move0 );
118 *pmove++ = To2Move(to) | Cap2Move(-BOARD[to]) | utemp;
119 ubb_move0 ^= abb_mask[to].p[0];
121 Xor( from, bb_piece );
129 b_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
130 unsigned int * restrict pmove )
132 bitboard_t bb_target, bb_move, bb_piece;
133 unsigned int ubb_piece0, ubb_piece1, ubb_piece2, ubb_move0, ubb_target0;
137 BBOr( bb_target, BB_BOCCUPY, BB_WOCCUPY );
138 BBNot( bb_target, bb_target );
140 ubb_move0 = BB_BPAWN_ATK.p[0] & bb_target.p[0] & 0x003ffffU;
143 to = last_one0( ubb_move0 );
145 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(pawn);
146 ubb_move0 ^= abb_mask[to].p[0];
149 ubb_piece1 = BB_BBISHOP.p[1];
150 ubb_piece2 = BB_BBISHOP.p[2];
151 while( ubb_piece1 | ubb_piece2 )
153 from = last_one12( ubb_piece1, ubb_piece2 );
154 ubb_move0 = BishopAttack0(from) & bb_target.p[0];
155 utemp = From2Move(from) | Piece2Move(bishop);
158 to = last_one0( ubb_move0 );
159 *pmove++ = To2Move(to) | utemp;
160 ubb_move0 ^= abb_mask[to].p[0];
162 ubb_piece1 ^= abb_mask[from].p[1];
163 ubb_piece2 ^= abb_mask[from].p[2];
165 ubb_piece0 = BB_BBISHOP.p[0];
168 from = last_one0( ubb_piece0 );
169 AttackBishop( bb_move, from );
170 BBAnd( bb_move, bb_move, bb_target );
172 ubb_piece0 ^= abb_mask[from].p[0];
175 ubb_piece1 = BB_BROOK.p[1];
176 ubb_piece2 = BB_BROOK.p[2];
177 while( ubb_piece1 | ubb_piece2 )
179 from = last_one12( ubb_piece1, ubb_piece2 );
180 AttackRook( bb_move, from );
181 ubb_move0 = bb_move.p[0] & bb_target.p[0];
182 utemp = From2Move(from) | Piece2Move(rook);
185 to = last_one0( ubb_move0 );
186 *pmove++ = To2Move(to) | utemp;
187 ubb_move0 ^= abb_mask[to].p[0];
189 ubb_piece1 ^= abb_mask[from].p[1];
190 ubb_piece2 ^= abb_mask[from].p[2];
192 ubb_piece0 = BB_BROOK.p[0];
195 from = last_one0( ubb_piece0 );
196 AttackRook( bb_move, from );
197 BBAnd( bb_move, bb_move, bb_target );
199 ubb_piece0 ^= abb_mask[from].p[0];
202 bb_piece = BB_BLANCE;
203 ubb_target0 = bb_target.p[0] & 0x3fe00;
204 while( BBTest( bb_piece ) )
206 from = LastOne( bb_piece );
207 ubb_move0 = AttackFile(from).p[0]
208 & abb_minus_rays[from].p[0] & ubb_target0;
209 utemp = From2Move(from) | Piece2Move(lance);
212 to = last_one0( ubb_move0 );
213 *pmove++ = To2Move(to) | utemp;
214 ubb_move0 ^= abb_mask[to].p[0];
216 Xor( from, bb_piece );
224 w_gen_cap_nopro_ex2( const tree_t * restrict ptree,
225 unsigned int * restrict pmove )
227 bitboard_t bb_target, bb_move, bb_piece;
228 unsigned int utemp, ubb_piece0, ubb_piece1, ubb_piece2, ubb_move2;
231 bb_target = BB_BOCCUPY;
233 ubb_move2 = BB_WPAWN_ATK.p[2] & bb_target.p[2] & 0x7fffe00U;
236 to = first_one2( ubb_move2 );
238 *pmove++ = To2Move(to) | From2Move(from)
239 | Cap2Move(BOARD[to]) | Piece2Move(pawn);
240 ubb_move2 ^= abb_mask[to].p[2];
243 ubb_piece0 = BB_WBISHOP.p[0];
244 ubb_piece1 = BB_WBISHOP.p[1];
245 while( ubb_piece0 | ubb_piece1 )
247 from = first_one01( ubb_piece0, ubb_piece1 );
248 ubb_move2 = BishopAttack2(from) & bb_target.p[2];
249 utemp = From2Move(from) | Piece2Move(bishop);
252 to = first_one2( ubb_move2 );
253 *pmove++ = To2Move(to) | Cap2Move(BOARD[to]) | utemp;
254 ubb_move2 ^= abb_mask[to].p[2];
256 ubb_piece0 ^= abb_mask[from].p[0];
257 ubb_piece1 ^= abb_mask[from].p[1];
259 ubb_piece2 = BB_WBISHOP.p[2];
262 from = first_one2( ubb_piece2 );
263 AttackBishop( bb_move, from );
264 BBAnd( bb_move, bb_move, bb_target );
265 WAddMoveCap( bishop );
266 ubb_piece2 ^= abb_mask[from].p[2];
269 ubb_piece0 = BB_WROOK.p[0];
270 ubb_piece1 = BB_WROOK.p[1];
271 while( ubb_piece0 | ubb_piece1 )
273 from = first_one01( ubb_piece0, ubb_piece1 );
274 AttackRook( bb_move, from );
275 ubb_move2 = bb_move.p[2] & bb_target.p[2];
276 utemp = From2Move(from) | Piece2Move(rook);
279 to = first_one2( ubb_move2 );
280 *pmove++ = To2Move(to) | Cap2Move(BOARD[to]) | utemp;
281 ubb_move2 ^= abb_mask[to].p[2];
283 ubb_piece0 ^= abb_mask[from].p[0];
284 ubb_piece1 ^= abb_mask[from].p[1];
286 ubb_piece2 = BB_WROOK.p[2];
289 from = first_one2( ubb_piece2 );
290 AttackRook( bb_move, from );
291 BBAnd( bb_move, bb_move, bb_target );
293 ubb_piece2 ^= abb_mask[from].p[2];
296 bb_piece = BB_WLANCE;
297 bb_target.p[2] &= 0x3fe00;
298 while( BBTest( bb_piece ) )
300 from = FirstOne( bb_piece );
301 ubb_move2 = AttackFile(from).p[2]
302 & abb_plus_rays[from].p[2] & bb_target.p[2];
303 utemp = From2Move(from) | Piece2Move(lance);
306 to = first_one2( ubb_move2 );
307 *pmove++ = To2Move(to) | Cap2Move(BOARD[to]) | utemp;
308 ubb_move2 ^= abb_mask[to].p[2];
310 Xor( from, bb_piece );
318 w_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
319 unsigned int * restrict pmove )
321 bitboard_t bb_target, bb_piece, bb_move;
322 unsigned int ubb_piece0, ubb_piece1, ubb_piece2, ubb_move2, ubb_target2;
326 BBOr( bb_target, BB_BOCCUPY, BB_WOCCUPY );
327 BBNot( bb_target, bb_target );
329 ubb_move2 = BB_WPAWN_ATK.p[2] & bb_target.p[2] & 0x7fffe00U;;
332 to = first_one2( ubb_move2 );
334 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(pawn);
335 ubb_move2 ^= abb_mask[to].p[2];
338 ubb_piece0 = BB_WBISHOP.p[0];
339 ubb_piece1 = BB_WBISHOP.p[1];
340 while( ubb_piece0 | ubb_piece1 )
342 from = first_one01( ubb_piece0, ubb_piece1 );
343 ubb_move2 = BishopAttack2(from) & bb_target.p[2];
344 utemp = From2Move(from) | Piece2Move(bishop);
347 to = first_one2( ubb_move2 );
348 *pmove++ = To2Move(to) | utemp;
349 ubb_move2 ^= abb_mask[to].p[2];
351 ubb_piece0 ^= abb_mask[from].p[0];
352 ubb_piece1 ^= abb_mask[from].p[1];
354 ubb_piece2 = BB_WBISHOP.p[2];
357 from = first_one2( ubb_piece2 );
358 AttackBishop( bb_move, from );
359 BBAnd( bb_move, bb_move, bb_target );
361 ubb_piece2 ^= abb_mask[from].p[2];
364 ubb_piece0 = BB_WROOK.p[0];
365 ubb_piece1 = BB_WROOK.p[1];
366 while( ubb_piece0 | ubb_piece1 )
368 from = first_one01( ubb_piece0, ubb_piece1 );
369 AttackRook( bb_move, from );
370 ubb_move2 = bb_move.p[2] & bb_target.p[2];
371 utemp = From2Move(from) | Piece2Move(rook);
374 to = first_one2( ubb_move2 );
375 *pmove++ = To2Move(to) | utemp;
376 ubb_move2 ^= abb_mask[to].p[2];
378 ubb_piece0 ^= abb_mask[from].p[0];
379 ubb_piece1 ^= abb_mask[from].p[1];
381 ubb_piece2 = BB_WROOK.p[2];
384 from = first_one2( ubb_piece2 );
385 AttackRook( bb_move, from );
386 BBAnd( bb_move, bb_move, bb_target );
388 ubb_piece2 ^= abb_mask[from].p[2];
391 bb_piece = BB_WLANCE;
392 ubb_target2 = bb_target.p[2] & 0x3fe00;
393 while( BBTest( bb_piece ) )
395 from = FirstOne( bb_piece );
396 ubb_move2 = AttackFile(from).p[2]
397 & abb_plus_rays[from].p[2] & ubb_target2;
398 utemp = From2Move(from) | Piece2Move(lance);
401 to = first_one2( ubb_move2 );
402 *pmove++ = To2Move(to) | utemp;
403 ubb_move2 ^= abb_mask[to].p[2];
405 Xor( from, bb_piece );