1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=ALL --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=ALL --check-prefix=SKX
4
5
6define <16 x i32> @vpandd(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp {
7; ALL-LABEL: vpandd:
8; ALL:       ## %bb.0: ## %entry
9; ALL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
10; ALL-NEXT:    vpandd %zmm1, %zmm0, %zmm0
11; ALL-NEXT:    retq
12entry:
13  ; Force the execution domain with an add.
14  %a2 = add <16 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2,
15                            i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
16  %x = and <16 x i32> %a2, %b
17  ret <16 x i32> %x
18}
19
20define <16 x i32> @vpandnd(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp {
21; ALL-LABEL: vpandnd:
22; ALL:       ## %bb.0: ## %entry
23; ALL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
24; ALL-NEXT:    vpandnd %zmm0, %zmm1, %zmm0
25; ALL-NEXT:    retq
26entry:
27  ; Force the execution domain with an add.
28  %a2 = add <16 x i32> %a, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3,
29                            i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
30  %b2 = xor <16 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1,
31                            i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
32  %x = and <16 x i32> %a2, %b2
33  ret <16 x i32> %x
34}
35
36define <16 x i32> @vpord(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp {
37; ALL-LABEL: vpord:
38; ALL:       ## %bb.0: ## %entry
39; ALL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
40; ALL-NEXT:    vpord %zmm1, %zmm0, %zmm0
41; ALL-NEXT:    retq
42entry:
43  ; Force the execution domain with an add.
44  %a2 = add <16 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4,
45                            i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
46  %x = or <16 x i32> %a2, %b
47  ret <16 x i32> %x
48}
49
50define <16 x i32> @vpxord(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp {
51; ALL-LABEL: vpxord:
52; ALL:       ## %bb.0: ## %entry
53; ALL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
54; ALL-NEXT:    vpxord %zmm1, %zmm0, %zmm0
55; ALL-NEXT:    retq
56entry:
57  ; Force the execution domain with an add.
58  %a2 = add <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5,
59                            i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
60  %x = xor <16 x i32> %a2, %b
61  ret <16 x i32> %x
62}
63
64define <8 x i64> @vpandq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp {
65; ALL-LABEL: vpandq:
66; ALL:       ## %bb.0: ## %entry
67; ALL-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
68; ALL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
69; ALL-NEXT:    retq
70entry:
71  ; Force the execution domain with an add.
72  %a2 = add <8 x i64> %a, <i64 6, i64 6, i64 6, i64 6, i64 6, i64 6, i64 6, i64 6>
73  %x = and <8 x i64> %a2, %b
74  ret <8 x i64> %x
75}
76
77define <8 x i64> @vpandnq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp {
78; ALL-LABEL: vpandnq:
79; ALL:       ## %bb.0: ## %entry
80; ALL-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
81; ALL-NEXT:    vpandnq %zmm0, %zmm1, %zmm0
82; ALL-NEXT:    retq
83entry:
84  ; Force the execution domain with an add.
85  %a2 = add <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>
86  %b2 = xor <8 x i64> %b, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
87  %x = and <8 x i64> %a2, %b2
88  ret <8 x i64> %x
89}
90
91define <8 x i64> @vporq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp {
92; ALL-LABEL: vporq:
93; ALL:       ## %bb.0: ## %entry
94; ALL-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
95; ALL-NEXT:    vporq %zmm1, %zmm0, %zmm0
96; ALL-NEXT:    retq
97entry:
98  ; Force the execution domain with an add.
99  %a2 = add <8 x i64> %a, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8>
100  %x = or <8 x i64> %a2, %b
101  ret <8 x i64> %x
102}
103
104define <8 x i64> @vpxorq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp {
105; ALL-LABEL: vpxorq:
106; ALL:       ## %bb.0: ## %entry
107; ALL-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
108; ALL-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
109; ALL-NEXT:    retq
110entry:
111  ; Force the execution domain with an add.
112  %a2 = add <8 x i64> %a, <i64 9, i64 9, i64 9, i64 9, i64 9, i64 9, i64 9, i64 9>
113  %x = xor <8 x i64> %a2, %b
114  ret <8 x i64> %x
115}
116
117
118define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind {
119; KNL-LABEL: orq_broadcast:
120; KNL:       ## %bb.0:
121; KNL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
122; KNL-NEXT:    retq
123;
124; SKX-LABEL: orq_broadcast:
125; SKX:       ## %bb.0:
126; SKX-NEXT:    vorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
127; SKX-NEXT:    retq
128  %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
129  ret <8 x i64> %b
130}
131
132define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) {
133; KNL-LABEL: andd512fold:
134; KNL:       ## %bb.0: ## %entry
135; KNL-NEXT:    vpandd (%rdi), %zmm0, %zmm0
136; KNL-NEXT:    retq
137;
138; SKX-LABEL: andd512fold:
139; SKX:       ## %bb.0: ## %entry
140; SKX-NEXT:    vandps (%rdi), %zmm0, %zmm0
141; SKX-NEXT:    retq
142entry:
143  %a = load <16 x i32>, <16 x i32>* %x, align 4
144  %b = and <16 x i32> %y, %a
145  ret <16 x i32> %b
146}
147
148define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) {
149; KNL-LABEL: andqbrst:
150; KNL:       ## %bb.0: ## %entry
151; KNL-NEXT:    vpandq (%rdi){1to8}, %zmm0, %zmm0
152; KNL-NEXT:    retq
153;
154; SKX-LABEL: andqbrst:
155; SKX:       ## %bb.0: ## %entry
156; SKX-NEXT:    vandpd (%rdi){1to8}, %zmm0, %zmm0
157; SKX-NEXT:    retq
158entry:
159  %a = load i64, i64* %ap, align 8
160  %b = insertelement <8 x i64> undef, i64 %a, i32 0
161  %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
162  %d = and <8 x i64> %p1, %c
163  ret <8 x i64>%d
164}
165
166define <64 x i8> @and_v64i8(<64 x i8> %a, <64 x i8> %b) {
167; KNL-LABEL: and_v64i8:
168; KNL:       ## %bb.0:
169; KNL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
170; KNL-NEXT:    retq
171;
172; SKX-LABEL: and_v64i8:
173; SKX:       ## %bb.0:
174; SKX-NEXT:    vandps %zmm1, %zmm0, %zmm0
175; SKX-NEXT:    retq
176  %res = and <64 x i8> %a, %b
177  ret <64 x i8> %res
178}
179
180define <64 x i8> @andn_v64i8(<64 x i8> %a, <64 x i8> %b) {
181; KNL-LABEL: andn_v64i8:
182; KNL:       ## %bb.0:
183; KNL-NEXT:    vpandnq %zmm0, %zmm1, %zmm0
184; KNL-NEXT:    retq
185;
186; SKX-LABEL: andn_v64i8:
187; SKX:       ## %bb.0:
188; SKX-NEXT:    vandnps %zmm0, %zmm1, %zmm0
189; SKX-NEXT:    retq
190  %b2 = xor <64 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
191                           i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
192                           i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
193                           i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
194  %res = and <64 x i8> %a, %b2
195  ret <64 x i8> %res
196}
197
198define <64 x i8> @or_v64i8(<64 x i8> %a, <64 x i8> %b) {
199; KNL-LABEL: or_v64i8:
200; KNL:       ## %bb.0:
201; KNL-NEXT:    vporq %zmm1, %zmm0, %zmm0
202; KNL-NEXT:    retq
203;
204; SKX-LABEL: or_v64i8:
205; SKX:       ## %bb.0:
206; SKX-NEXT:    vorps %zmm1, %zmm0, %zmm0
207; SKX-NEXT:    retq
208  %res = or <64 x i8> %a, %b
209  ret <64 x i8> %res
210}
211
212define <64 x i8> @xor_v64i8(<64 x i8> %a, <64 x i8> %b) {
213; KNL-LABEL: xor_v64i8:
214; KNL:       ## %bb.0:
215; KNL-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
216; KNL-NEXT:    retq
217;
218; SKX-LABEL: xor_v64i8:
219; SKX:       ## %bb.0:
220; SKX-NEXT:    vxorps %zmm1, %zmm0, %zmm0
221; SKX-NEXT:    retq
222  %res = xor <64 x i8> %a, %b
223  ret <64 x i8> %res
224}
225
226define <32 x i16> @and_v32i16(<32 x i16> %a, <32 x i16> %b) {
227; KNL-LABEL: and_v32i16:
228; KNL:       ## %bb.0:
229; KNL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
230; KNL-NEXT:    retq
231;
232; SKX-LABEL: and_v32i16:
233; SKX:       ## %bb.0:
234; SKX-NEXT:    vandps %zmm1, %zmm0, %zmm0
235; SKX-NEXT:    retq
236  %res = and <32 x i16> %a, %b
237  ret <32 x i16> %res
238}
239
240define <32 x i16> @andn_v32i16(<32 x i16> %a, <32 x i16> %b) {
241; KNL-LABEL: andn_v32i16:
242; KNL:       ## %bb.0:
243; KNL-NEXT:    vpandnq %zmm0, %zmm1, %zmm0
244; KNL-NEXT:    retq
245;
246; SKX-LABEL: andn_v32i16:
247; SKX:       ## %bb.0:
248; SKX-NEXT:    vandnps %zmm0, %zmm1, %zmm0
249; SKX-NEXT:    retq
250  %b2 = xor <32 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1,
251                            i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
252  %res = and <32 x i16> %a, %b2
253  ret <32 x i16> %res
254}
255
256define <32 x i16> @or_v32i16(<32 x i16> %a, <32 x i16> %b) {
257; KNL-LABEL: or_v32i16:
258; KNL:       ## %bb.0:
259; KNL-NEXT:    vporq %zmm1, %zmm0, %zmm0
260; KNL-NEXT:    retq
261;
262; SKX-LABEL: or_v32i16:
263; SKX:       ## %bb.0:
264; SKX-NEXT:    vorps %zmm1, %zmm0, %zmm0
265; SKX-NEXT:    retq
266  %res = or <32 x i16> %a, %b
267  ret <32 x i16> %res
268}
269
270define <32 x i16> @xor_v32i16(<32 x i16> %a, <32 x i16> %b) {
271; KNL-LABEL: xor_v32i16:
272; KNL:       ## %bb.0:
273; KNL-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
274; KNL-NEXT:    retq
275;
276; SKX-LABEL: xor_v32i16:
277; SKX:       ## %bb.0:
278; SKX-NEXT:    vxorps %zmm1, %zmm0, %zmm0
279; SKX-NEXT:    retq
280  %res = xor <32 x i16> %a, %b
281  ret <32 x i16> %res
282}
283
284define <16 x float> @masked_and_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) {
285; KNL-LABEL: masked_and_v16f32:
286; KNL:       ## %bb.0:
287; KNL-NEXT:    kmovw %edi, %k1
288; KNL-NEXT:    vpandd %zmm1, %zmm0, %zmm2 {%k1}
289; KNL-NEXT:    vaddps %zmm2, %zmm3, %zmm0
290; KNL-NEXT:    retq
291;
292; SKX-LABEL: masked_and_v16f32:
293; SKX:       ## %bb.0:
294; SKX-NEXT:    kmovd %edi, %k1
295; SKX-NEXT:    vandps %zmm1, %zmm0, %zmm2 {%k1}
296; SKX-NEXT:    vaddps %zmm2, %zmm3, %zmm0
297; SKX-NEXT:    retq
298  %a1 = bitcast <16 x float> %a to <16 x i32>
299  %b1 = bitcast <16 x float> %b to <16 x i32>
300  %passThru1 = bitcast <16 x float> %passThru to <16 x i32>
301  %mask1 = bitcast i16 %mask to <16 x i1>
302  %op = and <16 x i32> %a1, %b1
303  %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1
304  %cast = bitcast <16 x i32> %select to <16 x float>
305  %add = fadd <16 x float> %c, %cast
306  ret <16 x float> %add
307}
308
309define <16 x float> @masked_or_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) {
310; KNL-LABEL: masked_or_v16f32:
311; KNL:       ## %bb.0:
312; KNL-NEXT:    kmovw %edi, %k1
313; KNL-NEXT:    vpandd %zmm1, %zmm0, %zmm2 {%k1}
314; KNL-NEXT:    vaddps %zmm2, %zmm3, %zmm0
315; KNL-NEXT:    retq
316;
317; SKX-LABEL: masked_or_v16f32:
318; SKX:       ## %bb.0:
319; SKX-NEXT:    kmovd %edi, %k1
320; SKX-NEXT:    vandps %zmm1, %zmm0, %zmm2 {%k1}
321; SKX-NEXT:    vaddps %zmm2, %zmm3, %zmm0
322; SKX-NEXT:    retq
323  %a1 = bitcast <16 x float> %a to <16 x i32>
324  %b1 = bitcast <16 x float> %b to <16 x i32>
325  %passThru1 = bitcast <16 x float> %passThru to <16 x i32>
326  %mask1 = bitcast i16 %mask to <16 x i1>
327  %op = and <16 x i32> %a1, %b1
328  %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1
329  %cast = bitcast <16 x i32> %select to <16 x float>
330  %add = fadd <16 x float> %c, %cast
331  ret <16 x float> %add
332}
333
334define <16 x float> @masked_xor_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) {
335; KNL-LABEL: masked_xor_v16f32:
336; KNL:       ## %bb.0:
337; KNL-NEXT:    kmovw %edi, %k1
338; KNL-NEXT:    vpandd %zmm1, %zmm0, %zmm2 {%k1}
339; KNL-NEXT:    vaddps %zmm2, %zmm3, %zmm0
340; KNL-NEXT:    retq
341;
342; SKX-LABEL: masked_xor_v16f32:
343; SKX:       ## %bb.0:
344; SKX-NEXT:    kmovd %edi, %k1
345; SKX-NEXT:    vandps %zmm1, %zmm0, %zmm2 {%k1}
346; SKX-NEXT:    vaddps %zmm2, %zmm3, %zmm0
347; SKX-NEXT:    retq
348  %a1 = bitcast <16 x float> %a to <16 x i32>
349  %b1 = bitcast <16 x float> %b to <16 x i32>
350  %passThru1 = bitcast <16 x float> %passThru to <16 x i32>
351  %mask1 = bitcast i16 %mask to <16 x i1>
352  %op = and <16 x i32> %a1, %b1
353  %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1
354  %cast = bitcast <16 x i32> %select to <16 x float>
355  %add = fadd <16 x float> %c, %cast
356  ret <16 x float> %add
357}
358
359define <8 x double> @masked_and_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) {
360; KNL-LABEL: masked_and_v8f64:
361; KNL:       ## %bb.0:
362; KNL-NEXT:    kmovw %edi, %k1
363; KNL-NEXT:    vpandq %zmm1, %zmm0, %zmm2 {%k1}
364; KNL-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
365; KNL-NEXT:    retq
366;
367; SKX-LABEL: masked_and_v8f64:
368; SKX:       ## %bb.0:
369; SKX-NEXT:    kmovd %edi, %k1
370; SKX-NEXT:    vandpd %zmm1, %zmm0, %zmm2 {%k1}
371; SKX-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
372; SKX-NEXT:    retq
373  %a1 = bitcast <8 x double> %a to <8 x i64>
374  %b1 = bitcast <8 x double> %b to <8 x i64>
375  %passThru1 = bitcast <8 x double> %passThru to <8 x i64>
376  %mask1 = bitcast i8 %mask to <8 x i1>
377  %op = and <8 x i64> %a1, %b1
378  %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1
379  %cast = bitcast <8 x i64> %select to <8 x double>
380  %add = fadd <8 x double> %c, %cast
381  ret <8 x double> %add
382}
383
384define <8 x double> @masked_or_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) {
385; KNL-LABEL: masked_or_v8f64:
386; KNL:       ## %bb.0:
387; KNL-NEXT:    kmovw %edi, %k1
388; KNL-NEXT:    vpandq %zmm1, %zmm0, %zmm2 {%k1}
389; KNL-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
390; KNL-NEXT:    retq
391;
392; SKX-LABEL: masked_or_v8f64:
393; SKX:       ## %bb.0:
394; SKX-NEXT:    kmovd %edi, %k1
395; SKX-NEXT:    vandpd %zmm1, %zmm0, %zmm2 {%k1}
396; SKX-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
397; SKX-NEXT:    retq
398  %a1 = bitcast <8 x double> %a to <8 x i64>
399  %b1 = bitcast <8 x double> %b to <8 x i64>
400  %passThru1 = bitcast <8 x double> %passThru to <8 x i64>
401  %mask1 = bitcast i8 %mask to <8 x i1>
402  %op = and <8 x i64> %a1, %b1
403  %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1
404  %cast = bitcast <8 x i64> %select to <8 x double>
405  %add = fadd <8 x double> %c, %cast
406  ret <8 x double> %add
407}
408
409define <8 x double> @masked_xor_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) {
410; KNL-LABEL: masked_xor_v8f64:
411; KNL:       ## %bb.0:
412; KNL-NEXT:    kmovw %edi, %k1
413; KNL-NEXT:    vpandq %zmm1, %zmm0, %zmm2 {%k1}
414; KNL-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
415; KNL-NEXT:    retq
416;
417; SKX-LABEL: masked_xor_v8f64:
418; SKX:       ## %bb.0:
419; SKX-NEXT:    kmovd %edi, %k1
420; SKX-NEXT:    vandpd %zmm1, %zmm0, %zmm2 {%k1}
421; SKX-NEXT:    vaddpd %zmm2, %zmm3, %zmm0
422; SKX-NEXT:    retq
423  %a1 = bitcast <8 x double> %a to <8 x i64>
424  %b1 = bitcast <8 x double> %b to <8 x i64>
425  %passThru1 = bitcast <8 x double> %passThru to <8 x i64>
426  %mask1 = bitcast i8 %mask to <8 x i1>
427  %op = and <8 x i64> %a1, %b1
428  %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1
429  %cast = bitcast <8 x i64> %select to <8 x double>
430  %add = fadd <8 x double> %c, %cast
431  ret <8 x double> %add
432}
433
434define <8 x i64> @test_mm512_mask_and_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) {
435; KNL-LABEL: test_mm512_mask_and_epi32:
436; KNL:       ## %bb.0: ## %entry
437; KNL-NEXT:    kmovw %edi, %k1
438; KNL-NEXT:    vpandd %zmm2, %zmm1, %zmm0 {%k1}
439; KNL-NEXT:    retq
440;
441; SKX-LABEL: test_mm512_mask_and_epi32:
442; SKX:       ## %bb.0: ## %entry
443; SKX-NEXT:    kmovd %edi, %k1
444; SKX-NEXT:    vandps %zmm2, %zmm1, %zmm0 {%k1}
445; SKX-NEXT:    retq
446entry:
447  %and1.i.i = and <8 x i64> %__a, %__b
448  %0 = bitcast <8 x i64> %and1.i.i to <16 x i32>
449  %1 = bitcast <8 x i64> %__src to <16 x i32>
450  %2 = bitcast i16 %__k to <16 x i1>
451  %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1
452  %4 = bitcast <16 x i32> %3 to <8 x i64>
453  ret <8 x i64> %4
454}
455
456define <8 x i64> @test_mm512_mask_or_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) {
457; KNL-LABEL: test_mm512_mask_or_epi32:
458; KNL:       ## %bb.0: ## %entry
459; KNL-NEXT:    kmovw %edi, %k1
460; KNL-NEXT:    vpord %zmm2, %zmm1, %zmm0 {%k1}
461; KNL-NEXT:    retq
462;
463; SKX-LABEL: test_mm512_mask_or_epi32:
464; SKX:       ## %bb.0: ## %entry
465; SKX-NEXT:    kmovd %edi, %k1
466; SKX-NEXT:    vorps %zmm2, %zmm1, %zmm0 {%k1}
467; SKX-NEXT:    retq
468entry:
469  %or1.i.i = or <8 x i64> %__a, %__b
470  %0 = bitcast <8 x i64> %or1.i.i to <16 x i32>
471  %1 = bitcast <8 x i64> %__src to <16 x i32>
472  %2 = bitcast i16 %__k to <16 x i1>
473  %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1
474  %4 = bitcast <16 x i32> %3 to <8 x i64>
475  ret <8 x i64> %4
476}
477
478define <8 x i64> @test_mm512_mask_xor_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) {
479; KNL-LABEL: test_mm512_mask_xor_epi32:
480; KNL:       ## %bb.0: ## %entry
481; KNL-NEXT:    kmovw %edi, %k1
482; KNL-NEXT:    vpxord %zmm2, %zmm1, %zmm0 {%k1}
483; KNL-NEXT:    retq
484;
485; SKX-LABEL: test_mm512_mask_xor_epi32:
486; SKX:       ## %bb.0: ## %entry
487; SKX-NEXT:    kmovd %edi, %k1
488; SKX-NEXT:    vxorps %zmm2, %zmm1, %zmm0 {%k1}
489; SKX-NEXT:    retq
490entry:
491  %xor1.i.i = xor <8 x i64> %__a, %__b
492  %0 = bitcast <8 x i64> %xor1.i.i to <16 x i32>
493  %1 = bitcast <8 x i64> %__src to <16 x i32>
494  %2 = bitcast i16 %__k to <16 x i1>
495  %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1
496  %4 = bitcast <16 x i32> %3 to <8 x i64>
497  ret <8 x i64> %4
498}
499
500define <8 x double> @test_mm512_mask_xor_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
501; KNL-LABEL: test_mm512_mask_xor_pd:
502; KNL:       ## %bb.0: ## %entry
503; KNL-NEXT:    kmovw %edi, %k1
504; KNL-NEXT:    vpxorq %zmm2, %zmm1, %zmm0 {%k1}
505; KNL-NEXT:    retq
506;
507; SKX-LABEL: test_mm512_mask_xor_pd:
508; SKX:       ## %bb.0: ## %entry
509; SKX-NEXT:    kmovd %edi, %k1
510; SKX-NEXT:    vxorpd %zmm2, %zmm1, %zmm0 {%k1}
511; SKX-NEXT:    retq
512entry:
513  %0 = bitcast <8 x double> %__A to <8 x i64>
514  %1 = bitcast <8 x double> %__B to <8 x i64>
515  %xor.i.i = xor <8 x i64> %0, %1
516  %2 = bitcast <8 x i64> %xor.i.i to <8 x double>
517  %3 = bitcast i8 %__U to <8 x i1>
518  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W
519  ret <8 x double> %4
520}
521
522define <8 x double> @test_mm512_maskz_xor_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
523; KNL-LABEL: test_mm512_maskz_xor_pd:
524; KNL:       ## %bb.0: ## %entry
525; KNL-NEXT:    kmovw %edi, %k1
526; KNL-NEXT:    vpxorq %zmm1, %zmm0, %zmm0 {%k1} {z}
527; KNL-NEXT:    retq
528;
529; SKX-LABEL: test_mm512_maskz_xor_pd:
530; SKX:       ## %bb.0: ## %entry
531; SKX-NEXT:    kmovd %edi, %k1
532; SKX-NEXT:    vxorpd %zmm1, %zmm0, %zmm0 {%k1} {z}
533; SKX-NEXT:    retq
534entry:
535  %0 = bitcast <8 x double> %__A to <8 x i64>
536  %1 = bitcast <8 x double> %__B to <8 x i64>
537  %xor.i.i = xor <8 x i64> %0, %1
538  %2 = bitcast <8 x i64> %xor.i.i to <8 x double>
539  %3 = bitcast i8 %__U to <8 x i1>
540  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer
541  ret <8 x double> %4
542}
543
544define <16 x float> @test_mm512_mask_xor_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
545; KNL-LABEL: test_mm512_mask_xor_ps:
546; KNL:       ## %bb.0: ## %entry
547; KNL-NEXT:    kmovw %edi, %k1
548; KNL-NEXT:    vpxord %zmm2, %zmm1, %zmm0 {%k1}
549; KNL-NEXT:    retq
550;
551; SKX-LABEL: test_mm512_mask_xor_ps:
552; SKX:       ## %bb.0: ## %entry
553; SKX-NEXT:    kmovd %edi, %k1
554; SKX-NEXT:    vxorps %zmm2, %zmm1, %zmm0 {%k1}
555; SKX-NEXT:    retq
556entry:
557  %0 = bitcast <16 x float> %__A to <16 x i32>
558  %1 = bitcast <16 x float> %__B to <16 x i32>
559  %xor.i.i = xor <16 x i32> %0, %1
560  %2 = bitcast <16 x i32> %xor.i.i to <16 x float>
561  %3 = bitcast i16 %__U to <16 x i1>
562  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W
563  ret <16 x float> %4
564}
565
566define <16 x float> @test_mm512_maskz_xor_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
567; KNL-LABEL: test_mm512_maskz_xor_ps:
568; KNL:       ## %bb.0: ## %entry
569; KNL-NEXT:    kmovw %edi, %k1
570; KNL-NEXT:    vpxord %zmm1, %zmm0, %zmm0 {%k1} {z}
571; KNL-NEXT:    retq
572;
573; SKX-LABEL: test_mm512_maskz_xor_ps:
574; SKX:       ## %bb.0: ## %entry
575; SKX-NEXT:    kmovd %edi, %k1
576; SKX-NEXT:    vxorps %zmm1, %zmm0, %zmm0 {%k1} {z}
577; SKX-NEXT:    retq
578entry:
579  %0 = bitcast <16 x float> %__A to <16 x i32>
580  %1 = bitcast <16 x float> %__B to <16 x i32>
581  %xor.i.i = xor <16 x i32> %0, %1
582  %2 = bitcast <16 x i32> %xor.i.i to <16 x float>
583  %3 = bitcast i16 %__U to <16 x i1>
584  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer
585  ret <16 x float> %4
586}
587
588define <8 x double> @test_mm512_mask_or_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
589; KNL-LABEL: test_mm512_mask_or_pd:
590; KNL:       ## %bb.0: ## %entry
591; KNL-NEXT:    kmovw %edi, %k1
592; KNL-NEXT:    vporq %zmm1, %zmm2, %zmm0 {%k1}
593; KNL-NEXT:    retq
594;
595; SKX-LABEL: test_mm512_mask_or_pd:
596; SKX:       ## %bb.0: ## %entry
597; SKX-NEXT:    kmovd %edi, %k1
598; SKX-NEXT:    vorpd %zmm1, %zmm2, %zmm0 {%k1}
599; SKX-NEXT:    retq
600entry:
601  %0 = bitcast <8 x double> %__A to <8 x i64>
602  %1 = bitcast <8 x double> %__B to <8 x i64>
603  %or.i.i = or <8 x i64> %1, %0
604  %2 = bitcast <8 x i64> %or.i.i to <8 x double>
605  %3 = bitcast i8 %__U to <8 x i1>
606  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W
607  ret <8 x double> %4
608}
609
610define <8 x double> @test_mm512_maskz_or_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
611; KNL-LABEL: test_mm512_maskz_or_pd:
612; KNL:       ## %bb.0: ## %entry
613; KNL-NEXT:    kmovw %edi, %k1
614; KNL-NEXT:    vporq %zmm0, %zmm1, %zmm0 {%k1} {z}
615; KNL-NEXT:    retq
616;
617; SKX-LABEL: test_mm512_maskz_or_pd:
618; SKX:       ## %bb.0: ## %entry
619; SKX-NEXT:    kmovd %edi, %k1
620; SKX-NEXT:    vorpd %zmm0, %zmm1, %zmm0 {%k1} {z}
621; SKX-NEXT:    retq
622entry:
623  %0 = bitcast <8 x double> %__A to <8 x i64>
624  %1 = bitcast <8 x double> %__B to <8 x i64>
625  %or.i.i = or <8 x i64> %1, %0
626  %2 = bitcast <8 x i64> %or.i.i to <8 x double>
627  %3 = bitcast i8 %__U to <8 x i1>
628  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer
629  ret <8 x double> %4
630}
631
632define <16 x float> @test_mm512_mask_or_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
633; KNL-LABEL: test_mm512_mask_or_ps:
634; KNL:       ## %bb.0: ## %entry
635; KNL-NEXT:    kmovw %edi, %k1
636; KNL-NEXT:    vpord %zmm1, %zmm2, %zmm0 {%k1}
637; KNL-NEXT:    retq
638;
639; SKX-LABEL: test_mm512_mask_or_ps:
640; SKX:       ## %bb.0: ## %entry
641; SKX-NEXT:    kmovd %edi, %k1
642; SKX-NEXT:    vorps %zmm1, %zmm2, %zmm0 {%k1}
643; SKX-NEXT:    retq
644entry:
645  %0 = bitcast <16 x float> %__A to <16 x i32>
646  %1 = bitcast <16 x float> %__B to <16 x i32>
647  %or.i.i = or <16 x i32> %1, %0
648  %2 = bitcast <16 x i32> %or.i.i to <16 x float>
649  %3 = bitcast i16 %__U to <16 x i1>
650  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W
651  ret <16 x float> %4
652}
653
654define <16 x float> @test_mm512_maskz_or_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
655; KNL-LABEL: test_mm512_maskz_or_ps:
656; KNL:       ## %bb.0: ## %entry
657; KNL-NEXT:    kmovw %edi, %k1
658; KNL-NEXT:    vpord %zmm0, %zmm1, %zmm0 {%k1} {z}
659; KNL-NEXT:    retq
660;
661; SKX-LABEL: test_mm512_maskz_or_ps:
662; SKX:       ## %bb.0: ## %entry
663; SKX-NEXT:    kmovd %edi, %k1
664; SKX-NEXT:    vorps %zmm0, %zmm1, %zmm0 {%k1} {z}
665; SKX-NEXT:    retq
666entry:
667  %0 = bitcast <16 x float> %__A to <16 x i32>
668  %1 = bitcast <16 x float> %__B to <16 x i32>
669  %or.i.i = or <16 x i32> %1, %0
670  %2 = bitcast <16 x i32> %or.i.i to <16 x float>
671  %3 = bitcast i16 %__U to <16 x i1>
672  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer
673  ret <16 x float> %4
674}
675
676define <8 x double> @test_mm512_mask_and_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
677; KNL-LABEL: test_mm512_mask_and_pd:
678; KNL:       ## %bb.0: ## %entry
679; KNL-NEXT:    kmovw %edi, %k1
680; KNL-NEXT:    vpandq %zmm1, %zmm2, %zmm0 {%k1}
681; KNL-NEXT:    retq
682;
683; SKX-LABEL: test_mm512_mask_and_pd:
684; SKX:       ## %bb.0: ## %entry
685; SKX-NEXT:    kmovd %edi, %k1
686; SKX-NEXT:    vandpd %zmm1, %zmm2, %zmm0 {%k1}
687; SKX-NEXT:    retq
688entry:
689  %0 = bitcast <8 x double> %__A to <8 x i64>
690  %1 = bitcast <8 x double> %__B to <8 x i64>
691  %and.i.i = and <8 x i64> %1, %0
692  %2 = bitcast <8 x i64> %and.i.i to <8 x double>
693  %3 = bitcast i8 %__U to <8 x i1>
694  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W
695  ret <8 x double> %4
696}
697
698define <8 x double> @test_mm512_maskz_and_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
699; KNL-LABEL: test_mm512_maskz_and_pd:
700; KNL:       ## %bb.0: ## %entry
701; KNL-NEXT:    kmovw %edi, %k1
702; KNL-NEXT:    vpandq %zmm0, %zmm1, %zmm0 {%k1} {z}
703; KNL-NEXT:    retq
704;
705; SKX-LABEL: test_mm512_maskz_and_pd:
706; SKX:       ## %bb.0: ## %entry
707; SKX-NEXT:    kmovd %edi, %k1
708; SKX-NEXT:    vandpd %zmm0, %zmm1, %zmm0 {%k1} {z}
709; SKX-NEXT:    retq
710entry:
711  %0 = bitcast <8 x double> %__A to <8 x i64>
712  %1 = bitcast <8 x double> %__B to <8 x i64>
713  %and.i.i = and <8 x i64> %1, %0
714  %2 = bitcast <8 x i64> %and.i.i to <8 x double>
715  %3 = bitcast i8 %__U to <8 x i1>
716  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer
717  ret <8 x double> %4
718}
719
720define <16 x float> @test_mm512_mask_and_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
721; KNL-LABEL: test_mm512_mask_and_ps:
722; KNL:       ## %bb.0: ## %entry
723; KNL-NEXT:    kmovw %edi, %k1
724; KNL-NEXT:    vpandd %zmm1, %zmm2, %zmm0 {%k1}
725; KNL-NEXT:    retq
726;
727; SKX-LABEL: test_mm512_mask_and_ps:
728; SKX:       ## %bb.0: ## %entry
729; SKX-NEXT:    kmovd %edi, %k1
730; SKX-NEXT:    vandps %zmm1, %zmm2, %zmm0 {%k1}
731; SKX-NEXT:    retq
732entry:
733  %0 = bitcast <16 x float> %__A to <16 x i32>
734  %1 = bitcast <16 x float> %__B to <16 x i32>
735  %and.i.i = and <16 x i32> %1, %0
736  %2 = bitcast <16 x i32> %and.i.i to <16 x float>
737  %3 = bitcast i16 %__U to <16 x i1>
738  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W
739  ret <16 x float> %4
740}
741
742define <16 x float> @test_mm512_maskz_and_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
743; KNL-LABEL: test_mm512_maskz_and_ps:
744; KNL:       ## %bb.0: ## %entry
745; KNL-NEXT:    kmovw %edi, %k1
746; KNL-NEXT:    vpandd %zmm0, %zmm1, %zmm0 {%k1} {z}
747; KNL-NEXT:    retq
748;
749; SKX-LABEL: test_mm512_maskz_and_ps:
750; SKX:       ## %bb.0: ## %entry
751; SKX-NEXT:    kmovd %edi, %k1
752; SKX-NEXT:    vandps %zmm0, %zmm1, %zmm0 {%k1} {z}
753; SKX-NEXT:    retq
754entry:
755  %0 = bitcast <16 x float> %__A to <16 x i32>
756  %1 = bitcast <16 x float> %__B to <16 x i32>
757  %and.i.i = and <16 x i32> %1, %0
758  %2 = bitcast <16 x i32> %and.i.i to <16 x float>
759  %3 = bitcast i16 %__U to <16 x i1>
760  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer
761  ret <16 x float> %4
762}
763
764define <8 x double> @test_mm512_mask_andnot_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
765; KNL-LABEL: test_mm512_mask_andnot_pd:
766; KNL:       ## %bb.0: ## %entry
767; KNL-NEXT:    kmovw %edi, %k1
768; KNL-NEXT:    vpandnq %zmm2, %zmm1, %zmm0 {%k1}
769; KNL-NEXT:    retq
770;
771; SKX-LABEL: test_mm512_mask_andnot_pd:
772; SKX:       ## %bb.0: ## %entry
773; SKX-NEXT:    kmovd %edi, %k1
774; SKX-NEXT:    vandnpd %zmm2, %zmm1, %zmm0 {%k1}
775; SKX-NEXT:    retq
776entry:
777  %0 = bitcast <8 x double> %__A to <8 x i64>
778  %neg.i.i = xor <8 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
779  %1 = bitcast <8 x double> %__B to <8 x i64>
780  %and.i.i = and <8 x i64> %1, %neg.i.i
781  %2 = bitcast <8 x i64> %and.i.i to <8 x double>
782  %3 = bitcast i8 %__U to <8 x i1>
783  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W
784  ret <8 x double> %4
785}
786
787define <8 x double> @test_mm512_maskz_andnot_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) {
788; KNL-LABEL: test_mm512_maskz_andnot_pd:
789; KNL:       ## %bb.0: ## %entry
790; KNL-NEXT:    kmovw %edi, %k1
791; KNL-NEXT:    vpandnq %zmm1, %zmm0, %zmm0 {%k1} {z}
792; KNL-NEXT:    retq
793;
794; SKX-LABEL: test_mm512_maskz_andnot_pd:
795; SKX:       ## %bb.0: ## %entry
796; SKX-NEXT:    kmovd %edi, %k1
797; SKX-NEXT:    vandnpd %zmm1, %zmm0, %zmm0 {%k1} {z}
798; SKX-NEXT:    retq
799entry:
800  %0 = bitcast <8 x double> %__A to <8 x i64>
801  %neg.i.i = xor <8 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
802  %1 = bitcast <8 x double> %__B to <8 x i64>
803  %and.i.i = and <8 x i64> %1, %neg.i.i
804  %2 = bitcast <8 x i64> %and.i.i to <8 x double>
805  %3 = bitcast i8 %__U to <8 x i1>
806  %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer
807  ret <8 x double> %4
808}
809
810define <16 x float> @test_mm512_mask_andnot_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
811; KNL-LABEL: test_mm512_mask_andnot_ps:
812; KNL:       ## %bb.0: ## %entry
813; KNL-NEXT:    kmovw %edi, %k1
814; KNL-NEXT:    vpandnd %zmm2, %zmm1, %zmm0 {%k1}
815; KNL-NEXT:    retq
816;
817; SKX-LABEL: test_mm512_mask_andnot_ps:
818; SKX:       ## %bb.0: ## %entry
819; SKX-NEXT:    kmovd %edi, %k1
820; SKX-NEXT:    vandnps %zmm2, %zmm1, %zmm0 {%k1}
821; SKX-NEXT:    retq
822entry:
823  %0 = bitcast <16 x float> %__A to <16 x i32>
824  %neg.i.i = xor <16 x i32> %0, <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>
825  %1 = bitcast <16 x float> %__B to <16 x i32>
826  %and.i.i = and <16 x i32> %1, %neg.i.i
827  %2 = bitcast <16 x i32> %and.i.i to <16 x float>
828  %3 = bitcast i16 %__U to <16 x i1>
829  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W
830  ret <16 x float> %4
831}
832
833define <16 x float> @test_mm512_maskz_andnot_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) {
834; KNL-LABEL: test_mm512_maskz_andnot_ps:
835; KNL:       ## %bb.0: ## %entry
836; KNL-NEXT:    kmovw %edi, %k1
837; KNL-NEXT:    vpandnd %zmm1, %zmm0, %zmm0 {%k1} {z}
838; KNL-NEXT:    retq
839;
840; SKX-LABEL: test_mm512_maskz_andnot_ps:
841; SKX:       ## %bb.0: ## %entry
842; SKX-NEXT:    kmovd %edi, %k1
843; SKX-NEXT:    vandnps %zmm1, %zmm0, %zmm0 {%k1} {z}
844; SKX-NEXT:    retq
845entry:
846  %0 = bitcast <16 x float> %__A to <16 x i32>
847  %neg.i.i = xor <16 x i32> %0, <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>
848  %1 = bitcast <16 x float> %__B to <16 x i32>
849  %and.i.i = and <16 x i32> %1, %neg.i.i
850  %2 = bitcast <16 x i32> %and.i.i to <16 x float>
851  %3 = bitcast i16 %__U to <16 x i1>
852  %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer
853  ret <16 x float> %4
854}
855
856define <16 x i32> @ternlog_and_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) {
857; ALL-LABEL: ternlog_and_andn:
858; ALL:       ## %bb.0:
859; ALL-NEXT:    vpternlogd $8, %zmm1, %zmm2, %zmm0
860; ALL-NEXT:    retq
861  %a = xor <16 x i32> %x, <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>
862  %b = and <16 x i32> %y, %a
863  %c = and <16 x i32> %b, %z
864  ret <16 x i32> %c
865}
866
867define <16 x i32> @ternlog_or_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) {
868; ALL-LABEL: ternlog_or_andn:
869; ALL:       ## %bb.0:
870; ALL-NEXT:    vpternlogd $206, %zmm1, %zmm2, %zmm0
871; ALL-NEXT:    retq
872  %a = xor <16 x i32> %x, <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>
873  %b = and <16 x i32> %y, %a
874  %c = or <16 x i32> %b, %z
875  ret <16 x i32> %c
876}
877
878define <16 x i32> @ternlog_xor_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) {
879; ALL-LABEL: ternlog_xor_andn:
880; ALL:       ## %bb.0:
881; ALL-NEXT:    vpternlogd $198, %zmm1, %zmm2, %zmm0
882; ALL-NEXT:    retq
883  %a = xor <16 x i32> %x, <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>
884  %b = and <16 x i32> %y, %a
885  %c = xor <16 x i32> %b, %z
886  ret <16 x i32> %c
887}
888
889define <16 x i32> @ternlog_or_and_mask(<16 x i32> %x, <16 x i32> %y) {
890; ALL-LABEL: ternlog_or_and_mask:
891; ALL:       ## %bb.0:
892; ALL-NEXT:    vpternlogd $236, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm0
893; ALL-NEXT:    retq
894  %a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
895  %b = or <16 x i32> %a, %y
896  ret <16 x i32> %b
897}
898
899define <8 x i64> @ternlog_xor_and_mask(<8 x i64> %x, <8 x i64> %y) {
900; ALL-LABEL: ternlog_xor_and_mask:
901; ALL:       ## %bb.0:
902; ALL-NEXT:    vpternlogq $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm0
903; ALL-NEXT:    retq
904  %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
905  %b = xor <8 x i64> %a, %y
906  ret <8 x i64> %b
907}
908
909define <16 x i32> @ternlog_maskz_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) {
910; KNL-LABEL: ternlog_maskz_or_and_mask:
911; KNL:       ## %bb.0:
912; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
913; KNL-NEXT:    vpcmpgtd %zmm2, %zmm3, %k1
914; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
915; KNL-NEXT:    vpord %zmm1, %zmm0, %zmm0 {%k1} {z}
916; KNL-NEXT:    retq
917;
918; SKX-LABEL: ternlog_maskz_or_and_mask:
919; SKX:       ## %bb.0:
920; SKX-NEXT:    vpmovd2m %zmm2, %k1
921; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
922; SKX-NEXT:    vorps %zmm1, %zmm0, %zmm0 {%k1} {z}
923; SKX-NEXT:    retq
924  %m = icmp slt <16 x i32> %mask, zeroinitializer
925  %a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
926  %b = or <16 x i32> %a, %y
927  %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> zeroinitializer
928  ret <16 x i32> %c
929}
930
931define <8 x i64> @ternlog_maskz_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) {
932; KNL-LABEL: ternlog_maskz_xor_and_mask:
933; KNL:       ## %bb.0:
934; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
935; KNL-NEXT:    vpcmpgtq %zmm2, %zmm3, %k1
936; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
937; KNL-NEXT:    vpxorq %zmm1, %zmm0, %zmm0 {%k1} {z}
938; KNL-NEXT:    retq
939;
940; SKX-LABEL: ternlog_maskz_xor_and_mask:
941; SKX:       ## %bb.0:
942; SKX-NEXT:    vpmovq2m %zmm2, %k1
943; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
944; SKX-NEXT:    vxorpd %zmm1, %zmm0, %zmm0 {%k1} {z}
945; SKX-NEXT:    retq
946  %m = icmp slt <8 x i64> %mask, zeroinitializer
947  %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
948  %b = xor <8 x i64> %a, %y
949  %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> zeroinitializer
950  ret <8 x i64> %c
951}
952
953define <16 x i32> @ternlog_maskx_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) {
954; KNL-LABEL: ternlog_maskx_or_and_mask:
955; KNL:       ## %bb.0:
956; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
957; KNL-NEXT:    vpcmpgtd %zmm2, %zmm3, %k1
958; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm2
959; KNL-NEXT:    vpord %zmm1, %zmm2, %zmm0 {%k1}
960; KNL-NEXT:    retq
961;
962; SKX-LABEL: ternlog_maskx_or_and_mask:
963; SKX:       ## %bb.0:
964; SKX-NEXT:    vpmovd2m %zmm2, %k1
965; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm2
966; SKX-NEXT:    vorps %zmm1, %zmm2, %zmm0 {%k1}
967; SKX-NEXT:    retq
968  %m = icmp slt <16 x i32> %mask, zeroinitializer
969  %a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
970  %b = or <16 x i32> %a, %y
971  %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> %x
972  ret <16 x i32> %c
973}
974
975define <16 x i32> @ternlog_masky_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) {
976; KNL-LABEL: ternlog_masky_or_and_mask:
977; KNL:       ## %bb.0:
978; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
979; KNL-NEXT:    vpcmpgtd %zmm2, %zmm3, %k1
980; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
981; KNL-NEXT:    vpord %zmm1, %zmm0, %zmm1 {%k1}
982; KNL-NEXT:    vmovdqa64 %zmm1, %zmm0
983; KNL-NEXT:    retq
984;
985; SKX-LABEL: ternlog_masky_or_and_mask:
986; SKX:       ## %bb.0:
987; SKX-NEXT:    vpmovd2m %zmm2, %k1
988; SKX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
989; SKX-NEXT:    vorps %zmm1, %zmm0, %zmm1 {%k1}
990; SKX-NEXT:    vmovaps %zmm1, %zmm0
991; SKX-NEXT:    retq
992  %m = icmp slt <16 x i32> %mask, zeroinitializer
993  %a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
994  %b = or <16 x i32> %a, %y
995  %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> %y
996  ret <16 x i32> %c
997}
998
999define <8 x i64> @ternlog_maskx_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) {
1000; KNL-LABEL: ternlog_maskx_xor_and_mask:
1001; KNL:       ## %bb.0:
1002; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1003; KNL-NEXT:    vpcmpgtq %zmm2, %zmm3, %k1
1004; KNL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm2
1005; KNL-NEXT:    vpxorq %zmm1, %zmm2, %zmm0 {%k1}
1006; KNL-NEXT:    retq
1007;
1008; SKX-LABEL: ternlog_maskx_xor_and_mask:
1009; SKX:       ## %bb.0:
1010; SKX-NEXT:    vpmovq2m %zmm2, %k1
1011; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm2
1012; SKX-NEXT:    vxorpd %zmm1, %zmm2, %zmm0 {%k1}
1013; SKX-NEXT:    retq
1014  %m = icmp slt <8 x i64> %mask, zeroinitializer
1015  %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
1016  %b = xor <8 x i64> %a, %y
1017  %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> %x
1018  ret <8 x i64> %c
1019}
1020
1021define <8 x i64> @ternlog_masky_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) {
1022; KNL-LABEL: ternlog_masky_xor_and_mask:
1023; KNL:       ## %bb.0:
1024; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1025; KNL-NEXT:    vpcmpgtq %zmm2, %zmm3, %k1
1026; KNL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1027; KNL-NEXT:    vpxorq %zmm1, %zmm0, %zmm1 {%k1}
1028; KNL-NEXT:    vmovdqa64 %zmm1, %zmm0
1029; KNL-NEXT:    retq
1030;
1031; SKX-LABEL: ternlog_masky_xor_and_mask:
1032; SKX:       ## %bb.0:
1033; SKX-NEXT:    vpmovq2m %zmm2, %k1
1034; SKX-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1035; SKX-NEXT:    vxorpd %zmm1, %zmm0, %zmm1 {%k1}
1036; SKX-NEXT:    vmovapd %zmm1, %zmm0
1037; SKX-NEXT:    retq
1038  %m = icmp slt <8 x i64> %mask, zeroinitializer
1039  %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
1040  %b = xor <8 x i64> %a, %y
1041  %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> %y
1042  ret <8 x i64> %c
1043}
1044