mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Switch to hardware PEXT
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.
This commit is contained in:
parent
c556fe1d71
commit
da2f8880b9
3 changed files with 8 additions and 21 deletions
|
@ -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.
|
/// 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.
|
/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard.
|
||||||
|
|
||||||
|
@ -299,7 +282,7 @@ namespace {
|
||||||
reference[size] = sliding_attack(deltas, s, b);
|
reference[size] = sliding_attack(deltas, s, b);
|
||||||
|
|
||||||
if (HasPext)
|
if (HasPext)
|
||||||
attacks[s][pext(occupancy[size], masks[s])] = reference[size];
|
attacks[s][_pext_u64(b, masks[s])] = reference[size];
|
||||||
|
|
||||||
size++;
|
size++;
|
||||||
b = (b - masks[s]) & masks[s];
|
b = (b - masks[s]) & masks[s];
|
||||||
|
|
|
@ -23,8 +23,6 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
extern Bitboard pext(Bitboard b, Bitboard mask);
|
|
||||||
|
|
||||||
namespace Bitboards {
|
namespace Bitboards {
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
@ -244,7 +242,7 @@ FORCE_INLINE unsigned magic_index(Square s, Bitboard occ) {
|
||||||
unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts;
|
unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts;
|
||||||
|
|
||||||
if (HasPext)
|
if (HasPext)
|
||||||
return unsigned(pext(occ, Masks[s]));
|
return unsigned(_pext_u64(occ, Masks[s]));
|
||||||
|
|
||||||
if (Is64Bit)
|
if (Is64Bit)
|
||||||
return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]);
|
return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]);
|
||||||
|
|
|
@ -54,6 +54,12 @@
|
||||||
# include <nmmintrin.h> // Intel header for _mm_popcnt_u64() intrinsic
|
# include <nmmintrin.h> // Intel header for _mm_popcnt_u64() intrinsic
|
||||||
#endif
|
#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))
|
# if !defined(NO_PREFETCH) && (defined(__INTEL_COMPILER) || defined(_MSC_VER))
|
||||||
# include <xmmintrin.h> // Intel and Microsoft header for _mm_prefetch()
|
# include <xmmintrin.h> // Intel and Microsoft header for _mm_prefetch()
|
||||||
# endif
|
# endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue