Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512vl-logic.ll
blob58621967e2aca60f682e41551441daf6e59ef064
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512vl | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx -mattr=+avx512vl | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
5 ; 256-bit
7 define <8 x i32> @vpandd256(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
8 ; CHECK-LABEL: vpandd256:
9 ; CHECK:       ## %bb.0: ## %entry
10 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
11 ; CHECK-NEXT:    vpand %ymm1, %ymm0, %ymm0
12 ; CHECK-NEXT:    retq
13 entry:
14   ; Force the execution domain with an add.
15   %a2 = add <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
16   %x = and <8 x i32> %a2, %b
17   ret <8 x i32> %x
20 define <8 x i32> @vpandnd256(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
21 ; CHECK-LABEL: vpandnd256:
22 ; CHECK:       ## %bb.0: ## %entry
23 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1
24 ; CHECK-NEXT:    vpandn %ymm1, %ymm0, %ymm0
25 ; CHECK-NEXT:    retq
26 entry:
27   ; Force the execution domain with an add.
28   %a2 = add <8 x i32> %a, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
29   %b2 = xor <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
30   %x = and <8 x i32> %a2, %b2
31   ret <8 x i32> %x
34 define <8 x i32> @vpord256(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
35 ; CHECK-LABEL: vpord256:
36 ; CHECK:       ## %bb.0: ## %entry
37 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
38 ; CHECK-NEXT:    vpor %ymm1, %ymm0, %ymm0
39 ; CHECK-NEXT:    retq
40 entry:
41   ; Force the execution domain with an add.
42   %a2 = add <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
43   %x = or <8 x i32> %a2, %b
44   ret <8 x i32> %x
47 define <8 x i32> @vpxord256(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
48 ; CHECK-LABEL: vpxord256:
49 ; CHECK:       ## %bb.0: ## %entry
50 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
51 ; CHECK-NEXT:    vpxor %ymm1, %ymm0, %ymm0
52 ; CHECK-NEXT:    retq
53 entry:
54   ; Force the execution domain with an add.
55   %a2 = add <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
56   %x = xor <8 x i32> %a2, %b
57   ret <8 x i32> %x
60 define <4 x i64> @vpandq256(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
61 ; CHECK-LABEL: vpandq256:
62 ; CHECK:       ## %bb.0: ## %entry
63 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
64 ; CHECK-NEXT:    vpand %ymm1, %ymm0, %ymm0
65 ; CHECK-NEXT:    retq
66 entry:
67   ; Force the execution domain with an add.
68   %a2 = add <4 x i64> %a, <i64 6, i64 6, i64 6, i64 6>
69   %x = and <4 x i64> %a2, %b
70   ret <4 x i64> %x
73 define <4 x i64> @vpandnq256(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
74 ; CHECK-LABEL: vpandnq256:
75 ; CHECK:       ## %bb.0: ## %entry
76 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
77 ; CHECK-NEXT:    vpandn %ymm0, %ymm1, %ymm0
78 ; CHECK-NEXT:    retq
79 entry:
80   ; Force the execution domain with an add.
81   %a2 = add <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
82   %b2 = xor <4 x i64> %b, <i64 -1, i64 -1, i64 -1, i64 -1>
83   %x = and <4 x i64> %a2, %b2
84   ret <4 x i64> %x
87 define <4 x i64> @vporq256(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
88 ; CHECK-LABEL: vporq256:
89 ; CHECK:       ## %bb.0: ## %entry
90 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
91 ; CHECK-NEXT:    vpor %ymm1, %ymm0, %ymm0
92 ; CHECK-NEXT:    retq
93 entry:
94   ; Force the execution domain with an add.
95   %a2 = add <4 x i64> %a, <i64 21, i64 21, i64 21, i64 21>
96   %x = or <4 x i64> %a2, %b
97   ret <4 x i64> %x
100 define <4 x i64> @vpxorq256(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
101 ; CHECK-LABEL: vpxorq256:
102 ; CHECK:       ## %bb.0: ## %entry
103 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
104 ; CHECK-NEXT:    vpxor %ymm1, %ymm0, %ymm0
105 ; CHECK-NEXT:    retq
106 entry:
107   ; Force the execution domain with an add.
108   %a2 = add <4 x i64> %a, <i64 22, i64 22, i64 22, i64 22>
109   %x = xor <4 x i64> %a2, %b
110   ret <4 x i64> %x
113 ; 128-bit
115 define <4 x i32> @vpandd128(<4 x i32> %a, <4 x i32> %b) nounwind uwtable readnone ssp {
116 ; CHECK-LABEL: vpandd128:
117 ; CHECK:       ## %bb.0: ## %entry
118 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
119 ; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0
120 ; CHECK-NEXT:    retq
121 entry:
122   ; Force the execution domain with an add.
123   %a2 = add <4 x i32> %a, <i32 8, i32 8, i32 8, i32 8>
124   %x = and <4 x i32> %a2, %b
125   ret <4 x i32> %x
128 define <4 x i32> @vpandnd128(<4 x i32> %a, <4 x i32> %b) nounwind uwtable readnone ssp {
129 ; CHECK-LABEL: vpandnd128:
130 ; CHECK:       ## %bb.0: ## %entry
131 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
132 ; CHECK-NEXT:    vpandn %xmm0, %xmm1, %xmm0
133 ; CHECK-NEXT:    retq
134 entry:
135   ; Force the execution domain with an add.
136   %a2 = add <4 x i32> %a, <i32 9, i32 9, i32 9, i32 9>
137   %b2 = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1>
138   %x = and <4 x i32> %a2, %b2
139   ret <4 x i32> %x
142 define <4 x i32> @vpord128(<4 x i32> %a, <4 x i32> %b) nounwind uwtable readnone ssp {
143 ; CHECK-LABEL: vpord128:
144 ; CHECK:       ## %bb.0: ## %entry
145 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
146 ; CHECK-NEXT:    vpor %xmm1, %xmm0, %xmm0
147 ; CHECK-NEXT:    retq
148 entry:
149   ; Force the execution domain with an add.
150   %a2 = add <4 x i32> %a, <i32 10, i32 10, i32 10, i32 10>
151   %x = or <4 x i32> %a2, %b
152   ret <4 x i32> %x
155 define <4 x i32> @vpxord128(<4 x i32> %a, <4 x i32> %b) nounwind uwtable readnone ssp {
156 ; CHECK-LABEL: vpxord128:
157 ; CHECK:       ## %bb.0: ## %entry
158 ; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
159 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
160 ; CHECK-NEXT:    retq
161 entry:
162   ; Force the execution domain with an add.
163   %a2 = add <4 x i32> %a, <i32 11, i32 11, i32 11, i32 11>
164   %x = xor <4 x i32> %a2, %b
165   ret <4 x i32> %x
168 define <2 x i64> @vpandq128(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
169 ; CHECK-LABEL: vpandq128:
170 ; CHECK:       ## %bb.0: ## %entry
171 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
172 ; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0
173 ; CHECK-NEXT:    retq
174 entry:
175   ; Force the execution domain with an add.
176   %a2 = add <2 x i64> %a, <i64 12, i64 12>
177   %x = and <2 x i64> %a2, %b
178   ret <2 x i64> %x
181 define <2 x i64> @vpandnq128(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
182 ; CHECK-LABEL: vpandnq128:
183 ; CHECK:       ## %bb.0: ## %entry
184 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
185 ; CHECK-NEXT:    vpandn %xmm0, %xmm1, %xmm0
186 ; CHECK-NEXT:    retq
187 entry:
188   ; Force the execution domain with an add.
189   %a2 = add <2 x i64> %a, <i64 13, i64 13>
190   %b2 = xor <2 x i64> %b, <i64 -1, i64 -1>
191   %x = and <2 x i64> %a2, %b2
192   ret <2 x i64> %x
195 define <2 x i64> @vporq128(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
196 ; CHECK-LABEL: vporq128:
197 ; CHECK:       ## %bb.0: ## %entry
198 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
199 ; CHECK-NEXT:    vpor %xmm1, %xmm0, %xmm0
200 ; CHECK-NEXT:    retq
201 entry:
202   ; Force the execution domain with an add.
203   %a2 = add <2 x i64> %a, <i64 14, i64 14>
204   %x = or <2 x i64> %a2, %b
205   ret <2 x i64> %x
208 define <2 x i64> @vpxorq128(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
209 ; CHECK-LABEL: vpxorq128:
210 ; CHECK:       ## %bb.0: ## %entry
211 ; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
212 ; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0
213 ; CHECK-NEXT:    retq
214 entry:
215   ; Force the execution domain with an add.
216   %a2 = add <2 x i64> %a, <i64 15, i64 15>
217   %x = xor <2 x i64> %a2, %b
218   ret <2 x i64> %x
222 define <4 x double> @test_mm256_mask_andnot_pd(<4 x double> %__W, i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
223 ; KNL-LABEL: test_mm256_mask_andnot_pd:
224 ; KNL:       ## %bb.0: ## %entry
225 ; KNL-NEXT:    kmovw %edi, %k1
226 ; KNL-NEXT:    vpandnq %ymm2, %ymm1, %ymm0 {%k1}
227 ; KNL-NEXT:    retq
229 ; SKX-LABEL: test_mm256_mask_andnot_pd:
230 ; SKX:       ## %bb.0: ## %entry
231 ; SKX-NEXT:    kmovd %edi, %k1
232 ; SKX-NEXT:    vandnpd %ymm2, %ymm1, %ymm0 {%k1}
233 ; SKX-NEXT:    retq
234 entry:
235   %0 = bitcast <4 x double> %__A to <4 x i64>
236   %neg.i.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
237   %1 = bitcast <4 x double> %__B to <4 x i64>
238   %and.i.i = and <4 x i64> %1, %neg.i.i
239   %2 = bitcast <4 x i64> %and.i.i to <4 x double>
240   %3 = bitcast i8 %__U to <8 x i1>
241   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
242   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> %__W
243   ret <4 x double> %4
246 define <4 x double> @test_mm256_maskz_andnot_pd(i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
247 ; KNL-LABEL: test_mm256_maskz_andnot_pd:
248 ; KNL:       ## %bb.0: ## %entry
249 ; KNL-NEXT:    kmovw %edi, %k1
250 ; KNL-NEXT:    vpandnq %ymm1, %ymm0, %ymm0 {%k1} {z}
251 ; KNL-NEXT:    retq
253 ; SKX-LABEL: test_mm256_maskz_andnot_pd:
254 ; SKX:       ## %bb.0: ## %entry
255 ; SKX-NEXT:    kmovd %edi, %k1
256 ; SKX-NEXT:    vandnpd %ymm1, %ymm0, %ymm0 {%k1} {z}
257 ; SKX-NEXT:    retq
258 entry:
259   %0 = bitcast <4 x double> %__A to <4 x i64>
260   %neg.i.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
261   %1 = bitcast <4 x double> %__B to <4 x i64>
262   %and.i.i = and <4 x i64> %1, %neg.i.i
263   %2 = bitcast <4 x i64> %and.i.i to <4 x double>
264   %3 = bitcast i8 %__U to <8 x i1>
265   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
266   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> zeroinitializer
267   ret <4 x double> %4
270 define <2 x double> @test_mm_mask_andnot_pd(<2 x double> %__W, i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
271 ; KNL-LABEL: test_mm_mask_andnot_pd:
272 ; KNL:       ## %bb.0: ## %entry
273 ; KNL-NEXT:    kmovw %edi, %k1
274 ; KNL-NEXT:    vpandnq %xmm2, %xmm1, %xmm0 {%k1}
275 ; KNL-NEXT:    retq
277 ; SKX-LABEL: test_mm_mask_andnot_pd:
278 ; SKX:       ## %bb.0: ## %entry
279 ; SKX-NEXT:    kmovd %edi, %k1
280 ; SKX-NEXT:    vandnpd %xmm2, %xmm1, %xmm0 {%k1}
281 ; SKX-NEXT:    retq
282 entry:
283   %0 = bitcast <2 x double> %__A to <2 x i64>
284   %neg.i.i = xor <2 x i64> %0, <i64 -1, i64 -1>
285   %1 = bitcast <2 x double> %__B to <2 x i64>
286   %and.i.i = and <2 x i64> %1, %neg.i.i
287   %2 = bitcast <2 x i64> %and.i.i to <2 x double>
288   %3 = bitcast i8 %__U to <8 x i1>
289   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
290   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> %__W
291   ret <2 x double> %4
294 define <2 x double> @test_mm_maskz_andnot_pd(i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
295 ; KNL-LABEL: test_mm_maskz_andnot_pd:
296 ; KNL:       ## %bb.0: ## %entry
297 ; KNL-NEXT:    kmovw %edi, %k1
298 ; KNL-NEXT:    vpandnq %xmm1, %xmm0, %xmm0 {%k1} {z}
299 ; KNL-NEXT:    retq
301 ; SKX-LABEL: test_mm_maskz_andnot_pd:
302 ; SKX:       ## %bb.0: ## %entry
303 ; SKX-NEXT:    kmovd %edi, %k1
304 ; SKX-NEXT:    vandnpd %xmm1, %xmm0, %xmm0 {%k1} {z}
305 ; SKX-NEXT:    retq
306 entry:
307   %0 = bitcast <2 x double> %__A to <2 x i64>
308   %neg.i.i = xor <2 x i64> %0, <i64 -1, i64 -1>
309   %1 = bitcast <2 x double> %__B to <2 x i64>
310   %and.i.i = and <2 x i64> %1, %neg.i.i
311   %2 = bitcast <2 x i64> %and.i.i to <2 x double>
312   %3 = bitcast i8 %__U to <8 x i1>
313   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
314   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> zeroinitializer
315   ret <2 x double> %4
318 define <8 x float> @test_mm256_mask_andnot_ps(<8 x float> %__W, i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
319 ; KNL-LABEL: test_mm256_mask_andnot_ps:
320 ; KNL:       ## %bb.0: ## %entry
321 ; KNL-NEXT:    kmovw %edi, %k1
322 ; KNL-NEXT:    vpandnd %ymm2, %ymm1, %ymm0 {%k1}
323 ; KNL-NEXT:    retq
325 ; SKX-LABEL: test_mm256_mask_andnot_ps:
326 ; SKX:       ## %bb.0: ## %entry
327 ; SKX-NEXT:    kmovd %edi, %k1
328 ; SKX-NEXT:    vandnps %ymm2, %ymm1, %ymm0 {%k1}
329 ; SKX-NEXT:    retq
330 entry:
331   %0 = bitcast <8 x float> %__A to <8 x i32>
332   %neg.i.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
333   %1 = bitcast <8 x float> %__B to <8 x i32>
334   %and.i.i = and <8 x i32> %1, %neg.i.i
335   %2 = bitcast <8 x i32> %and.i.i to <8 x float>
336   %3 = bitcast i8 %__U to <8 x i1>
337   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> %__W
338   ret <8 x float> %4
341 define <8 x float> @test_mm256_maskz_andnot_ps(i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
342 ; KNL-LABEL: test_mm256_maskz_andnot_ps:
343 ; KNL:       ## %bb.0: ## %entry
344 ; KNL-NEXT:    kmovw %edi, %k1
345 ; KNL-NEXT:    vpandnd %ymm1, %ymm0, %ymm0 {%k1} {z}
346 ; KNL-NEXT:    retq
348 ; SKX-LABEL: test_mm256_maskz_andnot_ps:
349 ; SKX:       ## %bb.0: ## %entry
350 ; SKX-NEXT:    kmovd %edi, %k1
351 ; SKX-NEXT:    vandnps %ymm1, %ymm0, %ymm0 {%k1} {z}
352 ; SKX-NEXT:    retq
353 entry:
354   %0 = bitcast <8 x float> %__A to <8 x i32>
355   %neg.i.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
356   %1 = bitcast <8 x float> %__B to <8 x i32>
357   %and.i.i = and <8 x i32> %1, %neg.i.i
358   %2 = bitcast <8 x i32> %and.i.i to <8 x float>
359   %3 = bitcast i8 %__U to <8 x i1>
360   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> zeroinitializer
361   ret <8 x float> %4
364 define <4 x float> @test_mm_mask_andnot_ps(<4 x float> %__W, i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
365 ; KNL-LABEL: test_mm_mask_andnot_ps:
366 ; KNL:       ## %bb.0: ## %entry
367 ; KNL-NEXT:    kmovw %edi, %k1
368 ; KNL-NEXT:    vpandnd %xmm2, %xmm1, %xmm0 {%k1}
369 ; KNL-NEXT:    retq
371 ; SKX-LABEL: test_mm_mask_andnot_ps:
372 ; SKX:       ## %bb.0: ## %entry
373 ; SKX-NEXT:    kmovd %edi, %k1
374 ; SKX-NEXT:    vandnps %xmm2, %xmm1, %xmm0 {%k1}
375 ; SKX-NEXT:    retq
376 entry:
377   %0 = bitcast <4 x float> %__A to <4 x i32>
378   %neg.i.i = xor <4 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1>
379   %1 = bitcast <4 x float> %__B to <4 x i32>
380   %and.i.i = and <4 x i32> %1, %neg.i.i
381   %2 = bitcast <4 x i32> %and.i.i to <4 x float>
382   %3 = bitcast i8 %__U to <8 x i1>
383   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
384   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> %__W
385   ret <4 x float> %4
388 define <4 x float> @test_mm_maskz_andnot_ps(i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
389 ; KNL-LABEL: test_mm_maskz_andnot_ps:
390 ; KNL:       ## %bb.0: ## %entry
391 ; KNL-NEXT:    kmovw %edi, %k1
392 ; KNL-NEXT:    vpandnd %xmm1, %xmm0, %xmm0 {%k1} {z}
393 ; KNL-NEXT:    retq
395 ; SKX-LABEL: test_mm_maskz_andnot_ps:
396 ; SKX:       ## %bb.0: ## %entry
397 ; SKX-NEXT:    kmovd %edi, %k1
398 ; SKX-NEXT:    vandnps %xmm1, %xmm0, %xmm0 {%k1} {z}
399 ; SKX-NEXT:    retq
400 entry:
401   %0 = bitcast <4 x float> %__A to <4 x i32>
402   %neg.i.i = xor <4 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1>
403   %1 = bitcast <4 x float> %__B to <4 x i32>
404   %and.i.i = and <4 x i32> %1, %neg.i.i
405   %2 = bitcast <4 x i32> %and.i.i to <4 x float>
406   %3 = bitcast i8 %__U to <8 x i1>
407   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
408   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> zeroinitializer
409   ret <4 x float> %4
412 define <4 x double> @test_mm256_mask_and_pd(<4 x double> %__W, i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
413 ; KNL-LABEL: test_mm256_mask_and_pd:
414 ; KNL:       ## %bb.0: ## %entry
415 ; KNL-NEXT:    kmovw %edi, %k1
416 ; KNL-NEXT:    vpandq %ymm1, %ymm2, %ymm0 {%k1}
417 ; KNL-NEXT:    retq
419 ; SKX-LABEL: test_mm256_mask_and_pd:
420 ; SKX:       ## %bb.0: ## %entry
421 ; SKX-NEXT:    kmovd %edi, %k1
422 ; SKX-NEXT:    vandpd %ymm1, %ymm2, %ymm0 {%k1}
423 ; SKX-NEXT:    retq
424 entry:
425   %0 = bitcast <4 x double> %__A to <4 x i64>
426   %1 = bitcast <4 x double> %__B to <4 x i64>
427   %and.i.i = and <4 x i64> %1, %0
428   %2 = bitcast <4 x i64> %and.i.i to <4 x double>
429   %3 = bitcast i8 %__U to <8 x i1>
430   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
431   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> %__W
432   ret <4 x double> %4
435 define <4 x double> @test_mm256_maskz_and_pd(i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
436 ; KNL-LABEL: test_mm256_maskz_and_pd:
437 ; KNL:       ## %bb.0: ## %entry
438 ; KNL-NEXT:    kmovw %edi, %k1
439 ; KNL-NEXT:    vpandq %ymm0, %ymm1, %ymm0 {%k1} {z}
440 ; KNL-NEXT:    retq
442 ; SKX-LABEL: test_mm256_maskz_and_pd:
443 ; SKX:       ## %bb.0: ## %entry
444 ; SKX-NEXT:    kmovd %edi, %k1
445 ; SKX-NEXT:    vandpd %ymm0, %ymm1, %ymm0 {%k1} {z}
446 ; SKX-NEXT:    retq
447 entry:
448   %0 = bitcast <4 x double> %__A to <4 x i64>
449   %1 = bitcast <4 x double> %__B to <4 x i64>
450   %and.i.i = and <4 x i64> %1, %0
451   %2 = bitcast <4 x i64> %and.i.i to <4 x double>
452   %3 = bitcast i8 %__U to <8 x i1>
453   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
454   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> zeroinitializer
455   ret <4 x double> %4
458 define <2 x double> @test_mm_mask_and_pd(<2 x double> %__W, i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
459 ; KNL-LABEL: test_mm_mask_and_pd:
460 ; KNL:       ## %bb.0: ## %entry
461 ; KNL-NEXT:    kmovw %edi, %k1
462 ; KNL-NEXT:    vpandq %xmm1, %xmm2, %xmm0 {%k1}
463 ; KNL-NEXT:    retq
465 ; SKX-LABEL: test_mm_mask_and_pd:
466 ; SKX:       ## %bb.0: ## %entry
467 ; SKX-NEXT:    kmovd %edi, %k1
468 ; SKX-NEXT:    vandpd %xmm1, %xmm2, %xmm0 {%k1}
469 ; SKX-NEXT:    retq
470 entry:
471   %0 = bitcast <2 x double> %__A to <2 x i64>
472   %1 = bitcast <2 x double> %__B to <2 x i64>
473   %and.i.i = and <2 x i64> %1, %0
474   %2 = bitcast <2 x i64> %and.i.i to <2 x double>
475   %3 = bitcast i8 %__U to <8 x i1>
476   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
477   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> %__W
478   ret <2 x double> %4
481 define <2 x double> @test_mm_maskz_and_pd(i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
482 ; KNL-LABEL: test_mm_maskz_and_pd:
483 ; KNL:       ## %bb.0: ## %entry
484 ; KNL-NEXT:    kmovw %edi, %k1
485 ; KNL-NEXT:    vpandq %xmm0, %xmm1, %xmm0 {%k1} {z}
486 ; KNL-NEXT:    retq
488 ; SKX-LABEL: test_mm_maskz_and_pd:
489 ; SKX:       ## %bb.0: ## %entry
490 ; SKX-NEXT:    kmovd %edi, %k1
491 ; SKX-NEXT:    vandpd %xmm0, %xmm1, %xmm0 {%k1} {z}
492 ; SKX-NEXT:    retq
493 entry:
494   %0 = bitcast <2 x double> %__A to <2 x i64>
495   %1 = bitcast <2 x double> %__B to <2 x i64>
496   %and.i.i = and <2 x i64> %1, %0
497   %2 = bitcast <2 x i64> %and.i.i to <2 x double>
498   %3 = bitcast i8 %__U to <8 x i1>
499   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
500   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> zeroinitializer
501   ret <2 x double> %4
504 define <8 x float> @test_mm256_mask_and_ps(<8 x float> %__W, i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
505 ; KNL-LABEL: test_mm256_mask_and_ps:
506 ; KNL:       ## %bb.0: ## %entry
507 ; KNL-NEXT:    kmovw %edi, %k1
508 ; KNL-NEXT:    vpandd %ymm1, %ymm2, %ymm0 {%k1}
509 ; KNL-NEXT:    retq
511 ; SKX-LABEL: test_mm256_mask_and_ps:
512 ; SKX:       ## %bb.0: ## %entry
513 ; SKX-NEXT:    kmovd %edi, %k1
514 ; SKX-NEXT:    vandps %ymm1, %ymm2, %ymm0 {%k1}
515 ; SKX-NEXT:    retq
516 entry:
517   %0 = bitcast <8 x float> %__A to <8 x i32>
518   %1 = bitcast <8 x float> %__B to <8 x i32>
519   %and.i.i = and <8 x i32> %1, %0
520   %2 = bitcast <8 x i32> %and.i.i to <8 x float>
521   %3 = bitcast i8 %__U to <8 x i1>
522   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> %__W
523   ret <8 x float> %4
526 define <8 x float> @test_mm256_maskz_and_ps(i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
527 ; KNL-LABEL: test_mm256_maskz_and_ps:
528 ; KNL:       ## %bb.0: ## %entry
529 ; KNL-NEXT:    kmovw %edi, %k1
530 ; KNL-NEXT:    vpandd %ymm0, %ymm1, %ymm0 {%k1} {z}
531 ; KNL-NEXT:    retq
533 ; SKX-LABEL: test_mm256_maskz_and_ps:
534 ; SKX:       ## %bb.0: ## %entry
535 ; SKX-NEXT:    kmovd %edi, %k1
536 ; SKX-NEXT:    vandps %ymm0, %ymm1, %ymm0 {%k1} {z}
537 ; SKX-NEXT:    retq
538 entry:
539   %0 = bitcast <8 x float> %__A to <8 x i32>
540   %1 = bitcast <8 x float> %__B to <8 x i32>
541   %and.i.i = and <8 x i32> %1, %0
542   %2 = bitcast <8 x i32> %and.i.i to <8 x float>
543   %3 = bitcast i8 %__U to <8 x i1>
544   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> zeroinitializer
545   ret <8 x float> %4
548 define <4 x float> @test_mm_mask_and_ps(<4 x float> %__W, i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
549 ; KNL-LABEL: test_mm_mask_and_ps:
550 ; KNL:       ## %bb.0: ## %entry
551 ; KNL-NEXT:    kmovw %edi, %k1
552 ; KNL-NEXT:    vpandd %xmm1, %xmm2, %xmm0 {%k1}
553 ; KNL-NEXT:    retq
555 ; SKX-LABEL: test_mm_mask_and_ps:
556 ; SKX:       ## %bb.0: ## %entry
557 ; SKX-NEXT:    kmovd %edi, %k1
558 ; SKX-NEXT:    vandps %xmm1, %xmm2, %xmm0 {%k1}
559 ; SKX-NEXT:    retq
560 entry:
561   %0 = bitcast <4 x float> %__A to <4 x i32>
562   %1 = bitcast <4 x float> %__B to <4 x i32>
563   %and.i.i = and <4 x i32> %1, %0
564   %2 = bitcast <4 x i32> %and.i.i to <4 x float>
565   %3 = bitcast i8 %__U to <8 x i1>
566   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
567   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> %__W
568   ret <4 x float> %4
571 define <4 x float> @test_mm_maskz_and_ps(i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
572 ; KNL-LABEL: test_mm_maskz_and_ps:
573 ; KNL:       ## %bb.0: ## %entry
574 ; KNL-NEXT:    kmovw %edi, %k1
575 ; KNL-NEXT:    vpandd %xmm0, %xmm1, %xmm0 {%k1} {z}
576 ; KNL-NEXT:    retq
578 ; SKX-LABEL: test_mm_maskz_and_ps:
579 ; SKX:       ## %bb.0: ## %entry
580 ; SKX-NEXT:    kmovd %edi, %k1
581 ; SKX-NEXT:    vandps %xmm0, %xmm1, %xmm0 {%k1} {z}
582 ; SKX-NEXT:    retq
583 entry:
584   %0 = bitcast <4 x float> %__A to <4 x i32>
585   %1 = bitcast <4 x float> %__B to <4 x i32>
586   %and.i.i = and <4 x i32> %1, %0
587   %2 = bitcast <4 x i32> %and.i.i to <4 x float>
588   %3 = bitcast i8 %__U to <8 x i1>
589   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
590   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> zeroinitializer
591   ret <4 x float> %4
594 define <4 x double> @test_mm256_mask_xor_pd(<4 x double> %__W, i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
595 ; KNL-LABEL: test_mm256_mask_xor_pd:
596 ; KNL:       ## %bb.0: ## %entry
597 ; KNL-NEXT:    kmovw %edi, %k1
598 ; KNL-NEXT:    vpxorq %ymm2, %ymm1, %ymm0 {%k1}
599 ; KNL-NEXT:    retq
601 ; SKX-LABEL: test_mm256_mask_xor_pd:
602 ; SKX:       ## %bb.0: ## %entry
603 ; SKX-NEXT:    kmovd %edi, %k1
604 ; SKX-NEXT:    vxorpd %ymm2, %ymm1, %ymm0 {%k1}
605 ; SKX-NEXT:    retq
606 entry:
607   %0 = bitcast <4 x double> %__A to <4 x i64>
608   %1 = bitcast <4 x double> %__B to <4 x i64>
609   %xor.i.i = xor <4 x i64> %0, %1
610   %2 = bitcast <4 x i64> %xor.i.i to <4 x double>
611   %3 = bitcast i8 %__U to <8 x i1>
612   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
613   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> %__W
614   ret <4 x double> %4
617 define <4 x double> @test_mm256_maskz_xor_pd(i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
618 ; KNL-LABEL: test_mm256_maskz_xor_pd:
619 ; KNL:       ## %bb.0: ## %entry
620 ; KNL-NEXT:    kmovw %edi, %k1
621 ; KNL-NEXT:    vpxorq %ymm1, %ymm0, %ymm0 {%k1} {z}
622 ; KNL-NEXT:    retq
624 ; SKX-LABEL: test_mm256_maskz_xor_pd:
625 ; SKX:       ## %bb.0: ## %entry
626 ; SKX-NEXT:    kmovd %edi, %k1
627 ; SKX-NEXT:    vxorpd %ymm1, %ymm0, %ymm0 {%k1} {z}
628 ; SKX-NEXT:    retq
629 entry:
630   %0 = bitcast <4 x double> %__A to <4 x i64>
631   %1 = bitcast <4 x double> %__B to <4 x i64>
632   %xor.i.i = xor <4 x i64> %0, %1
633   %2 = bitcast <4 x i64> %xor.i.i to <4 x double>
634   %3 = bitcast i8 %__U to <8 x i1>
635   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
636   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> zeroinitializer
637   ret <4 x double> %4
640 define <2 x double> @test_mm_mask_xor_pd(<2 x double> %__W, i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
641 ; KNL-LABEL: test_mm_mask_xor_pd:
642 ; KNL:       ## %bb.0: ## %entry
643 ; KNL-NEXT:    kmovw %edi, %k1
644 ; KNL-NEXT:    vpxorq %xmm2, %xmm1, %xmm0 {%k1}
645 ; KNL-NEXT:    retq
647 ; SKX-LABEL: test_mm_mask_xor_pd:
648 ; SKX:       ## %bb.0: ## %entry
649 ; SKX-NEXT:    kmovd %edi, %k1
650 ; SKX-NEXT:    vxorpd %xmm2, %xmm1, %xmm0 {%k1}
651 ; SKX-NEXT:    retq
652 entry:
653   %0 = bitcast <2 x double> %__A to <2 x i64>
654   %1 = bitcast <2 x double> %__B to <2 x i64>
655   %xor.i.i = xor <2 x i64> %0, %1
656   %2 = bitcast <2 x i64> %xor.i.i to <2 x double>
657   %3 = bitcast i8 %__U to <8 x i1>
658   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
659   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> %__W
660   ret <2 x double> %4
663 define <2 x double> @test_mm_maskz_xor_pd(i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
664 ; KNL-LABEL: test_mm_maskz_xor_pd:
665 ; KNL:       ## %bb.0: ## %entry
666 ; KNL-NEXT:    kmovw %edi, %k1
667 ; KNL-NEXT:    vpxorq %xmm1, %xmm0, %xmm0 {%k1} {z}
668 ; KNL-NEXT:    retq
670 ; SKX-LABEL: test_mm_maskz_xor_pd:
671 ; SKX:       ## %bb.0: ## %entry
672 ; SKX-NEXT:    kmovd %edi, %k1
673 ; SKX-NEXT:    vxorpd %xmm1, %xmm0, %xmm0 {%k1} {z}
674 ; SKX-NEXT:    retq
675 entry:
676   %0 = bitcast <2 x double> %__A to <2 x i64>
677   %1 = bitcast <2 x double> %__B to <2 x i64>
678   %xor.i.i = xor <2 x i64> %0, %1
679   %2 = bitcast <2 x i64> %xor.i.i to <2 x double>
680   %3 = bitcast i8 %__U to <8 x i1>
681   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
682   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> zeroinitializer
683   ret <2 x double> %4
686 define <8 x float> @test_mm256_mask_xor_ps(<8 x float> %__W, i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
687 ; KNL-LABEL: test_mm256_mask_xor_ps:
688 ; KNL:       ## %bb.0: ## %entry
689 ; KNL-NEXT:    kmovw %edi, %k1
690 ; KNL-NEXT:    vpxord %ymm2, %ymm1, %ymm0 {%k1}
691 ; KNL-NEXT:    retq
693 ; SKX-LABEL: test_mm256_mask_xor_ps:
694 ; SKX:       ## %bb.0: ## %entry
695 ; SKX-NEXT:    kmovd %edi, %k1
696 ; SKX-NEXT:    vxorps %ymm2, %ymm1, %ymm0 {%k1}
697 ; SKX-NEXT:    retq
698 entry:
699   %0 = bitcast <8 x float> %__A to <8 x i32>
700   %1 = bitcast <8 x float> %__B to <8 x i32>
701   %xor.i.i = xor <8 x i32> %0, %1
702   %2 = bitcast <8 x i32> %xor.i.i to <8 x float>
703   %3 = bitcast i8 %__U to <8 x i1>
704   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> %__W
705   ret <8 x float> %4
708 define <8 x float> @test_mm256_maskz_xor_ps(i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
709 ; KNL-LABEL: test_mm256_maskz_xor_ps:
710 ; KNL:       ## %bb.0: ## %entry
711 ; KNL-NEXT:    kmovw %edi, %k1
712 ; KNL-NEXT:    vpxord %ymm1, %ymm0, %ymm0 {%k1} {z}
713 ; KNL-NEXT:    retq
715 ; SKX-LABEL: test_mm256_maskz_xor_ps:
716 ; SKX:       ## %bb.0: ## %entry
717 ; SKX-NEXT:    kmovd %edi, %k1
718 ; SKX-NEXT:    vxorps %ymm1, %ymm0, %ymm0 {%k1} {z}
719 ; SKX-NEXT:    retq
720 entry:
721   %0 = bitcast <8 x float> %__A to <8 x i32>
722   %1 = bitcast <8 x float> %__B to <8 x i32>
723   %xor.i.i = xor <8 x i32> %0, %1
724   %2 = bitcast <8 x i32> %xor.i.i to <8 x float>
725   %3 = bitcast i8 %__U to <8 x i1>
726   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> zeroinitializer
727   ret <8 x float> %4
730 define <4 x float> @test_mm_mask_xor_ps(<4 x float> %__W, i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
731 ; KNL-LABEL: test_mm_mask_xor_ps:
732 ; KNL:       ## %bb.0: ## %entry
733 ; KNL-NEXT:    kmovw %edi, %k1
734 ; KNL-NEXT:    vpxord %xmm2, %xmm1, %xmm0 {%k1}
735 ; KNL-NEXT:    retq
737 ; SKX-LABEL: test_mm_mask_xor_ps:
738 ; SKX:       ## %bb.0: ## %entry
739 ; SKX-NEXT:    kmovd %edi, %k1
740 ; SKX-NEXT:    vxorps %xmm2, %xmm1, %xmm0 {%k1}
741 ; SKX-NEXT:    retq
742 entry:
743   %0 = bitcast <4 x float> %__A to <4 x i32>
744   %1 = bitcast <4 x float> %__B to <4 x i32>
745   %xor.i.i = xor <4 x i32> %0, %1
746   %2 = bitcast <4 x i32> %xor.i.i to <4 x float>
747   %3 = bitcast i8 %__U to <8 x i1>
748   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
749   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> %__W
750   ret <4 x float> %4
753 define <4 x float> @test_mm_maskz_xor_ps(i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
754 ; KNL-LABEL: test_mm_maskz_xor_ps:
755 ; KNL:       ## %bb.0: ## %entry
756 ; KNL-NEXT:    kmovw %edi, %k1
757 ; KNL-NEXT:    vpxord %xmm1, %xmm0, %xmm0 {%k1} {z}
758 ; KNL-NEXT:    retq
760 ; SKX-LABEL: test_mm_maskz_xor_ps:
761 ; SKX:       ## %bb.0: ## %entry
762 ; SKX-NEXT:    kmovd %edi, %k1
763 ; SKX-NEXT:    vxorps %xmm1, %xmm0, %xmm0 {%k1} {z}
764 ; SKX-NEXT:    retq
765 entry:
766   %0 = bitcast <4 x float> %__A to <4 x i32>
767   %1 = bitcast <4 x float> %__B to <4 x i32>
768   %xor.i.i = xor <4 x i32> %0, %1
769   %2 = bitcast <4 x i32> %xor.i.i to <4 x float>
770   %3 = bitcast i8 %__U to <8 x i1>
771   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
772   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> zeroinitializer
773   ret <4 x float> %4
776 define <4 x double> @test_mm256_mask_or_pd(<4 x double> %__W, i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
777 ; KNL-LABEL: test_mm256_mask_or_pd:
778 ; KNL:       ## %bb.0: ## %entry
779 ; KNL-NEXT:    kmovw %edi, %k1
780 ; KNL-NEXT:    vporq %ymm1, %ymm2, %ymm0 {%k1}
781 ; KNL-NEXT:    retq
783 ; SKX-LABEL: test_mm256_mask_or_pd:
784 ; SKX:       ## %bb.0: ## %entry
785 ; SKX-NEXT:    kmovd %edi, %k1
786 ; SKX-NEXT:    vorpd %ymm1, %ymm2, %ymm0 {%k1}
787 ; SKX-NEXT:    retq
788 entry:
789   %0 = bitcast <4 x double> %__A to <4 x i64>
790   %1 = bitcast <4 x double> %__B to <4 x i64>
791   %or.i.i = or <4 x i64> %1, %0
792   %2 = bitcast <4 x i64> %or.i.i to <4 x double>
793   %3 = bitcast i8 %__U to <8 x i1>
794   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
795   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> %__W
796   ret <4 x double> %4
799 define <4 x double> @test_mm256_maskz_or_pd(i8 zeroext %__U, <4 x double> %__A, <4 x double> %__B) {
800 ; KNL-LABEL: test_mm256_maskz_or_pd:
801 ; KNL:       ## %bb.0: ## %entry
802 ; KNL-NEXT:    kmovw %edi, %k1
803 ; KNL-NEXT:    vporq %ymm0, %ymm1, %ymm0 {%k1} {z}
804 ; KNL-NEXT:    retq
806 ; SKX-LABEL: test_mm256_maskz_or_pd:
807 ; SKX:       ## %bb.0: ## %entry
808 ; SKX-NEXT:    kmovd %edi, %k1
809 ; SKX-NEXT:    vorpd %ymm0, %ymm1, %ymm0 {%k1} {z}
810 ; SKX-NEXT:    retq
811 entry:
812   %0 = bitcast <4 x double> %__A to <4 x i64>
813   %1 = bitcast <4 x double> %__B to <4 x i64>
814   %or.i.i = or <4 x i64> %1, %0
815   %2 = bitcast <4 x i64> %or.i.i to <4 x double>
816   %3 = bitcast i8 %__U to <8 x i1>
817   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
818   %4 = select <4 x i1> %extract.i, <4 x double> %2, <4 x double> zeroinitializer
819   ret <4 x double> %4
822 define <2 x double> @test_mm_mask_or_pd(<2 x double> %__W, i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
823 ; KNL-LABEL: test_mm_mask_or_pd:
824 ; KNL:       ## %bb.0: ## %entry
825 ; KNL-NEXT:    kmovw %edi, %k1
826 ; KNL-NEXT:    vporq %xmm1, %xmm2, %xmm0 {%k1}
827 ; KNL-NEXT:    retq
829 ; SKX-LABEL: test_mm_mask_or_pd:
830 ; SKX:       ## %bb.0: ## %entry
831 ; SKX-NEXT:    kmovd %edi, %k1
832 ; SKX-NEXT:    vorpd %xmm1, %xmm2, %xmm0 {%k1}
833 ; SKX-NEXT:    retq
834 entry:
835   %0 = bitcast <2 x double> %__A to <2 x i64>
836   %1 = bitcast <2 x double> %__B to <2 x i64>
837   %or.i.i = or <2 x i64> %1, %0
838   %2 = bitcast <2 x i64> %or.i.i to <2 x double>
839   %3 = bitcast i8 %__U to <8 x i1>
840   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
841   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> %__W
842   ret <2 x double> %4
845 define <2 x double> @test_mm_maskz_or_pd(i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
846 ; KNL-LABEL: test_mm_maskz_or_pd:
847 ; KNL:       ## %bb.0: ## %entry
848 ; KNL-NEXT:    kmovw %edi, %k1
849 ; KNL-NEXT:    vporq %xmm0, %xmm1, %xmm0 {%k1} {z}
850 ; KNL-NEXT:    retq
852 ; SKX-LABEL: test_mm_maskz_or_pd:
853 ; SKX:       ## %bb.0: ## %entry
854 ; SKX-NEXT:    kmovd %edi, %k1
855 ; SKX-NEXT:    vorpd %xmm0, %xmm1, %xmm0 {%k1} {z}
856 ; SKX-NEXT:    retq
857 entry:
858   %0 = bitcast <2 x double> %__A to <2 x i64>
859   %1 = bitcast <2 x double> %__B to <2 x i64>
860   %or.i.i = or <2 x i64> %1, %0
861   %2 = bitcast <2 x i64> %or.i.i to <2 x double>
862   %3 = bitcast i8 %__U to <8 x i1>
863   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
864   %4 = select <2 x i1> %extract.i, <2 x double> %2, <2 x double> zeroinitializer
865   ret <2 x double> %4
868 define <8 x float> @test_mm256_mask_or_ps(<8 x float> %__W, i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
869 ; KNL-LABEL: test_mm256_mask_or_ps:
870 ; KNL:       ## %bb.0: ## %entry
871 ; KNL-NEXT:    kmovw %edi, %k1
872 ; KNL-NEXT:    vpord %ymm1, %ymm2, %ymm0 {%k1}
873 ; KNL-NEXT:    retq
875 ; SKX-LABEL: test_mm256_mask_or_ps:
876 ; SKX:       ## %bb.0: ## %entry
877 ; SKX-NEXT:    kmovd %edi, %k1
878 ; SKX-NEXT:    vorps %ymm1, %ymm2, %ymm0 {%k1}
879 ; SKX-NEXT:    retq
880 entry:
881   %0 = bitcast <8 x float> %__A to <8 x i32>
882   %1 = bitcast <8 x float> %__B to <8 x i32>
883   %or.i.i = or <8 x i32> %1, %0
884   %2 = bitcast <8 x i32> %or.i.i to <8 x float>
885   %3 = bitcast i8 %__U to <8 x i1>
886   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> %__W
887   ret <8 x float> %4
890 define <8 x float> @test_mm256_maskz_or_ps(i8 zeroext %__U, <8 x float> %__A, <8 x float> %__B) {
891 ; KNL-LABEL: test_mm256_maskz_or_ps:
892 ; KNL:       ## %bb.0: ## %entry
893 ; KNL-NEXT:    kmovw %edi, %k1
894 ; KNL-NEXT:    vpord %ymm0, %ymm1, %ymm0 {%k1} {z}
895 ; KNL-NEXT:    retq
897 ; SKX-LABEL: test_mm256_maskz_or_ps:
898 ; SKX:       ## %bb.0: ## %entry
899 ; SKX-NEXT:    kmovd %edi, %k1
900 ; SKX-NEXT:    vorps %ymm0, %ymm1, %ymm0 {%k1} {z}
901 ; SKX-NEXT:    retq
902 entry:
903   %0 = bitcast <8 x float> %__A to <8 x i32>
904   %1 = bitcast <8 x float> %__B to <8 x i32>
905   %or.i.i = or <8 x i32> %1, %0
906   %2 = bitcast <8 x i32> %or.i.i to <8 x float>
907   %3 = bitcast i8 %__U to <8 x i1>
908   %4 = select <8 x i1> %3, <8 x float> %2, <8 x float> zeroinitializer
909   ret <8 x float> %4
912 define <4 x float> @test_mm_mask_or_ps(<4 x float> %__W, i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
913 ; KNL-LABEL: test_mm_mask_or_ps:
914 ; KNL:       ## %bb.0: ## %entry
915 ; KNL-NEXT:    kmovw %edi, %k1
916 ; KNL-NEXT:    vpord %xmm1, %xmm2, %xmm0 {%k1}
917 ; KNL-NEXT:    retq
919 ; SKX-LABEL: test_mm_mask_or_ps:
920 ; SKX:       ## %bb.0: ## %entry
921 ; SKX-NEXT:    kmovd %edi, %k1
922 ; SKX-NEXT:    vorps %xmm1, %xmm2, %xmm0 {%k1}
923 ; SKX-NEXT:    retq
924 entry:
925   %0 = bitcast <4 x float> %__A to <4 x i32>
926   %1 = bitcast <4 x float> %__B to <4 x i32>
927   %or.i.i = or <4 x i32> %1, %0
928   %2 = bitcast <4 x i32> %or.i.i to <4 x float>
929   %3 = bitcast i8 %__U to <8 x i1>
930   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
931   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> %__W
932   ret <4 x float> %4
935 define <4 x float> @test_mm_maskz_or_ps(i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
936 ; KNL-LABEL: test_mm_maskz_or_ps:
937 ; KNL:       ## %bb.0: ## %entry
938 ; KNL-NEXT:    kmovw %edi, %k1
939 ; KNL-NEXT:    vpord %xmm0, %xmm1, %xmm0 {%k1} {z}
940 ; KNL-NEXT:    retq
942 ; SKX-LABEL: test_mm_maskz_or_ps:
943 ; SKX:       ## %bb.0: ## %entry
944 ; SKX-NEXT:    kmovd %edi, %k1
945 ; SKX-NEXT:    vorps %xmm0, %xmm1, %xmm0 {%k1} {z}
946 ; SKX-NEXT:    retq
947 entry:
948   %0 = bitcast <4 x float> %__A to <4 x i32>
949   %1 = bitcast <4 x float> %__B to <4 x i32>
950   %or.i.i = or <4 x i32> %1, %0
951   %2 = bitcast <4 x i32> %or.i.i to <4 x float>
952   %3 = bitcast i8 %__U to <8 x i1>
953   %extract.i = shufflevector <8 x i1> %3, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
954   %4 = select <4 x i1> %extract.i, <4 x float> %2, <4 x float> zeroinitializer
955   ret <4 x float> %4
958 define <4 x i32> @ternlog_and_andn(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
959 ; CHECK-LABEL: ternlog_and_andn:
960 ; CHECK:       ## %bb.0:
961 ; CHECK-NEXT:    vpternlogd $8, %xmm1, %xmm2, %xmm0
962 ; CHECK-NEXT:    retq
963   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
964   %b = and <4 x i32> %y, %a
965   %c = and <4 x i32> %b, %z
966   ret <4 x i32> %c
969 define <4 x i32> @ternlog_or_andn(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
970 ; CHECK-LABEL: ternlog_or_andn:
971 ; CHECK:       ## %bb.0:
972 ; CHECK-NEXT:    vpternlogd $206, %xmm1, %xmm2, %xmm0
973 ; CHECK-NEXT:    retq
974   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
975   %b = and <4 x i32> %y, %a
976   %c = or <4 x i32> %b, %z
977   ret <4 x i32> %c
980 define <4 x i32> @ternlog_and_orn(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
981 ; CHECK-LABEL: ternlog_and_orn:
982 ; CHECK:       ## %bb.0:
983 ; CHECK-NEXT:    vpternlogd $176, %xmm1, %xmm2, %xmm0
984 ; CHECK-NEXT:    retq
985   %a = xor <4 x i32> %z, <i32 -1, i32 -1, i32 -1, i32 -1>
986   %b = or <4 x i32> %a, %y
987   %c = and <4 x i32> %b, %x
988   ret <4 x i32> %c
991 define <4 x i32> @ternlog_and_orn_2(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
992 ; CHECK-LABEL: ternlog_and_orn_2:
993 ; CHECK:       ## %bb.0:
994 ; CHECK-NEXT:    vpternlogd $208, %xmm2, %xmm1, %xmm0
995 ; CHECK-NEXT:    retq
996   %a = xor <4 x i32> %z, <i32 -1, i32 -1, i32 -1, i32 -1>
997   %b = or <4 x i32> %y, %a
998   %c = and <4 x i32> %b, %x
999   ret <4 x i32> %c
1002 ; FIXME: This should be a single vpternlog, but we accidentally match the xor -1
1003 ; as the second binary op instead of the and.
1004 define <4 x i32> @ternlog_orn_and(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
1005 ; CHECK-LABEL: ternlog_orn_and:
1006 ; CHECK:       ## %bb.0:
1007 ; CHECK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1008 ; CHECK-NEXT:    vpand %xmm2, %xmm1, %xmm1
1009 ; CHECK-NEXT:    vpternlogd $222, %xmm3, %xmm1, %xmm0
1010 ; CHECK-NEXT:    retq
1011   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
1012   %b = and <4 x i32> %y, %z
1013   %c = or <4 x i32> %b, %a
1014   ret <4 x i32> %c
1017 define <4 x i32> @ternlog_orn_and_2(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
1018 ; CHECK-LABEL: ternlog_orn_and_2:
1019 ; CHECK:       ## %bb.0:
1020 ; CHECK-NEXT:    vpternlogd $143, %xmm2, %xmm1, %xmm0
1021 ; CHECK-NEXT:    retq
1022   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
1023   %b = and <4 x i32> %y, %z
1024   %c = or <4 x i32> %a, %b
1025   ret <4 x i32> %c
1028 define <4 x i32> @ternlog_xor_andn(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
1029 ; CHECK-LABEL: ternlog_xor_andn:
1030 ; CHECK:       ## %bb.0:
1031 ; CHECK-NEXT:    vpternlogd $198, %xmm1, %xmm2, %xmm0
1032 ; CHECK-NEXT:    retq
1033   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
1034   %b = and <4 x i32> %y, %a
1035   %c = xor <4 x i32> %b, %z
1036   ret <4 x i32> %c
1039 define <4 x i32> @ternlog_or_and_mask(<4 x i32> %x, <4 x i32> %y) {
1040 ; CHECK-LABEL: ternlog_or_and_mask:
1041 ; CHECK:       ## %bb.0:
1042 ; CHECK-NEXT:    vpternlogd $236, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
1043 ; CHECK-NEXT:    retq
1044   %a = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>
1045   %b = or <4 x i32> %a, %y
1046   ret <4 x i32> %b
1049 define <8 x i32> @ternlog_or_and_mask_ymm(<8 x i32> %x, <8 x i32> %y) {
1050 ; CHECK-LABEL: ternlog_or_and_mask_ymm:
1051 ; CHECK:       ## %bb.0:
1052 ; CHECK-NEXT:    vpternlogd $236, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0
1053 ; CHECK-NEXT:    retq
1054   %a = and <8 x i32> %x, <i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216>
1055   %b = or <8 x i32> %a, %y
1056   ret <8 x i32> %b
1059 define <2 x i64> @ternlog_xor_and_mask(<2 x i64> %x, <2 x i64> %y) {
1060 ; CHECK-LABEL: ternlog_xor_and_mask:
1061 ; CHECK:       ## %bb.0:
1062 ; CHECK-NEXT:    vpternlogq $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm0
1063 ; CHECK-NEXT:    retq
1064   %a = and <2 x i64> %x, <i64 1099511627775, i64 1099511627775>
1065   %b = xor <2 x i64> %a, %y
1066   ret <2 x i64> %b
1069 define <4 x i64> @ternlog_xor_and_mask_ymm(<4 x i64> %x, <4 x i64> %y) {
1070 ; CHECK-LABEL: ternlog_xor_and_mask_ymm:
1071 ; CHECK:       ## %bb.0:
1072 ; CHECK-NEXT:    vpternlogq $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm0
1073 ; CHECK-NEXT:    retq
1074   %a = and <4 x i64> %x, <i64 72057594037927935, i64 72057594037927935, i64 72057594037927935, i64 72057594037927935>
1075   %b = xor <4 x i64> %a, %y
1076   ret <4 x i64> %b
1079 define <4 x i32> @ternlog_maskz_or_and_mask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z, <4 x i32> %mask) {
1080 ; CHECK-LABEL: ternlog_maskz_or_and_mask:
1081 ; CHECK:       ## %bb.0:
1082 ; CHECK-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm2
1083 ; CHECK-NEXT:    vpsrad $31, %xmm3, %xmm0
1084 ; CHECK-NEXT:    vpternlogd $224, %xmm1, %xmm2, %xmm0
1085 ; CHECK-NEXT:    retq
1086   %m = icmp slt <4 x i32> %mask, zeroinitializer
1087   %a = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>
1088   %b = or <4 x i32> %a, %y
1089   %c = select <4 x i1> %m, <4 x i32> %b, <4 x i32> zeroinitializer
1090   ret <4 x i32> %c
1093 define <8 x i32> @ternlog_maskz_or_and_mask_ymm(<8 x i32> %x, <8 x i32> %y, <8 x i32> %mask) {
1094 ; CHECK-LABEL: ternlog_maskz_or_and_mask_ymm:
1095 ; CHECK:       ## %bb.0:
1096 ; CHECK-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm3
1097 ; CHECK-NEXT:    vpsrad $31, %ymm2, %ymm0
1098 ; CHECK-NEXT:    vpternlogd $224, %ymm1, %ymm3, %ymm0
1099 ; CHECK-NEXT:    retq
1100   %m = icmp slt <8 x i32> %mask, zeroinitializer
1101   %a = and <8 x i32> %x, <i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216>
1102   %b = or <8 x i32> %a, %y
1103   %c = select <8 x i1> %m, <8 x i32> %b, <8 x i32> zeroinitializer
1104   ret <8 x i32> %c
1107 define <2 x i64> @ternlog_maskz_xor_and_mask(<2 x i64> %x, <2 x i64> %y, <2 x i64> %mask) {
1108 ; CHECK-LABEL: ternlog_maskz_xor_and_mask:
1109 ; CHECK:       ## %bb.0:
1110 ; CHECK-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm3
1111 ; CHECK-NEXT:    vpsraq $63, %xmm2, %xmm0
1112 ; CHECK-NEXT:    vpternlogq $96, %xmm1, %xmm3, %xmm0
1113 ; CHECK-NEXT:    retq
1114   %m = icmp slt <2 x i64> %mask, zeroinitializer
1115   %a = and <2 x i64> %x, <i64 1099511627775, i64 1099511627775>
1116   %b = xor <2 x i64> %a, %y
1117   %c = select <2 x i1> %m, <2 x i64> %b, <2 x i64> zeroinitializer
1118   ret <2 x i64> %c
1121 define <4 x i64> @ternlog_maskz_xor_and_mask_ymm(<4 x i64> %x, <4 x i64> %y, <4 x i64> %mask) {
1122 ; CHECK-LABEL: ternlog_maskz_xor_and_mask_ymm:
1123 ; CHECK:       ## %bb.0:
1124 ; CHECK-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
1125 ; CHECK-NEXT:    vpsraq $63, %ymm2, %ymm0
1126 ; CHECK-NEXT:    vpternlogq $96, %ymm1, %ymm3, %ymm0
1127 ; CHECK-NEXT:    retq
1128   %m = icmp slt <4 x i64> %mask, zeroinitializer
1129   %a = and <4 x i64> %x, <i64 72057594037927935, i64 72057594037927935, i64 72057594037927935, i64 72057594037927935>
1130   %b = xor <4 x i64> %a, %y
1131   %c = select <4 x i1> %m, <4 x i64> %b, <4 x i64> zeroinitializer
1132   ret <4 x i64> %c
1135 define <4 x i32> @ternlog_maskx_or_and_mask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z, <4 x i32> %mask) {
1136 ; KNL-LABEL: ternlog_maskx_or_and_mask:
1137 ; KNL:       ## %bb.0:
1138 ; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1139 ; KNL-NEXT:    vpcmpgtd %xmm3, %xmm2, %k1
1140 ; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm2
1141 ; KNL-NEXT:    vpord %xmm1, %xmm2, %xmm0 {%k1}
1142 ; KNL-NEXT:    retq
1144 ; SKX-LABEL: ternlog_maskx_or_and_mask:
1145 ; SKX:       ## %bb.0:
1146 ; SKX-NEXT:    vpmovd2m %xmm3, %k1
1147 ; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm2
1148 ; SKX-NEXT:    vorps %xmm1, %xmm2, %xmm0 {%k1}
1149 ; SKX-NEXT:    retq
1150   %m = icmp slt <4 x i32> %mask, zeroinitializer
1151   %a = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>
1152   %b = or <4 x i32> %a, %y
1153   %c = select <4 x i1> %m, <4 x i32> %b, <4 x i32> %x
1154   ret <4 x i32> %c
1157 define <8 x i32> @ternlog_maskx_or_and_mask_ymm(<8 x i32> %x, <8 x i32> %y, <8 x i32> %mask) {
1158 ; KNL-LABEL: ternlog_maskx_or_and_mask_ymm:
1159 ; KNL:       ## %bb.0:
1160 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1161 ; KNL-NEXT:    vpcmpgtd %ymm2, %ymm3, %k1
1162 ; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm2
1163 ; KNL-NEXT:    vpord %ymm1, %ymm2, %ymm0 {%k1}
1164 ; KNL-NEXT:    retq
1166 ; SKX-LABEL: ternlog_maskx_or_and_mask_ymm:
1167 ; SKX:       ## %bb.0:
1168 ; SKX-NEXT:    vpmovd2m %ymm2, %k1
1169 ; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm2
1170 ; SKX-NEXT:    vorps %ymm1, %ymm2, %ymm0 {%k1}
1171 ; SKX-NEXT:    retq
1172   %m = icmp slt <8 x i32> %mask, zeroinitializer
1173   %a = and <8 x i32> %x, <i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216>
1174   %b = or <8 x i32> %a, %y
1175   %c = select <8 x i1> %m, <8 x i32> %b, <8 x i32> %x
1176   ret <8 x i32> %c
1179 define <2 x i64> @ternlog_maskx_xor_and_mask(<2 x i64> %x, <2 x i64> %y, <2 x i64> %mask) {
1180 ; KNL-LABEL: ternlog_maskx_xor_and_mask:
1181 ; KNL:       ## %bb.0:
1182 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1183 ; KNL-NEXT:    vpcmpgtq %xmm2, %xmm3, %k1
1184 ; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm2
1185 ; KNL-NEXT:    vpxorq %xmm1, %xmm2, %xmm0 {%k1}
1186 ; KNL-NEXT:    retq
1188 ; SKX-LABEL: ternlog_maskx_xor_and_mask:
1189 ; SKX:       ## %bb.0:
1190 ; SKX-NEXT:    vpmovq2m %xmm2, %k1
1191 ; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm2
1192 ; SKX-NEXT:    vxorpd %xmm1, %xmm2, %xmm0 {%k1}
1193 ; SKX-NEXT:    retq
1194   %m = icmp slt <2 x i64> %mask, zeroinitializer
1195   %a = and <2 x i64> %x, <i64 1099511627775, i64 1099511627775>
1196   %b = xor <2 x i64> %a, %y
1197   %c = select <2 x i1> %m, <2 x i64> %b, <2 x i64> %x
1198   ret <2 x i64> %c
1201 define <4 x i64> @ternlog_maskx_xor_and_mask_ymm(<4 x i64> %x, <4 x i64> %y, <4 x i64> %mask) {
1202 ; KNL-LABEL: ternlog_maskx_xor_and_mask_ymm:
1203 ; KNL:       ## %bb.0:
1204 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1205 ; KNL-NEXT:    vpcmpgtq %ymm2, %ymm3, %k1
1206 ; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
1207 ; KNL-NEXT:    vpxorq %ymm1, %ymm2, %ymm0 {%k1}
1208 ; KNL-NEXT:    retq
1210 ; SKX-LABEL: ternlog_maskx_xor_and_mask_ymm:
1211 ; SKX:       ## %bb.0:
1212 ; SKX-NEXT:    vpmovq2m %ymm2, %k1
1213 ; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
1214 ; SKX-NEXT:    vxorpd %ymm1, %ymm2, %ymm0 {%k1}
1215 ; SKX-NEXT:    retq
1216   %m = icmp slt <4 x i64> %mask, zeroinitializer
1217   %a = and <4 x i64> %x, <i64 72057594037927935, i64 72057594037927935, i64 72057594037927935, i64 72057594037927935>
1218   %b = xor <4 x i64> %a, %y
1219   %c = select <4 x i1> %m, <4 x i64> %b, <4 x i64> %x
1220   ret <4 x i64> %c
1223 define <4 x i32> @ternlog_masky_or_and_mask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z, <4 x i32> %mask) {
1224 ; KNL-LABEL: ternlog_masky_or_and_mask:
1225 ; KNL:       ## %bb.0:
1226 ; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1227 ; KNL-NEXT:    vpcmpgtd %xmm3, %xmm2, %k1
1228 ; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1229 ; KNL-NEXT:    vpord %xmm1, %xmm0, %xmm1 {%k1}
1230 ; KNL-NEXT:    vmovdqa %xmm1, %xmm0
1231 ; KNL-NEXT:    retq
1233 ; SKX-LABEL: ternlog_masky_or_and_mask:
1234 ; SKX:       ## %bb.0:
1235 ; SKX-NEXT:    vpmovd2m %xmm3, %k1
1236 ; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1237 ; SKX-NEXT:    vorps %xmm1, %xmm0, %xmm1 {%k1}
1238 ; SKX-NEXT:    vmovaps %xmm1, %xmm0
1239 ; SKX-NEXT:    retq
1240   %m = icmp slt <4 x i32> %mask, zeroinitializer
1241   %a = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>
1242   %b = or <4 x i32> %a, %y
1243   %c = select <4 x i1> %m, <4 x i32> %b, <4 x i32> %y
1244   ret <4 x i32> %c
1247 define <8 x i32> @ternlog_masky_or_and_mask_ymm(<8 x i32> %x, <8 x i32> %y, <8 x i32> %mask) {
1248 ; KNL-LABEL: ternlog_masky_or_and_mask_ymm:
1249 ; KNL:       ## %bb.0:
1250 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1251 ; KNL-NEXT:    vpcmpgtd %ymm2, %ymm3, %k1
1252 ; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm2
1253 ; KNL-NEXT:    vpord %ymm1, %ymm2, %ymm0 {%k1}
1254 ; KNL-NEXT:    retq
1256 ; SKX-LABEL: ternlog_masky_or_and_mask_ymm:
1257 ; SKX:       ## %bb.0:
1258 ; SKX-NEXT:    vpmovd2m %ymm2, %k1
1259 ; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm2
1260 ; SKX-NEXT:    vorps %ymm1, %ymm2, %ymm0 {%k1}
1261 ; SKX-NEXT:    retq
1262   %m = icmp slt <8 x i32> %mask, zeroinitializer
1263   %a = and <8 x i32> %x, <i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216, i32 -16777216>
1264   %b = or <8 x i32> %a, %y
1265   %c = select <8 x i1> %m, <8 x i32> %b, <8 x i32> %x
1266   ret <8 x i32> %c
1269 define <2 x i64> @ternlog_masky_xor_and_mask(<2 x i64> %x, <2 x i64> %y, <2 x i64> %mask) {
1270 ; KNL-LABEL: ternlog_masky_xor_and_mask:
1271 ; KNL:       ## %bb.0:
1272 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1273 ; KNL-NEXT:    vpcmpgtq %xmm2, %xmm3, %k1
1274 ; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
1275 ; KNL-NEXT:    vpxorq %xmm1, %xmm0, %xmm1 {%k1}
1276 ; KNL-NEXT:    vmovdqa %xmm1, %xmm0
1277 ; KNL-NEXT:    retq
1279 ; SKX-LABEL: ternlog_masky_xor_and_mask:
1280 ; SKX:       ## %bb.0:
1281 ; SKX-NEXT:    vpmovq2m %xmm2, %k1
1282 ; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
1283 ; SKX-NEXT:    vxorpd %xmm1, %xmm0, %xmm1 {%k1}
1284 ; SKX-NEXT:    vmovapd %xmm1, %xmm0
1285 ; SKX-NEXT:    retq
1286   %m = icmp slt <2 x i64> %mask, zeroinitializer
1287   %a = and <2 x i64> %x, <i64 1099511627775, i64 1099511627775>
1288   %b = xor <2 x i64> %a, %y
1289   %c = select <2 x i1> %m, <2 x i64> %b, <2 x i64> %y
1290   ret <2 x i64> %c
1293 define <4 x i64> @ternlog_masky_xor_and_mask_ymm(<4 x i64> %x, <4 x i64> %y, <4 x i64> %mask) {
1294 ; KNL-LABEL: ternlog_masky_xor_and_mask_ymm:
1295 ; KNL:       ## %bb.0:
1296 ; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1297 ; KNL-NEXT:    vpcmpgtq %ymm2, %ymm3, %k1
1298 ; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1299 ; KNL-NEXT:    vpxorq %ymm1, %ymm0, %ymm1 {%k1}
1300 ; KNL-NEXT:    vmovdqa %ymm1, %ymm0
1301 ; KNL-NEXT:    retq
1303 ; SKX-LABEL: ternlog_masky_xor_and_mask_ymm:
1304 ; SKX:       ## %bb.0:
1305 ; SKX-NEXT:    vpmovq2m %ymm2, %k1
1306 ; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1307 ; SKX-NEXT:    vxorpd %ymm1, %ymm0, %ymm1 {%k1}
1308 ; SKX-NEXT:    vmovapd %ymm1, %ymm0
1309 ; SKX-NEXT:    retq
1310   %m = icmp slt <4 x i64> %mask, zeroinitializer
1311   %a = and <4 x i64> %x, <i64 72057594037927935, i64 72057594037927935, i64 72057594037927935, i64 72057594037927935>
1312   %b = xor <4 x i64> %a, %y
1313   %c = select <4 x i1> %m, <4 x i64> %b, <4 x i64> %y
1314   ret <4 x i64> %c
1317 define <4 x i32> @ternlog_andn_or(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
1318 ; CHECK-LABEL: ternlog_andn_or:
1319 ; CHECK:       ## %bb.0:
1320 ; CHECK-NEXT:    vpternlogd $14, %xmm2, %xmm1, %xmm0
1321 ; CHECK-NEXT:    retq
1322   %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
1323   %b = or <4 x i32> %y, %z
1324   %c = and <4 x i32> %a, %b
1325   ret <4 x i32> %c
1328 define <4 x i32> @ternlog_andn_or_2(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
1329 ; CHECK-LABEL: ternlog_andn_or_2:
1330 ; CHECK:       ## %bb.0:
1331 ; CHECK-NEXT:    vpternlogd $16, %xmm2, %xmm1, %xmm0
1332 ; CHECK-NEXT:    retq
1333   %a = or <4 x i32> %y, %z
1334   %b = xor <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
1335   %c = and <4 x i32> %x, %b
1336   ret <4 x i32> %c