17#ifndef HOOVER_CHESS_UTILS__PGN_READER__BITBOARD_ATTACKS_AARCH64_SVE2_BITPERM_H_INCLUDED
18#define HOOVER_CHESS_UTILS__PGN_READER__BITBOARD_ATTACKS_AARCH64_SVE2_BITPERM_H_INCLUDED
23#include "pgnreader-config.h"
31static_assert(HAVE_AARCH64_SVE2_BITPERM,
"This file should be included only when AArch64 SVE2 BitPerm is available");
54 const std::uint64_t pextMask {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq)] };
55 const std::uint64_t offset {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq)] };
57 svuint64_t occupancyMaskV { svdup_u64(
static_cast<std::uint64_t
>(occupancyMask)) };
59 svuint64_t extractedV { svbext_n_u64(occupancyMaskV,
static_cast<std::uint64_t
>(pextMask)) };
60 const std::uint64_t extracted { extractedV[0U] };
68 const std::uint64_t pextMask {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
69 const std::uint64_t offset {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
71 svuint64_t occupancyMaskV { svdup_u64(
static_cast<std::uint64_t
>(occupancyMask)) };
73 svuint64_t extractedV { svbext_n_u64(occupancyMaskV,
static_cast<std::uint64_t
>(pextMask)) };
74 const std::uint64_t extracted { extractedV[0U] };
85 const std::uint64_t pextMaskB {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq)] };
86 const std::uint64_t pextMaskR {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
88 const std::uint64_t offsetB {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq)] };
89 const std::uint64_t offsetR {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
91 const svuint64_t pextMaskV { svdupq_u64(pextMaskB, pextMaskR) };
93 const svuint64_t occupancyMaskV { svdup_u64(
static_cast<std::uint64_t
>(occupancyMask)) };
95 const svuint64_t extractedV { svbext_u64(occupancyMaskV, pextMaskV) };
97 const std::uint64_t extractedB { extractedV[0U] };
98 const std::uint64_t extractedR { extractedV[1U] };
110 const std::uint64_t pextMaskB {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq)] };
111 const std::uint64_t pextMaskR {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
113 const svuint64_t pextMaskV { svdupq_u64(pextMaskB, pextMaskR) };
115 const std::uint64_t offsetB {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq)] };
116 const std::uint64_t offsetR {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
118 const svuint64_t occupancyMaskV { svdup_u64(
static_cast<std::uint64_t
>(occupancyMask)) };
120 svuint64_t extractedV { svbext_u64(occupancyMaskV, pextMaskV) };
122 const std::uint64_t extractedB { extractedV[0U] };
123 const std::uint64_t extractedR { extractedV[1U] };
125 return std::make_pair(
133 SquareSet occupancyMaskForRookAttacks)
noexcept
135 const std::uint64_t pextMaskB {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq)] };
136 const std::uint64_t pextMaskR {
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
138 const svuint64_t pextMaskV { svdupq_u64(pextMaskB, pextMaskR) };
140 const std::uint64_t offsetB {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq)] };
141 const std::uint64_t offsetR {
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(sq) + 1U] };
143 const svuint64_t occupancyMaskV { svdupq_u64(
144 static_cast<std::uint64_t
>(occupancyMaskForBishopAttacks),
145 static_cast<std::uint64_t
>(occupancyMaskForRookAttacks)) };
147 svuint64_t extractedV { svbext_u64(occupancyMaskV, pextMaskV) };
149 const std::uint64_t extractedB { extractedV[0U] };
150 const std::uint64_t extractedR { extractedV[1U] };
152 return std::make_pair(
167 const svbool_t firstTwo { svptrue_pat_b64(SV_VL2) };
169 const svuint64_t pextMaskV { svld1_u64(firstTwo, &
ctBitBoardTables.sve2BishopRookMasks[2U *
static_cast<std::uint8_t
>(kingSq)]) };
170 const svuint64_t occupancyMaskV { svdup_u64(
static_cast<std::uint64_t
>(occupancyMask)) };
171 const svuint64_t opponentPiecesV { svdup_u64(
static_cast<std::uint64_t
>(opponentPieces)) };
172 const svuint64_t bishopsRooksV { svdupq_u64(
static_cast<std::uint64_t
>(bishops),
static_cast<std::uint64_t
>(rooks)) };
173 const svuint64_t baseOffsetV { svld1_u64(firstTwo, &
ctBitBoardTables.sve2BishopRookOffsets[2U *
static_cast<std::uint8_t
>(kingSq)]) };
176 svuint64_t extractedV { svbext_u64(occupancyMaskV, pextMaskV) };
177 const svuint64_t firstHitsV { svld1_gather_u64index_u64(firstTwo,
ctBitBoardTables.sve2BishopRookAttackData.data(), baseOffsetV + extractedV) };
178 const svuint64_t checkersV { firstHitsV & bishopsRooksV & opponentPiecesV };
180 out_checkers = {
SquareSet { svorv_u64(firstTwo, checkersV) } };
187 extractedV = svbext_u64(
188 ((occupancyMaskV &~ firstHitsV) | (opponentPiecesV &~ svdupq_u64(
static_cast<std::uint64_t
>(epCapturable), 0U))),
191 const svuint64_t secondHitsV { svld1_gather_u64index_u64(firstTwo,
ctBitBoardTables.sve2BishopRookAttackData.data(), baseOffsetV + extractedV) };
192 const svuint64_t pinnersV { secondHitsV & bishopsRooksV };
194 out_pinners =
SquareSet { svorv_u64(firstTwo, pinnersV) } &~ out_checkers & opponentPieces;
Slider attacks implementation using PEXT/PDEP.
Definition bitboard-attacks-aarch64-sve2-bitperm.h:39
static SquareSet getQueenAttackMask(Square sq, SquareSet occupancyMask) noexcept
See Attacks::getQueenAttackMask() for documentation.
Definition bitboard-attacks-aarch64-sve2-bitperm.h:80
static std::pair< SquareSet, SquareSet > getBishopAndRookAttackMasks(Square sq, SquareSet occupancyMask) noexcept
Definition bitboard-attacks-aarch64-sve2-bitperm.h:106
static const PextData ctPextData
Definition bitboard-attacks-aarch64-sve2-bitperm.h:48
static SquareSet getBishopAttackMask(Square sq, SquareSet occupancyMask) noexcept
See Attacks::getBishopAttackMask() for documentation.
Definition bitboard-attacks-aarch64-sve2-bitperm.h:52
static void determineSliderCheckersAndPinners(Square kingSq, SquareSet occupancyMask, SquareSet rooks, SquareSet bishops, SquareSet opponentPieces, SquareSet epCapturable, SquareSet &out_checkers, SquareSet &out_pinners) noexcept
Definition bitboard-attacks-aarch64-sve2-bitperm.h:157
static std::pair< SquareSet, SquareSet > getBishopAndRookAttackMasks(Square sq, SquareSet occupancyMaskForBishopAttacks, SquareSet occupancyMaskForRookAttacks) noexcept
Definition bitboard-attacks-aarch64-sve2-bitperm.h:130
static SquareSet getRookAttackMask(Square sq, SquareSet occupancyMask) noexcept
See Attacks::getRookAttackMask() for documentation.
Definition bitboard-attacks-aarch64-sve2-bitperm.h:66
Set of squares. Implemented using a bit-mask.
Definition chessboard-types-squareset.h:35
Square
Named square.
Definition chessboard-types.h:122
Definition chessboard-types-squareset.h:30
const BitBoardTables ctBitBoardTables
Various bitboard attack and other tables.
Definition bitboard-attacks-aarch64-sve2-bitperm.h:42
std::array< std::uint64_t, 5248U+102400U > bishopRookAttackData
Definition bitboard-attacks-aarch64-sve2-bitperm.h:45
std::array< std::uint64_t, 128U > bishopRookMasks
Definition bitboard-attacks-aarch64-sve2-bitperm.h:43
std::array< std::uint64_t, 128U > bishopRookOffsets
Definition bitboard-attacks-aarch64-sve2-bitperm.h:44