diff --git a/third_party/xsimd/include/xsimd/arch/xsimd_sse2.hpp b/third_party/xsimd/include/xsimd/arch/xsimd_sse2.hpp --- a/third_party/xsimd/include/xsimd/arch/xsimd_sse2.hpp +++ b/third_party/xsimd/include/xsimd/arch/xsimd_sse2.hpp @@ -1638,10 +1638,35 @@ XSIMD_INLINE batch swizzle(batch const& self, batch_constant mask, requires_arch) noexcept { return bitwise_cast(swizzle(bitwise_cast(self), mask, sse2 {})); } + template + XSIMD_INLINE batch swizzle(batch const& self, batch_constant, requires_arch) noexcept + { + // permute within each lane + constexpr auto mask_lo = detail::mod_shuffle(V0, V1, V2, V3); + constexpr auto mask_hi = detail::mod_shuffle(V4, V5, V6, V7); + __m128i lo = _mm_shufflelo_epi16(self, mask_lo); + __m128i hi = _mm_shufflehi_epi16(self, mask_hi); + + __m128i lo_lo = _mm_castpd_si128(_mm_shuffle_pd(_mm_castsi128_pd(lo), _mm_castsi128_pd(lo), _MM_SHUFFLE2(0, 0))); + __m128i hi_hi = _mm_castpd_si128(_mm_shuffle_pd(_mm_castsi128_pd(hi), _mm_castsi128_pd(hi), _MM_SHUFFLE2(1, 1))); + + // mask to choose the right lane + batch_bool_constant blend_mask; + + // blend the two permutes + return select(blend_mask, batch(lo_lo), batch(hi_hi)); + } + + template + XSIMD_INLINE batch swizzle(batch const& self, batch_constant mask, requires_arch) noexcept + { + return bitwise_cast(swizzle(bitwise_cast(self), mask, sse2 {})); + } + // transpose template XSIMD_INLINE void transpose(batch* matrix_begin, batch* matrix_end, requires_arch) noexcept { assert((matrix_end - matrix_begin == batch::size) && "correctly sized matrix"); diff --git a/third_party/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp b/third_party/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp --- a/third_party/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp +++ b/third_party/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp @@ -37,11 +37,11 @@ * performs memory allocation aligned by the specified value. * * @tparam T type of objects to allocate. * @tparam Align alignment in bytes. */ - template + template ::value, generic, default_arch>::type::alignment()> class aligned_allocator { public: using value_type = T; using pointer = T*; diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx2_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx2_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx2_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx2_register.hpp @@ -27,10 +27,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "avx2"; } }; #if XSIMD_WITH_AVX2 + +#if !XSIMD_WITH_AVX +#error "architecture inconsistency: avx2 requires avx" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(avx2, avx); } #endif diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512bw"; } }; #if XSIMD_WITH_AVX512BW +#if !XSIMD_WITH_AVX512DQ +#error "architecture inconsistency: avx512bw requires avx512dq" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512cd"; } }; #if XSIMD_WITH_AVX512CD +#if !XSIMD_WITH_AVX512F +#error "architecture inconsistency: avx512bw requires avx512f" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512dq"; } }; #if XSIMD_WITH_AVX512DQ +#if !XSIMD_WITH_AVX512CD +#error "architecture inconsistency: avx512dq requires avx512cd" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512er"; } }; #if XSIMD_WITH_AVX512ER +#if !XSIMD_WITH_AVX512CD +#error "architecture inconsistency: avx512er requires avx512cd" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp @@ -31,10 +31,14 @@ static constexpr char const* name() noexcept { return "avx512f"; } }; #if XSIMD_WITH_AVX512F +#if !XSIMD_WITH_AVX2 +#error "architecture inconsistency: avx512f requires avx2" +#endif + namespace types { template struct simd_avx512_bool_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512ifma"; } }; #if XSIMD_WITH_AVX512IFMA +#if !XSIMD_WITH_AVX512BW +#error "architecture inconsistency: avx512ifma requires avx512bw" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512pf"; } }; #if XSIMD_WITH_AVX512PF +#if !XSIMD_WITH_AVX512ER +#error "architecture inconsistency: avx512pf requires avx512er" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp @@ -29,10 +29,14 @@ static constexpr char const* name() noexcept { return "avx512vbmi"; } }; #if XSIMD_WITH_AVX512VBMI +#if !XSIMD_WITH_AVX512IFMA +#error "architecture inconsistency: avx512vbmi requires avx512ifma" +#endif + namespace types { template struct get_bool_simd_register { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp @@ -32,10 +32,14 @@ static constexpr char const* name() noexcept { return "avx512vnni+avx512bw"; } }; #if XSIMD_WITH_AVX512VNNI_AVX512BW +#if !XSIMD_WITH_AVX512BW +#error "architecture inconsistency: avx512vnni+avx512bw requires avx512bw" +#endif + namespace types { template struct get_bool_simd_register> { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi_register.hpp @@ -32,10 +32,14 @@ static constexpr char const* name() noexcept { return "avx512vnni+avx512vbmi"; } }; #if XSIMD_WITH_AVX512VNNI_AVX512VBMI +#if !XSIMD_WITH_AVX512VBMI +#error "architecture inconsistency: avx512vnni+avx512vbmi requires avx512vbmi" +#endif + namespace types { template struct get_bool_simd_register> { diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avx_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avx_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avx_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avx_register.hpp @@ -32,10 +32,14 @@ }; } #if XSIMD_WITH_AVX +#if !XSIMD_WITH_SSE4_2 +#error "architecture inconsistency: avx requires sse4.2" +#endif + #include namespace xsimd { namespace types diff --git a/third_party/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp @@ -27,10 +27,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "avxvnni"; } }; #if XSIMD_WITH_AVXVNNI + +#if !XSIMD_WITH_AVX2 +#error "architecture inconsistency: avxvnni requires avx2" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(avxvnni, avx2); } #endif diff --git a/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "fma3+avx2"; } }; #if XSIMD_WITH_FMA3_AVX2 + +#if !XSIMD_WITH_AVX2 +#error "architecture inconsistency: fma3+avx2 requires avx2" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(fma3, avx2); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "fma3+avx"; } }; #if XSIMD_WITH_FMA3_AVX + +#if !XSIMD_WITH_AVX +#error "architecture inconsistency: fma3+avx requires avx" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(fma3, avx); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "fma3+sse4.2"; } }; #if XSIMD_WITH_FMA3_SSE + +#if !XSIMD_WITH_SSE4_2 +#error "architecture inconsistency: fma3+sse4.2 requires sse4.2" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(fma3, sse4_2); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_fma4_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_fma4_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_fma4_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_fma4_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "fma4"; } }; #if XSIMD_WITH_FMA4 + +#if !XSIMD_WITH_SSE4_2 +#error "architecture inconsistency: fma4 requires sse4.2" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(fma4, sse4_2); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "i8mm+neon64"; } }; #if XSIMD_WITH_I8MM_NEON64 + +#if !XSIMD_WITH_NEON64 +#error "architecture inconsistency: i8mm+neon64 requires neon64" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(i8mm, neon64); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_neon64_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_neon64_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_neon64_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_neon64_register.hpp @@ -30,10 +30,14 @@ static constexpr char const* name() noexcept { return "arm64+neon"; } }; #if XSIMD_WITH_NEON64 +#if !XSIMD_WITH_NEON +#error "architecture inconsistency: neon64 requires neon" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(neon64, neon); XSIMD_DECLARE_SIMD_REGISTER(double, neon64, float64x2_t); diff --git a/third_party/xsimd/include/xsimd/types/xsimd_sse3_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_sse3_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_sse3_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_sse3_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "sse3"; } }; #if XSIMD_WITH_SSE3 + +#if !XSIMD_WITH_SSE2 +#error "architecture inconsistency: sse3 requires sse2" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(sse3, sse2); } diff --git a/third_party/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "sse4.1"; } }; #if XSIMD_WITH_SSE4_1 + +#if !XSIMD_WITH_SSSE3 +#error "architecture inconsistency: sse4.1 requires ssse3" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(sse4_1, ssse3); } #endif diff --git a/third_party/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "sse4.2"; } }; #if XSIMD_WITH_SSE4_2 + +#if !XSIMD_WITH_SSE4_1 +#error "architecture inconsistency: sse4.2 requires sse4.1" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(sse4_2, sse4_1); } #endif diff --git a/third_party/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp b/third_party/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp --- a/third_party/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp +++ b/third_party/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp @@ -31,10 +31,15 @@ static constexpr bool available() noexcept { return true; } static constexpr char const* name() noexcept { return "ssse3"; } }; #if XSIMD_WITH_SSSE3 + +#if !XSIMD_WITH_SSE3 +#error "architecture inconsistency: ssse3 requires sse3" +#endif + namespace types { XSIMD_DECLARE_SIMD_REGISTER_ALIAS(ssse3, sse3); } #endif diff --git a/third_party/xsimd/moz.yaml b/third_party/xsimd/moz.yaml --- a/third_party/xsimd/moz.yaml +++ b/third_party/xsimd/moz.yaml @@ -8,12 +8,12 @@ name: xsimd description: C++ wrappers for SIMD intrinsics url: https://github.com/QuantStack/xsimd - release: 297dd76efd0978b3152e5bbd7df9d52680905c4b (2025-01-02T09:12:22Z). - revision: 297dd76efd0978b3152e5bbd7df9d52680905c4b + release: 6d6067a049987803ae07dad62f66f603773324b9 (2025-01-26T21:05:43Z). + revision: 6d6067a049987803ae07dad62f66f603773324b9 license: BSD-3-Clause vendoring: url: https://github.com/QuantStack/xsimd