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