4#include "native/config.h"
11#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
12namespace native::detail::x86_gfni {
18 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni))
20 __m128i gf2p8mulb(__m128i a, __m128i b) noexcept {
21 return _mm_gf2p8mul_epi8(a, b);
25 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Imm8 <= 255)
27 __m128i gf2p8affineqb(__m128i a, __m128i matrix) noexcept {
28 return _mm_gf2p8affine_epi64_epi8(a, matrix, Imm8);
32 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Imm8 <= 255)
34 __m128i gf2p8affineinvqb(__m128i a, __m128i matrix) noexcept {
35 return _mm_gf2p8affineinv_epi64_epi8(a, matrix, Imm8);
39 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
40 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl))
42 __m128i gf2p8mulb_mask(__m128i src, __mmask16 k, __m128i a, __m128i b) noexcept {
43 return _mm_mask_gf2p8mul_epi8(src, k, a, b);
47 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
48 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl))
50 __m128i gf2p8mulb_maskz(__mmask16 k, __m128i a, __m128i b) noexcept {
51 return _mm_maskz_gf2p8mul_epi8(k, a, b);
55 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
56 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
58 __m128i gf2p8affineqb_mask(__m128i src, __mmask16 k, __m128i a, __m128i matrix) noexcept {
59 return _mm_mask_gf2p8affine_epi64_epi8(src, k, a, matrix, Imm8);
63 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
64 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
66 __m128i gf2p8affineqb_maskz(__mmask16 k, __m128i a, __m128i matrix) noexcept {
67 return _mm_maskz_gf2p8affine_epi64_epi8(k, a, matrix, Imm8);
71 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
72 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
74 __m128i gf2p8affineinvqb_mask(__m128i src, __mmask16 k, __m128i a, __m128i matrix) noexcept {
75 return _mm_mask_gf2p8affineinv_epi64_epi8(src, k, a, matrix, Imm8);
79 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
80 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
82 __m128i gf2p8affineinvqb_maskz(__mmask16 k, __m128i a, __m128i matrix) noexcept {
83 return _mm_maskz_gf2p8affineinv_epi64_epi8(k, a, matrix, Imm8);
89 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx))
91 __m256i gf2p8mulb(__m256i a, __m256i b) noexcept {
92 return _mm256_gf2p8mul_epi8(a, b);
96 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx) && Imm8 <= 255)
98 __m256i gf2p8affineqb(__m256i a, __m256i matrix) noexcept {
99 return _mm256_gf2p8affine_epi64_epi8(a, matrix, Imm8);
103 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx) && Imm8 <= 255)
105 __m256i gf2p8affineinvqb(__m256i a, __m256i matrix) noexcept {
106 return _mm256_gf2p8affineinv_epi64_epi8(a, matrix, Imm8);
110 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
111 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl))
113 __m256i gf2p8mulb_mask(__m256i src, __mmask32 k, __m256i a, __m256i b) noexcept {
114 return _mm256_mask_gf2p8mul_epi8(src, k, a, b);
118 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
119 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl))
121 __m256i gf2p8mulb_maskz(__mmask32 k, __m256i a, __m256i b) noexcept {
122 return _mm256_maskz_gf2p8mul_epi8(k, a, b);
126 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
127 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
129 __m256i gf2p8affineqb_mask(__m256i src, __mmask32 k, __m256i a, __m256i matrix) noexcept {
130 return _mm256_mask_gf2p8affine_epi64_epi8(src, k, a, matrix, Imm8);
134 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
135 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
137 __m256i gf2p8affineqb_maskz(__mmask32 k, __m256i a, __m256i matrix) noexcept {
138 return _mm256_maskz_gf2p8affine_epi64_epi8(k, a, matrix, Imm8);
142 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
143 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
145 __m256i gf2p8affineinvqb_mask(__m256i src, __mmask32 k, __m256i a, __m256i matrix) noexcept {
146 return _mm256_mask_gf2p8affineinv_epi64_epi8(src, k, a, matrix, Imm8);
150 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
151 Arch.has(x86_feature::avx512bw) && Arch.has(x86_feature::avx512vl) && Imm8 <= 255)
153 __m256i gf2p8affineinvqb_maskz(__mmask32 k, __m256i a, __m256i matrix) noexcept {
154 return _mm256_maskz_gf2p8affineinv_epi64_epi8(k, a, matrix, Imm8);
160 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f))
162 __m512i gf2p8mulb(__m512i a, __m512i b) noexcept {
163 return _mm512_gf2p8mul_epi8(a, b);
167 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) && Imm8 <= 255)
169 __m512i gf2p8affineqb(__m512i a, __m512i matrix) noexcept {
170 return _mm512_gf2p8affine_epi64_epi8(a, matrix, Imm8);
174 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) && Imm8 <= 255)
176 __m512i gf2p8affineinvqb(__m512i a, __m512i matrix) noexcept {
177 return _mm512_gf2p8affineinv_epi64_epi8(a, matrix, Imm8);
181 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
182 Arch.has(x86_feature::avx512bw))
184 __m512i gf2p8mulb_mask(__m512i src, __mmask64 k, __m512i a, __m512i b) noexcept {
185 return _mm512_mask_gf2p8mul_epi8(src, k, a, b);
189 template<isa<x86> Arch>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
190 Arch.has(x86_feature::avx512bw))
192 __m512i gf2p8mulb_maskz(__mmask64 k, __m512i a, __m512i b) noexcept {
193 return _mm512_maskz_gf2p8mul_epi8(k, a, b);
197 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
198 Arch.has(x86_feature::avx512bw) && Imm8 <= 255)
200 __m512i gf2p8affineqb_mask(__m512i src, __mmask64 k, __m512i a, __m512i matrix) noexcept {
201 return _mm512_mask_gf2p8affine_epi64_epi8(src, k, a, matrix, Imm8);
205 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
206 Arch.has(x86_feature::avx512bw) && Imm8 <= 255)
208 __m512i gf2p8affineqb_maskz(__mmask64 k, __m512i a, __m512i matrix) noexcept {
209 return _mm512_maskz_gf2p8affine_epi64_epi8(k, a, matrix, Imm8);
213 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
214 Arch.has(x86_feature::avx512bw) && Imm8 <= 255)
216 __m512i gf2p8affineinvqb_mask(__m512i src, __mmask64 k, __m512i a, __m512i matrix) noexcept {
217 return _mm512_mask_gf2p8affineinv_epi64_epi8(src, k, a, matrix, Imm8);
221 template<isa<x86> Arch,
unsigned Imm8>
requires(Arch.has(x86_feature::gfni) && Arch.has(x86_feature::avx512f) &&
222 Arch.has(x86_feature::avx512bw) && Imm8 <= 255)
224 __m512i gf2p8affineinvqb_maskz(__mmask64 k, __m512i a, __m512i matrix) noexcept {
225 return _mm512_maskz_gf2p8affineinv_epi64_epi8(k, a, matrix, Imm8);
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.