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
++)
54 hash_table
[i
].is_old
= 1;
59 Engine::prefetch_hash(const HashKey
& hk
)
61 __builtin_prefetch( &hash_table
[ (hk
.index
) & HMASK
] );
62 __builtin_prefetch( &hash_table
[ (hk
.index
+REHASH
-1) & HMASK
] );
66 Engine::probe_hash(const HashKey
& hk
)
68 for(int i
=0;i
<REHASH
;i
++)
70 HashEntry
* h
= &hash_table
[(hk
.index
+ i
) & HMASK
];
73 if(h
->check
== hk
.check
)
83 Engine::write_hash(const HashKey
& hk
, int16_t lo
, int16_t up
, int depth
, int best_cont
, bool no_good_moves
)
87 /* look for an empty entry or the same entry to update */
88 for(int i
=0;i
<REHASH
;i
++)
90 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
91 if(!tmp
->check
|| tmp
->check
== hk
.check
)
98 if(!h
) /* look for an entry searched at lower depth */
102 for(int i
=0;i
<REHASH
;i
++)
104 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
113 h
= &hash_table
[(hk
.index
+ lowest
) & HMASK
];
116 if(!h
) /* look for an old entry and take the one searched at lowest depth */
120 for(int i
=0;i
<REHASH
;i
++)
122 HashEntry
* tmp
= &hash_table
[(hk
.index
+ i
) & HMASK
];
123 if(tmp
->depth
< d
&& tmp
->is_old
== 1)
131 h
= &hash_table
[(hk
.index
+ lowest
) & HMASK
];
137 if(h
->check
== hk
.check
&& h
->depth
>depth
)
140 if(h
->check
== hk
.check
&& h
->depth
==depth
)
142 /* same entry, improve bounds */
143 h
->up
= MIN(h
->up
, up
);
144 h
->lo
= MAX(h
->lo
, lo
);
159 h
->best_mv
= best_cont
;
160 h
->no_good_moves
= no_good_moves
;