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
);
34 hash_table
= new HashEntry
[HSIZE
];
40 memset(hash_table
, 0, sizeof(HashEntry
)*HSIZE
);
44 Engine::make_old_hash()
46 for(int i
=0;i
<HSIZE
;i
++)
47 hash_table
[i
].is_old
= 1;
52 Engine::prefetch_hash(const HashKey
& hk
)
54 __builtin_prefetch( &hash_table
[ (hk
.index
) & HMASK
] );
55 __builtin_prefetch( &hash_table
[ (hk
.index
+REHASH
-1) & HMASK
] );
59 Engine::probe_hash(const HashKey
& hk
)
61 for(int i
=0;i
<REHASH
;i
++)
63 HashEntry
* h
= &hash_table
[(hk
.index
+ i
) & HMASK
];
66 if(h
->check
== hk
.check
)
76 Engine::write_hash(int16_t lo
, int16_t up
, int depth
, int best_cont
)
80 /* look for an empty entry or the same entry to update */
81 for(int i
=0;i
<REHASH
;i
++)
83 HashEntry
* tmp
= &hash_table
[(board
.hash
.index
+ i
) & HMASK
];
84 if(!tmp
->check
|| tmp
->check
== board
.hash
.check
)
91 if(!h
) /* look for an entry searched at lower depth */
95 for(int i
=0;i
<REHASH
;i
++)
97 HashEntry
* tmp
= &hash_table
[(board
.hash
.index
+ i
) & HMASK
];
106 h
= &hash_table
[(board
.hash
.index
+ lowest
) & HMASK
];
109 if(!h
) /* look for an old entry and take the one searched at lowest depth */
113 for(int i
=0;i
<REHASH
;i
++)
115 HashEntry
* tmp
= &hash_table
[(board
.hash
.index
+ i
) & HMASK
];
116 if(tmp
->depth
< d
&& tmp
->is_old
== 1)
124 h
= &hash_table
[(board
.hash
.index
+ lowest
) & HMASK
];
130 if(h
->check
== board
.hash
.check
&& h
->depth
>depth
)
133 if(h
->check
== board
.hash
.check
&& h
->depth
==depth
)
135 /* same entry, improve bounds */
136 h
->up
= MIN(h
->up
, up
);
137 h
->lo
= MAX(h
->lo
, lo
);
150 h
->check
= board
.hash
.check
;
152 h
->best_mv
= best_cont
;