3#include "native/isa_import.h"
4#include "native/x86/vpopcntdq.h"
5#include "native/x86/integer_constant.h"
10#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
23 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
33 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
36 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
43 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
53 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
63 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
66 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
73 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
83 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
84 Arch.has(x86_feature::avx512vl))
94 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
95 Arch.has(x86_feature::avx512vl))
98 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
105 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
106 Arch.has(x86_feature::avx512vl))
116 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
117 Arch.has(x86_feature::avx512vl))
127 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
128 Arch.has(x86_feature::avx512vl))
131 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
138 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
139 Arch.has(x86_feature::avx512vl))
149 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
150 Arch.has(x86_feature::avx512vl))
160 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
161 Arch.has(x86_feature::avx512vl))
164 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
171 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
172 Arch.has(x86_feature::avx512vl))
182 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
183 Arch.has(x86_feature::avx512vl))
193 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
194 Arch.has(x86_feature::avx512vl))
197 if consteval {
return detail::x86_instruction_constant::population(value, source,
mask.to_bitset()); }
204 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
205 Arch.has(x86_feature::avx512vl))
214 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
215 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
221 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
222 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
224 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
228 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
229 requires { sizeof(simd<std::uint32_t, 16, Arch>); })
235 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
236 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
242 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
243 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
245 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
249 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))) &&
250 requires { sizeof(simd<std::uint64_t, 8, Arch>); })
256 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
257 Arch.has(x86_feature::avx512vl))) &&
258 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
264 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
265 Arch.has(x86_feature::avx512vl))) &&
266 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
268 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
272 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
273 Arch.has(x86_feature::avx512vl))) &&
274 requires { sizeof(simd<std::uint32_t, 4, Arch>); })
280 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
281 Arch.has(x86_feature::avx512vl))) &&
282 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
288 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
289 Arch.has(x86_feature::avx512vl))) &&
290 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
292 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
296 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
297 Arch.has(x86_feature::avx512vl))) &&
298 requires { sizeof(simd<std::uint64_t, 2, Arch>); })
304 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
305 Arch.has(x86_feature::avx512vl))) &&
306 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
312 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
313 Arch.has(x86_feature::avx512vl))) &&
314 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
316 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
320 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
321 Arch.has(x86_feature::avx512vl))) &&
322 requires { sizeof(simd<std::uint32_t, 8, Arch>); })
328 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
329 Arch.has(x86_feature::avx512vl))) &&
330 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
336 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
337 Arch.has(x86_feature::avx512vl))) &&
338 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
340 return detail::x86_instruction_constant::population(value, source,
mask.to_bitset());
344 template<isa<x86> Arch>
requires(!((Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
345 Arch.has(x86_feature::avx512vl))) &&
346 requires { sizeof(simd<std::uint64_t, 4, Arch>); })
353 template<isa<x86> Arch,
class... Args>
356 template<isa<x86> Arch,
class... Args>
359 template<isa<x86> Arch,
class... Args>
362 template<isa<x86> Arch,
class... Args>
365 template<isa<x86> Arch,
class... Args>
368 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, 8, Arch > vpopcntq(simd< std::uint64_t, 8, Arch > value) noexcept
Count set bits in each of the 8 64-bit lanes; results are in [0, 64].
constexpr simd< std::uint64_t, 8, Arch > mask_vpopcntq(simd< std::uint64_t, 8, Arch > source, predicate< 8, Arch > mask, simd< std::uint64_t, 8, Arch > value) noexcept
Inactive lanes retain source; mask bits above the lane count are ignored.
constexpr simd< std::uint32_t, 16, Arch > vpopcntd(simd< std::uint32_t, 16, Arch > value) noexcept
Count set bits in each of the 16 32-bit lanes; results are in [0, 32].
constexpr simd< std::uint32_t, 16, Arch > maskz_vpopcntd(predicate< 16, Arch > mask, simd< std::uint32_t, 16, Arch > value) noexcept
Inactive lanes become zero; mask bits above the lane count are ignored.
constexpr simd< std::uint32_t, 16, Arch > mask_vpopcntd(simd< std::uint32_t, 16, Arch > source, predicate< 16, Arch > mask, simd< std::uint32_t, 16, Arch > value) noexcept
Inactive lanes retain source; mask bits above the lane count are ignored.
constexpr simd< std::uint64_t, 8, Arch > maskz_vpopcntq(predicate< 8, Arch > mask, simd< std::uint64_t, 8, Arch > value) noexcept
Inactive lanes become zero; mask bits above the lane count are ignored.
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.