3#include "native/isa_import.h"
4#include "native/x86/vnni.h"
5#include "native/x86/integer_constant.h"
10#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
40 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
42 constexpr
simd<
std::int32_t, 4, Arch>
dpbusd(
simd<
std::int32_t, 4, Arch> accumulator,
simd<
std::uint8_t, 16, Arch> a,
simd<
std::int8_t, 16, Arch> b) noexcept {
43 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
50 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
51 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
53 constexpr simd<std::int32_t, 4, Arch> dpbusd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
54 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
61 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
62 Arch.has(x86_feature::avx512vl))
64 constexpr simd<std::int32_t, 4, Arch> mask_dpbusd(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
65 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
72 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
73 Arch.has(x86_feature::avx512vl))
75 constexpr simd<std::int32_t, 4, Arch> maskz_dpbusd(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
76 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
83 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
85 constexpr simd<std::int32_t, 4, Arch> dpbusds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
86 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
93 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
94 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
96 constexpr simd<std::int32_t, 4, Arch> dpbusds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
97 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
104 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
105 Arch.has(x86_feature::avx512vl))
107 constexpr simd<std::int32_t, 4, Arch> mask_dpbusds(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
108 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
115 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
116 Arch.has(x86_feature::avx512vl))
118 constexpr simd<std::int32_t, 4, Arch> maskz_dpbusds(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
119 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
126 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
128 constexpr simd<std::int32_t, 4, Arch> dpwssd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
129 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
136 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
137 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
139 constexpr simd<std::int32_t, 4, Arch> dpwssd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
140 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
147 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
148 Arch.has(x86_feature::avx512vl))
150 constexpr simd<std::int32_t, 4, Arch> mask_dpwssd(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
151 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
158 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
159 Arch.has(x86_feature::avx512vl))
161 constexpr simd<std::int32_t, 4, Arch> maskz_dpwssd(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
162 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
169 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
171 constexpr simd<std::int32_t, 4, Arch> dpwssds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
172 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
179 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
180 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
182 constexpr simd<std::int32_t, 4, Arch> dpwssds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
183 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
190 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
191 Arch.has(x86_feature::avx512vl))
193 constexpr simd<std::int32_t, 4, Arch> mask_dpwssds(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
194 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
201 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
202 Arch.has(x86_feature::avx512vl))
204 constexpr simd<std::int32_t, 4, Arch> maskz_dpwssds(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
205 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
213 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
215 constexpr simd<std::int32_t, 8, Arch> dpbusd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
216 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
223 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
224 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
226 constexpr simd<std::int32_t, 8, Arch> dpbusd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
227 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
234 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
235 Arch.has(x86_feature::avx512vl))
237 constexpr simd<std::int32_t, 8, Arch> mask_dpbusd(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
238 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
245 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
246 Arch.has(x86_feature::avx512vl))
248 constexpr simd<std::int32_t, 8, Arch> maskz_dpbusd(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
249 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
256 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
258 constexpr simd<std::int32_t, 8, Arch> dpbusds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
259 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
266 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
267 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
269 constexpr simd<std::int32_t, 8, Arch> dpbusds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
270 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
277 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
278 Arch.has(x86_feature::avx512vl))
280 constexpr simd<std::int32_t, 8, Arch> mask_dpbusds(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
281 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
288 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
289 Arch.has(x86_feature::avx512vl))
291 constexpr simd<std::int32_t, 8, Arch> maskz_dpbusds(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
292 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
299 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
301 constexpr simd<std::int32_t, 8, Arch> dpwssd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
302 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
309 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
310 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
312 constexpr simd<std::int32_t, 8, Arch> dpwssd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
313 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
320 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
321 Arch.has(x86_feature::avx512vl))
323 constexpr simd<std::int32_t, 8, Arch> mask_dpwssd(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
324 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
331 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
332 Arch.has(x86_feature::avx512vl))
334 constexpr simd<std::int32_t, 8, Arch> maskz_dpwssd(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
335 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
342 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnni))
344 constexpr simd<std::int32_t, 8, Arch> dpwssds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
345 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
352 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::avxvnni) &&
353 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))
355 constexpr simd<std::int32_t, 8, Arch> dpwssds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
356 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
363 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
364 Arch.has(x86_feature::avx512vl))
366 constexpr simd<std::int32_t, 8, Arch> mask_dpwssds(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
367 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
374 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
375 Arch.has(x86_feature::avx512vl))
377 constexpr simd<std::int32_t, 8, Arch> maskz_dpwssds(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
378 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
386 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
388 constexpr simd<std::int32_t, 16, Arch> dpbusd(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
389 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
396 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
398 constexpr simd<std::int32_t, 16, Arch> mask_dpbusd(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
399 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
406 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
408 constexpr simd<std::int32_t, 16, Arch> maskz_dpbusd(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
409 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
416 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
418 constexpr simd<std::int32_t, 16, Arch> dpbusds(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
419 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
426 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
428 constexpr simd<std::int32_t, 16, Arch> mask_dpbusds(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
429 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
436 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
438 constexpr simd<std::int32_t, 16, Arch> maskz_dpbusds(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
439 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
446 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
448 constexpr simd<std::int32_t, 16, Arch> dpwssd(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
449 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
456 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
458 constexpr simd<std::int32_t, 16, Arch> mask_dpwssd(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
459 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false); }
466 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
468 constexpr simd<std::int32_t, 16, Arch> maskz_dpwssd(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
469 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true); }
476 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
478 constexpr simd<std::int32_t, 16, Arch> dpwssds(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
479 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
486 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
488 constexpr simd<std::int32_t, 16, Arch> mask_dpwssds(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
489 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false); }
496 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))
498 constexpr simd<std::int32_t, 16, Arch> maskz_dpwssds(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
499 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true); }
506 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
508 constexpr simd<std::int32_t, 4, Arch> dpbssd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
509 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
516 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
518 constexpr simd<std::int32_t, 8, Arch> dpbssd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
519 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
526 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
528 constexpr simd<std::int32_t, 4, Arch> dpbssds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
529 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
536 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
538 constexpr simd<std::int32_t, 8, Arch> dpbssds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
539 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
546 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
548 constexpr simd<std::int32_t, 4, Arch> dpbsud(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
549 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
556 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
558 constexpr simd<std::int32_t, 8, Arch> dpbsud(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
559 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
566 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
568 constexpr simd<std::int32_t, 4, Arch> dpbsuds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
569 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
576 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
578 constexpr simd<std::int32_t, 8, Arch> dpbsuds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
579 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
586 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
588 constexpr simd<std::uint32_t, 4, Arch> dpbuud(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
589 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
596 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
598 constexpr simd<std::uint32_t, 8, Arch> dpbuud(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
599 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
606 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
608 constexpr simd<std::uint32_t, 4, Arch> dpbuuds(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
609 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
616 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint8))
618 constexpr simd<std::uint32_t, 8, Arch> dpbuuds(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
619 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
626 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
628 constexpr simd<std::int32_t, 4, Arch> dpwsud(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
629 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
636 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
638 constexpr simd<std::int32_t, 8, Arch> dpwsud(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
639 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
646 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
648 constexpr simd<std::int32_t, 4, Arch> dpwsuds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
649 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
656 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
658 constexpr simd<std::int32_t, 8, Arch> dpwsuds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
659 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
666 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
668 constexpr simd<std::int32_t, 4, Arch> dpwusd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
669 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
676 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
678 constexpr simd<std::int32_t, 8, Arch> dpwusd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
679 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
686 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
688 constexpr simd<std::int32_t, 4, Arch> dpwusds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
689 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
696 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
698 constexpr simd<std::int32_t, 8, Arch> dpwusds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
699 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
706 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
708 constexpr simd<std::uint32_t, 4, Arch> dpwuud(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
709 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
716 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
718 constexpr simd<std::uint32_t, 8, Arch> dpwuud(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
719 if consteval {
return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false); }
726 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
728 constexpr simd<std::uint32_t, 4, Arch> dpwuuds(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
729 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
736 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxvnniint16))
738 constexpr simd<std::uint32_t, 8, Arch> dpwuuds(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
739 if consteval {
return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false); }
746 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
747 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
748 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
749 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbusd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
750 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
754 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
755 Arch.has(x86_feature::avx512vl))) &&
756 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
757 native_nodiscard consteval simd<std::int32_t, 4, Arch> mask_dpbusd(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
758 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
762 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
763 Arch.has(x86_feature::avx512vl))) &&
764 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
765 native_nodiscard consteval simd<std::int32_t, 4, Arch> maskz_dpbusd(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
766 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
770 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
771 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
772 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
773 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbusds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
774 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
778 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
779 Arch.has(x86_feature::avx512vl))) &&
780 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
781 native_nodiscard consteval simd<std::int32_t, 4, Arch> mask_dpbusds(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
782 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
786 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
787 Arch.has(x86_feature::avx512vl))) &&
788 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::uint8_t, 16, Arch>); sizeof(simd<std::int8_t, 16, Arch>); })
789 native_nodiscard consteval simd<std::int32_t, 4, Arch> maskz_dpbusds(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
790 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
794 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
795 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
796 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
797 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwssd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
798 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
802 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
803 Arch.has(x86_feature::avx512vl))) &&
804 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
805 native_nodiscard consteval simd<std::int32_t, 4, Arch> mask_dpwssd(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
806 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
810 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
811 Arch.has(x86_feature::avx512vl))) &&
812 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
813 native_nodiscard consteval simd<std::int32_t, 4, Arch> maskz_dpwssd(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
814 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
818 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
819 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
820 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
821 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwssds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
822 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
826 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
827 Arch.has(x86_feature::avx512vl))) &&
828 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
829 native_nodiscard consteval simd<std::int32_t, 4, Arch> mask_dpwssds(
simd<std::int32_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
830 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
834 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
835 Arch.has(x86_feature::avx512vl))) &&
836 requires { sizeof(simd<std::int32_t, 4, Arch>); sizeof(simd<std::int16_t, 8, Arch>); })
837 native_nodiscard consteval simd<std::int32_t, 4, Arch> maskz_dpwssds(
predicate<4, Arch> mask,
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
838 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
842 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
843 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
844 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
845 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbusd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
846 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
850 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
851 Arch.has(x86_feature::avx512vl))) &&
852 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
853 native_nodiscard consteval simd<std::int32_t, 8, Arch> mask_dpbusd(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
854 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
858 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
859 Arch.has(x86_feature::avx512vl))) &&
860 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
861 native_nodiscard consteval simd<std::int32_t, 8, Arch> maskz_dpbusd(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
862 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
866 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
867 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
868 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
869 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbusds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
870 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
874 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
875 Arch.has(x86_feature::avx512vl))) &&
876 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
877 native_nodiscard consteval simd<std::int32_t, 8, Arch> mask_dpbusds(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
878 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
882 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
883 Arch.has(x86_feature::avx512vl))) &&
884 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::uint8_t, 32, Arch>); sizeof(simd<std::int8_t, 32, Arch>); })
885 native_nodiscard consteval simd<std::int32_t, 8, Arch> maskz_dpbusds(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
886 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
890 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
891 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
892 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
893 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwssd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
894 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
898 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
899 Arch.has(x86_feature::avx512vl))) &&
900 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
901 native_nodiscard consteval simd<std::int32_t, 8, Arch> mask_dpwssd(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
902 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
906 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
907 Arch.has(x86_feature::avx512vl))) &&
908 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
909 native_nodiscard consteval simd<std::int32_t, 8, Arch> maskz_dpwssd(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
910 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
914 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnni)) || (!Arch.has(x86_feature::avxvnni) &&
915 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) && Arch.has(x86_feature::avx512vl))) &&
916 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
917 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwssds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
918 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
922 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
923 Arch.has(x86_feature::avx512vl))) &&
924 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
925 native_nodiscard consteval simd<std::int32_t, 8, Arch> mask_dpwssds(
simd<std::int32_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
926 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
930 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni) &&
931 Arch.has(x86_feature::avx512vl))) &&
932 requires { sizeof(simd<std::int32_t, 8, Arch>); sizeof(simd<std::int16_t, 16, Arch>); })
933 native_nodiscard consteval simd<std::int32_t, 8, Arch> maskz_dpwssds(
predicate<8, Arch> mask,
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
934 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
938 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
939 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
940 native_nodiscard consteval simd<std::int32_t, 16, Arch> dpbusd(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
941 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
945 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
946 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
947 native_nodiscard consteval simd<std::int32_t, 16, Arch> mask_dpbusd(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
948 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
952 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
953 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
954 native_nodiscard consteval simd<std::int32_t, 16, Arch> maskz_dpbusd(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
955 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
959 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
960 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
961 native_nodiscard consteval simd<std::int32_t, 16, Arch> dpbusds(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
962 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
966 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
967 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
968 native_nodiscard consteval simd<std::int32_t, 16, Arch> mask_dpbusds(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
969 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
973 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
974 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::uint8_t, 64, Arch>); sizeof(simd<std::int8_t, 64, Arch>); })
975 native_nodiscard consteval simd<std::int32_t, 16, Arch> maskz_dpbusds(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::uint8_t, 64, Arch> a,
simd<std::int8_t, 64, Arch> b)
noexcept {
976 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
980 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
981 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
982 native_nodiscard consteval simd<std::int32_t, 16, Arch> dpwssd(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
983 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
987 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
988 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
989 native_nodiscard consteval simd<std::int32_t, 16, Arch> mask_dpwssd(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
990 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
false);
994 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
995 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
996 native_nodiscard consteval simd<std::int32_t, 16, Arch> maskz_dpwssd(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
997 return detail::x86_instruction_constant::dot<false>(accumulator, a, b,
mask.to_bitset(),
true);
1001 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
1002 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
1003 native_nodiscard consteval simd<std::int32_t, 16, Arch> dpwssds(
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
1004 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1008 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
1009 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
1010 native_nodiscard consteval simd<std::int32_t, 16, Arch> mask_dpwssds(
simd<std::int32_t, 16, Arch> accumulator,
predicate<16, Arch> mask,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
1011 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
false);
1015 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vnni))) &&
1016 requires { sizeof(simd<std::int32_t, 16, Arch>); sizeof(simd<std::int16_t, 32, Arch>); })
1017 native_nodiscard consteval simd<std::int32_t, 16, Arch> maskz_dpwssds(
predicate<16, Arch> mask,
simd<std::int32_t, 16, Arch> accumulator,
simd<std::int16_t, 32, Arch> a,
simd<std::int16_t, 32, Arch> b)
noexcept {
1018 return detail::x86_instruction_constant::dot<true>(accumulator, a, b,
mask.to_bitset(),
true);
1022 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1023 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int8_t, 16, Arch>); })
1024 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbssd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
1025 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1029 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1030 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int8_t, 32, Arch>); })
1031 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbssd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
1032 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1036 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1037 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int8_t, 16, Arch>); })
1038 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbssds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::int8_t, 16, Arch> b)
noexcept {
1039 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1043 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1044 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int8_t, 32, Arch>); })
1045 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbssds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::int8_t, 32, Arch> b)
noexcept {
1046 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1050 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1051 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int8_t, 16, Arch>);
sizeof(simd<std::uint8_t, 16, Arch>); })
1052 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbsud(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
1053 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1057 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1058 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int8_t, 32, Arch>);
sizeof(simd<std::uint8_t, 32, Arch>); })
1059 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbsud(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
1060 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1064 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1065 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int8_t, 16, Arch>);
sizeof(simd<std::uint8_t, 16, Arch>); })
1066 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpbsuds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
1067 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1071 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1072 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int8_t, 32, Arch>);
sizeof(simd<std::uint8_t, 32, Arch>); })
1073 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpbsuds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
1074 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1078 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1079 requires {
sizeof(simd<std::uint32_t, 4, Arch>);
sizeof(simd<std::uint8_t, 16, Arch>); })
1080 native_nodiscard consteval simd<std::uint32_t, 4, Arch> dpbuud(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
1081 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1085 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1086 requires {
sizeof(simd<std::uint32_t, 8, Arch>);
sizeof(simd<std::uint8_t, 32, Arch>); })
1087 native_nodiscard consteval simd<std::uint32_t, 8, Arch> dpbuud(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
1088 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1092 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1093 requires {
sizeof(simd<std::uint32_t, 4, Arch>);
sizeof(simd<std::uint8_t, 16, Arch>); })
1094 native_nodiscard consteval simd<std::uint32_t, 4, Arch> dpbuuds(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint8_t, 16, Arch> a,
simd<std::uint8_t, 16, Arch> b)
noexcept {
1095 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1099 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint8))) &&
1100 requires {
sizeof(simd<std::uint32_t, 8, Arch>);
sizeof(simd<std::uint8_t, 32, Arch>); })
1101 native_nodiscard consteval simd<std::uint32_t, 8, Arch> dpbuuds(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint8_t, 32, Arch> a,
simd<std::uint8_t, 32, Arch> b)
noexcept {
1102 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1106 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1107 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int16_t, 8, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>); })
1108 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwsud(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
1109 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1113 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1114 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int16_t, 16, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>); })
1115 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwsud(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
1116 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1120 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1121 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::int16_t, 8, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>); })
1122 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwsuds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::int16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
1123 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1127 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1128 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::int16_t, 16, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>); })
1129 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwsuds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::int16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
1130 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1134 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1135 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>);
sizeof(simd<std::int16_t, 8, Arch>); })
1136 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwusd(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
1137 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1141 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1142 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>);
sizeof(simd<std::int16_t, 16, Arch>); })
1143 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwusd(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
1144 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1148 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1149 requires {
sizeof(simd<std::int32_t, 4, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>);
sizeof(simd<std::int16_t, 8, Arch>); })
1150 native_nodiscard consteval simd<std::int32_t, 4, Arch> dpwusds(
simd<std::int32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::int16_t, 8, Arch> b)
noexcept {
1151 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1155 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1156 requires {
sizeof(simd<std::int32_t, 8, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>);
sizeof(simd<std::int16_t, 16, Arch>); })
1157 native_nodiscard consteval simd<std::int32_t, 8, Arch> dpwusds(
simd<std::int32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::int16_t, 16, Arch> b)
noexcept {
1158 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1162 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1163 requires {
sizeof(simd<std::uint32_t, 4, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>); })
1164 native_nodiscard consteval simd<std::uint32_t, 4, Arch> dpwuud(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
1165 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1169 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1170 requires {
sizeof(simd<std::uint32_t, 8, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>); })
1171 native_nodiscard consteval simd<std::uint32_t, 8, Arch> dpwuud(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
1172 return detail::x86_instruction_constant::dot<false>(accumulator, a, b, ~std::uint64_t{0},
false);
1176 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1177 requires {
sizeof(simd<std::uint32_t, 4, Arch>);
sizeof(simd<std::uint16_t, 8, Arch>); })
1178 native_nodiscard consteval simd<std::uint32_t, 4, Arch> dpwuuds(
simd<std::uint32_t, 4, Arch> accumulator,
simd<std::uint16_t, 8, Arch> a,
simd<std::uint16_t, 8, Arch> b)
noexcept {
1179 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1183 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxvnniint16))) &&
1184 requires {
sizeof(simd<std::uint32_t, 8, Arch>);
sizeof(simd<std::uint16_t, 16, Arch>); })
1185 native_nodiscard consteval simd<std::uint32_t, 8, Arch> dpwuuds(
simd<std::uint32_t, 8, Arch> accumulator,
simd<std::uint16_t, 16, Arch> a,
simd<std::uint16_t, 16, Arch> b)
noexcept {
1186 return detail::x86_instruction_constant::dot<true>(accumulator, a, b, ~std::uint64_t{0},
false);
1191 template<isa<x86> Arch,
class... Args>
1194 template<isa<x86> Arch,
class... Args>
1197 template<isa<x86> Arch,
class... Args>
1200 template<isa<x86> Arch,
class... Args>
1203 template<isa<x86> Arch,
class... Args>
1206 template<isa<x86> Arch,
class... Args>
1209 template<isa<x86> Arch,
class... Args>
1212 template<isa<x86> Arch,
class... Args>
1215 template<isa<x86> Arch,
class... Args>
1218 template<isa<x86> Arch,
class... Args>
1221 template<isa<x86> Arch,
class... Args>
1224 template<isa<x86> Arch,
class... Args>
1227 template<isa<x86> Arch,
class... Args>
1230 template<isa<x86> Arch,
class... Args>
1233 template<isa<x86> Arch,
class... Args>
1236 template<isa<x86> Arch,
class... Args>
1239 template<isa<x86> Arch,
class... Args>
1242 template<isa<x86> Arch,
class... Args>
1245 template<isa<x86> Arch,
class... Args>
1248 template<isa<x86> Arch,
class... Args>
1251 template<isa<x86> Arch,
class... Args>
1254 template<isa<x86> Arch,
class... Args>
1257 template<isa<x86> Arch,
class... Args>
1260 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::int32_t, 4, Arch > maskz_dpbusds(predicate< 4, Arch > mask, simd< std::int32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
dpbusds in active lanes; inactive lanes become zero.
constexpr simd< std::int32_t, 4, Arch > dpwssds(simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
Accumulate products of two signed words from a and b, with signed 32-bit saturation....
constexpr simd< std::uint32_t, 4, Arch > dpwuud(simd< std::uint32_t, 4, Arch > accumulator, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Accumulate products of two unsigned words from a and b, modulo 2^32.
constexpr simd< std::int32_t, 4, Arch > mask_dpbusd(simd< std::int32_t, 4, Arch > accumulator, predicate< 4, Arch > mask, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
dpbusd in active lanes; inactive lanes retain accumulator.
constexpr simd< std::int32_t, 4, Arch > mask_dpbusds(simd< std::int32_t, 4, Arch > accumulator, predicate< 4, Arch > mask, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
dpbusds in active lanes; inactive lanes retain accumulator.
constexpr simd< std::int32_t, 4, Arch > dpbssd(simd< std::int32_t, 4, Arch > accumulator, simd< std::int8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Accumulate products of four signed bytes from a and b, modulo 2^32.
constexpr simd< std::int32_t, 4, Arch > mask_dpwssds(simd< std::int32_t, 4, Arch > accumulator, predicate< 4, Arch > mask, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
dpwssds in active lanes; inactive lanes retain accumulator.
constexpr simd< std::int32_t, 4, Arch > dpbusds(simd< std::int32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Accumulate products of four unsigned bytes from a and signed bytes from b, with signed 32-bit saturat...
constexpr simd< std::int32_t, 4, Arch > dpbsuds(simd< std::int32_t, 4, Arch > accumulator, simd< std::int8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Accumulate products of four signed bytes from a and unsigned bytes from b, with signed 32-bit saturat...
constexpr simd< std::int32_t, 4, Arch > dpwssd(simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
Accumulate products of two signed words from a and b, modulo 2^32. Uses AVX-VNNI.
constexpr simd< std::int32_t, 4, Arch > dpbusd(simd< std::int32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Accumulate products of four unsigned bytes from a and signed bytes from b, modulo 2^32....
constexpr simd< std::int32_t, 4, Arch > mask_dpwssd(simd< std::int32_t, 4, Arch > accumulator, predicate< 4, Arch > mask, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
dpwssd in active lanes; inactive lanes retain accumulator.
constexpr simd< std::int32_t, 4, Arch > dpwsuds(simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Accumulate products of two signed words from a and unsigned words from b, with signed 32-bit saturati...
constexpr simd< std::int32_t, 4, Arch > maskz_dpwssds(predicate< 4, Arch > mask, simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
dpwssds in active lanes; inactive lanes become zero.
constexpr simd< std::int32_t, 4, Arch > dpwusds(simd< std::int32_t, 4, Arch > accumulator, simd< std::uint16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
Accumulate products of two unsigned words from a and signed words from b, with signed 32-bit saturati...
constexpr simd< std::uint32_t, 4, Arch > dpwuuds(simd< std::uint32_t, 4, Arch > accumulator, simd< std::uint16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Accumulate products of two unsigned words from a and b, with unsigned 32-bit saturation.
constexpr simd< std::uint32_t, 4, Arch > dpbuuds(simd< std::uint32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Accumulate products of four unsigned bytes from a and b, with unsigned 32-bit saturation.
constexpr simd< std::int32_t, 4, Arch > dpbssds(simd< std::int32_t, 4, Arch > accumulator, simd< std::int8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
Accumulate products of four signed bytes from a and b, with signed 32-bit saturation.
constexpr simd< std::int32_t, 4, Arch > maskz_dpwssd(predicate< 4, Arch > mask, simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
dpwssd in active lanes; inactive lanes become zero.
constexpr simd< std::uint32_t, 4, Arch > dpbuud(simd< std::uint32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Accumulate products of four unsigned bytes from a and b, modulo 2^32.
constexpr simd< std::int32_t, 4, Arch > dpwusd(simd< std::int32_t, 4, Arch > accumulator, simd< std::uint16_t, 8, Arch > a, simd< std::int16_t, 8, Arch > b) noexcept
Accumulate products of two unsigned words from a and signed words from b, modulo 2^32.
constexpr simd< std::int32_t, 4, Arch > dpwsud(simd< std::int32_t, 4, Arch > accumulator, simd< std::int16_t, 8, Arch > a, simd< std::uint16_t, 8, Arch > b) noexcept
Accumulate products of two signed words from a and unsigned words from b, modulo 2^32.
constexpr simd< std::int32_t, 4, Arch > maskz_dpbusd(predicate< 4, Arch > mask, simd< std::int32_t, 4, Arch > accumulator, simd< std::uint8_t, 16, Arch > a, simd< std::int8_t, 16, Arch > b) noexcept
dpbusd in active lanes; inactive lanes become zero.
constexpr simd< std::int32_t, 4, Arch > dpbsud(simd< std::int32_t, 4, Arch > accumulator, simd< std::int8_t, 16, Arch > a, simd< std::uint8_t, 16, Arch > b) noexcept
Accumulate products of four signed bytes from a and unsigned bytes from b, modulo 2^32.
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.