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=CHECK --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
4
5define <16 x float> @test1(<16 x float> %x, <16 x float> %y) nounwind {
6; CHECK-LABEL: test1:
7; CHECK:       ## BB#0:
8; CHECK-NEXT:    vcmpleps %zmm1, %zmm0, %k1
9; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
10; CHECK-NEXT:    retq
11  %mask = fcmp ole <16 x float> %x, %y
12  %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %y
13  ret <16 x float> %max
14}
15
16define <8 x double> @test2(<8 x double> %x, <8 x double> %y) nounwind {
17; CHECK-LABEL: test2:
18; CHECK:       ## BB#0:
19; CHECK-NEXT:    vcmplepd %zmm1, %zmm0, %k1
20; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
21; CHECK-NEXT:    retq
22  %mask = fcmp ole <8 x double> %x, %y
23  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %y
24  ret <8 x double> %max
25}
26
27define <16 x i32> @test3(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %yp) nounwind {
28; CHECK-LABEL: test3:
29; CHECK:       ## BB#0:
30; CHECK-NEXT:    vpcmpeqd (%rdi), %zmm0, %k1
31; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
32; CHECK-NEXT:    retq
33  %y = load <16 x i32>, <16 x i32>* %yp, align 4
34  %mask = icmp eq <16 x i32> %x, %y
35  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
36  ret <16 x i32> %max
37}
38
39define <16 x i32> @test4_unsigned(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
40; CHECK-LABEL: test4_unsigned:
41; CHECK:       ## BB#0:
42; CHECK-NEXT:    vpcmpnltud %zmm1, %zmm0, %k1
43; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1}
44; CHECK-NEXT:    retq
45  %mask = icmp uge <16 x i32> %x, %y
46  %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
47  ret <16 x i32> %max
48}
49
50define <8 x i64> @test5(<8 x i64> %x, <8 x i64> %y) nounwind {
51; CHECK-LABEL: test5:
52; CHECK:       ## BB#0:
53; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k1
54; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
55; CHECK-NEXT:    retq
56  %mask = icmp eq <8 x i64> %x, %y
57  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %y
58  ret <8 x i64> %max
59}
60
61define <8 x i64> @test6_unsigned(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1) nounwind {
62; CHECK-LABEL: test6_unsigned:
63; CHECK:       ## BB#0:
64; CHECK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
65; CHECK-NEXT:    vpblendmq %zmm2, %zmm1, %zmm0 {%k1}
66; CHECK-NEXT:    retq
67  %mask = icmp ugt <8 x i64> %x, %y
68  %max = select <8 x i1> %mask, <8 x i64> %x1, <8 x i64> %y
69  ret <8 x i64> %max
70}
71
72define <4 x float> @test7(<4 x float> %a, <4 x float> %b) {
73; KNL-LABEL: test7:
74; KNL:       ## BB#0:
75; KNL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
76; KNL-NEXT:    vcmpltps %xmm2, %xmm0, %xmm2
77; KNL-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
78; KNL-NEXT:    retq
79;
80; SKX-LABEL: test7:
81; SKX:       ## BB#0:
82; SKX-NEXT:    vxorps %xmm2, %xmm2, %xmm2
83; SKX-NEXT:    vcmpltps %xmm2, %xmm0, %k1
84; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1}
85; SKX-NEXT:    retq
86
87  %mask = fcmp olt <4 x float> %a, zeroinitializer
88  %c = select <4 x i1>%mask, <4 x float>%a, <4 x float>%b
89  ret <4 x float>%c
90}
91
92define <2 x double> @test8(<2 x double> %a, <2 x double> %b) {
93; KNL-LABEL: test8:
94; KNL:       ## BB#0:
95; KNL-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
96; KNL-NEXT:    vcmpltpd %xmm2, %xmm0, %xmm2
97; KNL-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
98; KNL-NEXT:    retq
99;
100; SKX-LABEL: test8:
101; SKX:       ## BB#0:
102; SKX-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
103; SKX-NEXT:    vcmpltpd %xmm2, %xmm0, %k1
104; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1}
105; SKX-NEXT:    retq
106  %mask = fcmp olt <2 x double> %a, zeroinitializer
107  %c = select <2 x i1>%mask, <2 x double>%a, <2 x double>%b
108  ret <2 x double>%c
109}
110
111define <8 x i32> @test9(<8 x i32> %x, <8 x i32> %y) nounwind {
112; KNL-LABEL: test9:
113; KNL:       ## BB#0:
114; KNL-NEXT:    ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
115; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
116; KNL-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1
117; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
118; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
119; KNL-NEXT:    retq
120;
121; SKX-LABEL: test9:
122; SKX:       ## BB#0:
123; SKX-NEXT:    vpcmpeqd %ymm1, %ymm0, %k1
124; SKX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
125; SKX-NEXT:    retq
126  %mask = icmp eq <8 x i32> %x, %y
127  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
128  ret <8 x i32> %max
129}
130
131define <8 x float> @test10(<8 x float> %x, <8 x float> %y) nounwind {
132; KNL-LABEL: test10:
133; KNL:       ## BB#0:
134; KNL-NEXT:    ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
135; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
136; KNL-NEXT:    vcmpeqps %zmm1, %zmm0, %k1
137; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
138; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
139; KNL-NEXT:    retq
140;
141; SKX-LABEL: test10:
142; SKX:       ## BB#0:
143; SKX-NEXT:    vcmpeqps %ymm1, %ymm0, %k1
144; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1}
145; SKX-NEXT:    retq
146
147  %mask = fcmp oeq <8 x float> %x, %y
148  %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %y
149  ret <8 x float> %max
150}
151
152define <8 x i32> @test11_unsigned(<8 x i32> %x, <8 x i32> %y) nounwind {
153; CHECK-LABEL: test11_unsigned:
154; CHECK:       ## BB#0:
155; CHECK-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
156; CHECK-NEXT:    retq
157  %mask = icmp ugt <8 x i32> %x, %y
158  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
159  ret <8 x i32> %max
160}
161
162define i16 @test12(<16 x i64> %a, <16 x i64> %b) nounwind {
163; CHECK-LABEL: test12:
164; CHECK:       ## BB#0:
165; CHECK-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0
166; CHECK-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1
167; CHECK-NEXT:    kunpckbw %k0, %k1, %k0
168; CHECK-NEXT:    kmovw %k0, %eax
169; CHECK-NEXT:    retq
170  %res = icmp eq <16 x i64> %a, %b
171  %res1 = bitcast <16 x i1> %res to i16
172  ret i16 %res1
173}
174
175define i32 @test12_v32i32(<32 x i32> %a, <32 x i32> %b) nounwind {
176; KNL-LABEL: test12_v32i32:
177; KNL:       ## BB#0:
178; KNL-NEXT:    pushq %rbp
179; KNL-NEXT:    movq %rsp, %rbp
180; KNL-NEXT:    andq $-32, %rsp
181; KNL-NEXT:    subq $32, %rsp
182; KNL-NEXT:    vpcmpeqd %zmm3, %zmm1, %k0
183; KNL-NEXT:    kshiftlw $14, %k0, %k1
184; KNL-NEXT:    kshiftrw $15, %k1, %k1
185; KNL-NEXT:    kmovw %k1, %eax
186; KNL-NEXT:    kshiftlw $15, %k0, %k1
187; KNL-NEXT:    kshiftrw $15, %k1, %k1
188; KNL-NEXT:    kmovw %k1, %ecx
189; KNL-NEXT:    vmovd %ecx, %xmm1
190; KNL-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
191; KNL-NEXT:    kshiftlw $13, %k0, %k1
192; KNL-NEXT:    kshiftrw $15, %k1, %k1
193; KNL-NEXT:    kmovw %k1, %eax
194; KNL-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
195; KNL-NEXT:    kshiftlw $12, %k0, %k1
196; KNL-NEXT:    kshiftrw $15, %k1, %k1
197; KNL-NEXT:    kmovw %k1, %eax
198; KNL-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
199; KNL-NEXT:    kshiftlw $11, %k0, %k1
200; KNL-NEXT:    kshiftrw $15, %k1, %k1
201; KNL-NEXT:    kmovw %k1, %eax
202; KNL-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
203; KNL-NEXT:    kshiftlw $10, %k0, %k1
204; KNL-NEXT:    kshiftrw $15, %k1, %k1
205; KNL-NEXT:    kmovw %k1, %eax
206; KNL-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
207; KNL-NEXT:    kshiftlw $9, %k0, %k1
208; KNL-NEXT:    kshiftrw $15, %k1, %k1
209; KNL-NEXT:    kmovw %k1, %eax
210; KNL-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
211; KNL-NEXT:    kshiftlw $8, %k0, %k1
212; KNL-NEXT:    kshiftrw $15, %k1, %k1
213; KNL-NEXT:    kmovw %k1, %eax
214; KNL-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
215; KNL-NEXT:    kshiftlw $7, %k0, %k1
216; KNL-NEXT:    kshiftrw $15, %k1, %k1
217; KNL-NEXT:    kmovw %k1, %eax
218; KNL-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
219; KNL-NEXT:    kshiftlw $6, %k0, %k1
220; KNL-NEXT:    kshiftrw $15, %k1, %k1
221; KNL-NEXT:    kmovw %k1, %eax
222; KNL-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
223; KNL-NEXT:    kshiftlw $5, %k0, %k1
224; KNL-NEXT:    kshiftrw $15, %k1, %k1
225; KNL-NEXT:    kmovw %k1, %eax
226; KNL-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
227; KNL-NEXT:    kshiftlw $4, %k0, %k1
228; KNL-NEXT:    kshiftrw $15, %k1, %k1
229; KNL-NEXT:    kmovw %k1, %eax
230; KNL-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
231; KNL-NEXT:    kshiftlw $3, %k0, %k1
232; KNL-NEXT:    kshiftrw $15, %k1, %k1
233; KNL-NEXT:    kmovw %k1, %eax
234; KNL-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
235; KNL-NEXT:    kshiftlw $2, %k0, %k1
236; KNL-NEXT:    kshiftrw $15, %k1, %k1
237; KNL-NEXT:    kmovw %k1, %eax
238; KNL-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
239; KNL-NEXT:    kshiftlw $1, %k0, %k1
240; KNL-NEXT:    kshiftrw $15, %k1, %k1
241; KNL-NEXT:    kmovw %k1, %eax
242; KNL-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm1
243; KNL-NEXT:    kshiftrw $15, %k0, %k0
244; KNL-NEXT:    kmovw %k0, %eax
245; KNL-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
246; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
247; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
248; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
249; KNL-NEXT:    kmovw %k0, {{[0-9]+}}(%rsp)
250; KNL-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0
251; KNL-NEXT:    kshiftlw $14, %k0, %k1
252; KNL-NEXT:    kshiftrw $15, %k1, %k1
253; KNL-NEXT:    kmovw %k1, %eax
254; KNL-NEXT:    kshiftlw $15, %k0, %k1
255; KNL-NEXT:    kshiftrw $15, %k1, %k1
256; KNL-NEXT:    kmovw %k1, %ecx
257; KNL-NEXT:    vmovd %ecx, %xmm0
258; KNL-NEXT:    vpinsrb $1, %eax, %xmm0, %xmm0
259; KNL-NEXT:    kshiftlw $13, %k0, %k1
260; KNL-NEXT:    kshiftrw $15, %k1, %k1
261; KNL-NEXT:    kmovw %k1, %eax
262; KNL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
263; KNL-NEXT:    kshiftlw $12, %k0, %k1
264; KNL-NEXT:    kshiftrw $15, %k1, %k1
265; KNL-NEXT:    kmovw %k1, %eax
266; KNL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
267; KNL-NEXT:    kshiftlw $11, %k0, %k1
268; KNL-NEXT:    kshiftrw $15, %k1, %k1
269; KNL-NEXT:    kmovw %k1, %eax
270; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
271; KNL-NEXT:    kshiftlw $10, %k0, %k1
272; KNL-NEXT:    kshiftrw $15, %k1, %k1
273; KNL-NEXT:    kmovw %k1, %eax
274; KNL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
275; KNL-NEXT:    kshiftlw $9, %k0, %k1
276; KNL-NEXT:    kshiftrw $15, %k1, %k1
277; KNL-NEXT:    kmovw %k1, %eax
278; KNL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
279; KNL-NEXT:    kshiftlw $8, %k0, %k1
280; KNL-NEXT:    kshiftrw $15, %k1, %k1
281; KNL-NEXT:    kmovw %k1, %eax
282; KNL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
283; KNL-NEXT:    kshiftlw $7, %k0, %k1
284; KNL-NEXT:    kshiftrw $15, %k1, %k1
285; KNL-NEXT:    kmovw %k1, %eax
286; KNL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
287; KNL-NEXT:    kshiftlw $6, %k0, %k1
288; KNL-NEXT:    kshiftrw $15, %k1, %k1
289; KNL-NEXT:    kmovw %k1, %eax
290; KNL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
291; KNL-NEXT:    kshiftlw $5, %k0, %k1
292; KNL-NEXT:    kshiftrw $15, %k1, %k1
293; KNL-NEXT:    kmovw %k1, %eax
294; KNL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
295; KNL-NEXT:    kshiftlw $4, %k0, %k1
296; KNL-NEXT:    kshiftrw $15, %k1, %k1
297; KNL-NEXT:    kmovw %k1, %eax
298; KNL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
299; KNL-NEXT:    kshiftlw $3, %k0, %k1
300; KNL-NEXT:    kshiftrw $15, %k1, %k1
301; KNL-NEXT:    kmovw %k1, %eax
302; KNL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
303; KNL-NEXT:    kshiftlw $2, %k0, %k1
304; KNL-NEXT:    kshiftrw $15, %k1, %k1
305; KNL-NEXT:    kmovw %k1, %eax
306; KNL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
307; KNL-NEXT:    kshiftlw $1, %k0, %k1
308; KNL-NEXT:    kshiftrw $15, %k1, %k1
309; KNL-NEXT:    kmovw %k1, %eax
310; KNL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
311; KNL-NEXT:    kshiftrw $15, %k0, %k0
312; KNL-NEXT:    kmovw %k0, %eax
313; KNL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
314; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
315; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
316; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
317; KNL-NEXT:    kmovw %k0, (%rsp)
318; KNL-NEXT:    movl (%rsp), %eax
319; KNL-NEXT:    movq %rbp, %rsp
320; KNL-NEXT:    popq %rbp
321; KNL-NEXT:    retq
322;
323; SKX-LABEL: test12_v32i32:
324; SKX:       ## BB#0:
325; SKX-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0
326; SKX-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1
327; SKX-NEXT:    kunpckwd %k0, %k1, %k0
328; SKX-NEXT:    kmovd %k0, %eax
329; SKX-NEXT:    retq
330  %res = icmp eq <32 x i32> %a, %b
331  %res1 = bitcast <32 x i1> %res to i32
332  ret i32 %res1
333}
334
335define i64 @test12_v64i16(<64 x i16> %a, <64 x i16> %b) nounwind {
336; KNL-LABEL: test12_v64i16:
337; KNL:       ## BB#0:
338; KNL-NEXT:    pushq %rbp
339; KNL-NEXT:    movq %rsp, %rbp
340; KNL-NEXT:    andq $-32, %rsp
341; KNL-NEXT:    subq $64, %rsp
342; KNL-NEXT:    vpcmpeqw %ymm5, %ymm1, %ymm1
343; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
344; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
345; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
346; KNL-NEXT:    kshiftlw $14, %k0, %k1
347; KNL-NEXT:    kshiftrw $15, %k1, %k1
348; KNL-NEXT:    kmovw %k1, %eax
349; KNL-NEXT:    kshiftlw $15, %k0, %k1
350; KNL-NEXT:    kshiftrw $15, %k1, %k1
351; KNL-NEXT:    kmovw %k1, %ecx
352; KNL-NEXT:    vmovd %ecx, %xmm1
353; KNL-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
354; KNL-NEXT:    kshiftlw $13, %k0, %k1
355; KNL-NEXT:    kshiftrw $15, %k1, %k1
356; KNL-NEXT:    kmovw %k1, %eax
357; KNL-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
358; KNL-NEXT:    kshiftlw $12, %k0, %k1
359; KNL-NEXT:    kshiftrw $15, %k1, %k1
360; KNL-NEXT:    kmovw %k1, %eax
361; KNL-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
362; KNL-NEXT:    kshiftlw $11, %k0, %k1
363; KNL-NEXT:    kshiftrw $15, %k1, %k1
364; KNL-NEXT:    kmovw %k1, %eax
365; KNL-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
366; KNL-NEXT:    kshiftlw $10, %k0, %k1
367; KNL-NEXT:    kshiftrw $15, %k1, %k1
368; KNL-NEXT:    kmovw %k1, %eax
369; KNL-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
370; KNL-NEXT:    kshiftlw $9, %k0, %k1
371; KNL-NEXT:    kshiftrw $15, %k1, %k1
372; KNL-NEXT:    kmovw %k1, %eax
373; KNL-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
374; KNL-NEXT:    kshiftlw $8, %k0, %k1
375; KNL-NEXT:    kshiftrw $15, %k1, %k1
376; KNL-NEXT:    kmovw %k1, %eax
377; KNL-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
378; KNL-NEXT:    kshiftlw $7, %k0, %k1
379; KNL-NEXT:    kshiftrw $15, %k1, %k1
380; KNL-NEXT:    kmovw %k1, %eax
381; KNL-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
382; KNL-NEXT:    kshiftlw $6, %k0, %k1
383; KNL-NEXT:    kshiftrw $15, %k1, %k1
384; KNL-NEXT:    kmovw %k1, %eax
385; KNL-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
386; KNL-NEXT:    kshiftlw $5, %k0, %k1
387; KNL-NEXT:    kshiftrw $15, %k1, %k1
388; KNL-NEXT:    kmovw %k1, %eax
389; KNL-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
390; KNL-NEXT:    kshiftlw $4, %k0, %k1
391; KNL-NEXT:    kshiftrw $15, %k1, %k1
392; KNL-NEXT:    kmovw %k1, %eax
393; KNL-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
394; KNL-NEXT:    kshiftlw $3, %k0, %k1
395; KNL-NEXT:    kshiftrw $15, %k1, %k1
396; KNL-NEXT:    kmovw %k1, %eax
397; KNL-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
398; KNL-NEXT:    kshiftlw $2, %k0, %k1
399; KNL-NEXT:    kshiftrw $15, %k1, %k1
400; KNL-NEXT:    kmovw %k1, %eax
401; KNL-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
402; KNL-NEXT:    kshiftlw $1, %k0, %k1
403; KNL-NEXT:    kshiftrw $15, %k1, %k1
404; KNL-NEXT:    kmovw %k1, %eax
405; KNL-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm1
406; KNL-NEXT:    kshiftrw $15, %k0, %k0
407; KNL-NEXT:    kmovw %k0, %eax
408; KNL-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
409; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
410; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
411; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
412; KNL-NEXT:    kmovw %k0, {{[0-9]+}}(%rsp)
413; KNL-NEXT:    vpcmpeqw %ymm4, %ymm0, %ymm0
414; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
415; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
416; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
417; KNL-NEXT:    kshiftlw $14, %k0, %k1
418; KNL-NEXT:    kshiftrw $15, %k1, %k1
419; KNL-NEXT:    kmovw %k1, %eax
420; KNL-NEXT:    kshiftlw $15, %k0, %k1
421; KNL-NEXT:    kshiftrw $15, %k1, %k1
422; KNL-NEXT:    kmovw %k1, %ecx
423; KNL-NEXT:    vmovd %ecx, %xmm0
424; KNL-NEXT:    vpinsrb $1, %eax, %xmm0, %xmm0
425; KNL-NEXT:    kshiftlw $13, %k0, %k1
426; KNL-NEXT:    kshiftrw $15, %k1, %k1
427; KNL-NEXT:    kmovw %k1, %eax
428; KNL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
429; KNL-NEXT:    kshiftlw $12, %k0, %k1
430; KNL-NEXT:    kshiftrw $15, %k1, %k1
431; KNL-NEXT:    kmovw %k1, %eax
432; KNL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
433; KNL-NEXT:    kshiftlw $11, %k0, %k1
434; KNL-NEXT:    kshiftrw $15, %k1, %k1
435; KNL-NEXT:    kmovw %k1, %eax
436; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
437; KNL-NEXT:    kshiftlw $10, %k0, %k1
438; KNL-NEXT:    kshiftrw $15, %k1, %k1
439; KNL-NEXT:    kmovw %k1, %eax
440; KNL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
441; KNL-NEXT:    kshiftlw $9, %k0, %k1
442; KNL-NEXT:    kshiftrw $15, %k1, %k1
443; KNL-NEXT:    kmovw %k1, %eax
444; KNL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
445; KNL-NEXT:    kshiftlw $8, %k0, %k1
446; KNL-NEXT:    kshiftrw $15, %k1, %k1
447; KNL-NEXT:    kmovw %k1, %eax
448; KNL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
449; KNL-NEXT:    kshiftlw $7, %k0, %k1
450; KNL-NEXT:    kshiftrw $15, %k1, %k1
451; KNL-NEXT:    kmovw %k1, %eax
452; KNL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
453; KNL-NEXT:    kshiftlw $6, %k0, %k1
454; KNL-NEXT:    kshiftrw $15, %k1, %k1
455; KNL-NEXT:    kmovw %k1, %eax
456; KNL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
457; KNL-NEXT:    kshiftlw $5, %k0, %k1
458; KNL-NEXT:    kshiftrw $15, %k1, %k1
459; KNL-NEXT:    kmovw %k1, %eax
460; KNL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
461; KNL-NEXT:    kshiftlw $4, %k0, %k1
462; KNL-NEXT:    kshiftrw $15, %k1, %k1
463; KNL-NEXT:    kmovw %k1, %eax
464; KNL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
465; KNL-NEXT:    kshiftlw $3, %k0, %k1
466; KNL-NEXT:    kshiftrw $15, %k1, %k1
467; KNL-NEXT:    kmovw %k1, %eax
468; KNL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
469; KNL-NEXT:    kshiftlw $2, %k0, %k1
470; KNL-NEXT:    kshiftrw $15, %k1, %k1
471; KNL-NEXT:    kmovw %k1, %eax
472; KNL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
473; KNL-NEXT:    kshiftlw $1, %k0, %k1
474; KNL-NEXT:    kshiftrw $15, %k1, %k1
475; KNL-NEXT:    kmovw %k1, %eax
476; KNL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
477; KNL-NEXT:    kshiftrw $15, %k0, %k0
478; KNL-NEXT:    kmovw %k0, %eax
479; KNL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
480; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
481; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
482; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
483; KNL-NEXT:    kmovw %k0, (%rsp)
484; KNL-NEXT:    vpcmpeqw %ymm7, %ymm3, %ymm0
485; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
486; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
487; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
488; KNL-NEXT:    kshiftlw $14, %k0, %k1
489; KNL-NEXT:    kshiftrw $15, %k1, %k1
490; KNL-NEXT:    kmovw %k1, %eax
491; KNL-NEXT:    kshiftlw $15, %k0, %k1
492; KNL-NEXT:    kshiftrw $15, %k1, %k1
493; KNL-NEXT:    kmovw %k1, %ecx
494; KNL-NEXT:    vmovd %ecx, %xmm0
495; KNL-NEXT:    vpinsrb $1, %eax, %xmm0, %xmm0
496; KNL-NEXT:    kshiftlw $13, %k0, %k1
497; KNL-NEXT:    kshiftrw $15, %k1, %k1
498; KNL-NEXT:    kmovw %k1, %eax
499; KNL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
500; KNL-NEXT:    kshiftlw $12, %k0, %k1
501; KNL-NEXT:    kshiftrw $15, %k1, %k1
502; KNL-NEXT:    kmovw %k1, %eax
503; KNL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
504; KNL-NEXT:    kshiftlw $11, %k0, %k1
505; KNL-NEXT:    kshiftrw $15, %k1, %k1
506; KNL-NEXT:    kmovw %k1, %eax
507; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
508; KNL-NEXT:    kshiftlw $10, %k0, %k1
509; KNL-NEXT:    kshiftrw $15, %k1, %k1
510; KNL-NEXT:    kmovw %k1, %eax
511; KNL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
512; KNL-NEXT:    kshiftlw $9, %k0, %k1
513; KNL-NEXT:    kshiftrw $15, %k1, %k1
514; KNL-NEXT:    kmovw %k1, %eax
515; KNL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
516; KNL-NEXT:    kshiftlw $8, %k0, %k1
517; KNL-NEXT:    kshiftrw $15, %k1, %k1
518; KNL-NEXT:    kmovw %k1, %eax
519; KNL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
520; KNL-NEXT:    kshiftlw $7, %k0, %k1
521; KNL-NEXT:    kshiftrw $15, %k1, %k1
522; KNL-NEXT:    kmovw %k1, %eax
523; KNL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
524; KNL-NEXT:    kshiftlw $6, %k0, %k1
525; KNL-NEXT:    kshiftrw $15, %k1, %k1
526; KNL-NEXT:    kmovw %k1, %eax
527; KNL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
528; KNL-NEXT:    kshiftlw $5, %k0, %k1
529; KNL-NEXT:    kshiftrw $15, %k1, %k1
530; KNL-NEXT:    kmovw %k1, %eax
531; KNL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
532; KNL-NEXT:    kshiftlw $4, %k0, %k1
533; KNL-NEXT:    kshiftrw $15, %k1, %k1
534; KNL-NEXT:    kmovw %k1, %eax
535; KNL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
536; KNL-NEXT:    kshiftlw $3, %k0, %k1
537; KNL-NEXT:    kshiftrw $15, %k1, %k1
538; KNL-NEXT:    kmovw %k1, %eax
539; KNL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
540; KNL-NEXT:    kshiftlw $2, %k0, %k1
541; KNL-NEXT:    kshiftrw $15, %k1, %k1
542; KNL-NEXT:    kmovw %k1, %eax
543; KNL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
544; KNL-NEXT:    kshiftlw $1, %k0, %k1
545; KNL-NEXT:    kshiftrw $15, %k1, %k1
546; KNL-NEXT:    kmovw %k1, %eax
547; KNL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
548; KNL-NEXT:    kshiftrw $15, %k0, %k0
549; KNL-NEXT:    kmovw %k0, %eax
550; KNL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
551; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
552; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
553; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
554; KNL-NEXT:    kmovw %k0, {{[0-9]+}}(%rsp)
555; KNL-NEXT:    vpcmpeqw %ymm6, %ymm2, %ymm0
556; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
557; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
558; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
559; KNL-NEXT:    kshiftlw $14, %k0, %k1
560; KNL-NEXT:    kshiftrw $15, %k1, %k1
561; KNL-NEXT:    kmovw %k1, %eax
562; KNL-NEXT:    kshiftlw $15, %k0, %k1
563; KNL-NEXT:    kshiftrw $15, %k1, %k1
564; KNL-NEXT:    kmovw %k1, %ecx
565; KNL-NEXT:    vmovd %ecx, %xmm0
566; KNL-NEXT:    vpinsrb $1, %eax, %xmm0, %xmm0
567; KNL-NEXT:    kshiftlw $13, %k0, %k1
568; KNL-NEXT:    kshiftrw $15, %k1, %k1
569; KNL-NEXT:    kmovw %k1, %eax
570; KNL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
571; KNL-NEXT:    kshiftlw $12, %k0, %k1
572; KNL-NEXT:    kshiftrw $15, %k1, %k1
573; KNL-NEXT:    kmovw %k1, %eax
574; KNL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
575; KNL-NEXT:    kshiftlw $11, %k0, %k1
576; KNL-NEXT:    kshiftrw $15, %k1, %k1
577; KNL-NEXT:    kmovw %k1, %eax
578; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
579; KNL-NEXT:    kshiftlw $10, %k0, %k1
580; KNL-NEXT:    kshiftrw $15, %k1, %k1
581; KNL-NEXT:    kmovw %k1, %eax
582; KNL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
583; KNL-NEXT:    kshiftlw $9, %k0, %k1
584; KNL-NEXT:    kshiftrw $15, %k1, %k1
585; KNL-NEXT:    kmovw %k1, %eax
586; KNL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
587; KNL-NEXT:    kshiftlw $8, %k0, %k1
588; KNL-NEXT:    kshiftrw $15, %k1, %k1
589; KNL-NEXT:    kmovw %k1, %eax
590; KNL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
591; KNL-NEXT:    kshiftlw $7, %k0, %k1
592; KNL-NEXT:    kshiftrw $15, %k1, %k1
593; KNL-NEXT:    kmovw %k1, %eax
594; KNL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
595; KNL-NEXT:    kshiftlw $6, %k0, %k1
596; KNL-NEXT:    kshiftrw $15, %k1, %k1
597; KNL-NEXT:    kmovw %k1, %eax
598; KNL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
599; KNL-NEXT:    kshiftlw $5, %k0, %k1
600; KNL-NEXT:    kshiftrw $15, %k1, %k1
601; KNL-NEXT:    kmovw %k1, %eax
602; KNL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
603; KNL-NEXT:    kshiftlw $4, %k0, %k1
604; KNL-NEXT:    kshiftrw $15, %k1, %k1
605; KNL-NEXT:    kmovw %k1, %eax
606; KNL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
607; KNL-NEXT:    kshiftlw $3, %k0, %k1
608; KNL-NEXT:    kshiftrw $15, %k1, %k1
609; KNL-NEXT:    kmovw %k1, %eax
610; KNL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
611; KNL-NEXT:    kshiftlw $2, %k0, %k1
612; KNL-NEXT:    kshiftrw $15, %k1, %k1
613; KNL-NEXT:    kmovw %k1, %eax
614; KNL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
615; KNL-NEXT:    kshiftlw $1, %k0, %k1
616; KNL-NEXT:    kshiftrw $15, %k1, %k1
617; KNL-NEXT:    kmovw %k1, %eax
618; KNL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
619; KNL-NEXT:    kshiftrw $15, %k0, %k0
620; KNL-NEXT:    kmovw %k0, %eax
621; KNL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
622; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
623; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
624; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
625; KNL-NEXT:    kmovw %k0, {{[0-9]+}}(%rsp)
626; KNL-NEXT:    movl (%rsp), %ecx
627; KNL-NEXT:    movl {{[0-9]+}}(%rsp), %eax
628; KNL-NEXT:    shlq $32, %rax
629; KNL-NEXT:    orq %rcx, %rax
630; KNL-NEXT:    movq %rbp, %rsp
631; KNL-NEXT:    popq %rbp
632; KNL-NEXT:    retq
633;
634; SKX-LABEL: test12_v64i16:
635; SKX:       ## BB#0:
636; SKX-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0
637; SKX-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1
638; SKX-NEXT:    kunpckdq %k0, %k1, %k0
639; SKX-NEXT:    kmovq %k0, %rax
640; SKX-NEXT:    retq
641  %res = icmp eq <64 x i16> %a, %b
642  %res1 = bitcast <64 x i1> %res to i64
643  ret i64 %res1
644}
645
646define <16 x i32> @test13(<16 x float>%a, <16 x float>%b)
647; CHECK-LABEL: test13:
648; CHECK:       ## BB#0:
649; CHECK-NEXT:    vcmpeqps %zmm1, %zmm0, %k1
650; CHECK-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
651; CHECK-NEXT:    retq
652{
653  %cmpvector_i = fcmp oeq <16 x float> %a, %b
654  %conv = zext <16 x i1> %cmpvector_i to <16 x i32>
655  ret <16 x i32> %conv
656}
657
658define <16 x i32> @test14(<16 x i32>%a, <16 x i32>%b) {
659; CHECK-LABEL: test14:
660; CHECK:       ## BB#0:
661; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm1
662; CHECK-NEXT:    vpcmpled %zmm0, %zmm1, %k0
663; CHECK-NEXT:    knotw %k0, %k1
664; CHECK-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
665; CHECK-NEXT:    retq
666  %sub_r = sub <16 x i32> %a, %b
667  %cmp.i2.i = icmp sgt <16 x i32> %sub_r, %a
668  %sext.i3.i = sext <16 x i1> %cmp.i2.i to <16 x i32>
669  %mask = icmp eq <16 x i32> %sext.i3.i, zeroinitializer
670  %res = select <16 x i1> %mask, <16 x i32> zeroinitializer, <16 x i32> %sub_r
671  ret <16 x i32>%res
672}
673
674define <8 x i64> @test15(<8 x i64>%a, <8 x i64>%b) {
675; CHECK-LABEL: test15:
676; CHECK:       ## BB#0:
677; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm1
678; CHECK-NEXT:    vpcmpleq %zmm0, %zmm1, %k0
679; CHECK-NEXT:    knotw %k0, %k1
680; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
681; CHECK-NEXT:    retq
682  %sub_r = sub <8 x i64> %a, %b
683  %cmp.i2.i = icmp sgt <8 x i64> %sub_r, %a
684  %sext.i3.i = sext <8 x i1> %cmp.i2.i to <8 x i64>
685  %mask = icmp eq <8 x i64> %sext.i3.i, zeroinitializer
686  %res = select <8 x i1> %mask, <8 x i64> zeroinitializer, <8 x i64> %sub_r
687  ret <8 x i64>%res
688}
689
690define <16 x i32> @test16(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
691; CHECK-LABEL: test16:
692; CHECK:       ## BB#0:
693; CHECK-NEXT:    vpcmpled %zmm0, %zmm1, %k1
694; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1}
695; CHECK-NEXT:    retq
696  %mask = icmp sge <16 x i32> %x, %y
697  %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
698  ret <16 x i32> %max
699}
700
701define <16 x i32> @test17(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
702; CHECK-LABEL: test17:
703; CHECK:       ## BB#0:
704; CHECK-NEXT:    vpcmpgtd (%rdi), %zmm0, %k1
705; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
706; CHECK-NEXT:    retq
707  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
708  %mask = icmp sgt <16 x i32> %x, %y
709  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
710  ret <16 x i32> %max
711}
712
713define <16 x i32> @test18(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
714; CHECK-LABEL: test18:
715; CHECK:       ## BB#0:
716; CHECK-NEXT:    vpcmpled (%rdi), %zmm0, %k1
717; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
718; CHECK-NEXT:    retq
719  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
720  %mask = icmp sle <16 x i32> %x, %y
721  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
722  ret <16 x i32> %max
723}
724
725define <16 x i32> @test19(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
726; CHECK-LABEL: test19:
727; CHECK:       ## BB#0:
728; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1
729; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
730; CHECK-NEXT:    retq
731  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
732  %mask = icmp ule <16 x i32> %x, %y
733  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
734  ret <16 x i32> %max
735}
736
737define <16 x i32> @test20(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) nounwind {
738; CHECK-LABEL: test20:
739; CHECK:       ## BB#0:
740; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1
741; CHECK-NEXT:    vpcmpeqd %zmm3, %zmm2, %k1 {%k1}
742; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
743; CHECK-NEXT:    retq
744  %mask1 = icmp eq <16 x i32> %x1, %y1
745  %mask0 = icmp eq <16 x i32> %x, %y
746  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
747  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %y
748  ret <16 x i32> %max
749}
750
751define <8 x i64> @test21(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) nounwind {
752; CHECK-LABEL: test21:
753; CHECK:       ## BB#0:
754; CHECK-NEXT:    vpcmpleq %zmm1, %zmm0, %k1
755; CHECK-NEXT:    vpcmpleq %zmm2, %zmm3, %k1 {%k1}
756; CHECK-NEXT:    vpblendmq %zmm0, %zmm2, %zmm0 {%k1}
757; CHECK-NEXT:    retq
758  %mask1 = icmp sge <8 x i64> %x1, %y1
759  %mask0 = icmp sle <8 x i64> %x, %y
760  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
761  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
762  ret <8 x i64> %max
763}
764
765define <8 x i64> @test22(<8 x i64> %x, <8 x i64>* %y.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
766; CHECK-LABEL: test22:
767; CHECK:       ## BB#0:
768; CHECK-NEXT:    vpcmpgtq %zmm2, %zmm1, %k1
769; CHECK-NEXT:    vpcmpgtq (%rdi), %zmm0, %k1 {%k1}
770; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
771; CHECK-NEXT:    retq
772  %mask1 = icmp sgt <8 x i64> %x1, %y1
773  %y = load <8 x i64>, <8 x i64>* %y.ptr, align 4
774  %mask0 = icmp sgt <8 x i64> %x, %y
775  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
776  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
777  ret <8 x i64> %max
778}
779
780define <16 x i32> @test23(<16 x i32> %x, <16 x i32>* %y.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
781; CHECK-LABEL: test23:
782; CHECK:       ## BB#0:
783; CHECK-NEXT:    vpcmpled %zmm1, %zmm2, %k1
784; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1 {%k1}
785; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
786; CHECK-NEXT:    retq
787  %mask1 = icmp sge <16 x i32> %x1, %y1
788  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
789  %mask0 = icmp ule <16 x i32> %x, %y
790  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
791  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
792  ret <16 x i32> %max
793}
794
795define <8 x i64> @test24(<8 x i64> %x, <8 x i64> %x1, i64* %yb.ptr) nounwind {
796; CHECK-LABEL: test24:
797; CHECK:       ## BB#0:
798; CHECK-NEXT:    vpcmpeqq (%rdi){1to8}, %zmm0, %k1
799; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
800; CHECK-NEXT:    retq
801  %yb = load i64, i64* %yb.ptr, align 4
802  %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
803  %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
804  %mask = icmp eq <8 x i64> %x, %y
805  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
806  ret <8 x i64> %max
807}
808
809define <16 x i32> @test25(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1) nounwind {
810; CHECK-LABEL: test25:
811; CHECK:       ## BB#0:
812; CHECK-NEXT:    vpcmpled (%rdi){1to16}, %zmm0, %k1
813; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
814; CHECK-NEXT:    retq
815  %yb = load i32, i32* %yb.ptr, align 4
816  %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
817  %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
818  %mask = icmp sle <16 x i32> %x, %y
819  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
820  ret <16 x i32> %max
821}
822
823define <16 x i32> @test26(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
824; CHECK-LABEL: test26:
825; CHECK:       ## BB#0:
826; CHECK-NEXT:    vpcmpled %zmm1, %zmm2, %k1
827; CHECK-NEXT:    vpcmpgtd (%rdi){1to16}, %zmm0, %k1 {%k1}
828; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
829; CHECK-NEXT:    retq
830  %mask1 = icmp sge <16 x i32> %x1, %y1
831  %yb = load i32, i32* %yb.ptr, align 4
832  %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
833  %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
834  %mask0 = icmp sgt <16 x i32> %x, %y
835  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
836  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
837  ret <16 x i32> %max
838}
839
840define <8 x i64> @test27(<8 x i64> %x, i64* %yb.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
841; CHECK-LABEL: test27:
842; CHECK:       ## BB#0:
843; CHECK-NEXT:    vpcmpleq %zmm1, %zmm2, %k1
844; CHECK-NEXT:    vpcmpleq (%rdi){1to8}, %zmm0, %k1 {%k1}
845; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
846; CHECK-NEXT:    retq
847  %mask1 = icmp sge <8 x i64> %x1, %y1
848  %yb = load i64, i64* %yb.ptr, align 4
849  %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
850  %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
851  %mask0 = icmp sle <8 x i64> %x, %y
852  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
853  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
854  ret <8 x i64> %max
855}
856
857define <8 x i32>@test28(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) {
858; KNL-LABEL: test28:
859; KNL:       ## BB#0:
860; KNL-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
861; KNL-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
862; KNL-NEXT:    kxnorw %k1, %k0, %k1
863; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
864; KNL-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
865; KNL-NEXT:    vpmovqd %zmm0, %ymm0
866; KNL-NEXT:    retq
867;
868; SKX-LABEL: test28:
869; SKX:       ## BB#0:
870; SKX-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
871; SKX-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
872; SKX-NEXT:    kxnorb %k1, %k0, %k0
873; SKX-NEXT:    vpmovm2d %k0, %ymm0
874; SKX-NEXT:    retq
875  %x_gt_y = icmp sgt <8 x i64> %x, %y
876  %x1_gt_y1 = icmp sgt <8 x i64> %x1, %y1
877  %res = icmp eq <8 x i1>%x_gt_y, %x1_gt_y1
878  %resse = sext <8 x i1>%res to <8 x i32>
879  ret <8 x i32> %resse
880}
881
882define <16 x i8>@test29(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) {
883; KNL-LABEL: test29:
884; KNL:       ## BB#0:
885; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
886; KNL-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1
887; KNL-NEXT:    kxorw %k1, %k0, %k1
888; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
889; KNL-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
890; KNL-NEXT:    vpmovdb %zmm0, %xmm0
891; KNL-NEXT:    retq
892;
893; SKX-LABEL: test29:
894; SKX:       ## BB#0:
895; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
896; SKX-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1
897; SKX-NEXT:    kxorw %k1, %k0, %k0
898; SKX-NEXT:    vpmovm2b %k0, %xmm0
899; SKX-NEXT:    retq
900  %x_gt_y = icmp sgt <16 x i32> %x, %y
901  %x1_gt_y1 = icmp sgt <16 x i32> %x1, %y1
902  %res = icmp ne <16 x i1>%x_gt_y, %x1_gt_y1
903  %resse = sext <16 x i1>%res to <16 x i8>
904  ret <16 x i8> %resse
905}
906
907define <4 x double> @test30(<4 x double> %x, <4 x double> %y) nounwind {
908; KNL-LABEL: test30:
909; KNL:       ## BB#0:
910; KNL-NEXT:    vcmpeqpd %ymm1, %ymm0, %ymm2
911; KNL-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
912; KNL-NEXT:    retq
913;
914; SKX-LABEL: test30:
915; SKX:       ## BB#0:
916; SKX-NEXT:    vcmpeqpd %ymm1, %ymm0, %k1
917; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1}
918; SKX-NEXT:    retq
919
920  %mask = fcmp oeq <4 x double> %x, %y
921  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %y
922  ret <4 x double> %max
923}
924
925define <2 x double> @test31(<2 x double> %x, <2 x double> %x1, <2 x double>* %yp) nounwind {
926; KNL-LABEL: test31:
927; KNL:       ## BB#0:
928; KNL-NEXT:    vcmpltpd (%rdi), %xmm0, %xmm2
929; KNL-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
930; KNL-NEXT:    retq
931;
932; SKX-LABEL: test31:
933; SKX:       ## BB#0:
934; SKX-NEXT:    vcmpltpd (%rdi), %xmm0, %k1
935; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1}
936; SKX-NEXT:    retq
937
938  %y = load <2 x double>, <2 x double>* %yp, align 4
939  %mask = fcmp olt <2 x double> %x, %y
940  %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
941  ret <2 x double> %max
942}
943
944define <4 x double> @test32(<4 x double> %x, <4 x double> %x1, <4 x double>* %yp) nounwind {
945; KNL-LABEL: test32:
946; KNL:       ## BB#0:
947; KNL-NEXT:    vcmpltpd (%rdi), %ymm0, %ymm2
948; KNL-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
949; KNL-NEXT:    retq
950;
951; SKX-LABEL: test32:
952; SKX:       ## BB#0:
953; SKX-NEXT:    vcmpltpd (%rdi), %ymm0, %k1
954; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1}
955; SKX-NEXT:    retq
956
957  %y = load <4 x double>, <4 x double>* %yp, align 4
958  %mask = fcmp ogt <4 x double> %y, %x
959  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
960  ret <4 x double> %max
961}
962
963define <8 x double> @test33(<8 x double> %x, <8 x double> %x1, <8 x double>* %yp) nounwind {
964; CHECK-LABEL: test33:
965; CHECK:       ## BB#0:
966; CHECK-NEXT:    vcmpltpd (%rdi), %zmm0, %k1
967; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
968; CHECK-NEXT:    retq
969  %y = load <8 x double>, <8 x double>* %yp, align 4
970  %mask = fcmp olt <8 x double> %x, %y
971  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
972  ret <8 x double> %max
973}
974
975define <4 x float> @test34(<4 x float> %x, <4 x float> %x1, <4 x float>* %yp) nounwind {
976; KNL-LABEL: test34:
977; KNL:       ## BB#0:
978; KNL-NEXT:    vcmpltps (%rdi), %xmm0, %xmm2
979; KNL-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
980; KNL-NEXT:    retq
981;
982; SKX-LABEL: test34:
983; SKX:       ## BB#0:
984; SKX-NEXT:    vcmpltps (%rdi), %xmm0, %k1
985; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1}
986; SKX-NEXT:    retq
987  %y = load <4 x float>, <4 x float>* %yp, align 4
988  %mask = fcmp olt <4 x float> %x, %y
989  %max = select <4 x i1> %mask, <4 x float> %x, <4 x float> %x1
990  ret <4 x float> %max
991}
992
993define <8 x float> @test35(<8 x float> %x, <8 x float> %x1, <8 x float>* %yp) nounwind {
994; KNL-LABEL: test35:
995; KNL:       ## BB#0:
996; KNL-NEXT:    ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
997; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
998; KNL-NEXT:    vmovups (%rdi), %ymm2
999; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
1000; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
1001; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1002; KNL-NEXT:    retq
1003;
1004; SKX-LABEL: test35:
1005; SKX:       ## BB#0:
1006; SKX-NEXT:    vcmpltps (%rdi), %ymm0, %k1
1007; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1}
1008; SKX-NEXT:    retq
1009
1010  %y = load <8 x float>, <8 x float>* %yp, align 4
1011  %mask = fcmp ogt <8 x float> %y, %x
1012  %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %x1
1013  ret <8 x float> %max
1014}
1015
1016define <16 x float> @test36(<16 x float> %x, <16 x float> %x1, <16 x float>* %yp) nounwind {
1017; CHECK-LABEL: test36:
1018; CHECK:       ## BB#0:
1019; CHECK-NEXT:    vcmpltps (%rdi), %zmm0, %k1
1020; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
1021; CHECK-NEXT:    retq
1022  %y = load <16 x float>, <16 x float>* %yp, align 4
1023  %mask = fcmp olt <16 x float> %x, %y
1024  %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %x1
1025  ret <16 x float> %max
1026}
1027
1028define <8 x double> @test37(<8 x double> %x, <8 x double> %x1, double* %ptr) nounwind {
1029; CHECK-LABEL: test37:
1030; CHECK:       ## BB#0:
1031; CHECK-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1
1032; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
1033; CHECK-NEXT:    retq
1034
1035  %a = load double, double* %ptr
1036  %v = insertelement <8 x double> undef, double %a, i32 0
1037  %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
1038
1039  %mask = fcmp ogt <8 x double> %shuffle, %x
1040  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
1041  ret <8 x double> %max
1042}
1043
1044define <4 x double> @test38(<4 x double> %x, <4 x double> %x1, double* %ptr) nounwind {
1045; KNL-LABEL: test38:
1046; KNL:       ## BB#0:
1047; KNL-NEXT:    vbroadcastsd (%rdi), %ymm2
1048; KNL-NEXT:    vcmpltpd %ymm2, %ymm0, %ymm2
1049; KNL-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1050; KNL-NEXT:    retq
1051;
1052; SKX-LABEL: test38:
1053; SKX:       ## BB#0:
1054; SKX-NEXT:    vcmpltpd (%rdi){1to4}, %ymm0, %k1
1055; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1}
1056; SKX-NEXT:    retq
1057
1058  %a = load double, double* %ptr
1059  %v = insertelement <4 x double> undef, double %a, i32 0
1060  %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> zeroinitializer
1061
1062  %mask = fcmp ogt <4 x double> %shuffle, %x
1063  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
1064  ret <4 x double> %max
1065}
1066
1067define <2 x double> @test39(<2 x double> %x, <2 x double> %x1, double* %ptr) nounwind {
1068; KNL-LABEL: test39:
1069; KNL:       ## BB#0:
1070; KNL-NEXT:    vmovddup {{.*#+}} xmm2 = mem[0,0]
1071; KNL-NEXT:    vcmpltpd %xmm2, %xmm0, %xmm2
1072; KNL-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1073; KNL-NEXT:    retq
1074;
1075; SKX-LABEL: test39:
1076; SKX:       ## BB#0:
1077; SKX-NEXT:    vcmpltpd (%rdi){1to2}, %xmm0, %k1
1078; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1}
1079; SKX-NEXT:    retq
1080
1081  %a = load double, double* %ptr
1082  %v = insertelement <2 x double> undef, double %a, i32 0
1083  %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1084
1085  %mask = fcmp ogt <2 x double> %shuffle, %x
1086  %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
1087  ret <2 x double> %max
1088}
1089
1090
1091define <16  x float> @test40(<16  x float> %x, <16  x float> %x1, float* %ptr) nounwind {
1092; CHECK-LABEL: test40:
1093; CHECK:       ## BB#0:
1094; CHECK-NEXT:    vcmpltps (%rdi){1to16}, %zmm0, %k1
1095; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
1096; CHECK-NEXT:    retq
1097
1098  %a = load float, float* %ptr
1099  %v = insertelement <16  x float> undef, float %a, i32 0
1100  %shuffle = shufflevector <16  x float> %v, <16  x float> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
1101
1102  %mask = fcmp ogt <16  x float> %shuffle, %x
1103  %max = select <16 x i1> %mask, <16  x float> %x, <16  x float> %x1
1104  ret <16  x float> %max
1105}
1106
1107define <8  x float> @test41(<8  x float> %x, <8  x float> %x1, float* %ptr) nounwind {
1108; KNL-LABEL: test41:
1109; KNL:       ## BB#0:
1110; KNL-NEXT:    ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
1111; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1112; KNL-NEXT:    vbroadcastss (%rdi), %ymm2
1113; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
1114; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
1115; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1116; KNL-NEXT:    retq
1117;
1118; SKX-LABEL: test41:
1119; SKX:       ## BB#0:
1120; SKX-NEXT:    vcmpltps (%rdi){1to8}, %ymm0, %k1
1121; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1}
1122; SKX-NEXT:    retq
1123
1124  %a = load float, float* %ptr
1125  %v = insertelement <8  x float> undef, float %a, i32 0
1126  %shuffle = shufflevector <8  x float> %v, <8  x float> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
1127
1128  %mask = fcmp ogt <8  x float> %shuffle, %x
1129  %max = select <8 x i1> %mask, <8  x float> %x, <8  x float> %x1
1130  ret <8  x float> %max
1131}
1132
1133define <4  x float> @test42(<4  x float> %x, <4  x float> %x1, float* %ptr) nounwind {
1134; KNL-LABEL: test42:
1135; KNL:       ## BB#0:
1136; KNL-NEXT:    vbroadcastss (%rdi), %xmm2
1137; KNL-NEXT:    vcmpltps %xmm2, %xmm0, %xmm2
1138; KNL-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
1139; KNL-NEXT:    retq
1140;
1141; SKX-LABEL: test42:
1142; SKX:       ## BB#0:
1143; SKX-NEXT:    vcmpltps (%rdi){1to4}, %xmm0, %k1
1144; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1}
1145; SKX-NEXT:    retq
1146
1147  %a = load float, float* %ptr
1148  %v = insertelement <4  x float> undef, float %a, i32 0
1149  %shuffle = shufflevector <4  x float> %v, <4  x float> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1150
1151  %mask = fcmp ogt <4  x float> %shuffle, %x
1152  %max = select <4 x i1> %mask, <4  x float> %x, <4  x float> %x1
1153  ret <4  x float> %max
1154}
1155
1156define <8 x double> @test43(<8 x double> %x, <8 x double> %x1, double* %ptr,<8 x i1> %mask_in) nounwind {
1157; KNL-LABEL: test43:
1158; KNL:       ## BB#0:
1159; KNL-NEXT:    vpmovsxwq %xmm2, %zmm2
1160; KNL-NEXT:    vpsllq $63, %zmm2, %zmm2
1161; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k1
1162; KNL-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1}
1163; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
1164; KNL-NEXT:    retq
1165;
1166; SKX-LABEL: test43:
1167; SKX:       ## BB#0:
1168; SKX-NEXT:    vpsllw $15, %xmm2, %xmm2
1169; SKX-NEXT:    vpmovw2m %xmm2, %k1
1170; SKX-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1}
1171; SKX-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
1172; SKX-NEXT:    retq
1173
1174  %a = load double, double* %ptr
1175  %v = insertelement <8 x double> undef, double %a, i32 0
1176  %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
1177
1178  %mask_cmp = fcmp ogt <8 x double> %shuffle, %x
1179  %mask = and <8 x i1> %mask_cmp, %mask_in
1180  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
1181  ret <8 x double> %max
1182}
1183
1184define <4 x i32> @test44(<4 x i16> %x, <4 x i16> %y) #0 {
1185; KNL-LABEL: test44:
1186; KNL:       ## BB#0:
1187; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1188; KNL-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1189; KNL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1190; KNL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1191; KNL-NEXT:    retq
1192;
1193; SKX-LABEL: test44:
1194; SKX:       ## BB#0:
1195; SKX-NEXT:    vpxord %xmm2, %xmm2, %xmm2
1196; SKX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1197; SKX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1198; SKX-NEXT:    vpcmpeqd %xmm1, %xmm0, %k0
1199; SKX-NEXT:    vpmovm2d %k0, %xmm0
1200; SKX-NEXT:    retq
1201  %mask = icmp eq <4 x i16> %x, %y
1202  %1 = sext <4 x i1> %mask to <4 x i32>
1203  ret <4 x i32> %1
1204}
1205
1206define <2 x i64> @test45(<2 x i16> %x, <2 x i16> %y) #0 {
1207; KNL-LABEL: test45:
1208; KNL:       ## BB#0:
1209; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1210; KNL-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
1211; KNL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
1212; KNL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1213; KNL-NEXT:    vpsrlq $63, %xmm0, %xmm0
1214; KNL-NEXT:    retq
1215;
1216; SKX-LABEL: test45:
1217; SKX:       ## BB#0:
1218; SKX-NEXT:    vpxord %xmm2, %xmm2, %xmm2
1219; SKX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
1220; SKX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
1221; SKX-NEXT:    vpcmpeqq %xmm1, %xmm0, %k1
1222; SKX-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
1223; SKX-NEXT:    retq
1224  %mask = icmp eq <2 x i16> %x, %y
1225  %1 = zext <2 x i1> %mask to <2 x i64>
1226  ret <2 x i64> %1
1227}
1228
1229define <2 x i64> @test46(<2 x float> %x, <2 x float> %y) #0 {
1230; KNL-LABEL: test46:
1231; KNL:       ## BB#0:
1232; KNL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0
1233; KNL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1234; KNL-NEXT:    vpsllq $32, %xmm0, %xmm0
1235; KNL-NEXT:    vpsrad $31, %xmm0, %xmm1
1236; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1237; KNL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1238; KNL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1239; KNL-NEXT:    retq
1240;
1241; SKX-LABEL: test46:
1242; SKX:       ## BB#0:
1243; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %k1
1244; SKX-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
1245; SKX-NEXT:    retq
1246  %mask = fcmp oeq <2 x float> %x, %y
1247  %1 = zext <2 x i1> %mask to <2 x i64>
1248  ret <2 x i64> %1
1249}
1250