Enable prefetch also for gcc
authorMarco Costalba <mcostalba@gmail.com>
Sun, 9 Aug 2009 23:20:54 +0000 (01:20 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 10 Aug 2009 00:42:35 +0000 (01:42 +0100)
This fix a compile error under Linux with gcc when
there aren't the intel dev libraries.

Also simplify the previous patch moving TT definition
from search.cpp to tt.cpp so to avoid using passing a
pointer to TT to the current position.

Finally simplify do_move(), now we miss a prefetch in the
rare case of setting an en-passant square but code is
much cleaner and performance penalty is almost zero.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp
src/position.h
src/search.cpp
src/tt.cpp
src/tt.h

index 874c7545bf4dc31b1745a920ba6f7bcbef2106d6..04127ee7b1e708bd58c202f92901f496f521b22c 100644 (file)
@@ -72,14 +72,6 @@ Position::Position(const string& fen) {
 }
 
 
-/// Position::setTranspositionTable() is used by search functions to pass
-/// the pointer to the used TT so that do_move() will prefetch TT access.
-
-void Position::setTranspositionTable(TranspositionTable* tt) {
-  TT = tt;
-}
-
-
 /// Position::from_fen() initializes the position object with the given FEN
 /// string. This function is not very robust - make sure that input FENs are
 /// correct (this is assumed to be the responsibility of the GUI).
@@ -728,6 +720,9 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
   // case of non-reversible moves is taken care of later.
   st->rule50++;
 
+  // Update side to move
+  st->key ^= zobSideToMove;
+
   if (move_is_castle(m))
       do_castle_move(m);
   else if (move_is_promotion(m))
@@ -750,11 +745,10 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
     st->capture = type_of_piece_on(to);
 
     if (st->capture)
-      do_capture_move(st->capture, them, to);
+        do_capture_move(st->capture, them, to);
 
     // Update hash key
     st->key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
-    st->key ^= zobSideToMove;
 
     // Reset en passant square
     if (st->epSquare != SQ_NONE)
@@ -772,11 +766,8 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
         st->key ^= zobCastle[st->castleRights];
     }
 
-    bool checkEpSquare = (pt == PAWN && abs(int(to) - int(from)) == 16);
-
     // Prefetch TT access as soon as we know key is updated
-    if (!checkEpSquare && TT)
-        TT->prefetch(st->key);
+    TT.prefetch(st->key);
 
     // Move the piece
     Bitboard move_bb = make_move_bb(from, to);
@@ -797,7 +788,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
         st->pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to];
 
         // Set en passant square, only if moved pawn can be captured
-        if (checkEpSquare)
+        if (abs(int(to) - int(from)) == 16)
         {
             if (   (us == WHITE && (pawn_attacks(WHITE, from + DELTA_N) & pawns(BLACK)))
                 || (us == BLACK && (pawn_attacks(BLACK, from + DELTA_S) & pawns(WHITE))))
@@ -808,10 +799,6 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
         }
     }
 
-    // Prefetch only here in the few cases we needed zobEp[] to update the key
-    if (checkEpSquare && TT)
-        TT->prefetch(st->key);
-
     // Update incremental scores
     st->mgValue += pst_delta<MidGame>(piece, from, to);
     st->egValue += pst_delta<EndGame>(piece, from, to);
@@ -979,8 +966,6 @@ void Position::do_castle_move(Move m) {
 
   // Update checkers BB
   st->checkersBB = attacks_to(king_square(them), us);
-
-  st->key ^= zobSideToMove;
 }
 
 
@@ -1071,8 +1056,6 @@ void Position::do_promotion_move(Move m) {
 
   // Update checkers BB
   st->checkersBB = attacks_to(king_square(them), us);
-
-  st->key ^= zobSideToMove;
 }
 
 
@@ -1150,8 +1133,6 @@ void Position::do_ep_move(Move m) {
 
   // Update checkers BB
   st->checkersBB = attacks_to(king_square(them), us);
-
-  st->key ^= zobSideToMove;
 }
 
 
@@ -1436,7 +1417,7 @@ void Position::do_null_move(StateInfo& backupSt) {
       st->key ^= zobEp[st->epSquare];
 
   st->key ^= zobSideToMove;
-  TT->prefetch(st->key);
+  TT.prefetch(st->key);
   sideToMove = opposite_color(sideToMove);
   st->epSquare = SQ_NONE;
   st->rule50++;
@@ -1680,7 +1661,6 @@ void Position::clear() {
   initialKFile = FILE_E;
   initialKRFile = FILE_H;
   initialQRFile = FILE_A;
-  TT = NULL;
 }
 
 
index ba4caf13a48f3a63023b1810f0c0ccf3712bcce4..e48be111ec7dca3d7e055c0b892f6ec9f31e7fb6 100644 (file)
@@ -98,7 +98,6 @@ struct StateInfo {
   StateInfo* previous;
 };
 
-class TranspositionTable;
 
 /// The position data structure. A position consists of the following data:
 ///
@@ -259,7 +258,6 @@ public:
   void undo_move(Move m);
   void do_null_move(StateInfo& st);
   void undo_null_move();
-  void setTranspositionTable(TranspositionTable* tt);
 
   // Static exchange evaluation
   int see(Square from, Square to) const;
@@ -358,7 +356,6 @@ private:
   File initialKFile, initialKRFile, initialQRFile;
   StateInfo startState;
   StateInfo* st;
-  TranspositionTable* TT;
 
   // Static variables
   static int castleRightsMask[64];
index 32d1a8bdb32512b1355d5f47b24b9376a7494a70..e2fdc4be3b7c1040cea7dc9ece64c68ee942e255 100644 (file)
@@ -190,9 +190,6 @@ namespace {
   // Remaining depth:                 1 ply         1.5 ply       2 ply         2.5 ply       3 ply         3.5 ply
   const Value RazorApprMargins[6] = { Value(0x520), Value(0x300), Value(0x300), Value(0x300), Value(0x300), Value(0x300) };
 
-  // The main transposition table
-  TranspositionTable TT;
-
 
   /// Variables initialized by UCI options
 
@@ -663,7 +660,6 @@ namespace {
 
     // Initialize
     TT.new_search();
-    p.setTranspositionTable(&TT);
     H.clear();
     for (int i = 0; i < 3; i++)
     {
index 8ef2a63500acf02827028a6e485a2286881dfd6f..862842f2639069b20a28593487207b74c755e884 100644 (file)
 #include <cassert>
 #include <cmath>
 #include <cstring>
-#include <xmmintrin.h>
 
 #include "movegen.h"
 #include "tt.h"
 
+#if defined(_MSC_VER)
+#include <xmmintrin.h>
+#endif
 
-/// This is the number of TTEntry slots for each position
+// This is the number of TTEntry slots for each position
 static const int ClusterSize = 5;
 
+// The main transposition table
+TranspositionTable TT;
 
 ////
 //// Functions
@@ -174,7 +178,11 @@ TTEntry* TranspositionTable::retrieve(const Key posKey) const {
 
 void TranspositionTable::prefetch(const Key posKey) const {
 
+#if defined(_MSC_VER)
   _mm_prefetch((char*)first_entry(posKey), _MM_HINT_T0);
+#else
+  __builtin_prefetch((const void*)first_entry(posKey), 0, 3);
+#endif
 }
 
 
index e778a3722a31188ec6f4e8cff2f5d29d231aaf60..0b7ccbe8f948ecacc603b3d189c387c16d6b2008 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -105,4 +105,6 @@ private:
   uint8_t generation;
 };
 
+extern TranspositionTable TT;
+
 #endif // !defined(TT_H_INCLUDED)