diff --git a/src/bitboard.h b/src/bitboard.h index db1e69633..eb86e1a65 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -34,6 +34,8 @@ #ifdef __aarch64__ #include #define USE_HYPERBOLA_QUINT +#elif defined(__loongarch__) && __loongarch_grlen == 64 + #define USE_HYPERBOLA_QUINT #endif namespace Stockfish { @@ -80,6 +82,17 @@ extern Bitboard LineBB[SQUARE_NB][SQUARE_NB]; extern Bitboard RayPassBB[SQUARE_NB][SQUARE_NB]; #ifdef USE_HYPERBOLA_QUINT + +inline Bitboard reverse_bb(Bitboard bb) { + #ifdef __aarch64__ + return __rbitll(bb); + #else // loongarch + Bitboard out; + asm("bitrev.d %0, %1" : "=r"(out) : "r"(bb)); + return out; + #endif +} + // Hyperbola quintessence implementation for ARM, thanks to the availability of an // efficient bit reversal instruction. // See https://www.chessprogramming.org/Hyperbola_Quintessence @@ -92,8 +105,8 @@ struct Magic { Bitboard hyperbola(Bitboard occupied, Bitboard mask) const { Bitboard o = occupied & mask; Bitboard fwd = o - r; - Bitboard rev = __rbitll(o) - rr; - return (fwd ^ __rbitll(rev)) & mask; + Bitboard rev = reverse_bb(o) - rr; + return (fwd ^ reverse_bb(rev)) & mask; } Bitboard attacks_bb(Bitboard occupied) const { diff --git a/src/nnue/nnue_accumulator.cpp b/src/nnue/nnue_accumulator.cpp index a1480fd89..0c13e0ee6 100644 --- a/src/nnue/nnue_accumulator.cpp +++ b/src/nnue/nnue_accumulator.cpp @@ -527,8 +527,8 @@ Bitboard get_changed_pieces(const std::array& oldPieces, const __m256i new_v = __lasx_xvld(reinterpret_cast(&newPieces[i]), 0); const __m256i diff = __lasx_xvxor_v(old_v, new_v); const __m256i mask = __lasx_xvmsknz_b(diff); - const auto lo = static_cast(__lasx_xvpickve2gr_d(mask, 0)); - const auto hi = static_cast(__lasx_xvpickve2gr_d(mask, 2)); + const auto lo = __lasx_xvpickve2gr_d(mask, 0); + const auto hi = __lasx_xvpickve2gr_d(mask, 2); changed |= (static_cast(lo) | (static_cast(hi) << 16)) << i; } @@ -546,8 +546,7 @@ Bitboard get_changed_pieces(const std::array& oldPieces, const __m128i diff = __lsx_vxor_v(old_v, new_v); const __m128i mask = __lsx_vmsknz_b(diff); - changed |= static_cast(static_cast(__lsx_vpickve2gr_d(mask, 0))) - << i; + changed |= static_cast(__lsx_vpickve2gr_d(mask, 0)) << i; } return changed; diff --git a/src/nnue/simd.h b/src/nnue/simd.h index d1592e88b..c9c585b50 100644 --- a/src/nnue/simd.h +++ b/src/nnue/simd.h @@ -312,8 +312,7 @@ inline __m256i lasx_cvtepi8_epi16(__m128i a) { inline int lasx_vec_nnz(__m256i a) { const __m256i cmp = __lasx_xvslt_w(__lasx_xvldi(0), a); const __m256i msk = __lasx_xvmskltz_w(cmp); - return ((int) __lasx_xvpickve2gr_w(msk, 0) & 0xF) - | (((int) __lasx_xvpickve2gr_w(msk, 4) & 0xF) << 4); + return ((int) __lasx_xvpickve2gr_w(msk, 0)) | (((int) __lasx_xvpickve2gr_w(msk, 4)) << 4); } #elif USE_LSX @@ -360,7 +359,7 @@ inline __m128i lsx_packus_32(__m128i a, __m128i b) { inline int lsx_vec_nnz(__m128i a) { const __m128i cmp = __lsx_vslt_w(__lsx_vldi(0), a); const __m128i msk = __lsx_vmskltz_w(cmp); - return ((int) __lsx_vpickve2gr_w(msk, 0) & 0xF); + return ((int) __lsx_vpickve2gr_w(msk, 0)); } #define vec_nnz(a) lsx_vec_nnz(a)