4#include "native/isa_import.h"
5#include "native/x86/ifma.h"
13#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
25 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx))
28 simd<
std::uint64_t, 2, Arch> accumulator,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
30 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
33 detail::x86_ifma::madd52lo<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
38 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) &&
39 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
40 Arch.has(x86_feature::avx512vl))
45 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
48 detail::x86_ifma::madd52lo<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
53 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) || (Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
54 Arch.has(x86_feature::avx512vl))) &&
55 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
58 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
62 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx))
67 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
70 detail::x86_ifma::madd52lo<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
75 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) &&
76 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
77 Arch.has(x86_feature::avx512vl))
82 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
85 detail::x86_ifma::madd52lo<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
90 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) || (Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
91 Arch.has(x86_feature::avx512vl))) &&
92 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
95 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
99 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
104 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
107 detail::x86_ifma::madd52lo<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
112 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
113 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
116 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b, ~std::uint64_t{0},
false);
120 template<isa<x86> Arch,
class... Args>
124 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
125 Arch.has(x86_feature::avx512vl))
128 simd<
std::uint64_t, 2, Arch> accumulator,
predicate<2, Arch>
mask,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
130 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
133 detail::x86_ifma::mask_madd52lo<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
138 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
139 Arch.has(x86_feature::avx512vl)) &&
140 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
142 simd<std::uint64_t, 2, Arch> accumulator,
predicate<2, Arch> mask,
simd<std::uint64_t, 2, Arch> a,
simd<std::uint64_t, 2, Arch> b)
noexcept {
143 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
147 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
148 Arch.has(x86_feature::avx512vl))
151 simd<std::uint64_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
153 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
156 detail::x86_ifma::mask_madd52lo<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
161 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
162 Arch.has(x86_feature::avx512vl)) &&
163 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
165 simd<std::uint64_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
166 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
170 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
173 simd<std::uint64_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
175 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
178 detail::x86_ifma::mask_madd52lo<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
183 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
184 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
186 simd<std::uint64_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
187 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
false);
191 template<isa<x86> Arch,
class... Args>
195 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
196 Arch.has(x86_feature::avx512vl))
199 predicate<2, Arch>
mask,
simd<
std::uint64_t, 2, Arch> accumulator,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
201 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
204 detail::x86_ifma::maskz_madd52lo<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
209 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
210 Arch.has(x86_feature::avx512vl)) &&
211 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
213 predicate<2, Arch> mask,
simd<std::uint64_t, 2, Arch> accumulator,
simd<std::uint64_t, 2, Arch> a,
simd<std::uint64_t, 2, Arch> b)
noexcept {
214 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
218 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
219 Arch.has(x86_feature::avx512vl))
222 predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> accumulator,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
224 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
227 detail::x86_ifma::maskz_madd52lo<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
232 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
233 Arch.has(x86_feature::avx512vl)) &&
234 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
236 predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> accumulator,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
237 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
241 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
244 predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> accumulator,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
246 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
249 detail::x86_ifma::maskz_madd52lo<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
254 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
255 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
257 predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> accumulator,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
258 return detail::x86_ifma_constant::accumulate<false>(accumulator, a, b,
mask.to_bitset(),
true);
262 template<isa<x86> Arch,
class... Args>
266 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx))
269 simd<
std::uint64_t, 2, Arch> accumulator,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
271 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
274 detail::x86_ifma::madd52hi<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
279 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) &&
280 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
281 Arch.has(x86_feature::avx512vl))
286 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
289 detail::x86_ifma::madd52hi<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
294 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) || (Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
295 Arch.has(x86_feature::avx512vl))) &&
296 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
299 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
303 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx))
308 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
311 detail::x86_ifma::madd52hi<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
316 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) &&
317 Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
318 Arch.has(x86_feature::avx512vl))
323 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
326 detail::x86_ifma::madd52hi<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
331 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avxifma) && Arch.has(x86_feature::avx)) || (Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
332 Arch.has(x86_feature::avx512vl))) &&
333 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
336 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
340 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
345 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
348 detail::x86_ifma::madd52hi<Arch>(accumulator.to_native(), a.to_native(), b.to_native()));
353 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
354 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
357 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b, ~std::uint64_t{0},
false);
361 template<isa<x86> Arch,
class... Args>
365 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
366 Arch.has(x86_feature::avx512vl))
369 simd<
std::uint64_t, 2, Arch> accumulator,
predicate<2, Arch>
mask,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
371 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
374 detail::x86_ifma::mask_madd52hi<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
379 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
380 Arch.has(x86_feature::avx512vl)) &&
381 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
383 simd<std::uint64_t, 2, Arch> accumulator,
predicate<2, Arch> mask,
simd<std::uint64_t, 2, Arch> a,
simd<std::uint64_t, 2, Arch> b)
noexcept {
384 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
388 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
389 Arch.has(x86_feature::avx512vl))
392 simd<std::uint64_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
394 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
397 detail::x86_ifma::mask_madd52hi<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
402 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
403 Arch.has(x86_feature::avx512vl)) &&
404 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
406 simd<std::uint64_t, 4, Arch> accumulator,
predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
407 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
411 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
414 simd<std::uint64_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
416 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
419 detail::x86_ifma::mask_madd52hi<Arch>(accumulator.to_native(),
static_cast<__mmask8
>(
mask.to_bitset()), a.to_native(), b.to_native()));
424 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
425 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
427 simd<std::uint64_t, 8, Arch> accumulator,
predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
428 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
false);
432 template<isa<x86> Arch,
class... Args>
436 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
437 Arch.has(x86_feature::avx512vl))
440 predicate<2, Arch>
mask,
simd<
std::uint64_t, 2, Arch> accumulator,
simd<
std::uint64_t, 2, Arch> a,
simd<
std::uint64_t, 2, Arch> b) noexcept {
442 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
445 detail::x86_ifma::maskz_madd52hi<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
450 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
451 Arch.has(x86_feature::avx512vl)) &&
452 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
454 predicate<2, Arch> mask,
simd<std::uint64_t, 2, Arch> accumulator,
simd<std::uint64_t, 2, Arch> a,
simd<std::uint64_t, 2, Arch> b)
noexcept {
455 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
459 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
460 Arch.has(x86_feature::avx512vl))
463 predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> accumulator,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
465 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
468 detail::x86_ifma::maskz_madd52hi<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
473 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma) &&
474 Arch.has(x86_feature::avx512vl)) &&
475 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
477 predicate<4, Arch> mask,
simd<std::uint64_t, 4, Arch> accumulator,
simd<std::uint64_t, 4, Arch> a,
simd<std::uint64_t, 4, Arch> b)
noexcept {
478 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
482 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma))
485 predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> accumulator,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
487 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
490 detail::x86_ifma::maskz_madd52hi<Arch>(
static_cast<__mmask8
>(
mask.to_bitset()), accumulator.to_native(), a.to_native(), b.to_native()));
495 template<isa<x86> Arch>
requires(!(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512ifma)) &&
496 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
498 predicate<8, Arch> mask,
simd<std::uint64_t, 8, Arch> accumulator,
simd<std::uint64_t, 8, Arch> a,
simd<std::uint64_t, 8, Arch> b)
noexcept {
499 return detail::x86_ifma_constant::accumulate<true>(accumulator, a, b,
mask.to_bitset(),
true);
503 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::uint64_t, 2, Arch > mask_madd52lo(simd< std::uint64_t, 2, Arch > accumulator, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate low 52-bit products in 2 lanes; inactive lanes retain the accumulator.
constexpr simd< std::uint64_t, 2, Arch > maskz_madd52lo(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > accumulator, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate low 52-bit products in 2 lanes; inactive lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > maskz_madd52hi(predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > accumulator, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate high 52-bit products in 2 lanes; inactive lanes become zero.
constexpr simd< std::uint64_t, 2, Arch > madd52hi(simd< std::uint64_t, 2, Arch > accumulator, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate high 52-bit products in 2 lanes; unmasked.
constexpr simd< std::uint64_t, 2, Arch > mask_madd52hi(simd< std::uint64_t, 2, Arch > accumulator, predicate< 2, Arch > mask, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate high 52-bit products in 2 lanes; inactive lanes retain the accumulator.
constexpr simd< std::uint64_t, 2, Arch > madd52lo(simd< std::uint64_t, 2, Arch > accumulator, simd< std::uint64_t, 2, Arch > a, simd< std::uint64_t, 2, Arch > b) noexcept
Accumulate low 52-bit products in 2 lanes; unmasked.
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.