1 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin \
2 // RUN: -target-feature +avx512bf16 -target-feature \
3 // RUN: +avx512vl -emit-llvm -o - -Wall -Werror | FileCheck %s
7 __m128bh
test_mm_cvtne2ps2bf16(__m128 A
, __m128 B
) {
8 // CHECK-LABEL: @test_mm_cvtne2ps2bf16
9 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.128
10 // CHECK: ret <8 x bfloat> %{{.*}}
11 return _mm_cvtne2ps_pbh(A
, B
);
14 __m128bh
test_mm_maskz_cvtne2ps2bf16(__m128 A
, __m128 B
, __mmask8 U
) {
15 // CHECK-LABEL: @test_mm_maskz_cvtne2ps2bf16
16 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.128
17 // CHECK: select <8 x i1> %{{.*}}, <8 x bfloat> %{{.*}}, <8 x bfloat> %{{.*}}
18 // CHECK: ret <8 x bfloat> %{{.*}}
19 return _mm_maskz_cvtne2ps_pbh(U
, A
, B
);
22 __m128bh
test_mm_mask_cvtne2ps2bf16(__m128bh C
, __mmask8 U
, __m128 A
, __m128 B
) {
23 // CHECK-LABEL: @test_mm_mask_cvtne2ps2bf16
24 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.128
25 // CHECK: select <8 x i1> %{{.*}}, <8 x bfloat> %{{.*}}, <8 x bfloat> %{{.*}}
26 // CHECK: ret <8 x bfloat> %{{.*}}
27 return _mm_mask_cvtne2ps_pbh(C
, U
, A
, B
);
30 __m256bh
test_mm256_cvtne2ps2bf16(__m256 A
, __m256 B
) {
31 // CHECK-LABEL: @test_mm256_cvtne2ps2bf16
32 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.256
33 // CHECK: ret <16 x bfloat> %{{.*}}
34 return _mm256_cvtne2ps_pbh(A
, B
);
37 __m256bh
test_mm256_maskz_cvtne2ps2bf16(__m256 A
, __m256 B
, __mmask16 U
) {
38 // CHECK-LABEL: @test_mm256_maskz_cvtne2ps2bf16
39 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.256
40 // CHECK: select <16 x i1> %{{.*}}, <16 x bfloat> %{{.*}}, <16 x bfloat> %{{.*}}
41 // CHECK: ret <16 x bfloat> %{{.*}}
42 return _mm256_maskz_cvtne2ps_pbh(U
, A
, B
);
45 __m256bh
test_mm256_mask_cvtne2ps2bf16(__m256bh C
, __mmask16 U
, __m256 A
, __m256 B
) {
46 // CHECK-LABEL: @test_mm256_mask_cvtne2ps2bf16
47 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.256
48 // CHECK: select <16 x i1> %{{.*}}, <16 x bfloat> %{{.*}}, <16 x bfloat> %{{.*}}
49 // CHECK: ret <16 x bfloat> %{{.*}}
50 return _mm256_mask_cvtne2ps_pbh(C
, U
, A
, B
);
53 __m512bh
test_mm512_cvtne2ps2bf16(__m512 A
, __m512 B
) {
54 // CHECK-LABEL: @test_mm512_cvtne2ps2bf16
55 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
56 // CHECK: ret <32 x bfloat> %{{.*}}
57 return _mm512_cvtne2ps_pbh(A
, B
);
60 __m512bh
test_mm512_maskz_cvtne2ps2bf16(__m512 A
, __m512 B
, __mmask32 U
) {
61 // CHECK-LABEL: @test_mm512_maskz_cvtne2ps2bf16
62 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
63 // CHECK: select <32 x i1> %{{.*}}, <32 x bfloat> %{{.*}}, <32 x bfloat> %{{.*}}
64 // CHECK: ret <32 x bfloat> %{{.*}}
65 return _mm512_maskz_cvtne2ps_pbh(U
, A
, B
);
68 __m512bh
test_mm512_mask_cvtne2ps2bf16(__m512bh C
, __mmask32 U
, __m512 A
, __m512 B
) {
69 // CHECK-LABEL: @test_mm512_mask_cvtne2ps2bf16
70 // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
71 // CHECK: select <32 x i1> %{{.*}}, <32 x bfloat> %{{.*}}, <32 x bfloat> %{{.*}}
72 // CHECK: ret <32 x bfloat> %{{.*}}
73 return _mm512_mask_cvtne2ps_pbh(C
, U
, A
, B
);
76 __m128bh
test_mm_cvtneps2bf16(__m128 A
) {
77 // CHECK-LABEL: @test_mm_cvtneps2bf16
78 // CHECK: @llvm.x86.vcvtneps2bf16128
79 // CHECK: ret <8 x bfloat> %{{.*}}
80 return _mm_cvtneps_pbh(A
);
83 __m128bh
test_mm_mask_cvtneps2bf16(__m128bh C
, __mmask8 U
, __m128 A
) {
84 // CHECK-LABEL: @test_mm_mask_cvtneps2bf16
85 // CHECK: @llvm.x86.avx512bf16.mask.cvtneps2bf16.
86 // CHECK: ret <8 x bfloat> %{{.*}}
87 return _mm_mask_cvtneps_pbh(C
, U
, A
);
90 __m128bh
test_mm_maskz_cvtneps2bf16(__m128 A
, __mmask8 U
) {
91 // CHECK-LABEL: @test_mm_maskz_cvtneps2bf16
92 // CHECK: @llvm.x86.avx512bf16.mask.cvtneps2bf16.128
93 // CHECK: ret <8 x bfloat> %{{.*}}
94 return _mm_maskz_cvtneps_pbh(U
, A
);
97 __m128bh
test_mm256_cvtneps2bf16(__m256 A
) {
98 // CHECK-LABEL: @test_mm256_cvtneps2bf16
99 // CHECK: @llvm.x86.vcvtneps2bf16256
100 // CHECK: ret <8 x bfloat> %{{.*}}
101 return _mm256_cvtneps_pbh(A
);
104 __m128bh
test_mm256_mask_cvtneps2bf16(__m128bh C
, __mmask8 U
, __m256 A
) {
105 // CHECK-LABEL: @test_mm256_mask_cvtneps2bf16
106 // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.256
107 // CHECK: select <8 x i1> %{{.*}}, <8 x bfloat> %{{.*}}, <8 x bfloat> %{{.*}}
108 // CHECK: ret <8 x bfloat> %{{.*}}
109 return _mm256_mask_cvtneps_pbh(C
, U
, A
);
112 __m128bh
test_mm256_maskz_cvtneps2bf16(__m256 A
, __mmask8 U
) {
113 // CHECK-LABEL: @test_mm256_maskz_cvtneps2bf16
114 // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.256
115 // CHECK: select <8 x i1> %{{.*}}, <8 x bfloat> %{{.*}}, <8 x bfloat> %{{.*}}
116 // CHECK: ret <8 x bfloat> %{{.*}}
117 return _mm256_maskz_cvtneps_pbh(U
, A
);
120 __m128
test_mm_dpbf16_ps(__m128 D
, __m128bh A
, __m128bh B
) {
121 // CHECK-LABEL: @test_mm_dpbf16_ps
122 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.128
123 // CHECK: ret <4 x float> %{{.*}}
124 return _mm_dpbf16_ps(D
, A
, B
);
127 __m128
test_mm_maskz_dpbf16_ps(__m128 D
, __m128bh A
, __m128bh B
, __mmask8 U
) {
128 // CHECK-LABEL: @test_mm_maskz_dpbf16_ps
129 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.128
130 // CHECK: select <4 x i1> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}
131 // CHECK: ret <4 x float> %{{.*}}
132 return _mm_maskz_dpbf16_ps(U
, D
, A
, B
);
135 __m128
test_mm_mask_dpbf16_ps(__m128 D
, __m128bh A
, __m128bh B
, __mmask8 U
) {
136 // CHECK-LABEL: @test_mm_mask_dpbf16_ps
137 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.128
138 // CHECK: select <4 x i1> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}
139 // CHECK: ret <4 x float> %{{.*}}
140 return _mm_mask_dpbf16_ps(D
, U
, A
, B
);
142 __m256
test_mm256_dpbf16_ps(__m256 D
, __m256bh A
, __m256bh B
) {
143 // CHECK-LABEL: @test_mm256_dpbf16_ps
144 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.256
145 // CHECK: ret <8 x float> %{{.*}}
146 return _mm256_dpbf16_ps(D
, A
, B
);
149 __m256
test_mm256_maskz_dpbf16_ps(__m256 D
, __m256bh A
, __m256bh B
, __mmask8 U
) {
150 // CHECK-LABEL: @test_mm256_maskz_dpbf16_ps
151 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.256
152 // CHECK: select <8 x i1> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}
153 // CHECK: ret <8 x float> %{{.*}}
154 return _mm256_maskz_dpbf16_ps(U
, D
, A
, B
);
157 __m256
test_mm256_mask_dpbf16_ps(__m256 D
, __m256bh A
, __m256bh B
, __mmask8 U
) {
158 // CHECK-LABEL: @test_mm256_mask_dpbf16_ps
159 // CHECK: @llvm.x86.avx512bf16.dpbf16ps.256
160 // CHECK: select <8 x i1> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}
161 // CHECK: ret <8 x float> %{{.*}}
162 return _mm256_mask_dpbf16_ps(D
, U
, A
, B
);
165 __bf16
test_mm_cvtness_sbh(float A
) {
166 // CHECK-LABEL: @test_mm_cvtness_sbh
167 // CHECK: @llvm.x86.avx512bf16.mask.cvtneps2bf16.128
168 // CHECK: ret bfloat %{{.*}}
169 return _mm_cvtness_sbh(A
);
172 __m128
test_mm_cvtpbh_ps(__m128bh A
) {
173 // CHECK-LABEL: @test_mm_cvtpbh_ps
174 // CHECK: sext <4 x i16> %{{.*}} to <4 x i32>
175 // CHECK: @llvm.x86.sse2.pslli.d
176 // CHECK: ret <4 x float> %{{.*}}
177 return _mm_cvtpbh_ps(A
);
180 __m256
test_mm256_cvtpbh_ps(__m128bh A
) {
181 // CHECK-LABEL: @test_mm256_cvtpbh_ps
182 // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
183 // CHECK: @llvm.x86.avx2.pslli.d
184 // CHECK: ret <8 x float> %{{.*}}
185 return _mm256_cvtpbh_ps(A
);
188 __m128
test_mm_maskz_cvtpbh_ps(__mmask8 M
, __m128bh A
) {
189 // CHECK-LABEL: @test_mm_maskz_cvtpbh_ps
190 // CHECK: sext <4 x i16> %{{.*}} to <4 x i32>
191 // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
192 // CHECK: @llvm.x86.sse2.pslli.d
193 // CHECK: ret <4 x float> %{{.*}}
194 return _mm_maskz_cvtpbh_ps(M
, A
);
197 __m256
test_mm256_maskz_cvtpbh_ps(__mmask8 M
, __m128bh A
) {
198 // CHECK-LABEL: @test_mm256_maskz_cvtpbh_ps
199 // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
200 // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
201 // CHECK: @llvm.x86.avx2.pslli.d
202 // CHECK: ret <8 x float> %{{.*}}
203 return _mm256_maskz_cvtpbh_ps(M
, A
);
206 __m128
test_mm_mask_cvtpbh_ps(__m128 S
, __mmask8 M
, __m128bh A
) {
207 // CHECK-LABEL: @test_mm_mask_cvtpbh_ps
208 // CHECK: sext <4 x i16> %{{.*}} to <4 x i32>
209 // CHECK: @llvm.x86.sse2.pslli.d
210 // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
211 // CHECK: ret <4 x float> %{{.*}}
212 return _mm_mask_cvtpbh_ps(S
, M
, A
);
215 __m256
test_mm256_mask_cvtpbh_ps(__m256 S
, __mmask8 M
, __m128bh A
) {
216 // CHECK-LABEL: @test_mm256_mask_cvtpbh_ps
217 // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
218 // CHECK: @llvm.x86.avx2.pslli.d
219 // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
220 // CHECK: ret <8 x float> %{{.*}}
221 return _mm256_mask_cvtpbh_ps(S
, M
, A
);