Permalink
Browse files

Revert hidden checkers rework

It is slower the previous uglier but faster code.

So completely restore old one for now :-(

Just leave in the rework of status backup/restore in do_move().

We will cherry pick bits of previous work once we are sure
we have fixed the performance regression.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
  • Loading branch information...
mcostalba committed Mar 2, 2009
1 parent 9b6b9e6 commit c02613860a3836bb85da25ae2fed9f1351ba27a5
Showing with 110 additions and 200 deletions.
  1. +11 −10 src/movegen.cpp
  2. +3 −3 src/movegen.h
  3. +12 −9 src/movepick.cpp
  4. +10 −0 src/movepick.h
  5. +47 −139 src/position.cpp
  6. +4 −22 src/position.h
  7. +23 −17 src/search.cpp
View
@@ -166,14 +166,13 @@ int generate_noncaptures(const Position& pos, MoveStack* mlist) {
/// generate_checks() generates all pseudo-legal non-capturing, non-promoting
/// checks. It returns the number of generated moves.
-int generate_checks(const Position& pos, MoveStack* mlist) {
+int generate_checks(const Position& pos, MoveStack* mlist, Bitboard dc) {
assert(pos.is_ok());
assert(!pos.is_check());
Color us = pos.side_to_move();
Square ksq = pos.king_square(opposite_color(us));
- Bitboard dc = pos.discovered_check_candidates(us);
MoveStack* mlist_start = mlist;
assert(pos.piece_on(ksq) == piece_of_color_and_type(opposite_color(us), KING));
@@ -205,7 +204,7 @@ int generate_checks(const Position& pos, MoveStack* mlist) {
/// in check. Unlike the other move generation functions, this one generates
/// only legal moves. It returns the number of generated moves.
-int generate_evasions(const Position& pos, MoveStack* mlist) {
+int generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pinned) {
assert(pos.is_ok());
assert(pos.is_check());
@@ -259,7 +258,6 @@ int generate_evasions(const Position& pos, MoveStack* mlist) {
if (!(checkers & (checkers - 1))) // Only one bit set?
{
Square checksq = first_1(checkers);
- Bitboard pinned = pos.pinned_pieces(us);
assert(pos.color_of_piece_on(checksq) == them);
@@ -349,16 +347,18 @@ int generate_legal_moves(const Position& pos, MoveStack* mlist) {
assert(pos.is_ok());
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
+
if (pos.is_check())
- return generate_evasions(pos, mlist);
+ return generate_evasions(pos, mlist, pinned);
// Generate pseudo-legal moves
int n = generate_captures(pos, mlist);
n += generate_noncaptures(pos, mlist + n);
// Remove illegal moves from the list
for (int i = 0; i < n; i++)
- if (!pos.pl_move_is_legal(mlist[i].move))
+ if (!pos.pl_move_is_legal(mlist[i].move, pinned))
mlist[i--].move = mlist[--n].move;
return n;
@@ -371,11 +371,12 @@ int generate_legal_moves(const Position& pos, MoveStack* mlist) {
/// returned. If not, the function returns false. This function must
/// only be used when the side to move is not in check.
-bool move_is_legal(const Position& pos, const Move m) {
+bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) {
assert(pos.is_ok());
assert(!pos.is_check());
assert(move_is_ok(m));
+ assert(pinned == pos.pinned_pieces(pos.side_to_move()));
Color us = pos.side_to_move();
Color them = opposite_color(us);
@@ -402,7 +403,7 @@ bool move_is_legal(const Position& pos, const Move m) {
assert(pos.piece_on(to - pawn_push(us)) == piece_of_color_and_type(them, PAWN));
// The move is pseudo-legal, check if it is also legal
- return pos.pl_move_is_legal(m);
+ return pos.pl_move_is_legal(m, pinned);
}
// Castling moves
@@ -534,12 +535,12 @@ bool move_is_legal(const Position& pos, const Move m) {
return false;
}
// The move is pseudo-legal, check if it is also legal
- return pos.pl_move_is_legal(m);
+ return pos.pl_move_is_legal(m, pinned);
}
// Luckly we can handle all the other pieces in one go
return ( pos.piece_attacks_square(pos.piece_on(from), from, to)
- && pos.pl_move_is_legal(m)
+ && pos.pl_move_is_legal(m, pinned)
&& !move_promotion(m));
}
View
@@ -34,10 +34,10 @@
extern int generate_captures(const Position &pos, MoveStack *mlist);
extern int generate_noncaptures(const Position &pos, MoveStack *mlist);
-extern int generate_checks(const Position &pos, MoveStack *mlist);
-extern int generate_evasions(const Position &pos, MoveStack *mlist);
+extern int generate_checks(const Position &pos, MoveStack *mlist, Bitboard dc);
+extern int generate_evasions(const Position &pos, MoveStack *mlist, Bitboard pinned);
extern int generate_legal_moves(const Position &pos, MoveStack *mlist);
-extern bool move_is_legal(const Position &pos, const Move m);
+extern bool move_is_legal(const Position &pos, const Move m, Bitboard pinned);
#endif // !defined(MOVEGEN_H_INCLUDED)
View
@@ -96,6 +96,9 @@ MovePicker::MovePicker(const Position& p, bool pv, Move ttm,
else
phaseIndex = (noCaptures ? NoMovesPhaseIndex : QsearchWithoutChecksPhaseIndex);
+ dc = p.discovered_check_candidates(us);
+ pinned = p.pinned_pieces(us);
+
finished = false;
}
@@ -127,7 +130,7 @@ Move MovePicker::get_next_move() {
if (ttMove != MOVE_NONE)
{
assert(move_is_ok(ttMove));
- if (move_is_legal(pos, ttMove))
+ if (move_is_legal(pos, ttMove, pinned))
return ttMove;
}
break;
@@ -136,7 +139,7 @@ Move MovePicker::get_next_move() {
if (mateKiller != MOVE_NONE)
{
assert(move_is_ok(mateKiller));
- if (move_is_legal(pos, mateKiller))
+ if (move_is_legal(pos, mateKiller, pinned))
return mateKiller;
}
break;
@@ -159,7 +162,7 @@ Move MovePicker::get_next_move() {
case PH_EVASIONS:
assert(pos.is_check());
- numOfMoves = generate_evasions(pos, moves);
+ numOfMoves = generate_evasions(pos, moves, pinned);
score_evasions();
movesPicked = 0;
break;
@@ -171,7 +174,7 @@ Move MovePicker::get_next_move() {
break;
case PH_QCHECKS:
- numOfMoves = generate_checks(pos, moves);
+ numOfMoves = generate_checks(pos, moves, dc);
movesPicked = 0;
break;
@@ -391,7 +394,7 @@ Move MovePicker::pick_move_from_list() {
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
- && pos.pl_move_is_legal(move))
+ && pos.pl_move_is_legal(move, pinned))
return move;
}
break;
@@ -411,7 +414,7 @@ Move MovePicker::pick_move_from_list() {
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
- && pos.pl_move_is_legal(move))
+ && pos.pl_move_is_legal(move, pinned))
return move;
}
break;
@@ -439,7 +442,7 @@ Move MovePicker::pick_move_from_list() {
move = badCaptures[movesPicked++].move;
if ( move != ttMove
&& move != mateKiller
- && pos.pl_move_is_legal(move))
+ && pos.pl_move_is_legal(move, pinned))
return move;
}
break;
@@ -454,7 +457,7 @@ Move MovePicker::pick_move_from_list() {
moves[bestIndex] = moves[movesPicked++];
// Remember to change the line below if we decide to hash the qsearch!
// Maybe also postpone the legality check until after futility pruning?
- if (/* move != ttMove && */ pos.pl_move_is_legal(move))
+ if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
return move;
}
break;
@@ -468,7 +471,7 @@ Move MovePicker::pick_move_from_list() {
{
move = moves[movesPicked++].move;
// Remember to change the line below if we decide to hash the qsearch!
- if (/* move != ttMove && */ pos.pl_move_is_legal(move))
+ if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
return move;
}
break;
View
@@ -69,6 +69,7 @@ class MovePicker {
int number_of_moves() const;
int current_move_score() const;
MovegenPhase current_move_type() const;
+ Bitboard discovered_check_candidates() const;
static void init_phase_table();
@@ -83,6 +84,7 @@ class MovePicker {
const Position& pos;
Move ttMove, mateKiller, killer1, killer2;
+ Bitboard pinned, dc;
MoveStack moves[256], badCaptures[64];
bool pvNode;
Depth depth;
@@ -107,4 +109,12 @@ inline int MovePicker::number_of_moves() const {
return numOfMoves;
}
+/// MovePicker::discovered_check_candidates() returns a bitboard containing
+/// all pieces which can possibly give discovered check. This bitboard is
+/// computed by the constructor function.
+
+inline Bitboard MovePicker::discovered_check_candidates() const {
+ return dc;
+}
+
#endif // !defined(MOVEPICK_H_INCLUDED)
Oops, something went wrong.

0 comments on commit c026138

Please sign in to comment.