Clang Project

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