d7da77a5eb546999333011727fd9df367146fb0a
[oota-llvm.git] / test / CodeGen / X86 / avx512-arith.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck --check-prefix=CHECK --check-prefix=AVX512F %s
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512vl | FileCheck --check-prefix=CHECK --check-prefix=AVX512VL %s
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512bw | FileCheck --check-prefix=CHECK --check-prefix=AVX512BW %s
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512dq | FileCheck --check-prefix=CHECK --check-prefix=AVX512DQ %s
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512dq -mattr=+avx512bw -mattr=+avx512vl| FileCheck --check-prefix=CHECK --check-prefix=SKX %s
6
7 define <8 x double> @addpd512(<8 x double> %y, <8 x double> %x) {
8 ; CHECK-LABEL: addpd512:
9 ; CHECK:       ## BB#0: ## %entry
10 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
11 ; CHECK-NEXT:    retq
12 entry:
13   %add.i = fadd <8 x double> %x, %y
14   ret <8 x double> %add.i
15 }
16
17 define <8 x double> @addpd512fold(<8 x double> %y) {
18 ; CHECK-LABEL: addpd512fold:
19 ; CHECK:       ## BB#0: ## %entry
20 ; CHECK-NEXT:    vaddpd {{.*}}(%rip), %zmm0, %zmm0
21 ; CHECK-NEXT:    retq
22 entry:
23   %add.i = fadd <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.800000e+00, double 2.300000e+00, double 1.200000e+00>
24   ret <8 x double> %add.i
25 }
26
27 define <16 x float> @addps512(<16 x float> %y, <16 x float> %x) {
28 ; CHECK-LABEL: addps512:
29 ; CHECK:       ## BB#0: ## %entry
30 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
31 ; CHECK-NEXT:    retq
32 entry:
33   %add.i = fadd <16 x float> %x, %y
34   ret <16 x float> %add.i
35 }
36
37 define <16 x float> @addps512fold(<16 x float> %y) {
38 ; CHECK-LABEL: addps512fold:
39 ; CHECK:       ## BB#0: ## %entry
40 ; CHECK-NEXT:    vaddps {{.*}}(%rip), %zmm0, %zmm0
41 ; CHECK-NEXT:    retq
42 entry:
43   %add.i = fadd <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 4.500000e+00, float 4.500000e+00, float 0x400B333340000000,  float 0x4002666660000000, float 0x3FF3333340000000>
44   ret <16 x float> %add.i
45 }
46
47 define <8 x double> @subpd512(<8 x double> %y, <8 x double> %x) {
48 ; CHECK-LABEL: subpd512:
49 ; CHECK:       ## BB#0: ## %entry
50 ; CHECK-NEXT:    vsubpd %zmm0, %zmm1, %zmm0
51 ; CHECK-NEXT:    retq
52 entry:
53   %sub.i = fsub <8 x double> %x, %y
54   ret <8 x double> %sub.i
55 }
56
57 define <8 x double> @subpd512fold(<8 x double> %y, <8 x double>* %x) {
58 ; CHECK-LABEL: subpd512fold:
59 ; CHECK:       ## BB#0: ## %entry
60 ; CHECK-NEXT:    vsubpd (%rdi), %zmm0, %zmm0
61 ; CHECK-NEXT:    retq
62 entry:
63   %tmp2 = load <8 x double>, <8 x double>* %x, align 8
64   %sub.i = fsub <8 x double> %y, %tmp2
65   ret <8 x double> %sub.i
66 }
67
68 define <16 x float> @subps512(<16 x float> %y, <16 x float> %x) {
69 ; CHECK-LABEL: subps512:
70 ; CHECK:       ## BB#0: ## %entry
71 ; CHECK-NEXT:    vsubps %zmm0, %zmm1, %zmm0
72 ; CHECK-NEXT:    retq
73 entry:
74   %sub.i = fsub <16 x float> %x, %y
75   ret <16 x float> %sub.i
76 }
77
78 define <16 x float> @subps512fold(<16 x float> %y, <16 x float>* %x) {
79 ; CHECK-LABEL: subps512fold:
80 ; CHECK:       ## BB#0: ## %entry
81 ; CHECK-NEXT:    vsubps (%rdi), %zmm0, %zmm0
82 ; CHECK-NEXT:    retq
83 entry:
84   %tmp2 = load <16 x float>, <16 x float>* %x, align 4
85   %sub.i = fsub <16 x float> %y, %tmp2
86   ret <16 x float> %sub.i
87 }
88
89 define <8 x i64> @imulq512(<8 x i64> %y, <8 x i64> %x) {
90 ; AVX512F-LABEL: imulq512:
91 ; AVX512F:       ## BB#0:
92 ; AVX512F-NEXT:    vpmuludq %zmm0, %zmm1, %zmm2
93 ; AVX512F-NEXT:    vpsrlq $32, %zmm0, %zmm3
94 ; AVX512F-NEXT:    vpmuludq %zmm3, %zmm1, %zmm3
95 ; AVX512F-NEXT:    vpsllq $32, %zmm3, %zmm3
96 ; AVX512F-NEXT:    vpaddq %zmm3, %zmm2, %zmm2
97 ; AVX512F-NEXT:    vpsrlq $32, %zmm1, %zmm1
98 ; AVX512F-NEXT:    vpmuludq %zmm0, %zmm1, %zmm0
99 ; AVX512F-NEXT:    vpsllq $32, %zmm0, %zmm0
100 ; AVX512F-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
101 ; AVX512F-NEXT:    retq
102 ;
103 ; AVX512VL-LABEL: imulq512:
104 ; AVX512VL:       ## BB#0:
105 ; AVX512VL-NEXT:    vpmuludq %zmm0, %zmm1, %zmm2
106 ; AVX512VL-NEXT:    vpsrlq $32, %zmm0, %zmm3
107 ; AVX512VL-NEXT:    vpmuludq %zmm3, %zmm1, %zmm3
108 ; AVX512VL-NEXT:    vpsllq $32, %zmm3, %zmm3
109 ; AVX512VL-NEXT:    vpaddq %zmm3, %zmm2, %zmm2
110 ; AVX512VL-NEXT:    vpsrlq $32, %zmm1, %zmm1
111 ; AVX512VL-NEXT:    vpmuludq %zmm0, %zmm1, %zmm0
112 ; AVX512VL-NEXT:    vpsllq $32, %zmm0, %zmm0
113 ; AVX512VL-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
114 ; AVX512VL-NEXT:    retq
115 ;
116 ; AVX512BW-LABEL: imulq512:
117 ; AVX512BW:       ## BB#0:
118 ; AVX512BW-NEXT:    vpmuludq %zmm0, %zmm1, %zmm2
119 ; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm3
120 ; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm1, %zmm3
121 ; AVX512BW-NEXT:    vpsllq $32, %zmm3, %zmm3
122 ; AVX512BW-NEXT:    vpaddq %zmm3, %zmm2, %zmm2
123 ; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm1
124 ; AVX512BW-NEXT:    vpmuludq %zmm0, %zmm1, %zmm0
125 ; AVX512BW-NEXT:    vpsllq $32, %zmm0, %zmm0
126 ; AVX512BW-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
127 ; AVX512BW-NEXT:    retq
128 ;
129 ; AVX512DQ-LABEL: imulq512:
130 ; AVX512DQ:       ## BB#0:
131 ; AVX512DQ-NEXT:    vpmullq %zmm0, %zmm1, %zmm0
132 ; AVX512DQ-NEXT:    retq
133 ;
134 ; SKX-LABEL: imulq512:
135 ; SKX:       ## BB#0:
136 ; SKX-NEXT:    vpmullq %zmm0, %zmm1, %zmm0
137 ; SKX-NEXT:    retq
138   %z = mul <8 x i64>%x, %y
139   ret <8 x i64>%z
140 }
141
142 define <8 x double> @mulpd512(<8 x double> %y, <8 x double> %x) {
143 ; CHECK-LABEL: mulpd512:
144 ; CHECK:       ## BB#0: ## %entry
145 ; CHECK-NEXT:    vmulpd %zmm0, %zmm1, %zmm0
146 ; CHECK-NEXT:    retq
147 entry:
148   %mul.i = fmul <8 x double> %x, %y
149   ret <8 x double> %mul.i
150 }
151
152 define <8 x double> @mulpd512fold(<8 x double> %y) {
153 ; CHECK-LABEL: mulpd512fold:
154 ; CHECK:       ## BB#0: ## %entry
155 ; CHECK-NEXT:    vmulpd {{.*}}(%rip), %zmm0, %zmm0
156 ; CHECK-NEXT:    retq
157 entry:
158   %mul.i = fmul <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>
159   ret <8 x double> %mul.i
160 }
161
162 define <16 x float> @mulps512(<16 x float> %y, <16 x float> %x) {
163 ; CHECK-LABEL: mulps512:
164 ; CHECK:       ## BB#0: ## %entry
165 ; CHECK-NEXT:    vmulps %zmm0, %zmm1, %zmm0
166 ; CHECK-NEXT:    retq
167 entry:
168   %mul.i = fmul <16 x float> %x, %y
169   ret <16 x float> %mul.i
170 }
171
172 define <16 x float> @mulps512fold(<16 x float> %y) {
173 ; CHECK-LABEL: mulps512fold:
174 ; CHECK:       ## BB#0: ## %entry
175 ; CHECK-NEXT:    vmulps {{.*}}(%rip), %zmm0, %zmm0
176 ; CHECK-NEXT:    retq
177 entry:
178   %mul.i = fmul <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000>
179   ret <16 x float> %mul.i
180 }
181
182 define <8 x double> @divpd512(<8 x double> %y, <8 x double> %x) {
183 ; CHECK-LABEL: divpd512:
184 ; CHECK:       ## BB#0: ## %entry
185 ; CHECK-NEXT:    vdivpd %zmm0, %zmm1, %zmm0
186 ; CHECK-NEXT:    retq
187 entry:
188   %div.i = fdiv <8 x double> %x, %y
189   ret <8 x double> %div.i
190 }
191
192 define <8 x double> @divpd512fold(<8 x double> %y) {
193 ; CHECK-LABEL: divpd512fold:
194 ; CHECK:       ## BB#0: ## %entry
195 ; CHECK-NEXT:    vdivpd {{.*}}(%rip), %zmm0, %zmm0
196 ; CHECK-NEXT:    retq
197 entry:
198   %div.i = fdiv <8 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00, double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>
199   ret <8 x double> %div.i
200 }
201
202 define <16 x float> @divps512(<16 x float> %y, <16 x float> %x) {
203 ; CHECK-LABEL: divps512:
204 ; CHECK:       ## BB#0: ## %entry
205 ; CHECK-NEXT:    vdivps %zmm0, %zmm1, %zmm0
206 ; CHECK-NEXT:    retq
207 entry:
208   %div.i = fdiv <16 x float> %x, %y
209   ret <16 x float> %div.i
210 }
211
212 define <16 x float> @divps512fold(<16 x float> %y) {
213 ; CHECK-LABEL: divps512fold:
214 ; CHECK:       ## BB#0: ## %entry
215 ; CHECK-NEXT:    vdivps {{.*}}(%rip), %zmm0, %zmm0
216 ; CHECK-NEXT:    retq
217 entry:
218   %div.i = fdiv <16 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 4.500000e+00, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 4.500000e+00, float 0x4002666660000000, float 0x3FF3333340000000>
219   ret <16 x float> %div.i
220 }
221
222 define <8 x i64> @vpaddq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
223 ; CHECK-LABEL: vpaddq_test:
224 ; CHECK:       ## BB#0:
225 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
226 ; CHECK-NEXT:    retq
227   %x = add <8 x i64> %i, %j
228   ret <8 x i64> %x
229 }
230
231 define <8 x i64> @vpaddq_fold_test(<8 x i64> %i, <8 x i64>* %j) nounwind {
232 ; CHECK-LABEL: vpaddq_fold_test:
233 ; CHECK:       ## BB#0:
234 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm0
235 ; CHECK-NEXT:    retq
236   %tmp = load <8 x i64>, <8 x i64>* %j, align 4
237   %x = add <8 x i64> %i, %tmp
238   ret <8 x i64> %x
239 }
240
241 define <8 x i64> @vpaddq_broadcast_test(<8 x i64> %i) nounwind {
242 ; CHECK-LABEL: vpaddq_broadcast_test:
243 ; CHECK:       ## BB#0:
244 ; CHECK-NEXT:    vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0
245 ; CHECK-NEXT:    retq
246   %x = add <8 x i64> %i, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
247   ret <8 x i64> %x
248 }
249
250 define <8 x i64> @vpaddq_broadcast2_test(<8 x i64> %i, i64* %j) nounwind {
251 ; CHECK-LABEL: vpaddq_broadcast2_test:
252 ; CHECK:       ## BB#0:
253 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm0
254 ; CHECK-NEXT:    retq
255   %tmp = load i64, i64* %j
256   %j.0 = insertelement <8 x i64> undef, i64 %tmp, i32 0
257   %j.1 = insertelement <8 x i64> %j.0, i64 %tmp, i32 1
258   %j.2 = insertelement <8 x i64> %j.1, i64 %tmp, i32 2
259   %j.3 = insertelement <8 x i64> %j.2, i64 %tmp, i32 3
260   %j.4 = insertelement <8 x i64> %j.3, i64 %tmp, i32 4
261   %j.5 = insertelement <8 x i64> %j.4, i64 %tmp, i32 5
262   %j.6 = insertelement <8 x i64> %j.5, i64 %tmp, i32 6
263   %j.7 = insertelement <8 x i64> %j.6, i64 %tmp, i32 7
264   %x = add <8 x i64> %i, %j.7
265   ret <8 x i64> %x
266 }
267
268 define <16 x i32> @vpaddd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
269 ; CHECK-LABEL: vpaddd_test:
270 ; CHECK:       ## BB#0:
271 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
272 ; CHECK-NEXT:    retq
273   %x = add <16 x i32> %i, %j
274   ret <16 x i32> %x
275 }
276
277 define <16 x i32> @vpaddd_fold_test(<16 x i32> %i, <16 x i32>* %j) nounwind {
278 ; CHECK-LABEL: vpaddd_fold_test:
279 ; CHECK:       ## BB#0:
280 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0
281 ; CHECK-NEXT:    retq
282   %tmp = load <16 x i32>, <16 x i32>* %j, align 4
283   %x = add <16 x i32> %i, %tmp
284   ret <16 x i32> %x
285 }
286
287 define <16 x i32> @vpaddd_broadcast_test(<16 x i32> %i) nounwind {
288 ; CHECK-LABEL: vpaddd_broadcast_test:
289 ; CHECK:       ## BB#0:
290 ; CHECK-NEXT:    vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0
291 ; CHECK-NEXT:    retq
292   %x = add <16 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
293   ret <16 x i32> %x
294 }
295
296 define <16 x i32> @vpaddd_mask_test(<16 x i32> %i, <16 x i32> %j, <16 x i32> %mask1) nounwind readnone {
297 ; CHECK-LABEL: vpaddd_mask_test:
298 ; CHECK:       ## BB#0:
299 ; CHECK-NEXT:    vpxord %zmm3, %zmm3, %zmm3
300 ; CHECK-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
301 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0 {%k1}
302 ; CHECK-NEXT:    retq
303   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
304   %x = add <16 x i32> %i, %j
305   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %i
306   ret <16 x i32> %r
307 }
308
309 define <16 x i32> @vpaddd_maskz_test(<16 x i32> %i, <16 x i32> %j, <16 x i32> %mask1) nounwind readnone {
310 ; CHECK-LABEL: vpaddd_maskz_test:
311 ; CHECK:       ## BB#0:
312 ; CHECK-NEXT:    vpxord %zmm3, %zmm3, %zmm3
313 ; CHECK-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
314 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0 {%k1} {z}
315 ; CHECK-NEXT:    retq
316   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
317   %x = add <16 x i32> %i, %j
318   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
319   ret <16 x i32> %r
320 }
321
322 define <16 x i32> @vpaddd_mask_fold_test(<16 x i32> %i, <16 x i32>* %j.ptr, <16 x i32> %mask1) nounwind readnone {
323 ; CHECK-LABEL: vpaddd_mask_fold_test:
324 ; CHECK:       ## BB#0:
325 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
326 ; CHECK-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
327 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0 {%k1}
328 ; CHECK-NEXT:    retq
329   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
330   %j = load <16 x i32>, <16 x i32>* %j.ptr
331   %x = add <16 x i32> %i, %j
332   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %i
333   ret <16 x i32> %r
334 }
335
336 define <16 x i32> @vpaddd_mask_broadcast_test(<16 x i32> %i, <16 x i32> %mask1) nounwind readnone {
337 ; CHECK-LABEL: vpaddd_mask_broadcast_test:
338 ; CHECK:       ## BB#0:
339 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
340 ; CHECK-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
341 ; CHECK-NEXT:    vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 {%k1}
342 ; CHECK-NEXT:    retq
343   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
344   %x = add <16 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
345   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %i
346   ret <16 x i32> %r
347 }
348
349 define <16 x i32> @vpaddd_maskz_fold_test(<16 x i32> %i, <16 x i32>* %j.ptr, <16 x i32> %mask1) nounwind readnone {
350 ; CHECK-LABEL: vpaddd_maskz_fold_test:
351 ; CHECK:       ## BB#0:
352 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
353 ; CHECK-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
354 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0 {%k1} {z}
355 ; CHECK-NEXT:    retq
356   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
357   %j = load <16 x i32>, <16 x i32>* %j.ptr
358   %x = add <16 x i32> %i, %j
359   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
360   ret <16 x i32> %r
361 }
362
363 define <16 x i32> @vpaddd_maskz_broadcast_test(<16 x i32> %i, <16 x i32> %mask1) nounwind readnone {
364 ; CHECK-LABEL: vpaddd_maskz_broadcast_test:
365 ; CHECK:       ## BB#0:
366 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
367 ; CHECK-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
368 ; CHECK-NEXT:    vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 {%k1} {z}
369 ; CHECK-NEXT:    retq
370   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
371   %x = add <16 x i32> %i, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
372   %r = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
373   ret <16 x i32> %r
374 }
375
376 define <8 x i64> @vpsubq_test(<8 x i64> %i, <8 x i64> %j) nounwind readnone {
377 ; CHECK-LABEL: vpsubq_test:
378 ; CHECK:       ## BB#0:
379 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
380 ; CHECK-NEXT:    retq
381   %x = sub <8 x i64> %i, %j
382   ret <8 x i64> %x
383 }
384
385 define <16 x i32> @vpsubd_test(<16 x i32> %i, <16 x i32> %j) nounwind readnone {
386 ; CHECK-LABEL: vpsubd_test:
387 ; CHECK:       ## BB#0:
388 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
389 ; CHECK-NEXT:    retq
390   %x = sub <16 x i32> %i, %j
391   ret <16 x i32> %x
392 }
393
394 define <16 x i32> @vpmulld_test(<16 x i32> %i, <16 x i32> %j) {
395 ; CHECK-LABEL: vpmulld_test:
396 ; CHECK:       ## BB#0:
397 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
398 ; CHECK-NEXT:    retq
399   %x = mul <16 x i32> %i, %j
400   ret <16 x i32> %x
401 }
402
403 declare float @sqrtf(float) readnone
404 define float @sqrtA(float %a) nounwind uwtable readnone ssp {
405 ; CHECK-LABEL: sqrtA:
406 ; CHECK:       ## BB#0: ## %entry
407 ; CHECK-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0
408 ; CHECK-NEXT:    retq
409 entry:
410   %conv1 = tail call float @sqrtf(float %a) nounwind readnone
411   ret float %conv1
412 }
413
414 declare double @sqrt(double) readnone
415 define double @sqrtB(double %a) nounwind uwtable readnone ssp {
416 ; CHECK-LABEL: sqrtB:
417 ; CHECK:       ## BB#0: ## %entry
418 ; CHECK-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0
419 ; CHECK-NEXT:    retq
420 entry:
421   %call = tail call double @sqrt(double %a) nounwind readnone
422   ret double %call
423 }
424
425 declare float @llvm.sqrt.f32(float)
426 define float @sqrtC(float %a) nounwind {
427 ; CHECK-LABEL: sqrtC:
428 ; CHECK:       ## BB#0:
429 ; CHECK-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0
430 ; CHECK-NEXT:    retq
431   %b = call float @llvm.sqrt.f32(float %a)
432   ret float %b
433 }
434
435 declare <16 x float> @llvm.sqrt.v16f32(<16 x float>)
436 define <16 x float> @sqrtD(<16 x float> %a) nounwind {
437 ; CHECK-LABEL: sqrtD:
438 ; CHECK:       ## BB#0:
439 ; CHECK-NEXT:    vsqrtps %zmm0, %zmm0
440 ; CHECK-NEXT:    retq
441   %b = call <16 x float> @llvm.sqrt.v16f32(<16 x float> %a)
442   ret <16 x float> %b
443 }
444
445 declare <8 x double> @llvm.sqrt.v8f64(<8 x double>)
446 define <8 x double> @sqrtE(<8 x double> %a) nounwind {
447 ; CHECK-LABEL: sqrtE:
448 ; CHECK:       ## BB#0:
449 ; CHECK-NEXT:    vsqrtpd %zmm0, %zmm0
450 ; CHECK-NEXT:    retq
451   %b = call <8 x double> @llvm.sqrt.v8f64(<8 x double> %a)
452   ret <8 x double> %b
453 }
454
455 define <16 x float> @fadd_broadcast(<16 x float> %a) nounwind {
456 ; CHECK-LABEL: fadd_broadcast:
457 ; CHECK:       ## BB#0:
458 ; CHECK-NEXT:    vaddps {{.*}}(%rip){1to16}, %zmm0, %zmm0
459 ; CHECK-NEXT:    retq
460   %b = fadd <16 x float> %a, <float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000, float 0x3FB99999A0000000>
461   ret <16 x float> %b
462 }
463
464 define <8 x i64> @addq_broadcast(<8 x i64> %a) nounwind {
465 ; CHECK-LABEL: addq_broadcast:
466 ; CHECK:       ## BB#0:
467 ; CHECK-NEXT:    vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0
468 ; CHECK-NEXT:    retq
469   %b = add <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
470   ret <8 x i64> %b
471 }
472
473 define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind {
474 ; CHECK-LABEL: orq_broadcast:
475 ; CHECK:       ## BB#0:
476 ; CHECK-NEXT:    vporq {{.*}}(%rip){1to8}, %zmm0, %zmm0
477 ; CHECK-NEXT:    retq
478   %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
479   ret <8 x i64> %b
480 }
481
482 define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) {
483 ; CHECK-LABEL: andd512fold:
484 ; CHECK:       ## BB#0: ## %entry
485 ; CHECK-NEXT:    vpandd (%rdi), %zmm0, %zmm0
486 ; CHECK-NEXT:    retq
487 entry:
488   %a = load <16 x i32>, <16 x i32>* %x, align 4
489   %b = and <16 x i32> %y, %a
490   ret <16 x i32> %b
491 }
492
493 define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) {
494 ; CHECK-LABEL: andqbrst:
495 ; CHECK:       ## BB#0: ## %entry
496 ; CHECK-NEXT:    vpandq (%rdi){1to8}, %zmm0, %zmm0
497 ; CHECK-NEXT:    retq
498 entry:
499   %a = load i64, i64* %ap, align 8
500   %b = insertelement <8 x i64> undef, i64 %a, i32 0
501   %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
502   %d = and <8 x i64> %p1, %c
503   ret <8 x i64>%d
504 }
505
506 define <16 x float> @test_mask_vaddps(<16 x float> %dst, <16 x float> %i,
507 ; CHECK-LABEL: test_mask_vaddps:
508 ; CHECK:       ## BB#0:
509 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
510 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
511 ; CHECK-NEXT:    vaddps %zmm2, %zmm1, %zmm0 {%k1}
512 ; CHECK-NEXT:    retq
513                                      <16 x float> %j, <16 x i32> %mask1)
514                                      nounwind readnone {
515   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
516   %x = fadd <16 x float> %i, %j
517   %r = select <16 x i1> %mask, <16 x float> %x, <16 x float> %dst
518   ret <16 x float> %r
519 }
520
521 define <16 x float> @test_mask_vmulps(<16 x float> %dst, <16 x float> %i,
522 ; CHECK-LABEL: test_mask_vmulps:
523 ; CHECK:       ## BB#0:
524 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
525 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
526 ; CHECK-NEXT:    vmulps %zmm2, %zmm1, %zmm0 {%k1}
527 ; CHECK-NEXT:    retq
528                                      <16 x float> %j, <16 x i32> %mask1)
529                                      nounwind readnone {
530   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
531   %x = fmul <16 x float> %i, %j
532   %r = select <16 x i1> %mask, <16 x float> %x, <16 x float> %dst
533   ret <16 x float> %r
534 }
535
536 define <16 x float> @test_mask_vminps(<16 x float> %dst, <16 x float> %i,
537 ; CHECK-LABEL: test_mask_vminps:
538 ; CHECK:       ## BB#0:
539 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
540 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
541 ; CHECK-NEXT:    vminps %zmm2, %zmm1, %zmm0 {%k1}
542 ; CHECK-NEXT:    retq
543                                      <16 x float> %j, <16 x i32> %mask1)
544                                      nounwind readnone {
545   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
546   %cmp_res = fcmp olt <16 x float> %i, %j
547   %min = select <16 x i1> %cmp_res, <16 x float> %i, <16 x float> %j
548   %r = select <16 x i1> %mask, <16 x float> %min, <16 x float> %dst
549   ret <16 x float> %r
550 }
551
552 define <8 x double> @test_mask_vminpd(<8 x double> %dst, <8 x double> %i,
553 ; AVX512F-LABEL: test_mask_vminpd:
554 ; AVX512F:       ## BB#0:
555 ; AVX512F-NEXT:    vpxor %ymm4, %ymm4, %ymm4
556 ; AVX512F-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
557 ; AVX512F-NEXT:    vminpd %zmm2, %zmm1, %zmm0 {%k1}
558 ; AVX512F-NEXT:    retq
559 ;
560 ; AVX512VL-LABEL: test_mask_vminpd:
561 ; AVX512VL:       ## BB#0:
562 ; AVX512VL-NEXT:    vpxor %ymm4, %ymm4, %ymm4
563 ; AVX512VL-NEXT:    vpcmpneqd %ymm4, %ymm3, %k1
564 ; AVX512VL-NEXT:    vminpd %zmm2, %zmm1, %zmm0 {%k1}
565 ; AVX512VL-NEXT:    retq
566 ;
567 ; AVX512BW-LABEL: test_mask_vminpd:
568 ; AVX512BW:       ## BB#0:
569 ; AVX512BW-NEXT:    vpxor %ymm4, %ymm4, %ymm4
570 ; AVX512BW-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
571 ; AVX512BW-NEXT:    vminpd %zmm2, %zmm1, %zmm0 {%k1}
572 ; AVX512BW-NEXT:    retq
573 ;
574 ; AVX512DQ-LABEL: test_mask_vminpd:
575 ; AVX512DQ:       ## BB#0:
576 ; AVX512DQ-NEXT:    vpxor %ymm4, %ymm4, %ymm4
577 ; AVX512DQ-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
578 ; AVX512DQ-NEXT:    vminpd %zmm2, %zmm1, %zmm0 {%k1}
579 ; AVX512DQ-NEXT:    retq
580 ;
581 ; SKX-LABEL: test_mask_vminpd:
582 ; SKX:       ## BB#0:
583 ; SKX-NEXT:    vpxor %ymm4, %ymm4, %ymm4
584 ; SKX-NEXT:    vpcmpneqd %ymm4, %ymm3, %k1
585 ; SKX-NEXT:    vminpd %zmm2, %zmm1, %zmm0 {%k1}
586 ; SKX-NEXT:    retq
587                                      <8 x double> %j, <8 x i32> %mask1)
588                                      nounwind readnone {
589   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
590   %cmp_res = fcmp olt <8 x double> %i, %j
591   %min = select <8 x i1> %cmp_res, <8 x double> %i, <8 x double> %j
592   %r = select <8 x i1> %mask, <8 x double> %min, <8 x double> %dst
593   ret <8 x double> %r
594 }
595
596 define <16 x float> @test_mask_vmaxps(<16 x float> %dst, <16 x float> %i,
597 ; CHECK-LABEL: test_mask_vmaxps:
598 ; CHECK:       ## BB#0:
599 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
600 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
601 ; CHECK-NEXT:    vmaxps %zmm2, %zmm1, %zmm0 {%k1}
602 ; CHECK-NEXT:    retq
603                                      <16 x float> %j, <16 x i32> %mask1)
604                                      nounwind readnone {
605   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
606   %cmp_res = fcmp ogt <16 x float> %i, %j
607   %max = select <16 x i1> %cmp_res, <16 x float> %i, <16 x float> %j
608   %r = select <16 x i1> %mask, <16 x float> %max, <16 x float> %dst
609   ret <16 x float> %r
610 }
611
612 define <8 x double> @test_mask_vmaxpd(<8 x double> %dst, <8 x double> %i,
613 ; AVX512F-LABEL: test_mask_vmaxpd:
614 ; AVX512F:       ## BB#0:
615 ; AVX512F-NEXT:    vpxor %ymm4, %ymm4, %ymm4
616 ; AVX512F-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
617 ; AVX512F-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0 {%k1}
618 ; AVX512F-NEXT:    retq
619 ;
620 ; AVX512VL-LABEL: test_mask_vmaxpd:
621 ; AVX512VL:       ## BB#0:
622 ; AVX512VL-NEXT:    vpxor %ymm4, %ymm4, %ymm4
623 ; AVX512VL-NEXT:    vpcmpneqd %ymm4, %ymm3, %k1
624 ; AVX512VL-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0 {%k1}
625 ; AVX512VL-NEXT:    retq
626 ;
627 ; AVX512BW-LABEL: test_mask_vmaxpd:
628 ; AVX512BW:       ## BB#0:
629 ; AVX512BW-NEXT:    vpxor %ymm4, %ymm4, %ymm4
630 ; AVX512BW-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
631 ; AVX512BW-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0 {%k1}
632 ; AVX512BW-NEXT:    retq
633 ;
634 ; AVX512DQ-LABEL: test_mask_vmaxpd:
635 ; AVX512DQ:       ## BB#0:
636 ; AVX512DQ-NEXT:    vpxor %ymm4, %ymm4, %ymm4
637 ; AVX512DQ-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
638 ; AVX512DQ-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0 {%k1}
639 ; AVX512DQ-NEXT:    retq
640 ;
641 ; SKX-LABEL: test_mask_vmaxpd:
642 ; SKX:       ## BB#0:
643 ; SKX-NEXT:    vpxor %ymm4, %ymm4, %ymm4
644 ; SKX-NEXT:    vpcmpneqd %ymm4, %ymm3, %k1
645 ; SKX-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0 {%k1}
646 ; SKX-NEXT:    retq
647                                      <8 x double> %j, <8 x i32> %mask1)
648                                      nounwind readnone {
649   %mask = icmp ne <8 x i32> %mask1, zeroinitializer
650   %cmp_res = fcmp ogt <8 x double> %i, %j
651   %max = select <8 x i1> %cmp_res, <8 x double> %i, <8 x double> %j
652   %r = select <8 x i1> %mask, <8 x double> %max, <8 x double> %dst
653   ret <8 x double> %r
654 }
655
656 define <16 x float> @test_mask_vsubps(<16 x float> %dst, <16 x float> %i,
657 ; CHECK-LABEL: test_mask_vsubps:
658 ; CHECK:       ## BB#0:
659 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
660 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
661 ; CHECK-NEXT:    vsubps %zmm2, %zmm1, %zmm0 {%k1}
662 ; CHECK-NEXT:    retq
663                                      <16 x float> %j, <16 x i32> %mask1)
664                                      nounwind readnone {
665   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
666   %x = fsub <16 x float> %i, %j
667   %r = select <16 x i1> %mask, <16 x float> %x, <16 x float> %dst
668   ret <16 x float> %r
669 }
670
671 define <16 x float> @test_mask_vdivps(<16 x float> %dst, <16 x float> %i,
672 ; CHECK-LABEL: test_mask_vdivps:
673 ; CHECK:       ## BB#0:
674 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
675 ; CHECK-NEXT:    vpcmpneqd %zmm4, %zmm3, %k1
676 ; CHECK-NEXT:    vdivps %zmm2, %zmm1, %zmm0 {%k1}
677 ; CHECK-NEXT:    retq
678                                      <16 x float> %j, <16 x i32> %mask1)
679                                      nounwind readnone {
680   %mask = icmp ne <16 x i32> %mask1, zeroinitializer
681   %x = fdiv <16 x float> %i, %j
682   %r = select <16 x i1> %mask, <16 x float> %x, <16 x float> %dst
683   ret <16 x float> %r
684 }
685
686 define <8 x double> @test_mask_vaddpd(<8 x double> %dst, <8 x double> %i,
687 ; CHECK-LABEL: test_mask_vaddpd:
688 ; CHECK:       ## BB#0:
689 ; CHECK-NEXT:    vpxord %zmm4, %zmm4, %zmm4
690 ; CHECK-NEXT:    vpcmpneqq %zmm4, %zmm3, %k1
691 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm0 {%k1}
692 ; CHECK-NEXT:    retq
693                                      <8 x double> %j, <8 x i64> %mask1)
694                                      nounwind readnone {
695   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
696   %x = fadd <8 x double> %i, %j
697   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> %dst
698   ret <8 x double> %r
699 }
700
701 define <8 x double> @test_maskz_vaddpd(<8 x double> %i, <8 x double> %j,
702 ; CHECK-LABEL: test_maskz_vaddpd:
703 ; CHECK:       ## BB#0:
704 ; CHECK-NEXT:    vpxord %zmm3, %zmm3, %zmm3
705 ; CHECK-NEXT:    vpcmpneqq %zmm3, %zmm2, %k1
706 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0 {%k1} {z}
707 ; CHECK-NEXT:    retq
708                                       <8 x i64> %mask1) nounwind readnone {
709   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
710   %x = fadd <8 x double> %i, %j
711   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> zeroinitializer
712   ret <8 x double> %r
713 }
714
715 define <8 x double> @test_mask_fold_vaddpd(<8 x double> %dst, <8 x double> %i,
716 ; CHECK-LABEL: test_mask_fold_vaddpd:
717 ; CHECK:       ## BB#0:
718 ; CHECK-NEXT:    vpxord %zmm3, %zmm3, %zmm3
719 ; CHECK-NEXT:    vpcmpneqq %zmm3, %zmm2, %k1
720 ; CHECK-NEXT:    vaddpd (%rdi), %zmm1, %zmm0 {%k1}
721 ; CHECK-NEXT:    retq
722                                      <8 x double>* %j,  <8 x i64> %mask1)
723                                      nounwind {
724   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
725   %tmp = load <8 x double>, <8 x double>* %j, align 8
726   %x = fadd <8 x double> %i, %tmp
727   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> %dst
728   ret <8 x double> %r
729 }
730
731 define <8 x double> @test_maskz_fold_vaddpd(<8 x double> %i, <8 x double>* %j,
732 ; CHECK-LABEL: test_maskz_fold_vaddpd:
733 ; CHECK:       ## BB#0:
734 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
735 ; CHECK-NEXT:    vpcmpneqq %zmm2, %zmm1, %k1
736 ; CHECK-NEXT:    vaddpd (%rdi), %zmm0, %zmm0 {%k1} {z}
737 ; CHECK-NEXT:    retq
738                                       <8 x i64> %mask1) nounwind {
739   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
740   %tmp = load <8 x double>, <8 x double>* %j, align 8
741   %x = fadd <8 x double> %i, %tmp
742   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> zeroinitializer
743   ret <8 x double> %r
744 }
745
746 define <8 x double> @test_broadcast_vaddpd(<8 x double> %i, double* %j) nounwind {
747 ; CHECK-LABEL: test_broadcast_vaddpd:
748 ; CHECK:       ## BB#0:
749 ; CHECK-NEXT:    vaddpd (%rdi){1to8}, %zmm0, %zmm0
750 ; CHECK-NEXT:    retq
751   %tmp = load double, double* %j
752   %b = insertelement <8 x double> undef, double %tmp, i32 0
753   %c = shufflevector <8 x double> %b, <8 x double> undef,
754                      <8 x i32> zeroinitializer
755   %x = fadd <8 x double> %c, %i
756   ret <8 x double> %x
757 }
758
759 define <8 x double> @test_mask_broadcast_vaddpd(<8 x double> %dst, <8 x double> %i,
760 ; CHECK-LABEL: test_mask_broadcast_vaddpd:
761 ; CHECK:       ## BB#0:
762 ; CHECK-NEXT:    vpxord %zmm0, %zmm0, %zmm0
763 ; CHECK-NEXT:    vpcmpneqq %zmm0, %zmm2, %k1
764 ; CHECK-NEXT:    vaddpd (%rdi){1to8}, %zmm1, %zmm1 {%k1}
765 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
766 ; CHECK-NEXT:    retq
767                                       double* %j, <8 x i64> %mask1) nounwind {
768   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
769   %tmp = load double, double* %j
770   %b = insertelement <8 x double> undef, double %tmp, i32 0
771   %c = shufflevector <8 x double> %b, <8 x double> undef,
772                      <8 x i32> zeroinitializer
773   %x = fadd <8 x double> %c, %i
774   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> %i
775   ret <8 x double> %r
776 }
777
778 define <8 x double> @test_maskz_broadcast_vaddpd(<8 x double> %i, double* %j,
779 ; CHECK-LABEL: test_maskz_broadcast_vaddpd:
780 ; CHECK:       ## BB#0:
781 ; CHECK-NEXT:    vpxord %zmm2, %zmm2, %zmm2
782 ; CHECK-NEXT:    vpcmpneqq %zmm2, %zmm1, %k1
783 ; CHECK-NEXT:    vaddpd (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
784 ; CHECK-NEXT:    retq
785                                        <8 x i64> %mask1) nounwind {
786   %mask = icmp ne <8 x i64> %mask1, zeroinitializer
787   %tmp = load double, double* %j
788   %b = insertelement <8 x double> undef, double %tmp, i32 0
789   %c = shufflevector <8 x double> %b, <8 x double> undef,
790                      <8 x i32> zeroinitializer
791   %x = fadd <8 x double> %c, %i
792   %r = select <8 x i1> %mask, <8 x double> %x, <8 x double> zeroinitializer
793   ret <8 x double> %r
794 }
795
796 define <16 x float>  @test_fxor(<16 x float> %a) {
797 ; AVX512F-LABEL: test_fxor:
798 ; AVX512F:       ## BB#0:
799 ; AVX512F-NEXT:    vpxord {{.*}}(%rip), %zmm0, %zmm0
800 ; AVX512F-NEXT:    retq
801 ;
802 ; AVX512VL-LABEL: test_fxor:
803 ; AVX512VL:       ## BB#0:
804 ; AVX512VL-NEXT:    vpxord {{.*}}(%rip), %zmm0, %zmm0
805 ; AVX512VL-NEXT:    retq
806 ;
807 ; AVX512BW-LABEL: test_fxor:
808 ; AVX512BW:       ## BB#0:
809 ; AVX512BW-NEXT:    vpxord {{.*}}(%rip), %zmm0, %zmm0
810 ; AVX512BW-NEXT:    retq
811 ;
812 ; AVX512DQ-LABEL: test_fxor:
813 ; AVX512DQ:       ## BB#0:
814 ; AVX512DQ-NEXT:    vxorps {{.*}}(%rip), %zmm0, %zmm0
815 ; AVX512DQ-NEXT:    retq
816 ;
817 ; SKX-LABEL: test_fxor:
818 ; SKX:       ## BB#0:
819 ; SKX-NEXT:    vxorps {{.*}}(%rip), %zmm0, %zmm0
820 ; SKX-NEXT:    retq
821
822   %res = fsub <16 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %a
823   ret <16 x float>%res
824 }
825