From 1373a00187f9f6ee282a77a6039386c2746964b6 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 19 Sep 2008 05:33:55 +0200 Subject: [PATCH] Final touches to pop_1st_bit optimization This final version is a little bit faster then previous patch and is a bit cleaned up also. On 32 bit x86 pop_1st_bit is now more then two times faster then the original one that is optimized for 64 bit processors. Signed-off-by: Marco Costalba --- src/bitboard.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 5dd0137d..e4fcb7ce 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -343,18 +343,16 @@ Square first_1(Bitboard b) { Square pop_1st_bit(Bitboard *bb) { - uint32_t t = uint32_t(*bb); - uint32_t* p = t ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only? - uint32_t b = t ? t : *p; + uint32_t a = uint32_t(*bb); + uint32_t* ptr = a ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only? + uint32_t b = a ? a : *ptr; + uint32_t c = ~(b ^ (b - 1)); - *p = b & (b -1); + *ptr = b & c; // clear the bit + if (a) + c = ~c; - if (t) - b ^= (b - 1); - else - b = ~(b ^ (b - 1)); - - return Square(BitTable[(b * 0x783a9b23) >> 26]); + return Square(BitTable[(c * 0x783a9b23) >> 26]); } #else -- 2.39.2