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
4 
5 #include <immintrin.h>
6 
test_mm_cvtne2ps2bf16(__m128 A,__m128 B)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 i16> %{{.*}}
11   return _mm_cvtne2ps_pbh(A, B);
12 }
13 
test_mm_maskz_cvtne2ps2bf16(__m128 A,__m128 B,__mmask8 U)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 i16> %{{.*}}, <8 x i16> %{{.*}}
18   // CHECK: ret <8 x i16> %{{.*}}
19   return _mm_maskz_cvtne2ps_pbh(U, A, B);
20 }
21 
test_mm_mask_cvtne2ps2bf16(__m128bh C,__mmask8 U,__m128 A,__m128 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 i16> %{{.*}}, <8 x i16> %{{.*}}
26   // CHECK: ret <8 x i16> %{{.*}}
27   return _mm_mask_cvtne2ps_pbh(C, U, A, B);
28 }
29 
test_mm256_cvtne2ps2bf16(__m256 A,__m256 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 i16> %{{.*}}
34   return _mm256_cvtne2ps_pbh(A, B);
35 }
36 
test_mm256_maskz_cvtne2ps2bf16(__m256 A,__m256 B,__mmask16 U)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 i16> %{{.*}}, <16 x i16> %{{.*}}
41   // CHECK: ret <16 x i16> %{{.*}}
42   return _mm256_maskz_cvtne2ps_pbh(U, A, B);
43 }
44 
test_mm256_mask_cvtne2ps2bf16(__m256bh C,__mmask16 U,__m256 A,__m256 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 i16> %{{.*}}, <16 x i16> %{{.*}}
49   // CHECK: ret <16 x i16> %{{.*}}
50   return _mm256_mask_cvtne2ps_pbh(C, U, A, B);
51 }
52 
test_mm512_cvtne2ps2bf16(__m512 A,__m512 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 i16> %{{.*}}
57   return _mm512_cvtne2ps_pbh(A, B);
58 }
59 
test_mm512_maskz_cvtne2ps2bf16(__m512 A,__m512 B,__mmask32 U)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 i16> %{{.*}}, <32 x i16> %{{.*}}
64   // CHECK: ret <32 x i16> %{{.*}}
65   return _mm512_maskz_cvtne2ps_pbh(U, A, B);
66 }
67 
test_mm512_mask_cvtne2ps2bf16(__m512bh C,__mmask32 U,__m512 A,__m512 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 i16> %{{.*}}, <32 x i16> %{{.*}}
72   // CHECK: ret <32 x i16> %{{.*}}
73   return _mm512_mask_cvtne2ps_pbh(C, U, A, B);
74 }
75 
test_mm_cvtneps2bf16(__m128 A)76 __m128bh test_mm_cvtneps2bf16(__m128 A) {
77   // CHECK-LABEL: @test_mm_cvtneps2bf16
78   // CHECK: @llvm.x86.avx512bf16.mask.cvtneps2bf16.128
79   // CHECK: ret <8 x i16> %{{.*}}
80   return _mm_cvtneps_pbh(A);
81 }
82 
test_mm_mask_cvtneps2bf16(__m128bh C,__mmask8 U,__m128 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 i16> %{{.*}}
87   return _mm_mask_cvtneps_pbh(C, U, A);
88 }
89 
test_mm_maskz_cvtneps2bf16(__m128 A,__mmask8 U)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 i16> %{{.*}}
94   return _mm_maskz_cvtneps_pbh(U, A);
95 }
96 
test_mm256_cvtneps2bf16(__m256 A)97 __m128bh test_mm256_cvtneps2bf16(__m256 A) {
98   // CHECK-LABEL: @test_mm256_cvtneps2bf16
99   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.256
100   // CHECK: ret <8 x i16> %{{.*}}
101   return _mm256_cvtneps_pbh(A);
102 }
103 
test_mm256_mask_cvtneps2bf16(__m128bh C,__mmask8 U,__m256 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 i16> %{{.*}}, <8 x i16> %{{.*}}
108   // CHECK: ret <8 x i16> %{{.*}}
109   return _mm256_mask_cvtneps_pbh(C, U, A);
110 }
111 
test_mm256_maskz_cvtneps2bf16(__m256 A,__mmask8 U)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 i16> %{{.*}}, <8 x i16> %{{.*}}
116   // CHECK: ret <8 x i16> %{{.*}}
117   return _mm256_maskz_cvtneps_pbh(U, A);
118 }
119 
test_mm_dpbf16_ps(__m128 D,__m128bh A,__m128bh B)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);
125 }
126 
test_mm_maskz_dpbf16_ps(__m128 D,__m128bh A,__m128bh B,__mmask8 U)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);
133 }
134 
test_mm_mask_dpbf16_ps(__m128 D,__m128bh A,__m128bh B,__mmask8 U)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);
141 }
test_mm256_dpbf16_ps(__m256 D,__m256bh A,__m256bh 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);
147 }
148 
test_mm256_maskz_dpbf16_ps(__m256 D,__m256bh A,__m256bh B,__mmask8 U)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);
155 }
156 
test_mm256_mask_dpbf16_ps(__m256 D,__m256bh A,__m256bh B,__mmask8 U)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);
163 }
164 
test_mm_cvtness_sbh(float A)165 __bfloat16 test_mm_cvtness_sbh(float A) {
166   // CHECK-LABEL: @test_mm_cvtness_sbh
167   // CHECK: @llvm.x86.avx512bf16.mask.cvtneps2bf16.128
168   // CHECK: ret i16 %{{.*}}
169   return _mm_cvtness_sbh(A);
170 }
171 
test_mm256_cvtpbh_ps(__m128bh A)172 __m256 test_mm256_cvtpbh_ps(__m128bh A) {
173   // CHECK-LABEL: @test_mm256_cvtpbh_ps
174   // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
175   // CHECK: @llvm.x86.avx2.pslli.d
176   // CHECK: bitcast <4 x i64> %{{.*}} to <8 x float>
177   // CHECK: ret <8 x float> %{{.*}}
178   return _mm256_cvtpbh_ps(A);
179 }
180 
test_mm256_maskz_cvtpbh_ps(__mmask8 M,__m128bh A)181 __m256 test_mm256_maskz_cvtpbh_ps(__mmask8 M, __m128bh A) {
182   // CHECK-LABEL: @test_mm256_maskz_cvtpbh_ps
183   // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
184   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
185   // CHECK: @llvm.x86.avx2.pslli.d
186   // CHECK: bitcast <4 x i64> %{{.*}} to <8 x float>
187   // CHECK: ret <8 x float> %{{.*}}
188   return _mm256_maskz_cvtpbh_ps(M, A);
189 }
190 
test_mm256_mask_cvtpbh_ps(__m256 S,__mmask8 M,__m128bh A)191 __m256 test_mm256_mask_cvtpbh_ps(__m256 S, __mmask8 M, __m128bh A) {
192   // CHECK-LABEL: @test_mm256_mask_cvtpbh_ps
193   // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
194   // CHECK: @llvm.x86.avx2.pslli.d
195   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
196   // CHECK: bitcast <4 x i64> %{{.*}} to <8 x float>
197   // CHECK: ret <8 x float> %{{.*}}
198   return _mm256_mask_cvtpbh_ps(S, M, A);
199 }
200