[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512fp16-arith.ll
blob77cab3d1512cae03881249fd2976ff70ac50e896
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx -mattr=+avx512fp16 | FileCheck %s
4 define <32 x half> @vaddph_512_test(<32 x half> %i, <32 x half> %j) nounwind readnone {
5 ; CHECK-LABEL: vaddph_512_test:
6 ; CHECK:       ## %bb.0:
7 ; CHECK-NEXT:    vaddph %zmm1, %zmm0, %zmm0
8 ; CHECK-NEXT:    retq
9   %x = fadd  <32 x half> %i, %j
10   ret <32 x half> %x
13 define <32 x half> @vaddph_512_fold_test(<32 x half> %i, ptr %j) nounwind {
14 ; CHECK-LABEL: vaddph_512_fold_test:
15 ; CHECK:       ## %bb.0:
16 ; CHECK-NEXT:    vaddph (%rdi), %zmm0, %zmm0
17 ; CHECK-NEXT:    retq
18   %tmp = load <32 x half>, ptr %j, align 4
19   %x = fadd  <32 x half> %i, %tmp
20   ret <32 x half> %x
23 define <32 x half> @vaddph_512_broadc_test(<32 x half> %a) nounwind {
24 ; CHECK-LABEL: vaddph_512_broadc_test:
25 ; CHECK:       ## %bb.0:
26 ; CHECK-NEXT:    vaddph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to32}, %zmm0, %zmm0
27 ; CHECK-NEXT:    retq
28   %b = fadd <32 x half> %a, <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>
29   ret <32 x half> %b
32 define <16 x half> @vaddph_256_broadc_test(<16 x half> %a) nounwind {
33 ; CHECK-LABEL: vaddph_256_broadc_test:
34 ; CHECK:       ## %bb.0:
35 ; CHECK-NEXT:    vaddph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %ymm0, %ymm0
36 ; CHECK-NEXT:    retq
37   %b = fadd <16 x half> %a, <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>
38   ret <16 x half> %b
41 define <8 x half> @vaddph_128_broadc_test(<8 x half> %a) nounwind {
42 ; CHECK-LABEL: vaddph_128_broadc_test:
43 ; CHECK:       ## %bb.0:
44 ; CHECK-NEXT:    vaddph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %xmm0, %xmm0
45 ; CHECK-NEXT:    retq
46   %b = fadd <8 x half> %a, <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>
47   ret <8 x half> %b
50 define <32 x half> @vaddph_512_mask_test1(<32 x half> %i, <32 x half> %j, <32 x i1> %mask) nounwind readnone {
51 ; CHECK-LABEL: vaddph_512_mask_test1:
52 ; CHECK:       ## %bb.0:
53 ; CHECK-NEXT:    vpsllw $7, %ymm2, %ymm2
54 ; CHECK-NEXT:    vpmovb2m %ymm2, %k1
55 ; CHECK-NEXT:    vaddph %zmm1, %zmm0, %zmm0 {%k1}
56 ; CHECK-NEXT:    retq
57   %x = fadd  <32 x half> %i, %j
58   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> %i
59   ret <32 x half> %r
62 define <32 x half> @vaddph_512_mask_test(<32 x half> %i, <32 x half> %j, <32 x half> %mask1) nounwind readnone {
63 ; CHECK-LABEL: vaddph_512_mask_test:
64 ; CHECK:       ## %bb.0:
65 ; CHECK-NEXT:    vxorps %xmm3, %xmm3, %xmm3
66 ; CHECK-NEXT:    vcmpneq_oqph %zmm3, %zmm2, %k1
67 ; CHECK-NEXT:    vaddph %zmm1, %zmm0, %zmm0 {%k1}
68 ; CHECK-NEXT:    retq
69   %mask = fcmp one <32 x half> %mask1, zeroinitializer
70   %x = fadd  <32 x half> %i, %j
71   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> %i
72   ret <32 x half> %r
75 define <32 x half> @vaddph_512_maskz_test(<32 x half> %i, <32 x half> %j, <32 x half> %mask1) nounwind readnone {
76 ; CHECK-LABEL: vaddph_512_maskz_test:
77 ; CHECK:       ## %bb.0:
78 ; CHECK-NEXT:    vxorps %xmm3, %xmm3, %xmm3
79 ; CHECK-NEXT:    vcmpneq_oqph %zmm3, %zmm2, %k1
80 ; CHECK-NEXT:    vaddph %zmm1, %zmm0, %zmm0 {%k1} {z}
81 ; CHECK-NEXT:    retq
82   %mask = fcmp one <32 x half> %mask1, zeroinitializer
83   %x = fadd  <32 x half> %i, %j
84   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> zeroinitializer
85   ret <32 x half> %r
88 define <32 x half> @vaddph_512_mask_fold_test(<32 x half> %i, ptr %j.ptr, <32 x half> %mask1) nounwind readnone {
89 ; CHECK-LABEL: vaddph_512_mask_fold_test:
90 ; CHECK:       ## %bb.0:
91 ; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
92 ; CHECK-NEXT:    vcmpneq_oqph %zmm2, %zmm1, %k1
93 ; CHECK-NEXT:    vaddph (%rdi), %zmm0, %zmm0 {%k1}
94 ; CHECK-NEXT:    retq
95   %mask = fcmp one <32 x half> %mask1, zeroinitializer
96   %j = load <32 x half>, ptr %j.ptr
97   %x = fadd  <32 x half> %i, %j
98   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> %i
99   ret <32 x half> %r
102 define <32 x half> @vaddph_512_maskz_fold_test(<32 x half> %i, ptr %j.ptr, <32 x half> %mask1) nounwind readnone {
103 ; CHECK-LABEL: vaddph_512_maskz_fold_test:
104 ; CHECK:       ## %bb.0:
105 ; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
106 ; CHECK-NEXT:    vcmpneq_oqph %zmm2, %zmm1, %k1
107 ; CHECK-NEXT:    vaddph (%rdi), %zmm0, %zmm0 {%k1} {z}
108 ; CHECK-NEXT:    retq
109   %mask = fcmp one <32 x half> %mask1, zeroinitializer
110   %j = load <32 x half>, ptr %j.ptr
111   %x = fadd  <32 x half> %i, %j
112   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> zeroinitializer
113   ret <32 x half> %r
116 define <32 x half> @vaddph_512_maskz_fold_test_2(<32 x half> %i, ptr %j.ptr, <32 x half> %mask1) nounwind readnone {
117 ; CHECK-LABEL: vaddph_512_maskz_fold_test_2:
118 ; CHECK:       ## %bb.0:
119 ; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
120 ; CHECK-NEXT:    vcmpneq_oqph %zmm2, %zmm1, %k1
121 ; CHECK-NEXT:    vaddph (%rdi), %zmm0, %zmm0 {%k1} {z}
122 ; CHECK-NEXT:    retq
123   %mask = fcmp one <32 x half> %mask1, zeroinitializer
124   %j = load <32 x half>, ptr %j.ptr
125   %x = fadd  <32 x half> %j, %i
126   %r = select <32 x i1> %mask, <32 x half> %x, <32 x half> zeroinitializer
127   ret <32 x half> %r
130 define <32 x half> @vsubph_512_test(<32 x half> %i, <32 x half> %j) nounwind readnone {
131 ; CHECK-LABEL: vsubph_512_test:
132 ; CHECK:       ## %bb.0:
133 ; CHECK-NEXT:    vsubph %zmm1, %zmm0, %zmm0
134 ; CHECK-NEXT:    retq
135   %x = fsub  <32 x half> %i, %j
136   ret <32 x half> %x
139 define <32 x half> @vmulph_512_test(<32 x half> %i, <32 x half> %j) nounwind readnone {
140 ; CHECK-LABEL: vmulph_512_test:
141 ; CHECK:       ## %bb.0:
142 ; CHECK-NEXT:    vmulph %zmm1, %zmm0, %zmm0
143 ; CHECK-NEXT:    retq
144   %x = fmul  <32 x half> %i, %j
145   ret <32 x half> %x
148 define <32 x half> @vdivph_512_test(<32 x half> %i, <32 x half> %j) nounwind readnone {
149 ; CHECK-LABEL: vdivph_512_test:
150 ; CHECK:       ## %bb.0:
151 ; CHECK-NEXT:    vdivph %zmm1, %zmm0, %zmm0
152 ; CHECK-NEXT:    retq
153   %x = fdiv  <32 x half> %i, %j
154   ret <32 x half> %x
157 define <32 x half> @vdivph_512_test_fast(<32 x half> %i, <32 x half> %j) nounwind readnone {
158 ; CHECK-LABEL: vdivph_512_test_fast:
159 ; CHECK:       ## %bb.0:
160 ; CHECK-NEXT:    vrcpph %zmm1, %zmm1
161 ; CHECK-NEXT:    vmulph %zmm0, %zmm1, %zmm0
162 ; CHECK-NEXT:    retq
163   %x = fdiv fast <32 x half> %i, %j
164   ret <32 x half> %x
167 define half @add_sh(half %i, half %j, ptr %x.ptr) nounwind readnone {
168 ; CHECK-LABEL: add_sh:
169 ; CHECK:       ## %bb.0:
170 ; CHECK-NEXT:    vaddsh %xmm1, %xmm0, %xmm0
171 ; CHECK-NEXT:    vaddsh (%rdi), %xmm0, %xmm0
172 ; CHECK-NEXT:    retq
173   %x = load half, ptr %x.ptr
174   %y = fadd  half %i, %j
175   %r = fadd  half %x, %y
176   ret half %r
179 define half @sub_sh(half %i, half %j, ptr %x.ptr) nounwind readnone {
180 ; CHECK-LABEL: sub_sh:
181 ; CHECK:       ## %bb.0:
182 ; CHECK-NEXT:    vmovsh (%rdi), %xmm2
183 ; CHECK-NEXT:    vsubsh %xmm1, %xmm0, %xmm0
184 ; CHECK-NEXT:    vsubsh %xmm0, %xmm2, %xmm0
185 ; CHECK-NEXT:    retq
186   %x = load half, ptr %x.ptr
187   %y = fsub  half %i, %j
188   %r = fsub  half %x, %y
189   ret half %r
192 define half @sub_sh_2(half %i, half %j, ptr %x.ptr) nounwind readnone {
193 ; CHECK-LABEL: sub_sh_2:
194 ; CHECK:       ## %bb.0:
195 ; CHECK-NEXT:    vsubsh %xmm1, %xmm0, %xmm0
196 ; CHECK-NEXT:    vsubsh (%rdi), %xmm0, %xmm0
197 ; CHECK-NEXT:    retq
198   %x = load half, ptr %x.ptr
199   %y = fsub  half %i, %j
200   %r = fsub  half %y, %x
201   ret half %r
204 define half @mul_sh(half %i, half %j, ptr %x.ptr) nounwind readnone {
205 ; CHECK-LABEL: mul_sh:
206 ; CHECK:       ## %bb.0:
207 ; CHECK-NEXT:    vmulsh %xmm1, %xmm0, %xmm0
208 ; CHECK-NEXT:    vmulsh (%rdi), %xmm0, %xmm0
209 ; CHECK-NEXT:    retq
210   %x = load half, ptr %x.ptr
211   %y = fmul  half %i, %j
212   %r = fmul  half %x, %y
213   ret half %r
216 define half @div_sh(half %i, half %j, ptr %x.ptr) nounwind readnone {
217 ; CHECK-LABEL: div_sh:
218 ; CHECK:       ## %bb.0:
219 ; CHECK-NEXT:    vmovsh (%rdi), %xmm2
220 ; CHECK-NEXT:    vdivsh %xmm1, %xmm0, %xmm0
221 ; CHECK-NEXT:    vdivsh %xmm0, %xmm2, %xmm0
222 ; CHECK-NEXT:    retq
223   %x = load half, ptr %x.ptr
224   %y = fdiv  half %i, %j
225   %r = fdiv  half %x, %y
226   ret half %r
229 define half @div_sh_2(half %i, half %j, ptr %x.ptr) nounwind readnone {
230 ; CHECK-LABEL: div_sh_2:
231 ; CHECK:       ## %bb.0:
232 ; CHECK-NEXT:    vdivsh %xmm1, %xmm0, %xmm0
233 ; CHECK-NEXT:    vdivsh (%rdi), %xmm0, %xmm0
234 ; CHECK-NEXT:    retq
235   %x = load half, ptr %x.ptr
236   %y = fdiv  half %i, %j
237   %r = fdiv  half %y, %x
238   ret half %r
241 define half @div_sh_3(half %i, half %j) nounwind readnone {
242 ; CHECK-LABEL: div_sh_3:
243 ; CHECK:       ## %bb.0:
244 ; CHECK-NEXT:    vrcpsh %xmm1, %xmm1, %xmm1
245 ; CHECK-NEXT:    vmulsh %xmm0, %xmm1, %xmm0
246 ; CHECK-NEXT:    retq
247   %r = fdiv fast half %i, %j
248   ret half %r
251 define i1 @cmp_une_sh(half %x, half %y) {
252 ; CHECK-LABEL: cmp_une_sh:
253 ; CHECK:       ## %bb.0: ## %entry
254 ; CHECK-NEXT:    vcmpneqsh %xmm1, %xmm0, %k0
255 ; CHECK-NEXT:    kmovd %k0, %eax
256 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
257 ; CHECK-NEXT:    retq
258 entry:
259   %0 = fcmp une half %x, %y
260   ret i1 %0
263 define i1 @cmp_oeq_sh(half %x, half %y) {
264 ; CHECK-LABEL: cmp_oeq_sh:
265 ; CHECK:       ## %bb.0: ## %entry
266 ; CHECK-NEXT:    vcmpeqsh %xmm1, %xmm0, %k0
267 ; CHECK-NEXT:    kmovd %k0, %eax
268 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
269 ; CHECK-NEXT:    retq
270 entry:
271   %0 = fcmp oeq half %x, %y
272   ret i1 %0
275 define i1 @cmp_olt_sh(half %x, half %y) {
276 ; CHECK-LABEL: cmp_olt_sh:
277 ; CHECK:       ## %bb.0: ## %entry
278 ; CHECK-NEXT:    vucomish %xmm0, %xmm1
279 ; CHECK-NEXT:    seta %al
280 ; CHECK-NEXT:    retq
281   entry:
282   %0 = fcmp olt half %x, %y
283   ret i1 %0
286 define <32 x i1> @cmp_ph(<32 x half> %x, <32 x half> %y) {
287 ; CHECK-LABEL: cmp_ph:
288 ; CHECK:       ## %bb.0: ## %entry
289 ; CHECK-NEXT:    vcmpneqph %zmm1, %zmm0, %k0
290 ; CHECK-NEXT:    vpmovm2b %k0, %ymm0
291 ; CHECK-NEXT:    retq
292 entry:
293   %0 = fcmp une <32 x half> %x, %y
294   ret <32 x i1> %0
297 define half @fneg(half %x) {
298 ; CHECK-LABEL: fneg:
299 ; CHECK:       ## %bb.0:
300 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
301 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
302 ; CHECK-NEXT:    retq
303   %a = fneg half %x
304   ret half %a
307 define half @fneg_idiom(half %x) {
308 ; CHECK-LABEL: fneg_idiom:
309 ; CHECK:       ## %bb.0:
310 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
311 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
312 ; CHECK-NEXT:    retq
313   %a = fsub half -0.0, %x
314   ret half %a
317 define half @fabs(half %x) {
318 ; CHECK-LABEL: fabs:
319 ; CHECK:       ## %bb.0:
320 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
321 ; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0
322 ; CHECK-NEXT:    retq
323   %a = call half @llvm.fabs.f16(half %x)
324   ret half %a
326 declare half @llvm.fabs.f16(half)
328 define half @fcopysign(half %x, half %y) {
329 ; CHECK-LABEL: fcopysign:
330 ; CHECK:       ## %bb.0:
331 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
332 ; CHECK-NEXT:    vpternlogq $226, %xmm1, %xmm2, %xmm0
333 ; CHECK-NEXT:    retq
334   %a = call half @llvm.copysign.f16(half %x, half %y)
335   ret half %a
337 declare half @llvm.copysign.f16(half, half)
339 define half @fround(half %x) {
340 ; CHECK-LABEL: fround:
341 ; CHECK:       ## %bb.0:
342 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
343 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1]
344 ; CHECK-NEXT:    vpternlogq $248, %xmm1, %xmm0, %xmm2
345 ; CHECK-NEXT:    vaddsh %xmm2, %xmm0, %xmm0
346 ; CHECK-NEXT:    vrndscalesh $11, %xmm0, %xmm0, %xmm0
347 ; CHECK-NEXT:    retq
348   %a = call half @llvm.round.f16(half %x)
349   ret half %a
351 declare half @llvm.round.f16(half)
353 define <8 x half> @fnegv8f16(<8 x half> %x) {
354 ; CHECK-LABEL: fnegv8f16:
355 ; CHECK:       ## %bb.0:
356 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
357 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
358 ; CHECK-NEXT:    retq
359   %a = fneg <8 x half> %x
360   ret <8 x half> %a
363 define <8 x half> @fneg_idiomv8f16(<8 x half> %x) {
364 ; CHECK-LABEL: fneg_idiomv8f16:
365 ; CHECK:       ## %bb.0:
366 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
367 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
368 ; CHECK-NEXT:    retq
369   %a = fsub <8 x half> <half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0>, %x
370   ret <8 x half> %a
373 define <8 x half> @fabsv8f16(<8 x half> %x) {
374 ; CHECK-LABEL: fabsv8f16:
375 ; CHECK:       ## %bb.0:
376 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
377 ; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0
378 ; CHECK-NEXT:    retq
379   %a = call <8 x half> @llvm.fabs.v8f16(<8 x half> %x)
380   ret <8 x half> %a
382 declare <8 x half> @llvm.fabs.v8f16(<8 x half>)
384 define <8 x half> @fcopysignv8f16(<8 x half> %x, <8 x half> %y) {
385 ; CHECK-LABEL: fcopysignv8f16:
386 ; CHECK:       ## %bb.0:
387 ; CHECK-NEXT:    vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm0
388 ; CHECK-NEXT:    retq
389   %a = call <8 x half> @llvm.copysign.v8f16(<8 x half> %x, <8 x half> %y)
390   ret <8 x half> %a
392 declare <8 x half> @llvm.copysign.v8f16(<8 x half>, <8 x half>)
394 define <8 x half> @roundv8f16(<8 x half> %x) {
395 ; CHECK-LABEL: roundv8f16:
396 ; CHECK:       ## %bb.0:
397 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
398 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1]
399 ; CHECK-NEXT:    vpternlogq $248, %xmm1, %xmm0, %xmm2
400 ; CHECK-NEXT:    vaddph %xmm2, %xmm0, %xmm0
401 ; CHECK-NEXT:    vrndscaleph $11, %xmm0, %xmm0
402 ; CHECK-NEXT:    retq
403   %a = call <8 x half> @llvm.round.v8f16(<8 x half> %x)
404   ret <8 x half> %a
406 declare <8 x half> @llvm.round.v8f16(<8 x half>)
408 define <16 x half> @fnegv16f16(<16 x half> %x) {
409 ; CHECK-LABEL: fnegv16f16:
410 ; CHECK:       ## %bb.0:
411 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
412 ; CHECK-NEXT:    vpxor %ymm1, %ymm0, %ymm0
413 ; CHECK-NEXT:    retq
414   %a = fneg <16 x half> %x
415   ret <16 x half> %a
418 define <16 x half> @fneg_idiomv16f16(<16 x half> %x) {
419 ; CHECK-LABEL: fneg_idiomv16f16:
420 ; CHECK:       ## %bb.0:
421 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
422 ; CHECK-NEXT:    vpxor %ymm1, %ymm0, %ymm0
423 ; CHECK-NEXT:    retq
424   %a = fsub <16 x half> <half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0>, %x
425   ret <16 x half> %a
428 define <16 x half> @fabsv16f16(<16 x half> %x) {
429 ; CHECK-LABEL: fabsv16f16:
430 ; CHECK:       ## %bb.0:
431 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
432 ; CHECK-NEXT:    vpand %ymm1, %ymm0, %ymm0
433 ; CHECK-NEXT:    retq
434   %a = call <16 x half> @llvm.fabs.v16f16(<16 x half> %x)
435   ret <16 x half> %a
437 declare <16 x half> @llvm.fabs.v16f16(<16 x half>)
439 define <16 x half> @fcopysignv16f16(<16 x half> %x, <16 x half> %y) {
440 ; CHECK-LABEL: fcopysignv16f16:
441 ; CHECK:       ## %bb.0:
442 ; CHECK-NEXT:    vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm0
443 ; CHECK-NEXT:    retq
444   %a = call <16 x half> @llvm.copysign.v16f16(<16 x half> %x, <16 x half> %y)
445   ret <16 x half> %a
447 declare <16 x half> @llvm.copysign.v16f16(<16 x half>, <16 x half>)
449 define <16 x half> @roundv16f16(<16 x half> %x) {
450 ; CHECK-LABEL: roundv16f16:
451 ; CHECK:       ## %bb.0:
452 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
453 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1]
454 ; CHECK-NEXT:    vpternlogq $248, %ymm1, %ymm0, %ymm2
455 ; CHECK-NEXT:    vaddph %ymm2, %ymm0, %ymm0
456 ; CHECK-NEXT:    vrndscaleph $11, %ymm0, %ymm0
457 ; CHECK-NEXT:    retq
458   %a = call <16 x half> @llvm.round.v16f16(<16 x half> %x)
459   ret <16 x half> %a
461 declare <16 x half> @llvm.round.v16f16(<16 x half>)
463 define <32 x half> @fnegv32f16(<32 x half> %x) {
464 ; CHECK-LABEL: fnegv32f16:
465 ; CHECK:       ## %bb.0:
466 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} zmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
467 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
468 ; CHECK-NEXT:    retq
469   %a = fneg <32 x half> %x
470   ret <32 x half> %a
473 define <32 x half> @fneg_idiomv32f16(<32 x half> %x) {
474 ; CHECK-LABEL: fneg_idiomv32f16:
475 ; CHECK:       ## %bb.0:
476 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} zmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
477 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
478 ; CHECK-NEXT:    retq
479   %a = fsub <32 x half> <half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0, half -0.0>, %x
480   ret <32 x half> %a
483 define <32 x half> @fabsv32f16(<32 x half> %x) {
484 ; CHECK-LABEL: fabsv32f16:
485 ; CHECK:       ## %bb.0:
486 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} zmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
487 ; CHECK-NEXT:    vpandq %zmm1, %zmm0, %zmm0
488 ; CHECK-NEXT:    retq
489   %a = call <32 x half> @llvm.fabs.v32f16(<32 x half> %x)
490   ret <32 x half> %a
492 declare <32 x half> @llvm.fabs.v32f16(<32 x half>)
494 define <32 x half> @fcopysignv32f16(<32 x half> %x, <32 x half> %y) {
495 ; CHECK-LABEL: fcopysignv32f16:
496 ; CHECK:       ## %bb.0:
497 ; CHECK-NEXT:    vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm0
498 ; CHECK-NEXT:    retq
499   %a = call <32 x half> @llvm.copysign.v32f16(<32 x half> %x, <32 x half> %y)
500   ret <32 x half> %a
502 declare <32 x half> @llvm.copysign.v32f16(<32 x half>, <32 x half>)
504 define <32 x half> @roundv32f16(<32 x half> %x) {
505 ; CHECK-LABEL: roundv32f16:
506 ; CHECK:       ## %bb.0:
507 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} zmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
508 ; CHECK-NEXT:    vpbroadcastw {{.*#+}} zmm2 = [4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1,4.9976E-1]
509 ; CHECK-NEXT:    vpternlogq $248, %zmm1, %zmm0, %zmm2
510 ; CHECK-NEXT:    vaddph %zmm2, %zmm0, %zmm0
511 ; CHECK-NEXT:    vrndscaleph $11, %zmm0, %zmm0
512 ; CHECK-NEXT:    retq
513   %a = call <32 x half> @llvm.round.v32f16(<32 x half> %x)
514   ret <32 x half> %a
516 declare <32 x half> @llvm.round.v32f16(<32 x half>)
518 define <8 x half>  @regression_test1(<8 x half> %x, <8 x half> %y) #0 {
519 ; CHECK-LABEL: regression_test1:
520 ; CHECK:       ## %bb.0: ## %entry
521 ; CHECK-NEXT:    vsubph %xmm1, %xmm0, %xmm2
522 ; CHECK-NEXT:    vaddph %xmm1, %xmm0, %xmm0
523 ; CHECK-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7]
524 ; CHECK-NEXT:    retq
525 entry:
526   %a = fsub <8 x half> %x, %y
527   %b = fadd <8 x half> %x, %y
528   %c = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
529   ret <8 x half> %c
532 define <8 x i16>  @regression_test2(<8 x float> %x) #0 {
533 ; CHECK-LABEL: regression_test2:
534 ; CHECK:       ## %bb.0: ## %entry
535 ; CHECK-NEXT:    vcvttps2udq %ymm0, %ymm0
536 ; CHECK-NEXT:    vpmovdw %ymm0, %xmm0
537 ; CHECK-NEXT:    vzeroupper
538 ; CHECK-NEXT:    retq
539 entry:
540   %a = fptoui <8 x float> %x to  <8 x i16>
541   ret <8 x i16> %a
544 define <8 x i16>  @regression_test3(<8 x float> %x) #0 {
545 ; CHECK-LABEL: regression_test3:
546 ; CHECK:       ## %bb.0: ## %entry
547 ; CHECK-NEXT:    vcvttps2dq %ymm0, %ymm0
548 ; CHECK-NEXT:    vpmovdw %ymm0, %xmm0
549 ; CHECK-NEXT:    vzeroupper
550 ; CHECK-NEXT:    retq
551 entry:
552   %a = fptosi <8 x float> %x to  <8 x i16>
553   ret <8 x i16> %a
556 define <8 x i16>  @regression_test4(<8 x double> %x) #0 {
557 ; CHECK-LABEL: regression_test4:
558 ; CHECK:       ## %bb.0: ## %entry
559 ; CHECK-NEXT:    vcvttpd2udq %zmm0, %ymm0
560 ; CHECK-NEXT:    vpmovdw %ymm0, %xmm0
561 ; CHECK-NEXT:    vzeroupper
562 ; CHECK-NEXT:    retq
563 entry:
564   %a = fptoui <8 x double> %x to  <8 x i16>
565   ret <8 x i16> %a
568 define <8 x i16>  @regression_test5(<8 x double> %x) #0 {
569 ; CHECK-LABEL: regression_test5:
570 ; CHECK:       ## %bb.0: ## %entry
571 ; CHECK-NEXT:    vcvttpd2dq %zmm0, %ymm0
572 ; CHECK-NEXT:    vpmovdw %ymm0, %xmm0
573 ; CHECK-NEXT:    vzeroupper
574 ; CHECK-NEXT:    retq
575 entry:
576   %a = fptosi <8 x double> %x to  <8 x i16>
577   ret <8 x i16> %a
580 define <8 x i1> @fcmp_v8f16(<8 x half> %a, <8 x half> %b)
581 ; CHECK-LABEL: fcmp_v8f16:
582 ; CHECK:       ## %bb.0: ## %entry
583 ; CHECK-NEXT:    vcmpeqph %xmm1, %xmm0, %k0
584 ; CHECK-NEXT:    vpmovm2w %k0, %xmm0
585 ; CHECK-NEXT:    retq
587 entry:
588   %0 = fcmp oeq <8 x half> %a, %b
589   ret <8 x i1> %0
592 define <16 x i1> @fcmp_v16f16(<16 x half> %a, <16 x half> %b)
593 ; CHECK-LABEL: fcmp_v16f16:
594 ; CHECK:       ## %bb.0: ## %entry
595 ; CHECK-NEXT:    vcmpeqph %ymm1, %ymm0, %k0
596 ; CHECK-NEXT:    vpmovm2b %k0, %xmm0
597 ; CHECK-NEXT:    vzeroupper
598 ; CHECK-NEXT:    retq
600 entry:
601   %0 = fcmp oeq <16 x half> %a, %b
602   ret <16 x i1> %0
605 define <32 x i1> @fcmp_v32f16(<32 x half> %a, <32 x half> %b)
606 ; CHECK-LABEL: fcmp_v32f16:
607 ; CHECK:       ## %bb.0: ## %entry
608 ; CHECK-NEXT:    vcmpeqph %zmm1, %zmm0, %k0
609 ; CHECK-NEXT:    vpmovm2b %k0, %ymm0
610 ; CHECK-NEXT:    retq
612 entry:
613   %0 = fcmp oeq <32 x half> %a, %b
614   ret <32 x i1> %0
617 define <8 x i16> @zext_fcmp_v8f16(<8 x half> %a, <8 x half> %b)
618 ; CHECK-LABEL: zext_fcmp_v8f16:
619 ; CHECK:       ## %bb.0: ## %entry
620 ; CHECK-NEXT:    vcmpeqph %xmm1, %xmm0, %k0
621 ; CHECK-NEXT:    vpmovm2w %k0, %xmm0
622 ; CHECK-NEXT:    vpsrlw $15, %xmm0, %xmm0
623 ; CHECK-NEXT:    retq
625 entry:
626   %0 = fcmp oeq <8 x half> %a, %b
627   %1 = zext <8 x i1> %0 to <8 x i16>
628   ret <8 x i16> %1
631 define <16 x i16> @zext_fcmp_v16f16(<16 x half> %a, <16 x half> %b)
632 ; CHECK-LABEL: zext_fcmp_v16f16:
633 ; CHECK:       ## %bb.0: ## %entry
634 ; CHECK-NEXT:    vcmpeqph %ymm1, %ymm0, %k0
635 ; CHECK-NEXT:    vpmovm2w %k0, %ymm0
636 ; CHECK-NEXT:    vpsrlw $15, %ymm0, %ymm0
637 ; CHECK-NEXT:    retq
639 entry:
640   %0 = fcmp oeq <16 x half> %a, %b
641   %1 = zext <16 x i1> %0 to <16 x i16>
642   ret <16 x i16> %1
645 define <32 x i16> @zext_fcmp_v32f16(<32 x half> %a, <32 x half> %b)
646 ; CHECK-LABEL: zext_fcmp_v32f16:
647 ; CHECK:       ## %bb.0: ## %entry
648 ; CHECK-NEXT:    vcmpeqph %zmm1, %zmm0, %k0
649 ; CHECK-NEXT:    vpmovm2w %k0, %zmm0
650 ; CHECK-NEXT:    vpsrlw $15, %zmm0, %zmm0
651 ; CHECK-NEXT:    retq
653 entry:
654   %0 = fcmp oeq <32 x half> %a, %b
655   %1 = zext <32 x i1> %0 to <32 x i16>
656   ret <32 x i16> %1