[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512fp16vl-intrinsics.ll
bloba0fc8180e10b9a15f56f9c29e062e42e210aadfb
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl -mattr=+avx512fp16 | FileCheck %s
4 define signext i16 @test_mm_cvtsi128_si16(<2 x i64> %A) local_unnamed_addr #0 {
5 ; CHECK-LABEL: test_mm_cvtsi128_si16:
6 ; CHECK:       # %bb.0: # %entry
7 ; CHECK-NEXT:    vmovw %xmm0, %eax
8 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
9 ; CHECK-NEXT:    retq
10 entry:
11   %0 = bitcast <2 x i64> %A to <8 x i16>
12   %vecext.i = extractelement <8 x i16> %0, i32 0
13   ret i16 %vecext.i
16 define <2 x i64> @test_mm_cvtsi16_si128(i16 signext %A) local_unnamed_addr #0 {
17 ; CHECK-LABEL: test_mm_cvtsi16_si128:
18 ; CHECK:       # %bb.0: # %entry
19 ; CHECK-NEXT:    vmovw %edi, %xmm0
20 ; CHECK-NEXT:    retq
21 entry:
22   %vecinit7.i = insertelement <8 x i16> <i16 undef, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, i16 %A, i32 0
23   %0 = bitcast <8 x i16> %vecinit7.i to <2 x i64>
24   ret <2 x i64> %0
27 define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_256(<8 x i32> %x0, <8 x half> %x1, i8 %x2) {
28 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_256:
29 ; CHECK:       # %bb.0:
30 ; CHECK-NEXT:    kmovd %edi, %k1
31 ; CHECK-NEXT:    vcvtdq2ph %ymm0, %xmm1 {%k1}
32 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
33 ; CHECK-NEXT:    vzeroupper
34 ; CHECK-NEXT:    retq
35   %mask = bitcast i8 %x2 to <8 x i1>
36   %res0 = sitofp <8 x i32> %x0 to <8 x half>
37   %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> %x1
38   ret <8 x half> %res
41 define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_256_z(<8 x i32> %x0, i8 %x2) {
42 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_256_z:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    kmovd %edi, %k1
45 ; CHECK-NEXT:    vcvtdq2ph %ymm0, %xmm0 {%k1} {z}
46 ; CHECK-NEXT:    vzeroupper
47 ; CHECK-NEXT:    retq
48   %mask = bitcast i8 %x2 to <8 x i1>
49   %res0 = sitofp <8 x i32> %x0 to <8 x half>
50   %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> zeroinitializer
51   ret <8 x half> %res
54 define <8 x half> @sint_to_fp_8i32_to_8f16(<8 x i32> %x) {
55 ; CHECK-LABEL: sint_to_fp_8i32_to_8f16:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    vcvtdq2ph %ymm0, %xmm0
58 ; CHECK-NEXT:    vzeroupper
59 ; CHECK-NEXT:    retq
60   %res = sitofp <8 x i32> %x to <8 x half>
61   ret <8 x half> %res
64 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32>, <8 x half>, i8)
66 define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128(<4 x i32> %x0, <8 x half> %x1, i8 %x2) {
67 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    kmovd %edi, %k1
70 ; CHECK-NEXT:    vcvtdq2ph %xmm0, %xmm1 {%k1}
71 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
72 ; CHECK-NEXT:    retq
73   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 %x2)
74   ret <8 x half> %res
77 define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128_nomask(<4 x i32> %x0, <8 x half> %x1) {
78 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128_nomask:
79 ; CHECK:       # %bb.0:
80 ; CHECK-NEXT:    vcvtdq2ph %xmm0, %xmm0
81 ; CHECK-NEXT:    retq
82   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 -1)
83   ret <8 x half> %res
86 define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128_z(<4 x i32> %x0, i8 %x2) {
87 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128_z:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    kmovd %edi, %k1
90 ; CHECK-NEXT:    vcvtdq2ph %xmm0, %xmm0 {%k1} {z}
91 ; CHECK-NEXT:    retq
92   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> zeroinitializer, i8 %x2)
93   ret <8 x half> %res
96 define <4 x half> @sint_to_fp_4i32_to_4f16(<4 x i32> %x) {
97 ; CHECK-LABEL: sint_to_fp_4i32_to_4f16:
98 ; CHECK:       # %bb.0:
99 ; CHECK-NEXT:    vcvtdq2ph %xmm0, %xmm0
100 ; CHECK-NEXT:    retq
101   %res = sitofp <4 x i32> %x to <4 x half>
102   ret <4 x half> %res
105 define <2 x half> @sint_to_fp_2i32_to_2f16(<2 x i32> %x) {
106 ; CHECK-LABEL: sint_to_fp_2i32_to_2f16:
107 ; CHECK:       # %bb.0:
108 ; CHECK-NEXT:    vcvtdq2ph %xmm0, %xmm0
109 ; CHECK-NEXT:    retq
110   %res = sitofp <2 x i32> %x to <2 x half>
111   ret <2 x half> %res
114 define <4 x i32> @fp_to_sint_4f16_to_4i32(<4 x half> %x) {
115 ; CHECK-LABEL: fp_to_sint_4f16_to_4i32:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm0
118 ; CHECK-NEXT:    retq
119   %res = fptosi <4 x half> %x to <4 x i32>
120   ret <4 x i32> %res
123 define <2 x i32> @fp_to_sint_2f16_to_2i32(<2 x half> %x) {
124 ; CHECK-LABEL: fp_to_sint_2f16_to_2i32:
125 ; CHECK:       # %bb.0:
126 ; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm0
127 ; CHECK-NEXT:    retq
128   %res = fptosi <2 x half> %x to <2 x i32>
129   ret <2 x i32> %res
132 define <2 x i16> @fp_to_sint_2f16_to_2i16(<2 x half> %x) {
133 ; CHECK-LABEL: fp_to_sint_2f16_to_2i16:
134 ; CHECK:       # %bb.0:
135 ; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0
136 ; CHECK-NEXT:    retq
137   %res = fptosi <2 x half> %x to <2 x i16>
138   ret <2 x i16> %res
141 define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_256(<8 x i32> %x0, <8 x half> %x1, i8 %x2) {
142 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_256:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    kmovd %edi, %k1
145 ; CHECK-NEXT:    vcvtudq2ph %ymm0, %xmm1 {%k1}
146 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
147 ; CHECK-NEXT:    vzeroupper
148 ; CHECK-NEXT:    retq
149   %mask = bitcast i8 %x2 to <8 x i1>
150   %res0 = uitofp <8 x i32> %x0 to <8 x half>
151   %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> %x1
152   ret <8 x half> %res
155 define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_256_z(<8 x i32> %x0, i8 %x2) {
156 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_256_z:
157 ; CHECK:       # %bb.0:
158 ; CHECK-NEXT:    kmovd %edi, %k1
159 ; CHECK-NEXT:    vcvtudq2ph %ymm0, %xmm0 {%k1} {z}
160 ; CHECK-NEXT:    vzeroupper
161 ; CHECK-NEXT:    retq
162   %mask = bitcast i8 %x2 to <8 x i1>
163   %res0 = uitofp <8 x i32> %x0 to <8 x half>
164   %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> zeroinitializer
165   ret <8 x half> %res
168 define <8 x half> @uint_to_fp_8i32_to_8f16(<8 x i32> %x) {
169 ; CHECK-LABEL: uint_to_fp_8i32_to_8f16:
170 ; CHECK:       # %bb.0:
171 ; CHECK-NEXT:    vcvtudq2ph %ymm0, %xmm0
172 ; CHECK-NEXT:    vzeroupper
173 ; CHECK-NEXT:    retq
174   %res = uitofp <8 x i32> %x to <8 x half>
175   ret <8 x half> %res
178 define <8 x i32> @fp_to_uint_8f16_to_8i32(<8 x half> %x) {
179 ; CHECK-LABEL: fp_to_uint_8f16_to_8i32:
180 ; CHECK:       # %bb.0:
181 ; CHECK-NEXT:    vcvttph2udq %xmm0, %ymm0
182 ; CHECK-NEXT:    retq
183   %res = fptoui <8 x half> %x to <8 x i32>
184   ret <8 x i32> %res
187 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32>, <8 x half>, i8)
189 define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128(<4 x i32> %x0, <8 x half> %x1, i8 %x2) {
190 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128:
191 ; CHECK:       # %bb.0:
192 ; CHECK-NEXT:    kmovd %edi, %k1
193 ; CHECK-NEXT:    vcvtudq2ph %xmm0, %xmm1 {%k1}
194 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
195 ; CHECK-NEXT:    retq
196   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 %x2)
197   ret <8 x half> %res
200 define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128_nomask(<4 x i32> %x0, <8 x half> %x1) {
201 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128_nomask:
202 ; CHECK:       # %bb.0:
203 ; CHECK-NEXT:    vcvtudq2ph %xmm0, %xmm0
204 ; CHECK-NEXT:    retq
205   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 -1)
206   ret <8 x half> %res
209 define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128_z(<4 x i32> %x0, i8 %x2) {
210 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128_z:
211 ; CHECK:       # %bb.0:
212 ; CHECK-NEXT:    kmovd %edi, %k1
213 ; CHECK-NEXT:    vcvtudq2ph %xmm0, %xmm0 {%k1} {z}
214 ; CHECK-NEXT:    retq
215   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> zeroinitializer, i8 %x2)
216   ret <8 x half> %res
219 define <4 x half> @uint_to_fp_4i32_to_4f16(<4 x i32> %x) {
220 ; CHECK-LABEL: uint_to_fp_4i32_to_4f16:
221 ; CHECK:       # %bb.0:
222 ; CHECK-NEXT:    vcvtudq2ph %xmm0, %xmm0
223 ; CHECK-NEXT:    retq
224   %res = uitofp <4 x i32> %x to <4 x half>
225   ret <4 x half> %res
228 define <2 x half> @uint_to_fp_2i32_to_2f16(<2 x i32> %x) {
229 ; CHECK-LABEL: uint_to_fp_2i32_to_2f16:
230 ; CHECK:       # %bb.0:
231 ; CHECK-NEXT:    vcvtudq2ph %xmm0, %xmm0
232 ; CHECK-NEXT:    retq
233   %res = uitofp <2 x i32> %x to <2 x half>
234   ret <2 x half> %res
237 define <4 x i32> @fp_to_uint_4f16_to_4i32(<4 x half> %x) {
238 ; CHECK-LABEL: fp_to_uint_4f16_to_4i32:
239 ; CHECK:       # %bb.0:
240 ; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0
241 ; CHECK-NEXT:    retq
242   %res = fptoui <4 x half> %x to <4 x i32>
243   ret <4 x i32> %res
246 define <2 x i32> @fp_to_uint_2f16_to_2i32(<2 x half> %x) {
247 ; CHECK-LABEL: fp_to_uint_2f16_to_2i32:
248 ; CHECK:       # %bb.0:
249 ; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0
250 ; CHECK-NEXT:    retq
251   %res = fptoui <2 x half> %x to <2 x i32>
252   ret <2 x i32> %res
255 define <2 x i16> @fp_to_uint_2f16_to_2i16(<2 x half> %x) {
256 ; CHECK-LABEL: fp_to_uint_2f16_to_2i16:
257 ; CHECK:       # %bb.0:
258 ; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0
259 ; CHECK-NEXT:    retq
260   %res = fptoui <2 x half> %x to <2 x i16>
261   ret <2 x i16> %res
264 declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half>, <4 x i32>, i8)
266 define <4 x i32> @test_int_x86_avx512_cvt_ph2dq_128(<8 x half> %x0) {
267 ; CHECK-LABEL: test_int_x86_avx512_cvt_ph2dq_128:
268 ; CHECK:       # %bb.0:
269 ; CHECK-NEXT:    vcvtph2dq %xmm0, %xmm0
270 ; CHECK-NEXT:    retq
271   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)
272   ret <4 x i32> %res
275 define <4 x i32> @test_int_x86_avx512_mask_cvt_ph2dq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {
276 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2dq_128:
277 ; CHECK:       # %bb.0:
278 ; CHECK-NEXT:    kmovd %edi, %k1
279 ; CHECK-NEXT:    vcvtph2dq %xmm0, %xmm1 {%k1}
280 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
281 ; CHECK-NEXT:    retq
282   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)
283   ret <4 x i32> %res
286 define <4 x i32> @test_int_x86_avx512_maskz_cvt_ph2dq_128(<8 x half> %x0, i8 %x2) {
287 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2dq_128:
288 ; CHECK:       # %bb.0:
289 ; CHECK-NEXT:    kmovd %edi, %k1
290 ; CHECK-NEXT:    vcvtph2dq %xmm0, %xmm0 {%k1} {z}
291 ; CHECK-NEXT:    retq
292   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)
293   ret <4 x i32> %res
296 declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half>, <8 x i32>, i8)
298 define <8 x i32> @test_int_x86_avx512_cvt_ph2dq_256(<8 x half> %x0) {
299 ; CHECK-LABEL: test_int_x86_avx512_cvt_ph2dq_256:
300 ; CHECK:       # %bb.0:
301 ; CHECK-NEXT:    vcvtph2dq %xmm0, %ymm0
302 ; CHECK-NEXT:    retq
303   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)
304   ret <8 x i32> %res
307 define <8 x i32> @test_int_x86_avx512_mask_cvt_ph2dq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {
308 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2dq_256:
309 ; CHECK:       # %bb.0:
310 ; CHECK-NEXT:    kmovd %edi, %k1
311 ; CHECK-NEXT:    vcvtph2dq %xmm0, %ymm1 {%k1}
312 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
313 ; CHECK-NEXT:    retq
314   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)
315   ret <8 x i32> %res
318 define <8 x i32> @test_int_x86_avx512_maskz_cvt_ph2dq_256(<8 x half> %x0, i8 %x2) {
319 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2dq_256:
320 ; CHECK:       # %bb.0:
321 ; CHECK-NEXT:    kmovd %edi, %k1
322 ; CHECK-NEXT:    vcvtph2dq %xmm0, %ymm0 {%k1} {z}
323 ; CHECK-NEXT:    retq
324   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)
325   ret <8 x i32> %res
328 declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half>, <4 x i32>, i8)
330 define <4 x i32> @test_int_x86_avx512_cvt_ph2udq_128(<8 x half> %x0) {
331 ; CHECK-LABEL: test_int_x86_avx512_cvt_ph2udq_128:
332 ; CHECK:       # %bb.0:
333 ; CHECK-NEXT:    vcvtph2udq %xmm0, %xmm0
334 ; CHECK-NEXT:    retq
335   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)
336   ret <4 x i32> %res
339 define <4 x i32> @test_int_x86_avx512_mask_cvt_ph2udq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {
340 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2udq_128:
341 ; CHECK:       # %bb.0:
342 ; CHECK-NEXT:    kmovd %edi, %k1
343 ; CHECK-NEXT:    vcvtph2udq %xmm0, %xmm1 {%k1}
344 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
345 ; CHECK-NEXT:    retq
346   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)
347   ret <4 x i32> %res
350 define <4 x i32> @test_int_x86_avx512_maskz_cvt_ph2udq_128(<8 x half> %x0, i8 %x2) {
351 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2udq_128:
352 ; CHECK:       # %bb.0:
353 ; CHECK-NEXT:    kmovd %edi, %k1
354 ; CHECK-NEXT:    vcvtph2udq %xmm0, %xmm0 {%k1} {z}
355 ; CHECK-NEXT:    retq
356   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)
357   ret <4 x i32> %res
360 declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half>, <8 x i32>, i8)
362 define <8 x i32> @test_int_x86_avx512_cvt_ph2udq_256(<8 x half> %x0) {
363 ; CHECK-LABEL: test_int_x86_avx512_cvt_ph2udq_256:
364 ; CHECK:       # %bb.0:
365 ; CHECK-NEXT:    vcvtph2udq %xmm0, %ymm0
366 ; CHECK-NEXT:    retq
367   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)
368   ret <8 x i32> %res
371 define <8 x i32> @test_int_x86_avx512_mask_cvt_ph2udq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {
372 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2udq_256:
373 ; CHECK:       # %bb.0:
374 ; CHECK-NEXT:    kmovd %edi, %k1
375 ; CHECK-NEXT:    vcvtph2udq %xmm0, %ymm1 {%k1}
376 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
377 ; CHECK-NEXT:    retq
378   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)
379   ret <8 x i32> %res
382 define <8 x i32> @test_int_x86_avx512_maskz_cvt_ph2udq_256(<8 x half> %x0, i8 %x2) {
383 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2udq_256:
384 ; CHECK:       # %bb.0:
385 ; CHECK-NEXT:    kmovd %edi, %k1
386 ; CHECK-NEXT:    vcvtph2udq %xmm0, %ymm0 {%k1} {z}
387 ; CHECK-NEXT:    retq
388   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)
389   ret <8 x i32> %res
392 declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half>, <4 x i32>, i8)
394 define <4 x i32> @test_int_x86_avx512_cvtt_ph2dq_128(<8 x half> %x0) {
395 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2dq_128:
396 ; CHECK:       # %bb.0:
397 ; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm0
398 ; CHECK-NEXT:    retq
399   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)
400   ret <4 x i32> %res
403 define <4 x i32> @test_int_x86_avx512_mask_cvtt_ph2dq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {
404 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2dq_128:
405 ; CHECK:       # %bb.0:
406 ; CHECK-NEXT:    kmovd %edi, %k1
407 ; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm1 {%k1}
408 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
409 ; CHECK-NEXT:    retq
410   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)
411   ret <4 x i32> %res
414 define <4 x i32> @test_int_x86_avx512_maskz_cvtt_ph2dq_128(<8 x half> %x0, i8 %x2) {
415 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2dq_128:
416 ; CHECK:       # %bb.0:
417 ; CHECK-NEXT:    kmovd %edi, %k1
418 ; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm0 {%k1} {z}
419 ; CHECK-NEXT:    retq
420   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)
421   ret <4 x i32> %res
424 declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half>, <8 x i32>, i8)
426 define <8 x i32> @test_int_x86_avx512_cvtt_ph2dq_256(<8 x half> %x0) {
427 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2dq_256:
428 ; CHECK:       # %bb.0:
429 ; CHECK-NEXT:    vcvttph2dq %xmm0, %ymm0
430 ; CHECK-NEXT:    retq
431   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)
432   ret <8 x i32> %res
435 define <8 x i32> @test_int_x86_avx512_mask_cvtt_ph2dq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {
436 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2dq_256:
437 ; CHECK:       # %bb.0:
438 ; CHECK-NEXT:    kmovd %edi, %k1
439 ; CHECK-NEXT:    vcvttph2dq %xmm0, %ymm1 {%k1}
440 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
441 ; CHECK-NEXT:    retq
442   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)
443   ret <8 x i32> %res
446 define <8 x i32> @test_int_x86_avx512_maskz_cvtt_ph2dq_256(<8 x half> %x0, i8 %x2) {
447 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2dq_256:
448 ; CHECK:       # %bb.0:
449 ; CHECK-NEXT:    kmovd %edi, %k1
450 ; CHECK-NEXT:    vcvttph2dq %xmm0, %ymm0 {%k1} {z}
451 ; CHECK-NEXT:    retq
452   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)
453   ret <8 x i32> %res
456 declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half>, <4 x i32>, i8)
458 define <4 x i32> @test_int_x86_avx512_cvtt_ph2udq_128(<8 x half> %x0) {
459 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2udq_128:
460 ; CHECK:       # %bb.0:
461 ; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0
462 ; CHECK-NEXT:    retq
463   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)
464   ret <4 x i32> %res
467 define <4 x i32> @test_int_x86_avx512_mask_cvtt_ph2udq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {
468 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2udq_128:
469 ; CHECK:       # %bb.0:
470 ; CHECK-NEXT:    kmovd %edi, %k1
471 ; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm1 {%k1}
472 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
473 ; CHECK-NEXT:    retq
474   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)
475   ret <4 x i32> %res
478 define <4 x i32> @test_int_x86_avx512_maskz_cvtt_ph2udq_128(<8 x half> %x0, i8 %x2) {
479 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2udq_128:
480 ; CHECK:       # %bb.0:
481 ; CHECK-NEXT:    kmovd %edi, %k1
482 ; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0 {%k1} {z}
483 ; CHECK-NEXT:    retq
484   %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)
485   ret <4 x i32> %res
488 declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half>, <8 x i32>, i8)
490 define <8 x i32> @test_int_x86_avx512_cvtt_ph2udq_256(<8 x half> %x0) {
491 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2udq_256:
492 ; CHECK:       # %bb.0:
493 ; CHECK-NEXT:    vcvttph2udq %xmm0, %ymm0
494 ; CHECK-NEXT:    retq
495   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)
496   ret <8 x i32> %res
499 define <8 x i32> @test_int_x86_avx512_mask_cvtt_ph2udq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {
500 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2udq_256:
501 ; CHECK:       # %bb.0:
502 ; CHECK-NEXT:    kmovd %edi, %k1
503 ; CHECK-NEXT:    vcvttph2udq %xmm0, %ymm1 {%k1}
504 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
505 ; CHECK-NEXT:    retq
506   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)
507   ret <8 x i32> %res
510 define <8 x i32> @test_int_x86_avx512_maskz_cvtt_ph2udq_256(<8 x half> %x0, i8 %x2) {
511 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2udq_256:
512 ; CHECK:       # %bb.0:
513 ; CHECK-NEXT:    kmovd %edi, %k1
514 ; CHECK-NEXT:    vcvttph2udq %xmm0, %ymm0 {%k1} {z}
515 ; CHECK-NEXT:    retq
516   %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)
517   ret <8 x i32> %res
520 declare <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half>, <4 x double>, i8)
522 define <4 x double> @test_int_x86_avx512_mask_cvt_ph2pd_256(<8 x half> %x0, <4 x double> %x1, i8 %x2) {
523 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_256:
524 ; CHECK:       # %bb.0:
525 ; CHECK-NEXT:    kmovd %edi, %k1
526 ; CHECK-NEXT:    vcvtph2pd %xmm0, %ymm1 {%k1}
527 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
528 ; CHECK-NEXT:    retq
529   %res = call <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half> %x0, <4 x double> %x1, i8 %x2)
530   ret <4 x double> %res
533 define <4 x double> @test_int_x86_avx512_mask_cvt_ph2pd_256_nomask(<8 x half> %x0, <4 x double> %x1) {
534 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_256_nomask:
535 ; CHECK:       # %bb.0:
536 ; CHECK-NEXT:    vcvtph2pd %xmm0, %ymm0
537 ; CHECK-NEXT:    retq
538   %res = call <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half> %x0, <4 x double> %x1, i8 -1)
539   ret <4 x double> %res
542 declare <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half>, <2 x double>, i8)
544 define <2 x double> @test_int_x86_avx512_mask_cvt_ph2pd_128(<8 x half> %x0, <2 x double> %x1, i8 %x2) {
545 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_128:
546 ; CHECK:       # %bb.0:
547 ; CHECK-NEXT:    kmovd %edi, %k1
548 ; CHECK-NEXT:    vcvtph2pd %xmm0, %xmm1 {%k1}
549 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
550 ; CHECK-NEXT:    retq
551   %res = call <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half> %x0, <2 x double> %x1, i8 %x2)
552   ret <2 x double> %res
555 define <2 x double> @test_int_x86_avx512_mask_cvt_ph2pd_128_nomask(<8 x half> %x0, <2 x double> %x1) {
556 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_128_nomask:
557 ; CHECK:       # %bb.0:
558 ; CHECK-NEXT:    vcvtph2pd %xmm0, %xmm0
559 ; CHECK-NEXT:    retq
560   %res = call <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half> %x0, <2 x double> %x1, i8 -1)
561   ret <2 x double> %res
564 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double>, <8 x half>, i8)
566 define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_256(<4 x double> %x0, <8 x half> %x1, i8 %x2) {
567 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_256:
568 ; CHECK:       # %bb.0:
569 ; CHECK-NEXT:    kmovd %edi, %k1
570 ; CHECK-NEXT:    vcvtpd2ph %ymm0, %xmm1 {%k1}
571 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
572 ; CHECK-NEXT:    vzeroupper
573 ; CHECK-NEXT:    retq
574   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double> %x0, <8 x half> %x1, i8 %x2)
575   ret <8 x half> %res
578 define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_256_load(ptr %px0, <8 x half> %x1, i8 %x2) {
579 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_256_load:
580 ; CHECK:       # %bb.0:
581 ; CHECK-NEXT:    kmovd %esi, %k1
582 ; CHECK-NEXT:    vcvtpd2phy (%rdi), %xmm0 {%k1}
583 ; CHECK-NEXT:    retq
584   %x0 = load <4 x double>, ptr %px0, align 32
585   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double> %x0, <8 x half> %x1, i8 %x2)
586   ret <8 x half> %res
589 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double>, <8 x half>, i8)
591 define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_128(<2 x double> %x0, <8 x half> %x1, i8 %x2) {
592 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_128:
593 ; CHECK:       # %bb.0:
594 ; CHECK-NEXT:    kmovd %edi, %k1
595 ; CHECK-NEXT:    vcvtpd2ph %xmm0, %xmm1 {%k1}
596 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
597 ; CHECK-NEXT:    retq
598   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double> %x0, <8 x half> %x1, i8 %x2)
599   ret <8 x half> %res
602 define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_128_load(ptr %px0, <8 x half> %x1, i8 %x2) {
603 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_128_load:
604 ; CHECK:       # %bb.0:
605 ; CHECK-NEXT:    kmovd %esi, %k1
606 ; CHECK-NEXT:    vcvtpd2phx (%rdi), %xmm0 {%k1}
607 ; CHECK-NEXT:    retq
608   %x0 = load <2 x double>, ptr %px0, align 16
609   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double> %x0, <8 x half> %x1, i8 %x2)
610   ret <8 x half> %res
613 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64>, <8 x half>, i8)
615 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256(<4 x i64> %x0, <8 x half> %x1, i8 %x2) {
616 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256:
617 ; CHECK:       # %bb.0:
618 ; CHECK-NEXT:    kmovd %edi, %k1
619 ; CHECK-NEXT:    vcvtqq2ph %ymm0, %xmm1 {%k1}
620 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
621 ; CHECK-NEXT:    vzeroupper
622 ; CHECK-NEXT:    retq
623   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 %x2)
624   ret <8 x half> %res
627 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256_nomask(<4 x i64> %x0, <8 x half> %x1) {
628 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256_nomask:
629 ; CHECK:       # %bb.0:
630 ; CHECK-NEXT:    vcvtqq2ph %ymm0, %xmm0
631 ; CHECK-NEXT:    vzeroupper
632 ; CHECK-NEXT:    retq
633   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 -1)
634   ret <8 x half> %res
637 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256_z(<4 x i64> %x0, i8 %x2) {
638 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256_z:
639 ; CHECK:       # %bb.0:
640 ; CHECK-NEXT:    kmovd %edi, %k1
641 ; CHECK-NEXT:    vcvtqq2ph %ymm0, %xmm0 {%k1} {z}
642 ; CHECK-NEXT:    vzeroupper
643 ; CHECK-NEXT:    retq
644   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)
645   ret <8 x half> %res
648 define <4 x half> @sint_to_fp_4i64_to_4f16(<4 x i64> %x) {
649 ; CHECK-LABEL: sint_to_fp_4i64_to_4f16:
650 ; CHECK:       # %bb.0:
651 ; CHECK-NEXT:    vcvtqq2ph %ymm0, %xmm0
652 ; CHECK-NEXT:    vzeroupper
653 ; CHECK-NEXT:    retq
654   %res = sitofp <4 x i64> %x to <4 x half>
655   ret <4 x half> %res
658 define <4 x i64> @fp_to_sint_4f16_to_4i64(<4 x half> %x) {
659 ; CHECK-LABEL: fp_to_sint_4f16_to_4i64:
660 ; CHECK:       # %bb.0:
661 ; CHECK-NEXT:    vcvttph2qq %xmm0, %ymm0
662 ; CHECK-NEXT:    retq
663   %res = fptosi <4 x half> %x to <4 x i64>
664   ret <4 x i64> %res
667 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64>, <8 x half>, i8)
669 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128(<2 x i64> %x0, <8 x half> %x1, i8 %x2) {
670 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128:
671 ; CHECK:       # %bb.0:
672 ; CHECK-NEXT:    kmovd %edi, %k1
673 ; CHECK-NEXT:    vcvtqq2ph %xmm0, %xmm1 {%k1}
674 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
675 ; CHECK-NEXT:    retq
676   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 %x2)
677   ret <8 x half> %res
680 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128_nomask(<2 x i64> %x0, <8 x half> %x1) {
681 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128_nomask:
682 ; CHECK:       # %bb.0:
683 ; CHECK-NEXT:    vcvtqq2ph %xmm0, %xmm0
684 ; CHECK-NEXT:    retq
685   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 -1)
686   ret <8 x half> %res
689 define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128_z(<2 x i64> %x0, i8 %x2) {
690 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128_z:
691 ; CHECK:       # %bb.0:
692 ; CHECK-NEXT:    kmovd %edi, %k1
693 ; CHECK-NEXT:    vcvtqq2ph %xmm0, %xmm0 {%k1} {z}
694 ; CHECK-NEXT:    retq
695   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)
696   ret <8 x half> %res
699 define <2 x half> @sint_to_fp_2i64_to_2f16(<2 x i64> %x) {
700 ; CHECK-LABEL: sint_to_fp_2i64_to_2f16:
701 ; CHECK:       # %bb.0:
702 ; CHECK-NEXT:    vcvtqq2ph %xmm0, %xmm0
703 ; CHECK-NEXT:    retq
704   %res = sitofp <2 x i64> %x to <2 x half>
705   ret <2 x half> %res
708 define <2 x i64> @fp_to_sint_2f16_to_2i64(<2 x half> %x) {
709 ; CHECK-LABEL: fp_to_sint_2f16_to_2i64:
710 ; CHECK:       # %bb.0:
711 ; CHECK-NEXT:    vcvttph2qq %xmm0, %xmm0
712 ; CHECK-NEXT:    retq
713   %res = fptosi <2 x half> %x to <2 x i64>
714   ret <2 x i64> %res
717 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64>, <8 x half>, i8)
719 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256(<4 x i64> %x0, <8 x half> %x1, i8 %x2) {
720 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256:
721 ; CHECK:       # %bb.0:
722 ; CHECK-NEXT:    kmovd %edi, %k1
723 ; CHECK-NEXT:    vcvtuqq2ph %ymm0, %xmm1 {%k1}
724 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
725 ; CHECK-NEXT:    vzeroupper
726 ; CHECK-NEXT:    retq
727   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 %x2)
728   ret <8 x half> %res
731 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256_nomask(<4 x i64> %x0, <8 x half> %x1) {
732 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256_nomask:
733 ; CHECK:       # %bb.0:
734 ; CHECK-NEXT:    vcvtuqq2ph %ymm0, %xmm0
735 ; CHECK-NEXT:    vzeroupper
736 ; CHECK-NEXT:    retq
737   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 -1)
738   ret <8 x half> %res
741 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256_z(<4 x i64> %x0, i8 %x2) {
742 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256_z:
743 ; CHECK:       # %bb.0:
744 ; CHECK-NEXT:    kmovd %edi, %k1
745 ; CHECK-NEXT:    vcvtuqq2ph %ymm0, %xmm0 {%k1} {z}
746 ; CHECK-NEXT:    vzeroupper
747 ; CHECK-NEXT:    retq
748   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)
749   ret <8 x half> %res
752 define <4 x half> @uint_to_fp_4i64_to_4f16(<4 x i64> %x) {
753 ; CHECK-LABEL: uint_to_fp_4i64_to_4f16:
754 ; CHECK:       # %bb.0:
755 ; CHECK-NEXT:    vcvtuqq2ph %ymm0, %xmm0
756 ; CHECK-NEXT:    vzeroupper
757 ; CHECK-NEXT:    retq
758   %res = uitofp <4 x i64> %x to <4 x half>
759   ret <4 x half> %res
762 define <4 x i64> @fp_to_uint_4f16_to_4i64(<4 x half> %x) {
763 ; CHECK-LABEL: fp_to_uint_4f16_to_4i64:
764 ; CHECK:       # %bb.0:
765 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %ymm0
766 ; CHECK-NEXT:    retq
767   %res = fptoui <4 x half> %x to <4 x i64>
768   ret <4 x i64> %res
771 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64>, <8 x half>, i8)
773 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128(<2 x i64> %x0, <8 x half> %x1, i8 %x2) {
774 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128:
775 ; CHECK:       # %bb.0:
776 ; CHECK-NEXT:    kmovd %edi, %k1
777 ; CHECK-NEXT:    vcvtuqq2ph %xmm0, %xmm1 {%k1}
778 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
779 ; CHECK-NEXT:    retq
780   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 %x2)
781   ret <8 x half> %res
784 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128_nomask(<2 x i64> %x0, <8 x half> %x1) {
785 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128_nomask:
786 ; CHECK:       # %bb.0:
787 ; CHECK-NEXT:    vcvtuqq2ph %xmm0, %xmm0
788 ; CHECK-NEXT:    retq
789   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 -1)
790   ret <8 x half> %res
793 define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128_z(<2 x i64> %x0, i8 %x2) {
794 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128_z:
795 ; CHECK:       # %bb.0:
796 ; CHECK-NEXT:    kmovd %edi, %k1
797 ; CHECK-NEXT:    vcvtuqq2ph %xmm0, %xmm0 {%k1} {z}
798 ; CHECK-NEXT:    retq
799   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)
800   ret <8 x half> %res
803 define <2 x half> @uint_to_fp_2i64_to_2f16(<2 x i64> %x) {
804 ; CHECK-LABEL: uint_to_fp_2i64_to_2f16:
805 ; CHECK:       # %bb.0:
806 ; CHECK-NEXT:    vcvtuqq2ph %xmm0, %xmm0
807 ; CHECK-NEXT:    retq
808   %res = uitofp <2 x i64> %x to <2 x half>
809   ret <2 x half> %res
812 define <2 x i64> @fp_to_uint_2f16_to_2i64(<2 x half> %x) {
813 ; CHECK-LABEL: fp_to_uint_2f16_to_2i64:
814 ; CHECK:       # %bb.0:
815 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %xmm0
816 ; CHECK-NEXT:    retq
817   %res = fptoui <2 x half> %x to <2 x i64>
818   ret <2 x i64> %res
821 declare <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half>, <2 x i64>, i8)
823 define <2 x i64> @test_int_x86_avx512_cvtt_ph2qq_128(<8 x half> %x0) {
824 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2qq_128:
825 ; CHECK:       # %bb.0:
826 ; CHECK-NEXT:    vcvttph2qq %xmm0, %xmm0
827 ; CHECK-NEXT:    retq
828   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> undef, i8 -1)
829   ret <2 x i64> %res
832 define <2 x i64> @test_int_x86_avx512_mask_cvtt_ph2qq_128(<8 x half> %x0, <2 x i64> %x1, i8 %x2) {
833 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2qq_128:
834 ; CHECK:       # %bb.0:
835 ; CHECK-NEXT:    kmovd %edi, %k1
836 ; CHECK-NEXT:    vcvttph2qq %xmm0, %xmm1 {%k1}
837 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
838 ; CHECK-NEXT:    retq
839   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> %x1, i8 %x2)
840   ret <2 x i64> %res
843 define <2 x i64> @test_int_x86_avx512_maskz_cvtt_ph2qq_128(<8 x half> %x0, i8 %x2) {
844 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2qq_128:
845 ; CHECK:       # %bb.0:
846 ; CHECK-NEXT:    kmovd %edi, %k1
847 ; CHECK-NEXT:    vcvttph2qq %xmm0, %xmm0 {%k1} {z}
848 ; CHECK-NEXT:    retq
849   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> zeroinitializer, i8 %x2)
850   ret <2 x i64> %res
853 declare <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half>, <4 x i64>, i8)
855 define <4 x i64> @test_int_x86_avx512_cvtt_ph2qq_256(<8 x half> %x0) {
856 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2qq_256:
857 ; CHECK:       # %bb.0:
858 ; CHECK-NEXT:    vcvttph2qq %xmm0, %ymm0
859 ; CHECK-NEXT:    retq
860   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> undef, i8 -1)
861   ret <4 x i64> %res
864 define <4 x i64> @test_int_x86_avx512_mask_cvtt_ph2qq_256(<8 x half> %x0, <4 x i64> %x1, i8 %x2) {
865 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2qq_256:
866 ; CHECK:       # %bb.0:
867 ; CHECK-NEXT:    kmovd %edi, %k1
868 ; CHECK-NEXT:    vcvttph2qq %xmm0, %ymm1 {%k1}
869 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
870 ; CHECK-NEXT:    retq
871   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> %x1, i8 %x2)
872   ret <4 x i64> %res
875 define <4 x i64> @test_int_x86_avx512_maskz_cvtt_ph2qq_256(<8 x half> %x0, i8 %x2) {
876 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2qq_256:
877 ; CHECK:       # %bb.0:
878 ; CHECK-NEXT:    kmovd %edi, %k1
879 ; CHECK-NEXT:    vcvttph2qq %xmm0, %ymm0 {%k1} {z}
880 ; CHECK-NEXT:    retq
881   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> zeroinitializer, i8 %x2)
882   ret <4 x i64> %res
885 declare <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half>, <2 x i64>, i8)
887 define <2 x i64> @test_int_x86_avx512_cvtt_ph2uqq_128(<8 x half> %x0) {
888 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2uqq_128:
889 ; CHECK:       # %bb.0:
890 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %xmm0
891 ; CHECK-NEXT:    retq
892   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> undef, i8 -1)
893   ret <2 x i64> %res
896 define <2 x i64> @test_int_x86_avx512_mask_cvtt_ph2uqq_128(<8 x half> %x0, <2 x i64> %x1, i8 %x2) {
897 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2uqq_128:
898 ; CHECK:       # %bb.0:
899 ; CHECK-NEXT:    kmovd %edi, %k1
900 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %xmm1 {%k1}
901 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
902 ; CHECK-NEXT:    retq
903   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> %x1, i8 %x2)
904   ret <2 x i64> %res
907 define <2 x i64> @test_int_x86_avx512_maskz_cvtt_ph2uqq_128(<8 x half> %x0, i8 %x2) {
908 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2uqq_128:
909 ; CHECK:       # %bb.0:
910 ; CHECK-NEXT:    kmovd %edi, %k1
911 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %xmm0 {%k1} {z}
912 ; CHECK-NEXT:    retq
913   %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> zeroinitializer, i8 %x2)
914   ret <2 x i64> %res
917 declare <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half>, <4 x i64>, i8)
919 define <4 x i64> @test_int_x86_avx512_cvtt_ph2uqq_256(<8 x half> %x0) {
920 ; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2uqq_256:
921 ; CHECK:       # %bb.0:
922 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %ymm0
923 ; CHECK-NEXT:    retq
924   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> undef, i8 -1)
925   ret <4 x i64> %res
928 define <4 x i64> @test_int_x86_avx512_mask_cvtt_ph2uqq_256(<8 x half> %x0, <4 x i64> %x1, i8 %x2) {
929 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2uqq_256:
930 ; CHECK:       # %bb.0:
931 ; CHECK-NEXT:    kmovd %edi, %k1
932 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %ymm1 {%k1}
933 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
934 ; CHECK-NEXT:    retq
935   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> %x1, i8 %x2)
936   ret <4 x i64> %res
939 define <4 x i64> @test_int_x86_avx512_maskz_cvtt_ph2uqq_256(<8 x half> %x0, i8 %x2) {
940 ; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2uqq_256:
941 ; CHECK:       # %bb.0:
942 ; CHECK-NEXT:    kmovd %edi, %k1
943 ; CHECK-NEXT:    vcvttph2uqq %xmm0, %ymm0 {%k1} {z}
944 ; CHECK-NEXT:    retq
945   %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> zeroinitializer, i8 %x2)
946   ret <4 x i64> %res
949 declare <8 x half> @llvm.sqrt.v8f16(<8 x half>)
950 declare <16 x half> @llvm.sqrt.v16f16(<16 x half>)
952 define <8 x half> @test_sqrt_ph_128(<8 x half> %a0) {
953 ; CHECK-LABEL: test_sqrt_ph_128:
954 ; CHECK:       # %bb.0:
955 ; CHECK-NEXT:    vsqrtph %xmm0, %xmm0
956 ; CHECK-NEXT:    retq
957   %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)
958   ret <8 x half> %1
961 define <8 x half> @test_sqrt_ph_128_fast(<8 x half> %a0, <8 x half> %a1) {
962 ; CHECK-LABEL: test_sqrt_ph_128_fast:
963 ; CHECK:       # %bb.0:
964 ; CHECK-NEXT:    vrsqrtph %xmm0, %xmm0
965 ; CHECK-NEXT:    vmulph %xmm0, %xmm1, %xmm0
966 ; CHECK-NEXT:    retq
967   %1 = call fast <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)
968   %2 = fdiv fast <8 x half> %a1, %1
969   ret <8 x half> %2
972 define <8 x half> @test_sqrt_ph_128_fast2(<8 x half> %a0, <8 x half> %a1) {
973 ; CHECK-LABEL: test_sqrt_ph_128_fast2:
974 ; CHECK:       # %bb.0:
975 ; CHECK-NEXT:    vsqrtph %xmm0, %xmm0
976 ; CHECK-NEXT:    retq
977   %1 = call fast <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)
978   ret <8 x half> %1
981 define <8 x half> @test_mask_sqrt_ph_128(<8 x half> %a0, <8 x half> %passthru, i8 %mask) {
982 ; CHECK-LABEL: test_mask_sqrt_ph_128:
983 ; CHECK:       # %bb.0:
984 ; CHECK-NEXT:    kmovd %edi, %k1
985 ; CHECK-NEXT:    vsqrtph %xmm0, %xmm1 {%k1}
986 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
987 ; CHECK-NEXT:    retq
988   %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)
989   %2 = bitcast i8 %mask to <8 x i1>
990   %3 = select <8 x i1> %2, <8 x half> %1, <8 x half> %passthru
991   ret <8 x half> %3
994 define <8 x half> @test_maskz_sqrt_ph_128(<8 x half> %a0, i8 %mask) {
995 ; CHECK-LABEL: test_maskz_sqrt_ph_128:
996 ; CHECK:       # %bb.0:
997 ; CHECK-NEXT:    kmovd %edi, %k1
998 ; CHECK-NEXT:    vsqrtph %xmm0, %xmm0 {%k1} {z}
999 ; CHECK-NEXT:    retq
1000   %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)
1001   %2 = bitcast i8 %mask to <8 x i1>
1002   %3 = select <8 x i1> %2, <8 x half> %1, <8 x half> zeroinitializer
1003   ret <8 x half> %3
1006 define <16 x half> @test_sqrt_ph_256(<16 x half> %a0) {
1007 ; CHECK-LABEL: test_sqrt_ph_256:
1008 ; CHECK:       # %bb.0:
1009 ; CHECK-NEXT:    vsqrtph %ymm0, %ymm0
1010 ; CHECK-NEXT:    retq
1011   %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)
1012   ret <16 x half> %1
1015 define <16 x half> @test_sqrt_ph_256_fast(<16 x half> %a0, <16 x half> %a1) {
1016 ; CHECK-LABEL: test_sqrt_ph_256_fast:
1017 ; CHECK:       # %bb.0:
1018 ; CHECK-NEXT:    vrsqrtph %ymm0, %ymm0
1019 ; CHECK-NEXT:    vmulph %ymm0, %ymm1, %ymm0
1020 ; CHECK-NEXT:    retq
1021   %1 = call fast <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)
1022   %2 = fdiv fast <16 x half> %a1, %1
1023   ret <16 x half> %2
1026 define <16 x half> @test_mask_sqrt_ph_256(<16 x half> %a0, <16 x half> %passthru, i16 %mask) {
1027 ; CHECK-LABEL: test_mask_sqrt_ph_256:
1028 ; CHECK:       # %bb.0:
1029 ; CHECK-NEXT:    kmovd %edi, %k1
1030 ; CHECK-NEXT:    vsqrtph %ymm0, %ymm1 {%k1}
1031 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
1032 ; CHECK-NEXT:    retq
1033   %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)
1034   %2 = bitcast i16 %mask to <16 x i1>
1035   %3 = select <16 x i1> %2, <16 x half> %1, <16 x half> %passthru
1036   ret <16 x half> %3
1039 define <16 x half> @test_maskz_sqrt_ph_256(<16 x half> %a0, i16 %mask) {
1040 ; CHECK-LABEL: test_maskz_sqrt_ph_256:
1041 ; CHECK:       # %bb.0:
1042 ; CHECK-NEXT:    kmovd %edi, %k1
1043 ; CHECK-NEXT:    vsqrtph %ymm0, %ymm0 {%k1} {z}
1044 ; CHECK-NEXT:    retq
1045   %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)
1046   %2 = bitcast i16 %mask to <16 x i1>
1047   %3 = select <16 x i1> %2, <16 x half> %1, <16 x half> zeroinitializer
1048   ret <16 x half> %3
1051 declare <8 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.128(<8 x half>, <8 x half>, i8)
1052 declare <16 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.256(<16 x half>, <16 x half>, i16)
1054 define <8 x half> @test_rsqrt_ph_128(<8 x half> %a0) {
1055 ; CHECK-LABEL: test_rsqrt_ph_128:
1056 ; CHECK:       # %bb.0:
1057 ; CHECK-NEXT:    vrsqrtph %xmm0, %xmm0
1058 ; CHECK-NEXT:    retq
1059   %res = call <8 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.128(<8 x half> %a0, <8 x half> zeroinitializer, i8 -1)
1060   ret <8 x half> %res
1063 define <16 x half> @test_rsqrt_ph_256(<16 x half> %a0) {
1064 ; CHECK-LABEL: test_rsqrt_ph_256:
1065 ; CHECK:       # %bb.0:
1066 ; CHECK-NEXT:    vrsqrtph %ymm0, %ymm0
1067 ; CHECK-NEXT:    retq
1068   %res = call <16 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.256(<16 x half> %a0, <16 x half> zeroinitializer, i16 -1)
1069   ret <16 x half> %res
1072 declare <8 x half> @llvm.x86.avx512fp16.mask.rcp.ph.128(<8 x half>, <8 x half>, i8)
1073 declare <16 x half> @llvm.x86.avx512fp16.mask.rcp.ph.256(<16 x half>, <16 x half>, i16)
1075 define <8 x half> @test_rcp_ph_128(<8 x half> %a0, <8 x half> %a1, i8 %mask) {
1076 ; CHECK-LABEL: test_rcp_ph_128:
1077 ; CHECK:       # %bb.0:
1078 ; CHECK-NEXT:    kmovd %edi, %k1
1079 ; CHECK-NEXT:    vrcpph %xmm0, %xmm1 {%k1}
1080 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
1081 ; CHECK-NEXT:    retq
1082   %res = call <8 x half> @llvm.x86.avx512fp16.mask.rcp.ph.128(<8 x half> %a0, <8 x half> %a1, i8 %mask)
1083   ret <8 x half> %res
1086 define <16 x half> @test_rcp_ph_256(<16 x half> %a0, <16 x half> %a1, i16 %mask) {
1087 ; CHECK-LABEL: test_rcp_ph_256:
1088 ; CHECK:       # %bb.0:
1089 ; CHECK-NEXT:    kmovd %edi, %k1
1090 ; CHECK-NEXT:    vrcpph %ymm0, %ymm1 {%k1}
1091 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
1092 ; CHECK-NEXT:    retq
1093   %res = call <16 x half> @llvm.x86.avx512fp16.mask.rcp.ph.256(<16 x half> %a0, <16 x half> %a1, i16 %mask)
1094   ret <16 x half> %res
1097 declare <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half>, i32, <8 x half>, i8)
1098 declare <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half>, i32, <16 x half>, i16)
1100 define <8 x half>@test_int_x86_avx512_mask_reduce_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {
1101 ; CHECK-LABEL: test_int_x86_avx512_mask_reduce_ph_128:
1102 ; CHECK:       # %bb.0:
1103 ; CHECK-NEXT:    kmovd %edi, %k1
1104 ; CHECK-NEXT:    vreduceph $8, %xmm0, %xmm1 {%k1}
1105 ; CHECK-NEXT:    vreduceph $4, %xmm0, %xmm0
1106 ; CHECK-NEXT:    vaddph %xmm0, %xmm1, %xmm0
1107 ; CHECK-NEXT:    retq
1108   %res = call <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)
1109   %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)
1110   %res2 = fadd <8 x half> %res, %res1
1111   ret <8 x half> %res2
1114 define <16 x half>@test_int_x86_avx512_mask_reduce_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {
1115 ; CHECK-LABEL: test_int_x86_avx512_mask_reduce_ph_256:
1116 ; CHECK:       # %bb.0:
1117 ; CHECK-NEXT:    kmovd %edi, %k1
1118 ; CHECK-NEXT:    vreduceph $8, %ymm0, %ymm1 {%k1}
1119 ; CHECK-NEXT:    vreduceph $4, %ymm0, %ymm0
1120 ; CHECK-NEXT:    vaddph %ymm0, %ymm1, %ymm0
1121 ; CHECK-NEXT:    retq
1122   %res = call <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)
1123   %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)
1124   %res2 = fadd <16 x half> %res, %res1
1125   ret <16 x half> %res2
1128 declare <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half>, i32)
1129 declare <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half>, i32)
1131 define i8 @test_int_x86_avx512_fpclass_ph_128(<8 x half> %x0) {
1132 ; CHECK-LABEL: test_int_x86_avx512_fpclass_ph_128:
1133 ; CHECK:       # %bb.0:
1134 ; CHECK-NEXT:    vfpclassph $2, %xmm0, %k1
1135 ; CHECK-NEXT:    vfpclassph $4, %xmm0, %k0 {%k1}
1136 ; CHECK-NEXT:    kmovd %k0, %eax
1137 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
1138 ; CHECK-NEXT:    retq
1139   %res = call <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half> %x0, i32 4)
1140   %res1 = call <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half> %x0, i32 2)
1141   %1 = and <8 x i1> %res1, %res
1142   %2 = bitcast <8 x i1> %1 to i8
1143   ret i8 %2
1146 define i16 @test_int_x86_avx512_fpclass_ph_256(<16 x half> %x0) {
1147 ; CHECK-LABEL: test_int_x86_avx512_fpclass_ph_256:
1148 ; CHECK:       # %bb.0:
1149 ; CHECK-NEXT:    vfpclassph $2, %ymm0, %k1
1150 ; CHECK-NEXT:    vfpclassph $4, %ymm0, %k0 {%k1}
1151 ; CHECK-NEXT:    kmovd %k0, %eax
1152 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1153 ; CHECK-NEXT:    vzeroupper
1154 ; CHECK-NEXT:    retq
1155   %res = call <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half> %x0, i32 4)
1156   %res1 = call <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half> %x0, i32 2)
1157   %1 = and <16 x i1> %res1, %res
1158   %2 = bitcast <16 x i1> %1 to i16
1159   ret i16 %2
1162 declare <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half>, <8 x half>, i8)
1163 declare <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half>, <16 x half>, i16)
1165 define <8 x half>@test_int_x86_avx512_getexp_ph_128(<8 x half> %x0) {
1166 ; CHECK-LABEL: test_int_x86_avx512_getexp_ph_128:
1167 ; CHECK:       # %bb.0:
1168 ; CHECK-NEXT:    vgetexpph %xmm0, %xmm0
1169 ; CHECK-NEXT:    retq
1170   %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> zeroinitializer, i8 -1)
1171   ret <8 x half> %res
1174 define <8 x half>@test_int_x86_avx512_mask_getexp_ph_128(<8 x half> %x0, <8 x half> %x1, i8 %x2) {
1175 ; CHECK-LABEL: test_int_x86_avx512_mask_getexp_ph_128:
1176 ; CHECK:       # %bb.0:
1177 ; CHECK-NEXT:    kmovd %edi, %k1
1178 ; CHECK-NEXT:    vgetexpph %xmm0, %xmm1 {%k1}
1179 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
1180 ; CHECK-NEXT:    retq
1181   %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> %x1, i8 %x2)
1182   ret <8 x half> %res
1185 define <8 x half>@test_int_x86_avx512_maskz_getexp_ph_128(<8 x half> %x0, i8 %x2) {
1186 ; CHECK-LABEL: test_int_x86_avx512_maskz_getexp_ph_128:
1187 ; CHECK:       # %bb.0:
1188 ; CHECK-NEXT:    kmovd %edi, %k1
1189 ; CHECK-NEXT:    vgetexpph %xmm0, %xmm0 {%k1} {z}
1190 ; CHECK-NEXT:    retq
1191   %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> zeroinitializer, i8 %x2)
1192   ret <8 x half> %res
1195 define <16 x half>@test_int_x86_avx512_getexp_ph_256(<16 x half> %x0) {
1196 ; CHECK-LABEL: test_int_x86_avx512_getexp_ph_256:
1197 ; CHECK:       # %bb.0:
1198 ; CHECK-NEXT:    vgetexpph %ymm0, %ymm0
1199 ; CHECK-NEXT:    retq
1200   %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> zeroinitializer, i16 -1)
1201   ret <16 x half> %res
1204 define <16 x half>@test_int_x86_avx512_mask_getexp_ph_256(<16 x half> %x0, <16 x half> %x1, i16 %x2) {
1205 ; CHECK-LABEL: test_int_x86_avx512_mask_getexp_ph_256:
1206 ; CHECK:       # %bb.0:
1207 ; CHECK-NEXT:    kmovd %edi, %k1
1208 ; CHECK-NEXT:    vgetexpph %ymm0, %ymm1 {%k1}
1209 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
1210 ; CHECK-NEXT:    retq
1211   %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> %x1, i16 %x2)
1212   ret <16 x half> %res
1215 define <16 x half>@test_int_x86_avx512_maskz_getexp_ph_256(<16 x half> %x0, i16 %x2) {
1216 ; CHECK-LABEL: test_int_x86_avx512_maskz_getexp_ph_256:
1217 ; CHECK:       # %bb.0:
1218 ; CHECK-NEXT:    kmovd %edi, %k1
1219 ; CHECK-NEXT:    vgetexpph %ymm0, %ymm0 {%k1} {z}
1220 ; CHECK-NEXT:    retq
1221   %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> zeroinitializer, i16 %x2)
1222   ret <16 x half> %res
1225 declare <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half>, i32, <8 x half>, i8)
1226 declare <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half>, i32, <16 x half>, i16)
1228 define <8 x half>@test_int_x86_avx512_mask_getmant_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {
1229 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ph_128:
1230 ; CHECK:       # %bb.0:
1231 ; CHECK-NEXT:    kmovd %edi, %k1
1232 ; CHECK-NEXT:    vgetmantph $8, %xmm0, %xmm1 {%k1}
1233 ; CHECK-NEXT:    vgetmantph $4, %xmm0, %xmm0
1234 ; CHECK-NEXT:    vaddph %xmm0, %xmm1, %xmm0
1235 ; CHECK-NEXT:    retq
1236   %res = call <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)
1237   %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)
1238   %res2 = fadd <8 x half> %res, %res1
1239   ret <8 x half> %res2
1242 define <16 x half>@test_int_x86_avx512_mask_getmant_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {
1243 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ph_256:
1244 ; CHECK:       # %bb.0:
1245 ; CHECK-NEXT:    kmovd %edi, %k1
1246 ; CHECK-NEXT:    vgetmantph $8, %ymm0, %ymm1 {%k1}
1247 ; CHECK-NEXT:    vgetmantph $4, %ymm0, %ymm0
1248 ; CHECK-NEXT:    vaddph %ymm0, %ymm1, %ymm0
1249 ; CHECK-NEXT:    retq
1250   %res = call <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)
1251   %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)
1252   %res2 = fadd <16 x half> %res, %res1
1253   ret <16 x half> %res2
1256 declare <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half>, i32, <8 x half>, i8)
1257 declare <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half>, i32, <16 x half>, i16)
1259 define <8 x half>@test_int_x86_avx512_mask_rndscale_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {
1260 ; CHECK-LABEL: test_int_x86_avx512_mask_rndscale_ph_128:
1261 ; CHECK:       # %bb.0:
1262 ; CHECK-NEXT:    kmovd %edi, %k1
1263 ; CHECK-NEXT:    vrndscaleph $8, %xmm0, %xmm1 {%k1}
1264 ; CHECK-NEXT:    vrndscaleph $4, %xmm0, %xmm0
1265 ; CHECK-NEXT:    vaddph %xmm0, %xmm1, %xmm0
1266 ; CHECK-NEXT:    retq
1267   %res = call <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)
1268   %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)
1269   %res2 = fadd <8 x half> %res, %res1
1270   ret <8 x half> %res2
1273 define <16 x half>@test_int_x86_avx512_mask_rndscale_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {
1274 ; CHECK-LABEL: test_int_x86_avx512_mask_rndscale_ph_256:
1275 ; CHECK:       # %bb.0:
1276 ; CHECK-NEXT:    kmovd %edi, %k1
1277 ; CHECK-NEXT:    vrndscaleph $8, %ymm0, %ymm1 {%k1}
1278 ; CHECK-NEXT:    vrndscaleph $4, %ymm0, %ymm0
1279 ; CHECK-NEXT:    vaddph %ymm0, %ymm1, %ymm0
1280 ; CHECK-NEXT:    retq
1281   %res = call <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)
1282   %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)
1283   %res2 = fadd <16 x half> %res, %res1
1284   ret <16 x half> %res2
1287 declare <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half>, <8 x half>, <8 x half>, i8)
1288 declare <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half>, <16 x half>, <16 x half>, i16)
1290 define <8 x half>@test_int_x86_avx512_scalef_ph_128(<8 x half> %x0, <8 x half> %x1) {
1291 ; CHECK-LABEL: test_int_x86_avx512_scalef_ph_128:
1292 ; CHECK:       # %bb.0:
1293 ; CHECK-NEXT:    vscalefph %xmm1, %xmm0, %xmm0
1294 ; CHECK-NEXT:    retq
1295   %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> zeroinitializer, i8 -1)
1296   ret <8 x half> %res
1299 define <8 x half>@test_int_x86_avx512_mask_scalef_ph_128(<8 x half> %x0, <8 x half> %x1, <8 x half> %x2, i8 %x3) {
1300 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ph_128:
1301 ; CHECK:       # %bb.0:
1302 ; CHECK-NEXT:    kmovd %edi, %k1
1303 ; CHECK-NEXT:    vscalefph %xmm1, %xmm0, %xmm2 {%k1}
1304 ; CHECK-NEXT:    vmovaps %xmm2, %xmm0
1305 ; CHECK-NEXT:    retq
1306   %mask = bitcast i8 %x3 to <8 x i1>
1307   %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> %x2, i8 %x3)
1308   ret <8 x half> %res
1311 define <8 x half>@test_int_x86_avx512_maskz_scalef_ph_128(<8 x half> %x0, <8 x half> %x1, i8 %x3) {
1312 ; CHECK-LABEL: test_int_x86_avx512_maskz_scalef_ph_128:
1313 ; CHECK:       # %bb.0:
1314 ; CHECK-NEXT:    kmovd %edi, %k1
1315 ; CHECK-NEXT:    vscalefph %xmm1, %xmm0, %xmm0 {%k1} {z}
1316 ; CHECK-NEXT:    retq
1317   %mask = bitcast i8 %x3 to <8 x i1>
1318   %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> zeroinitializer, i8 %x3)
1319   ret <8 x half> %res
1322 define <16 x half>@test_int_x86_avx512_scalef_ph_256(<16 x half> %x0, <16 x half> %x1) {
1323 ; CHECK-LABEL: test_int_x86_avx512_scalef_ph_256:
1324 ; CHECK:       # %bb.0:
1325 ; CHECK-NEXT:    vscalefph %ymm1, %ymm0, %ymm0
1326 ; CHECK-NEXT:    retq
1327   %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> zeroinitializer, i16 -1)
1328   ret <16 x half> %res
1331 define <16 x half>@test_int_x86_avx512_mask_scalef_ph_256(<16 x half> %x0, <16 x half> %x1, <16 x half> %x2, i16 %x3) {
1332 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ph_256:
1333 ; CHECK:       # %bb.0:
1334 ; CHECK-NEXT:    kmovd %edi, %k1
1335 ; CHECK-NEXT:    vscalefph %ymm1, %ymm0, %ymm2 {%k1}
1336 ; CHECK-NEXT:    vmovaps %ymm2, %ymm0
1337 ; CHECK-NEXT:    retq
1338   %mask = bitcast i16 %x3 to <16 x i1>
1339   %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> %x2, i16 %x3)
1340   ret <16 x half> %res
1343 define <16 x half>@test_int_x86_avx512_maskz_scalef_ph_256(<16 x half> %x0, <16 x half> %x1, i16 %x3) {
1344 ; CHECK-LABEL: test_int_x86_avx512_maskz_scalef_ph_256:
1345 ; CHECK:       # %bb.0:
1346 ; CHECK-NEXT:    kmovd %edi, %k1
1347 ; CHECK-NEXT:    vscalefph %ymm1, %ymm0, %ymm0 {%k1} {z}
1348 ; CHECK-NEXT:    retq
1349   %mask = bitcast i16 %x3 to <16 x i1>
1350   %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> zeroinitializer, i16 %x3)
1351   ret <16 x half> %res