Skip to content

Commit

Permalink
Switch to hardware PEXT
Browse files Browse the repository at this point in the history
Retire software pext and introduce hardware
call when USE_PEXT is defined during compilation.

This is a full complete implementation of sliding
attacks using PEXT.

No functional change.
  • Loading branch information
mcostalba committed Apr 12, 2014
1 parent c556fe1 commit da2f888
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 21 deletions.
19 changes: 1 addition & 18 deletions src/bitboard.cpp
Expand Up @@ -79,23 +79,6 @@ namespace {
}
}


/// Intel PEXT (parallel extraction) software implementation
Bitboard pext(Bitboard b, Bitboard mask) {

Bitboard res = 0;

for (Bitboard bb = 1; mask; bb += bb)
{
if (b & mask & -mask)
res |= bb;

mask &= mask - 1;
}
return res;
}


/// lsb()/msb() finds the least/most significant bit in a non-zero bitboard.
/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard.

Expand Down Expand Up @@ -299,7 +282,7 @@ namespace {
reference[size] = sliding_attack(deltas, s, b);

if (HasPext)
attacks[s][pext(occupancy[size], masks[s])] = reference[size];
attacks[s][_pext_u64(b, masks[s])] = reference[size];

size++;
b = (b - masks[s]) & masks[s];
Expand Down
4 changes: 1 addition & 3 deletions src/bitboard.h
Expand Up @@ -23,8 +23,6 @@

#include "types.h"

extern Bitboard pext(Bitboard b, Bitboard mask);

namespace Bitboards {

void init();
Expand Down Expand Up @@ -244,7 +242,7 @@ FORCE_INLINE unsigned magic_index(Square s, Bitboard occ) {
unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts;

if (HasPext)
return unsigned(pext(occ, Masks[s]));
return unsigned(_pext_u64(occ, Masks[s]));

if (Is64Bit)
return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]);
Expand Down
6 changes: 6 additions & 0 deletions src/types.h
Expand Up @@ -54,6 +54,12 @@
# include <nmmintrin.h> // Intel header for _mm_popcnt_u64() intrinsic
#endif

#if defined(USE_PEXT)
# include <x86intrin.h> // Gcc header for _pext_u64() intrinsic
#else
# define _pext_u64(b, m) (0)
#endif

# if !defined(NO_PREFETCH) && (defined(__INTEL_COMPILER) || defined(_MSC_VER))
# include <xmmintrin.h> // Intel and Microsoft header for _mm_prefetch()
# endif
Expand Down

0 comments on commit da2f888

Please sign in to comment.