• Pierrick Bouvier's avatar
    [msvc] fix build with neon intrinsics · 1b3a4f0c
    Pierrick Bouvier authored
    This compilation error was found by NodeJS when updating V8:
    https://github.com/nodejs/node-v8/issues/240
    
    MSVC reports an error with "too many initializer" for type uint32x4_t.
    
    ---
    
    Under gcc/clang, this is a typedef to a builtin type.
    
    For MSVC, it is a typedef to this union:
    typedef union __n128
    {
         unsigned __int64   n128_u64[2];
         unsigned __int32   n128_u32[4];
         ...
    } __n128;
    
    C++ mandates that only first member of union can be initialized at
    declaration. Thus, it can only be initialized with {uint64_t, uint64_t}.
    
    VS people proposed to use designated initializer instead:
    var = {.n128_u32={1, 2, 3, 8}}
    https://developercommunity.visualstudio.com/t/error-c2078-too-many-initializers-when-using-arm-n/402911
    But, you need to use /std:c++20 for this, which is not the case in v8.
    
    ---
    
    Thus, the only solution is to implement a hack specifically for MSVC,
    where you build two uint64, from four uint32.
    
    ---------------------------------------
    
    Once solved, another error is reported:
    templated function extract_first_nonzero_index is specialized twice.
    
    This is because, with MSVC, uint32x4_t and uint64x2_t are typedef to the
    same __n128 union. The fix is to drop templates, and use explicit
    function names instead.
    
    Bug: v8:13312
    Change-Id: I231d8cf01c05af01af319d56d5666c415f8b989b
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3913035Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
    Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
    Commit-Queue: Jakob Kummerow <jkummerow@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#83404}
    1b3a4f0c
simd.cc 15.3 KB