[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / avx512vl-vec-cmp.ll
blobe42b8d9a1bdda15066b5700ef0cac7f250853bf2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=VLX
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl | FileCheck %s --check-prefix=CHECK --check-prefix=NoVLX
5 define <4 x i64> @test256_1(<4 x i64> %x, <4 x i64> %y) nounwind {
6 ; VLX-LABEL: test256_1:
7 ; VLX:       # BB#0:
8 ; VLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %k1
9 ; VLX-NEXT:    vpblendmq %ymm0, %ymm1, %ymm0 {%k1}
10 ; VLX-NEXT:    retq
12 ; NoVLX-LABEL: test256_1:
13 ; NoVLX:       # BB#0:
14 ; NoVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
15 ; NoVLX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
16 ; NoVLX-NEXT:    retq
17   %mask = icmp eq <4 x i64> %x, %y
18   %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %y
19   ret <4 x i64> %max
22 define <4 x i64> @test256_2(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
23 ; VLX-LABEL: test256_2:
24 ; VLX:       # BB#0:
25 ; VLX-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
26 ; VLX-NEXT:    vpblendmq %ymm2, %ymm1, %ymm0 {%k1}
27 ; VLX-NEXT:    retq
29 ; NoVLX-LABEL: test256_2:
30 ; NoVLX:       # BB#0:
31 ; NoVLX-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
32 ; NoVLX-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
33 ; NoVLX-NEXT:    retq
34   %mask = icmp sgt <4 x i64> %x, %y
35   %max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
36   ret <4 x i64> %max
39 define <8 x i32> @test256_3(<8 x i32> %x, <8 x i32> %y, <8 x i32> %x1) nounwind {
40 ; VLX-LABEL: test256_3:
41 ; VLX:       # BB#0:
42 ; VLX-NEXT:    vpcmpled %ymm0, %ymm1, %k1
43 ; VLX-NEXT:    vpblendmd %ymm2, %ymm1, %ymm0 {%k1}
44 ; VLX-NEXT:    retq
46 ; NoVLX-LABEL: test256_3:
47 ; NoVLX:       # BB#0:
48 ; NoVLX-NEXT:    # kill: %ymm2<def> %ymm2<kill> %zmm2<def>
49 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
50 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
51 ; NoVLX-NEXT:    vpcmpled %zmm0, %zmm1, %k1
52 ; NoVLX-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1}
53 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
54 ; NoVLX-NEXT:    retq
55   %mask = icmp sge <8 x i32> %x, %y
56   %max = select <8 x i1> %mask, <8 x i32> %x1, <8 x i32> %y
57   ret <8 x i32> %max
60 define <4 x i64> @test256_4(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
61 ; VLX-LABEL: test256_4:
62 ; VLX:       # BB#0:
63 ; VLX-NEXT:    vpcmpnleuq %ymm1, %ymm0, %k1
64 ; VLX-NEXT:    vpblendmq %ymm2, %ymm1, %ymm0 {%k1}
65 ; VLX-NEXT:    retq
67 ; NoVLX-LABEL: test256_4:
68 ; NoVLX:       # BB#0:
69 ; NoVLX-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
70 ; NoVLX-NEXT:    vpxor %ymm3, %ymm1, %ymm4
71 ; NoVLX-NEXT:    vpxor %ymm3, %ymm0, %ymm0
72 ; NoVLX-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm0
73 ; NoVLX-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
74 ; NoVLX-NEXT:    retq
75   %mask = icmp ugt <4 x i64> %x, %y
76   %max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
77   ret <4 x i64> %max
80 define <8 x i32> @test256_5(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
81 ; VLX-LABEL: test256_5:
82 ; VLX:       # BB#0:
83 ; VLX-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1
84 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
85 ; VLX-NEXT:    retq
87 ; NoVLX-LABEL: test256_5:
88 ; NoVLX:       # BB#0:
89 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
90 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
91 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
92 ; NoVLX-NEXT:    vpcmpeqd %zmm2, %zmm0, %k1
93 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
94 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
95 ; NoVLX-NEXT:    retq
96   %y = load <8 x i32>, <8 x i32>* %yp, align 4
97   %mask = icmp eq <8 x i32> %x, %y
98   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
99   ret <8 x i32> %max
102 define <8 x i32> @test256_5b(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
103 ; VLX-LABEL: test256_5b:
104 ; VLX:       # BB#0:
105 ; VLX-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1
106 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
107 ; VLX-NEXT:    retq
109 ; NoVLX-LABEL: test256_5b:
110 ; NoVLX:       # BB#0:
111 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
112 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
113 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
114 ; NoVLX-NEXT:    vpcmpeqd %zmm0, %zmm2, %k1
115 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
116 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
117 ; NoVLX-NEXT:    retq
118   %y = load <8 x i32>, <8 x i32>* %yp, align 4
119   %mask = icmp eq <8 x i32> %y, %x
120   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
121   ret <8 x i32> %max
124 define <8 x i32> @test256_6(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
125 ; VLX-LABEL: test256_6:
126 ; VLX:       # BB#0:
127 ; VLX-NEXT:    vpcmpgtd (%rdi), %ymm0, %k1
128 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
129 ; VLX-NEXT:    retq
131 ; NoVLX-LABEL: test256_6:
132 ; NoVLX:       # BB#0:
133 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
134 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
135 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
136 ; NoVLX-NEXT:    vpcmpgtd %zmm2, %zmm0, %k1
137 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
138 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
139 ; NoVLX-NEXT:    retq
140   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
141   %mask = icmp sgt <8 x i32> %x, %y
142   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
143   ret <8 x i32> %max
146 define <8 x i32> @test256_6b(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
147 ; VLX-LABEL: test256_6b:
148 ; VLX:       # BB#0:
149 ; VLX-NEXT:    vpcmpgtd (%rdi), %ymm0, %k1
150 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
151 ; VLX-NEXT:    retq
153 ; NoVLX-LABEL: test256_6b:
154 ; NoVLX:       # BB#0:
155 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
156 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
157 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
158 ; NoVLX-NEXT:    vpcmpgtd %zmm2, %zmm0, %k1
159 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
160 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
161 ; NoVLX-NEXT:    retq
162   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
163   %mask = icmp slt <8 x i32> %y, %x
164   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
165   ret <8 x i32> %max
168 define <8 x i32> @test256_7(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
169 ; VLX-LABEL: test256_7:
170 ; VLX:       # BB#0:
171 ; VLX-NEXT:    vpcmpled (%rdi), %ymm0, %k1
172 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
173 ; VLX-NEXT:    retq
175 ; NoVLX-LABEL: test256_7:
176 ; NoVLX:       # BB#0:
177 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
178 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
179 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
180 ; NoVLX-NEXT:    vpcmpled %zmm2, %zmm0, %k1
181 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
182 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
183 ; NoVLX-NEXT:    retq
184   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
185   %mask = icmp sle <8 x i32> %x, %y
186   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
187   ret <8 x i32> %max
190 define <8 x i32> @test256_7b(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
191 ; VLX-LABEL: test256_7b:
192 ; VLX:       # BB#0:
193 ; VLX-NEXT:    vpcmpled (%rdi), %ymm0, %k1
194 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
195 ; VLX-NEXT:    retq
197 ; NoVLX-LABEL: test256_7b:
198 ; NoVLX:       # BB#0:
199 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
200 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
201 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
202 ; NoVLX-NEXT:    vpcmpled %zmm2, %zmm0, %k1
203 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
204 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
205 ; NoVLX-NEXT:    retq
206   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
207   %mask = icmp sge <8 x i32> %y, %x
208   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
209   ret <8 x i32> %max
212 define <8 x i32> @test256_8(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
213 ; VLX-LABEL: test256_8:
214 ; VLX:       # BB#0:
215 ; VLX-NEXT:    vpcmpleud (%rdi), %ymm0, %k1
216 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
217 ; VLX-NEXT:    retq
219 ; NoVLX-LABEL: test256_8:
220 ; NoVLX:       # BB#0:
221 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
222 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
223 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
224 ; NoVLX-NEXT:    vpcmpleud %zmm2, %zmm0, %k1
225 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
226 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
227 ; NoVLX-NEXT:    retq
228   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
229   %mask = icmp ule <8 x i32> %x, %y
230   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
231   ret <8 x i32> %max
234 define <8 x i32> @test256_8b(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
235 ; VLX-LABEL: test256_8b:
236 ; VLX:       # BB#0:
237 ; VLX-NEXT:    vpcmpleud (%rdi), %ymm0, %k1
238 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
239 ; VLX-NEXT:    retq
241 ; NoVLX-LABEL: test256_8b:
242 ; NoVLX:       # BB#0:
243 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
244 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
245 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
246 ; NoVLX-NEXT:    vpcmpnltud %zmm0, %zmm2, %k1
247 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
248 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
249 ; NoVLX-NEXT:    retq
250   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
251   %mask = icmp uge <8 x i32> %y, %x
252   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
253   ret <8 x i32> %max
256 define <8 x i32> @test256_9(<8 x i32> %x, <8 x i32> %y, <8 x i32> %x1, <8 x i32> %y1) nounwind {
257 ; VLX-LABEL: test256_9:
258 ; VLX:       # BB#0:
259 ; VLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %k1
260 ; VLX-NEXT:    vpcmpeqd %ymm3, %ymm2, %k1 {%k1}
261 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
262 ; VLX-NEXT:    retq
264 ; NoVLX-LABEL: test256_9:
265 ; NoVLX:       # BB#0:
266 ; NoVLX-NEXT:    # kill: %ymm3<def> %ymm3<kill> %zmm3<def>
267 ; NoVLX-NEXT:    # kill: %ymm2<def> %ymm2<kill> %zmm2<def>
268 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
269 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
270 ; NoVLX-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1
271 ; NoVLX-NEXT:    vpcmpeqd %zmm3, %zmm2, %k1 {%k1}
272 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
273 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
274 ; NoVLX-NEXT:    retq
275   %mask1 = icmp eq <8 x i32> %x1, %y1
276   %mask0 = icmp eq <8 x i32> %x, %y
277   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
278   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
279   ret <8 x i32> %max
282 define <4 x i64> @test256_10(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1, <4 x i64> %y1) nounwind {
283 ; VLX-LABEL: test256_10:
284 ; VLX:       # BB#0:
285 ; VLX-NEXT:    vpcmpleq %ymm1, %ymm0, %k1
286 ; VLX-NEXT:    vpcmpleq %ymm2, %ymm3, %k1 {%k1}
287 ; VLX-NEXT:    vpblendmq %ymm0, %ymm2, %ymm0 {%k1}
288 ; VLX-NEXT:    retq
290 ; NoVLX-LABEL: test256_10:
291 ; NoVLX:       # BB#0:
292 ; NoVLX-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm3
293 ; NoVLX-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
294 ; NoVLX-NEXT:    vpxor %ymm4, %ymm3, %ymm3
295 ; NoVLX-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
296 ; NoVLX-NEXT:    vpandn %ymm3, %ymm1, %ymm1
297 ; NoVLX-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
298 ; NoVLX-NEXT:    retq
299   %mask1 = icmp sge <4 x i64> %x1, %y1
300   %mask0 = icmp sle <4 x i64> %x, %y
301   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
302   %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
303   ret <4 x i64> %max
306 define <4 x i64> @test256_11(<4 x i64> %x, <4 x i64>* %y.ptr, <4 x i64> %x1, <4 x i64> %y1) nounwind {
307 ; VLX-LABEL: test256_11:
308 ; VLX:       # BB#0:
309 ; VLX-NEXT:    vpcmpgtq %ymm2, %ymm1, %k1
310 ; VLX-NEXT:    vpcmpgtq (%rdi), %ymm0, %k1 {%k1}
311 ; VLX-NEXT:    vpblendmq %ymm0, %ymm1, %ymm0 {%k1}
312 ; VLX-NEXT:    retq
314 ; NoVLX-LABEL: test256_11:
315 ; NoVLX:       # BB#0:
316 ; NoVLX-NEXT:    vpcmpgtq (%rdi), %ymm0, %ymm3
317 ; NoVLX-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm2
318 ; NoVLX-NEXT:    vpand %ymm2, %ymm3, %ymm2
319 ; NoVLX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
320 ; NoVLX-NEXT:    retq
321   %mask1 = icmp sgt <4 x i64> %x1, %y1
322   %y = load <4 x i64>, <4 x i64>* %y.ptr, align 4
323   %mask0 = icmp sgt <4 x i64> %x, %y
324   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
325   %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
326   ret <4 x i64> %max
329 define <8 x i32> @test256_12(<8 x i32> %x, <8 x i32>* %y.ptr, <8 x i32> %x1, <8 x i32> %y1) nounwind {
330 ; VLX-LABEL: test256_12:
331 ; VLX:       # BB#0:
332 ; VLX-NEXT:    vpcmpled %ymm1, %ymm2, %k1
333 ; VLX-NEXT:    vpcmpleud (%rdi), %ymm0, %k1 {%k1}
334 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
335 ; VLX-NEXT:    retq
337 ; NoVLX-LABEL: test256_12:
338 ; NoVLX:       # BB#0:
339 ; NoVLX-NEXT:    # kill: %ymm2<def> %ymm2<kill> %zmm2<def>
340 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
341 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
342 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm3
343 ; NoVLX-NEXT:    vpcmpleud %zmm3, %zmm0, %k1
344 ; NoVLX-NEXT:    vpcmpled %zmm1, %zmm2, %k1 {%k1}
345 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
346 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
347 ; NoVLX-NEXT:    retq
348   %mask1 = icmp sge <8 x i32> %x1, %y1
349   %y = load <8 x i32>, <8 x i32>* %y.ptr, align 4
350   %mask0 = icmp ule <8 x i32> %x, %y
351   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
352   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
353   ret <8 x i32> %max
356 define <4 x i64> @test256_13(<4 x i64> %x, <4 x i64> %x1, i64* %yb.ptr) nounwind {
357 ; VLX-LABEL: test256_13:
358 ; VLX:       # BB#0:
359 ; VLX-NEXT:    vpcmpeqq (%rdi){1to4}, %ymm0, %k1
360 ; VLX-NEXT:    vpblendmq %ymm0, %ymm1, %ymm0 {%k1}
361 ; VLX-NEXT:    retq
363 ; NoVLX-LABEL: test256_13:
364 ; NoVLX:       # BB#0:
365 ; NoVLX-NEXT:    vpbroadcastq (%rdi), %ymm2
366 ; NoVLX-NEXT:    vpcmpeqq %ymm2, %ymm0, %ymm2
367 ; NoVLX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
368 ; NoVLX-NEXT:    retq
369   %yb = load i64, i64* %yb.ptr, align 4
370   %y.0 = insertelement <4 x i64> undef, i64 %yb, i32 0
371   %y = shufflevector <4 x i64> %y.0, <4 x i64> undef, <4 x i32> zeroinitializer
372   %mask = icmp eq <4 x i64> %x, %y
373   %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
374   ret <4 x i64> %max
377 define <8 x i32> @test256_14(<8 x i32> %x, i32* %yb.ptr, <8 x i32> %x1) nounwind {
378 ; VLX-LABEL: test256_14:
379 ; VLX:       # BB#0:
380 ; VLX-NEXT:    vpcmpled (%rdi){1to8}, %ymm0, %k1
381 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
382 ; VLX-NEXT:    retq
384 ; NoVLX-LABEL: test256_14:
385 ; NoVLX:       # BB#0:
386 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
387 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
388 ; NoVLX-NEXT:    vpbroadcastd (%rdi), %ymm2
389 ; NoVLX-NEXT:    vpcmpled %zmm2, %zmm0, %k1
390 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
391 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
392 ; NoVLX-NEXT:    retq
393   %yb = load i32, i32* %yb.ptr, align 4
394   %y.0 = insertelement <8 x i32> undef, i32 %yb, i32 0
395   %y = shufflevector <8 x i32> %y.0, <8 x i32> undef, <8 x i32> zeroinitializer
396   %mask = icmp sle <8 x i32> %x, %y
397   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
398   ret <8 x i32> %max
401 define <8 x i32> @test256_15(<8 x i32> %x, i32* %yb.ptr, <8 x i32> %x1, <8 x i32> %y1) nounwind {
402 ; VLX-LABEL: test256_15:
403 ; VLX:       # BB#0:
404 ; VLX-NEXT:    vpcmpled %ymm1, %ymm2, %k1
405 ; VLX-NEXT:    vpcmpgtd (%rdi){1to8}, %ymm0, %k1 {%k1}
406 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
407 ; VLX-NEXT:    retq
409 ; NoVLX-LABEL: test256_15:
410 ; NoVLX:       # BB#0:
411 ; NoVLX-NEXT:    # kill: %ymm2<def> %ymm2<kill> %zmm2<def>
412 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
413 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
414 ; NoVLX-NEXT:    vpbroadcastd (%rdi), %ymm3
415 ; NoVLX-NEXT:    vpcmpgtd %zmm3, %zmm0, %k1
416 ; NoVLX-NEXT:    vpcmpled %zmm1, %zmm2, %k1 {%k1}
417 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
418 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
419 ; NoVLX-NEXT:    retq
420   %mask1 = icmp sge <8 x i32> %x1, %y1
421   %yb = load i32, i32* %yb.ptr, align 4
422   %y.0 = insertelement <8 x i32> undef, i32 %yb, i32 0
423   %y = shufflevector <8 x i32> %y.0, <8 x i32> undef, <8 x i32> zeroinitializer
424   %mask0 = icmp sgt <8 x i32> %x, %y
425   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
426   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
427   ret <8 x i32> %max
430 define <4 x i64> @test256_16(<4 x i64> %x, i64* %yb.ptr, <4 x i64> %x1, <4 x i64> %y1) nounwind {
431 ; VLX-LABEL: test256_16:
432 ; VLX:       # BB#0:
433 ; VLX-NEXT:    vpcmpleq %ymm1, %ymm2, %k1
434 ; VLX-NEXT:    vpcmpgtq (%rdi){1to4}, %ymm0, %k1 {%k1}
435 ; VLX-NEXT:    vpblendmq %ymm0, %ymm1, %ymm0 {%k1}
436 ; VLX-NEXT:    retq
438 ; NoVLX-LABEL: test256_16:
439 ; NoVLX:       # BB#0:
440 ; NoVLX-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm2
441 ; NoVLX-NEXT:    vpbroadcastq (%rdi), %ymm3
442 ; NoVLX-NEXT:    vpcmpgtq %ymm3, %ymm0, %ymm3
443 ; NoVLX-NEXT:    vpandn %ymm3, %ymm2, %ymm2
444 ; NoVLX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
445 ; NoVLX-NEXT:    retq
446   %mask1 = icmp sge <4 x i64> %x1, %y1
447   %yb = load i64, i64* %yb.ptr, align 4
448   %y.0 = insertelement <4 x i64> undef, i64 %yb, i32 0
449   %y = shufflevector <4 x i64> %y.0, <4 x i64> undef, <4 x i32> zeroinitializer
450   %mask0 = icmp sgt <4 x i64> %x, %y
451   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
452   %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
453   ret <4 x i64> %max
456 define <8 x i32> @test256_17(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
457 ; VLX-LABEL: test256_17:
458 ; VLX:       # BB#0:
459 ; VLX-NEXT:    vpcmpneqd (%rdi), %ymm0, %k1
460 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
461 ; VLX-NEXT:    retq
463 ; NoVLX-LABEL: test256_17:
464 ; NoVLX:       # BB#0:
465 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
466 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
467 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
468 ; NoVLX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
469 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
470 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
471 ; NoVLX-NEXT:    retq
472   %y = load <8 x i32>, <8 x i32>* %yp, align 4
473   %mask = icmp ne <8 x i32> %x, %y
474   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
475   ret <8 x i32> %max
478 define <8 x i32> @test256_18(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
479 ; VLX-LABEL: test256_18:
480 ; VLX:       # BB#0:
481 ; VLX-NEXT:    vpcmpneqd (%rdi), %ymm0, %k1
482 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
483 ; VLX-NEXT:    retq
485 ; NoVLX-LABEL: test256_18:
486 ; NoVLX:       # BB#0:
487 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
488 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
489 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
490 ; NoVLX-NEXT:    vpcmpneqd %zmm0, %zmm2, %k1
491 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
492 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
493 ; NoVLX-NEXT:    retq
494   %y = load <8 x i32>, <8 x i32>* %yp, align 4
495   %mask = icmp ne <8 x i32> %y, %x
496   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
497   ret <8 x i32> %max
500 define <8 x i32> @test256_19(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
501 ; VLX-LABEL: test256_19:
502 ; VLX:       # BB#0:
503 ; VLX-NEXT:    vpcmpnltud (%rdi), %ymm0, %k1
504 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
505 ; VLX-NEXT:    retq
507 ; NoVLX-LABEL: test256_19:
508 ; NoVLX:       # BB#0:
509 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
510 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
511 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
512 ; NoVLX-NEXT:    vpcmpnltud %zmm2, %zmm0, %k1
513 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
514 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
515 ; NoVLX-NEXT:    retq
516   %y = load <8 x i32>, <8 x i32>* %yp, align 4
517   %mask = icmp uge <8 x i32> %x, %y
518   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
519   ret <8 x i32> %max
522 define <8 x i32> @test256_20(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
523 ; VLX-LABEL: test256_20:
524 ; VLX:       # BB#0:
525 ; VLX-NEXT:    vpcmpleud (%rdi), %ymm0, %k1
526 ; VLX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}
527 ; VLX-NEXT:    retq
529 ; NoVLX-LABEL: test256_20:
530 ; NoVLX:       # BB#0:
531 ; NoVLX-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
532 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
533 ; NoVLX-NEXT:    vmovdqu (%rdi), %ymm2
534 ; NoVLX-NEXT:    vpcmpnltud %zmm0, %zmm2, %k1
535 ; NoVLX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
536 ; NoVLX-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
537 ; NoVLX-NEXT:    retq
538   %y = load <8 x i32>, <8 x i32>* %yp, align 4
539   %mask = icmp uge <8 x i32> %y, %x
540   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
541   ret <8 x i32> %max
544 define <2 x i64> @test128_1(<2 x i64> %x, <2 x i64> %y) nounwind {
545 ; VLX-LABEL: test128_1:
546 ; VLX:       # BB#0:
547 ; VLX-NEXT:    vpcmpeqq %xmm1, %xmm0, %k1
548 ; VLX-NEXT:    vpblendmq %xmm0, %xmm1, %xmm0 {%k1}
549 ; VLX-NEXT:    retq
551 ; NoVLX-LABEL: test128_1:
552 ; NoVLX:       # BB#0:
553 ; NoVLX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm2
554 ; NoVLX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
555 ; NoVLX-NEXT:    retq
556   %mask = icmp eq <2 x i64> %x, %y
557   %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %y
558   ret <2 x i64> %max
561 define <2 x i64> @test128_2(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
562 ; VLX-LABEL: test128_2:
563 ; VLX:       # BB#0:
564 ; VLX-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
565 ; VLX-NEXT:    vpblendmq %xmm2, %xmm1, %xmm0 {%k1}
566 ; VLX-NEXT:    retq
568 ; NoVLX-LABEL: test128_2:
569 ; NoVLX:       # BB#0:
570 ; NoVLX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
571 ; NoVLX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
572 ; NoVLX-NEXT:    retq
573   %mask = icmp sgt <2 x i64> %x, %y
574   %max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
575   ret <2 x i64> %max
578 define <4 x i32> @test128_3(<4 x i32> %x, <4 x i32> %y, <4 x i32> %x1) nounwind {
579 ; VLX-LABEL: test128_3:
580 ; VLX:       # BB#0:
581 ; VLX-NEXT:    vpcmpled %xmm0, %xmm1, %k1
582 ; VLX-NEXT:    vpblendmd %xmm2, %xmm1, %xmm0 {%k1}
583 ; VLX-NEXT:    retq
585 ; NoVLX-LABEL: test128_3:
586 ; NoVLX:       # BB#0:
587 ; NoVLX-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
588 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
589 ; NoVLX-NEXT:    vpxor %xmm3, %xmm0, %xmm0
590 ; NoVLX-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
591 ; NoVLX-NEXT:    retq
592   %mask = icmp sge <4 x i32> %x, %y
593   %max = select <4 x i1> %mask, <4 x i32> %x1, <4 x i32> %y
594   ret <4 x i32> %max
597 define <2 x i64> @test128_4(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
598 ; VLX-LABEL: test128_4:
599 ; VLX:       # BB#0:
600 ; VLX-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k1
601 ; VLX-NEXT:    vpblendmq %xmm2, %xmm1, %xmm0 {%k1}
602 ; VLX-NEXT:    retq
604 ; NoVLX-LABEL: test128_4:
605 ; NoVLX:       # BB#0:
606 ; NoVLX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
607 ; NoVLX-NEXT:    vpxor %xmm3, %xmm1, %xmm4
608 ; NoVLX-NEXT:    vpxor %xmm3, %xmm0, %xmm0
609 ; NoVLX-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm0
610 ; NoVLX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
611 ; NoVLX-NEXT:    retq
612   %mask = icmp ugt <2 x i64> %x, %y
613   %max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
614   ret <2 x i64> %max
617 define <4 x i32> @test128_5(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %yp) nounwind {
618 ; VLX-LABEL: test128_5:
619 ; VLX:       # BB#0:
620 ; VLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %k1
621 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
622 ; VLX-NEXT:    retq
624 ; NoVLX-LABEL: test128_5:
625 ; NoVLX:       # BB#0:
626 ; NoVLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %xmm2
627 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
628 ; NoVLX-NEXT:    retq
629   %y = load <4 x i32>, <4 x i32>* %yp, align 4
630   %mask = icmp eq <4 x i32> %x, %y
631   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
632   ret <4 x i32> %max
635 define <4 x i32> @test128_5b(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %yp) nounwind {
636 ; VLX-LABEL: test128_5b:
637 ; VLX:       # BB#0:
638 ; VLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %k1
639 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
640 ; VLX-NEXT:    retq
642 ; NoVLX-LABEL: test128_5b:
643 ; NoVLX:       # BB#0:
644 ; NoVLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %xmm2
645 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
646 ; NoVLX-NEXT:    retq
647   %y = load <4 x i32>, <4 x i32>* %yp, align 4
648   %mask = icmp eq <4 x i32> %y, %x
649   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
650   ret <4 x i32> %max
653 define <4 x i32> @test128_6(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
654 ; VLX-LABEL: test128_6:
655 ; VLX:       # BB#0:
656 ; VLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %k1
657 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
658 ; VLX-NEXT:    retq
660 ; NoVLX-LABEL: test128_6:
661 ; NoVLX:       # BB#0:
662 ; NoVLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %xmm2
663 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
664 ; NoVLX-NEXT:    retq
665   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
666   %mask = icmp sgt <4 x i32> %x, %y
667   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
668   ret <4 x i32> %max
671 define <4 x i32> @test128_6b(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
672 ; VLX-LABEL: test128_6b:
673 ; VLX:       # BB#0:
674 ; VLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %k1
675 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
676 ; VLX-NEXT:    retq
678 ; NoVLX-LABEL: test128_6b:
679 ; NoVLX:       # BB#0:
680 ; NoVLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %xmm2
681 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
682 ; NoVLX-NEXT:    retq
683   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
684   %mask = icmp slt <4 x i32> %y, %x
685   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
686   ret <4 x i32> %max
689 define <4 x i32> @test128_7(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
690 ; VLX-LABEL: test128_7:
691 ; VLX:       # BB#0:
692 ; VLX-NEXT:    vpcmpled (%rdi), %xmm0, %k1
693 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
694 ; VLX-NEXT:    retq
696 ; NoVLX-LABEL: test128_7:
697 ; NoVLX:       # BB#0:
698 ; NoVLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %xmm2
699 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
700 ; NoVLX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
701 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
702 ; NoVLX-NEXT:    retq
703   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
704   %mask = icmp sle <4 x i32> %x, %y
705   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
706   ret <4 x i32> %max
709 define <4 x i32> @test128_7b(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
710 ; VLX-LABEL: test128_7b:
711 ; VLX:       # BB#0:
712 ; VLX-NEXT:    vpcmpled (%rdi), %xmm0, %k1
713 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
714 ; VLX-NEXT:    retq
716 ; NoVLX-LABEL: test128_7b:
717 ; NoVLX:       # BB#0:
718 ; NoVLX-NEXT:    vpcmpgtd (%rdi), %xmm0, %xmm2
719 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
720 ; NoVLX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
721 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
722 ; NoVLX-NEXT:    retq
723   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
724   %mask = icmp sge <4 x i32> %y, %x
725   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
726   ret <4 x i32> %max
729 define <4 x i32> @test128_8(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
730 ; VLX-LABEL: test128_8:
731 ; VLX:       # BB#0:
732 ; VLX-NEXT:    vpcmpleud (%rdi), %xmm0, %k1
733 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
734 ; VLX-NEXT:    retq
736 ; NoVLX-LABEL: test128_8:
737 ; NoVLX:       # BB#0:
738 ; NoVLX-NEXT:    vpminud (%rdi), %xmm0, %xmm2
739 ; NoVLX-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm2
740 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
741 ; NoVLX-NEXT:    retq
742   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
743   %mask = icmp ule <4 x i32> %x, %y
744   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
745   ret <4 x i32> %max
748 define <4 x i32> @test128_8b(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
749 ; VLX-LABEL: test128_8b:
750 ; VLX:       # BB#0:
751 ; VLX-NEXT:    vpcmpleud (%rdi), %xmm0, %k1
752 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
753 ; VLX-NEXT:    retq
755 ; NoVLX-LABEL: test128_8b:
756 ; NoVLX:       # BB#0:
757 ; NoVLX-NEXT:    vmovdqu (%rdi), %xmm2
758 ; NoVLX-NEXT:    vpmaxud %xmm0, %xmm2, %xmm3
759 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
760 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
761 ; NoVLX-NEXT:    retq
762   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
763   %mask = icmp uge <4 x i32> %y, %x
764   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
765   ret <4 x i32> %max
768 define <4 x i32> @test128_9(<4 x i32> %x, <4 x i32> %y, <4 x i32> %x1, <4 x i32> %y1) nounwind {
769 ; VLX-LABEL: test128_9:
770 ; VLX:       # BB#0:
771 ; VLX-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
772 ; VLX-NEXT:    vpcmpeqd %xmm3, %xmm2, %k1 {%k1}
773 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
774 ; VLX-NEXT:    retq
776 ; NoVLX-LABEL: test128_9:
777 ; NoVLX:       # BB#0:
778 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
779 ; NoVLX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm3
780 ; NoVLX-NEXT:    vpand %xmm2, %xmm3, %xmm2
781 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
782 ; NoVLX-NEXT:    retq
783   %mask1 = icmp eq <4 x i32> %x1, %y1
784   %mask0 = icmp eq <4 x i32> %x, %y
785   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
786   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %y
787   ret <4 x i32> %max
790 define <2 x i64> @test128_10(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1, <2 x i64> %y1) nounwind {
791 ; VLX-LABEL: test128_10:
792 ; VLX:       # BB#0:
793 ; VLX-NEXT:    vpcmpleq %xmm1, %xmm0, %k1
794 ; VLX-NEXT:    vpcmpleq %xmm2, %xmm3, %k1 {%k1}
795 ; VLX-NEXT:    vpblendmq %xmm0, %xmm2, %xmm0 {%k1}
796 ; VLX-NEXT:    retq
798 ; NoVLX-LABEL: test128_10:
799 ; NoVLX:       # BB#0:
800 ; NoVLX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm3
801 ; NoVLX-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
802 ; NoVLX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
803 ; NoVLX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm1
804 ; NoVLX-NEXT:    vpandn %xmm3, %xmm1, %xmm1
805 ; NoVLX-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
806 ; NoVLX-NEXT:    retq
807   %mask1 = icmp sge <2 x i64> %x1, %y1
808   %mask0 = icmp sle <2 x i64> %x, %y
809   %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
810   %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
811   ret <2 x i64> %max
814 define <2 x i64> @test128_11(<2 x i64> %x, <2 x i64>* %y.ptr, <2 x i64> %x1, <2 x i64> %y1) nounwind {
815 ; VLX-LABEL: test128_11:
816 ; VLX:       # BB#0:
817 ; VLX-NEXT:    vpcmpgtq %xmm2, %xmm1, %k1
818 ; VLX-NEXT:    vpcmpgtq (%rdi), %xmm0, %k1 {%k1}
819 ; VLX-NEXT:    vpblendmq %xmm0, %xmm1, %xmm0 {%k1}
820 ; VLX-NEXT:    retq
822 ; NoVLX-LABEL: test128_11:
823 ; NoVLX:       # BB#0:
824 ; NoVLX-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm3
825 ; NoVLX-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
826 ; NoVLX-NEXT:    vpand %xmm2, %xmm3, %xmm2
827 ; NoVLX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
828 ; NoVLX-NEXT:    retq
829   %mask1 = icmp sgt <2 x i64> %x1, %y1
830   %y = load <2 x i64>, <2 x i64>* %y.ptr, align 4
831   %mask0 = icmp sgt <2 x i64> %x, %y
832   %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
833   %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
834   ret <2 x i64> %max
837 define <4 x i32> @test128_12(<4 x i32> %x, <4 x i32>* %y.ptr, <4 x i32> %x1, <4 x i32> %y1) nounwind {
838 ; VLX-LABEL: test128_12:
839 ; VLX:       # BB#0:
840 ; VLX-NEXT:    vpcmpled %xmm1, %xmm2, %k1
841 ; VLX-NEXT:    vpcmpleud (%rdi), %xmm0, %k1 {%k1}
842 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
843 ; VLX-NEXT:    retq
845 ; NoVLX-LABEL: test128_12:
846 ; NoVLX:       # BB#0:
847 ; NoVLX-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm2
848 ; NoVLX-NEXT:    vpminud (%rdi), %xmm0, %xmm3
849 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm3
850 ; NoVLX-NEXT:    vpandn %xmm3, %xmm2, %xmm2
851 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
852 ; NoVLX-NEXT:    retq
853   %mask1 = icmp sge <4 x i32> %x1, %y1
854   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
855   %mask0 = icmp ule <4 x i32> %x, %y
856   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
857   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
858   ret <4 x i32> %max
861 define <2 x i64> @test128_13(<2 x i64> %x, <2 x i64> %x1, i64* %yb.ptr) nounwind {
862 ; VLX-LABEL: test128_13:
863 ; VLX:       # BB#0:
864 ; VLX-NEXT:    vpcmpeqq (%rdi){1to2}, %xmm0, %k1
865 ; VLX-NEXT:    vpblendmq %xmm0, %xmm1, %xmm0 {%k1}
866 ; VLX-NEXT:    retq
868 ; NoVLX-LABEL: test128_13:
869 ; NoVLX:       # BB#0:
870 ; NoVLX-NEXT:    vpbroadcastq (%rdi), %xmm2
871 ; NoVLX-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm2
872 ; NoVLX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
873 ; NoVLX-NEXT:    retq
874   %yb = load i64, i64* %yb.ptr, align 4
875   %y.0 = insertelement <2 x i64> undef, i64 %yb, i32 0
876   %y = insertelement <2 x i64> %y.0, i64 %yb, i32 1
877   %mask = icmp eq <2 x i64> %x, %y
878   %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
879   ret <2 x i64> %max
882 define <4 x i32> @test128_14(<4 x i32> %x, i32* %yb.ptr, <4 x i32> %x1) nounwind {
883 ; VLX-LABEL: test128_14:
884 ; VLX:       # BB#0:
885 ; VLX-NEXT:    vpcmpled (%rdi){1to4}, %xmm0, %k1
886 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
887 ; VLX-NEXT:    retq
889 ; NoVLX-LABEL: test128_14:
890 ; NoVLX:       # BB#0:
891 ; NoVLX-NEXT:    vpbroadcastd (%rdi), %xmm2
892 ; NoVLX-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm2
893 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
894 ; NoVLX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
895 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
896 ; NoVLX-NEXT:    retq
897   %yb = load i32, i32* %yb.ptr, align 4
898   %y.0 = insertelement <4 x i32> undef, i32 %yb, i32 0
899   %y = shufflevector <4 x i32> %y.0, <4 x i32> undef, <4 x i32> zeroinitializer
900   %mask = icmp sle <4 x i32> %x, %y
901   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
902   ret <4 x i32> %max
905 define <4 x i32> @test128_15(<4 x i32> %x, i32* %yb.ptr, <4 x i32> %x1, <4 x i32> %y1) nounwind {
906 ; VLX-LABEL: test128_15:
907 ; VLX:       # BB#0:
908 ; VLX-NEXT:    vpcmpled %xmm1, %xmm2, %k1
909 ; VLX-NEXT:    vpcmpgtd (%rdi){1to4}, %xmm0, %k1 {%k1}
910 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
911 ; VLX-NEXT:    retq
913 ; NoVLX-LABEL: test128_15:
914 ; NoVLX:       # BB#0:
915 ; NoVLX-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm2
916 ; NoVLX-NEXT:    vpbroadcastd (%rdi), %xmm3
917 ; NoVLX-NEXT:    vpcmpgtd %xmm3, %xmm0, %xmm3
918 ; NoVLX-NEXT:    vpandn %xmm3, %xmm2, %xmm2
919 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
920 ; NoVLX-NEXT:    retq
921   %mask1 = icmp sge <4 x i32> %x1, %y1
922   %yb = load i32, i32* %yb.ptr, align 4
923   %y.0 = insertelement <4 x i32> undef, i32 %yb, i32 0
924   %y = shufflevector <4 x i32> %y.0, <4 x i32> undef, <4 x i32> zeroinitializer
925   %mask0 = icmp sgt <4 x i32> %x, %y
926   %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
927   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
928   ret <4 x i32> %max
931 define <2 x i64> @test128_16(<2 x i64> %x, i64* %yb.ptr, <2 x i64> %x1, <2 x i64> %y1) nounwind {
932 ; VLX-LABEL: test128_16:
933 ; VLX:       # BB#0:
934 ; VLX-NEXT:    vpcmpleq %xmm1, %xmm2, %k1
935 ; VLX-NEXT:    vpcmpgtq (%rdi){1to2}, %xmm0, %k1 {%k1}
936 ; VLX-NEXT:    vpblendmq %xmm0, %xmm1, %xmm0 {%k1}
937 ; VLX-NEXT:    retq
939 ; NoVLX-LABEL: test128_16:
940 ; NoVLX:       # BB#0:
941 ; NoVLX-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm2
942 ; NoVLX-NEXT:    vpbroadcastq (%rdi), %xmm3
943 ; NoVLX-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm3
944 ; NoVLX-NEXT:    vpandn %xmm3, %xmm2, %xmm2
945 ; NoVLX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
946 ; NoVLX-NEXT:    retq
947   %mask1 = icmp sge <2 x i64> %x1, %y1
948   %yb = load i64, i64* %yb.ptr, align 4
949   %y.0 = insertelement <2 x i64> undef, i64 %yb, i32 0
950   %y = insertelement <2 x i64> %y.0, i64 %yb, i32 1
951   %mask0 = icmp sgt <2 x i64> %x, %y
952   %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
953   %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
954   ret <2 x i64> %max
957 define <4 x i32> @test128_17(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
958 ; VLX-LABEL: test128_17:
959 ; VLX:       # BB#0:
960 ; VLX-NEXT:    vpcmpneqd (%rdi), %xmm0, %k1
961 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
962 ; VLX-NEXT:    retq
964 ; NoVLX-LABEL: test128_17:
965 ; NoVLX:       # BB#0:
966 ; NoVLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %xmm2
967 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
968 ; NoVLX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
969 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
970 ; NoVLX-NEXT:    retq
971   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
972   %mask = icmp ne <4 x i32> %x, %y
973   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
974   ret <4 x i32> %max
977 define <4 x i32> @test128_18(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
978 ; VLX-LABEL: test128_18:
979 ; VLX:       # BB#0:
980 ; VLX-NEXT:    vpcmpneqd (%rdi), %xmm0, %k1
981 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
982 ; VLX-NEXT:    retq
984 ; NoVLX-LABEL: test128_18:
985 ; NoVLX:       # BB#0:
986 ; NoVLX-NEXT:    vpcmpeqd (%rdi), %xmm0, %xmm2
987 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
988 ; NoVLX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
989 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
990 ; NoVLX-NEXT:    retq
991   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
992   %mask = icmp ne <4 x i32> %y, %x
993   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
994   ret <4 x i32> %max
997 define <4 x i32> @test128_19(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
998 ; VLX-LABEL: test128_19:
999 ; VLX:       # BB#0:
1000 ; VLX-NEXT:    vpcmpnltud (%rdi), %xmm0, %k1
1001 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
1002 ; VLX-NEXT:    retq
1004 ; NoVLX-LABEL: test128_19:
1005 ; NoVLX:       # BB#0:
1006 ; NoVLX-NEXT:    vpmaxud (%rdi), %xmm0, %xmm2
1007 ; NoVLX-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm2
1008 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
1009 ; NoVLX-NEXT:    retq
1010   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
1011   %mask = icmp uge <4 x i32> %x, %y
1012   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
1013   ret <4 x i32> %max
1016 define <4 x i32> @test128_20(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
1017 ; VLX-LABEL: test128_20:
1018 ; VLX:       # BB#0:
1019 ; VLX-NEXT:    vpcmpleud (%rdi), %xmm0, %k1
1020 ; VLX-NEXT:    vpblendmd %xmm0, %xmm1, %xmm0 {%k1}
1021 ; VLX-NEXT:    retq
1023 ; NoVLX-LABEL: test128_20:
1024 ; NoVLX:       # BB#0:
1025 ; NoVLX-NEXT:    vmovdqu (%rdi), %xmm2
1026 ; NoVLX-NEXT:    vpmaxud %xmm0, %xmm2, %xmm3
1027 ; NoVLX-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1028 ; NoVLX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
1029 ; NoVLX-NEXT:    retq
1030   %y = load <4 x i32>, <4 x i32>* %y.ptr, align 4
1031   %mask = icmp uge <4 x i32> %y, %x
1032   %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
1033   ret <4 x i32> %max