blob: 1d362efaba4f19dd8dd27cc518d75a636f3e3e4d [file] [log] [blame]
Luo, Yuanke844f6622019-05-06 08:25:11 +00001// RUN: %clang_cc1 -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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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}
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
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
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}
Pengfei Wang244062e2019-06-11 01:17:28 +0000164
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
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
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
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}