@@ -372,6 +372,28 @@ namespace xsimd
372372 detail::store_masked (mem, src, mask.mask (), Mode {});
373373 }
374374
375+ template <class A , class T , class Mode >
376+ XSIMD_INLINE void
377+ store_complex_masked (std::complex <T>* mem, batch<std::complex <T>, A> const & src, batch_bool<T, A> mask, Mode mode, requires_arch<avx512f>) noexcept
378+ {
379+ using mask_register_type = typename batch_bool<T, A>::register_type;
380+ mask_register_type nmask = mask.to_native ();
381+
382+ // manually zip mask
383+ constexpr mask_register_type lo_bitmask = xsimd::utils::make_low_mask<mask_register_type>(src.size / 2 );
384+ mask_register_type lo_mask = nmask & lo_bitmask;
385+ lo_mask |= lo_mask << (src.size / 2 );
386+
387+ constexpr mask_register_type hi_bitmask = lo_bitmask << (src.size / 2 );
388+ mask_register_type hi_mask = nmask & hi_bitmask;
389+ hi_mask |= hi_mask >> (src.size / 2 );
390+
391+ batch<T, A> src_lo = zip_lo (src.real (), src.imag ());
392+ batch<T, A> src_hi = zip_hi (src.real (), src.imag ());
393+ store_masked (reinterpret_cast <T*>(mem), src_lo, batch_bool<T, A> { lo_mask }, mode);
394+ store_masked (reinterpret_cast <T*>(mem) + src.size , src_hi, batch_bool<T, A> { hi_mask }, mode);
395+ }
396+
375397 // abs
376398 template <class A >
377399 XSIMD_INLINE batch<float , A> abs (batch<float , A> const & self, requires_arch<avx512f>) noexcept
0 commit comments