diff --git a/src/nnue/nnue_accumulator.cpp b/src/nnue/nnue_accumulator.cpp index f33b7b9fc..5922275d0 100644 --- a/src/nnue/nnue_accumulator.cpp +++ b/src/nnue/nnue_accumulator.cpp @@ -379,8 +379,8 @@ struct AccumulatorUpdateContext { #ifdef USE_NEON for (IndexType k = 0; k < Tiling::NumRegs; k += 2) { - acc[k] = vec_sub_16(acc[k], vmovl_s8(vget_low_s8(column[k / 2]))); - acc[k + 1] = vec_sub_16(acc[k + 1], vmovl_high_s8(column[k / 2])); + acc[k] = vsubw_s8(acc[k], vget_low_s8(column[k / 2])); + acc[k + 1] = vsubw_high_s8(acc[k + 1], column[k / 2]); } #else for (IndexType k = 0; k < Tiling::NumRegs; ++k) @@ -397,8 +397,8 @@ struct AccumulatorUpdateContext { #ifdef USE_NEON for (IndexType k = 0; k < Tiling::NumRegs; k += 2) { - acc[k] = vec_add_16(acc[k], vmovl_s8(vget_low_s8(column[k / 2]))); - acc[k + 1] = vec_add_16(acc[k + 1], vmovl_high_s8(column[k / 2])); + acc[k] = vaddw_s8(acc[k], vget_low_s8(column[k / 2])); + acc[k + 1] = vaddw_high_s8(acc[k + 1], column[k / 2]); } #else for (IndexType k = 0; k < Tiling::NumRegs; ++k) @@ -890,8 +890,8 @@ void update_threats_accumulator_full(Color persp #ifdef USE_NEON for (IndexType k = 0; k < Tiling::NumRegs; k += 2) { - acc[k] = vec_add_16(acc[k], vmovl_s8(vget_low_s8(column[k / 2]))); - acc[k + 1] = vec_add_16(acc[k + 1], vmovl_high_s8(column[k / 2])); + acc[k] = vaddw_s8(acc[k], vget_low_s8(column[k / 2])); + acc[k + 1] = vaddw_high_s8(acc[k + 1], column[k / 2]); } #else for (IndexType k = 0; k < Tiling::NumRegs; ++k) diff --git a/src/nnue/simd.h b/src/nnue/simd.h index 601792c1c..6a549eb3f 100644 --- a/src/nnue/simd.h +++ b/src/nnue/simd.h @@ -221,8 +221,9 @@ static constexpr std::uint32_t Mask[4] = {1, 2, 4, 8}; #define MaxChunkSize 16 #ifndef __aarch64__ -// Single instruction doesn't exist on 32-bit ARM -inline int16x8_t vmovl_high_s8(int8x16_t val) { return vmovl_s8(vget_high_s8(val)); } +// Instructions that don't exist on 32-bit ARM +inline int16x8_t vaddw_high_s8(int16x8_t a, int8x16_t b) { return vaddw_s8(a, vget_high_s8(b)); } +inline int16x8_t vsubw_high_s8(int16x8_t a, int8x16_t b) { return vsubw_s8(a, vget_high_s8(b)); } #endif #else