Loongarch opts

optimize loongarch64 inference

passed STC:
 LLR: 2.94 (-2.94,2.94) <0.00,2.00>
Total: 14208 W: 3792 L: 3510 D: 6906
Ptnml(0-2): 54, 1485, 3765, 1725, 75
https://tests.stockfishchess.org/tests/view/6a0a2a956524d21ee79b85a8

closes https://github.com/official-stockfish/Stockfish/pull/6832

No functional change
This commit is contained in:
anematode
2026-05-19 18:39:58 +02:00
committed by Joost VandeVondele
parent 24abab9f6c
commit 90890c5f1f
3 changed files with 20 additions and 9 deletions
+15 -2
View File
@@ -34,6 +34,8 @@
#ifdef __aarch64__
#include <arm_acle.h>
#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 {
+3 -4
View File
@@ -527,8 +527,8 @@ Bitboard get_changed_pieces(const std::array<Piece, SQUARE_NB>& oldPieces,
const __m256i new_v = __lasx_xvld(reinterpret_cast<const void*>(&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<std::uint16_t>(__lasx_xvpickve2gr_d(mask, 0));
const auto hi = static_cast<std::uint16_t>(__lasx_xvpickve2gr_d(mask, 2));
const auto lo = __lasx_xvpickve2gr_d(mask, 0);
const auto hi = __lasx_xvpickve2gr_d(mask, 2);
changed |= (static_cast<Bitboard>(lo) | (static_cast<Bitboard>(hi) << 16)) << i;
}
@@ -546,8 +546,7 @@ Bitboard get_changed_pieces(const std::array<Piece, SQUARE_NB>& oldPieces,
const __m128i diff = __lsx_vxor_v(old_v, new_v);
const __m128i mask = __lsx_vmsknz_b(diff);
changed |= static_cast<Bitboard>(static_cast<std::uint16_t>(__lsx_vpickve2gr_d(mask, 0)))
<< i;
changed |= static_cast<Bitboard>(__lsx_vpickve2gr_d(mask, 0)) << i;
}
return changed;
+2 -3
View File
@@ -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)