• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=AVX512BW
4; RUN: llc < %s -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
5
6define <16 x float> @test1(<16 x float> %x, <16 x float> %y) nounwind {
7; CHECK-LABEL: test1:
8; CHECK:       ## %bb.0:
9; CHECK-NEXT:    vcmpleps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x02]
10; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
11; CHECK-NEXT:    retq ## encoding: [0xc3]
12  %mask = fcmp ole <16 x float> %x, %y
13  %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %y
14  ret <16 x float> %max
15}
16
17define <8 x double> @test2(<8 x double> %x, <8 x double> %y) nounwind {
18; CHECK-LABEL: test2:
19; CHECK:       ## %bb.0:
20; CHECK-NEXT:    vcmplepd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc9,0x02]
21; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
22; CHECK-NEXT:    retq ## encoding: [0xc3]
23  %mask = fcmp ole <8 x double> %x, %y
24  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %y
25  ret <8 x double> %max
26}
27
28define <16 x i32> @test3(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %yp) nounwind {
29; CHECK-LABEL: test3:
30; CHECK:       ## %bb.0:
31; CHECK-NEXT:    vpcmpeqd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x0f]
32; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
33; CHECK-NEXT:    retq ## encoding: [0xc3]
34  %y = load <16 x i32>, <16 x i32>* %yp, align 4
35  %mask = icmp eq <16 x i32> %x, %y
36  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
37  ret <16 x i32> %max
38}
39
40define <16 x i32> @test4_unsigned(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
41; CHECK-LABEL: test4_unsigned:
42; CHECK:       ## %bb.0:
43; CHECK-NEXT:    vpcmpnltud %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1e,0xc9,0x05]
44; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc2]
45; CHECK-NEXT:    retq ## encoding: [0xc3]
46  %mask = icmp uge <16 x i32> %x, %y
47  %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
48  ret <16 x i32> %max
49}
50
51define <8 x i64> @test5(<8 x i64> %x, <8 x i64> %y) nounwind {
52; CHECK-LABEL: test5:
53; CHECK:       ## %bb.0:
54; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc9]
55; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
56; CHECK-NEXT:    retq ## encoding: [0xc3]
57  %mask = icmp eq <8 x i64> %x, %y
58  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %y
59  ret <8 x i64> %max
60}
61
62define <8 x i64> @test6_unsigned(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1) nounwind {
63; CHECK-LABEL: test6_unsigned:
64; CHECK:       ## %bb.0:
65; CHECK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0xfd,0x48,0x1e,0xc9,0x06]
66; CHECK-NEXT:    vpblendmq %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc2]
67; CHECK-NEXT:    retq ## encoding: [0xc3]
68  %mask = icmp ugt <8 x i64> %x, %y
69  %max = select <8 x i1> %mask, <8 x i64> %x1, <8 x i64> %y
70  ret <8 x i64> %max
71}
72
73define <4 x float> @test7(<4 x float> %a, <4 x float> %b) {
74; AVX512-LABEL: test7:
75; AVX512:       ## %bb.0:
76; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
77; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
78; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe8,0x57,0xd2]
79; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
80; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
81; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
82; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
83; AVX512-NEXT:    retq ## encoding: [0xc3]
84;
85; SKX-LABEL: test7:
86; SKX:       ## %bb.0:
87; SKX-NEXT:    vxorps %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe8,0x57,0xd2]
88; SKX-NEXT:    vcmpltps %xmm2, %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0xca,0x01]
89; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
90; SKX-NEXT:    retq ## encoding: [0xc3]
91
92  %mask = fcmp olt <4 x float> %a, zeroinitializer
93  %c = select <4 x i1>%mask, <4 x float>%a, <4 x float>%b
94  ret <4 x float>%c
95}
96
97define <2 x double> @test8(<2 x double> %a, <2 x double> %b) {
98; AVX512-LABEL: test8:
99; AVX512:       ## %bb.0:
100; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
101; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
102; AVX512-NEXT:    vxorpd %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0x57,0xd2]
103; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
104; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
105; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
106; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
107; AVX512-NEXT:    retq ## encoding: [0xc3]
108;
109; SKX-LABEL: test8:
110; SKX:       ## %bb.0:
111; SKX-NEXT:    vxorpd %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0x57,0xd2]
112; SKX-NEXT:    vcmpltpd %xmm2, %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x08,0xc2,0xca,0x01]
113; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
114; SKX-NEXT:    retq ## encoding: [0xc3]
115  %mask = fcmp olt <2 x double> %a, zeroinitializer
116  %c = select <2 x i1>%mask, <2 x double>%a, <2 x double>%b
117  ret <2 x double>%c
118}
119
120define <8 x i32> @test9(<8 x i32> %x, <8 x i32> %y) nounwind {
121; AVX512-LABEL: test9:
122; AVX512:       ## %bb.0:
123; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
124; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
125; AVX512-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc9]
126; AVX512-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
127; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
128; AVX512-NEXT:    retq ## encoding: [0xc3]
129;
130; SKX-LABEL: test9:
131; SKX:       ## %bb.0:
132; SKX-NEXT:    vpcmpeqd %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x28,0x76,0xc9]
133; SKX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x64,0xc0]
134; SKX-NEXT:    retq ## encoding: [0xc3]
135  %mask = icmp eq <8 x i32> %x, %y
136  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
137  ret <8 x i32> %max
138}
139
140define <8 x float> @test10(<8 x float> %x, <8 x float> %y) nounwind {
141; AVX512-LABEL: test10:
142; AVX512:       ## %bb.0:
143; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
144; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
145; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x00]
146; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
147; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
148; AVX512-NEXT:    retq ## encoding: [0xc3]
149;
150; SKX-LABEL: test10:
151; SKX:       ## %bb.0:
152; SKX-NEXT:    vcmpeqps %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x28,0xc2,0xc9,0x00]
153; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
154; SKX-NEXT:    retq ## encoding: [0xc3]
155
156  %mask = fcmp oeq <8 x float> %x, %y
157  %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %y
158  ret <8 x float> %max
159}
160
161define <8 x i32> @test11_unsigned(<8 x i32> %x, <8 x i32> %y) nounwind {
162; AVX512-LABEL: test11_unsigned:
163; AVX512:       ## %bb.0:
164; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0 ## encoding: [0xc4,0xe2,0x7d,0x3f,0xc1]
165; AVX512-NEXT:    retq ## encoding: [0xc3]
166;
167; SKX-LABEL: test11_unsigned:
168; SKX:       ## %bb.0:
169; SKX-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0 ## EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x3f,0xc1]
170; SKX-NEXT:    retq ## encoding: [0xc3]
171  %mask = icmp ugt <8 x i32> %x, %y
172  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
173  ret <8 x i32> %max
174}
175
176define i16 @test12(<16 x i64> %a, <16 x i64> %b) nounwind {
177; KNL-LABEL: test12:
178; KNL:       ## %bb.0:
179; KNL-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
180; KNL-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
181; KNL-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
182; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
183; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
184; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
185; KNL-NEXT:    retq ## encoding: [0xc3]
186;
187; AVX512BW-LABEL: test12:
188; AVX512BW:       ## %bb.0:
189; AVX512BW-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
190; AVX512BW-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
191; AVX512BW-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
192; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
193; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
194; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
195; AVX512BW-NEXT:    retq ## encoding: [0xc3]
196;
197; SKX-LABEL: test12:
198; SKX:       ## %bb.0:
199; SKX-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
200; SKX-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
201; SKX-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
202; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
203; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
204; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
205; SKX-NEXT:    retq ## encoding: [0xc3]
206  %res = icmp eq <16 x i64> %a, %b
207  %res1 = bitcast <16 x i1> %res to i16
208  ret i16 %res1
209}
210
211define i32 @test12_v32i32(<32 x i32> %a, <32 x i32> %b) nounwind {
212; KNL-LABEL: test12_v32i32:
213; KNL:       ## %bb.0:
214; KNL-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
215; KNL-NEXT:    kmovw %k0, %ecx ## encoding: [0xc5,0xf8,0x93,0xc8]
216; KNL-NEXT:    vpcmpeqd %zmm3, %zmm1, %k0 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xc3]
217; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
218; KNL-NEXT:    shll $16, %eax ## encoding: [0xc1,0xe0,0x10]
219; KNL-NEXT:    orl %ecx, %eax ## encoding: [0x09,0xc8]
220; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
221; KNL-NEXT:    retq ## encoding: [0xc3]
222;
223; AVX512BW-LABEL: test12_v32i32:
224; AVX512BW:       ## %bb.0:
225; AVX512BW-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
226; AVX512BW-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xcb]
227; AVX512BW-NEXT:    kunpckwd %k0, %k1, %k0 ## encoding: [0xc5,0xf4,0x4b,0xc0]
228; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
229; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
230; AVX512BW-NEXT:    retq ## encoding: [0xc3]
231;
232; SKX-LABEL: test12_v32i32:
233; SKX:       ## %bb.0:
234; SKX-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
235; SKX-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xcb]
236; SKX-NEXT:    kunpckwd %k0, %k1, %k0 ## encoding: [0xc5,0xf4,0x4b,0xc0]
237; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
238; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
239; SKX-NEXT:    retq ## encoding: [0xc3]
240  %res = icmp eq <32 x i32> %a, %b
241  %res1 = bitcast <32 x i1> %res to i32
242  ret i32 %res1
243}
244
245define i64 @test12_v64i16(<64 x i16> %a, <64 x i16> %b) nounwind {
246; KNL-LABEL: test12_v64i16:
247; KNL:       ## %bb.0:
248; KNL-NEXT:    vpcmpeqw %ymm4, %ymm0, %ymm0 ## encoding: [0xc5,0xfd,0x75,0xc4]
249; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
250; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
251; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
252; KNL-NEXT:    vpcmpeqw %ymm5, %ymm1, %ymm0 ## encoding: [0xc5,0xf5,0x75,0xc5]
253; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
254; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
255; KNL-NEXT:    kmovw %k0, %ecx ## encoding: [0xc5,0xf8,0x93,0xc8]
256; KNL-NEXT:    shll $16, %ecx ## encoding: [0xc1,0xe1,0x10]
257; KNL-NEXT:    orl %eax, %ecx ## encoding: [0x09,0xc1]
258; KNL-NEXT:    vpcmpeqw %ymm6, %ymm2, %ymm0 ## encoding: [0xc5,0xed,0x75,0xc6]
259; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
260; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
261; KNL-NEXT:    kmovw %k0, %edx ## encoding: [0xc5,0xf8,0x93,0xd0]
262; KNL-NEXT:    vpcmpeqw %ymm7, %ymm3, %ymm0 ## encoding: [0xc5,0xe5,0x75,0xc7]
263; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
264; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
265; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
266; KNL-NEXT:    shll $16, %eax ## encoding: [0xc1,0xe0,0x10]
267; KNL-NEXT:    orl %edx, %eax ## encoding: [0x09,0xd0]
268; KNL-NEXT:    shlq $32, %rax ## encoding: [0x48,0xc1,0xe0,0x20]
269; KNL-NEXT:    orq %rcx, %rax ## encoding: [0x48,0x09,0xc8]
270; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
271; KNL-NEXT:    retq ## encoding: [0xc3]
272;
273; AVX512BW-LABEL: test12_v64i16:
274; AVX512BW:       ## %bb.0:
275; AVX512BW-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x75,0xc2]
276; AVX512BW-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x75,0xcb]
277; AVX512BW-NEXT:    kunpckdq %k0, %k1, %k0 ## encoding: [0xc4,0xe1,0xf4,0x4b,0xc0]
278; AVX512BW-NEXT:    kmovq %k0, %rax ## encoding: [0xc4,0xe1,0xfb,0x93,0xc0]
279; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
280; AVX512BW-NEXT:    retq ## encoding: [0xc3]
281;
282; SKX-LABEL: test12_v64i16:
283; SKX:       ## %bb.0:
284; SKX-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x75,0xc2]
285; SKX-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x75,0xcb]
286; SKX-NEXT:    kunpckdq %k0, %k1, %k0 ## encoding: [0xc4,0xe1,0xf4,0x4b,0xc0]
287; SKX-NEXT:    kmovq %k0, %rax ## encoding: [0xc4,0xe1,0xfb,0x93,0xc0]
288; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
289; SKX-NEXT:    retq ## encoding: [0xc3]
290  %res = icmp eq <64 x i16> %a, %b
291  %res1 = bitcast <64 x i1> %res to i64
292  ret i64 %res1
293}
294
295define <16 x i32> @test13(<16 x float>%a, <16 x float>%b)
296; AVX512-LABEL: test13:
297; AVX512:       ## %bb.0:
298; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x00]
299; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
300; AVX512-NEXT:    vpsrld $31, %zmm0, %zmm0 ## encoding: [0x62,0xf1,0x7d,0x48,0x72,0xd0,0x1f]
301; AVX512-NEXT:    retq ## encoding: [0xc3]
302;
303; SKX-LABEL: test13:
304; SKX:       ## %bb.0:
305; SKX-NEXT:    vcmpeqps %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc1,0x00]
306; SKX-NEXT:    vpmovm2d %k0, %zmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x38,0xc0]
307; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0 ## encoding: [0x62,0xf1,0x7d,0x48,0x72,0xd0,0x1f]
308; SKX-NEXT:    retq ## encoding: [0xc3]
309{
310  %cmpvector_i = fcmp oeq <16 x float> %a, %b
311  %conv = zext <16 x i1> %cmpvector_i to <16 x i32>
312  ret <16 x i32> %conv
313}
314
315define <16 x i32> @test14(<16 x i32>%a, <16 x i32>%b) {
316; CHECK-LABEL: test14:
317; CHECK:       ## %bb.0:
318; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm2 ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0xd1]
319; CHECK-NEXT:    vpcmpgtd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xc8]
320; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0xc1]
321; CHECK-NEXT:    retq ## encoding: [0xc3]
322  %sub_r = sub <16 x i32> %a, %b
323  %cmp.i2.i = icmp sgt <16 x i32> %sub_r, %a
324  %sext.i3.i = sext <16 x i1> %cmp.i2.i to <16 x i32>
325  %mask = icmp eq <16 x i32> %sext.i3.i, zeroinitializer
326  %res = select <16 x i1> %mask, <16 x i32> zeroinitializer, <16 x i32> %sub_r
327  ret <16 x i32>%res
328}
329
330define <8 x i64> @test15(<8 x i64>%a, <8 x i64>%b) {
331; CHECK-LABEL: test15:
332; CHECK:       ## %bb.0:
333; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm2 ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0xd1]
334; CHECK-NEXT:    vpcmpgtq %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xc8]
335; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0xc1]
336; CHECK-NEXT:    retq ## encoding: [0xc3]
337  %sub_r = sub <8 x i64> %a, %b
338  %cmp.i2.i = icmp sgt <8 x i64> %sub_r, %a
339  %sext.i3.i = sext <8 x i1> %cmp.i2.i to <8 x i64>
340  %mask = icmp eq <8 x i64> %sext.i3.i, zeroinitializer
341  %res = select <8 x i1> %mask, <8 x i64> zeroinitializer, <8 x i64> %sub_r
342  ret <8 x i64>%res
343}
344
345define <16 x i32> @test16(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
346; CHECK-LABEL: test16:
347; CHECK:       ## %bb.0:
348; CHECK-NEXT:    vpcmpnltd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1f,0xc9,0x05]
349; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc2]
350; CHECK-NEXT:    retq ## encoding: [0xc3]
351  %mask = icmp sge <16 x i32> %x, %y
352  %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
353  ret <16 x i32> %max
354}
355
356define <16 x i32> @test17(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
357; CHECK-LABEL: test17:
358; CHECK:       ## %bb.0:
359; CHECK-NEXT:    vpcmpgtd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0x0f]
360; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
361; CHECK-NEXT:    retq ## encoding: [0xc3]
362  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
363  %mask = icmp sgt <16 x i32> %x, %y
364  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
365  ret <16 x i32> %max
366}
367
368define <16 x i32> @test18(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
369; CHECK-LABEL: test18:
370; CHECK:       ## %bb.0:
371; CHECK-NEXT:    vpcmpled (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1f,0x0f,0x02]
372; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
373; CHECK-NEXT:    retq ## encoding: [0xc3]
374  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
375  %mask = icmp sle <16 x i32> %x, %y
376  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
377  ret <16 x i32> %max
378}
379
380define <16 x i32> @test19(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
381; CHECK-LABEL: test19:
382; CHECK:       ## %bb.0:
383; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1e,0x0f,0x02]
384; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
385; CHECK-NEXT:    retq ## encoding: [0xc3]
386  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
387  %mask = icmp ule <16 x i32> %x, %y
388  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
389  ret <16 x i32> %max
390}
391
392define <16 x i32> @test20(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) nounwind {
393; CHECK-LABEL: test20:
394; CHECK:       ## %bb.0:
395; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc9]
396; CHECK-NEXT:    vpcmpeqd %zmm3, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf1,0x6d,0x49,0x76,0xcb]
397; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
398; CHECK-NEXT:    retq ## encoding: [0xc3]
399  %mask1 = icmp eq <16 x i32> %x1, %y1
400  %mask0 = icmp eq <16 x i32> %x, %y
401  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
402  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %y
403  ret <16 x i32> %max
404}
405
406define <8 x i64> @test21(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) nounwind {
407; CHECK-LABEL: test21:
408; CHECK:       ## %bb.0:
409; CHECK-NEXT:    vpcmpleq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0xfd,0x48,0x1f,0xc9,0x02]
410; CHECK-NEXT:    vpcmpnltq %zmm3, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf3,0xed,0x49,0x1f,0xcb,0x05]
411; CHECK-NEXT:    vpblendmq %zmm0, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x64,0xc0]
412; CHECK-NEXT:    retq ## encoding: [0xc3]
413  %mask1 = icmp sge <8 x i64> %x1, %y1
414  %mask0 = icmp sle <8 x i64> %x, %y
415  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
416  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
417  ret <8 x i64> %max
418}
419
420define <8 x i64> @test22(<8 x i64> %x, <8 x i64>* %y.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
421; CHECK-LABEL: test22:
422; CHECK:       ## %bb.0:
423; CHECK-NEXT:    vpcmpgtq %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x37,0xca]
424; CHECK-NEXT:    vpcmpgtq (%rdi), %zmm0, %k1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x37,0x0f]
425; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
426; CHECK-NEXT:    retq ## encoding: [0xc3]
427  %mask1 = icmp sgt <8 x i64> %x1, %y1
428  %y = load <8 x i64>, <8 x i64>* %y.ptr, align 4
429  %mask0 = icmp sgt <8 x i64> %x, %y
430  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
431  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
432  ret <8 x i64> %max
433}
434
435define <16 x i32> @test23(<16 x i32> %x, <16 x i32>* %y.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
436; CHECK-LABEL: test23:
437; CHECK:       ## %bb.0:
438; CHECK-NEXT:    vpcmpnltd %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0x75,0x48,0x1f,0xca,0x05]
439; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1 {%k1} ## encoding: [0x62,0xf3,0x7d,0x49,0x1e,0x0f,0x02]
440; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
441; CHECK-NEXT:    retq ## encoding: [0xc3]
442  %mask1 = icmp sge <16 x i32> %x1, %y1
443  %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
444  %mask0 = icmp ule <16 x i32> %x, %y
445  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
446  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
447  ret <16 x i32> %max
448}
449
450define <8 x i64> @test24(<8 x i64> %x, <8 x i64> %x1, i64* %yb.ptr) nounwind {
451; CHECK-LABEL: test24:
452; CHECK:       ## %bb.0:
453; CHECK-NEXT:    vpcmpeqq (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfd,0x58,0x29,0x0f]
454; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
455; CHECK-NEXT:    retq ## encoding: [0xc3]
456  %yb = load i64, i64* %yb.ptr, align 4
457  %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
458  %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
459  %mask = icmp eq <8 x i64> %x, %y
460  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
461  ret <8 x i64> %max
462}
463
464define <16 x i32> @test25(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1) nounwind {
465; CHECK-LABEL: test25:
466; CHECK:       ## %bb.0:
467; CHECK-NEXT:    vpcmpled (%rdi){1to16}, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x58,0x1f,0x0f,0x02]
468; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
469; CHECK-NEXT:    retq ## encoding: [0xc3]
470  %yb = load i32, i32* %yb.ptr, align 4
471  %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
472  %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
473  %mask = icmp sle <16 x i32> %x, %y
474  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
475  ret <16 x i32> %max
476}
477
478define <16 x i32> @test26(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
479; CHECK-LABEL: test26:
480; CHECK:       ## %bb.0:
481; CHECK-NEXT:    vpcmpnltd %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0x75,0x48,0x1f,0xca,0x05]
482; CHECK-NEXT:    vpcmpgtd (%rdi){1to16}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0x66,0x0f]
483; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
484; CHECK-NEXT:    retq ## encoding: [0xc3]
485  %mask1 = icmp sge <16 x i32> %x1, %y1
486  %yb = load i32, i32* %yb.ptr, align 4
487  %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
488  %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
489  %mask0 = icmp sgt <16 x i32> %x, %y
490  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
491  %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
492  ret <16 x i32> %max
493}
494
495define <8 x i64> @test27(<8 x i64> %x, i64* %yb.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
496; CHECK-LABEL: test27:
497; CHECK:       ## %bb.0:
498; CHECK-NEXT:    vpcmpnltq %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0xf5,0x48,0x1f,0xca,0x05]
499; CHECK-NEXT:    vpcmpleq (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf3,0xfd,0x59,0x1f,0x0f,0x02]
500; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
501; CHECK-NEXT:    retq ## encoding: [0xc3]
502  %mask1 = icmp sge <8 x i64> %x1, %y1
503  %yb = load i64, i64* %yb.ptr, align 4
504  %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
505  %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
506  %mask0 = icmp sle <8 x i64> %x, %y
507  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
508  %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
509  ret <8 x i64> %max
510}
511
512define <8 x i32>@test28(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) {
513; AVX512-LABEL: test28:
514; AVX512:       ## %bb.0:
515; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x37,0xc1]
516; AVX512-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xcb]
517; AVX512-NEXT:    kxnorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x46,0xc9]
518; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
519; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
520; AVX512-NEXT:    retq ## encoding: [0xc3]
521;
522; SKX-LABEL: test28:
523; SKX:       ## %bb.0:
524; SKX-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x37,0xc1]
525; SKX-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xcb]
526; SKX-NEXT:    kxnorb %k1, %k0, %k0 ## encoding: [0xc5,0xfd,0x46,0xc1]
527; SKX-NEXT:    vpmovm2d %k0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x28,0x38,0xc0]
528; SKX-NEXT:    retq ## encoding: [0xc3]
529  %x_gt_y = icmp sgt <8 x i64> %x, %y
530  %x1_gt_y1 = icmp sgt <8 x i64> %x1, %y1
531  %res = icmp eq <8 x i1>%x_gt_y, %x1_gt_y1
532  %resse = sext <8 x i1>%res to <8 x i32>
533  ret <8 x i32> %resse
534}
535
536define <16 x i8>@test29(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) {
537; KNL-LABEL: test29:
538; KNL:       ## %bb.0:
539; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
540; KNL-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
541; KNL-NEXT:    kxorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x47,0xc9]
542; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
543; KNL-NEXT:    vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
544; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
545; KNL-NEXT:    retq ## encoding: [0xc3]
546;
547; AVX512BW-LABEL: test29:
548; AVX512BW:       ## %bb.0:
549; AVX512BW-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
550; AVX512BW-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
551; AVX512BW-NEXT:    kxorw %k1, %k0, %k0 ## encoding: [0xc5,0xfc,0x47,0xc1]
552; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x28,0xc0]
553; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
554; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
555; AVX512BW-NEXT:    retq ## encoding: [0xc3]
556;
557; SKX-LABEL: test29:
558; SKX:       ## %bb.0:
559; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
560; SKX-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
561; SKX-NEXT:    kxorw %k1, %k0, %k0 ## encoding: [0xc5,0xfc,0x47,0xc1]
562; SKX-NEXT:    vpmovm2b %k0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x08,0x28,0xc0]
563; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
564; SKX-NEXT:    retq ## encoding: [0xc3]
565  %x_gt_y = icmp sgt <16 x i32> %x, %y
566  %x1_gt_y1 = icmp sgt <16 x i32> %x1, %y1
567  %res = icmp ne <16 x i1>%x_gt_y, %x1_gt_y1
568  %resse = sext <16 x i1>%res to <16 x i8>
569  ret <16 x i8> %resse
570}
571
572define <4 x double> @test30(<4 x double> %x, <4 x double> %y) nounwind {
573; AVX512-LABEL: test30:
574; AVX512:       ## %bb.0:
575; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
576; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
577; AVX512-NEXT:    vcmpeqpd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc9,0x00]
578; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
579; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
580; AVX512-NEXT:    retq ## encoding: [0xc3]
581;
582; SKX-LABEL: test30:
583; SKX:       ## %bb.0:
584; SKX-NEXT:    vcmpeqpd %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x28,0xc2,0xc9,0x00]
585; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
586; SKX-NEXT:    retq ## encoding: [0xc3]
587
588  %mask = fcmp oeq <4 x double> %x, %y
589  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %y
590  ret <4 x double> %max
591}
592
593define <2 x double> @test31(<2 x double> %x, <2 x double> %x1, <2 x double>* %yp) nounwind {
594; AVX512-LABEL: test31:
595; AVX512:       ## %bb.0:
596; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
597; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
598; AVX512-NEXT:    vmovupd (%rdi), %xmm2 ## encoding: [0xc5,0xf9,0x10,0x17]
599; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
600; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
601; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
602; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
603; AVX512-NEXT:    retq ## encoding: [0xc3]
604;
605; SKX-LABEL: test31:
606; SKX:       ## %bb.0:
607; SKX-NEXT:    vcmpltpd (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x08,0xc2,0x0f,0x01]
608; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
609; SKX-NEXT:    retq ## encoding: [0xc3]
610
611  %y = load <2 x double>, <2 x double>* %yp, align 4
612  %mask = fcmp olt <2 x double> %x, %y
613  %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
614  ret <2 x double> %max
615}
616
617define <4 x double> @test32(<4 x double> %x, <4 x double> %x1, <4 x double>* %yp) nounwind {
618; AVX512-LABEL: test32:
619; AVX512:       ## %bb.0:
620; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
621; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
622; AVX512-NEXT:    vmovupd (%rdi), %ymm2 ## encoding: [0xc5,0xfd,0x10,0x17]
623; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
624; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
625; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
626; AVX512-NEXT:    retq ## encoding: [0xc3]
627;
628; SKX-LABEL: test32:
629; SKX:       ## %bb.0:
630; SKX-NEXT:    vcmpltpd (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x28,0xc2,0x0f,0x01]
631; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
632; SKX-NEXT:    retq ## encoding: [0xc3]
633
634  %y = load <4 x double>, <4 x double>* %yp, align 4
635  %mask = fcmp ogt <4 x double> %y, %x
636  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
637  ret <4 x double> %max
638}
639
640define <8 x double> @test33(<8 x double> %x, <8 x double> %x1, <8 x double>* %yp) nounwind {
641; CHECK-LABEL: test33:
642; CHECK:       ## %bb.0:
643; CHECK-NEXT:    vcmpltpd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0x0f,0x01]
644; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
645; CHECK-NEXT:    retq ## encoding: [0xc3]
646  %y = load <8 x double>, <8 x double>* %yp, align 4
647  %mask = fcmp olt <8 x double> %x, %y
648  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
649  ret <8 x double> %max
650}
651
652define <4 x float> @test34(<4 x float> %x, <4 x float> %x1, <4 x float>* %yp) nounwind {
653; AVX512-LABEL: test34:
654; AVX512:       ## %bb.0:
655; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
656; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
657; AVX512-NEXT:    vmovups (%rdi), %xmm2 ## encoding: [0xc5,0xf8,0x10,0x17]
658; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
659; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
660; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
661; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
662; AVX512-NEXT:    retq ## encoding: [0xc3]
663;
664; SKX-LABEL: test34:
665; SKX:       ## %bb.0:
666; SKX-NEXT:    vcmpltps (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0x0f,0x01]
667; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
668; SKX-NEXT:    retq ## encoding: [0xc3]
669  %y = load <4 x float>, <4 x float>* %yp, align 4
670  %mask = fcmp olt <4 x float> %x, %y
671  %max = select <4 x i1> %mask, <4 x float> %x, <4 x float> %x1
672  ret <4 x float> %max
673}
674
675define <8 x float> @test35(<8 x float> %x, <8 x float> %x1, <8 x float>* %yp) nounwind {
676; AVX512-LABEL: test35:
677; AVX512:       ## %bb.0:
678; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
679; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
680; AVX512-NEXT:    vmovups (%rdi), %ymm2 ## encoding: [0xc5,0xfc,0x10,0x17]
681; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
682; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
683; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
684; AVX512-NEXT:    retq ## encoding: [0xc3]
685;
686; SKX-LABEL: test35:
687; SKX:       ## %bb.0:
688; SKX-NEXT:    vcmpltps (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x28,0xc2,0x0f,0x01]
689; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
690; SKX-NEXT:    retq ## encoding: [0xc3]
691
692  %y = load <8 x float>, <8 x float>* %yp, align 4
693  %mask = fcmp ogt <8 x float> %y, %x
694  %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %x1
695  ret <8 x float> %max
696}
697
698define <16 x float> @test36(<16 x float> %x, <16 x float> %x1, <16 x float>* %yp) nounwind {
699; CHECK-LABEL: test36:
700; CHECK:       ## %bb.0:
701; CHECK-NEXT:    vcmpltps (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0x0f,0x01]
702; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
703; CHECK-NEXT:    retq ## encoding: [0xc3]
704  %y = load <16 x float>, <16 x float>* %yp, align 4
705  %mask = fcmp olt <16 x float> %x, %y
706  %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %x1
707  ret <16 x float> %max
708}
709
710define <8 x double> @test37(<8 x double> %x, <8 x double> %x1, double* %ptr) nounwind {
711; CHECK-LABEL: test37:
712; CHECK:       ## %bb.0:
713; CHECK-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x58,0xc2,0x0f,0x01]
714; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
715; CHECK-NEXT:    retq ## encoding: [0xc3]
716
717  %a = load double, double* %ptr
718  %v = insertelement <8 x double> undef, double %a, i32 0
719  %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
720
721  %mask = fcmp ogt <8 x double> %shuffle, %x
722  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
723  ret <8 x double> %max
724}
725
726define <4 x double> @test38(<4 x double> %x, <4 x double> %x1, double* %ptr) nounwind {
727; AVX512-LABEL: test38:
728; AVX512:       ## %bb.0:
729; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
730; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
731; AVX512-NEXT:    vbroadcastsd (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x19,0x17]
732; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
733; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
734; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
735; AVX512-NEXT:    retq ## encoding: [0xc3]
736;
737; SKX-LABEL: test38:
738; SKX:       ## %bb.0:
739; SKX-NEXT:    vcmpltpd (%rdi){1to4}, %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x38,0xc2,0x0f,0x01]
740; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
741; SKX-NEXT:    retq ## encoding: [0xc3]
742
743  %a = load double, double* %ptr
744  %v = insertelement <4 x double> undef, double %a, i32 0
745  %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> zeroinitializer
746
747  %mask = fcmp ogt <4 x double> %shuffle, %x
748  %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
749  ret <4 x double> %max
750}
751
752define <2 x double> @test39(<2 x double> %x, <2 x double> %x1, double* %ptr) nounwind {
753; AVX512-LABEL: test39:
754; AVX512:       ## %bb.0:
755; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
756; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
757; AVX512-NEXT:    vmovddup (%rdi), %xmm2 ## encoding: [0xc5,0xfb,0x12,0x17]
758; AVX512-NEXT:    ## xmm2 = mem[0,0]
759; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
760; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
761; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
762; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
763; AVX512-NEXT:    retq ## encoding: [0xc3]
764;
765; SKX-LABEL: test39:
766; SKX:       ## %bb.0:
767; SKX-NEXT:    vcmpltpd (%rdi){1to2}, %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x18,0xc2,0x0f,0x01]
768; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
769; SKX-NEXT:    retq ## encoding: [0xc3]
770
771  %a = load double, double* %ptr
772  %v = insertelement <2 x double> undef, double %a, i32 0
773  %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
774
775  %mask = fcmp ogt <2 x double> %shuffle, %x
776  %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
777  ret <2 x double> %max
778}
779
780
781define <16  x float> @test40(<16  x float> %x, <16  x float> %x1, float* %ptr) nounwind {
782; CHECK-LABEL: test40:
783; CHECK:       ## %bb.0:
784; CHECK-NEXT:    vcmpltps (%rdi){1to16}, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x58,0xc2,0x0f,0x01]
785; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
786; CHECK-NEXT:    retq ## encoding: [0xc3]
787
788  %a = load float, float* %ptr
789  %v = insertelement <16  x float> undef, float %a, i32 0
790  %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>
791
792  %mask = fcmp ogt <16  x float> %shuffle, %x
793  %max = select <16 x i1> %mask, <16  x float> %x, <16  x float> %x1
794  ret <16  x float> %max
795}
796
797define <8  x float> @test41(<8  x float> %x, <8  x float> %x1, float* %ptr) nounwind {
798; AVX512-LABEL: test41:
799; AVX512:       ## %bb.0:
800; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
801; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
802; AVX512-NEXT:    vbroadcastss (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x18,0x17]
803; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
804; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
805; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
806; AVX512-NEXT:    retq ## encoding: [0xc3]
807;
808; SKX-LABEL: test41:
809; SKX:       ## %bb.0:
810; SKX-NEXT:    vcmpltps (%rdi){1to8}, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x38,0xc2,0x0f,0x01]
811; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
812; SKX-NEXT:    retq ## encoding: [0xc3]
813
814  %a = load float, float* %ptr
815  %v = insertelement <8  x float> undef, float %a, i32 0
816  %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>
817
818  %mask = fcmp ogt <8  x float> %shuffle, %x
819  %max = select <8 x i1> %mask, <8  x float> %x, <8  x float> %x1
820  ret <8  x float> %max
821}
822
823define <4  x float> @test42(<4  x float> %x, <4  x float> %x1, float* %ptr) nounwind {
824; AVX512-LABEL: test42:
825; AVX512:       ## %bb.0:
826; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
827; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
828; AVX512-NEXT:    vbroadcastss (%rdi), %xmm2 ## encoding: [0xc4,0xe2,0x79,0x18,0x17]
829; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
830; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
831; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
832; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
833; AVX512-NEXT:    retq ## encoding: [0xc3]
834;
835; SKX-LABEL: test42:
836; SKX:       ## %bb.0:
837; SKX-NEXT:    vcmpltps (%rdi){1to4}, %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x18,0xc2,0x0f,0x01]
838; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
839; SKX-NEXT:    retq ## encoding: [0xc3]
840
841  %a = load float, float* %ptr
842  %v = insertelement <4  x float> undef, float %a, i32 0
843  %shuffle = shufflevector <4  x float> %v, <4  x float> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
844
845  %mask = fcmp ogt <4  x float> %shuffle, %x
846  %max = select <4 x i1> %mask, <4  x float> %x, <4  x float> %x1
847  ret <4  x float> %max
848}
849
850define <8 x double> @test43(<8 x double> %x, <8 x double> %x1, double* %ptr,<8 x i1> %mask_in) nounwind {
851; KNL-LABEL: test43:
852; KNL:       ## %bb.0:
853; KNL-NEXT:    vpmovsxwq %xmm2, %zmm2 ## encoding: [0x62,0xf2,0x7d,0x48,0x24,0xd2]
854; KNL-NEXT:    vpsllq $63, %zmm2, %zmm2 ## encoding: [0x62,0xf1,0xed,0x48,0x73,0xf2,0x3f]
855; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x27,0xca]
856; KNL-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x01]
857; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
858; KNL-NEXT:    retq ## encoding: [0xc3]
859;
860; AVX512BW-LABEL: test43:
861; AVX512BW:       ## %bb.0:
862; AVX512BW-NEXT:    vpsllw $15, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
863; AVX512BW-NEXT:    vpmovw2m %zmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x29,0xca]
864; AVX512BW-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x01]
865; AVX512BW-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
866; AVX512BW-NEXT:    retq ## encoding: [0xc3]
867;
868; SKX-LABEL: test43:
869; SKX:       ## %bb.0:
870; SKX-NEXT:    vpsllw $15, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
871; SKX-NEXT:    vpmovw2m %xmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x08,0x29,0xca]
872; SKX-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x01]
873; SKX-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
874; SKX-NEXT:    retq ## encoding: [0xc3]
875
876  %a = load double, double* %ptr
877  %v = insertelement <8 x double> undef, double %a, i32 0
878  %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
879
880  %mask_cmp = fcmp ogt <8 x double> %shuffle, %x
881  %mask = and <8 x i1> %mask_cmp, %mask_in
882  %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
883  ret <8 x double> %max
884}
885
886define <4 x i32> @test44(<4 x i16> %x, <4 x i16> %y) #0 {
887; AVX512-LABEL: test44:
888; AVX512:       ## %bb.0:
889; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0xef,0xd2]
890; AVX512-NEXT:    vpblendw $170, %xmm2, %xmm1, %xmm1 ## encoding: [0xc4,0xe3,0x71,0x0e,0xca,0xaa]
891; AVX512-NEXT:    ## xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
892; AVX512-NEXT:    vpblendw $170, %xmm2, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0e,0xc2,0xaa]
893; AVX512-NEXT:    ## xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
894; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0x76,0xc1]
895; AVX512-NEXT:    retq ## encoding: [0xc3]
896;
897; SKX-LABEL: test44:
898; SKX:       ## %bb.0:
899; SKX-NEXT:    vpxor %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0xef,0xd2]
900; SKX-NEXT:    vpblendw $170, %xmm2, %xmm1, %xmm1 ## encoding: [0xc4,0xe3,0x71,0x0e,0xca,0xaa]
901; SKX-NEXT:    ## xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
902; SKX-NEXT:    vpblendw $170, %xmm2, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0e,0xc2,0xaa]
903; SKX-NEXT:    ## xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
904; SKX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0x76,0xc1]
905; SKX-NEXT:    retq ## encoding: [0xc3]
906  %mask = icmp eq <4 x i16> %x, %y
907  %1 = sext <4 x i1> %mask to <4 x i32>
908  ret <4 x i32> %1
909}
910
911define <2 x i64> @test45(<2 x i16> %x, <2 x i16> %y) #0 {
912; AVX512-LABEL: test45:
913; AVX512:       ## %bb.0:
914; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0xef,0xd2]
915; AVX512-NEXT:    vpblendw $17, %xmm1, %xmm2, %xmm1 ## encoding: [0xc4,0xe3,0x69,0x0e,0xc9,0x11]
916; AVX512-NEXT:    ## xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
917; AVX512-NEXT:    vpblendw $17, %xmm0, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x0e,0xc0,0x11]
918; AVX512-NEXT:    ## xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
919; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe2,0x79,0x29,0xc1]
920; AVX512-NEXT:    vpsrlq $63, %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0x73,0xd0,0x3f]
921; AVX512-NEXT:    retq ## encoding: [0xc3]
922;
923; SKX-LABEL: test45:
924; SKX:       ## %bb.0:
925; SKX-NEXT:    vpxor %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0xef,0xd2]
926; SKX-NEXT:    vpblendw $17, %xmm1, %xmm2, %xmm1 ## encoding: [0xc4,0xe3,0x69,0x0e,0xc9,0x11]
927; SKX-NEXT:    ## xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
928; SKX-NEXT:    vpblendw $17, %xmm0, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x0e,0xc0,0x11]
929; SKX-NEXT:    ## xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
930; SKX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe2,0x79,0x29,0xc1]
931; SKX-NEXT:    vpsrlq $63, %xmm0, %xmm0 ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x73,0xd0,0x3f]
932; SKX-NEXT:    retq ## encoding: [0xc3]
933  %mask = icmp eq <2 x i16> %x, %y
934  %1 = zext <2 x i1> %mask to <2 x i64>
935  ret <2 x i64> %1
936}
937
938define <2 x i64> @test46(<2 x float> %x, <2 x float> %y) #0 {
939; AVX512-LABEL: test46:
940; AVX512:       ## %bb.0:
941; AVX512-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf8,0xc2,0xc1,0x00]
942; AVX512-NEXT:    vpmovzxdq %xmm0, %xmm0 ## encoding: [0xc4,0xe2,0x79,0x35,0xc0]
943; AVX512-NEXT:    ## xmm0 = xmm0[0],zero,xmm0[1],zero
944; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0xdb,0x05,A,A,A,A]
945; AVX512-NEXT:    ## fixup A - offset: 4, value: LCPI47_0-4, kind: reloc_riprel_4byte
946; AVX512-NEXT:    retq ## encoding: [0xc3]
947;
948; SKX-LABEL: test46:
949; SKX:       ## %bb.0:
950; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %k0 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0xc1,0x00]
951; SKX-NEXT:    vpmovm2q %k0, %xmm0 ## encoding: [0x62,0xf2,0xfe,0x08,0x38,0xc0]
952; SKX-NEXT:    vpsrlq $63, %xmm0, %xmm0 ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x73,0xd0,0x3f]
953; SKX-NEXT:    retq ## encoding: [0xc3]
954  %mask = fcmp oeq <2 x float> %x, %y
955  %1 = zext <2 x i1> %mask to <2 x i64>
956  ret <2 x i64> %1
957}
958
959define <16 x i8> @test47(<16 x i32> %a, <16 x i8> %b, <16 x i8> %c) {
960; KNL-LABEL: test47:
961; KNL:       ## %bb.0:
962; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
963; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
964; KNL-NEXT:    vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
965; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
966; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
967; KNL-NEXT:    retq ## encoding: [0xc3]
968;
969; AVX512BW-LABEL: test47:
970; AVX512BW:       ## %bb.0:
971; AVX512BW-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
972; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
973; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
974; AVX512BW-NEXT:    vpblendmb %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x6d,0x49,0x66,0xc1]
975; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
976; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
977; AVX512BW-NEXT:    retq ## encoding: [0xc3]
978;
979; SKX-LABEL: test47:
980; SKX:       ## %bb.0:
981; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
982; SKX-NEXT:    vpblendmb %xmm1, %xmm2, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x6d,0x09,0x66,0xc1]
983; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
984; SKX-NEXT:    retq ## encoding: [0xc3]
985  %cmp = icmp eq <16 x i32> %a, zeroinitializer
986  %res = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %c
987  ret <16 x i8> %res
988}
989
990define <16 x i16> @test48(<16 x i32> %a, <16 x i16> %b, <16 x i16> %c) {
991; KNL-LABEL: test48:
992; KNL:       ## %bb.0:
993; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
994; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
995; KNL-NEXT:    vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
996; KNL-NEXT:    vpblendvb %ymm0, %ymm1, %ymm2, %ymm0 ## encoding: [0xc4,0xe3,0x6d,0x4c,0xc1,0x00]
997; KNL-NEXT:    retq ## encoding: [0xc3]
998;
999; AVX512BW-LABEL: test48:
1000; AVX512BW:       ## %bb.0:
1001; AVX512BW-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
1002; AVX512BW-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
1003; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1004; AVX512BW-NEXT:    vpblendmw %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x66,0xc1]
1005; AVX512BW-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1006; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1007;
1008; SKX-LABEL: test48:
1009; SKX:       ## %bb.0:
1010; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1011; SKX-NEXT:    vpblendmw %ymm1, %ymm2, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x29,0x66,0xc1]
1012; SKX-NEXT:    retq ## encoding: [0xc3]
1013  %cmp = icmp eq <16 x i32> %a, zeroinitializer
1014  %res = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %c
1015  ret <16 x i16> %res
1016}
1017
1018define <8 x i16> @test49(<8 x i64> %a, <8 x i16> %b, <8 x i16> %c) {
1019; KNL-LABEL: test49:
1020; KNL:       ## %bb.0:
1021; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1022; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1023; KNL-NEXT:    vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
1024; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
1025; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1026; KNL-NEXT:    retq ## encoding: [0xc3]
1027;
1028; AVX512BW-LABEL: test49:
1029; AVX512BW:       ## %bb.0:
1030; AVX512BW-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
1031; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1032; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1033; AVX512BW-NEXT:    vpblendmw %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x66,0xc1]
1034; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1035; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1036; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1037;
1038; SKX-LABEL: test49:
1039; SKX:       ## %bb.0:
1040; SKX-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1041; SKX-NEXT:    vpblendmw %xmm1, %xmm2, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x09,0x66,0xc1]
1042; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1043; SKX-NEXT:    retq ## encoding: [0xc3]
1044  %cmp = icmp eq <8 x i64> %a, zeroinitializer
1045  %res = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %c
1046  ret <8 x i16> %res
1047}
1048
1049define i16 @pcmpeq_mem_1(<16 x i32> %a, <16 x i32>* %b) {
1050; KNL-LABEL: pcmpeq_mem_1:
1051; KNL:       ## %bb.0:
1052; KNL-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1053; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
1054; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
1055; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1056; KNL-NEXT:    retq ## encoding: [0xc3]
1057;
1058; AVX512BW-LABEL: pcmpeq_mem_1:
1059; AVX512BW:       ## %bb.0:
1060; AVX512BW-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1061; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1062; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
1063; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1064; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1065;
1066; SKX-LABEL: pcmpeq_mem_1:
1067; SKX:       ## %bb.0:
1068; SKX-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1069; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1070; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
1071; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1072; SKX-NEXT:    retq ## encoding: [0xc3]
1073  %load = load <16 x i32>, <16 x i32>* %b
1074  %cmp = icmp eq <16 x i32> %a, %load
1075  %cast = bitcast <16 x i1> %cmp to i16
1076  ret i16 %cast
1077}
1078
1079; Make sure we use the short pcmpeq encoding like the test above when the memoryo
1080; operand is in the first argument instead of the second.
1081define i16 @pcmpeq_mem_2(<16 x i32> %a, <16 x i32>* %b) {
1082; KNL-LABEL: pcmpeq_mem_2:
1083; KNL:       ## %bb.0:
1084; KNL-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1085; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
1086; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
1087; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1088; KNL-NEXT:    retq ## encoding: [0xc3]
1089;
1090; AVX512BW-LABEL: pcmpeq_mem_2:
1091; AVX512BW:       ## %bb.0:
1092; AVX512BW-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1093; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1094; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
1095; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1096; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1097;
1098; SKX-LABEL: pcmpeq_mem_2:
1099; SKX:       ## %bb.0:
1100; SKX-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1101; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1102; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
1103; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1104; SKX-NEXT:    retq ## encoding: [0xc3]
1105  %load = load <16 x i32>, <16 x i32>* %b
1106  %cmp = icmp eq <16 x i32> %load, %a
1107  %cast = bitcast <16 x i1> %cmp to i16
1108  ret i16 %cast
1109}
1110