Rewrite pop_1st_bit() to be endian independent

With this change sources are fully endianess
independent, so we can simplify the Makefile.

Somewhat surprisingly we don't have any speed
regression !

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2012-04-06 11:37:07 +02:00
parent 673bc5526f
commit 797c960d20
2 changed files with 10 additions and 70 deletions

View File

@@ -92,33 +92,13 @@ Square first_1(Bitboard b) {
return Square(BSFTable[(fold * 0x783A9B23) >> 26]);
}
// Use type-punning
union b_union {
Bitboard dummy;
struct {
#if defined (BIGENDIAN)
uint32_t h;
uint32_t l;
#else
uint32_t l;
uint32_t h;
#endif
} b;
};
Square pop_1st_bit(Bitboard* b) {
const b_union u = *((b_union*)b);
if (u.b.l)
{
((b_union*)b)->b.l = u.b.l & (u.b.l - 1);
return Square(BSFTable[((u.b.l ^ (u.b.l - 1)) * 0x783A9B23) >> 26]);
}
((b_union*)b)->b.h = u.b.h & (u.b.h - 1);
return Square(BSFTable[((~(u.b.h ^ (u.b.h - 1))) * 0x783A9B23) >> 26]);
Bitboard bb = *b;
*b = bb & (bb - 1);
bb ^= (bb - 1);
uint32_t fold = unsigned(bb) ^ unsigned(bb >> 32);
return Square(BSFTable[(fold * 0x783A9B23) >> 26]);
}
Square last_1(Bitboard b) {