native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
native.x86.vbmi.ccm
1// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
2module;
3#include "native/isa_import.h"
4#include "native/x86/vbmi.h"
5export module native.x86.vbmi;
6export import native.x86.features;
7export import native.simd;
8// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
9
10#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
11export namespace native {
23
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))
30 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
31 constexpr simd<std::uint8_t, 16, Arch> vpermb(
32 simd<std::uint8_t, 16, Arch> indices,
33 simd<std::uint8_t, 16, Arch> value) noexcept {
34 if consteval {
35 return detail::x86_vbmi_constant::permute<false>(
36 indices, value, simd<std::uint8_t, 16, Arch>{}, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
37 } else {
39 detail::x86_vbmi::vpermb<Arch>(
40 indices.to_native(), value.to_native()));
41 }
42 }
43
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))
50 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
55 simd<std::uint8_t, 16, Arch> value) noexcept {
56 if consteval {
57 return detail::x86_vbmi_constant::permute<false>(
58 indices, value, simd<std::uint8_t, 16, Arch>{}, source, mask.to_bitset());
59 } else {
61 detail::x86_vbmi::mask_vpermb<Arch>(
62 source.to_native(), mask.to_bitset(), indices.to_native(), value.to_native()));
63 }
64 }
65
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))
72 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
76 simd<std::uint8_t, 16, Arch> value) noexcept {
77 if consteval {
78 return detail::x86_vbmi_constant::permute<false>(
79 indices, value, simd<std::uint8_t, 16, Arch>{}, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
80 } else {
82 detail::x86_vbmi::maskz_vpermb<Arch>(
83 mask.to_bitset(), indices.to_native(), value.to_native()));
84 }
85 }
86
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))
93 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
98 if consteval {
99 return detail::x86_vbmi_constant::permute<true>(
100 indices, a, b, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
101 } else {
103 detail::x86_vbmi::vpermt2b<Arch>(
104 a.to_native(), indices.to_native(), b.to_native()));
105 }
106 }
107
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))
114 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
119 simd<std::uint8_t, 16, Arch> b) noexcept {
120 if consteval {
121 return detail::x86_vbmi_constant::permute<true>(
122 indices, a, b, a, mask.to_bitset());
123 } else {
125 detail::x86_vbmi::mask_vpermt2b<Arch>(
126 a.to_native(), mask.to_bitset(), indices.to_native(), b.to_native()));
127 }
128 }
129
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))
136 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
141 simd<std::uint8_t, 16, Arch> b) noexcept {
142 if consteval {
143 return detail::x86_vbmi_constant::permute<true>(
144 indices, a, b, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
145 } else {
147 detail::x86_vbmi::maskz_vpermt2b<Arch>(
148 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
149 }
150 }
151
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))
158 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
162 simd<std::uint8_t, 16, Arch> b) noexcept {
163 if consteval {
164 return detail::x86_vbmi_constant::permute<true>(
165 indices, a, b, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
166 } else {
168 detail::x86_vbmi::vpermi2b<Arch>(
169 indices.to_native(), a.to_native(), b.to_native()));
170 }
171 }
172
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))
179 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
184 simd<std::uint8_t, 16, Arch> b) noexcept {
185 if consteval {
186 return detail::x86_vbmi_constant::permute<true>(
187 indices, a, b, indices, mask.to_bitset());
188 } else {
190 detail::x86_vbmi::mask_vpermi2b<Arch>(
191 indices.to_native(), mask.to_bitset(), a.to_native(), b.to_native()));
192 }
193 }
194
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))
201 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
206 simd<std::uint8_t, 16, Arch> b) noexcept {
207 if consteval {
208 return detail::x86_vbmi_constant::permute<true>(
209 indices, a, b, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
210 } else {
212 detail::x86_vbmi::maskz_vpermi2b<Arch>(
213 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
214 }
215 }
216
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))
223 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
226 simd<std::uint64_t, 2, Arch> value) noexcept {
227 if consteval {
228 return detail::x86_vbmi_constant::multishift(
229 control, value, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
230 } else {
232 detail::x86_vbmi::vpmultishiftqb<Arch>(
233 control.to_native(), value.to_native()));
234 }
235 }
236
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))
243 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
248 simd<std::uint64_t, 2, Arch> value) noexcept {
249 if consteval {
250 return detail::x86_vbmi_constant::multishift(
251 control, value, source, mask.to_bitset());
252 } else {
254 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
255 source.to_native(), mask.to_bitset(), control.to_native(), value.to_native()));
256 }
257 }
258
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))
265 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
269 simd<std::uint64_t, 2, Arch> value) noexcept {
270 if consteval {
271 return detail::x86_vbmi_constant::multishift(
272 control, value, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
273 } else {
275 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
276 mask.to_bitset(), control.to_native(), value.to_native()));
277 }
278 }
279
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))
286 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
289 simd<std::uint8_t, 32, Arch> value) noexcept {
290 if consteval {
291 return detail::x86_vbmi_constant::permute<false>(
292 indices, value, simd<std::uint8_t, 32, Arch>{}, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
293 } else {
295 detail::x86_vbmi::vpermb<Arch>(
296 indices.to_native(), value.to_native()));
297 }
298 }
299
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))
306 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
311 simd<std::uint8_t, 32, Arch> value) noexcept {
312 if consteval {
313 return detail::x86_vbmi_constant::permute<false>(
314 indices, value, simd<std::uint8_t, 32, Arch>{}, source, mask.to_bitset());
315 } else {
317 detail::x86_vbmi::mask_vpermb<Arch>(
318 source.to_native(), mask.to_bitset(), indices.to_native(), value.to_native()));
319 }
320 }
321
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))
328 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
332 simd<std::uint8_t, 32, Arch> value) noexcept {
333 if consteval {
334 return detail::x86_vbmi_constant::permute<false>(
335 indices, value, simd<std::uint8_t, 32, Arch>{}, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
336 } else {
338 detail::x86_vbmi::maskz_vpermb<Arch>(
339 mask.to_bitset(), indices.to_native(), value.to_native()));
340 }
341 }
342
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))
349 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
353 simd<std::uint8_t, 32, Arch> b) noexcept {
354 if consteval {
355 return detail::x86_vbmi_constant::permute<true>(
356 indices, a, b, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
357 } else {
359 detail::x86_vbmi::vpermt2b<Arch>(
360 a.to_native(), indices.to_native(), b.to_native()));
361 }
362 }
363
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))
370 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
375 simd<std::uint8_t, 32, Arch> b) noexcept {
376 if consteval {
377 return detail::x86_vbmi_constant::permute<true>(
378 indices, a, b, a, mask.to_bitset());
379 } else {
381 detail::x86_vbmi::mask_vpermt2b<Arch>(
382 a.to_native(), mask.to_bitset(), indices.to_native(), b.to_native()));
383 }
384 }
385
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))
392 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
397 simd<std::uint8_t, 32, Arch> b) noexcept {
398 if consteval {
399 return detail::x86_vbmi_constant::permute<true>(
400 indices, a, b, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
401 } else {
403 detail::x86_vbmi::maskz_vpermt2b<Arch>(
404 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
405 }
406 }
407
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))
414 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
418 simd<std::uint8_t, 32, Arch> b) noexcept {
419 if consteval {
420 return detail::x86_vbmi_constant::permute<true>(
421 indices, a, b, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
422 } else {
424 detail::x86_vbmi::vpermi2b<Arch>(
425 indices.to_native(), a.to_native(), b.to_native()));
426 }
427 }
428
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))
435 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
440 simd<std::uint8_t, 32, Arch> b) noexcept {
441 if consteval {
442 return detail::x86_vbmi_constant::permute<true>(
443 indices, a, b, indices, mask.to_bitset());
444 } else {
446 detail::x86_vbmi::mask_vpermi2b<Arch>(
447 indices.to_native(), mask.to_bitset(), a.to_native(), b.to_native()));
448 }
449 }
450
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))
457 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
462 simd<std::uint8_t, 32, Arch> b) noexcept {
463 if consteval {
464 return detail::x86_vbmi_constant::permute<true>(
465 indices, a, b, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
466 } else {
468 detail::x86_vbmi::maskz_vpermi2b<Arch>(
469 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
470 }
471 }
472
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))
479 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
482 simd<std::uint64_t, 4, Arch> value) noexcept {
483 if consteval {
484 return detail::x86_vbmi_constant::multishift(
485 control, value, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
486 } else {
488 detail::x86_vbmi::vpmultishiftqb<Arch>(
489 control.to_native(), value.to_native()));
490 }
491 }
492
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))
499 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
504 simd<std::uint64_t, 4, Arch> value) noexcept {
505 if consteval {
506 return detail::x86_vbmi_constant::multishift(
507 control, value, source, mask.to_bitset());
508 } else {
510 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
511 source.to_native(), mask.to_bitset(), control.to_native(), value.to_native()));
512 }
513 }
514
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))
521 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi,avx512vl")
525 simd<std::uint64_t, 4, Arch> value) noexcept {
526 if consteval {
527 return detail::x86_vbmi_constant::multishift(
528 control, value, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
529 } else {
531 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
532 mask.to_bitset(), control.to_native(), value.to_native()));
533 }
534 }
535
537 template<isa<x86> Arch>
538 requires(Arch.has(x86_feature::avx512f) &&
539 Arch.has(x86_feature::avx512bw) &&
540 Arch.has(x86_feature::avx512vbmi))
541 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
544 simd<std::uint8_t, 64, Arch> value) noexcept {
545 if consteval {
546 return detail::x86_vbmi_constant::permute<false>(
547 indices, value, simd<std::uint8_t, 64, Arch>{}, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
548 } else {
550 detail::x86_vbmi::vpermb<Arch>(
551 indices.to_native(), value.to_native()));
552 }
553 }
554
556 template<isa<x86> Arch>
557 requires(Arch.has(x86_feature::avx512f) &&
558 Arch.has(x86_feature::avx512bw) &&
559 Arch.has(x86_feature::avx512vbmi))
560 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
565 simd<std::uint8_t, 64, Arch> value) noexcept {
566 if consteval {
567 return detail::x86_vbmi_constant::permute<false>(
568 indices, value, simd<std::uint8_t, 64, Arch>{}, source, mask.to_bitset());
569 } else {
571 detail::x86_vbmi::mask_vpermb<Arch>(
572 source.to_native(), mask.to_bitset(), indices.to_native(), value.to_native()));
573 }
574 }
575
577 template<isa<x86> Arch>
578 requires(Arch.has(x86_feature::avx512f) &&
579 Arch.has(x86_feature::avx512bw) &&
580 Arch.has(x86_feature::avx512vbmi))
581 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
585 simd<std::uint8_t, 64, Arch> value) noexcept {
586 if consteval {
587 return detail::x86_vbmi_constant::permute<false>(
588 indices, value, simd<std::uint8_t, 64, Arch>{}, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
589 } else {
591 detail::x86_vbmi::maskz_vpermb<Arch>(
592 mask.to_bitset(), indices.to_native(), value.to_native()));
593 }
594 }
595
597 template<isa<x86> Arch>
598 requires(Arch.has(x86_feature::avx512f) &&
599 Arch.has(x86_feature::avx512bw) &&
600 Arch.has(x86_feature::avx512vbmi))
601 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
605 simd<std::uint8_t, 64, Arch> b) noexcept {
606 if consteval {
607 return detail::x86_vbmi_constant::permute<true>(
608 indices, a, b, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
609 } else {
611 detail::x86_vbmi::vpermt2b<Arch>(
612 a.to_native(), indices.to_native(), b.to_native()));
613 }
614 }
615
617 template<isa<x86> Arch>
618 requires(Arch.has(x86_feature::avx512f) &&
619 Arch.has(x86_feature::avx512bw) &&
620 Arch.has(x86_feature::avx512vbmi))
621 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
626 simd<std::uint8_t, 64, Arch> b) noexcept {
627 if consteval {
628 return detail::x86_vbmi_constant::permute<true>(
629 indices, a, b, a, mask.to_bitset());
630 } else {
632 detail::x86_vbmi::mask_vpermt2b<Arch>(
633 a.to_native(), mask.to_bitset(), indices.to_native(), b.to_native()));
634 }
635 }
636
638 template<isa<x86> Arch>
639 requires(Arch.has(x86_feature::avx512f) &&
640 Arch.has(x86_feature::avx512bw) &&
641 Arch.has(x86_feature::avx512vbmi))
642 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
647 simd<std::uint8_t, 64, Arch> b) noexcept {
648 if consteval {
649 return detail::x86_vbmi_constant::permute<true>(
650 indices, a, b, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
651 } else {
653 detail::x86_vbmi::maskz_vpermt2b<Arch>(
654 mask.to_bitset(), a.to_native(), indices.to_native(), b.to_native()));
655 }
656 }
657
659 template<isa<x86> Arch>
660 requires(Arch.has(x86_feature::avx512f) &&
661 Arch.has(x86_feature::avx512bw) &&
662 Arch.has(x86_feature::avx512vbmi))
663 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
667 simd<std::uint8_t, 64, Arch> b) noexcept {
668 if consteval {
669 return detail::x86_vbmi_constant::permute<true>(
670 indices, a, b, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
671 } else {
673 detail::x86_vbmi::vpermi2b<Arch>(
674 indices.to_native(), a.to_native(), b.to_native()));
675 }
676 }
677
679 template<isa<x86> Arch>
680 requires(Arch.has(x86_feature::avx512f) &&
681 Arch.has(x86_feature::avx512bw) &&
682 Arch.has(x86_feature::avx512vbmi))
683 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
688 simd<std::uint8_t, 64, Arch> b) noexcept {
689 if consteval {
690 return detail::x86_vbmi_constant::permute<true>(
691 indices, a, b, indices, mask.to_bitset());
692 } else {
694 detail::x86_vbmi::mask_vpermi2b<Arch>(
695 indices.to_native(), mask.to_bitset(), a.to_native(), b.to_native()));
696 }
697 }
698
700 template<isa<x86> Arch>
701 requires(Arch.has(x86_feature::avx512f) &&
702 Arch.has(x86_feature::avx512bw) &&
703 Arch.has(x86_feature::avx512vbmi))
704 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
709 simd<std::uint8_t, 64, Arch> b) noexcept {
710 if consteval {
711 return detail::x86_vbmi_constant::permute<true>(
712 indices, a, b, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
713 } else {
715 detail::x86_vbmi::maskz_vpermi2b<Arch>(
716 mask.to_bitset(), indices.to_native(), a.to_native(), b.to_native()));
717 }
718 }
719
721 template<isa<x86> Arch>
722 requires(Arch.has(x86_feature::avx512f) &&
723 Arch.has(x86_feature::avx512bw) &&
724 Arch.has(x86_feature::avx512vbmi))
725 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
728 simd<std::uint64_t, 8, Arch> value) noexcept {
729 if consteval {
730 return detail::x86_vbmi_constant::multishift(
731 control, value, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
732 } else {
734 detail::x86_vbmi::vpmultishiftqb<Arch>(
735 control.to_native(), value.to_native()));
736 }
737 }
738
740 template<isa<x86> Arch>
741 requires(Arch.has(x86_feature::avx512f) &&
742 Arch.has(x86_feature::avx512bw) &&
743 Arch.has(x86_feature::avx512vbmi))
744 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
749 simd<std::uint64_t, 8, Arch> value) noexcept {
750 if consteval {
751 return detail::x86_vbmi_constant::multishift(
752 control, value, source, mask.to_bitset());
753 } else {
755 detail::x86_vbmi::mask_vpmultishiftqb<Arch>(
756 source.to_native(), mask.to_bitset(), control.to_native(), value.to_native()));
757 }
758 }
759
761 template<isa<x86> Arch>
762 requires(Arch.has(x86_feature::avx512f) &&
763 Arch.has(x86_feature::avx512bw) &&
764 Arch.has(x86_feature::avx512vbmi))
765 native_nodiscard native_inline native_const native_target("avx512f,avx512bw,avx512vbmi")
769 simd<std::uint64_t, 8, Arch> value) noexcept {
770 if consteval {
771 return detail::x86_vbmi_constant::multishift(
772 control, value, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
773 } else {
775 detail::x86_vbmi::maskz_vpmultishiftqb<Arch>(
776 mask.to_bitset(), control.to_native(), value.to_native()));
777 }
778 }
779
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>); })
789 simd<std::uint8_t, 16, Arch> value) noexcept {
790 return detail::x86_vbmi_constant::permute<false>(
791 indices, value, simd<std::uint8_t, 16, Arch>{}, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
792 }
793
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>); })
805 simd<std::uint8_t, 16, Arch> value) noexcept {
806 return detail::x86_vbmi_constant::permute<false>(
807 indices, value, simd<std::uint8_t, 16, Arch>{}, source, mask.to_bitset());
808 }
809
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>); })
820 simd<std::uint8_t, 16, Arch> value) noexcept {
821 return detail::x86_vbmi_constant::permute<false>(
822 indices, value, simd<std::uint8_t, 16, Arch>{}, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
823 }
824
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>); })
835 simd<std::uint8_t, 16, Arch> b) noexcept {
836 return detail::x86_vbmi_constant::permute<true>(
837 indices, a, b, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
838 }
839
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>); })
851 simd<std::uint8_t, 16, Arch> b) noexcept {
852 return detail::x86_vbmi_constant::permute<true>(
853 indices, a, b, a, mask.to_bitset());
854 }
855
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>); })
867 simd<std::uint8_t, 16, Arch> b) noexcept {
868 return detail::x86_vbmi_constant::permute<true>(
869 indices, a, b, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
870 }
871
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>); })
882 simd<std::uint8_t, 16, Arch> b) noexcept {
883 return detail::x86_vbmi_constant::permute<true>(
884 indices, a, b, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
885 }
886
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>); })
898 simd<std::uint8_t, 16, Arch> b) noexcept {
899 return detail::x86_vbmi_constant::permute<true>(
900 indices, a, b, indices, mask.to_bitset());
901 }
902
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>); })
914 simd<std::uint8_t, 16, Arch> b) noexcept {
915 return detail::x86_vbmi_constant::permute<true>(
916 indices, a, b, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
917 }
918
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>); })
928 simd<std::uint64_t, 2, Arch> value) noexcept {
929 return detail::x86_vbmi_constant::multishift(
930 control, value, simd<std::uint8_t, 16, Arch>{}, ~std::uint64_t{0});
931 }
932
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>); })
944 simd<std::uint64_t, 2, Arch> value) noexcept {
945 return detail::x86_vbmi_constant::multishift(
946 control, value, source, mask.to_bitset());
947 }
948
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>); })
959 simd<std::uint64_t, 2, Arch> value) noexcept {
960 return detail::x86_vbmi_constant::multishift(
961 control, value, simd<std::uint8_t, 16, Arch>{}, mask.to_bitset());
962 }
963
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>); })
973 simd<std::uint8_t, 32, Arch> value) noexcept {
974 return detail::x86_vbmi_constant::permute<false>(
975 indices, value, simd<std::uint8_t, 32, Arch>{}, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
976 }
977
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>); })
989 simd<std::uint8_t, 32, Arch> value) noexcept {
990 return detail::x86_vbmi_constant::permute<false>(
991 indices, value, simd<std::uint8_t, 32, Arch>{}, source, mask.to_bitset());
992 }
993
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>); })
1004 simd<std::uint8_t, 32, Arch> value) noexcept {
1005 return detail::x86_vbmi_constant::permute<false>(
1006 indices, value, simd<std::uint8_t, 32, Arch>{}, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
1007 }
1008
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>); })
1019 simd<std::uint8_t, 32, Arch> b) noexcept {
1020 return detail::x86_vbmi_constant::permute<true>(
1021 indices, a, b, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
1022 }
1023
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>); })
1035 simd<std::uint8_t, 32, Arch> b) noexcept {
1036 return detail::x86_vbmi_constant::permute<true>(
1037 indices, a, b, a, mask.to_bitset());
1038 }
1039
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>); })
1051 simd<std::uint8_t, 32, Arch> b) noexcept {
1052 return detail::x86_vbmi_constant::permute<true>(
1053 indices, a, b, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
1054 }
1055
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>); })
1066 simd<std::uint8_t, 32, Arch> b) noexcept {
1067 return detail::x86_vbmi_constant::permute<true>(
1068 indices, a, b, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
1069 }
1070
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>); })
1082 simd<std::uint8_t, 32, Arch> b) noexcept {
1083 return detail::x86_vbmi_constant::permute<true>(
1084 indices, a, b, indices, mask.to_bitset());
1085 }
1086
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>); })
1098 simd<std::uint8_t, 32, Arch> b) noexcept {
1099 return detail::x86_vbmi_constant::permute<true>(
1100 indices, a, b, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
1101 }
1102
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>); })
1112 simd<std::uint64_t, 4, Arch> value) noexcept {
1113 return detail::x86_vbmi_constant::multishift(
1114 control, value, simd<std::uint8_t, 32, Arch>{}, ~std::uint64_t{0});
1115 }
1116
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>); })
1128 simd<std::uint64_t, 4, Arch> value) noexcept {
1129 return detail::x86_vbmi_constant::multishift(
1130 control, value, source, mask.to_bitset());
1131 }
1132
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>); })
1143 simd<std::uint64_t, 4, Arch> value) noexcept {
1144 return detail::x86_vbmi_constant::multishift(
1145 control, value, simd<std::uint8_t, 32, Arch>{}, mask.to_bitset());
1146 }
1147
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>); })
1156 simd<std::uint8_t, 64, Arch> value) noexcept {
1157 return detail::x86_vbmi_constant::permute<false>(
1158 indices, value, simd<std::uint8_t, 64, Arch>{}, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
1159 }
1160
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>); })
1171 simd<std::uint8_t, 64, Arch> value) noexcept {
1172 return detail::x86_vbmi_constant::permute<false>(
1173 indices, value, simd<std::uint8_t, 64, Arch>{}, source, mask.to_bitset());
1174 }
1175
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>); })
1185 simd<std::uint8_t, 64, Arch> value) noexcept {
1186 return detail::x86_vbmi_constant::permute<false>(
1187 indices, value, simd<std::uint8_t, 64, Arch>{}, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
1188 }
1189
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>); })
1199 simd<std::uint8_t, 64, Arch> b) noexcept {
1200 return detail::x86_vbmi_constant::permute<true>(
1201 indices, a, b, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
1202 }
1203
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>); })
1214 simd<std::uint8_t, 64, Arch> b) noexcept {
1215 return detail::x86_vbmi_constant::permute<true>(
1216 indices, a, b, a, mask.to_bitset());
1217 }
1218
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>); })
1229 simd<std::uint8_t, 64, Arch> b) noexcept {
1230 return detail::x86_vbmi_constant::permute<true>(
1231 indices, a, b, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
1232 }
1233
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>); })
1243 simd<std::uint8_t, 64, Arch> b) noexcept {
1244 return detail::x86_vbmi_constant::permute<true>(
1245 indices, a, b, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
1246 }
1247
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>); })
1258 simd<std::uint8_t, 64, Arch> b) noexcept {
1259 return detail::x86_vbmi_constant::permute<true>(
1260 indices, a, b, indices, mask.to_bitset());
1261 }
1262
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>); })
1273 simd<std::uint8_t, 64, Arch> b) noexcept {
1274 return detail::x86_vbmi_constant::permute<true>(
1275 indices, a, b, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
1276 }
1277
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>); })
1286 simd<std::uint64_t, 8, Arch> value) noexcept {
1287 return detail::x86_vbmi_constant::multishift(
1288 control, value, simd<std::uint8_t, 64, Arch>{}, ~std::uint64_t{0});
1289 }
1290
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>); })
1301 simd<std::uint64_t, 8, Arch> value) noexcept {
1302 return detail::x86_vbmi_constant::multishift(
1303 control, value, source, mask.to_bitset());
1304 }
1305
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>); })
1315 simd<std::uint64_t, 8, Arch> value) noexcept {
1316 return detail::x86_vbmi_constant::multishift(
1317 control, value, simd<std::uint8_t, 64, Arch>{}, mask.to_bitset());
1318 }
1319
1321 template<isa<x86> Arch, class... Args>
1322 void vpermb(Args...) = delete;
1323
1325 template<isa<x86> Arch, class... Args>
1326 void mask_vpermb(Args...) = delete;
1327
1329 template<isa<x86> Arch, class... Args>
1330 void maskz_vpermb(Args...) = delete;
1331
1333 template<isa<x86> Arch, class... Args>
1334 void vpermt2b(Args...) = delete;
1335
1337 template<isa<x86> Arch, class... Args>
1338 void mask_vpermt2b(Args...) = delete;
1339
1341 template<isa<x86> Arch, class... Args>
1342 void maskz_vpermt2b(Args...) = delete;
1343
1345 template<isa<x86> Arch, class... Args>
1346 void vpermi2b(Args...) = delete;
1347
1349 template<isa<x86> Arch, class... Args>
1350 void mask_vpermi2b(Args...) = delete;
1351
1353 template<isa<x86> Arch, class... Args>
1354 void maskz_vpermi2b(Args...) = delete;
1355
1357 template<isa<x86> Arch, class... Args>
1358 void vpmultishiftqb(Args...) = delete;
1359
1361 template<isa<x86> Arch, class... Args>
1362 void mask_vpmultishiftqb(Args...) = delete;
1363
1365 template<isa<x86> Arch, class... Args>
1366 void maskz_vpmultishiftqb(Args...) = delete;
1367
1369}
1370#endif
#define native_inline
inline [[always_inline]]
Definition attributes.h:212
#define native_nodiscard
C++17 [[nodiscard]].
Definition attributes.h:189
#define native_const
[[const]] is not const
Definition attributes.h:108
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
Definition attributes.h:476
typename mask_traits< std::remove_cvref_t< T > >::type mask
Definition mask_traits.h:22
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.