34 static_cast<std::uint64_t
>(
~SquareSet::column(0)),
90 static_cast<std::uint64_t
>(
~SquareSet::row(7U)),
108 static inline __m128i getAttackedSquaresByPawns128(
const SquareSet pawns,
Color oppPawnColor)
noexcept
115 const __m128i rotateLefts { _mm_load_epi64(rotateData + 2U *
static_cast<std::size_t
>(oppPawnColor)) };
118 __m128i attackingPawns { _mm_set1_epi64x(
static_cast<std::uint64_t
>(pawns)) };
119 attackingPawns &= attackingPawnMasks;
120 return _mm_rolv_epi64(attackingPawns, rotateLefts);
130 const __m128i rotateLefts { _mm_load_si128(std::bit_cast<const __m128i *>(rotateData + 2U *
static_cast<std::size_t
>(oppPawnColor))) };
131 const __m128i attackingPawnMasks { _mm_load_si128(std::bit_cast<const __m128i *>(
ctAttackingPawnMasks.data())) };
133 __m128i attackingPawns { _mm_set1_epi64x(
static_cast<std::uint64_t
>(pawns)) };
134 attackingPawns &= attackingPawnMasks;
135 return _mm512_rolv_epi64(_mm512_zextsi128_si512(attackingPawns), _mm512_zextsi128_si512(rotateLefts));
144 __m512i attackingKnights { _mm512_set1_epi64(
static_cast<std::uint64_t
>(knights)) };
145 attackingKnights &= attackingKnightMasks;
146 return _mm512_rolv_epi64(attackingKnights, rotateLefts);
157 __m512i attackingSliders { };
160 _mm512_mask_set1_epi64(
161 _mm512_set1_epi64(
static_cast<std::uint64_t
>(bishops)),
163 static_cast<std::uint64_t
>(rooks));
165 const __m512i occupancyMasksNegated = _mm512_set1_epi64(
static_cast<std::uint64_t
>(~occupancyMask));
167 attackingSliders &= attackingSliderMasks;
173 attackingSliders = _mm512_rolv_epi64(attackingSliders, rotateLefts);
174 attacks |= attackingSliders;
175 attackingSliders = attackingSliders & occupancyMasksNegated;
176 attackingSliders &= attackingSliderMasks;
178 attackingSliders = _mm512_rolv_epi64(attackingSliders, rotateLefts);
179 attacks |= attackingSliders;
180 attackingSliders = attackingSliders & occupancyMasksNegated;
182 exitCond = _mm512_test_epi64_mask(attackingSliders, attackingSliderMasks);
184 attackingSliders &= attackingSliderMasks;
186 while (exitCond != 0U);
202#if !HAVE_X86_AVX512VL
211 const __m256i attacks256 {
212 _mm512_extracti64x4_epi64(attacks, 1U) |
213 _mm512_castsi512_si256(attacks) };
216 const __m128i attacks128 {
218 getAttackedSquaresByPawns128(pawns, turn) |
220 _mm256_extracti128_si256(attacks256, 1U) |
221 _mm256_castsi256_si128(attacks256) };
224 const std::uint64_t attacks64 =
226 _mm_bsrli_si128(attacks128, 8U) |
236 static inline void determineSliderCheckersAndPins(
247 __m512i kingRays { _mm512_set1_epi64(
static_cast<std::uint64_t
>(
SquareSet { kingSq })) };
251 static_cast<std::uint64_t
>(rooks &~ turnColorMask),
252 static_cast<std::uint64_t
>(rooks &~ turnColorMask),
253 static_cast<std::uint64_t
>(rooks &~ turnColorMask),
254 static_cast<std::uint64_t
>(rooks &~ turnColorMask),
255 static_cast<std::uint64_t
>(bishops &~ turnColorMask),
256 static_cast<std::uint64_t
>(bishops &~ turnColorMask),
257 static_cast<std::uint64_t
>(bishops &~ turnColorMask),
258 static_cast<std::uint64_t
>(bishops &~ turnColorMask)) };
265 __m512i potentiallyPinnedPieces { };
266 __m512i pinnedPieces { };
268 const __m512i occupancyMasks { _mm512_set1_epi64(
static_cast<std::uint64_t
>(occupancyMask)) };
269 __m512i checkers { };
270 const __m512i pinnables {
272 static_cast<std::uint64_t
>(turnColorMask),
273 static_cast<std::uint64_t
>(turnColorMask),
274 static_cast<std::uint64_t
>(turnColorMask),
275 static_cast<std::uint64_t
>(turnColorMask),
276 static_cast<std::uint64_t
>(turnColorMask | epCapturable),
277 static_cast<std::uint64_t
>(turnColorMask | epCapturable),
278 static_cast<std::uint64_t
>(turnColorMask | epCapturable),
279 static_cast<std::uint64_t
>(turnColorMask | epCapturable)) };
285 kingRays &= attackingSliderMasks;
290 kingRays = _mm512_rolv_epi64(kingRays, rotateLefts);
293 checkers |= kingRays & oppSliders;
296 xrays |= kingRays & pinnables;
299 kingRays &= attackingSliderMasks;
302 kingRays &= ~occupancyMasks;
305 if (_mm512_test_epi64_mask(kingRays, kingRays) == 0U)
309 potentiallyPinnedPieces = xrays;
314 xrays &= attackingSliderMasks;
317 if (_mm512_test_epi64_mask(xrays, xrays) == 0U)
321 xrays = _mm512_rolv_epi64(xrays, rotateLefts);
324 const __mmask8 commitPinnedPieces { _mm512_test_epi64_mask(xrays, oppSliders) };
325 pinnedPieces |= _mm512_maskz_mov_epi64(commitPinnedPieces, potentiallyPinnedPieces);
328 xrays &= ~occupancyMasks;
331 out_checkers = SquareSet {
static_cast<std::uint64_t
>(_mm512_reduce_or_epi64(checkers)) };
332 out_pinnedPieces = SquareSet {
static_cast<std::uint64_t
>(_mm512_reduce_or_epi64(pinnedPieces)) };
static SquareSet determineAttackedSquares(SquareSet occupancyMask, SquareSet pawns, SquareSet knights, SquareSet bishops, SquareSet rooks, Square king, Color turn) noexcept
Definition bitboard-attacks-x86-avx512f.h:191