p12tic / libsimdpp

Portable header-only C++ low level SIMD library
Boost Software License 1.0
1.24k stars 129 forks source link

undefined __builtin_shuffle() in clang #187

Open peabody-korg opened 2 months ago

peabody-korg commented 2 months ago

clang doesn't define __builtin_shuffle(), but due to clang defining __GNUC__ 2 implementations of i_permute4() cause clang compilation to fail:

[...] libsimdpp/simdpp/detail/insn/permute4.h:105:12 Use of undeclared identifier '__builtin_shuffle'

template<unsigned s0, unsigned s1, unsigned s2, unsigned s3> SIMDPP_INL
uint32x4 i_permute4(const uint32x4& a)
{
    static_assert(s0 < 4 && s1 < 4 && s2 < 4 && s3 < 4, "Selector out of range");
[...]
#if __GNUC__
    return __builtin_shuffle(a.native(), a.native(), (uint32x4_t){s0, s1, s2, s3});
#else
    return detail::neon_shuffle_int32x4::permute4<s0,s1,s2,s3>(a);
#endif
[...]
}

Need to also include !clang in the #if predicate:

#if __GNUC__ && !__clang__

macos 12.7.6 xcode 14.2 apple silicon build commit 55860b50