Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
108 | pmbaty | 1 | #if _MSC_VER >= 1200 |
2 | # define FORCEINLINE __forceinline |
||
3 | #else |
||
4 | # define FORCEINLINE __inline |
||
5 | #endif |
||
6 | FORCEINLINE int PopCnt(uint64_t a) { |
||
7 | /* Because Crafty bitboards are typically sparsely populated, we use a |
||
8 | streamlined version of the boolean.c algorithm instead of the one in x86.s */ |
||
9 | __asm { |
||
10 | mov ecx, dword ptr a xor eax, eax test ecx, ecx jz l1 l0:lea edx,[ecx - 1] |
||
11 | inc eax and ecx, edx jnz l0 l1:mov ecx, dword ptr a + 4 test ecx, |
||
12 | ecx jz l3 l2:lea edx,[ecx - 1] |
||
13 | inc eax and ecx, edx jnz l2 l3:}} FORCEINLINE int MSB(uint64_t a) { |
||
14 | __asm { |
||
15 | bsr edx, dword ptr a + 4 mov eax, 31 jnz l1 bsr edx, dword ptr a mov eax, |
||
16 | 63 jnz l1 mov edx, -1 l1:sub eax, |
||
17 | edx}} FORCEINLINE int LSB(uint64_t a) { |
||
18 | __asm { |
||
19 | bsf edx, dword ptr a mov eax, 63 jnz l1 bsf edx, dword ptr a + 4 mov eax, |
||
20 | 31 jnz l1 mov edx, -33 l1:sub eax, edx}} |