From 099b5e45e6fb84c0c6ac9c867e0902e0195d97a5 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 12 Feb 2012 15:12:01 +0100 Subject: [PATCH] Speedup sliders attacks for 32bit CPU Replace a 64 bit 'and' by two 32 bits ones and use unsigned instead of int. This simple patch increases perft speed of 6% on my Intel Core 2 Duo ! No functional change. Signed-off-by: Marco Costalba --- src/bitboard.cpp | 8 ++++---- src/bitboard.h | 14 ++++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/bitboard.cpp b/src/bitboard.cpp index a5b80b0b..c67c01a6 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -30,12 +30,12 @@ CACHE_LINE_ALIGNMENT Bitboard RMasks[64]; Bitboard RMagics[64]; Bitboard* RAttacks[64]; -int RShifts[64]; +unsigned RShifts[64]; Bitboard BMasks[64]; Bitboard BMagics[64]; Bitboard* BAttacks[64]; -int BShifts[64]; +unsigned BShifts[64]; Bitboard SquareBB[64]; Bitboard FileBB[8]; @@ -64,7 +64,7 @@ namespace { typedef unsigned (Fn)(Square, Bitboard); void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[], - Bitboard masks[], int shifts[], Square deltas[], Fn get_index); + Bitboard masks[], unsigned shifts[], Square deltas[], Fn get_index); } @@ -290,7 +290,7 @@ namespace { // use the so called "fancy" approach. void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[], - Bitboard masks[], int shifts[], Square deltas[], Fn get_index) { + Bitboard masks[], unsigned shifts[], Square deltas[], Fn get_index) { int MagicBoosters[][8] = { { 3191, 2184, 1310, 3618, 2091, 1308, 2452, 3996 }, { 1059, 3608, 605, 3234, 3326, 38, 2029, 3043 } }; diff --git a/src/bitboard.h b/src/bitboard.h index fafe9c35..24ae794b 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -28,12 +28,12 @@ CACHE_LINE_ALIGNMENT extern Bitboard RMasks[64]; extern Bitboard RMagics[64]; extern Bitboard* RAttacks[64]; -extern int RShifts[64]; +extern unsigned RShifts[64]; extern Bitboard BMasks[64]; extern Bitboard BMagics[64]; extern Bitboard* BAttacks[64]; -extern int BShifts[64]; +extern unsigned BShifts[64]; extern Bitboard SquareBB[64]; extern Bitboard FileBB[8]; @@ -134,13 +134,15 @@ FORCE_INLINE unsigned b_index(Square s, Bitboard occ) { #else // if !defined(IS_64BIT) FORCE_INLINE unsigned r_index(Square s, Bitboard occ) { - Bitboard b = occ & RMasks[s]; - return unsigned(int(b) * int(RMagics[s]) ^ int(b >> 32) * int(RMagics[s] >> 32)) >> RShifts[s]; + unsigned lo = unsigned(occ) & unsigned(RMasks[s]); + unsigned hi = unsigned(occ >> 32) & unsigned(RMasks[s] >> 32); + return (lo * unsigned(RMagics[s]) ^ hi * unsigned(RMagics[s] >> 32)) >> RShifts[s]; } FORCE_INLINE unsigned b_index(Square s, Bitboard occ) { - Bitboard b = occ & BMasks[s]; - return unsigned(int(b) * int(BMagics[s]) ^ int(b >> 32) * int(BMagics[s] >> 32)) >> BShifts[s]; + unsigned lo = unsigned(occ) & unsigned(BMasks[s]); + unsigned hi = unsigned(occ >> 32) & unsigned(BMasks[s] >> 32); + return (lo * unsigned(BMagics[s]) ^ hi * unsigned(BMagics[s] >> 32)) >> BShifts[s]; } #endif -- 2.39.2