3#include "native/isa_import.h"
4#include "native/x86/vbmi2.h"
10#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
26 template<isa<x86> Arch>
27 requires(Arch.has(x86_feature::avx512f) &&
28 Arch.has(x86_feature::avx512bw) &&
29 Arch.has(x86_feature::avx512vbmi2) &&
30 Arch.has(x86_feature::avx512vl))
33 simd<
std::uint8_t, 16, Arch> source,
35 simd<
std::uint8_t, 16, Arch> value) noexcept {
37 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
40 detail::x86_vbmi2::mask_vpcompressb<Arch>(
41 source.to_native(),
mask.to_bitset(), value.to_native()));
46 template<isa<x86> Arch>
47 requires(Arch.has(x86_feature::avx512f) &&
48 Arch.has(x86_feature::avx512bw) &&
49 Arch.has(x86_feature::avx512vbmi2) &&
50 Arch.has(x86_feature::avx512vl))
59 detail::x86_vbmi2::maskz_vpcompressb<Arch>(
60 mask.to_bitset(), value.to_native()));
65 template<isa<x86> Arch>
66 requires(Arch.has(x86_feature::avx512f) &&
67 Arch.has(x86_feature::avx512bw) &&
68 Arch.has(x86_feature::avx512vbmi2) &&
69 Arch.has(x86_feature::avx512vl))
72 std::uint8_t * destination,
76 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
78 detail::x86_vbmi2::mask_vpcompressb<Arch>(
79 destination,
mask.to_bitset(), value.to_native());
84 template<isa<x86> Arch>
85 requires(Arch.has(x86_feature::avx512f) &&
86 Arch.has(x86_feature::avx512bw) &&
87 Arch.has(x86_feature::avx512vbmi2) &&
88 Arch.has(x86_feature::avx512vl))
95 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
98 detail::x86_vbmi2::mask_vpexpandb<Arch>(
99 source.to_native(),
mask.to_bitset(), value.to_native()));
104 template<isa<x86> Arch>
105 requires(Arch.has(x86_feature::avx512f) &&
106 Arch.has(x86_feature::avx512bw) &&
107 Arch.has(x86_feature::avx512vbmi2) &&
108 Arch.has(x86_feature::avx512vl))
117 detail::x86_vbmi2::maskz_vpexpandb<Arch>(
118 mask.to_bitset(), value.to_native()));
123 template<isa<x86> Arch,
class T>
124 requires(Arch.has(x86_feature::avx512f) &&
125 Arch.has(x86_feature::avx512bw) &&
126 Arch.has(x86_feature::avx512vbmi2) &&
127 Arch.has(x86_feature::avx512vl) &&
128 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
133 T * memory)
noexcept {
135 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
138 detail::x86_vbmi2::mask_vpexpandb<Arch>(
139 source.to_native(),
mask.to_bitset(), memory));
144 template<isa<x86> Arch,
class T>
145 requires(Arch.has(x86_feature::avx512f) &&
146 Arch.has(x86_feature::avx512bw) &&
147 Arch.has(x86_feature::avx512vbmi2) &&
148 Arch.has(x86_feature::avx512vl) &&
149 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
153 T * memory)
noexcept {
158 detail::x86_vbmi2::maskz_vpexpandb_128<Arch>(
159 static_cast<__mmask16
>(
mask.to_bitset()), memory));
164 template<isa<x86> Arch>
165 requires(Arch.has(x86_feature::avx512f) &&
166 Arch.has(x86_feature::avx512bw) &&
167 Arch.has(x86_feature::avx512vbmi2) &&
168 Arch.has(x86_feature::avx512vl))
175 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
178 detail::x86_vbmi2::mask_vpcompressw<Arch>(
179 source.to_native(),
mask.to_bitset(), value.to_native()));
184 template<isa<x86> Arch>
185 requires(Arch.has(x86_feature::avx512f) &&
186 Arch.has(x86_feature::avx512bw) &&
187 Arch.has(x86_feature::avx512vbmi2) &&
188 Arch.has(x86_feature::avx512vl))
197 detail::x86_vbmi2::maskz_vpcompressw<Arch>(
198 mask.to_bitset(), value.to_native()));
203 template<isa<x86> Arch>
204 requires(Arch.has(x86_feature::avx512f) &&
205 Arch.has(x86_feature::avx512bw) &&
206 Arch.has(x86_feature::avx512vbmi2) &&
207 Arch.has(x86_feature::avx512vl))
210 std::uint16_t * destination,
214 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
216 detail::x86_vbmi2::mask_vpcompressw<Arch>(
217 destination,
mask.to_bitset(), value.to_native());
222 template<isa<x86> Arch>
223 requires(Arch.has(x86_feature::avx512f) &&
224 Arch.has(x86_feature::avx512bw) &&
225 Arch.has(x86_feature::avx512vbmi2) &&
226 Arch.has(x86_feature::avx512vl))
233 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
236 detail::x86_vbmi2::mask_vpexpandw<Arch>(
237 source.to_native(),
mask.to_bitset(), value.to_native()));
242 template<isa<x86> Arch>
243 requires(Arch.has(x86_feature::avx512f) &&
244 Arch.has(x86_feature::avx512bw) &&
245 Arch.has(x86_feature::avx512vbmi2) &&
246 Arch.has(x86_feature::avx512vl))
255 detail::x86_vbmi2::maskz_vpexpandw<Arch>(
256 mask.to_bitset(), value.to_native()));
261 template<isa<x86> Arch,
class T>
262 requires(Arch.has(x86_feature::avx512f) &&
263 Arch.has(x86_feature::avx512bw) &&
264 Arch.has(x86_feature::avx512vbmi2) &&
265 Arch.has(x86_feature::avx512vl) &&
266 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
271 T * memory)
noexcept {
273 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
276 detail::x86_vbmi2::mask_vpexpandw<Arch>(
277 source.to_native(),
mask.to_bitset(), memory));
282 template<isa<x86> Arch,
class T>
283 requires(Arch.has(x86_feature::avx512f) &&
284 Arch.has(x86_feature::avx512bw) &&
285 Arch.has(x86_feature::avx512vbmi2) &&
286 Arch.has(x86_feature::avx512vl) &&
287 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
291 T * memory)
noexcept {
296 detail::x86_vbmi2::maskz_vpexpandw_128<Arch>(
297 static_cast<__mmask8
>(
mask.to_bitset()), memory));
302 template<isa<x86> Arch,
unsigned Imm8>
303 requires(Arch.has(x86_feature::avx512f) &&
304 Arch.has(x86_feature::avx512bw) &&
305 Arch.has(x86_feature::avx512vbmi2) &&
306 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
312 return detail::x86_vbmi2_constant::shift<false>(
316 detail::x86_vbmi2::vpshldw<Arch, Imm8>(
317 a.to_native(), b.to_native()));
322 template<isa<x86> Arch,
unsigned Imm8>
323 requires(Arch.has(x86_feature::avx512f) &&
324 Arch.has(x86_feature::avx512bw) &&
325 Arch.has(x86_feature::avx512vbmi2) &&
326 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
334 return detail::x86_vbmi2_constant::shift<false>(
335 a, b, Imm8, source,
mask.to_bitset());
338 detail::x86_vbmi2::mask_vpshldw<Arch, Imm8>(
339 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
344 template<isa<x86> Arch,
unsigned Imm8>
345 requires(Arch.has(x86_feature::avx512f) &&
346 Arch.has(x86_feature::avx512bw) &&
347 Arch.has(x86_feature::avx512vbmi2) &&
348 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
355 return detail::x86_vbmi2_constant::shift<false>(
359 detail::x86_vbmi2::maskz_vpshldw<Arch, Imm8>(
360 mask.to_bitset(), a.to_native(), b.to_native()));
365 template<isa<x86> Arch>
366 requires(Arch.has(x86_feature::avx512f) &&
367 Arch.has(x86_feature::avx512bw) &&
368 Arch.has(x86_feature::avx512vbmi2) &&
369 Arch.has(x86_feature::avx512vl))
376 return detail::x86_vbmi2_constant::shift<false>(
380 detail::x86_vbmi2::vpshldvw<Arch>(
381 a.to_native(), b.to_native(), counts.to_native()));
386 template<isa<x86> Arch>
387 requires(Arch.has(x86_feature::avx512f) &&
388 Arch.has(x86_feature::avx512bw) &&
389 Arch.has(x86_feature::avx512vbmi2) &&
390 Arch.has(x86_feature::avx512vl))
398 return detail::x86_vbmi2_constant::shift<false>(
399 a, b, counts, a,
mask.to_bitset());
402 detail::x86_vbmi2::mask_vpshldvw<Arch>(
403 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
408 template<isa<x86> Arch>
409 requires(Arch.has(x86_feature::avx512f) &&
410 Arch.has(x86_feature::avx512bw) &&
411 Arch.has(x86_feature::avx512vbmi2) &&
412 Arch.has(x86_feature::avx512vl))
420 return detail::x86_vbmi2_constant::shift<false>(
424 detail::x86_vbmi2::maskz_vpshldvw<Arch>(
425 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
430 template<isa<x86> Arch,
unsigned Imm8>
431 requires(Arch.has(x86_feature::avx512f) &&
432 Arch.has(x86_feature::avx512bw) &&
433 Arch.has(x86_feature::avx512vbmi2) &&
434 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
440 return detail::x86_vbmi2_constant::shift<true>(
444 detail::x86_vbmi2::vpshrdw<Arch, Imm8>(
445 a.to_native(), b.to_native()));
450 template<isa<x86> Arch,
unsigned Imm8>
451 requires(Arch.has(x86_feature::avx512f) &&
452 Arch.has(x86_feature::avx512bw) &&
453 Arch.has(x86_feature::avx512vbmi2) &&
454 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
462 return detail::x86_vbmi2_constant::shift<true>(
463 a, b, Imm8, source,
mask.to_bitset());
466 detail::x86_vbmi2::mask_vpshrdw<Arch, Imm8>(
467 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
472 template<isa<x86> Arch,
unsigned Imm8>
473 requires(Arch.has(x86_feature::avx512f) &&
474 Arch.has(x86_feature::avx512bw) &&
475 Arch.has(x86_feature::avx512vbmi2) &&
476 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
483 return detail::x86_vbmi2_constant::shift<true>(
487 detail::x86_vbmi2::maskz_vpshrdw<Arch, Imm8>(
488 mask.to_bitset(), a.to_native(), b.to_native()));
493 template<isa<x86> Arch>
494 requires(Arch.has(x86_feature::avx512f) &&
495 Arch.has(x86_feature::avx512bw) &&
496 Arch.has(x86_feature::avx512vbmi2) &&
497 Arch.has(x86_feature::avx512vl))
504 return detail::x86_vbmi2_constant::shift<true>(
508 detail::x86_vbmi2::vpshrdvw<Arch>(
509 a.to_native(), b.to_native(), counts.to_native()));
514 template<isa<x86> Arch>
515 requires(Arch.has(x86_feature::avx512f) &&
516 Arch.has(x86_feature::avx512bw) &&
517 Arch.has(x86_feature::avx512vbmi2) &&
518 Arch.has(x86_feature::avx512vl))
526 return detail::x86_vbmi2_constant::shift<true>(
527 a, b, counts, a,
mask.to_bitset());
530 detail::x86_vbmi2::mask_vpshrdvw<Arch>(
531 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
536 template<isa<x86> Arch>
537 requires(Arch.has(x86_feature::avx512f) &&
538 Arch.has(x86_feature::avx512bw) &&
539 Arch.has(x86_feature::avx512vbmi2) &&
540 Arch.has(x86_feature::avx512vl))
548 return detail::x86_vbmi2_constant::shift<true>(
552 detail::x86_vbmi2::maskz_vpshrdvw<Arch>(
553 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
558 template<isa<x86> Arch,
unsigned Imm8>
559 requires(Arch.has(x86_feature::avx512f) &&
560 Arch.has(x86_feature::avx512bw) &&
561 Arch.has(x86_feature::avx512vbmi2) &&
562 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
568 return detail::x86_vbmi2_constant::shift<false>(
572 detail::x86_vbmi2::vpshldd<Arch, Imm8>(
573 a.to_native(), b.to_native()));
578 template<isa<x86> Arch,
unsigned Imm8>
579 requires(Arch.has(x86_feature::avx512f) &&
580 Arch.has(x86_feature::avx512bw) &&
581 Arch.has(x86_feature::avx512vbmi2) &&
582 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
590 return detail::x86_vbmi2_constant::shift<false>(
591 a, b, Imm8, source,
mask.to_bitset());
594 detail::x86_vbmi2::mask_vpshldd<Arch, Imm8>(
595 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
600 template<isa<x86> Arch,
unsigned Imm8>
601 requires(Arch.has(x86_feature::avx512f) &&
602 Arch.has(x86_feature::avx512bw) &&
603 Arch.has(x86_feature::avx512vbmi2) &&
604 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
611 return detail::x86_vbmi2_constant::shift<false>(
615 detail::x86_vbmi2::maskz_vpshldd<Arch, Imm8>(
616 mask.to_bitset(), a.to_native(), b.to_native()));
621 template<isa<x86> Arch>
622 requires(Arch.has(x86_feature::avx512f) &&
623 Arch.has(x86_feature::avx512bw) &&
624 Arch.has(x86_feature::avx512vbmi2) &&
625 Arch.has(x86_feature::avx512vl))
632 return detail::x86_vbmi2_constant::shift<false>(
636 detail::x86_vbmi2::vpshldvd<Arch>(
637 a.to_native(), b.to_native(), counts.to_native()));
642 template<isa<x86> Arch>
643 requires(Arch.has(x86_feature::avx512f) &&
644 Arch.has(x86_feature::avx512bw) &&
645 Arch.has(x86_feature::avx512vbmi2) &&
646 Arch.has(x86_feature::avx512vl))
654 return detail::x86_vbmi2_constant::shift<false>(
655 a, b, counts, a,
mask.to_bitset());
658 detail::x86_vbmi2::mask_vpshldvd<Arch>(
659 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
664 template<isa<x86> Arch>
665 requires(Arch.has(x86_feature::avx512f) &&
666 Arch.has(x86_feature::avx512bw) &&
667 Arch.has(x86_feature::avx512vbmi2) &&
668 Arch.has(x86_feature::avx512vl))
676 return detail::x86_vbmi2_constant::shift<false>(
680 detail::x86_vbmi2::maskz_vpshldvd<Arch>(
681 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
686 template<isa<x86> Arch,
unsigned Imm8>
687 requires(Arch.has(x86_feature::avx512f) &&
688 Arch.has(x86_feature::avx512bw) &&
689 Arch.has(x86_feature::avx512vbmi2) &&
690 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
696 return detail::x86_vbmi2_constant::shift<true>(
700 detail::x86_vbmi2::vpshrdd<Arch, Imm8>(
701 a.to_native(), b.to_native()));
706 template<isa<x86> Arch,
unsigned Imm8>
707 requires(Arch.has(x86_feature::avx512f) &&
708 Arch.has(x86_feature::avx512bw) &&
709 Arch.has(x86_feature::avx512vbmi2) &&
710 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
718 return detail::x86_vbmi2_constant::shift<true>(
719 a, b, Imm8, source,
mask.to_bitset());
722 detail::x86_vbmi2::mask_vpshrdd<Arch, Imm8>(
723 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
728 template<isa<x86> Arch,
unsigned Imm8>
729 requires(Arch.has(x86_feature::avx512f) &&
730 Arch.has(x86_feature::avx512bw) &&
731 Arch.has(x86_feature::avx512vbmi2) &&
732 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
739 return detail::x86_vbmi2_constant::shift<true>(
743 detail::x86_vbmi2::maskz_vpshrdd<Arch, Imm8>(
744 mask.to_bitset(), a.to_native(), b.to_native()));
749 template<isa<x86> Arch>
750 requires(Arch.has(x86_feature::avx512f) &&
751 Arch.has(x86_feature::avx512bw) &&
752 Arch.has(x86_feature::avx512vbmi2) &&
753 Arch.has(x86_feature::avx512vl))
760 return detail::x86_vbmi2_constant::shift<true>(
764 detail::x86_vbmi2::vpshrdvd<Arch>(
765 a.to_native(), b.to_native(), counts.to_native()));
770 template<isa<x86> Arch>
771 requires(Arch.has(x86_feature::avx512f) &&
772 Arch.has(x86_feature::avx512bw) &&
773 Arch.has(x86_feature::avx512vbmi2) &&
774 Arch.has(x86_feature::avx512vl))
782 return detail::x86_vbmi2_constant::shift<true>(
783 a, b, counts, a,
mask.to_bitset());
786 detail::x86_vbmi2::mask_vpshrdvd<Arch>(
787 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
792 template<isa<x86> Arch>
793 requires(Arch.has(x86_feature::avx512f) &&
794 Arch.has(x86_feature::avx512bw) &&
795 Arch.has(x86_feature::avx512vbmi2) &&
796 Arch.has(x86_feature::avx512vl))
804 return detail::x86_vbmi2_constant::shift<true>(
808 detail::x86_vbmi2::maskz_vpshrdvd<Arch>(
809 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
814 template<isa<x86> Arch,
unsigned Imm8>
815 requires(Arch.has(x86_feature::avx512f) &&
816 Arch.has(x86_feature::avx512bw) &&
817 Arch.has(x86_feature::avx512vbmi2) &&
818 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
824 return detail::x86_vbmi2_constant::shift<false>(
828 detail::x86_vbmi2::vpshldq<Arch, Imm8>(
829 a.to_native(), b.to_native()));
834 template<isa<x86> Arch,
unsigned Imm8>
835 requires(Arch.has(x86_feature::avx512f) &&
836 Arch.has(x86_feature::avx512bw) &&
837 Arch.has(x86_feature::avx512vbmi2) &&
838 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
846 return detail::x86_vbmi2_constant::shift<false>(
847 a, b, Imm8, source,
mask.to_bitset());
850 detail::x86_vbmi2::mask_vpshldq<Arch, Imm8>(
851 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
856 template<isa<x86> Arch,
unsigned Imm8>
857 requires(Arch.has(x86_feature::avx512f) &&
858 Arch.has(x86_feature::avx512bw) &&
859 Arch.has(x86_feature::avx512vbmi2) &&
860 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
867 return detail::x86_vbmi2_constant::shift<false>(
871 detail::x86_vbmi2::maskz_vpshldq<Arch, Imm8>(
872 mask.to_bitset(), a.to_native(), b.to_native()));
877 template<isa<x86> Arch>
878 requires(Arch.has(x86_feature::avx512f) &&
879 Arch.has(x86_feature::avx512bw) &&
880 Arch.has(x86_feature::avx512vbmi2) &&
881 Arch.has(x86_feature::avx512vl))
888 return detail::x86_vbmi2_constant::shift<false>(
892 detail::x86_vbmi2::vpshldvq<Arch>(
893 a.to_native(), b.to_native(), counts.to_native()));
898 template<isa<x86> Arch>
899 requires(Arch.has(x86_feature::avx512f) &&
900 Arch.has(x86_feature::avx512bw) &&
901 Arch.has(x86_feature::avx512vbmi2) &&
902 Arch.has(x86_feature::avx512vl))
910 return detail::x86_vbmi2_constant::shift<false>(
911 a, b, counts, a,
mask.to_bitset());
914 detail::x86_vbmi2::mask_vpshldvq<Arch>(
915 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
920 template<isa<x86> Arch>
921 requires(Arch.has(x86_feature::avx512f) &&
922 Arch.has(x86_feature::avx512bw) &&
923 Arch.has(x86_feature::avx512vbmi2) &&
924 Arch.has(x86_feature::avx512vl))
932 return detail::x86_vbmi2_constant::shift<false>(
936 detail::x86_vbmi2::maskz_vpshldvq<Arch>(
937 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
942 template<isa<x86> Arch,
unsigned Imm8>
943 requires(Arch.has(x86_feature::avx512f) &&
944 Arch.has(x86_feature::avx512bw) &&
945 Arch.has(x86_feature::avx512vbmi2) &&
946 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
952 return detail::x86_vbmi2_constant::shift<true>(
956 detail::x86_vbmi2::vpshrdq<Arch, Imm8>(
957 a.to_native(), b.to_native()));
962 template<isa<x86> Arch,
unsigned Imm8>
963 requires(Arch.has(x86_feature::avx512f) &&
964 Arch.has(x86_feature::avx512bw) &&
965 Arch.has(x86_feature::avx512vbmi2) &&
966 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
974 return detail::x86_vbmi2_constant::shift<true>(
975 a, b, Imm8, source,
mask.to_bitset());
978 detail::x86_vbmi2::mask_vpshrdq<Arch, Imm8>(
979 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
984 template<isa<x86> Arch,
unsigned Imm8>
985 requires(Arch.has(x86_feature::avx512f) &&
986 Arch.has(x86_feature::avx512bw) &&
987 Arch.has(x86_feature::avx512vbmi2) &&
988 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
995 return detail::x86_vbmi2_constant::shift<true>(
999 detail::x86_vbmi2::maskz_vpshrdq<Arch, Imm8>(
1000 mask.to_bitset(), a.to_native(), b.to_native()));
1005 template<isa<x86> Arch>
1006 requires(Arch.has(x86_feature::avx512f) &&
1007 Arch.has(x86_feature::avx512bw) &&
1008 Arch.has(x86_feature::avx512vbmi2) &&
1009 Arch.has(x86_feature::avx512vl))
1016 return detail::x86_vbmi2_constant::shift<true>(
1020 detail::x86_vbmi2::vpshrdvq<Arch>(
1021 a.to_native(), b.to_native(), counts.to_native()));
1026 template<isa<x86> Arch>
1027 requires(Arch.has(x86_feature::avx512f) &&
1028 Arch.has(x86_feature::avx512bw) &&
1029 Arch.has(x86_feature::avx512vbmi2) &&
1030 Arch.has(x86_feature::avx512vl))
1038 return detail::x86_vbmi2_constant::shift<true>(
1039 a, b, counts, a,
mask.to_bitset());
1042 detail::x86_vbmi2::mask_vpshrdvq<Arch>(
1043 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1048 template<isa<x86> Arch>
1049 requires(Arch.has(x86_feature::avx512f) &&
1050 Arch.has(x86_feature::avx512bw) &&
1051 Arch.has(x86_feature::avx512vbmi2) &&
1052 Arch.has(x86_feature::avx512vl))
1060 return detail::x86_vbmi2_constant::shift<true>(
1064 detail::x86_vbmi2::maskz_vpshrdvq<Arch>(
1065 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1070 template<isa<x86> Arch>
1071 requires(Arch.has(x86_feature::avx512f) &&
1072 Arch.has(x86_feature::avx512bw) &&
1073 Arch.has(x86_feature::avx512vbmi2) &&
1074 Arch.has(x86_feature::avx512vl))
1081 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
1084 detail::x86_vbmi2::mask_vpcompressb<Arch>(
1085 source.to_native(),
mask.to_bitset(), value.to_native()));
1090 template<isa<x86> Arch>
1091 requires(Arch.has(x86_feature::avx512f) &&
1092 Arch.has(x86_feature::avx512bw) &&
1093 Arch.has(x86_feature::avx512vbmi2) &&
1094 Arch.has(x86_feature::avx512vl))
1103 detail::x86_vbmi2::maskz_vpcompressb<Arch>(
1104 mask.to_bitset(), value.to_native()));
1109 template<isa<x86> Arch>
1110 requires(Arch.has(x86_feature::avx512f) &&
1111 Arch.has(x86_feature::avx512bw) &&
1112 Arch.has(x86_feature::avx512vbmi2) &&
1113 Arch.has(x86_feature::avx512vl))
1116 std::uint8_t * destination,
1120 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
1122 detail::x86_vbmi2::mask_vpcompressb<Arch>(
1123 destination,
mask.to_bitset(), value.to_native());
1128 template<isa<x86> Arch>
1129 requires(Arch.has(x86_feature::avx512f) &&
1130 Arch.has(x86_feature::avx512bw) &&
1131 Arch.has(x86_feature::avx512vbmi2) &&
1132 Arch.has(x86_feature::avx512vl))
1139 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
1142 detail::x86_vbmi2::mask_vpexpandb<Arch>(
1143 source.to_native(),
mask.to_bitset(), value.to_native()));
1148 template<isa<x86> Arch>
1149 requires(Arch.has(x86_feature::avx512f) &&
1150 Arch.has(x86_feature::avx512bw) &&
1151 Arch.has(x86_feature::avx512vbmi2) &&
1152 Arch.has(x86_feature::avx512vl))
1161 detail::x86_vbmi2::maskz_vpexpandb<Arch>(
1162 mask.to_bitset(), value.to_native()));
1167 template<isa<x86> Arch,
class T>
1168 requires(Arch.has(x86_feature::avx512f) &&
1169 Arch.has(x86_feature::avx512bw) &&
1170 Arch.has(x86_feature::avx512vbmi2) &&
1171 Arch.has(x86_feature::avx512vl) &&
1172 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
1177 T * memory)
noexcept {
1179 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
1182 detail::x86_vbmi2::mask_vpexpandb<Arch>(
1183 source.to_native(),
mask.to_bitset(), memory));
1188 template<isa<x86> Arch,
class T>
1189 requires(Arch.has(x86_feature::avx512f) &&
1190 Arch.has(x86_feature::avx512bw) &&
1191 Arch.has(x86_feature::avx512vbmi2) &&
1192 Arch.has(x86_feature::avx512vl) &&
1193 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
1197 T * memory)
noexcept {
1202 detail::x86_vbmi2::maskz_vpexpandb_256<Arch>(
1203 static_cast<__mmask32
>(
mask.to_bitset()), memory));
1208 template<isa<x86> Arch>
1209 requires(Arch.has(x86_feature::avx512f) &&
1210 Arch.has(x86_feature::avx512bw) &&
1211 Arch.has(x86_feature::avx512vbmi2) &&
1212 Arch.has(x86_feature::avx512vl))
1219 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
1222 detail::x86_vbmi2::mask_vpcompressw<Arch>(
1223 source.to_native(),
mask.to_bitset(), value.to_native()));
1228 template<isa<x86> Arch>
1229 requires(Arch.has(x86_feature::avx512f) &&
1230 Arch.has(x86_feature::avx512bw) &&
1231 Arch.has(x86_feature::avx512vbmi2) &&
1232 Arch.has(x86_feature::avx512vl))
1241 detail::x86_vbmi2::maskz_vpcompressw<Arch>(
1242 mask.to_bitset(), value.to_native()));
1247 template<isa<x86> Arch>
1248 requires(Arch.has(x86_feature::avx512f) &&
1249 Arch.has(x86_feature::avx512bw) &&
1250 Arch.has(x86_feature::avx512vbmi2) &&
1251 Arch.has(x86_feature::avx512vl))
1254 std::uint16_t * destination,
1258 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
1260 detail::x86_vbmi2::mask_vpcompressw<Arch>(
1261 destination,
mask.to_bitset(), value.to_native());
1266 template<isa<x86> Arch>
1267 requires(Arch.has(x86_feature::avx512f) &&
1268 Arch.has(x86_feature::avx512bw) &&
1269 Arch.has(x86_feature::avx512vbmi2) &&
1270 Arch.has(x86_feature::avx512vl))
1277 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
1280 detail::x86_vbmi2::mask_vpexpandw<Arch>(
1281 source.to_native(),
mask.to_bitset(), value.to_native()));
1286 template<isa<x86> Arch>
1287 requires(Arch.has(x86_feature::avx512f) &&
1288 Arch.has(x86_feature::avx512bw) &&
1289 Arch.has(x86_feature::avx512vbmi2) &&
1290 Arch.has(x86_feature::avx512vl))
1299 detail::x86_vbmi2::maskz_vpexpandw<Arch>(
1300 mask.to_bitset(), value.to_native()));
1305 template<isa<x86> Arch,
class T>
1306 requires(Arch.has(x86_feature::avx512f) &&
1307 Arch.has(x86_feature::avx512bw) &&
1308 Arch.has(x86_feature::avx512vbmi2) &&
1309 Arch.has(x86_feature::avx512vl) &&
1310 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
1315 T * memory)
noexcept {
1317 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
1320 detail::x86_vbmi2::mask_vpexpandw<Arch>(
1321 source.to_native(),
mask.to_bitset(), memory));
1326 template<isa<x86> Arch,
class T>
1327 requires(Arch.has(x86_feature::avx512f) &&
1328 Arch.has(x86_feature::avx512bw) &&
1329 Arch.has(x86_feature::avx512vbmi2) &&
1330 Arch.has(x86_feature::avx512vl) &&
1331 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
1335 T * memory)
noexcept {
1340 detail::x86_vbmi2::maskz_vpexpandw_256<Arch>(
1341 static_cast<__mmask16
>(
mask.to_bitset()), memory));
1346 template<isa<x86> Arch,
unsigned Imm8>
1347 requires(Arch.has(x86_feature::avx512f) &&
1348 Arch.has(x86_feature::avx512bw) &&
1349 Arch.has(x86_feature::avx512vbmi2) &&
1350 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1356 return detail::x86_vbmi2_constant::shift<false>(
1360 detail::x86_vbmi2::vpshldw<Arch, Imm8>(
1361 a.to_native(), b.to_native()));
1366 template<isa<x86> Arch,
unsigned Imm8>
1367 requires(Arch.has(x86_feature::avx512f) &&
1368 Arch.has(x86_feature::avx512bw) &&
1369 Arch.has(x86_feature::avx512vbmi2) &&
1370 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1378 return detail::x86_vbmi2_constant::shift<false>(
1379 a, b, Imm8, source,
mask.to_bitset());
1382 detail::x86_vbmi2::mask_vpshldw<Arch, Imm8>(
1383 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
1388 template<isa<x86> Arch,
unsigned Imm8>
1389 requires(Arch.has(x86_feature::avx512f) &&
1390 Arch.has(x86_feature::avx512bw) &&
1391 Arch.has(x86_feature::avx512vbmi2) &&
1392 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1399 return detail::x86_vbmi2_constant::shift<false>(
1403 detail::x86_vbmi2::maskz_vpshldw<Arch, Imm8>(
1404 mask.to_bitset(), a.to_native(), b.to_native()));
1409 template<isa<x86> Arch>
1410 requires(Arch.has(x86_feature::avx512f) &&
1411 Arch.has(x86_feature::avx512bw) &&
1412 Arch.has(x86_feature::avx512vbmi2) &&
1413 Arch.has(x86_feature::avx512vl))
1420 return detail::x86_vbmi2_constant::shift<false>(
1424 detail::x86_vbmi2::vpshldvw<Arch>(
1425 a.to_native(), b.to_native(), counts.to_native()));
1430 template<isa<x86> Arch>
1431 requires(Arch.has(x86_feature::avx512f) &&
1432 Arch.has(x86_feature::avx512bw) &&
1433 Arch.has(x86_feature::avx512vbmi2) &&
1434 Arch.has(x86_feature::avx512vl))
1442 return detail::x86_vbmi2_constant::shift<false>(
1443 a, b, counts, a,
mask.to_bitset());
1446 detail::x86_vbmi2::mask_vpshldvw<Arch>(
1447 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1452 template<isa<x86> Arch>
1453 requires(Arch.has(x86_feature::avx512f) &&
1454 Arch.has(x86_feature::avx512bw) &&
1455 Arch.has(x86_feature::avx512vbmi2) &&
1456 Arch.has(x86_feature::avx512vl))
1464 return detail::x86_vbmi2_constant::shift<false>(
1468 detail::x86_vbmi2::maskz_vpshldvw<Arch>(
1469 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1474 template<isa<x86> Arch,
unsigned Imm8>
1475 requires(Arch.has(x86_feature::avx512f) &&
1476 Arch.has(x86_feature::avx512bw) &&
1477 Arch.has(x86_feature::avx512vbmi2) &&
1478 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1484 return detail::x86_vbmi2_constant::shift<true>(
1488 detail::x86_vbmi2::vpshrdw<Arch, Imm8>(
1489 a.to_native(), b.to_native()));
1494 template<isa<x86> Arch,
unsigned Imm8>
1495 requires(Arch.has(x86_feature::avx512f) &&
1496 Arch.has(x86_feature::avx512bw) &&
1497 Arch.has(x86_feature::avx512vbmi2) &&
1498 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1506 return detail::x86_vbmi2_constant::shift<true>(
1507 a, b, Imm8, source,
mask.to_bitset());
1510 detail::x86_vbmi2::mask_vpshrdw<Arch, Imm8>(
1511 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
1516 template<isa<x86> Arch,
unsigned Imm8>
1517 requires(Arch.has(x86_feature::avx512f) &&
1518 Arch.has(x86_feature::avx512bw) &&
1519 Arch.has(x86_feature::avx512vbmi2) &&
1520 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1527 return detail::x86_vbmi2_constant::shift<true>(
1531 detail::x86_vbmi2::maskz_vpshrdw<Arch, Imm8>(
1532 mask.to_bitset(), a.to_native(), b.to_native()));
1537 template<isa<x86> Arch>
1538 requires(Arch.has(x86_feature::avx512f) &&
1539 Arch.has(x86_feature::avx512bw) &&
1540 Arch.has(x86_feature::avx512vbmi2) &&
1541 Arch.has(x86_feature::avx512vl))
1548 return detail::x86_vbmi2_constant::shift<true>(
1552 detail::x86_vbmi2::vpshrdvw<Arch>(
1553 a.to_native(), b.to_native(), counts.to_native()));
1558 template<isa<x86> Arch>
1559 requires(Arch.has(x86_feature::avx512f) &&
1560 Arch.has(x86_feature::avx512bw) &&
1561 Arch.has(x86_feature::avx512vbmi2) &&
1562 Arch.has(x86_feature::avx512vl))
1570 return detail::x86_vbmi2_constant::shift<true>(
1571 a, b, counts, a,
mask.to_bitset());
1574 detail::x86_vbmi2::mask_vpshrdvw<Arch>(
1575 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1580 template<isa<x86> Arch>
1581 requires(Arch.has(x86_feature::avx512f) &&
1582 Arch.has(x86_feature::avx512bw) &&
1583 Arch.has(x86_feature::avx512vbmi2) &&
1584 Arch.has(x86_feature::avx512vl))
1592 return detail::x86_vbmi2_constant::shift<true>(
1596 detail::x86_vbmi2::maskz_vpshrdvw<Arch>(
1597 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1602 template<isa<x86> Arch,
unsigned Imm8>
1603 requires(Arch.has(x86_feature::avx512f) &&
1604 Arch.has(x86_feature::avx512bw) &&
1605 Arch.has(x86_feature::avx512vbmi2) &&
1606 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1612 return detail::x86_vbmi2_constant::shift<false>(
1616 detail::x86_vbmi2::vpshldd<Arch, Imm8>(
1617 a.to_native(), b.to_native()));
1622 template<isa<x86> Arch,
unsigned Imm8>
1623 requires(Arch.has(x86_feature::avx512f) &&
1624 Arch.has(x86_feature::avx512bw) &&
1625 Arch.has(x86_feature::avx512vbmi2) &&
1626 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1634 return detail::x86_vbmi2_constant::shift<false>(
1635 a, b, Imm8, source,
mask.to_bitset());
1638 detail::x86_vbmi2::mask_vpshldd<Arch, Imm8>(
1639 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
1644 template<isa<x86> Arch,
unsigned Imm8>
1645 requires(Arch.has(x86_feature::avx512f) &&
1646 Arch.has(x86_feature::avx512bw) &&
1647 Arch.has(x86_feature::avx512vbmi2) &&
1648 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1655 return detail::x86_vbmi2_constant::shift<false>(
1659 detail::x86_vbmi2::maskz_vpshldd<Arch, Imm8>(
1660 mask.to_bitset(), a.to_native(), b.to_native()));
1665 template<isa<x86> Arch>
1666 requires(Arch.has(x86_feature::avx512f) &&
1667 Arch.has(x86_feature::avx512bw) &&
1668 Arch.has(x86_feature::avx512vbmi2) &&
1669 Arch.has(x86_feature::avx512vl))
1676 return detail::x86_vbmi2_constant::shift<false>(
1680 detail::x86_vbmi2::vpshldvd<Arch>(
1681 a.to_native(), b.to_native(), counts.to_native()));
1686 template<isa<x86> Arch>
1687 requires(Arch.has(x86_feature::avx512f) &&
1688 Arch.has(x86_feature::avx512bw) &&
1689 Arch.has(x86_feature::avx512vbmi2) &&
1690 Arch.has(x86_feature::avx512vl))
1698 return detail::x86_vbmi2_constant::shift<false>(
1699 a, b, counts, a,
mask.to_bitset());
1702 detail::x86_vbmi2::mask_vpshldvd<Arch>(
1703 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1708 template<isa<x86> Arch>
1709 requires(Arch.has(x86_feature::avx512f) &&
1710 Arch.has(x86_feature::avx512bw) &&
1711 Arch.has(x86_feature::avx512vbmi2) &&
1712 Arch.has(x86_feature::avx512vl))
1720 return detail::x86_vbmi2_constant::shift<false>(
1724 detail::x86_vbmi2::maskz_vpshldvd<Arch>(
1725 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1730 template<isa<x86> Arch,
unsigned Imm8>
1731 requires(Arch.has(x86_feature::avx512f) &&
1732 Arch.has(x86_feature::avx512bw) &&
1733 Arch.has(x86_feature::avx512vbmi2) &&
1734 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1740 return detail::x86_vbmi2_constant::shift<true>(
1744 detail::x86_vbmi2::vpshrdd<Arch, Imm8>(
1745 a.to_native(), b.to_native()));
1750 template<isa<x86> Arch,
unsigned Imm8>
1751 requires(Arch.has(x86_feature::avx512f) &&
1752 Arch.has(x86_feature::avx512bw) &&
1753 Arch.has(x86_feature::avx512vbmi2) &&
1754 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1762 return detail::x86_vbmi2_constant::shift<true>(
1763 a, b, Imm8, source,
mask.to_bitset());
1766 detail::x86_vbmi2::mask_vpshrdd<Arch, Imm8>(
1767 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
1772 template<isa<x86> Arch,
unsigned Imm8>
1773 requires(Arch.has(x86_feature::avx512f) &&
1774 Arch.has(x86_feature::avx512bw) &&
1775 Arch.has(x86_feature::avx512vbmi2) &&
1776 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1783 return detail::x86_vbmi2_constant::shift<true>(
1787 detail::x86_vbmi2::maskz_vpshrdd<Arch, Imm8>(
1788 mask.to_bitset(), a.to_native(), b.to_native()));
1793 template<isa<x86> Arch>
1794 requires(Arch.has(x86_feature::avx512f) &&
1795 Arch.has(x86_feature::avx512bw) &&
1796 Arch.has(x86_feature::avx512vbmi2) &&
1797 Arch.has(x86_feature::avx512vl))
1804 return detail::x86_vbmi2_constant::shift<true>(
1808 detail::x86_vbmi2::vpshrdvd<Arch>(
1809 a.to_native(), b.to_native(), counts.to_native()));
1814 template<isa<x86> Arch>
1815 requires(Arch.has(x86_feature::avx512f) &&
1816 Arch.has(x86_feature::avx512bw) &&
1817 Arch.has(x86_feature::avx512vbmi2) &&
1818 Arch.has(x86_feature::avx512vl))
1826 return detail::x86_vbmi2_constant::shift<true>(
1827 a, b, counts, a,
mask.to_bitset());
1830 detail::x86_vbmi2::mask_vpshrdvd<Arch>(
1831 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1836 template<isa<x86> Arch>
1837 requires(Arch.has(x86_feature::avx512f) &&
1838 Arch.has(x86_feature::avx512bw) &&
1839 Arch.has(x86_feature::avx512vbmi2) &&
1840 Arch.has(x86_feature::avx512vl))
1848 return detail::x86_vbmi2_constant::shift<true>(
1852 detail::x86_vbmi2::maskz_vpshrdvd<Arch>(
1853 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1858 template<isa<x86> Arch,
unsigned Imm8>
1859 requires(Arch.has(x86_feature::avx512f) &&
1860 Arch.has(x86_feature::avx512bw) &&
1861 Arch.has(x86_feature::avx512vbmi2) &&
1862 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1868 return detail::x86_vbmi2_constant::shift<false>(
1872 detail::x86_vbmi2::vpshldq<Arch, Imm8>(
1873 a.to_native(), b.to_native()));
1878 template<isa<x86> Arch,
unsigned Imm8>
1879 requires(Arch.has(x86_feature::avx512f) &&
1880 Arch.has(x86_feature::avx512bw) &&
1881 Arch.has(x86_feature::avx512vbmi2) &&
1882 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1890 return detail::x86_vbmi2_constant::shift<false>(
1891 a, b, Imm8, source,
mask.to_bitset());
1894 detail::x86_vbmi2::mask_vpshldq<Arch, Imm8>(
1895 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
1900 template<isa<x86> Arch,
unsigned Imm8>
1901 requires(Arch.has(x86_feature::avx512f) &&
1902 Arch.has(x86_feature::avx512bw) &&
1903 Arch.has(x86_feature::avx512vbmi2) &&
1904 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1911 return detail::x86_vbmi2_constant::shift<false>(
1915 detail::x86_vbmi2::maskz_vpshldq<Arch, Imm8>(
1916 mask.to_bitset(), a.to_native(), b.to_native()));
1921 template<isa<x86> Arch>
1922 requires(Arch.has(x86_feature::avx512f) &&
1923 Arch.has(x86_feature::avx512bw) &&
1924 Arch.has(x86_feature::avx512vbmi2) &&
1925 Arch.has(x86_feature::avx512vl))
1932 return detail::x86_vbmi2_constant::shift<false>(
1936 detail::x86_vbmi2::vpshldvq<Arch>(
1937 a.to_native(), b.to_native(), counts.to_native()));
1942 template<isa<x86> Arch>
1943 requires(Arch.has(x86_feature::avx512f) &&
1944 Arch.has(x86_feature::avx512bw) &&
1945 Arch.has(x86_feature::avx512vbmi2) &&
1946 Arch.has(x86_feature::avx512vl))
1954 return detail::x86_vbmi2_constant::shift<false>(
1955 a, b, counts, a,
mask.to_bitset());
1958 detail::x86_vbmi2::mask_vpshldvq<Arch>(
1959 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
1964 template<isa<x86> Arch>
1965 requires(Arch.has(x86_feature::avx512f) &&
1966 Arch.has(x86_feature::avx512bw) &&
1967 Arch.has(x86_feature::avx512vbmi2) &&
1968 Arch.has(x86_feature::avx512vl))
1976 return detail::x86_vbmi2_constant::shift<false>(
1980 detail::x86_vbmi2::maskz_vpshldvq<Arch>(
1981 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
1986 template<isa<x86> Arch,
unsigned Imm8>
1987 requires(Arch.has(x86_feature::avx512f) &&
1988 Arch.has(x86_feature::avx512bw) &&
1989 Arch.has(x86_feature::avx512vbmi2) &&
1990 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
1996 return detail::x86_vbmi2_constant::shift<true>(
2000 detail::x86_vbmi2::vpshrdq<Arch, Imm8>(
2001 a.to_native(), b.to_native()));
2006 template<isa<x86> Arch,
unsigned Imm8>
2007 requires(Arch.has(x86_feature::avx512f) &&
2008 Arch.has(x86_feature::avx512bw) &&
2009 Arch.has(x86_feature::avx512vbmi2) &&
2010 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
2018 return detail::x86_vbmi2_constant::shift<true>(
2019 a, b, Imm8, source,
mask.to_bitset());
2022 detail::x86_vbmi2::mask_vpshrdq<Arch, Imm8>(
2023 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2028 template<isa<x86> Arch,
unsigned Imm8>
2029 requires(Arch.has(x86_feature::avx512f) &&
2030 Arch.has(x86_feature::avx512bw) &&
2031 Arch.has(x86_feature::avx512vbmi2) &&
2032 Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
2039 return detail::x86_vbmi2_constant::shift<true>(
2043 detail::x86_vbmi2::maskz_vpshrdq<Arch, Imm8>(
2044 mask.to_bitset(), a.to_native(), b.to_native()));
2049 template<isa<x86> Arch>
2050 requires(Arch.has(x86_feature::avx512f) &&
2051 Arch.has(x86_feature::avx512bw) &&
2052 Arch.has(x86_feature::avx512vbmi2) &&
2053 Arch.has(x86_feature::avx512vl))
2060 return detail::x86_vbmi2_constant::shift<true>(
2064 detail::x86_vbmi2::vpshrdvq<Arch>(
2065 a.to_native(), b.to_native(), counts.to_native()));
2070 template<isa<x86> Arch>
2071 requires(Arch.has(x86_feature::avx512f) &&
2072 Arch.has(x86_feature::avx512bw) &&
2073 Arch.has(x86_feature::avx512vbmi2) &&
2074 Arch.has(x86_feature::avx512vl))
2082 return detail::x86_vbmi2_constant::shift<true>(
2083 a, b, counts, a,
mask.to_bitset());
2086 detail::x86_vbmi2::mask_vpshrdvq<Arch>(
2087 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2092 template<isa<x86> Arch>
2093 requires(Arch.has(x86_feature::avx512f) &&
2094 Arch.has(x86_feature::avx512bw) &&
2095 Arch.has(x86_feature::avx512vbmi2) &&
2096 Arch.has(x86_feature::avx512vl))
2104 return detail::x86_vbmi2_constant::shift<true>(
2108 detail::x86_vbmi2::maskz_vpshrdvq<Arch>(
2109 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2114 template<isa<x86> Arch>
2115 requires(Arch.has(x86_feature::avx512f) &&
2116 Arch.has(x86_feature::avx512bw) &&
2117 Arch.has(x86_feature::avx512vbmi2))
2124 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
2127 detail::x86_vbmi2::mask_vpcompressb<Arch>(
2128 source.to_native(),
mask.to_bitset(), value.to_native()));
2133 template<isa<x86> Arch>
2134 requires(Arch.has(x86_feature::avx512f) &&
2135 Arch.has(x86_feature::avx512bw) &&
2136 Arch.has(x86_feature::avx512vbmi2))
2145 detail::x86_vbmi2::maskz_vpcompressb<Arch>(
2146 mask.to_bitset(), value.to_native()));
2151 template<isa<x86> Arch>
2152 requires(Arch.has(x86_feature::avx512f) &&
2153 Arch.has(x86_feature::avx512bw) &&
2154 Arch.has(x86_feature::avx512vbmi2))
2157 std::uint8_t * destination,
2161 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
2163 detail::x86_vbmi2::mask_vpcompressb<Arch>(
2164 destination,
mask.to_bitset(), value.to_native());
2169 template<isa<x86> Arch>
2170 requires(Arch.has(x86_feature::avx512f) &&
2171 Arch.has(x86_feature::avx512bw) &&
2172 Arch.has(x86_feature::avx512vbmi2))
2179 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
2182 detail::x86_vbmi2::mask_vpexpandb<Arch>(
2183 source.to_native(),
mask.to_bitset(), value.to_native()));
2188 template<isa<x86> Arch>
2189 requires(Arch.has(x86_feature::avx512f) &&
2190 Arch.has(x86_feature::avx512bw) &&
2191 Arch.has(x86_feature::avx512vbmi2))
2200 detail::x86_vbmi2::maskz_vpexpandb<Arch>(
2201 mask.to_bitset(), value.to_native()));
2206 template<isa<x86> Arch,
class T>
2207 requires(Arch.has(x86_feature::avx512f) &&
2208 Arch.has(x86_feature::avx512bw) &&
2209 Arch.has(x86_feature::avx512vbmi2) &&
2210 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
2215 T * memory)
noexcept {
2217 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
2220 detail::x86_vbmi2::mask_vpexpandb<Arch>(
2221 source.to_native(),
mask.to_bitset(), memory));
2226 template<isa<x86> Arch,
class T>
2227 requires(Arch.has(x86_feature::avx512f) &&
2228 Arch.has(x86_feature::avx512bw) &&
2229 Arch.has(x86_feature::avx512vbmi2) &&
2230 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>))
2234 T * memory)
noexcept {
2239 detail::x86_vbmi2::maskz_vpexpandb_512<Arch>(
2240 static_cast<__mmask64
>(
mask.to_bitset()), memory));
2245 template<isa<x86> Arch>
2246 requires(Arch.has(x86_feature::avx512f) &&
2247 Arch.has(x86_feature::avx512bw) &&
2248 Arch.has(x86_feature::avx512vbmi2))
2255 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
2258 detail::x86_vbmi2::mask_vpcompressw<Arch>(
2259 source.to_native(),
mask.to_bitset(), value.to_native()));
2264 template<isa<x86> Arch>
2265 requires(Arch.has(x86_feature::avx512f) &&
2266 Arch.has(x86_feature::avx512bw) &&
2267 Arch.has(x86_feature::avx512vbmi2))
2276 detail::x86_vbmi2::maskz_vpcompressw<Arch>(
2277 mask.to_bitset(), value.to_native()));
2282 template<isa<x86> Arch>
2283 requires(Arch.has(x86_feature::avx512f) &&
2284 Arch.has(x86_feature::avx512bw) &&
2285 Arch.has(x86_feature::avx512vbmi2))
2288 std::uint16_t * destination,
2292 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
2294 detail::x86_vbmi2::mask_vpcompressw<Arch>(
2295 destination,
mask.to_bitset(), value.to_native());
2300 template<isa<x86> Arch>
2301 requires(Arch.has(x86_feature::avx512f) &&
2302 Arch.has(x86_feature::avx512bw) &&
2303 Arch.has(x86_feature::avx512vbmi2))
2310 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
2313 detail::x86_vbmi2::mask_vpexpandw<Arch>(
2314 source.to_native(),
mask.to_bitset(), value.to_native()));
2319 template<isa<x86> Arch>
2320 requires(Arch.has(x86_feature::avx512f) &&
2321 Arch.has(x86_feature::avx512bw) &&
2322 Arch.has(x86_feature::avx512vbmi2))
2331 detail::x86_vbmi2::maskz_vpexpandw<Arch>(
2332 mask.to_bitset(), value.to_native()));
2337 template<isa<x86> Arch,
class T>
2338 requires(Arch.has(x86_feature::avx512f) &&
2339 Arch.has(x86_feature::avx512bw) &&
2340 Arch.has(x86_feature::avx512vbmi2) &&
2341 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
2346 T * memory)
noexcept {
2348 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
2351 detail::x86_vbmi2::mask_vpexpandw<Arch>(
2352 source.to_native(),
mask.to_bitset(), memory));
2357 template<isa<x86> Arch,
class T>
2358 requires(Arch.has(x86_feature::avx512f) &&
2359 Arch.has(x86_feature::avx512bw) &&
2360 Arch.has(x86_feature::avx512vbmi2) &&
2361 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>))
2365 T * memory)
noexcept {
2370 detail::x86_vbmi2::maskz_vpexpandw_512<Arch>(
2371 static_cast<__mmask32
>(
mask.to_bitset()), memory));
2376 template<isa<x86> Arch,
unsigned Imm8>
2377 requires(Arch.has(x86_feature::avx512f) &&
2378 Arch.has(x86_feature::avx512bw) &&
2379 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2385 return detail::x86_vbmi2_constant::shift<false>(
2389 detail::x86_vbmi2::vpshldw<Arch, Imm8>(
2390 a.to_native(), b.to_native()));
2395 template<isa<x86> Arch,
unsigned Imm8>
2396 requires(Arch.has(x86_feature::avx512f) &&
2397 Arch.has(x86_feature::avx512bw) &&
2398 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2406 return detail::x86_vbmi2_constant::shift<false>(
2407 a, b, Imm8, source,
mask.to_bitset());
2410 detail::x86_vbmi2::mask_vpshldw<Arch, Imm8>(
2411 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2416 template<isa<x86> Arch,
unsigned Imm8>
2417 requires(Arch.has(x86_feature::avx512f) &&
2418 Arch.has(x86_feature::avx512bw) &&
2419 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2426 return detail::x86_vbmi2_constant::shift<false>(
2430 detail::x86_vbmi2::maskz_vpshldw<Arch, Imm8>(
2431 mask.to_bitset(), a.to_native(), b.to_native()));
2436 template<isa<x86> Arch>
2437 requires(Arch.has(x86_feature::avx512f) &&
2438 Arch.has(x86_feature::avx512bw) &&
2439 Arch.has(x86_feature::avx512vbmi2))
2446 return detail::x86_vbmi2_constant::shift<false>(
2450 detail::x86_vbmi2::vpshldvw<Arch>(
2451 a.to_native(), b.to_native(), counts.to_native()));
2456 template<isa<x86> Arch>
2457 requires(Arch.has(x86_feature::avx512f) &&
2458 Arch.has(x86_feature::avx512bw) &&
2459 Arch.has(x86_feature::avx512vbmi2))
2467 return detail::x86_vbmi2_constant::shift<false>(
2468 a, b, counts, a,
mask.to_bitset());
2471 detail::x86_vbmi2::mask_vpshldvw<Arch>(
2472 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2477 template<isa<x86> Arch>
2478 requires(Arch.has(x86_feature::avx512f) &&
2479 Arch.has(x86_feature::avx512bw) &&
2480 Arch.has(x86_feature::avx512vbmi2))
2488 return detail::x86_vbmi2_constant::shift<false>(
2492 detail::x86_vbmi2::maskz_vpshldvw<Arch>(
2493 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2498 template<isa<x86> Arch,
unsigned Imm8>
2499 requires(Arch.has(x86_feature::avx512f) &&
2500 Arch.has(x86_feature::avx512bw) &&
2501 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2507 return detail::x86_vbmi2_constant::shift<true>(
2511 detail::x86_vbmi2::vpshrdw<Arch, Imm8>(
2512 a.to_native(), b.to_native()));
2517 template<isa<x86> Arch,
unsigned Imm8>
2518 requires(Arch.has(x86_feature::avx512f) &&
2519 Arch.has(x86_feature::avx512bw) &&
2520 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2528 return detail::x86_vbmi2_constant::shift<true>(
2529 a, b, Imm8, source,
mask.to_bitset());
2532 detail::x86_vbmi2::mask_vpshrdw<Arch, Imm8>(
2533 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2538 template<isa<x86> Arch,
unsigned Imm8>
2539 requires(Arch.has(x86_feature::avx512f) &&
2540 Arch.has(x86_feature::avx512bw) &&
2541 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2548 return detail::x86_vbmi2_constant::shift<true>(
2552 detail::x86_vbmi2::maskz_vpshrdw<Arch, Imm8>(
2553 mask.to_bitset(), a.to_native(), b.to_native()));
2558 template<isa<x86> Arch>
2559 requires(Arch.has(x86_feature::avx512f) &&
2560 Arch.has(x86_feature::avx512bw) &&
2561 Arch.has(x86_feature::avx512vbmi2))
2568 return detail::x86_vbmi2_constant::shift<true>(
2572 detail::x86_vbmi2::vpshrdvw<Arch>(
2573 a.to_native(), b.to_native(), counts.to_native()));
2578 template<isa<x86> Arch>
2579 requires(Arch.has(x86_feature::avx512f) &&
2580 Arch.has(x86_feature::avx512bw) &&
2581 Arch.has(x86_feature::avx512vbmi2))
2589 return detail::x86_vbmi2_constant::shift<true>(
2590 a, b, counts, a,
mask.to_bitset());
2593 detail::x86_vbmi2::mask_vpshrdvw<Arch>(
2594 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2599 template<isa<x86> Arch>
2600 requires(Arch.has(x86_feature::avx512f) &&
2601 Arch.has(x86_feature::avx512bw) &&
2602 Arch.has(x86_feature::avx512vbmi2))
2610 return detail::x86_vbmi2_constant::shift<true>(
2614 detail::x86_vbmi2::maskz_vpshrdvw<Arch>(
2615 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2620 template<isa<x86> Arch,
unsigned Imm8>
2621 requires(Arch.has(x86_feature::avx512f) &&
2622 Arch.has(x86_feature::avx512bw) &&
2623 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2629 return detail::x86_vbmi2_constant::shift<false>(
2633 detail::x86_vbmi2::vpshldd<Arch, Imm8>(
2634 a.to_native(), b.to_native()));
2639 template<isa<x86> Arch,
unsigned Imm8>
2640 requires(Arch.has(x86_feature::avx512f) &&
2641 Arch.has(x86_feature::avx512bw) &&
2642 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2650 return detail::x86_vbmi2_constant::shift<false>(
2651 a, b, Imm8, source,
mask.to_bitset());
2654 detail::x86_vbmi2::mask_vpshldd<Arch, Imm8>(
2655 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2660 template<isa<x86> Arch,
unsigned Imm8>
2661 requires(Arch.has(x86_feature::avx512f) &&
2662 Arch.has(x86_feature::avx512bw) &&
2663 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2670 return detail::x86_vbmi2_constant::shift<false>(
2674 detail::x86_vbmi2::maskz_vpshldd<Arch, Imm8>(
2675 mask.to_bitset(), a.to_native(), b.to_native()));
2680 template<isa<x86> Arch>
2681 requires(Arch.has(x86_feature::avx512f) &&
2682 Arch.has(x86_feature::avx512bw) &&
2683 Arch.has(x86_feature::avx512vbmi2))
2690 return detail::x86_vbmi2_constant::shift<false>(
2694 detail::x86_vbmi2::vpshldvd<Arch>(
2695 a.to_native(), b.to_native(), counts.to_native()));
2700 template<isa<x86> Arch>
2701 requires(Arch.has(x86_feature::avx512f) &&
2702 Arch.has(x86_feature::avx512bw) &&
2703 Arch.has(x86_feature::avx512vbmi2))
2711 return detail::x86_vbmi2_constant::shift<false>(
2712 a, b, counts, a,
mask.to_bitset());
2715 detail::x86_vbmi2::mask_vpshldvd<Arch>(
2716 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2721 template<isa<x86> Arch>
2722 requires(Arch.has(x86_feature::avx512f) &&
2723 Arch.has(x86_feature::avx512bw) &&
2724 Arch.has(x86_feature::avx512vbmi2))
2732 return detail::x86_vbmi2_constant::shift<false>(
2736 detail::x86_vbmi2::maskz_vpshldvd<Arch>(
2737 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2742 template<isa<x86> Arch,
unsigned Imm8>
2743 requires(Arch.has(x86_feature::avx512f) &&
2744 Arch.has(x86_feature::avx512bw) &&
2745 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2751 return detail::x86_vbmi2_constant::shift<true>(
2755 detail::x86_vbmi2::vpshrdd<Arch, Imm8>(
2756 a.to_native(), b.to_native()));
2761 template<isa<x86> Arch,
unsigned Imm8>
2762 requires(Arch.has(x86_feature::avx512f) &&
2763 Arch.has(x86_feature::avx512bw) &&
2764 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2772 return detail::x86_vbmi2_constant::shift<true>(
2773 a, b, Imm8, source,
mask.to_bitset());
2776 detail::x86_vbmi2::mask_vpshrdd<Arch, Imm8>(
2777 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2782 template<isa<x86> Arch,
unsigned Imm8>
2783 requires(Arch.has(x86_feature::avx512f) &&
2784 Arch.has(x86_feature::avx512bw) &&
2785 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2792 return detail::x86_vbmi2_constant::shift<true>(
2796 detail::x86_vbmi2::maskz_vpshrdd<Arch, Imm8>(
2797 mask.to_bitset(), a.to_native(), b.to_native()));
2802 template<isa<x86> Arch>
2803 requires(Arch.has(x86_feature::avx512f) &&
2804 Arch.has(x86_feature::avx512bw) &&
2805 Arch.has(x86_feature::avx512vbmi2))
2812 return detail::x86_vbmi2_constant::shift<true>(
2816 detail::x86_vbmi2::vpshrdvd<Arch>(
2817 a.to_native(), b.to_native(), counts.to_native()));
2822 template<isa<x86> Arch>
2823 requires(Arch.has(x86_feature::avx512f) &&
2824 Arch.has(x86_feature::avx512bw) &&
2825 Arch.has(x86_feature::avx512vbmi2))
2833 return detail::x86_vbmi2_constant::shift<true>(
2834 a, b, counts, a,
mask.to_bitset());
2837 detail::x86_vbmi2::mask_vpshrdvd<Arch>(
2838 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2843 template<isa<x86> Arch>
2844 requires(Arch.has(x86_feature::avx512f) &&
2845 Arch.has(x86_feature::avx512bw) &&
2846 Arch.has(x86_feature::avx512vbmi2))
2854 return detail::x86_vbmi2_constant::shift<true>(
2858 detail::x86_vbmi2::maskz_vpshrdvd<Arch>(
2859 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2864 template<isa<x86> Arch,
unsigned Imm8>
2865 requires(Arch.has(x86_feature::avx512f) &&
2866 Arch.has(x86_feature::avx512bw) &&
2867 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2873 return detail::x86_vbmi2_constant::shift<false>(
2877 detail::x86_vbmi2::vpshldq<Arch, Imm8>(
2878 a.to_native(), b.to_native()));
2883 template<isa<x86> Arch,
unsigned Imm8>
2884 requires(Arch.has(x86_feature::avx512f) &&
2885 Arch.has(x86_feature::avx512bw) &&
2886 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2894 return detail::x86_vbmi2_constant::shift<false>(
2895 a, b, Imm8, source,
mask.to_bitset());
2898 detail::x86_vbmi2::mask_vpshldq<Arch, Imm8>(
2899 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
2904 template<isa<x86> Arch,
unsigned Imm8>
2905 requires(Arch.has(x86_feature::avx512f) &&
2906 Arch.has(x86_feature::avx512bw) &&
2907 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2914 return detail::x86_vbmi2_constant::shift<false>(
2918 detail::x86_vbmi2::maskz_vpshldq<Arch, Imm8>(
2919 mask.to_bitset(), a.to_native(), b.to_native()));
2924 template<isa<x86> Arch>
2925 requires(Arch.has(x86_feature::avx512f) &&
2926 Arch.has(x86_feature::avx512bw) &&
2927 Arch.has(x86_feature::avx512vbmi2))
2934 return detail::x86_vbmi2_constant::shift<false>(
2938 detail::x86_vbmi2::vpshldvq<Arch>(
2939 a.to_native(), b.to_native(), counts.to_native()));
2944 template<isa<x86> Arch>
2945 requires(Arch.has(x86_feature::avx512f) &&
2946 Arch.has(x86_feature::avx512bw) &&
2947 Arch.has(x86_feature::avx512vbmi2))
2955 return detail::x86_vbmi2_constant::shift<false>(
2956 a, b, counts, a,
mask.to_bitset());
2959 detail::x86_vbmi2::mask_vpshldvq<Arch>(
2960 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
2965 template<isa<x86> Arch>
2966 requires(Arch.has(x86_feature::avx512f) &&
2967 Arch.has(x86_feature::avx512bw) &&
2968 Arch.has(x86_feature::avx512vbmi2))
2976 return detail::x86_vbmi2_constant::shift<false>(
2980 detail::x86_vbmi2::maskz_vpshldvq<Arch>(
2981 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
2986 template<isa<x86> Arch,
unsigned Imm8>
2987 requires(Arch.has(x86_feature::avx512f) &&
2988 Arch.has(x86_feature::avx512bw) &&
2989 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
2995 return detail::x86_vbmi2_constant::shift<true>(
2999 detail::x86_vbmi2::vpshrdq<Arch, Imm8>(
3000 a.to_native(), b.to_native()));
3005 template<isa<x86> Arch,
unsigned Imm8>
3006 requires(Arch.has(x86_feature::avx512f) &&
3007 Arch.has(x86_feature::avx512bw) &&
3008 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
3016 return detail::x86_vbmi2_constant::shift<true>(
3017 a, b, Imm8, source,
mask.to_bitset());
3020 detail::x86_vbmi2::mask_vpshrdq<Arch, Imm8>(
3021 source.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
3026 template<isa<x86> Arch,
unsigned Imm8>
3027 requires(Arch.has(x86_feature::avx512f) &&
3028 Arch.has(x86_feature::avx512bw) &&
3029 Arch.has(x86_feature::avx512vbmi2) && Imm8 <= 255)
3036 return detail::x86_vbmi2_constant::shift<true>(
3040 detail::x86_vbmi2::maskz_vpshrdq<Arch, Imm8>(
3041 mask.to_bitset(), a.to_native(), b.to_native()));
3046 template<isa<x86> Arch>
3047 requires(Arch.has(x86_feature::avx512f) &&
3048 Arch.has(x86_feature::avx512bw) &&
3049 Arch.has(x86_feature::avx512vbmi2))
3056 return detail::x86_vbmi2_constant::shift<true>(
3060 detail::x86_vbmi2::vpshrdvq<Arch>(
3061 a.to_native(), b.to_native(), counts.to_native()));
3066 template<isa<x86> Arch>
3067 requires(Arch.has(x86_feature::avx512f) &&
3068 Arch.has(x86_feature::avx512bw) &&
3069 Arch.has(x86_feature::avx512vbmi2))
3077 return detail::x86_vbmi2_constant::shift<true>(
3078 a, b, counts, a,
mask.to_bitset());
3081 detail::x86_vbmi2::mask_vpshrdvq<Arch>(
3082 a.to_native(),
mask.to_bitset(), b.to_native(), counts.to_native()));
3087 template<isa<x86> Arch>
3088 requires(Arch.has(x86_feature::avx512f) &&
3089 Arch.has(x86_feature::avx512bw) &&
3090 Arch.has(x86_feature::avx512vbmi2))
3098 return detail::x86_vbmi2_constant::shift<true>(
3102 detail::x86_vbmi2::maskz_vpshrdvq<Arch>(
3103 mask.to_bitset(), a.to_native(), b.to_native(), counts.to_native()));
3108 template<isa<x86> Arch>
3109 requires(!(Arch.has(x86_feature::avx512f) &&
3110 Arch.has(x86_feature::avx512bw) &&
3111 Arch.has(x86_feature::avx512vbmi2) &&
3112 Arch.has(x86_feature::avx512vl)) &&
3113 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3118 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
3122 template<isa<x86> Arch>
3123 requires(!(Arch.has(x86_feature::avx512f) &&
3124 Arch.has(x86_feature::avx512bw) &&
3125 Arch.has(x86_feature::avx512vbmi2) &&
3126 Arch.has(x86_feature::avx512vl)) &&
3127 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3135 template<isa<x86> Arch>
3136 requires(!(Arch.has(x86_feature::avx512f) &&
3137 Arch.has(x86_feature::avx512bw) &&
3138 Arch.has(x86_feature::avx512vbmi2) &&
3139 Arch.has(x86_feature::avx512vl)) &&
3140 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3142 std::uint8_t * destination,
3145 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
3149 template<isa<x86> Arch>
3150 requires(!(Arch.has(x86_feature::avx512f) &&
3151 Arch.has(x86_feature::avx512bw) &&
3152 Arch.has(x86_feature::avx512vbmi2) &&
3153 Arch.has(x86_feature::avx512vl)) &&
3154 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3159 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
3163 template<isa<x86> Arch>
3164 requires(!(Arch.has(x86_feature::avx512f) &&
3165 Arch.has(x86_feature::avx512bw) &&
3166 Arch.has(x86_feature::avx512vbmi2) &&
3167 Arch.has(x86_feature::avx512vl)) &&
3168 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3176 template<isa<x86> Arch,
class T>
3177 requires(!(Arch.has(x86_feature::avx512f) &&
3178 Arch.has(x86_feature::avx512bw) &&
3179 Arch.has(x86_feature::avx512vbmi2) &&
3180 Arch.has(x86_feature::avx512vl)) &&
3181 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
3182 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3186 T * memory)
noexcept {
3187 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
3191 template<isa<x86> Arch,
class T>
3192 requires(!(Arch.has(x86_feature::avx512f) &&
3193 Arch.has(x86_feature::avx512bw) &&
3194 Arch.has(x86_feature::avx512vbmi2) &&
3195 Arch.has(x86_feature::avx512vl)) &&
3196 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
3197 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
3200 T * memory)
noexcept {
3205 template<isa<x86> Arch>
3206 requires(!(Arch.has(x86_feature::avx512f) &&
3207 Arch.has(x86_feature::avx512bw) &&
3208 Arch.has(x86_feature::avx512vbmi2) &&
3209 Arch.has(x86_feature::avx512vl)) &&
3210 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3215 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
3219 template<isa<x86> Arch>
3220 requires(!(Arch.has(x86_feature::avx512f) &&
3221 Arch.has(x86_feature::avx512bw) &&
3222 Arch.has(x86_feature::avx512vbmi2) &&
3223 Arch.has(x86_feature::avx512vl)) &&
3224 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3232 template<isa<x86> Arch>
3233 requires(!(Arch.has(x86_feature::avx512f) &&
3234 Arch.has(x86_feature::avx512bw) &&
3235 Arch.has(x86_feature::avx512vbmi2) &&
3236 Arch.has(x86_feature::avx512vl)) &&
3237 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3239 std::uint16_t * destination,
3242 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
3246 template<isa<x86> Arch>
3247 requires(!(Arch.has(x86_feature::avx512f) &&
3248 Arch.has(x86_feature::avx512bw) &&
3249 Arch.has(x86_feature::avx512vbmi2) &&
3250 Arch.has(x86_feature::avx512vl)) &&
3251 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3256 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
3260 template<isa<x86> Arch>
3261 requires(!(Arch.has(x86_feature::avx512f) &&
3262 Arch.has(x86_feature::avx512bw) &&
3263 Arch.has(x86_feature::avx512vbmi2) &&
3264 Arch.has(x86_feature::avx512vl)) &&
3265 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3273 template<isa<x86> Arch,
class T>
3274 requires(!(Arch.has(x86_feature::avx512f) &&
3275 Arch.has(x86_feature::avx512bw) &&
3276 Arch.has(x86_feature::avx512vbmi2) &&
3277 Arch.has(x86_feature::avx512vl)) &&
3278 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
3279 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3283 T * memory)
noexcept {
3284 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
3288 template<isa<x86> Arch,
class T>
3289 requires(!(Arch.has(x86_feature::avx512f) &&
3290 Arch.has(x86_feature::avx512bw) &&
3291 Arch.has(x86_feature::avx512vbmi2) &&
3292 Arch.has(x86_feature::avx512vl)) &&
3293 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
3294 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3297 T * memory)
noexcept {
3302 template<isa<x86> Arch,
unsigned Imm8>
3303 requires(!(Arch.has(x86_feature::avx512f) &&
3304 Arch.has(x86_feature::avx512bw) &&
3305 Arch.has(x86_feature::avx512vbmi2) &&
3306 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3307 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3311 return detail::x86_vbmi2_constant::shift<false>(
3316 template<isa<x86> Arch,
unsigned Imm8>
3317 requires(!(Arch.has(x86_feature::avx512f) &&
3318 Arch.has(x86_feature::avx512bw) &&
3319 Arch.has(x86_feature::avx512vbmi2) &&
3320 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3321 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3327 return detail::x86_vbmi2_constant::shift<false>(
3328 a, b, Imm8, source,
mask.to_bitset());
3332 template<isa<x86> Arch,
unsigned Imm8>
3333 requires(!(Arch.has(x86_feature::avx512f) &&
3334 Arch.has(x86_feature::avx512bw) &&
3335 Arch.has(x86_feature::avx512vbmi2) &&
3336 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3337 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3342 return detail::x86_vbmi2_constant::shift<false>(
3347 template<isa<x86> Arch>
3348 requires(!(Arch.has(x86_feature::avx512f) &&
3349 Arch.has(x86_feature::avx512bw) &&
3350 Arch.has(x86_feature::avx512vbmi2) &&
3351 Arch.has(x86_feature::avx512vl)) &&
3352 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3357 return detail::x86_vbmi2_constant::shift<false>(
3362 template<isa<x86> Arch>
3363 requires(!(Arch.has(x86_feature::avx512f) &&
3364 Arch.has(x86_feature::avx512bw) &&
3365 Arch.has(x86_feature::avx512vbmi2) &&
3366 Arch.has(x86_feature::avx512vl)) &&
3367 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3373 return detail::x86_vbmi2_constant::shift<false>(
3374 a, b, counts, a,
mask.to_bitset());
3378 template<isa<x86> Arch>
3379 requires(!(Arch.has(x86_feature::avx512f) &&
3380 Arch.has(x86_feature::avx512bw) &&
3381 Arch.has(x86_feature::avx512vbmi2) &&
3382 Arch.has(x86_feature::avx512vl)) &&
3383 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3389 return detail::x86_vbmi2_constant::shift<false>(
3394 template<isa<x86> Arch,
unsigned Imm8>
3395 requires(!(Arch.has(x86_feature::avx512f) &&
3396 Arch.has(x86_feature::avx512bw) &&
3397 Arch.has(x86_feature::avx512vbmi2) &&
3398 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3399 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3403 return detail::x86_vbmi2_constant::shift<true>(
3408 template<isa<x86> Arch,
unsigned Imm8>
3409 requires(!(Arch.has(x86_feature::avx512f) &&
3410 Arch.has(x86_feature::avx512bw) &&
3411 Arch.has(x86_feature::avx512vbmi2) &&
3412 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3413 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3419 return detail::x86_vbmi2_constant::shift<true>(
3420 a, b, Imm8, source,
mask.to_bitset());
3424 template<isa<x86> Arch,
unsigned Imm8>
3425 requires(!(Arch.has(x86_feature::avx512f) &&
3426 Arch.has(x86_feature::avx512bw) &&
3427 Arch.has(x86_feature::avx512vbmi2) &&
3428 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3429 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3434 return detail::x86_vbmi2_constant::shift<true>(
3439 template<isa<x86> Arch>
3440 requires(!(Arch.has(x86_feature::avx512f) &&
3441 Arch.has(x86_feature::avx512bw) &&
3442 Arch.has(x86_feature::avx512vbmi2) &&
3443 Arch.has(x86_feature::avx512vl)) &&
3444 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3449 return detail::x86_vbmi2_constant::shift<true>(
3454 template<isa<x86> Arch>
3455 requires(!(Arch.has(x86_feature::avx512f) &&
3456 Arch.has(x86_feature::avx512bw) &&
3457 Arch.has(x86_feature::avx512vbmi2) &&
3458 Arch.has(x86_feature::avx512vl)) &&
3459 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3465 return detail::x86_vbmi2_constant::shift<true>(
3466 a, b, counts, a,
mask.to_bitset());
3470 template<isa<x86> Arch>
3471 requires(!(Arch.has(x86_feature::avx512f) &&
3472 Arch.has(x86_feature::avx512bw) &&
3473 Arch.has(x86_feature::avx512vbmi2) &&
3474 Arch.has(x86_feature::avx512vl)) &&
3475 requires { sizeof(simd<std::uint16_t, 8, Arch>); })
3481 return detail::x86_vbmi2_constant::shift<true>(
3486 template<isa<x86> Arch,
unsigned Imm8>
3487 requires(!(Arch.has(x86_feature::avx512f) &&
3488 Arch.has(x86_feature::avx512bw) &&
3489 Arch.has(x86_feature::avx512vbmi2) &&
3490 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3491 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3495 return detail::x86_vbmi2_constant::shift<false>(
3500 template<isa<x86> Arch,
unsigned Imm8>
3501 requires(!(Arch.has(x86_feature::avx512f) &&
3502 Arch.has(x86_feature::avx512bw) &&
3503 Arch.has(x86_feature::avx512vbmi2) &&
3504 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3505 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3511 return detail::x86_vbmi2_constant::shift<false>(
3512 a, b, Imm8, source,
mask.to_bitset());
3516 template<isa<x86> Arch,
unsigned Imm8>
3517 requires(!(Arch.has(x86_feature::avx512f) &&
3518 Arch.has(x86_feature::avx512bw) &&
3519 Arch.has(x86_feature::avx512vbmi2) &&
3520 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3521 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3526 return detail::x86_vbmi2_constant::shift<false>(
3531 template<isa<x86> Arch>
3532 requires(!(Arch.has(x86_feature::avx512f) &&
3533 Arch.has(x86_feature::avx512bw) &&
3534 Arch.has(x86_feature::avx512vbmi2) &&
3535 Arch.has(x86_feature::avx512vl)) &&
3536 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3541 return detail::x86_vbmi2_constant::shift<false>(
3546 template<isa<x86> Arch>
3547 requires(!(Arch.has(x86_feature::avx512f) &&
3548 Arch.has(x86_feature::avx512bw) &&
3549 Arch.has(x86_feature::avx512vbmi2) &&
3550 Arch.has(x86_feature::avx512vl)) &&
3551 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3557 return detail::x86_vbmi2_constant::shift<false>(
3558 a, b, counts, a,
mask.to_bitset());
3562 template<isa<x86> Arch>
3563 requires(!(Arch.has(x86_feature::avx512f) &&
3564 Arch.has(x86_feature::avx512bw) &&
3565 Arch.has(x86_feature::avx512vbmi2) &&
3566 Arch.has(x86_feature::avx512vl)) &&
3567 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3573 return detail::x86_vbmi2_constant::shift<false>(
3578 template<isa<x86> Arch,
unsigned Imm8>
3579 requires(!(Arch.has(x86_feature::avx512f) &&
3580 Arch.has(x86_feature::avx512bw) &&
3581 Arch.has(x86_feature::avx512vbmi2) &&
3582 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3583 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3587 return detail::x86_vbmi2_constant::shift<true>(
3592 template<isa<x86> Arch,
unsigned Imm8>
3593 requires(!(Arch.has(x86_feature::avx512f) &&
3594 Arch.has(x86_feature::avx512bw) &&
3595 Arch.has(x86_feature::avx512vbmi2) &&
3596 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3597 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3603 return detail::x86_vbmi2_constant::shift<true>(
3604 a, b, Imm8, source,
mask.to_bitset());
3608 template<isa<x86> Arch,
unsigned Imm8>
3609 requires(!(Arch.has(x86_feature::avx512f) &&
3610 Arch.has(x86_feature::avx512bw) &&
3611 Arch.has(x86_feature::avx512vbmi2) &&
3612 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3613 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3618 return detail::x86_vbmi2_constant::shift<true>(
3623 template<isa<x86> Arch>
3624 requires(!(Arch.has(x86_feature::avx512f) &&
3625 Arch.has(x86_feature::avx512bw) &&
3626 Arch.has(x86_feature::avx512vbmi2) &&
3627 Arch.has(x86_feature::avx512vl)) &&
3628 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3633 return detail::x86_vbmi2_constant::shift<true>(
3638 template<isa<x86> Arch>
3639 requires(!(Arch.has(x86_feature::avx512f) &&
3640 Arch.has(x86_feature::avx512bw) &&
3641 Arch.has(x86_feature::avx512vbmi2) &&
3642 Arch.has(x86_feature::avx512vl)) &&
3643 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3649 return detail::x86_vbmi2_constant::shift<true>(
3650 a, b, counts, a,
mask.to_bitset());
3654 template<isa<x86> Arch>
3655 requires(!(Arch.has(x86_feature::avx512f) &&
3656 Arch.has(x86_feature::avx512bw) &&
3657 Arch.has(x86_feature::avx512vbmi2) &&
3658 Arch.has(x86_feature::avx512vl)) &&
3659 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
3665 return detail::x86_vbmi2_constant::shift<true>(
3670 template<isa<x86> Arch,
unsigned Imm8>
3671 requires(!(Arch.has(x86_feature::avx512f) &&
3672 Arch.has(x86_feature::avx512bw) &&
3673 Arch.has(x86_feature::avx512vbmi2) &&
3674 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3675 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3679 return detail::x86_vbmi2_constant::shift<false>(
3684 template<isa<x86> Arch,
unsigned Imm8>
3685 requires(!(Arch.has(x86_feature::avx512f) &&
3686 Arch.has(x86_feature::avx512bw) &&
3687 Arch.has(x86_feature::avx512vbmi2) &&
3688 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3689 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3695 return detail::x86_vbmi2_constant::shift<false>(
3696 a, b, Imm8, source,
mask.to_bitset());
3700 template<isa<x86> Arch,
unsigned Imm8>
3701 requires(!(Arch.has(x86_feature::avx512f) &&
3702 Arch.has(x86_feature::avx512bw) &&
3703 Arch.has(x86_feature::avx512vbmi2) &&
3704 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3705 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3710 return detail::x86_vbmi2_constant::shift<false>(
3715 template<isa<x86> Arch>
3716 requires(!(Arch.has(x86_feature::avx512f) &&
3717 Arch.has(x86_feature::avx512bw) &&
3718 Arch.has(x86_feature::avx512vbmi2) &&
3719 Arch.has(x86_feature::avx512vl)) &&
3720 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3725 return detail::x86_vbmi2_constant::shift<false>(
3730 template<isa<x86> Arch>
3731 requires(!(Arch.has(x86_feature::avx512f) &&
3732 Arch.has(x86_feature::avx512bw) &&
3733 Arch.has(x86_feature::avx512vbmi2) &&
3734 Arch.has(x86_feature::avx512vl)) &&
3735 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3741 return detail::x86_vbmi2_constant::shift<false>(
3742 a, b, counts, a,
mask.to_bitset());
3746 template<isa<x86> Arch>
3747 requires(!(Arch.has(x86_feature::avx512f) &&
3748 Arch.has(x86_feature::avx512bw) &&
3749 Arch.has(x86_feature::avx512vbmi2) &&
3750 Arch.has(x86_feature::avx512vl)) &&
3751 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3757 return detail::x86_vbmi2_constant::shift<false>(
3762 template<isa<x86> Arch,
unsigned Imm8>
3763 requires(!(Arch.has(x86_feature::avx512f) &&
3764 Arch.has(x86_feature::avx512bw) &&
3765 Arch.has(x86_feature::avx512vbmi2) &&
3766 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3767 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3771 return detail::x86_vbmi2_constant::shift<true>(
3776 template<isa<x86> Arch,
unsigned Imm8>
3777 requires(!(Arch.has(x86_feature::avx512f) &&
3778 Arch.has(x86_feature::avx512bw) &&
3779 Arch.has(x86_feature::avx512vbmi2) &&
3780 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3781 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3787 return detail::x86_vbmi2_constant::shift<true>(
3788 a, b, Imm8, source,
mask.to_bitset());
3792 template<isa<x86> Arch,
unsigned Imm8>
3793 requires(!(Arch.has(x86_feature::avx512f) &&
3794 Arch.has(x86_feature::avx512bw) &&
3795 Arch.has(x86_feature::avx512vbmi2) &&
3796 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
3797 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3802 return detail::x86_vbmi2_constant::shift<true>(
3807 template<isa<x86> Arch>
3808 requires(!(Arch.has(x86_feature::avx512f) &&
3809 Arch.has(x86_feature::avx512bw) &&
3810 Arch.has(x86_feature::avx512vbmi2) &&
3811 Arch.has(x86_feature::avx512vl)) &&
3812 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3817 return detail::x86_vbmi2_constant::shift<true>(
3822 template<isa<x86> Arch>
3823 requires(!(Arch.has(x86_feature::avx512f) &&
3824 Arch.has(x86_feature::avx512bw) &&
3825 Arch.has(x86_feature::avx512vbmi2) &&
3826 Arch.has(x86_feature::avx512vl)) &&
3827 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3833 return detail::x86_vbmi2_constant::shift<true>(
3834 a, b, counts, a,
mask.to_bitset());
3838 template<isa<x86> Arch>
3839 requires(!(Arch.has(x86_feature::avx512f) &&
3840 Arch.has(x86_feature::avx512bw) &&
3841 Arch.has(x86_feature::avx512vbmi2) &&
3842 Arch.has(x86_feature::avx512vl)) &&
3843 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
3849 return detail::x86_vbmi2_constant::shift<true>(
3854 template<isa<x86> Arch>
3855 requires(!(Arch.has(x86_feature::avx512f) &&
3856 Arch.has(x86_feature::avx512bw) &&
3857 Arch.has(x86_feature::avx512vbmi2) &&
3858 Arch.has(x86_feature::avx512vl)) &&
3859 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3864 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
3868 template<isa<x86> Arch>
3869 requires(!(Arch.has(x86_feature::avx512f) &&
3870 Arch.has(x86_feature::avx512bw) &&
3871 Arch.has(x86_feature::avx512vbmi2) &&
3872 Arch.has(x86_feature::avx512vl)) &&
3873 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3881 template<isa<x86> Arch>
3882 requires(!(Arch.has(x86_feature::avx512f) &&
3883 Arch.has(x86_feature::avx512bw) &&
3884 Arch.has(x86_feature::avx512vbmi2) &&
3885 Arch.has(x86_feature::avx512vl)) &&
3886 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3888 std::uint8_t * destination,
3891 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
3895 template<isa<x86> Arch>
3896 requires(!(Arch.has(x86_feature::avx512f) &&
3897 Arch.has(x86_feature::avx512bw) &&
3898 Arch.has(x86_feature::avx512vbmi2) &&
3899 Arch.has(x86_feature::avx512vl)) &&
3900 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3905 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
3909 template<isa<x86> Arch>
3910 requires(!(Arch.has(x86_feature::avx512f) &&
3911 Arch.has(x86_feature::avx512bw) &&
3912 Arch.has(x86_feature::avx512vbmi2) &&
3913 Arch.has(x86_feature::avx512vl)) &&
3914 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3922 template<isa<x86> Arch,
class T>
3923 requires(!(Arch.has(x86_feature::avx512f) &&
3924 Arch.has(x86_feature::avx512bw) &&
3925 Arch.has(x86_feature::avx512vbmi2) &&
3926 Arch.has(x86_feature::avx512vl)) &&
3927 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
3928 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3932 T * memory)
noexcept {
3933 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
3937 template<isa<x86> Arch,
class T>
3938 requires(!(Arch.has(x86_feature::avx512f) &&
3939 Arch.has(x86_feature::avx512bw) &&
3940 Arch.has(x86_feature::avx512vbmi2) &&
3941 Arch.has(x86_feature::avx512vl)) &&
3942 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
3943 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
3946 T * memory)
noexcept {
3951 template<isa<x86> Arch>
3952 requires(!(Arch.has(x86_feature::avx512f) &&
3953 Arch.has(x86_feature::avx512bw) &&
3954 Arch.has(x86_feature::avx512vbmi2) &&
3955 Arch.has(x86_feature::avx512vl)) &&
3956 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
3961 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
3965 template<isa<x86> Arch>
3966 requires(!(Arch.has(x86_feature::avx512f) &&
3967 Arch.has(x86_feature::avx512bw) &&
3968 Arch.has(x86_feature::avx512vbmi2) &&
3969 Arch.has(x86_feature::avx512vl)) &&
3970 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
3978 template<isa<x86> Arch>
3979 requires(!(Arch.has(x86_feature::avx512f) &&
3980 Arch.has(x86_feature::avx512bw) &&
3981 Arch.has(x86_feature::avx512vbmi2) &&
3982 Arch.has(x86_feature::avx512vl)) &&
3983 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
3985 std::uint16_t * destination,
3988 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
3992 template<isa<x86> Arch>
3993 requires(!(Arch.has(x86_feature::avx512f) &&
3994 Arch.has(x86_feature::avx512bw) &&
3995 Arch.has(x86_feature::avx512vbmi2) &&
3996 Arch.has(x86_feature::avx512vl)) &&
3997 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4002 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
4006 template<isa<x86> Arch>
4007 requires(!(Arch.has(x86_feature::avx512f) &&
4008 Arch.has(x86_feature::avx512bw) &&
4009 Arch.has(x86_feature::avx512vbmi2) &&
4010 Arch.has(x86_feature::avx512vl)) &&
4011 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4019 template<isa<x86> Arch,
class T>
4020 requires(!(Arch.has(x86_feature::avx512f) &&
4021 Arch.has(x86_feature::avx512bw) &&
4022 Arch.has(x86_feature::avx512vbmi2) &&
4023 Arch.has(x86_feature::avx512vl)) &&
4024 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
4025 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4029 T * memory)
noexcept {
4030 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
4034 template<isa<x86> Arch,
class T>
4035 requires(!(Arch.has(x86_feature::avx512f) &&
4036 Arch.has(x86_feature::avx512bw) &&
4037 Arch.has(x86_feature::avx512vbmi2) &&
4038 Arch.has(x86_feature::avx512vl)) &&
4039 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
4040 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4043 T * memory)
noexcept {
4048 template<isa<x86> Arch,
unsigned Imm8>
4049 requires(!(Arch.has(x86_feature::avx512f) &&
4050 Arch.has(x86_feature::avx512bw) &&
4051 Arch.has(x86_feature::avx512vbmi2) &&
4052 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4053 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4057 return detail::x86_vbmi2_constant::shift<false>(
4062 template<isa<x86> Arch,
unsigned Imm8>
4063 requires(!(Arch.has(x86_feature::avx512f) &&
4064 Arch.has(x86_feature::avx512bw) &&
4065 Arch.has(x86_feature::avx512vbmi2) &&
4066 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4067 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4073 return detail::x86_vbmi2_constant::shift<false>(
4074 a, b, Imm8, source,
mask.to_bitset());
4078 template<isa<x86> Arch,
unsigned Imm8>
4079 requires(!(Arch.has(x86_feature::avx512f) &&
4080 Arch.has(x86_feature::avx512bw) &&
4081 Arch.has(x86_feature::avx512vbmi2) &&
4082 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4083 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4088 return detail::x86_vbmi2_constant::shift<false>(
4093 template<isa<x86> Arch>
4094 requires(!(Arch.has(x86_feature::avx512f) &&
4095 Arch.has(x86_feature::avx512bw) &&
4096 Arch.has(x86_feature::avx512vbmi2) &&
4097 Arch.has(x86_feature::avx512vl)) &&
4098 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4103 return detail::x86_vbmi2_constant::shift<false>(
4108 template<isa<x86> Arch>
4109 requires(!(Arch.has(x86_feature::avx512f) &&
4110 Arch.has(x86_feature::avx512bw) &&
4111 Arch.has(x86_feature::avx512vbmi2) &&
4112 Arch.has(x86_feature::avx512vl)) &&
4113 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4119 return detail::x86_vbmi2_constant::shift<false>(
4120 a, b, counts, a,
mask.to_bitset());
4124 template<isa<x86> Arch>
4125 requires(!(Arch.has(x86_feature::avx512f) &&
4126 Arch.has(x86_feature::avx512bw) &&
4127 Arch.has(x86_feature::avx512vbmi2) &&
4128 Arch.has(x86_feature::avx512vl)) &&
4129 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4135 return detail::x86_vbmi2_constant::shift<false>(
4140 template<isa<x86> Arch,
unsigned Imm8>
4141 requires(!(Arch.has(x86_feature::avx512f) &&
4142 Arch.has(x86_feature::avx512bw) &&
4143 Arch.has(x86_feature::avx512vbmi2) &&
4144 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4145 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4149 return detail::x86_vbmi2_constant::shift<true>(
4154 template<isa<x86> Arch,
unsigned Imm8>
4155 requires(!(Arch.has(x86_feature::avx512f) &&
4156 Arch.has(x86_feature::avx512bw) &&
4157 Arch.has(x86_feature::avx512vbmi2) &&
4158 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4159 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4165 return detail::x86_vbmi2_constant::shift<true>(
4166 a, b, Imm8, source,
mask.to_bitset());
4170 template<isa<x86> Arch,
unsigned Imm8>
4171 requires(!(Arch.has(x86_feature::avx512f) &&
4172 Arch.has(x86_feature::avx512bw) &&
4173 Arch.has(x86_feature::avx512vbmi2) &&
4174 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4175 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4180 return detail::x86_vbmi2_constant::shift<true>(
4185 template<isa<x86> Arch>
4186 requires(!(Arch.has(x86_feature::avx512f) &&
4187 Arch.has(x86_feature::avx512bw) &&
4188 Arch.has(x86_feature::avx512vbmi2) &&
4189 Arch.has(x86_feature::avx512vl)) &&
4190 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4195 return detail::x86_vbmi2_constant::shift<true>(
4200 template<isa<x86> Arch>
4201 requires(!(Arch.has(x86_feature::avx512f) &&
4202 Arch.has(x86_feature::avx512bw) &&
4203 Arch.has(x86_feature::avx512vbmi2) &&
4204 Arch.has(x86_feature::avx512vl)) &&
4205 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4211 return detail::x86_vbmi2_constant::shift<true>(
4212 a, b, counts, a,
mask.to_bitset());
4216 template<isa<x86> Arch>
4217 requires(!(Arch.has(x86_feature::avx512f) &&
4218 Arch.has(x86_feature::avx512bw) &&
4219 Arch.has(x86_feature::avx512vbmi2) &&
4220 Arch.has(x86_feature::avx512vl)) &&
4221 requires { sizeof(simd<std::uint16_t, 16, Arch>); })
4227 return detail::x86_vbmi2_constant::shift<true>(
4232 template<isa<x86> Arch,
unsigned Imm8>
4233 requires(!(Arch.has(x86_feature::avx512f) &&
4234 Arch.has(x86_feature::avx512bw) &&
4235 Arch.has(x86_feature::avx512vbmi2) &&
4236 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4237 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4241 return detail::x86_vbmi2_constant::shift<false>(
4246 template<isa<x86> Arch,
unsigned Imm8>
4247 requires(!(Arch.has(x86_feature::avx512f) &&
4248 Arch.has(x86_feature::avx512bw) &&
4249 Arch.has(x86_feature::avx512vbmi2) &&
4250 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4251 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4257 return detail::x86_vbmi2_constant::shift<false>(
4258 a, b, Imm8, source,
mask.to_bitset());
4262 template<isa<x86> Arch,
unsigned Imm8>
4263 requires(!(Arch.has(x86_feature::avx512f) &&
4264 Arch.has(x86_feature::avx512bw) &&
4265 Arch.has(x86_feature::avx512vbmi2) &&
4266 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4267 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4272 return detail::x86_vbmi2_constant::shift<false>(
4277 template<isa<x86> Arch>
4278 requires(!(Arch.has(x86_feature::avx512f) &&
4279 Arch.has(x86_feature::avx512bw) &&
4280 Arch.has(x86_feature::avx512vbmi2) &&
4281 Arch.has(x86_feature::avx512vl)) &&
4282 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4287 return detail::x86_vbmi2_constant::shift<false>(
4292 template<isa<x86> Arch>
4293 requires(!(Arch.has(x86_feature::avx512f) &&
4294 Arch.has(x86_feature::avx512bw) &&
4295 Arch.has(x86_feature::avx512vbmi2) &&
4296 Arch.has(x86_feature::avx512vl)) &&
4297 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4303 return detail::x86_vbmi2_constant::shift<false>(
4304 a, b, counts, a,
mask.to_bitset());
4308 template<isa<x86> Arch>
4309 requires(!(Arch.has(x86_feature::avx512f) &&
4310 Arch.has(x86_feature::avx512bw) &&
4311 Arch.has(x86_feature::avx512vbmi2) &&
4312 Arch.has(x86_feature::avx512vl)) &&
4313 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4319 return detail::x86_vbmi2_constant::shift<false>(
4324 template<isa<x86> Arch,
unsigned Imm8>
4325 requires(!(Arch.has(x86_feature::avx512f) &&
4326 Arch.has(x86_feature::avx512bw) &&
4327 Arch.has(x86_feature::avx512vbmi2) &&
4328 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4329 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4333 return detail::x86_vbmi2_constant::shift<true>(
4338 template<isa<x86> Arch,
unsigned Imm8>
4339 requires(!(Arch.has(x86_feature::avx512f) &&
4340 Arch.has(x86_feature::avx512bw) &&
4341 Arch.has(x86_feature::avx512vbmi2) &&
4342 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4343 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4349 return detail::x86_vbmi2_constant::shift<true>(
4350 a, b, Imm8, source,
mask.to_bitset());
4354 template<isa<x86> Arch,
unsigned Imm8>
4355 requires(!(Arch.has(x86_feature::avx512f) &&
4356 Arch.has(x86_feature::avx512bw) &&
4357 Arch.has(x86_feature::avx512vbmi2) &&
4358 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4359 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4364 return detail::x86_vbmi2_constant::shift<true>(
4369 template<isa<x86> Arch>
4370 requires(!(Arch.has(x86_feature::avx512f) &&
4371 Arch.has(x86_feature::avx512bw) &&
4372 Arch.has(x86_feature::avx512vbmi2) &&
4373 Arch.has(x86_feature::avx512vl)) &&
4374 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4379 return detail::x86_vbmi2_constant::shift<true>(
4384 template<isa<x86> Arch>
4385 requires(!(Arch.has(x86_feature::avx512f) &&
4386 Arch.has(x86_feature::avx512bw) &&
4387 Arch.has(x86_feature::avx512vbmi2) &&
4388 Arch.has(x86_feature::avx512vl)) &&
4389 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4395 return detail::x86_vbmi2_constant::shift<true>(
4396 a, b, counts, a,
mask.to_bitset());
4400 template<isa<x86> Arch>
4401 requires(!(Arch.has(x86_feature::avx512f) &&
4402 Arch.has(x86_feature::avx512bw) &&
4403 Arch.has(x86_feature::avx512vbmi2) &&
4404 Arch.has(x86_feature::avx512vl)) &&
4405 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
4411 return detail::x86_vbmi2_constant::shift<true>(
4416 template<isa<x86> Arch,
unsigned Imm8>
4417 requires(!(Arch.has(x86_feature::avx512f) &&
4418 Arch.has(x86_feature::avx512bw) &&
4419 Arch.has(x86_feature::avx512vbmi2) &&
4420 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4421 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4425 return detail::x86_vbmi2_constant::shift<false>(
4430 template<isa<x86> Arch,
unsigned Imm8>
4431 requires(!(Arch.has(x86_feature::avx512f) &&
4432 Arch.has(x86_feature::avx512bw) &&
4433 Arch.has(x86_feature::avx512vbmi2) &&
4434 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4435 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4441 return detail::x86_vbmi2_constant::shift<false>(
4442 a, b, Imm8, source,
mask.to_bitset());
4446 template<isa<x86> Arch,
unsigned Imm8>
4447 requires(!(Arch.has(x86_feature::avx512f) &&
4448 Arch.has(x86_feature::avx512bw) &&
4449 Arch.has(x86_feature::avx512vbmi2) &&
4450 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4451 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4456 return detail::x86_vbmi2_constant::shift<false>(
4461 template<isa<x86> Arch>
4462 requires(!(Arch.has(x86_feature::avx512f) &&
4463 Arch.has(x86_feature::avx512bw) &&
4464 Arch.has(x86_feature::avx512vbmi2) &&
4465 Arch.has(x86_feature::avx512vl)) &&
4466 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4471 return detail::x86_vbmi2_constant::shift<false>(
4476 template<isa<x86> Arch>
4477 requires(!(Arch.has(x86_feature::avx512f) &&
4478 Arch.has(x86_feature::avx512bw) &&
4479 Arch.has(x86_feature::avx512vbmi2) &&
4480 Arch.has(x86_feature::avx512vl)) &&
4481 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4487 return detail::x86_vbmi2_constant::shift<false>(
4488 a, b, counts, a,
mask.to_bitset());
4492 template<isa<x86> Arch>
4493 requires(!(Arch.has(x86_feature::avx512f) &&
4494 Arch.has(x86_feature::avx512bw) &&
4495 Arch.has(x86_feature::avx512vbmi2) &&
4496 Arch.has(x86_feature::avx512vl)) &&
4497 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4503 return detail::x86_vbmi2_constant::shift<false>(
4508 template<isa<x86> Arch,
unsigned Imm8>
4509 requires(!(Arch.has(x86_feature::avx512f) &&
4510 Arch.has(x86_feature::avx512bw) &&
4511 Arch.has(x86_feature::avx512vbmi2) &&
4512 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4513 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4517 return detail::x86_vbmi2_constant::shift<true>(
4522 template<isa<x86> Arch,
unsigned Imm8>
4523 requires(!(Arch.has(x86_feature::avx512f) &&
4524 Arch.has(x86_feature::avx512bw) &&
4525 Arch.has(x86_feature::avx512vbmi2) &&
4526 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4527 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4533 return detail::x86_vbmi2_constant::shift<true>(
4534 a, b, Imm8, source,
mask.to_bitset());
4538 template<isa<x86> Arch,
unsigned Imm8>
4539 requires(!(Arch.has(x86_feature::avx512f) &&
4540 Arch.has(x86_feature::avx512bw) &&
4541 Arch.has(x86_feature::avx512vbmi2) &&
4542 Arch.has(x86_feature::avx512vl)) && Imm8 <= 255 &&
4543 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4548 return detail::x86_vbmi2_constant::shift<true>(
4553 template<isa<x86> Arch>
4554 requires(!(Arch.has(x86_feature::avx512f) &&
4555 Arch.has(x86_feature::avx512bw) &&
4556 Arch.has(x86_feature::avx512vbmi2) &&
4557 Arch.has(x86_feature::avx512vl)) &&
4558 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4563 return detail::x86_vbmi2_constant::shift<true>(
4568 template<isa<x86> Arch>
4569 requires(!(Arch.has(x86_feature::avx512f) &&
4570 Arch.has(x86_feature::avx512bw) &&
4571 Arch.has(x86_feature::avx512vbmi2) &&
4572 Arch.has(x86_feature::avx512vl)) &&
4573 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4579 return detail::x86_vbmi2_constant::shift<true>(
4580 a, b, counts, a,
mask.to_bitset());
4584 template<isa<x86> Arch>
4585 requires(!(Arch.has(x86_feature::avx512f) &&
4586 Arch.has(x86_feature::avx512bw) &&
4587 Arch.has(x86_feature::avx512vbmi2) &&
4588 Arch.has(x86_feature::avx512vl)) &&
4589 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
4595 return detail::x86_vbmi2_constant::shift<true>(
4600 template<isa<x86> Arch>
4601 requires(!(Arch.has(x86_feature::avx512f) &&
4602 Arch.has(x86_feature::avx512bw) &&
4603 Arch.has(x86_feature::avx512vbmi2)) &&
4604 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4609 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
4613 template<isa<x86> Arch>
4614 requires(!(Arch.has(x86_feature::avx512f) &&
4615 Arch.has(x86_feature::avx512bw) &&
4616 Arch.has(x86_feature::avx512vbmi2)) &&
4617 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4625 template<isa<x86> Arch>
4626 requires(!(Arch.has(x86_feature::avx512f) &&
4627 Arch.has(x86_feature::avx512bw) &&
4628 Arch.has(x86_feature::avx512vbmi2)) &&
4629 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4631 std::uint8_t * destination,
4634 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
4638 template<isa<x86> Arch>
4639 requires(!(Arch.has(x86_feature::avx512f) &&
4640 Arch.has(x86_feature::avx512bw) &&
4641 Arch.has(x86_feature::avx512vbmi2)) &&
4642 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4647 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
4651 template<isa<x86> Arch>
4652 requires(!(Arch.has(x86_feature::avx512f) &&
4653 Arch.has(x86_feature::avx512bw) &&
4654 Arch.has(x86_feature::avx512vbmi2)) &&
4655 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4663 template<isa<x86> Arch,
class T>
4664 requires(!(Arch.has(x86_feature::avx512f) &&
4665 Arch.has(x86_feature::avx512bw) &&
4666 Arch.has(x86_feature::avx512vbmi2)) &&
4667 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
4668 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4672 T * memory)
noexcept {
4673 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
4677 template<isa<x86> Arch,
class T>
4678 requires(!(Arch.has(x86_feature::avx512f) &&
4679 Arch.has(x86_feature::avx512bw) &&
4680 Arch.has(x86_feature::avx512vbmi2)) &&
4681 (std::same_as<T, std::uint8_t> || std::same_as<T, std::uint8_t const>) &&
4682 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
4685 T * memory)
noexcept {
4690 template<isa<x86> Arch>
4691 requires(!(Arch.has(x86_feature::avx512f) &&
4692 Arch.has(x86_feature::avx512bw) &&
4693 Arch.has(x86_feature::avx512vbmi2)) &&
4694 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4699 return detail::x86_vbmi2_constant::compact<false>(source,
mask.to_bitset(), value);
4703 template<isa<x86> Arch>
4704 requires(!(Arch.has(x86_feature::avx512f) &&
4705 Arch.has(x86_feature::avx512bw) &&
4706 Arch.has(x86_feature::avx512vbmi2)) &&
4707 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4715 template<isa<x86> Arch>
4716 requires(!(Arch.has(x86_feature::avx512f) &&
4717 Arch.has(x86_feature::avx512bw) &&
4718 Arch.has(x86_feature::avx512vbmi2)) &&
4719 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4721 std::uint16_t * destination,
4724 detail::x86_vbmi2_constant::compress_store(destination,
mask.to_bitset(), value);
4728 template<isa<x86> Arch>
4729 requires(!(Arch.has(x86_feature::avx512f) &&
4730 Arch.has(x86_feature::avx512bw) &&
4731 Arch.has(x86_feature::avx512vbmi2)) &&
4732 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4737 return detail::x86_vbmi2_constant::compact<true>(source,
mask.to_bitset(), value);
4741 template<isa<x86> Arch>
4742 requires(!(Arch.has(x86_feature::avx512f) &&
4743 Arch.has(x86_feature::avx512bw) &&
4744 Arch.has(x86_feature::avx512vbmi2)) &&
4745 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4753 template<isa<x86> Arch,
class T>
4754 requires(!(Arch.has(x86_feature::avx512f) &&
4755 Arch.has(x86_feature::avx512bw) &&
4756 Arch.has(x86_feature::avx512vbmi2)) &&
4757 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
4758 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4762 T * memory)
noexcept {
4763 return detail::x86_vbmi2_constant::expand_load(source,
mask.to_bitset(), memory);
4767 template<isa<x86> Arch,
class T>
4768 requires(!(Arch.has(x86_feature::avx512f) &&
4769 Arch.has(x86_feature::avx512bw) &&
4770 Arch.has(x86_feature::avx512vbmi2)) &&
4771 (std::same_as<T, std::uint16_t> || std::same_as<T, std::uint16_t const>) &&
4772 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4775 T * memory)
noexcept {
4780 template<isa<x86> Arch,
unsigned Imm8>
4781 requires(!(Arch.has(x86_feature::avx512f) &&
4782 Arch.has(x86_feature::avx512bw) &&
4783 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4784 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4788 return detail::x86_vbmi2_constant::shift<false>(
4793 template<isa<x86> Arch,
unsigned Imm8>
4794 requires(!(Arch.has(x86_feature::avx512f) &&
4795 Arch.has(x86_feature::avx512bw) &&
4796 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4797 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4803 return detail::x86_vbmi2_constant::shift<false>(
4804 a, b, Imm8, source,
mask.to_bitset());
4808 template<isa<x86> Arch,
unsigned Imm8>
4809 requires(!(Arch.has(x86_feature::avx512f) &&
4810 Arch.has(x86_feature::avx512bw) &&
4811 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4812 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4817 return detail::x86_vbmi2_constant::shift<false>(
4822 template<isa<x86> Arch>
4823 requires(!(Arch.has(x86_feature::avx512f) &&
4824 Arch.has(x86_feature::avx512bw) &&
4825 Arch.has(x86_feature::avx512vbmi2)) &&
4826 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4831 return detail::x86_vbmi2_constant::shift<false>(
4836 template<isa<x86> Arch>
4837 requires(!(Arch.has(x86_feature::avx512f) &&
4838 Arch.has(x86_feature::avx512bw) &&
4839 Arch.has(x86_feature::avx512vbmi2)) &&
4840 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4846 return detail::x86_vbmi2_constant::shift<false>(
4847 a, b, counts, a,
mask.to_bitset());
4851 template<isa<x86> Arch>
4852 requires(!(Arch.has(x86_feature::avx512f) &&
4853 Arch.has(x86_feature::avx512bw) &&
4854 Arch.has(x86_feature::avx512vbmi2)) &&
4855 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4861 return detail::x86_vbmi2_constant::shift<false>(
4866 template<isa<x86> Arch,
unsigned Imm8>
4867 requires(!(Arch.has(x86_feature::avx512f) &&
4868 Arch.has(x86_feature::avx512bw) &&
4869 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4870 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4874 return detail::x86_vbmi2_constant::shift<true>(
4879 template<isa<x86> Arch,
unsigned Imm8>
4880 requires(!(Arch.has(x86_feature::avx512f) &&
4881 Arch.has(x86_feature::avx512bw) &&
4882 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4883 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4889 return detail::x86_vbmi2_constant::shift<true>(
4890 a, b, Imm8, source,
mask.to_bitset());
4894 template<isa<x86> Arch,
unsigned Imm8>
4895 requires(!(Arch.has(x86_feature::avx512f) &&
4896 Arch.has(x86_feature::avx512bw) &&
4897 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4898 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4903 return detail::x86_vbmi2_constant::shift<true>(
4908 template<isa<x86> Arch>
4909 requires(!(Arch.has(x86_feature::avx512f) &&
4910 Arch.has(x86_feature::avx512bw) &&
4911 Arch.has(x86_feature::avx512vbmi2)) &&
4912 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4917 return detail::x86_vbmi2_constant::shift<true>(
4922 template<isa<x86> Arch>
4923 requires(!(Arch.has(x86_feature::avx512f) &&
4924 Arch.has(x86_feature::avx512bw) &&
4925 Arch.has(x86_feature::avx512vbmi2)) &&
4926 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4932 return detail::x86_vbmi2_constant::shift<true>(
4933 a, b, counts, a,
mask.to_bitset());
4937 template<isa<x86> Arch>
4938 requires(!(Arch.has(x86_feature::avx512f) &&
4939 Arch.has(x86_feature::avx512bw) &&
4940 Arch.has(x86_feature::avx512vbmi2)) &&
4941 requires { sizeof(simd<std::uint16_t, 32, Arch>); })
4947 return detail::x86_vbmi2_constant::shift<true>(
4952 template<isa<x86> Arch,
unsigned Imm8>
4953 requires(!(Arch.has(x86_feature::avx512f) &&
4954 Arch.has(x86_feature::avx512bw) &&
4955 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4956 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
4960 return detail::x86_vbmi2_constant::shift<false>(
4965 template<isa<x86> Arch,
unsigned Imm8>
4966 requires(!(Arch.has(x86_feature::avx512f) &&
4967 Arch.has(x86_feature::avx512bw) &&
4968 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4969 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
4975 return detail::x86_vbmi2_constant::shift<false>(
4976 a, b, Imm8, source,
mask.to_bitset());
4980 template<isa<x86> Arch,
unsigned Imm8>
4981 requires(!(Arch.has(x86_feature::avx512f) &&
4982 Arch.has(x86_feature::avx512bw) &&
4983 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
4984 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
4989 return detail::x86_vbmi2_constant::shift<false>(
4994 template<isa<x86> Arch>
4995 requires(!(Arch.has(x86_feature::avx512f) &&
4996 Arch.has(x86_feature::avx512bw) &&
4997 Arch.has(x86_feature::avx512vbmi2)) &&
4998 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5003 return detail::x86_vbmi2_constant::shift<false>(
5008 template<isa<x86> Arch>
5009 requires(!(Arch.has(x86_feature::avx512f) &&
5010 Arch.has(x86_feature::avx512bw) &&
5011 Arch.has(x86_feature::avx512vbmi2)) &&
5012 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5018 return detail::x86_vbmi2_constant::shift<false>(
5019 a, b, counts, a,
mask.to_bitset());
5023 template<isa<x86> Arch>
5024 requires(!(Arch.has(x86_feature::avx512f) &&
5025 Arch.has(x86_feature::avx512bw) &&
5026 Arch.has(x86_feature::avx512vbmi2)) &&
5027 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5033 return detail::x86_vbmi2_constant::shift<false>(
5038 template<isa<x86> Arch,
unsigned Imm8>
5039 requires(!(Arch.has(x86_feature::avx512f) &&
5040 Arch.has(x86_feature::avx512bw) &&
5041 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5042 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5046 return detail::x86_vbmi2_constant::shift<true>(
5051 template<isa<x86> Arch,
unsigned Imm8>
5052 requires(!(Arch.has(x86_feature::avx512f) &&
5053 Arch.has(x86_feature::avx512bw) &&
5054 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5055 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5061 return detail::x86_vbmi2_constant::shift<true>(
5062 a, b, Imm8, source,
mask.to_bitset());
5066 template<isa<x86> Arch,
unsigned Imm8>
5067 requires(!(Arch.has(x86_feature::avx512f) &&
5068 Arch.has(x86_feature::avx512bw) &&
5069 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5070 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5075 return detail::x86_vbmi2_constant::shift<true>(
5080 template<isa<x86> Arch>
5081 requires(!(Arch.has(x86_feature::avx512f) &&
5082 Arch.has(x86_feature::avx512bw) &&
5083 Arch.has(x86_feature::avx512vbmi2)) &&
5084 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5089 return detail::x86_vbmi2_constant::shift<true>(
5094 template<isa<x86> Arch>
5095 requires(!(Arch.has(x86_feature::avx512f) &&
5096 Arch.has(x86_feature::avx512bw) &&
5097 Arch.has(x86_feature::avx512vbmi2)) &&
5098 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5104 return detail::x86_vbmi2_constant::shift<true>(
5105 a, b, counts, a,
mask.to_bitset());
5109 template<isa<x86> Arch>
5110 requires(!(Arch.has(x86_feature::avx512f) &&
5111 Arch.has(x86_feature::avx512bw) &&
5112 Arch.has(x86_feature::avx512vbmi2)) &&
5113 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
5119 return detail::x86_vbmi2_constant::shift<true>(
5124 template<isa<x86> Arch,
unsigned Imm8>
5125 requires(!(Arch.has(x86_feature::avx512f) &&
5126 Arch.has(x86_feature::avx512bw) &&
5127 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5128 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5132 return detail::x86_vbmi2_constant::shift<false>(
5137 template<isa<x86> Arch,
unsigned Imm8>
5138 requires(!(Arch.has(x86_feature::avx512f) &&
5139 Arch.has(x86_feature::avx512bw) &&
5140 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5141 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5147 return detail::x86_vbmi2_constant::shift<false>(
5148 a, b, Imm8, source,
mask.to_bitset());
5152 template<isa<x86> Arch,
unsigned Imm8>
5153 requires(!(Arch.has(x86_feature::avx512f) &&
5154 Arch.has(x86_feature::avx512bw) &&
5155 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5156 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5161 return detail::x86_vbmi2_constant::shift<false>(
5166 template<isa<x86> Arch>
5167 requires(!(Arch.has(x86_feature::avx512f) &&
5168 Arch.has(x86_feature::avx512bw) &&
5169 Arch.has(x86_feature::avx512vbmi2)) &&
5170 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5175 return detail::x86_vbmi2_constant::shift<false>(
5180 template<isa<x86> Arch>
5181 requires(!(Arch.has(x86_feature::avx512f) &&
5182 Arch.has(x86_feature::avx512bw) &&
5183 Arch.has(x86_feature::avx512vbmi2)) &&
5184 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5190 return detail::x86_vbmi2_constant::shift<false>(
5191 a, b, counts, a,
mask.to_bitset());
5195 template<isa<x86> Arch>
5196 requires(!(Arch.has(x86_feature::avx512f) &&
5197 Arch.has(x86_feature::avx512bw) &&
5198 Arch.has(x86_feature::avx512vbmi2)) &&
5199 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5205 return detail::x86_vbmi2_constant::shift<false>(
5210 template<isa<x86> Arch,
unsigned Imm8>
5211 requires(!(Arch.has(x86_feature::avx512f) &&
5212 Arch.has(x86_feature::avx512bw) &&
5213 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5214 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5218 return detail::x86_vbmi2_constant::shift<true>(
5223 template<isa<x86> Arch,
unsigned Imm8>
5224 requires(!(Arch.has(x86_feature::avx512f) &&
5225 Arch.has(x86_feature::avx512bw) &&
5226 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5227 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5233 return detail::x86_vbmi2_constant::shift<true>(
5234 a, b, Imm8, source,
mask.to_bitset());
5238 template<isa<x86> Arch,
unsigned Imm8>
5239 requires(!(Arch.has(x86_feature::avx512f) &&
5240 Arch.has(x86_feature::avx512bw) &&
5241 Arch.has(x86_feature::avx512vbmi2)) && Imm8 <= 255 &&
5242 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5247 return detail::x86_vbmi2_constant::shift<true>(
5252 template<isa<x86> Arch>
5253 requires(!(Arch.has(x86_feature::avx512f) &&
5254 Arch.has(x86_feature::avx512bw) &&
5255 Arch.has(x86_feature::avx512vbmi2)) &&
5256 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5261 return detail::x86_vbmi2_constant::shift<true>(
5266 template<isa<x86> Arch>
5267 requires(!(Arch.has(x86_feature::avx512f) &&
5268 Arch.has(x86_feature::avx512bw) &&
5269 Arch.has(x86_feature::avx512vbmi2)) &&
5270 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5276 return detail::x86_vbmi2_constant::shift<true>(
5277 a, b, counts, a,
mask.to_bitset());
5281 template<isa<x86> Arch>
5282 requires(!(Arch.has(x86_feature::avx512f) &&
5283 Arch.has(x86_feature::avx512bw) &&
5284 Arch.has(x86_feature::avx512vbmi2)) &&
5285 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
5291 return detail::x86_vbmi2_constant::shift<true>(
5296 template<isa<x86> Arch,
class... Args>
5300 template<isa<x86> Arch,
class... Args>
5304 template<isa<x86> Arch,
class... Args>
5308 template<isa<x86> Arch,
class... Args>
5312 template<isa<x86> Arch,
class... Args>
5316 template<isa<x86> Arch,
class... Args>
5320 template<isa<x86> Arch,
class... Args>
5324 template<isa<x86> Arch,
class... Args>
5328 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5332 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5336 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5340 template<isa<x86> Arch,
class... Args>
5344 template<isa<x86> Arch,
class... Args>
5348 template<isa<x86> Arch,
class... Args>
5352 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5356 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5360 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5364 template<isa<x86> Arch,
class... Args>
5368 template<isa<x86> Arch,
class... Args>
5372 template<isa<x86> Arch,
class... Args>
5376 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5380 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5384 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5388 template<isa<x86> Arch,
class... Args>
5392 template<isa<x86> Arch,
class... Args>
5396 template<isa<x86> Arch,
class... Args>
5400 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5404 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5408 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5412 template<isa<x86> Arch,
class... Args>
5416 template<isa<x86> Arch,
class... Args>
5420 template<isa<x86> Arch,
class... Args>
5424 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5428 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5432 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5436 template<isa<x86> Arch,
class... Args>
5440 template<isa<x86> Arch,
class... Args>
5444 template<isa<x86> Arch,
class... Args>
5448 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5452 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5456 template<isa<x86> Arch,
unsigned Imm8,
class... Args>
5460 template<isa<x86> Arch,
class... Args>
5464 template<isa<x86> Arch,
class... Args>
5468 template<isa<x86> Arch,
class... Args>
#define native_inline
inline [[always_inline]]
#define native_nodiscard
C++17 [[nodiscard]].
#define native_const
[[const]] is not const
#define native_pure
[[pure]]
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
typename mask_traits< std::remove_cvref_t< T > >::type mask
constexpr simd< std::uint16_t, 8, Arch > maskz_vpshrdw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > maskz_vpshldvd(predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > mask_vpshldd(simd< std::uint32_t, 4, Arch > source, predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes retain source.
constexpr simd< std::uint16_t, 8, Arch > vpshldvw(simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts.
constexpr simd< std::uint32_t, 4, Arch > mask_vpshldvd(simd< std::uint32_t, 4, Arch > a, predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint16_t, 8, Arch > mask_vpcompressw(simd< std::uint16_t, 8, Arch > source, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > value) noexcept
Pack selected lanes in order into the low result lanes. Inactive result lanes retain source.
constexpr simd< std::uint64_t, 2, Arch > maskz_vpshrdvq(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > maskz_vpshldvq(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > mask_vpshrdvd(simd< std::uint32_t, 4, Arch > a, predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint16_t, 8, Arch > maskz_vpshrdvw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > maskz_vpshrdq(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > vpshldvd(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts.
constexpr simd< std::uint16_t, 8, Arch > maskz_vpshldw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > maskz_vpshrdvd(predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > mask_vpshrdq(simd< std::uint64_t, 2, Arch > source, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes retain source.
constexpr simd< std::uint64_t, 2, Arch > mask_vpshldvq(simd< std::uint64_t, 2, Arch > a, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint32_t, 4, Arch > mask_vpshrdd(simd< std::uint32_t, 4, Arch > source, predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes retain source.
constexpr simd< std::uint16_t, 8, Arch > vpshldw(simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes left using Imm8.
constexpr simd< std::uint16_t, 8, Arch > mask_vpshrdw(simd< std::uint16_t, 8, Arch > source, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes retain source.
constexpr simd< std::uint32_t, 4, Arch > vpshldd(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes left using Imm8.
constexpr simd< std::uint16_t, 8, Arch > mask_vpshrdvw(simd< std::uint16_t, 8, Arch > a, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint64_t, 2, Arch > maskz_vpshldq(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes become zero.
constexpr simd< std::uint16_t, 8, Arch > maskz_vpcompressw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > value) noexcept
Pack selected lanes in order into the low result lanes. Remaining result lanes become zero.
constexpr simd< std::uint16_t, 8, Arch > mask_vpshldw(simd< std::uint16_t, 8, Arch > source, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes retain source.
constexpr simd< std::uint16_t, 8, Arch > vpshrdw(simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Shift concatenated lanes right using Imm8.
constexpr simd< std::uint64_t, 2, Arch > mask_vpshldq(simd< std::uint64_t, 2, Arch > source, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes retain source.
constexpr simd< std::uint32_t, 4, Arch > maskz_vpshrdd(predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes right using Imm8. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > vpshrdvd(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b, simd< std::uint32_t, 4, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpcompressb(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > value) noexcept
Pack selected lanes in order into the low result lanes. Remaining result lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > vpshrdvq(simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts.
constexpr simd< std::uint16_t, 8, Arch > mask_vpexpandw(simd< std::uint16_t, 8, Arch > source, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > value) noexcept
Expand the packed prefix into selected lanes. Inactive result lanes retain source.
constexpr simd< std::uint32_t, 4, Arch > maskz_vpshldd(predicate< 4, Arch > mask, simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes left using Imm8. Inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > vpshrdd(simd< std::uint32_t, 4, Arch > a, simd< std::uint32_t, 4, Arch > b) noexcept
Shift concatenated lanes right using Imm8.
constexpr simd< std::uint16_t, 8, Arch > maskz_vpshldvw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes become zero.
constexpr simd< std::uint16_t, 8, Arch > mask_vpshldvw(simd< std::uint16_t, 8, Arch > a, predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint64_t, 2, Arch > vpshldq(simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes left using Imm8.
constexpr simd< std::uint16_t, 8, Arch > maskz_vpexpandw(predicate< 8, Arch > mask, simd< std::uint16_t, 8, Arch > value) noexcept
Expand the packed prefix into selected lanes. Remaining result lanes become zero.
constexpr simd< std::uint8_t, 16, Arch > mask_vpexpandb(simd< std::uint8_t, 16, Arch > source, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > value) noexcept
Expand the packed prefix into selected lanes. Inactive result lanes retain source.
constexpr simd< std::uint64_t, 2, Arch > vpshldvq(simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes left using per-lane counts.
constexpr simd< std::uint64_t, 2, Arch > vpshrdq(simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Shift concatenated lanes right using Imm8.
constexpr simd< std::uint8_t, 16, Arch > mask_vpcompressb(simd< std::uint8_t, 16, Arch > source, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > value) noexcept
Pack selected lanes in order into the low result lanes. Inactive result lanes retain source.
constexpr simd< std::uint16_t, 8, Arch > vpshrdvw(simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b, simd< std::uint16_t, 8, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts.
constexpr simd< std::uint64_t, 2, Arch > mask_vpshrdvq(simd< std::uint64_t, 2, Arch > a, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > b, simd< std::uint64_t, 2, Arch > counts) noexcept
Shift concatenated lanes right using per-lane counts. Inactive lanes retain a.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpexpandb(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > value) noexcept
Expand the packed prefix into selected lanes. Remaining result lanes become zero.
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
Standard-library adaptations documented here for SIMD value types.
Omitted architecture arguments use the native.simd provider's baseline.