4 b_gen_nocaptures( const tree_t * restrict ptree,
5 unsigned int * restrict pmove )
7 bitboard_t bb_empty, bb_piece, bb_desti;
11 BBOr( bb_empty, BB_BOCCUPY, BB_WOCCUPY );
12 BBNot( bb_empty, bb_empty );
14 bb_piece.p[1] = BB_BPAWN_ATK.p[1] & bb_empty.p[1];
15 bb_piece.p[2] = BB_BPAWN_ATK.p[2] & bb_empty.p[2];
16 while( bb_piece.p[1] | bb_piece.p[2] )
18 to = last_one12( bb_piece.p[1], bb_piece.p[2] );
19 bb_piece.p[1] ^= abb_mask[to].p[1];
20 bb_piece.p[2] ^= abb_mask[to].p[2];
22 *pmove++ = To2Move( to ) | From2Move( from ) | Piece2Move( pawn );
25 bb_piece = BB_BSILVER;
26 while( BBTest( bb_piece ) )
28 from = LastOne( bb_piece );
29 Xor( from, bb_piece );
31 BBAnd( bb_desti, bb_empty, abb_b_silver_attacks[from] );
32 while ( BBTest( bb_desti ) )
34 to = LastOne( bb_desti );
37 utemp = To2Move( to ) | From2Move( from ) | Piece2Move( silver );
38 if ( from < A6 || to < A6 ) { *pmove++ = utemp | FLAG_PROMO; }
44 while( BBTest( bb_piece ) )
46 from = LastOne( bb_piece );
47 Xor( from, bb_piece );
49 BBAnd( bb_desti, bb_empty, abb_b_gold_attacks[from] );
50 utemp = From2Move( from ) | Piece2Move( BOARD[from] );
51 while ( BBTest( bb_desti ) )
53 to = LastOne( bb_desti );
55 *pmove++ = To2Move( to ) | utemp;
60 BBAnd( bb_desti, bb_empty, abb_king_attacks[from] );
61 utemp = From2Move( from ) | Piece2Move( king );
62 while ( BBTest( bb_desti ) )
64 to = LastOne( bb_desti );
66 *pmove++ = To2Move( to ) | utemp;
69 bb_piece.p[1] = BB_BBISHOP.p[1];
70 bb_piece.p[2] = BB_BBISHOP.p[2];
71 while( bb_piece.p[1] | bb_piece.p[2] )
73 from = last_one12( bb_piece.p[1], bb_piece.p[2] );
74 bb_piece.p[1] ^= abb_mask[from].p[1];
75 bb_piece.p[2] ^= abb_mask[from].p[2];
77 AttackBishop( bb_desti, from );
78 bb_desti.p[1] &= bb_empty.p[1];
79 bb_desti.p[2] &= bb_empty.p[2];
81 utemp = From2Move( from ) | Piece2Move( bishop );
82 while ( bb_desti.p[1] | bb_desti.p[2] )
84 to = last_one12( bb_desti.p[1], bb_desti.p[2] );
85 bb_desti.p[1] ^= abb_mask[to].p[1];
86 bb_desti.p[2] ^= abb_mask[to].p[2];
87 *pmove++ = To2Move( to ) | utemp;
91 bb_piece.p[1] = BB_BROOK.p[1];
92 bb_piece.p[2] = BB_BROOK.p[2];
93 while( bb_piece.p[1] | bb_piece.p[2] )
95 from = last_one12( bb_piece.p[1], bb_piece.p[2] );
96 bb_piece.p[1] ^= abb_mask[from].p[1];
97 bb_piece.p[2] ^= abb_mask[from].p[2];
99 AttackRook( bb_desti, from );
100 bb_desti.p[1] &= bb_empty.p[1];
101 bb_desti.p[2] &= bb_empty.p[2];
103 utemp = From2Move( from ) | Piece2Move( rook );
104 while ( bb_desti.p[1] | bb_desti.p[2] )
106 to = last_one12( bb_desti.p[1], bb_desti.p[2] );
107 bb_desti.p[1] ^= abb_mask[to].p[1];
108 bb_desti.p[2] ^= abb_mask[to].p[2];
109 *pmove++ = To2Move( to ) | utemp;
113 bb_piece = BB_BHORSE;
114 while( BBTest( bb_piece ) )
116 from = LastOne( bb_piece );
117 Xor( from, bb_piece );
119 AttackHorse( bb_desti, from );
120 BBAnd( bb_desti, bb_desti, bb_empty );
121 utemp = From2Move( from ) | Piece2Move( horse );
122 while ( BBTest( bb_desti ) )
124 to = LastOne( bb_desti );
126 *pmove++ = To2Move( to ) | utemp;
130 bb_piece = BB_BDRAGON;
131 while( BBTest( bb_piece ) )
133 from = LastOne( bb_piece );
134 Xor( from, bb_piece );
136 AttackDragon( bb_desti, from );
137 BBAnd( bb_desti, bb_desti, bb_empty );
138 utemp = From2Move( from ) | Piece2Move( dragon );
139 while ( BBTest( bb_desti ) )
141 to = LastOne( bb_desti );
143 *pmove++ = To2Move( to ) | utemp;
147 bb_empty.p[0] &= 0x1ffU;
149 bb_piece = BB_BLANCE;
150 while( BBTest( bb_piece ) )
152 from = LastOne( bb_piece );
153 Xor( from, bb_piece );
155 bb_desti = AttackFile( from );
156 BBAnd( bb_desti, bb_desti, abb_minus_rays[from] );
157 BBAnd( bb_desti, bb_desti, bb_empty );
159 utemp = From2Move( from ) | Piece2Move( lance );
160 while ( BBTest( bb_desti ) )
162 to = LastOne( bb_desti );
164 *pmove++ = To2Move( to ) | utemp;
168 bb_piece = BB_BKNIGHT;
169 while( BBTest( bb_piece ) )
171 from = LastOne( bb_piece );
172 Xor( from, bb_piece );
174 BBAnd( bb_desti, bb_empty, abb_b_knight_attacks[from] );
175 utemp = From2Move( from ) | Piece2Move( knight );
176 while ( BBTest( bb_desti ) )
178 to = LastOne( bb_desti );
180 *pmove++ = To2Move( to ) | utemp;
189 w_gen_nocaptures( const tree_t * restrict ptree,
190 unsigned int * restrict pmove )
192 bitboard_t bb_empty, bb_piece, bb_desti;
196 BBOr( bb_empty, BB_BOCCUPY, BB_WOCCUPY );
197 BBNot( bb_empty, bb_empty );
199 bb_piece.p[0] = BB_WPAWN_ATK.p[0] & bb_empty.p[0];
200 bb_piece.p[1] = BB_WPAWN_ATK.p[1] & bb_empty.p[1];
201 while( bb_piece.p[0] | bb_piece.p[1] )
203 to = first_one01( bb_piece.p[0], bb_piece.p[1] );
204 bb_piece.p[0] ^= abb_mask[to].p[0];
205 bb_piece.p[1] ^= abb_mask[to].p[1];
207 *pmove++ = To2Move( to ) | From2Move( from ) | Piece2Move( pawn );
210 bb_piece = BB_WSILVER;
211 while( BBTest( bb_piece ) )
213 from = FirstOne( bb_piece );
214 Xor( from, bb_piece );
216 BBAnd( bb_desti, bb_empty, abb_w_silver_attacks[from] );
217 while ( BBTest( bb_desti ) )
219 to = FirstOne( bb_desti );
222 utemp = To2Move( to ) | From2Move( from ) | Piece2Move( silver );
223 if ( from > I4 || to > I4 ) { *pmove++ = utemp | FLAG_PROMO; }
228 bb_piece = BB_WTGOLD;
229 while( BBTest( bb_piece ) )
231 from = FirstOne( bb_piece );
232 Xor( from, bb_piece );
234 BBAnd( bb_desti, bb_empty, abb_w_gold_attacks[from] );
235 utemp = From2Move( from ) | Piece2Move( -BOARD[from] );
236 while ( BBTest( bb_desti ) )
238 to = FirstOne( bb_desti );
240 *pmove++ = To2Move( to ) | utemp;
245 BBAnd( bb_desti, bb_empty, abb_king_attacks[from] );
246 utemp = From2Move( from ) | Piece2Move( king );
247 while ( BBTest( bb_desti ) )
249 to = FirstOne( bb_desti );
251 *pmove++ = To2Move( to ) | utemp;
254 bb_piece.p[0] = BB_WBISHOP.p[0];
255 bb_piece.p[1] = BB_WBISHOP.p[1];
256 while( bb_piece.p[0] | bb_piece.p[1] )
258 from = first_one01( bb_piece.p[0], bb_piece.p[1] );
259 bb_piece.p[0] ^= abb_mask[from].p[0];
260 bb_piece.p[1] ^= abb_mask[from].p[1];
262 AttackBishop( bb_desti, from );
263 bb_desti.p[0] &= bb_empty.p[0];
264 bb_desti.p[1] &= bb_empty.p[1];
266 utemp = From2Move( from ) | Piece2Move( bishop );
267 while ( bb_desti.p[0] | bb_desti.p[1] )
269 to = first_one01( bb_desti.p[0], bb_desti.p[1] );
270 bb_desti.p[0] ^= abb_mask[to].p[0];
271 bb_desti.p[1] ^= abb_mask[to].p[1];
272 *pmove++ = To2Move( to ) | utemp;
276 bb_piece.p[0] = BB_WROOK.p[0];
277 bb_piece.p[1] = BB_WROOK.p[1];
278 while( bb_piece.p[0] | bb_piece.p[1] )
280 from = first_one01( bb_piece.p[0], bb_piece.p[1] );
281 bb_piece.p[0] ^= abb_mask[from].p[0];
282 bb_piece.p[1] ^= abb_mask[from].p[1];
284 AttackRook( bb_desti, from );
285 bb_desti.p[0] &= bb_empty.p[0];
286 bb_desti.p[1] &= bb_empty.p[1];
288 utemp = From2Move( from ) | Piece2Move( rook );
289 while ( bb_desti.p[0] | bb_desti.p[1] )
291 to = first_one01( bb_desti.p[0], bb_desti.p[1] );
292 bb_desti.p[0] ^= abb_mask[to].p[0];
293 bb_desti.p[1] ^= abb_mask[to].p[1];
294 *pmove++ = To2Move( to ) | utemp;
298 bb_piece = BB_WHORSE;
299 while( BBTest( bb_piece ) )
301 from = FirstOne( bb_piece );
302 Xor( from, bb_piece );
304 AttackHorse( bb_desti, from );
305 BBAnd( bb_desti, bb_desti, bb_empty );
306 utemp = From2Move( from ) | Piece2Move( horse );
307 while ( BBTest( bb_desti ) )
309 to = FirstOne( bb_desti );
311 *pmove++ = To2Move( to ) | utemp;
315 bb_piece = BB_WDRAGON;
316 while( BBTest( bb_piece ) )
318 from = FirstOne( bb_piece );
319 Xor( from, bb_piece );
321 AttackDragon( bb_desti, from );
322 BBAnd( bb_desti, bb_desti, bb_empty );
323 utemp = From2Move( from ) | Piece2Move( dragon );
324 while ( BBTest( bb_desti ) )
326 to = FirstOne( bb_desti );
328 *pmove++ = To2Move( to ) | utemp;
332 bb_empty.p[2] &= 0x7fc0000U;
334 bb_piece = BB_WLANCE;
335 while( BBTest( bb_piece ) )
337 from = FirstOne( bb_piece );
338 Xor( from, bb_piece );
340 bb_desti = AttackFile( from );
341 BBAnd( bb_desti, bb_desti, abb_plus_rays[from] );
342 BBAnd( bb_desti, bb_desti, bb_empty );
344 utemp = From2Move( from ) | Piece2Move( lance );
345 while ( BBTest( bb_desti ) )
347 to = FirstOne( bb_desti );
349 *pmove++ = To2Move( to ) | utemp;
353 bb_piece = BB_WKNIGHT;
354 while( BBTest( bb_piece ) )
356 from = FirstOne( bb_piece );
357 Xor( from, bb_piece );
359 BBAnd( bb_desti, bb_empty, abb_w_knight_attacks[from] );
360 utemp = From2Move( from ) | Piece2Move( knight );
361 while ( BBTest( bb_desti ) )
363 to = FirstOne( bb_desti );
365 *pmove++ = To2Move( to ) | utemp;