1 #include "chess.h"
2 #include "data.h"
3 /* last modified 02/16/14 */
4 /*
5 *******************************************************************************
6 * *
7 * This group of procedures provide the three basic bitboard operators, *
8 * MSB(x) that determines the Most Significant Bit, LSB(x) that determines *
9 * the Least Significant Bit, and PopCnt(x) which returns the number of one *
10 * bits set in the word. *
11 * *
12 * We prefer to use hardware facilities (such as intel BSF/BSR) when they *
13 * are available, otherwise we resort to C and table lookups to do this in *
14 * the most efficient way possible. *
15 * *
16 *******************************************************************************
17 */
18 #if !defined(INLINEASM)
MSB(uint64_t arg1)19 int MSB(uint64_t arg1) {
20 if (arg1 >> 48)
21 return msb[arg1 >> 48] + 48;
22 if (arg1 >> 32 & 65535)
23 return msb[arg1 >> 32 & 65535] + 32;
24 if (arg1 >> 16 & 65535)
25 return msb[arg1 >> 16 & 65535] + 16;
26 return msb[arg1 & 65535];
27 }
28
LSB(uint64_t arg1)29 int LSB(uint64_t arg1) {
30 if (arg1 & 65535)
31 return lsb[arg1 & 65535];
32 if (arg1 >> 16 & 65535)
33 return lsb[arg1 >> 16 & 65535] + 16;
34 if (arg1 >> 32 & 65535)
35 return lsb[arg1 >> 32 & 65535] + 32;
36 return lsb[arg1 >> 48] + 48;
37 }
38
PopCnt(uint64_t arg1)39 int PopCnt(uint64_t arg1) {
40 int c;
41
42 for (c = 0; arg1; c++)
43 arg1 &= arg1 - 1;
44 return c;
45 }
46 #endif
47