Skip to content

fix(simd): build NEON lane-mask weights without brace init on MSVC - #819

Merged
adsharma merged 1 commit into
mainfrom
windows_simd_fix
Aug 17, 2026
Merged

fix(simd): build NEON lane-mask weights without brace init on MSVC#819
adsharma merged 1 commit into
mainfrom
windows_simd_fix

Conversation

@adsharma

Copy link
Copy Markdown
Contributor

Problem

Recent SIMD filter kernels (70f8828c5, d187dd03c) break Windows ARM64 builds. MSVC fails compiling src/function/simd_filter_neon.cpp:

simd_filter_neon.cpp(226): error C2078: too many initializers
simd_filter_neon.cpp(231): error C2078: too many initializers
simd_filter_neon.cpp(234): error C2078: too many initializers

Root cause

MSVC ARM64 maps the NEON vector types (uint8x8_t, uint16x8_t, uint32x4_t, ...) to the intrinsic __n64/__n128 types, which cannot be initialized with scalar brace lists (same known issue as xtensor-stack/xsimd#611). The lane-mask weights {1, 2, 4, 8, ...} in toLaneMask were constructed with = {...} initializers.

Fix

Build the weights from bit patterns using vcreate_u8 / vcreate_u16 / vcreate_u32 + vcombine, which is portable across GCC, Clang, and MSVC:

  • uint8x8_t: vcreate_u8(0x8040201008040201ULL){1,2,4,8,16,32,64,128}
  • uint16x8_t: vcombine_u16(vcreate_u16(...), vcreate_u16(...)){1,...,128}
  • uint32x4_t: vcombine_u32(vcreate_u32(...), vcreate_u32(...)){1,2,4,8}

Verification

  • Lane-mask extraction verified against scalar reference on ARM64 (all single-lane, full, and mixed patterns).
  • SIMDFilterTest.* (4 tests) pass locally on ARM64.
  • ci-workflow.yml with platform=windows — Build and Test steps pass on the Windows ARM64 runner.
  • clang-format-18 clean.

MSVC ARM64 maps NEON vector types (uint8x8_t, uint16x8_t, uint32x4_t) to
the __n64/__n128 intrinsic types, which cannot be initialized with scalar
brace lists (C2078: too many initializers). Build the {1,2,4,...} lane
weights from bit patterns via vcreate_u8/vcreate_u16/vcreate_u32 +
vcombine instead, which is portable across GCC/Clang/MSVC.
@adsharma
adsharma merged commit da26986 into main Aug 17, 2026
8 checks passed
@adsharma
adsharma deleted the windows_simd_fix branch August 17, 2026 19:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant