X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=7d86884d12ee51caab40e70e1b14eac56b3f019c;hp=e0ce4d2d771fdeb2453d460fdf06755569a69b48;hb=9a595359628d82026513f7e978d40e944194b057;hpb=dc286d2673ef334c6bab0c4244a49a1b01e63cdc diff --git a/src/bitboard.cpp b/src/bitboard.cpp index e0ce4d2d..7d86884d 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -348,26 +348,47 @@ union b_union { Square pop_1st_bit(Bitboard* bb) { - b_union u; + b_union* u; Square ret; - u.b = *bb; + u = (b_union*)bb; - if (u.dw.l) + if (u->dw.l) { - ret = Square(BitTable[((u.dw.l ^ (u.dw.l - 1)) * 0x783a9b23) >> 26]); - u.dw.l &= (u.dw.l - 1); - *bb = u.b; + ret = Square(BitTable[((u->dw.l ^ (u->dw.l - 1)) * 0x783a9b23) >> 26]); + u->dw.l &= (u->dw.l - 1); return ret; } - ret = Square(BitTable[((~(u.dw.h ^ (u.dw.h - 1))) * 0x783a9b23) >> 26]); - u.dw.h &= (u.dw.h - 1); - *bb = u.b; + ret = Square(BitTable[((~(u->dw.h ^ (u->dw.h - 1))) * 0x783a9b23) >> 26]); + u->dw.h &= (u->dw.h - 1); return ret; } #endif +int bitScanReverse32(uint32_t b) +{ + int result = 0; + + if (b > 0xFFFF) { + b >>= 16; + result += 16; + } + if (b > 0xFF) { + b >>= 8; + result += 8; + } + if (b > 0xF) { + b >>= 4; + result += 4; + } + if (b > 0x3) { + b >>= 2; + result += 2; + } + return result + (b > 0) + (b > 1); +} + namespace { // All functions below are used to precompute various bitboards during