xref: /llvm-project/clang/test/CodeGen/X86/gfni-builtins.c (revision 06f640d3fb060e2e9cfed1d7c44636c7ffe3308b)
1 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +gfni -emit-llvm -o - | FileCheck %s --check-prefix SSE
2 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +gfni -target-feature +avx -emit-llvm -o - | FileCheck %s --check-prefixes SSE,AVX
3 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +gfni -target-feature +avx512f -target-feature +avx512vl -emit-llvm -o - | FileCheck %s --check-prefixes SSE,AVX,AVX512
4 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +gfni -target-feature +avx512bw -target-feature +avx512vl -emit-llvm -o - | FileCheck %s --check-prefixes SSE,AVX,AVX512,AVX512BW
5 
6 #include <immintrin.h>
7 
test_mm_gf2p8affineinv_epi64_epi8(__m128i A,__m128i B)8 __m128i test_mm_gf2p8affineinv_epi64_epi8(__m128i A, __m128i B) {
9   // SSE-LABEL: @test_mm_gf2p8affineinv_epi64_epi8
10   // SSE: @llvm.x86.vgf2p8affineinvqb.128
11   return _mm_gf2p8affineinv_epi64_epi8(A, B, 1);
12 }
13 
test_mm_gf2p8affine_epi64_epi8(__m128i A,__m128i B)14 __m128i test_mm_gf2p8affine_epi64_epi8(__m128i A, __m128i B) {
15   // SSE-LABEL: @test_mm_gf2p8affine_epi64_epi8
16   // SSE: @llvm.x86.vgf2p8affineqb.128
17   return _mm_gf2p8affine_epi64_epi8(A, B, 1);
18 }
19 
test_mm_gf2p8mul_epi8(__m128i A,__m128i B)20 __m128i test_mm_gf2p8mul_epi8(__m128i A, __m128i B) {
21   // SSE-LABEL: @test_mm_gf2p8mul_epi8
22   // SSE: @llvm.x86.vgf2p8mulb.128
23   return _mm_gf2p8mul_epi8(A, B);
24 }
25 
26 #ifdef __AVX__
test_mm256_gf2p8affineinv_epi64_epi8(__m256i A,__m256i B)27 __m256i test_mm256_gf2p8affineinv_epi64_epi8(__m256i A, __m256i B) {
28   // AVX-LABEL: @test_mm256_gf2p8affineinv_epi64_epi8
29   // AVX: @llvm.x86.vgf2p8affineinvqb.256
30   return _mm256_gf2p8affineinv_epi64_epi8(A, B, 1);
31 }
32 
test_mm256_gf2p8affine_epi64_epi8(__m256i A,__m256i B)33 __m256i test_mm256_gf2p8affine_epi64_epi8(__m256i A, __m256i B) {
34   // AVX-LABEL: @test_mm256_gf2p8affine_epi64_epi8
35   // AVX: @llvm.x86.vgf2p8affineqb.256
36   return _mm256_gf2p8affine_epi64_epi8(A, B, 1);
37 }
38 
test_mm256_gf2p8mul_epi8(__m256i A,__m256i B)39 __m256i test_mm256_gf2p8mul_epi8(__m256i A, __m256i B) {
40   // AVX-LABEL: @test_mm256_gf2p8mul_epi8
41   // AVX: @llvm.x86.vgf2p8mulb.256
42   return _mm256_gf2p8mul_epi8(A, B);
43 }
44 #endif // __AVX__
45 
46 #ifdef __AVX512F__
test_mm512_gf2p8affineinv_epi64_epi8(__m512i A,__m512i B)47 __m512i test_mm512_gf2p8affineinv_epi64_epi8(__m512i A, __m512i B) {
48   // AVX512-LABEL: @test_mm512_gf2p8affineinv_epi64_epi8
49   // AVX512: @llvm.x86.vgf2p8affineinvqb.512
50   return _mm512_gf2p8affineinv_epi64_epi8(A, B, 1);
51 }
52 
test_mm512_gf2p8affine_epi64_epi8(__m512i A,__m512i B)53 __m512i test_mm512_gf2p8affine_epi64_epi8(__m512i A, __m512i B) {
54   // AVX512-LABEL: @test_mm512_gf2p8affine_epi64_epi8
55   // AVX512: @llvm.x86.vgf2p8affineqb.512
56   return _mm512_gf2p8affine_epi64_epi8(A, B, 1);
57 }
58 
test_mm512_gf2p8mul_epi8(__m512i A,__m512i B)59 __m512i test_mm512_gf2p8mul_epi8(__m512i A, __m512i B) {
60   // AVX512-LABEL: @test_mm512_gf2p8mul_epi8
61   // AVX512: @llvm.x86.vgf2p8mulb.512
62   return _mm512_gf2p8mul_epi8(A, B);
63 }
64 #endif // __AVX512F__
65 
66 #ifdef __AVX512BW__
test_mm512_mask_gf2p8affineinv_epi64_epi8(__m512i S,__mmask64 U,__m512i A,__m512i B)67 __m512i test_mm512_mask_gf2p8affineinv_epi64_epi8(__m512i S, __mmask64 U, __m512i A, __m512i B) {
68   // AVX512BW-LABEL: @test_mm512_mask_gf2p8affineinv_epi64_epi8
69   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.512
70   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
71   return _mm512_mask_gf2p8affineinv_epi64_epi8(S, U, A, B, 1);
72 }
73 
test_mm512_maskz_gf2p8affineinv_epi64_epi8(__mmask64 U,__m512i A,__m512i B)74 __m512i test_mm512_maskz_gf2p8affineinv_epi64_epi8(__mmask64 U, __m512i A, __m512i B) {
75   // AVX512BW-LABEL: @test_mm512_maskz_gf2p8affineinv_epi64_epi8
76   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.512
77   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
78   return _mm512_maskz_gf2p8affineinv_epi64_epi8(U, A, B, 1);
79 }
80 
test_mm_mask_gf2p8affineinv_epi64_epi8(__m128i S,__mmask16 U,__m128i A,__m128i B)81 __m128i test_mm_mask_gf2p8affineinv_epi64_epi8(__m128i S, __mmask16 U, __m128i A, __m128i B) {
82   // AVX512BW-LABEL: @test_mm_mask_gf2p8affineinv_epi64_epi8
83   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.128
84   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
85   return _mm_mask_gf2p8affineinv_epi64_epi8(S, U, A, B, 1);
86 }
87 
test_mm_maskz_gf2p8affineinv_epi64_epi8(__mmask16 U,__m128i A,__m128i B)88 __m128i test_mm_maskz_gf2p8affineinv_epi64_epi8(__mmask16 U, __m128i A, __m128i B) {
89   // AVX512BW-LABEL: @test_mm_maskz_gf2p8affineinv_epi64_epi8
90   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.128
91   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
92   return _mm_maskz_gf2p8affineinv_epi64_epi8(U, A, B, 1);
93 }
94 
test_mm256_mask_gf2p8affineinv_epi64_epi8(__m256i S,__mmask32 U,__m256i A,__m256i B)95 __m256i test_mm256_mask_gf2p8affineinv_epi64_epi8(__m256i S, __mmask32 U, __m256i A, __m256i B) {
96   // AVX512BW-LABEL: @test_mm256_mask_gf2p8affineinv_epi64_epi8
97   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.256
98   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
99   return _mm256_mask_gf2p8affineinv_epi64_epi8(S, U, A, B, 1);
100 }
101 
test_mm256_maskz_gf2p8affineinv_epi64_epi8(__mmask32 U,__m256i A,__m256i B)102 __m256i test_mm256_maskz_gf2p8affineinv_epi64_epi8(__mmask32 U, __m256i A, __m256i B) {
103   // AVX512BW-LABEL: @test_mm256_maskz_gf2p8affineinv_epi64_epi8
104   // AVX512BW: @llvm.x86.vgf2p8affineinvqb.256
105   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
106   return _mm256_maskz_gf2p8affineinv_epi64_epi8(U, A, B, 1);
107 }
108 
test_mm512_mask_gf2p8affine_epi64_epi8(__m512i S,__mmask64 U,__m512i A,__m512i B)109 __m512i test_mm512_mask_gf2p8affine_epi64_epi8(__m512i S, __mmask64 U, __m512i A, __m512i B) {
110   // AVX512BW-LABEL: @test_mm512_mask_gf2p8affine_epi64_epi8
111   // AVX512BW: @llvm.x86.vgf2p8affineqb.512
112   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
113   return _mm512_mask_gf2p8affine_epi64_epi8(S, U, A, B, 1);
114 }
115 
test_mm512_maskz_gf2p8affine_epi64_epi8(__mmask64 U,__m512i A,__m512i B)116 __m512i test_mm512_maskz_gf2p8affine_epi64_epi8(__mmask64 U, __m512i A, __m512i B) {
117   // AVX512BW-LABEL: @test_mm512_maskz_gf2p8affine_epi64_epi8
118   // AVX512BW: @llvm.x86.vgf2p8affineqb.512
119   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
120   return _mm512_maskz_gf2p8affine_epi64_epi8(U, A, B, 1);
121 }
122 
test_mm_mask_gf2p8affine_epi64_epi8(__m128i S,__mmask16 U,__m128i A,__m128i B)123 __m128i test_mm_mask_gf2p8affine_epi64_epi8(__m128i S, __mmask16 U, __m128i A, __m128i B) {
124   // AVX512BW-LABEL: @test_mm_mask_gf2p8affine_epi64_epi8
125   // AVX512BW: @llvm.x86.vgf2p8affineqb.128
126   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
127   return _mm_mask_gf2p8affine_epi64_epi8(S, U, A, B, 1);
128 }
129 
test_mm_maskz_gf2p8affine_epi64_epi8(__mmask16 U,__m128i A,__m128i B)130 __m128i test_mm_maskz_gf2p8affine_epi64_epi8(__mmask16 U, __m128i A, __m128i B) {
131   // AVX512BW-LABEL: @test_mm_maskz_gf2p8affine_epi64_epi8
132   // AVX512BW: @llvm.x86.vgf2p8affineqb.128
133   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
134   return _mm_maskz_gf2p8affine_epi64_epi8(U, A, B, 1);
135 }
136 
test_mm256_mask_gf2p8affine_epi64_epi8(__m256i S,__mmask32 U,__m256i A,__m256i B)137 __m256i test_mm256_mask_gf2p8affine_epi64_epi8(__m256i S, __mmask32 U, __m256i A, __m256i B) {
138   // AVX512BW-LABEL: @test_mm256_mask_gf2p8affine_epi64_epi8
139   // AVX512BW: @llvm.x86.vgf2p8affineqb.256
140   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
141   return _mm256_mask_gf2p8affine_epi64_epi8(S, U, A, B, 1);
142 }
143 
test_mm256_maskz_gf2p8affine_epi64_epi8(__mmask32 U,__m256i A,__m256i B)144 __m256i test_mm256_maskz_gf2p8affine_epi64_epi8(__mmask32 U, __m256i A, __m256i B) {
145   // AVX512BW-LABEL: @test_mm256_maskz_gf2p8affine_epi64_epi8
146   // AVX512BW: @llvm.x86.vgf2p8affineqb.256
147   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
148   return _mm256_maskz_gf2p8affine_epi64_epi8(U, A, B, 1);
149 }
150 
test_mm512_mask_gf2p8mul_epi8(__m512i S,__mmask64 U,__m512i A,__m512i B)151 __m512i test_mm512_mask_gf2p8mul_epi8(__m512i S, __mmask64 U, __m512i A, __m512i B) {
152   // AVX512BW-LABEL: @test_mm512_mask_gf2p8mul_epi8
153   // AVX512BW: @llvm.x86.vgf2p8mulb.512
154   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
155   return _mm512_mask_gf2p8mul_epi8(S, U, A, B);
156 }
157 
test_mm512_maskz_gf2p8mul_epi8(__mmask64 U,__m512i A,__m512i B)158 __m512i test_mm512_maskz_gf2p8mul_epi8(__mmask64 U, __m512i A, __m512i B) {
159   // AVX512BW-LABEL: @test_mm512_maskz_gf2p8mul_epi8
160   // AVX512BW: @llvm.x86.vgf2p8mulb.512
161   // AVX512BW: select <64 x i1> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}}, <64 x i8> {{.*}}
162   return _mm512_maskz_gf2p8mul_epi8(U, A, B);
163 }
164 
test_mm_mask_gf2p8mul_epi8(__m128i S,__mmask16 U,__m128i A,__m128i B)165 __m128i test_mm_mask_gf2p8mul_epi8(__m128i S, __mmask16 U, __m128i A, __m128i B) {
166   // AVX512BW-LABEL: @test_mm_mask_gf2p8mul_epi8
167   // AVX512BW: @llvm.x86.vgf2p8mulb.128
168   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
169   return _mm_mask_gf2p8mul_epi8(S, U, A, B);
170 }
171 
test_mm_maskz_gf2p8mul_epi8(__mmask16 U,__m128i A,__m128i B)172 __m128i test_mm_maskz_gf2p8mul_epi8(__mmask16 U, __m128i A, __m128i B) {
173   // AVX512BW-LABEL: @test_mm_maskz_gf2p8mul_epi8
174   // AVX512BW: @llvm.x86.vgf2p8mulb.128
175   // AVX512BW: select <16 x i1> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i8> {{.*}}
176   return _mm_maskz_gf2p8mul_epi8(U, A, B);
177 }
178 
test_mm256_mask_gf2p8mul_epi8(__m256i S,__mmask32 U,__m256i A,__m256i B)179 __m256i test_mm256_mask_gf2p8mul_epi8(__m256i S, __mmask32 U, __m256i A, __m256i B) {
180   // AVX512BW-LABEL: @test_mm256_mask_gf2p8mul_epi8
181   // AVX512BW: @llvm.x86.vgf2p8mulb.256
182   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
183   return _mm256_mask_gf2p8mul_epi8(S, U, A, B);
184 }
185 
test_mm256_maskz_gf2p8mul_epi8(__mmask32 U,__m256i A,__m256i B)186 __m256i test_mm256_maskz_gf2p8mul_epi8(__mmask32 U, __m256i A, __m256i B) {
187   // AVX512BW-LABEL: @test_mm256_maskz_gf2p8mul_epi8
188   // AVX512BW: @llvm.x86.vgf2p8mulb.256
189   // AVX512BW: select <32 x i1> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}}, <32 x i8> {{.*}}
190   return _mm256_maskz_gf2p8mul_epi8(U, A, B);
191 }
192 #endif // __AVX512BW__
193