4#include "native/config.h"
11#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
12namespace native::detail::x86_vpopcntdq {
17 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
19 __m512i vpopcntd(__m512i value) noexcept {
20 return _mm512_popcnt_epi32(value);
24 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
26 __m512i mask_vpopcntd(__m512i source, __mmask16
mask, __m512i value) noexcept {
27 return _mm512_mask_popcnt_epi32(source,
mask, value);
31 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
33 __m512i maskz_vpopcntd(__mmask16
mask, __m512i value) noexcept {
34 return _mm512_maskz_popcnt_epi32(
mask, value);
38 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
40 __m512i vpopcntq(__m512i value) noexcept {
41 return _mm512_popcnt_epi64(value);
45 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
47 __m512i mask_vpopcntq(__m512i source, __mmask8
mask, __m512i value) noexcept {
48 return _mm512_mask_popcnt_epi64(source,
mask, value);
52 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq))
54 __m512i maskz_vpopcntq(__mmask8
mask, __m512i value) noexcept {
55 return _mm512_maskz_popcnt_epi64(
mask, value);
59 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
60 Arch.has(x86_feature::avx512vl))
62 __m128i vpopcntd(__m128i value) noexcept {
63 return _mm_popcnt_epi32(value);
67 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
68 Arch.has(x86_feature::avx512vl))
70 __m128i mask_vpopcntd(__m128i source, __mmask8
mask, __m128i value) noexcept {
71 return _mm_mask_popcnt_epi32(source,
mask, value);
75 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
76 Arch.has(x86_feature::avx512vl))
78 __m128i maskz_vpopcntd(__mmask8
mask, __m128i value) noexcept {
79 return _mm_maskz_popcnt_epi32(
mask, value);
83 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
84 Arch.has(x86_feature::avx512vl))
86 __m128i vpopcntq(__m128i value) noexcept {
87 return _mm_popcnt_epi64(value);
91 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
92 Arch.has(x86_feature::avx512vl))
94 __m128i mask_vpopcntq(__m128i source, __mmask8
mask, __m128i value) noexcept {
95 return _mm_mask_popcnt_epi64(source,
mask, value);
99 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
100 Arch.has(x86_feature::avx512vl))
102 __m128i maskz_vpopcntq(__mmask8
mask, __m128i value) noexcept {
103 return _mm_maskz_popcnt_epi64(
mask, value);
107 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
108 Arch.has(x86_feature::avx512vl))
110 __m256i vpopcntd(__m256i value) noexcept {
111 return _mm256_popcnt_epi32(value);
115 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
116 Arch.has(x86_feature::avx512vl))
118 __m256i mask_vpopcntd(__m256i source, __mmask8
mask, __m256i value) noexcept {
119 return _mm256_mask_popcnt_epi32(source,
mask, value);
123 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
124 Arch.has(x86_feature::avx512vl))
126 __m256i maskz_vpopcntd(__mmask8
mask, __m256i value) noexcept {
127 return _mm256_maskz_popcnt_epi32(
mask, value);
131 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
132 Arch.has(x86_feature::avx512vl))
134 __m256i vpopcntq(__m256i value) noexcept {
135 return _mm256_popcnt_epi64(value);
139 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
140 Arch.has(x86_feature::avx512vl))
142 __m256i mask_vpopcntq(__m256i source, __mmask8
mask, __m256i value) noexcept {
143 return _mm256_mask_popcnt_epi64(source,
mask, value);
147 template<isa<x86> Arch>
requires(Arch.has(x86_feature::avx512f) && Arch.has(x86_feature::avx512vpopcntdq) &&
148 Arch.has(x86_feature::avx512vl))
150 __m256i maskz_vpopcntq(__mmask8
mask, __m256i value) noexcept {
151 return _mm256_maskz_popcnt_epi64(
mask, value);
Compiler attributes for host code, with shader-safe shared modifiers.
#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