#include <cassert>
#include <cmath>
#include <cstring>
+#include <xmmintrin.h>
#include "movegen.h"
#include "tt.h"
-#if defined(_MSC_VER)
-#include <xmmintrin.h>
-#endif
-
// The main transposition table
TranspositionTable TT;
{
if (!tte->key() || tte->key() == posKey32) // empty or overwrite old
{
- // Do not overwrite when new type is VALUE_TYPE_EVAL
- if (tte->key() && t == VALUE_TYPE_EVAL)
+ // Do not overwrite when new type is VALUE_TYPE_EV_LO
+ if (tte->key() && t == VALUE_TYPE_EV_LO)
return;
if (m == MOVE_NONE)
void TranspositionTable::prefetch(const Key posKey) const {
-#if defined(_MSC_VER)
- char* addr = (char*)first_entry(posKey);
- _mm_prefetch(addr, _MM_HINT_T0);
- _mm_prefetch(addr+64, _MM_HINT_T0);
-#else
- // We need to force an asm volatile here because gcc builtin
- // is optimized away by Intel compiler.
- char* addr = (char*)first_entry(posKey);
- asm volatile("prefetcht0 %0" :: "m" (addr));
+#if defined(__INTEL_COMPILER) || defined(__ICL)
+ // This hack prevents prefetches to be optimized away by the
+ // Intel compiler. Both MSVC and gcc seems not affected.
+ __asm__ ("");
#endif
+
+ char const* addr = (char*)first_entry(posKey);
+ _mm_prefetch(addr, _MM_HINT_T2);
+ _mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
}
/// will often get single-move PVs when the search stops while failing high,
/// and a single-move PV means that we don't have a ponder move.
-void TranspositionTable::extract_pv(const Position& pos, Move pv[]) {
+void TranspositionTable::extract_pv(const Position& pos, Move pv[], const int PLY_MAX) {
- int ply;
- Position p(pos);
- StateInfo st[100];
-
- for (ply = 0; pv[ply] != MOVE_NONE; ply++)
- p.do_move(pv[ply], st[ply]);
-
- bool stop;
const TTEntry* tte;
- for (stop = false, tte = retrieve(p.get_key());
- tte && tte->move() != MOVE_NONE && !stop;
- tte = retrieve(p.get_key()), ply++)
+ StateInfo st;
+ Position p(pos);
+ int ply = 0;
+
+ // Update position to the end of current PV
+ while (pv[ply] != MOVE_NONE)
+ p.do_move(pv[ply++], st);
+
+ // Try to add moves from TT while possible
+ while ( (tte = retrieve(p.get_key())) != NULL
+ && tte->move() != MOVE_NONE
+ && move_is_legal(p, tte->move())
+ && (!p.is_draw() || ply < 2)
+ && ply < PLY_MAX)
{
- if (!move_is_legal(p, tte->move()))
- break;
pv[ply] = tte->move();
- p.do_move(pv[ply], st[ply]);
- for (int j = 0; j < ply; j++)
- if (st[j].key == p.get_key()) stop = true;
+ p.do_move(pv[ply++], st);
}
pv[ply] = MOVE_NONE;
}