1 /***************************************************************************
2 hash.cpp - Hash related implementations
4 begin : Mon Sep 19 2005
5 copyright : (C) 2005 by Maurizio Monge
6 email : monge@linuz.sns.it
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
22 #define HMASK (HSIZE-1)
26 HashKey::print() const
28 printf("HashKey( 0x%llxLL, 0x%x )\n", (long long)check
, index
);
31 char* HashKey::to_string(char* buf
) const
33 snprintf(buf
, 64, "%08x%08x%08x",
34 check_hi
, check_lo
, index
);
41 hash_table
= new HashEntry
[HSIZE
];
47 memset(hash_table
, 0, sizeof(HashEntry
)*HSIZE
);
51 Engine::make_old_hash()
53 for(int i
=0;i
<HSIZE
;i
++)
55 __builtin_prefetch( &hash_table
[ (i
+ 30) & HMASK
] );
56 hash_table
[i
].is_old
= 1;
62 Engine::prefetch_hash(const HashKey
& hk
)
64 __builtin_prefetch( &hash_table
[ (hk
.index
) & HMASK
] );
65 __builtin_prefetch( &hash_table
[ (hk
.index
+REHASH
-1) & HMASK
] );
69 Engine::probe_hash(const HashKey
& hk
)
71 for(int i
=0;i
<REHASH
;i
++)
73 HashEntry
* h
= &hash_table
[(hk
.index
+ i
) & HMASK
];
76 if(h
->check
== hk
.check
)
86 Engine::write_hash(const HashKey
& hk
, int16_t lo
, int16_t up
, int depth
, int best_cont
, bool no_good_moves
)
90 /* look for an empty entry or the same entry to update */
91 for(int i
=0;i
<REHASH
;i
++)
93 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
94 if(!tmp
->check
|| tmp
->check
== hk
.check
)
101 if(!h
) /* look for an entry searched at lower depth */
105 for(int i
=0;i
<REHASH
;i
++)
107 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
116 h
= &hash_table
[(hk
.index
+ lowest
) & HMASK
];
119 if(!h
) /* look for an old entry and take the one searched at lowest depth */
123 for(int i
=0;i
<REHASH
;i
++)
125 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
126 if(tmp
->depth
< d
&& tmp
->is_old
== 1)
134 h
= &hash_table
[(hk
.index
+ lowest
) & HMASK
];
140 if(h
->check
== hk
.check
&& h
->depth
>depth
)
143 if(h
->check
== hk
.check
&& h
->depth
==depth
)
145 /* same entry, improve bounds */
146 h
->up
= MIN(h
->up
, up
);
147 h
->lo
= MAX(h
->lo
, lo
);
162 h
->best_mv
= best_cont
;
163 h
->no_good_moves
= no_good_moves
;