17#ifndef HOOVER_CHESS_UTILS__PGN_READER__BITTRICKS_H_INCLUDED
18#define HOOVER_CHESS_UTILS__PGN_READER__BITTRICKS_H_INCLUDED
20#include "pgnreader-config.h"
30#if (HAVE_AARCH64_SVE2_BITPERM)
46 static constexpr inline std::uint64_t
bits0ToN(std::uint8_t n)
noexcept
50 return (std::uint64_t { 2 } << n) - 1U;
68 static constexpr inline std::uint64_t
rangeHalfOpen(std::uint8_t a, std::uint8_t b)
noexcept
82 return mask & (-mask);
92 if (mask != 0U) [[likely]]
94 std::uint64_t topBit { UINT64_C(0x80'00'00'00'00'00'00'00) };
95 return (topBit >> std::countl_zero(mask));
136 static inline std::uint64_t
parallelExtract(std::uint64_t data, std::uint64_t mask)
noexcept
139 return _pext_u64(data, mask);
140#elif (HAVE_AARCH64_SVE2_BITPERM)
141 return svbext_n_u64(svdup_u64(data), mask)[0U];
145 std::uint64_t mk { (~mask) << 1U };
148 for (
unsigned i { }; i < 6U; ++i)
150 std::uint64_t mp { mk ^ (mk << 1U) };
151 mp = mp ^ (mp << 2U);
152 mp = mp ^ (mp << 4U);
153 mp = mp ^ (mp << 8U);
154 mp = mp ^ (mp << 16U);
155 mp = mp ^ (mp << 32U);
157 const std::uint64_t mv { mp & mask };
158 mask = (mask ^ mv) | (mv >> (UINT64_C(1) << i));
159 const std::uint64_t t { data & mv };
160 data = (data ^ t) | (t >> (UINT64_C(1) << i));
195 static inline std::uint64_t
parallelDeposit(std::uint64_t data, std::uint64_t mask)
noexcept
198 return _pdep_u64(data, mask);
199#elif (HAVE_AARCH64_SVE2_BITPERM)
200 return svbdep_n_u64(svdup_u64(data), mask)[0U];
204 std::uint64_t mk { (~mask) << 1U };
205 const std::uint64_t m0 { mask };
207 std::uint64_t arr[6];
209 for (
unsigned i { }; i < 6U; ++i)
211 std::uint64_t mp { mk ^ (mk << 1U) };
212 mp = mp ^ (mp << 2U);
213 mp = mp ^ (mp << 4U);
214 mp = mp ^ (mp << 8U);
215 mp = mp ^ (mp << 16U);
216 mp = mp ^ (mp << 32U);
218 const std::uint64_t mv { mp & mask };
220 mask = (mask ^ mv) | (mv >> (UINT64_C(1) << i));
224 for (
unsigned i { 5U }; i <= 5U; --i)
226 std::uint64_t mv { arr[i] };
227 const std::uint64_t t { data << (1U << i) };
228 data = (data & ~mv) | (t & mv);
Definition chessboard-types-squareset.h:30
Collection of bit tricks for 64-bit words.
Definition bittricks.h:40
static constexpr std::uint64_t isolateHighestSetBit(std::uint64_t mask) noexcept
Isolates (extracts) the highest bit set in bit mask.
Definition bittricks.h:89
static constexpr std::uint64_t isolateLowestSetBit(std::uint64_t mask) noexcept
Isolates (extracts) the lowest bit set in bit mask.
Definition bittricks.h:80
static std::uint64_t parallelDepositPortable(std::uint64_t data, std::uint64_t mask) noexcept
static constexpr std::uint64_t rangeHalfOpen(std::uint8_t a, std::uint8_t b) noexcept
Generates a half-open bit mask (min(a,b), max(a,b)].
Definition bittricks.h:68
static constexpr std::uint64_t bits0ToN(std::uint8_t n) noexcept
Generates a bit mask with bits 0 to N set.
Definition bittricks.h:46
static std::uint64_t parallelExtractPortable(std::uint64_t data, std::uint64_t mask) noexcept
static std::uint64_t parallelDeposit(std::uint64_t data, std::uint64_t mask) noexcept
Deposits bits of data to bit locations specified by mask.
Definition bittricks.h:195
static std::uint64_t parallelExtract(std::uint64_t data, std::uint64_t mask) noexcept
Extracts bits of data from bit locations specified by mask.
Definition bittricks.h:136