HooverChessUtils_PgnReader 0.9.0
Loading...
Searching...
No Matches
bitboard-tables.h
Go to the documentation of this file.
1// Hoover Chess Utilities / PGN reader
2// Copyright (C) 2023-2026 Sami Kiminki
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <https://www.gnu.org/licenses/>.
16
17#ifndef HOOVER_CHESS_UTILS__PGN_READER__BITBOARD_TABLES_H_INCLUDED
18#define HOOVER_CHESS_UTILS__PGN_READER__BITBOARD_TABLES_H_INCLUDED
19
20#include "pgnreader-config.h"
21
22#include <array>
23#include <cstdint>
24
25#define BITBOARD_TABLES_HAVE_X86_BMI2 (HAVE_X86_BMI2)
26#define BITBOARD_TABLES_HAVE_AARCH64_SVE2_BITPERM (0 && HAVE_AARCH64_SVE2_BITPERM)
27
28#define BITBOARD_TABLES_HAVE_ELEMENTARY 0
29#define BITBOARD_TABLES_HAVE_BLACK_MAGIC (!(BITBOARD_TABLES_HAVE_X86_BMI2 || BITBOARD_TABLES_HAVE_AARCH64_SVE2_BITPERM))
30#define BITBOARD_TABLES_HAVE_HYPERBOLA 0
31
33{
34
36{
44 alignas(64)
45 std::array<std::array<std::uint64_t, 2U>, 64U> pawnAttackMasks;
46
50 alignas(64)
51 std::array<std::uint64_t, 64U> knightAttackMasks;
52
56 alignas(64)
57 std::array<std::uint64_t, 64U> kingAttackMasks;
58
62 alignas(64)
63 std::array<std::array<std::uint64_t, 64U>, 65U> rayIntercepts;
64
68 alignas(64)
69 std::array<std::array<std::uint64_t, 64U>, 64U> raysFromKing;
70
74 alignas(64)
75 std::array<std::array<std::uint8_t, 8U>, 256U> rookHorizAttackMasks;
76
77#if (BITBOARD_TABLES_HAVE_X86_BMI2)
78 alignas(64) std::array<std::uint64_t, 64U> bmi2BishopMasks;
79 alignas(64) std::array<const std::uint64_t *, 64U> bmi2BishopOffsets;
80 alignas(64) std::array<std::uint64_t, 64U> bmi2RookMasks;
81 alignas(64) std::array<const std::uint64_t *, 64U> bmi2RookOffsets;
82 alignas(64) std::uint64_t bmi2BishopRookAttackData[5248U + 102400U];
83#endif
84
85#if (BITBOARD_TABLES_HAVE_ELEMENTARY)
86 struct MasksAndMultipliers
87 {
88 std::uint64_t masks[3U];
89 std::uint64_t shift;
90 std::uint64_t multipliers[3U];
91 std::uint64_t zeroPadding;
92 };
93
94 static_assert(sizeof(MasksAndMultipliers) == 64);
95
96 alignas(64) std::array<MasksAndMultipliers, 64U> elementaryBishopMaskMults;
97 alignas(64) std::array<std::uint32_t, 64U> elementaryBishopOffsets;
98 alignas(64) std::array<MasksAndMultipliers, 64U> elementaryRookMaskMults;
99 alignas(64) std::array<std::uint32_t, 64U> elementaryRookOffsets;
100 alignas(64) std::array<std::uint64_t, 5248U + 102400U> elementaryBishopRookAttackData;
101#endif
102
103#if (BITBOARD_TABLES_HAVE_AARCH64_SVE2_BITPERM)
104 alignas(64) std::array<std::uint64_t, 128U> sve2BishopRookMasks;
105 alignas(64) std::array<std::uint64_t, 128U> sve2BishopRookOffsets;
106 alignas(64) std::array<std::uint64_t, 5248U + 102400U> sve2BishopRookAttackData;
107#endif
108
109#if (BITBOARD_TABLES_HAVE_HYPERBOLA)
110 struct HyperbolaAttackMasks
111 {
112 std::uint64_t sqBit;
113 std::uint64_t vertMaskEx; // vertical column minus square
114 std::uint64_t diagBLTREx; // diagonal minus square
115 std::uint64_t diagBRTLEx; // anti-diagonal minus square
116 };
117
118 alignas(64) std::array<HyperbolaAttackMasks, 64U> hyperbolaAttackMasks;
119#endif
120
121#if (BITBOARD_TABLES_HAVE_BLACK_MAGIC)
123 const std::uint64_t *attacksBase;
124 std::uint64_t mask;
125 std::uint64_t hash;
126
127 BlackMagicData(std::uint64_t _attacksOffset,
128 std::uint64_t _mask,
129 std::uint64_t _hash) noexcept;
130 };
131
132 alignas(64) std::array<std::uint64_t, 88507U> blackMagicAttacks;
133 alignas(64) std::array<BlackMagicData, 64U> blackMagicBishopMagics;
134 alignas(64) std::array<BlackMagicData, 64U> blackMagicRookMagics;
135#endif
136
137};
138
141
142}
143
144#endif
Definition chessboard-types-squareset.h:30
const BitBoardTables ctBitBoardTables
Various bitboard attack and other tables.
const std::uint64_t * attacksBase
Definition bitboard-tables.h:123
BlackMagicData(std::uint64_t _attacksOffset, std::uint64_t _mask, std::uint64_t _hash) noexcept
std::uint64_t hash
Definition bitboard-tables.h:125
std::uint64_t mask
Definition bitboard-tables.h:124
Definition bitboard-tables.h:36
std::array< std::array< std::uint64_t, 64U >, 65U > rayIntercepts
Ray attack intercept squares from king to checker.
Definition bitboard-tables.h:63
std::array< std::array< std::uint64_t, 2U >, 64U > pawnAttackMasks
Pawn attack masks.
Definition bitboard-tables.h:45
std::array< std::array< std::uint8_t, 8U >, 256U > rookHorizAttackMasks
Horizontal rook attacks: column to squares on the column.
Definition bitboard-tables.h:75
std::array< std::array< std::uint64_t, 64U >, 64U > raysFromKing
Rays from a king square to the direction of a pinned piece square.
Definition bitboard-tables.h:69
std::array< std::uint64_t, 64U > kingAttackMasks
King attack masks.
Definition bitboard-tables.h:57
std::array< BlackMagicData, 64U > blackMagicRookMagics
Definition bitboard-tables.h:134
std::array< std::uint64_t, 64U > knightAttackMasks
Knight attack masks.
Definition bitboard-tables.h:51
std::array< BlackMagicData, 64U > blackMagicBishopMagics
Definition bitboard-tables.h:133
std::array< std::uint64_t, 88507U > blackMagicAttacks
Definition bitboard-tables.h:132