@@ -372,36 +372,39 @@ namespace xsimd
372372 detail::store_masked (mem, src, mask.mask (), Mode {});
373373 }
374374
375- // namespace detail
376- // {
377- // template <class A, class T>
378- // std::array<batch_bool<T, A>, 2> zip_complex_mask(batch_bool<T, A> mask)
379- // {
380- // using mask_register_type = typename batch_bool<T, A>::register_type;
381- // mask_register_type nmask = mask.to_native();
382-
383- // constexpr mask_register_type lo_bitmask = xsimd::utils::make_low_mask<mask_register_type>(mask.size / 2);
384- // mask_register_type lo_mask = nmask & lo_bitmask;
385- // lo_mask |= lo_mask << (mask.size / 2);
386-
387- // constexpr mask_register_type hi_bitmask = lo_bitmask << (mask.size / 2);
388- // mask_register_type hi_mask = nmask & hi_bitmask;
389- // hi_mask |= hi_mask >> (mask.size / 2);
390-
391- // return { batch_bool<T, A>{ lo_mask }, batch_bool<T, A>{ hi_mask } };
392- // }
393- // }
375+ namespace detail
376+ {
377+ template <class A , class T >
378+ std::array<batch_bool<T, A>, 2 > zip_complex_mask (batch_bool<T, A> mask)
379+ {
380+ using mask_register_type = typename batch_bool<T, A>::register_type;
381+ mask_register_type nmask = mask.to_native ();
382+
383+ constexpr mask_register_type lo_bitmask = xsimd::utils::make_low_mask<mask_register_type>(mask.size / 2 );
384+ mask_register_type lo_mask = nmask & lo_bitmask;
385+ lo_mask |= lo_mask << (mask.size / 2 );
386+
387+ constexpr mask_register_type hi_bitmask = lo_bitmask << (mask.size / 2 );
388+ mask_register_type hi_mask = nmask & hi_bitmask;
389+ hi_mask |= hi_mask >> (mask.size / 2 );
394390
395- // template <class A, class T, class Mode>
396- // XSIMD_INLINE void
397- // 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
398- // {
399- // auto [lo_mask, hi_mask] = detail::zip_complex_mask(mask);
400- // batch<T, A> src_lo = zip_lo(src.real(), src.imag());
401- // batch<T, A> src_hi = zip_hi(src.real(), src.imag());
402- // detail::store_masked(reinterpret_cast<T*>(mem), src_lo, lo_mask, mode);
403- // detail::store_masked(reinterpret_cast<T*>(mem) + src.size, src_hi, hi_mask, mode);
404- // }
391+ return { batch_bool<T, A> { lo_mask }, batch_bool<T, A> { hi_mask } };
392+ }
393+ }
394+
395+ template <class A , class T , class Mode >
396+ XSIMD_INLINE void
397+ 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
398+ {
399+ auto [lo_mask, hi_mask] = detail::zip_complex_mask (mask);
400+ batch<T, A> src_lo = zip_lo (src.real (), src.imag ());
401+ batch<T, A> src_hi = zip_hi (src.real (), src.imag ());
402+
403+ auto src_lo = detail::complex_low (src, A { });
404+ auto src_hi = detail::complex_high (src, A { });
405+ detail::store_masked (reinterpret_cast <T*>(mem), src_lo, lo_mask, mode, A { });
406+ detail::store_masked (reinterpret_cast <T*>(mem) + src.size , src_hi, hi_mask, mode, A { });
407+ }
405408
406409 // abs
407410 template <class A >
0 commit comments