3#include "native/isa_import.h"
4#include "native/x86/vbmi.h"
10#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
25 template<isa<x86> Arch>
26 requires(Arch.has(x86_feature::avx512f) &&
27 Arch.has(x86_feature::avx512bw) &&
28 Arch.has(x86_feature::avx512vbmi) &&
29 Arch.has(x86_feature::avx512vl))
32 simd<
std::uint8_t, 16, Arch> indices,
33 simd<
std::uint8_t, 16, Arch> value) noexcept {
35 return detail::x86_vbmi_constant::permute<false>(
39 detail::x86_vbmi::vpermb<Arch>(
40 indices.to_native(), value.to_native()));
45 template<isa<x86> Arch>
46 requires(Arch.has(x86_feature::avx512f) &&
47 Arch.has(x86_feature::avx512bw) &&
48 Arch.has(x86_feature::avx512vbmi) &&
49 Arch.has(x86_feature::avx512vl))
57 return detail::x86_vbmi_constant::permute<false>(
61 detail::x86_vbmi::mask_vpermb<Arch>(
62 source.to_native(),
mask.to_bitset(), indices.to_native(), value.to_native()));
67 template<isa<x86> Arch>
68 requires(Arch.has(x86_feature::avx512f) &&
69 Arch.has(x86_feature::avx512bw) &&
70 Arch.has(x86_feature::avx512vbmi) &&
71 Arch.has(x86_feature::avx512vl))
78 return detail::x86_vbmi_constant::permute<false>(
82 detail::x86_vbmi::maskz_vpermb<Arch>(
83 mask.to_bitset(), indices.to_native(), value.to_native()));
88 template<isa<x86> Arch>
89 requires(Arch.has(x86_feature::avx512f) &&
90 Arch.has(x86_feature::avx512bw) &&
91 Arch.has(x86_feature::avx512vbmi) &&
92 Arch.has(x86_feature::avx512vl))
99 return detail::x86_vbmi_constant::permute<true>(
103 detail::x86_vbmi::vpermt2b<Arch>(
104 a.to_native(), indices.to_native(), b.to_native()));
109 template<isa<x86> Arch>
110 requires(Arch.has(x86_feature::avx512f) &&
111 Arch.has(x86_feature::avx512bw) &&
112 Arch.has(x86_feature::avx512vbmi) &&
113 Arch.has(x86_feature::avx512vl))
121 return detail::x86_vbmi_constant::permute<true>(
122 indices, a, b, a,
mask.to_bitset());
125 detail::x86_vbmi::mask_vpermt2b<Arch>(
126 a.to_native(),
mask.to_bitset(), indices.to_native(), b.to_native()));
131 template<isa<x86> Arch>
132 requires(Arch.has(x86_feature::avx512f) &&
133 Arch.has(x86_feature::avx512bw) &&
134 Arch.has(x86_feature::avx512vbmi) &&
135 Arch.has(x86_feature::avx512vl))
143 return detail::x86_vbmi_constant::permute<true>(
147 detail::x86_vbmi::maskz_vpermt2b<Arch>(
148 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
153 template<isa<x86> Arch>
154 requires(Arch.has(x86_feature::avx512f) &&
155 Arch.has(x86_feature::avx512bw) &&
156 Arch.has(x86_feature::avx512vbmi) &&
157 Arch.has(x86_feature::avx512vl))
164 return detail::x86_vbmi_constant::permute<true>(
168 detail::x86_vbmi::vpermi2b<Arch>(
169 indices.to_native(), a.to_native(), b.to_native()));
174 template<isa<x86> Arch>
175 requires(Arch.has(x86_feature::avx512f) &&
176 Arch.has(x86_feature::avx512bw) &&
177 Arch.has(x86_feature::avx512vbmi) &&
178 Arch.has(x86_feature::avx512vl))
186 return detail::x86_vbmi_constant::permute<true>(
187 indices, a, b, indices,
mask.to_bitset());
190 detail::x86_vbmi::mask_vpermi2b<Arch>(
191 indices.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
196 template<isa<x86> Arch>
197 requires(Arch.has(x86_feature::avx512f) &&
198 Arch.has(x86_feature::avx512bw) &&
199 Arch.has(x86_feature::avx512vbmi) &&
200 Arch.has(x86_feature::avx512vl))
208 return detail::x86_vbmi_constant::permute<true>(
212 detail::x86_vbmi::maskz_vpermi2b<Arch>(
213 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
218 template<isa<x86> Arch>
219 requires(Arch.has(x86_feature::avx512f) &&
220 Arch.has(x86_feature::avx512bw) &&
221 Arch.has(x86_feature::avx512vbmi) &&
222 Arch.has(x86_feature::avx512vl))
228 return detail::x86_vbmi_constant::multishift(
232 detail::x86_vbmi::vpmultishiftqb<Arch>(
233 control.to_native(), value.to_native()));
238 template<isa<x86> Arch>
239 requires(Arch.has(x86_feature::avx512f) &&
240 Arch.has(x86_feature::avx512bw) &&
241 Arch.has(x86_feature::avx512vbmi) &&
242 Arch.has(x86_feature::avx512vl))
250 return detail::x86_vbmi_constant::multishift(
251 control, value, source,
mask.to_bitset());
254 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
255 source.to_native(),
mask.to_bitset(), control.to_native(), value.to_native()));
260 template<isa<x86> Arch>
261 requires(Arch.has(x86_feature::avx512f) &&
262 Arch.has(x86_feature::avx512bw) &&
263 Arch.has(x86_feature::avx512vbmi) &&
264 Arch.has(x86_feature::avx512vl))
271 return detail::x86_vbmi_constant::multishift(
275 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
276 mask.to_bitset(), control.to_native(), value.to_native()));
281 template<isa<x86> Arch>
282 requires(Arch.has(x86_feature::avx512f) &&
283 Arch.has(x86_feature::avx512bw) &&
284 Arch.has(x86_feature::avx512vbmi) &&
285 Arch.has(x86_feature::avx512vl))
291 return detail::x86_vbmi_constant::permute<false>(
295 detail::x86_vbmi::vpermb<Arch>(
296 indices.to_native(), value.to_native()));
301 template<isa<x86> Arch>
302 requires(Arch.has(x86_feature::avx512f) &&
303 Arch.has(x86_feature::avx512bw) &&
304 Arch.has(x86_feature::avx512vbmi) &&
305 Arch.has(x86_feature::avx512vl))
313 return detail::x86_vbmi_constant::permute<false>(
317 detail::x86_vbmi::mask_vpermb<Arch>(
318 source.to_native(),
mask.to_bitset(), indices.to_native(), value.to_native()));
323 template<isa<x86> Arch>
324 requires(Arch.has(x86_feature::avx512f) &&
325 Arch.has(x86_feature::avx512bw) &&
326 Arch.has(x86_feature::avx512vbmi) &&
327 Arch.has(x86_feature::avx512vl))
334 return detail::x86_vbmi_constant::permute<false>(
338 detail::x86_vbmi::maskz_vpermb<Arch>(
339 mask.to_bitset(), indices.to_native(), value.to_native()));
344 template<isa<x86> Arch>
345 requires(Arch.has(x86_feature::avx512f) &&
346 Arch.has(x86_feature::avx512bw) &&
347 Arch.has(x86_feature::avx512vbmi) &&
348 Arch.has(x86_feature::avx512vl))
355 return detail::x86_vbmi_constant::permute<true>(
359 detail::x86_vbmi::vpermt2b<Arch>(
360 a.to_native(), indices.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::avx512vbmi) &&
369 Arch.has(x86_feature::avx512vl))
377 return detail::x86_vbmi_constant::permute<true>(
378 indices, a, b, a,
mask.to_bitset());
381 detail::x86_vbmi::mask_vpermt2b<Arch>(
382 a.to_native(),
mask.to_bitset(), indices.to_native(), b.to_native()));
387 template<isa<x86> Arch>
388 requires(Arch.has(x86_feature::avx512f) &&
389 Arch.has(x86_feature::avx512bw) &&
390 Arch.has(x86_feature::avx512vbmi) &&
391 Arch.has(x86_feature::avx512vl))
399 return detail::x86_vbmi_constant::permute<true>(
403 detail::x86_vbmi::maskz_vpermt2b<Arch>(
404 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
409 template<isa<x86> Arch>
410 requires(Arch.has(x86_feature::avx512f) &&
411 Arch.has(x86_feature::avx512bw) &&
412 Arch.has(x86_feature::avx512vbmi) &&
413 Arch.has(x86_feature::avx512vl))
420 return detail::x86_vbmi_constant::permute<true>(
424 detail::x86_vbmi::vpermi2b<Arch>(
425 indices.to_native(), a.to_native(), b.to_native()));
430 template<isa<x86> Arch>
431 requires(Arch.has(x86_feature::avx512f) &&
432 Arch.has(x86_feature::avx512bw) &&
433 Arch.has(x86_feature::avx512vbmi) &&
434 Arch.has(x86_feature::avx512vl))
442 return detail::x86_vbmi_constant::permute<true>(
443 indices, a, b, indices,
mask.to_bitset());
446 detail::x86_vbmi::mask_vpermi2b<Arch>(
447 indices.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
452 template<isa<x86> Arch>
453 requires(Arch.has(x86_feature::avx512f) &&
454 Arch.has(x86_feature::avx512bw) &&
455 Arch.has(x86_feature::avx512vbmi) &&
456 Arch.has(x86_feature::avx512vl))
464 return detail::x86_vbmi_constant::permute<true>(
468 detail::x86_vbmi::maskz_vpermi2b<Arch>(
469 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
474 template<isa<x86> Arch>
475 requires(Arch.has(x86_feature::avx512f) &&
476 Arch.has(x86_feature::avx512bw) &&
477 Arch.has(x86_feature::avx512vbmi) &&
478 Arch.has(x86_feature::avx512vl))
484 return detail::x86_vbmi_constant::multishift(
488 detail::x86_vbmi::vpmultishiftqb<Arch>(
489 control.to_native(), value.to_native()));
494 template<isa<x86> Arch>
495 requires(Arch.has(x86_feature::avx512f) &&
496 Arch.has(x86_feature::avx512bw) &&
497 Arch.has(x86_feature::avx512vbmi) &&
498 Arch.has(x86_feature::avx512vl))
506 return detail::x86_vbmi_constant::multishift(
507 control, value, source,
mask.to_bitset());
510 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
511 source.to_native(),
mask.to_bitset(), control.to_native(), value.to_native()));
516 template<isa<x86> Arch>
517 requires(Arch.has(x86_feature::avx512f) &&
518 Arch.has(x86_feature::avx512bw) &&
519 Arch.has(x86_feature::avx512vbmi) &&
520 Arch.has(x86_feature::avx512vl))
527 return detail::x86_vbmi_constant::multishift(
531 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
532 mask.to_bitset(), control.to_native(), value.to_native()));
537 template<isa<x86> Arch>
538 requires(Arch.has(x86_feature::avx512f) &&
539 Arch.has(x86_feature::avx512bw) &&
540 Arch.has(x86_feature::avx512vbmi))
546 return detail::x86_vbmi_constant::permute<false>(
550 detail::x86_vbmi::vpermb<Arch>(
551 indices.to_native(), value.to_native()));
556 template<isa<x86> Arch>
557 requires(Arch.has(x86_feature::avx512f) &&
558 Arch.has(x86_feature::avx512bw) &&
559 Arch.has(x86_feature::avx512vbmi))
567 return detail::x86_vbmi_constant::permute<false>(
571 detail::x86_vbmi::mask_vpermb<Arch>(
572 source.to_native(),
mask.to_bitset(), indices.to_native(), value.to_native()));
577 template<isa<x86> Arch>
578 requires(Arch.has(x86_feature::avx512f) &&
579 Arch.has(x86_feature::avx512bw) &&
580 Arch.has(x86_feature::avx512vbmi))
587 return detail::x86_vbmi_constant::permute<false>(
591 detail::x86_vbmi::maskz_vpermb<Arch>(
592 mask.to_bitset(), indices.to_native(), value.to_native()));
597 template<isa<x86> Arch>
598 requires(Arch.has(x86_feature::avx512f) &&
599 Arch.has(x86_feature::avx512bw) &&
600 Arch.has(x86_feature::avx512vbmi))
607 return detail::x86_vbmi_constant::permute<true>(
611 detail::x86_vbmi::vpermt2b<Arch>(
612 a.to_native(), indices.to_native(), b.to_native()));
617 template<isa<x86> Arch>
618 requires(Arch.has(x86_feature::avx512f) &&
619 Arch.has(x86_feature::avx512bw) &&
620 Arch.has(x86_feature::avx512vbmi))
628 return detail::x86_vbmi_constant::permute<true>(
629 indices, a, b, a,
mask.to_bitset());
632 detail::x86_vbmi::mask_vpermt2b<Arch>(
633 a.to_native(),
mask.to_bitset(), indices.to_native(), b.to_native()));
638 template<isa<x86> Arch>
639 requires(Arch.has(x86_feature::avx512f) &&
640 Arch.has(x86_feature::avx512bw) &&
641 Arch.has(x86_feature::avx512vbmi))
649 return detail::x86_vbmi_constant::permute<true>(
653 detail::x86_vbmi::maskz_vpermt2b<Arch>(
654 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
659 template<isa<x86> Arch>
660 requires(Arch.has(x86_feature::avx512f) &&
661 Arch.has(x86_feature::avx512bw) &&
662 Arch.has(x86_feature::avx512vbmi))
669 return detail::x86_vbmi_constant::permute<true>(
673 detail::x86_vbmi::vpermi2b<Arch>(
674 indices.to_native(), a.to_native(), b.to_native()));
679 template<isa<x86> Arch>
680 requires(Arch.has(x86_feature::avx512f) &&
681 Arch.has(x86_feature::avx512bw) &&
682 Arch.has(x86_feature::avx512vbmi))
690 return detail::x86_vbmi_constant::permute<true>(
691 indices, a, b, indices,
mask.to_bitset());
694 detail::x86_vbmi::mask_vpermi2b<Arch>(
695 indices.to_native(),
mask.to_bitset(), a.to_native(), b.to_native()));
700 template<isa<x86> Arch>
701 requires(Arch.has(x86_feature::avx512f) &&
702 Arch.has(x86_feature::avx512bw) &&
703 Arch.has(x86_feature::avx512vbmi))
711 return detail::x86_vbmi_constant::permute<true>(
715 detail::x86_vbmi::maskz_vpermi2b<Arch>(
716 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
721 template<isa<x86> Arch>
722 requires(Arch.has(x86_feature::avx512f) &&
723 Arch.has(x86_feature::avx512bw) &&
724 Arch.has(x86_feature::avx512vbmi))
730 return detail::x86_vbmi_constant::multishift(
734 detail::x86_vbmi::vpmultishiftqb<Arch>(
735 control.to_native(), value.to_native()));
740 template<isa<x86> Arch>
741 requires(Arch.has(x86_feature::avx512f) &&
742 Arch.has(x86_feature::avx512bw) &&
743 Arch.has(x86_feature::avx512vbmi))
751 return detail::x86_vbmi_constant::multishift(
752 control, value, source,
mask.to_bitset());
755 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
756 source.to_native(),
mask.to_bitset(), control.to_native(), value.to_native()));
761 template<isa<x86> Arch>
762 requires(Arch.has(x86_feature::avx512f) &&
763 Arch.has(x86_feature::avx512bw) &&
764 Arch.has(x86_feature::avx512vbmi))
771 return detail::x86_vbmi_constant::multishift(
775 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
776 mask.to_bitset(), control.to_native(), value.to_native()));
781 template<isa<x86> Arch>
782 requires(!(Arch.has(x86_feature::avx512f) &&
783 Arch.has(x86_feature::avx512bw) &&
784 Arch.has(x86_feature::avx512vbmi) &&
785 Arch.has(x86_feature::avx512vl)) &&
786 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
790 return detail::x86_vbmi_constant::permute<false>(
795 template<isa<x86> Arch>
796 requires(!(Arch.has(x86_feature::avx512f) &&
797 Arch.has(x86_feature::avx512bw) &&
798 Arch.has(x86_feature::avx512vbmi) &&
799 Arch.has(x86_feature::avx512vl)) &&
800 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
806 return detail::x86_vbmi_constant::permute<false>(
811 template<isa<x86> Arch>
812 requires(!(Arch.has(x86_feature::avx512f) &&
813 Arch.has(x86_feature::avx512bw) &&
814 Arch.has(x86_feature::avx512vbmi) &&
815 Arch.has(x86_feature::avx512vl)) &&
816 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
821 return detail::x86_vbmi_constant::permute<false>(
826 template<isa<x86> Arch>
827 requires(!(Arch.has(x86_feature::avx512f) &&
828 Arch.has(x86_feature::avx512bw) &&
829 Arch.has(x86_feature::avx512vbmi) &&
830 Arch.has(x86_feature::avx512vl)) &&
831 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
836 return detail::x86_vbmi_constant::permute<true>(
841 template<isa<x86> Arch>
842 requires(!(Arch.has(x86_feature::avx512f) &&
843 Arch.has(x86_feature::avx512bw) &&
844 Arch.has(x86_feature::avx512vbmi) &&
845 Arch.has(x86_feature::avx512vl)) &&
846 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
852 return detail::x86_vbmi_constant::permute<true>(
853 indices, a, b, a,
mask.to_bitset());
857 template<isa<x86> Arch>
858 requires(!(Arch.has(x86_feature::avx512f) &&
859 Arch.has(x86_feature::avx512bw) &&
860 Arch.has(x86_feature::avx512vbmi) &&
861 Arch.has(x86_feature::avx512vl)) &&
862 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
868 return detail::x86_vbmi_constant::permute<true>(
873 template<isa<x86> Arch>
874 requires(!(Arch.has(x86_feature::avx512f) &&
875 Arch.has(x86_feature::avx512bw) &&
876 Arch.has(x86_feature::avx512vbmi) &&
877 Arch.has(x86_feature::avx512vl)) &&
878 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
883 return detail::x86_vbmi_constant::permute<true>(
888 template<isa<x86> Arch>
889 requires(!(Arch.has(x86_feature::avx512f) &&
890 Arch.has(x86_feature::avx512bw) &&
891 Arch.has(x86_feature::avx512vbmi) &&
892 Arch.has(x86_feature::avx512vl)) &&
893 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
899 return detail::x86_vbmi_constant::permute<true>(
900 indices, a, b, indices,
mask.to_bitset());
904 template<isa<x86> Arch>
905 requires(!(Arch.has(x86_feature::avx512f) &&
906 Arch.has(x86_feature::avx512bw) &&
907 Arch.has(x86_feature::avx512vbmi) &&
908 Arch.has(x86_feature::avx512vl)) &&
909 requires { sizeof(simd<std::uint8_t, 16, Arch>); })
915 return detail::x86_vbmi_constant::permute<true>(
920 template<isa<x86> Arch>
921 requires(!(Arch.has(x86_feature::avx512f) &&
922 Arch.has(x86_feature::avx512bw) &&
923 Arch.has(x86_feature::avx512vbmi) &&
924 Arch.has(x86_feature::avx512vl)) &&
925 requires { sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::uint64_t, 2, Arch>); })
929 return detail::x86_vbmi_constant::multishift(
934 template<isa<x86> Arch>
935 requires(!(Arch.has(x86_feature::avx512f) &&
936 Arch.has(x86_feature::avx512bw) &&
937 Arch.has(x86_feature::avx512vbmi) &&
938 Arch.has(x86_feature::avx512vl)) &&
939 requires { sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::uint64_t, 2, Arch>); })
945 return detail::x86_vbmi_constant::multishift(
946 control, value, source,
mask.to_bitset());
950 template<isa<x86> Arch>
951 requires(!(Arch.has(x86_feature::avx512f) &&
952 Arch.has(x86_feature::avx512bw) &&
953 Arch.has(x86_feature::avx512vbmi) &&
954 Arch.has(x86_feature::avx512vl)) &&
955 requires { sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::uint64_t, 2, Arch>); })
960 return detail::x86_vbmi_constant::multishift(
965 template<isa<x86> Arch>
966 requires(!(Arch.has(x86_feature::avx512f) &&
967 Arch.has(x86_feature::avx512bw) &&
968 Arch.has(x86_feature::avx512vbmi) &&
969 Arch.has(x86_feature::avx512vl)) &&
970 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
974 return detail::x86_vbmi_constant::permute<false>(
979 template<isa<x86> Arch>
980 requires(!(Arch.has(x86_feature::avx512f) &&
981 Arch.has(x86_feature::avx512bw) &&
982 Arch.has(x86_feature::avx512vbmi) &&
983 Arch.has(x86_feature::avx512vl)) &&
984 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
990 return detail::x86_vbmi_constant::permute<false>(
995 template<isa<x86> Arch>
996 requires(!(Arch.has(x86_feature::avx512f) &&
997 Arch.has(x86_feature::avx512bw) &&
998 Arch.has(x86_feature::avx512vbmi) &&
999 Arch.has(x86_feature::avx512vl)) &&
1000 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1005 return detail::x86_vbmi_constant::permute<false>(
1010 template<isa<x86> Arch>
1011 requires(!(Arch.has(x86_feature::avx512f) &&
1012 Arch.has(x86_feature::avx512bw) &&
1013 Arch.has(x86_feature::avx512vbmi) &&
1014 Arch.has(x86_feature::avx512vl)) &&
1015 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1020 return detail::x86_vbmi_constant::permute<true>(
1025 template<isa<x86> Arch>
1026 requires(!(Arch.has(x86_feature::avx512f) &&
1027 Arch.has(x86_feature::avx512bw) &&
1028 Arch.has(x86_feature::avx512vbmi) &&
1029 Arch.has(x86_feature::avx512vl)) &&
1030 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1036 return detail::x86_vbmi_constant::permute<true>(
1037 indices, a, b, a,
mask.to_bitset());
1041 template<isa<x86> Arch>
1042 requires(!(Arch.has(x86_feature::avx512f) &&
1043 Arch.has(x86_feature::avx512bw) &&
1044 Arch.has(x86_feature::avx512vbmi) &&
1045 Arch.has(x86_feature::avx512vl)) &&
1046 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1052 return detail::x86_vbmi_constant::permute<true>(
1057 template<isa<x86> Arch>
1058 requires(!(Arch.has(x86_feature::avx512f) &&
1059 Arch.has(x86_feature::avx512bw) &&
1060 Arch.has(x86_feature::avx512vbmi) &&
1061 Arch.has(x86_feature::avx512vl)) &&
1062 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1067 return detail::x86_vbmi_constant::permute<true>(
1072 template<isa<x86> Arch>
1073 requires(!(Arch.has(x86_feature::avx512f) &&
1074 Arch.has(x86_feature::avx512bw) &&
1075 Arch.has(x86_feature::avx512vbmi) &&
1076 Arch.has(x86_feature::avx512vl)) &&
1077 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1083 return detail::x86_vbmi_constant::permute<true>(
1084 indices, a, b, indices,
mask.to_bitset());
1088 template<isa<x86> Arch>
1089 requires(!(Arch.has(x86_feature::avx512f) &&
1090 Arch.has(x86_feature::avx512bw) &&
1091 Arch.has(x86_feature::avx512vbmi) &&
1092 Arch.has(x86_feature::avx512vl)) &&
1093 requires { sizeof(simd<std::uint8_t, 32, Arch>); })
1099 return detail::x86_vbmi_constant::permute<true>(
1104 template<isa<x86> Arch>
1105 requires(!(Arch.has(x86_feature::avx512f) &&
1106 Arch.has(x86_feature::avx512bw) &&
1107 Arch.has(x86_feature::avx512vbmi) &&
1108 Arch.has(x86_feature::avx512vl)) &&
1109 requires { sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::uint64_t, 4, Arch>); })
1113 return detail::x86_vbmi_constant::multishift(
1118 template<isa<x86> Arch>
1119 requires(!(Arch.has(x86_feature::avx512f) &&
1120 Arch.has(x86_feature::avx512bw) &&
1121 Arch.has(x86_feature::avx512vbmi) &&
1122 Arch.has(x86_feature::avx512vl)) &&
1123 requires { sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::uint64_t, 4, Arch>); })
1129 return detail::x86_vbmi_constant::multishift(
1130 control, value, source,
mask.to_bitset());
1134 template<isa<x86> Arch>
1135 requires(!(Arch.has(x86_feature::avx512f) &&
1136 Arch.has(x86_feature::avx512bw) &&
1137 Arch.has(x86_feature::avx512vbmi) &&
1138 Arch.has(x86_feature::avx512vl)) &&
1139 requires { sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::uint64_t, 4, Arch>); })
1144 return detail::x86_vbmi_constant::multishift(
1149 template<isa<x86> Arch>
1150 requires(!(Arch.has(x86_feature::avx512f) &&
1151 Arch.has(x86_feature::avx512bw) &&
1152 Arch.has(x86_feature::avx512vbmi)) &&
1153 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1157 return detail::x86_vbmi_constant::permute<false>(
1162 template<isa<x86> Arch>
1163 requires(!(Arch.has(x86_feature::avx512f) &&
1164 Arch.has(x86_feature::avx512bw) &&
1165 Arch.has(x86_feature::avx512vbmi)) &&
1166 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1172 return detail::x86_vbmi_constant::permute<false>(
1177 template<isa<x86> Arch>
1178 requires(!(Arch.has(x86_feature::avx512f) &&
1179 Arch.has(x86_feature::avx512bw) &&
1180 Arch.has(x86_feature::avx512vbmi)) &&
1181 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1186 return detail::x86_vbmi_constant::permute<false>(
1191 template<isa<x86> Arch>
1192 requires(!(Arch.has(x86_feature::avx512f) &&
1193 Arch.has(x86_feature::avx512bw) &&
1194 Arch.has(x86_feature::avx512vbmi)) &&
1195 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1200 return detail::x86_vbmi_constant::permute<true>(
1205 template<isa<x86> Arch>
1206 requires(!(Arch.has(x86_feature::avx512f) &&
1207 Arch.has(x86_feature::avx512bw) &&
1208 Arch.has(x86_feature::avx512vbmi)) &&
1209 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1215 return detail::x86_vbmi_constant::permute<true>(
1216 indices, a, b, a,
mask.to_bitset());
1220 template<isa<x86> Arch>
1221 requires(!(Arch.has(x86_feature::avx512f) &&
1222 Arch.has(x86_feature::avx512bw) &&
1223 Arch.has(x86_feature::avx512vbmi)) &&
1224 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1230 return detail::x86_vbmi_constant::permute<true>(
1235 template<isa<x86> Arch>
1236 requires(!(Arch.has(x86_feature::avx512f) &&
1237 Arch.has(x86_feature::avx512bw) &&
1238 Arch.has(x86_feature::avx512vbmi)) &&
1239 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1244 return detail::x86_vbmi_constant::permute<true>(
1249 template<isa<x86> Arch>
1250 requires(!(Arch.has(x86_feature::avx512f) &&
1251 Arch.has(x86_feature::avx512bw) &&
1252 Arch.has(x86_feature::avx512vbmi)) &&
1253 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1259 return detail::x86_vbmi_constant::permute<true>(
1260 indices, a, b, indices,
mask.to_bitset());
1264 template<isa<x86> Arch>
1265 requires(!(Arch.has(x86_feature::avx512f) &&
1266 Arch.has(x86_feature::avx512bw) &&
1267 Arch.has(x86_feature::avx512vbmi)) &&
1268 requires { sizeof(simd<std::uint8_t, 64, Arch>); })
1274 return detail::x86_vbmi_constant::permute<true>(
1279 template<isa<x86> Arch>
1280 requires(!(Arch.has(x86_feature::avx512f) &&
1281 Arch.has(x86_feature::avx512bw) &&
1282 Arch.has(x86_feature::avx512vbmi)) &&
1283 requires { sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::uint64_t, 8, Arch>); })
1287 return detail::x86_vbmi_constant::multishift(
1292 template<isa<x86> Arch>
1293 requires(!(Arch.has(x86_feature::avx512f) &&
1294 Arch.has(x86_feature::avx512bw) &&
1295 Arch.has(x86_feature::avx512vbmi)) &&
1296 requires { sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::uint64_t, 8, Arch>); })
1302 return detail::x86_vbmi_constant::multishift(
1303 control, value, source,
mask.to_bitset());
1307 template<isa<x86> Arch>
1308 requires(!(Arch.has(x86_feature::avx512f) &&
1309 Arch.has(x86_feature::avx512bw) &&
1310 Arch.has(x86_feature::avx512vbmi)) &&
1311 requires { sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::uint64_t, 8, Arch>); })
1316 return detail::x86_vbmi_constant::multishift(
1321 template<isa<x86> Arch,
class... Args>
1325 template<isa<x86> Arch,
class... Args>
1329 template<isa<x86> Arch,
class... Args>
1333 template<isa<x86> Arch,
class... Args>
1337 template<isa<x86> Arch,
class... Args>
1341 template<isa<x86> Arch,
class... Args>
1345 template<isa<x86> Arch,
class... Args>
1349 template<isa<x86> Arch,
class... Args>
1353 template<isa<x86> Arch,
class... Args>
1357 template<isa<x86> Arch,
class... Args>
1361 template<isa<x86> Arch,
class... Args>
1365 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_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::uint8_t, 16, Arch > mask_vpmultishiftqb(simd< std::uint8_t, 16, Arch > source, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > control, simd< std::uint64_t, 2, Arch > value) noexcept
Inactive destination bytes retain source.
constexpr simd< std::uint8_t, 16, Arch > vpmultishiftqb(simd< std::uint8_t, 16, Arch > control, simd< std::uint64_t, 2, Arch > value) noexcept
Select eight wrapping bits per control byte from its corresponding source qword.
constexpr simd< std::uint8_t, 16, Arch > vpermb(simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > value) noexcept
Permute bytes across the whole vector using the low index bits.
constexpr simd< std::uint8_t, 16, Arch > mask_vpermi2b(simd< std::uint8_t, 16, Arch > indices, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Inactive destination bytes retain the index vector.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpermt2b(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > b) noexcept
Inactive destination bytes become zero.
constexpr simd< std::uint8_t, 16, Arch > mask_vpermb(simd< std::uint8_t, 16, Arch > source, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > value) noexcept
Inactive destination bytes retain source.
constexpr simd< std::uint8_t, 16, Arch > vpermi2b(simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Permute bytes from two tables with the index vector as the tied destination.
constexpr simd< std::uint8_t, 16, Arch > vpermt2b(simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > b) noexcept
Permute bytes from two tables; the table index spans both complete vectors.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpmultishiftqb(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > control, simd< std::uint64_t, 2, Arch > value) noexcept
Inactive destination bytes become zero.
constexpr simd< std::uint8_t, 16, Arch > mask_vpermt2b(simd< std::uint8_t, 16, Arch > a, predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > b) noexcept
Inactive destination bytes retain the first table a.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpermi2b(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Inactive destination bytes become zero.
constexpr simd< std::uint8_t, 16, Arch > maskz_vpermb(predicate< 16, Arch > mask, simd< std::uint8_t, 16, Arch > indices, simd< std::uint8_t, 16, Arch > value) noexcept
Inactive destination bytes 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.