mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 20:57:10 +00:00
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:
committed by
Joost VandeVondele
parent
24abab9f6c
commit
90890c5f1f
+15
-2
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user