[X86][SSE] Regenerate MINMAX tests
[oota-llvm.git] / test / CodeGen / X86 / vselect-minmax.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE4
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F --check-prefix=AVX512BW --check-prefix=AVX512VL
7
8 define <16 x i8> @test1(<16 x i8> %a, <16 x i8> %b) {
9 ; SSE2-LABEL: test1:
10 ; SSE2:       # BB#0: # %entry
11 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
12 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
13 ; SSE2-NEXT:    pand %xmm2, %xmm0
14 ; SSE2-NEXT:    pandn %xmm1, %xmm2
15 ; SSE2-NEXT:    por %xmm2, %xmm0
16 ; SSE2-NEXT:    retq
17 ;
18 ; SSE4-LABEL: test1:
19 ; SSE4:       # BB#0: # %entry
20 ; SSE4-NEXT:    pminsb %xmm1, %xmm0
21 ; SSE4-NEXT:    retq
22 ;
23 ; AVX-LABEL: test1:
24 ; AVX:       # BB#0: # %entry
25 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
26 ; AVX-NEXT:    retq
27 entry:
28   %cmp = icmp slt <16 x i8> %a, %b
29   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
30   ret <16 x i8> %sel
31 }
32
33 define <16 x i8> @test2(<16 x i8> %a, <16 x i8> %b) {
34 ; SSE2-LABEL: test2:
35 ; SSE2:       # BB#0: # %entry
36 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
37 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
38 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
39 ; SSE2-NEXT:    pxor %xmm2, %xmm3
40 ; SSE2-NEXT:    pandn %xmm0, %xmm2
41 ; SSE2-NEXT:    pandn %xmm1, %xmm3
42 ; SSE2-NEXT:    por %xmm3, %xmm2
43 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
44 ; SSE2-NEXT:    retq
45 ;
46 ; SSE4-LABEL: test2:
47 ; SSE4:       # BB#0: # %entry
48 ; SSE4-NEXT:    pminsb %xmm1, %xmm0
49 ; SSE4-NEXT:    retq
50 ;
51 ; AVX-LABEL: test2:
52 ; AVX:       # BB#0: # %entry
53 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
54 ; AVX-NEXT:    retq
55 entry:
56   %cmp = icmp sle <16 x i8> %a, %b
57   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
58   ret <16 x i8> %sel
59 }
60
61 define <16 x i8> @test3(<16 x i8> %a, <16 x i8> %b) {
62 ; SSE2-LABEL: test3:
63 ; SSE2:       # BB#0: # %entry
64 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
65 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
66 ; SSE2-NEXT:    pand %xmm2, %xmm0
67 ; SSE2-NEXT:    pandn %xmm1, %xmm2
68 ; SSE2-NEXT:    por %xmm0, %xmm2
69 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
70 ; SSE2-NEXT:    retq
71 ;
72 ; SSE4-LABEL: test3:
73 ; SSE4:       # BB#0: # %entry
74 ; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
75 ; SSE4-NEXT:    retq
76 ;
77 ; AVX-LABEL: test3:
78 ; AVX:       # BB#0: # %entry
79 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
80 ; AVX-NEXT:    retq
81 entry:
82   %cmp = icmp sgt <16 x i8> %a, %b
83   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
84   ret <16 x i8> %sel
85 }
86
87 define <16 x i8> @test4(<16 x i8> %a, <16 x i8> %b) {
88 ; SSE2-LABEL: test4:
89 ; SSE2:       # BB#0: # %entry
90 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
91 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
92 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
93 ; SSE2-NEXT:    pxor %xmm3, %xmm2
94 ; SSE2-NEXT:    pandn %xmm0, %xmm3
95 ; SSE2-NEXT:    pandn %xmm1, %xmm2
96 ; SSE2-NEXT:    por %xmm3, %xmm2
97 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
98 ; SSE2-NEXT:    retq
99 ;
100 ; SSE4-LABEL: test4:
101 ; SSE4:       # BB#0: # %entry
102 ; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
103 ; SSE4-NEXT:    retq
104 ;
105 ; AVX-LABEL: test4:
106 ; AVX:       # BB#0: # %entry
107 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
108 ; AVX-NEXT:    retq
109 entry:
110   %cmp = icmp sge <16 x i8> %a, %b
111   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
112   ret <16 x i8> %sel
113 }
114
115 define <16 x i8> @test5(<16 x i8> %a, <16 x i8> %b) {
116 ; SSE-LABEL: test5:
117 ; SSE:       # BB#0: # %entry
118 ; SSE-NEXT:    pminub %xmm1, %xmm0
119 ; SSE-NEXT:    retq
120 ;
121 ; AVX-LABEL: test5:
122 ; AVX:       # BB#0: # %entry
123 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
124 ; AVX-NEXT:    retq
125 entry:
126   %cmp = icmp ult <16 x i8> %a, %b
127   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
128   ret <16 x i8> %sel
129 }
130
131 define <16 x i8> @test6(<16 x i8> %a, <16 x i8> %b) {
132 ; SSE-LABEL: test6:
133 ; SSE:       # BB#0: # %entry
134 ; SSE-NEXT:    pminub %xmm1, %xmm0
135 ; SSE-NEXT:    retq
136 ;
137 ; AVX-LABEL: test6:
138 ; AVX:       # BB#0: # %entry
139 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
140 ; AVX-NEXT:    retq
141 entry:
142   %cmp = icmp ule <16 x i8> %a, %b
143   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
144   ret <16 x i8> %sel
145 }
146
147 define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) {
148 ; SSE-LABEL: test7:
149 ; SSE:       # BB#0: # %entry
150 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
151 ; SSE-NEXT:    retq
152 ;
153 ; AVX-LABEL: test7:
154 ; AVX:       # BB#0: # %entry
155 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
156 ; AVX-NEXT:    retq
157 entry:
158   %cmp = icmp ugt <16 x i8> %a, %b
159   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
160   ret <16 x i8> %sel
161 }
162
163 define <16 x i8> @test8(<16 x i8> %a, <16 x i8> %b) {
164 ; SSE-LABEL: test8:
165 ; SSE:       # BB#0: # %entry
166 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
167 ; SSE-NEXT:    retq
168 ;
169 ; AVX-LABEL: test8:
170 ; AVX:       # BB#0: # %entry
171 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
172 ; AVX-NEXT:    retq
173 entry:
174   %cmp = icmp uge <16 x i8> %a, %b
175   %sel = select <16 x i1> %cmp, <16 x i8> %a, <16 x i8> %b
176   ret <16 x i8> %sel
177 }
178
179 define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) {
180 ; SSE-LABEL: test9:
181 ; SSE:       # BB#0: # %entry
182 ; SSE-NEXT:    pminsw %xmm1, %xmm0
183 ; SSE-NEXT:    retq
184 ;
185 ; AVX-LABEL: test9:
186 ; AVX:       # BB#0: # %entry
187 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
188 ; AVX-NEXT:    retq
189 entry:
190   %cmp = icmp slt <8 x i16> %a, %b
191   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
192   ret <8 x i16> %sel
193 }
194
195 define <8 x i16> @test10(<8 x i16> %a, <8 x i16> %b) {
196 ; SSE-LABEL: test10:
197 ; SSE:       # BB#0: # %entry
198 ; SSE-NEXT:    pminsw %xmm1, %xmm0
199 ; SSE-NEXT:    retq
200 ;
201 ; AVX-LABEL: test10:
202 ; AVX:       # BB#0: # %entry
203 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
204 ; AVX-NEXT:    retq
205 entry:
206   %cmp = icmp sle <8 x i16> %a, %b
207   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
208   ret <8 x i16> %sel
209 }
210
211 define <8 x i16> @test11(<8 x i16> %a, <8 x i16> %b) {
212 ; SSE-LABEL: test11:
213 ; SSE:       # BB#0: # %entry
214 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
215 ; SSE-NEXT:    retq
216 ;
217 ; AVX-LABEL: test11:
218 ; AVX:       # BB#0: # %entry
219 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
220 ; AVX-NEXT:    retq
221 entry:
222   %cmp = icmp sgt <8 x i16> %a, %b
223   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
224   ret <8 x i16> %sel
225 }
226
227 define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) {
228 ; SSE-LABEL: test12:
229 ; SSE:       # BB#0: # %entry
230 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
231 ; SSE-NEXT:    retq
232 ;
233 ; AVX-LABEL: test12:
234 ; AVX:       # BB#0: # %entry
235 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
236 ; AVX-NEXT:    retq
237 entry:
238   %cmp = icmp sge <8 x i16> %a, %b
239   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
240   ret <8 x i16> %sel
241 }
242
243 define <8 x i16> @test13(<8 x i16> %a, <8 x i16> %b) {
244 ; SSE2-LABEL: test13:
245 ; SSE2:       # BB#0: # %entry
246 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
247 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
248 ; SSE2-NEXT:    pxor %xmm2, %xmm3
249 ; SSE2-NEXT:    pxor %xmm1, %xmm2
250 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
251 ; SSE2-NEXT:    pand %xmm2, %xmm0
252 ; SSE2-NEXT:    pandn %xmm1, %xmm2
253 ; SSE2-NEXT:    por %xmm2, %xmm0
254 ; SSE2-NEXT:    retq
255 ;
256 ; SSE4-LABEL: test13:
257 ; SSE4:       # BB#0: # %entry
258 ; SSE4-NEXT:    pminuw %xmm1, %xmm0
259 ; SSE4-NEXT:    retq
260 ;
261 ; AVX-LABEL: test13:
262 ; AVX:       # BB#0: # %entry
263 ; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
264 ; AVX-NEXT:    retq
265 entry:
266   %cmp = icmp ult <8 x i16> %a, %b
267   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
268   ret <8 x i16> %sel
269 }
270
271 define <8 x i16> @test14(<8 x i16> %a, <8 x i16> %b) {
272 ; SSE2-LABEL: test14:
273 ; SSE2:       # BB#0: # %entry
274 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
275 ; SSE2-NEXT:    psubusw %xmm1, %xmm2
276 ; SSE2-NEXT:    pxor %xmm3, %xmm3
277 ; SSE2-NEXT:    pcmpeqw %xmm2, %xmm3
278 ; SSE2-NEXT:    pand %xmm3, %xmm0
279 ; SSE2-NEXT:    pandn %xmm1, %xmm3
280 ; SSE2-NEXT:    por %xmm3, %xmm0
281 ; SSE2-NEXT:    retq
282 ;
283 ; SSE4-LABEL: test14:
284 ; SSE4:       # BB#0: # %entry
285 ; SSE4-NEXT:    pminuw %xmm1, %xmm0
286 ; SSE4-NEXT:    retq
287 ;
288 ; AVX-LABEL: test14:
289 ; AVX:       # BB#0: # %entry
290 ; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
291 ; AVX-NEXT:    retq
292 entry:
293   %cmp = icmp ule <8 x i16> %a, %b
294   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
295   ret <8 x i16> %sel
296 }
297
298 define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) {
299 ; SSE2-LABEL: test15:
300 ; SSE2:       # BB#0: # %entry
301 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
302 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
303 ; SSE2-NEXT:    pxor %xmm2, %xmm3
304 ; SSE2-NEXT:    pxor %xmm0, %xmm2
305 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
306 ; SSE2-NEXT:    pand %xmm2, %xmm0
307 ; SSE2-NEXT:    pandn %xmm1, %xmm2
308 ; SSE2-NEXT:    por %xmm2, %xmm0
309 ; SSE2-NEXT:    retq
310 ;
311 ; SSE4-LABEL: test15:
312 ; SSE4:       # BB#0: # %entry
313 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
314 ; SSE4-NEXT:    retq
315 ;
316 ; AVX-LABEL: test15:
317 ; AVX:       # BB#0: # %entry
318 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
319 ; AVX-NEXT:    retq
320 entry:
321   %cmp = icmp ugt <8 x i16> %a, %b
322   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
323   ret <8 x i16> %sel
324 }
325
326 define <8 x i16> @test16(<8 x i16> %a, <8 x i16> %b) {
327 ; SSE2-LABEL: test16:
328 ; SSE2:       # BB#0: # %entry
329 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
330 ; SSE2-NEXT:    psubusw %xmm0, %xmm2
331 ; SSE2-NEXT:    pxor %xmm3, %xmm3
332 ; SSE2-NEXT:    pcmpeqw %xmm2, %xmm3
333 ; SSE2-NEXT:    pand %xmm3, %xmm0
334 ; SSE2-NEXT:    pandn %xmm1, %xmm3
335 ; SSE2-NEXT:    por %xmm3, %xmm0
336 ; SSE2-NEXT:    retq
337 ;
338 ; SSE4-LABEL: test16:
339 ; SSE4:       # BB#0: # %entry
340 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
341 ; SSE4-NEXT:    retq
342 ;
343 ; AVX-LABEL: test16:
344 ; AVX:       # BB#0: # %entry
345 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
346 ; AVX-NEXT:    retq
347 entry:
348   %cmp = icmp uge <8 x i16> %a, %b
349   %sel = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b
350   ret <8 x i16> %sel
351 }
352
353 define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) {
354 ; SSE2-LABEL: test17:
355 ; SSE2:       # BB#0: # %entry
356 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
357 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
358 ; SSE2-NEXT:    pand %xmm2, %xmm0
359 ; SSE2-NEXT:    pandn %xmm1, %xmm2
360 ; SSE2-NEXT:    por %xmm2, %xmm0
361 ; SSE2-NEXT:    retq
362 ;
363 ; SSE4-LABEL: test17:
364 ; SSE4:       # BB#0: # %entry
365 ; SSE4-NEXT:    pminsd %xmm1, %xmm0
366 ; SSE4-NEXT:    retq
367 ;
368 ; AVX-LABEL: test17:
369 ; AVX:       # BB#0: # %entry
370 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
371 ; AVX-NEXT:    retq
372 entry:
373   %cmp = icmp slt <4 x i32> %a, %b
374   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
375   ret <4 x i32> %sel
376 }
377
378 define <4 x i32> @test18(<4 x i32> %a, <4 x i32> %b) {
379 ; SSE2-LABEL: test18:
380 ; SSE2:       # BB#0: # %entry
381 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
382 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
383 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
384 ; SSE2-NEXT:    pxor %xmm2, %xmm3
385 ; SSE2-NEXT:    pandn %xmm0, %xmm2
386 ; SSE2-NEXT:    pandn %xmm1, %xmm3
387 ; SSE2-NEXT:    por %xmm3, %xmm2
388 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
389 ; SSE2-NEXT:    retq
390 ;
391 ; SSE4-LABEL: test18:
392 ; SSE4:       # BB#0: # %entry
393 ; SSE4-NEXT:    pminsd %xmm1, %xmm0
394 ; SSE4-NEXT:    retq
395 ;
396 ; AVX-LABEL: test18:
397 ; AVX:       # BB#0: # %entry
398 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
399 ; AVX-NEXT:    retq
400 entry:
401   %cmp = icmp sle <4 x i32> %a, %b
402   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
403   ret <4 x i32> %sel
404 }
405
406 define <4 x i32> @test19(<4 x i32> %a, <4 x i32> %b) {
407 ; SSE2-LABEL: test19:
408 ; SSE2:       # BB#0: # %entry
409 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
410 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
411 ; SSE2-NEXT:    pand %xmm2, %xmm0
412 ; SSE2-NEXT:    pandn %xmm1, %xmm2
413 ; SSE2-NEXT:    por %xmm0, %xmm2
414 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
415 ; SSE2-NEXT:    retq
416 ;
417 ; SSE4-LABEL: test19:
418 ; SSE4:       # BB#0: # %entry
419 ; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
420 ; SSE4-NEXT:    retq
421 ;
422 ; AVX-LABEL: test19:
423 ; AVX:       # BB#0: # %entry
424 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
425 ; AVX-NEXT:    retq
426 entry:
427   %cmp = icmp sgt <4 x i32> %a, %b
428   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
429   ret <4 x i32> %sel
430 }
431
432 define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b) {
433 ; SSE2-LABEL: test20:
434 ; SSE2:       # BB#0: # %entry
435 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
436 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
437 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
438 ; SSE2-NEXT:    pxor %xmm3, %xmm2
439 ; SSE2-NEXT:    pandn %xmm0, %xmm3
440 ; SSE2-NEXT:    pandn %xmm1, %xmm2
441 ; SSE2-NEXT:    por %xmm3, %xmm2
442 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
443 ; SSE2-NEXT:    retq
444 ;
445 ; SSE4-LABEL: test20:
446 ; SSE4:       # BB#0: # %entry
447 ; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
448 ; SSE4-NEXT:    retq
449 ;
450 ; AVX-LABEL: test20:
451 ; AVX:       # BB#0: # %entry
452 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
453 ; AVX-NEXT:    retq
454 entry:
455   %cmp = icmp sge <4 x i32> %a, %b
456   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
457   ret <4 x i32> %sel
458 }
459
460 define <4 x i32> @test21(<4 x i32> %a, <4 x i32> %b) {
461 ; SSE2-LABEL: test21:
462 ; SSE2:       # BB#0: # %entry
463 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
464 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
465 ; SSE2-NEXT:    pxor %xmm2, %xmm3
466 ; SSE2-NEXT:    pxor %xmm1, %xmm2
467 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
468 ; SSE2-NEXT:    pand %xmm2, %xmm0
469 ; SSE2-NEXT:    pandn %xmm1, %xmm2
470 ; SSE2-NEXT:    por %xmm2, %xmm0
471 ; SSE2-NEXT:    retq
472 ;
473 ; SSE4-LABEL: test21:
474 ; SSE4:       # BB#0: # %entry
475 ; SSE4-NEXT:    pminud %xmm1, %xmm0
476 ; SSE4-NEXT:    retq
477 ;
478 ; AVX-LABEL: test21:
479 ; AVX:       # BB#0: # %entry
480 ; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
481 ; AVX-NEXT:    retq
482 entry:
483   %cmp = icmp ult <4 x i32> %a, %b
484   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
485   ret <4 x i32> %sel
486 }
487
488 define <4 x i32> @test22(<4 x i32> %a, <4 x i32> %b) {
489 ; SSE2-LABEL: test22:
490 ; SSE2:       # BB#0: # %entry
491 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
492 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
493 ; SSE2-NEXT:    pxor %xmm3, %xmm2
494 ; SSE2-NEXT:    pxor %xmm0, %xmm3
495 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
496 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
497 ; SSE2-NEXT:    pxor %xmm3, %xmm2
498 ; SSE2-NEXT:    pandn %xmm0, %xmm3
499 ; SSE2-NEXT:    pandn %xmm1, %xmm2
500 ; SSE2-NEXT:    por %xmm3, %xmm2
501 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
502 ; SSE2-NEXT:    retq
503 ;
504 ; SSE4-LABEL: test22:
505 ; SSE4:       # BB#0: # %entry
506 ; SSE4-NEXT:    pminud %xmm1, %xmm0
507 ; SSE4-NEXT:    retq
508 ;
509 ; AVX-LABEL: test22:
510 ; AVX:       # BB#0: # %entry
511 ; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
512 ; AVX-NEXT:    retq
513 entry:
514   %cmp = icmp ule <4 x i32> %a, %b
515   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
516   ret <4 x i32> %sel
517 }
518
519 define <4 x i32> @test23(<4 x i32> %a, <4 x i32> %b) {
520 ; SSE2-LABEL: test23:
521 ; SSE2:       # BB#0: # %entry
522 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
523 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
524 ; SSE2-NEXT:    pxor %xmm2, %xmm3
525 ; SSE2-NEXT:    pxor %xmm0, %xmm2
526 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
527 ; SSE2-NEXT:    pand %xmm2, %xmm0
528 ; SSE2-NEXT:    pandn %xmm1, %xmm2
529 ; SSE2-NEXT:    por %xmm2, %xmm0
530 ; SSE2-NEXT:    retq
531 ;
532 ; SSE4-LABEL: test23:
533 ; SSE4:       # BB#0: # %entry
534 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
535 ; SSE4-NEXT:    retq
536 ;
537 ; AVX-LABEL: test23:
538 ; AVX:       # BB#0: # %entry
539 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
540 ; AVX-NEXT:    retq
541 entry:
542   %cmp = icmp ugt <4 x i32> %a, %b
543   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
544   ret <4 x i32> %sel
545 }
546
547 define <4 x i32> @test24(<4 x i32> %a, <4 x i32> %b) {
548 ; SSE2-LABEL: test24:
549 ; SSE2:       # BB#0: # %entry
550 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
551 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
552 ; SSE2-NEXT:    pxor %xmm3, %xmm2
553 ; SSE2-NEXT:    pxor %xmm1, %xmm3
554 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
555 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
556 ; SSE2-NEXT:    pxor %xmm3, %xmm2
557 ; SSE2-NEXT:    pandn %xmm0, %xmm3
558 ; SSE2-NEXT:    pandn %xmm1, %xmm2
559 ; SSE2-NEXT:    por %xmm3, %xmm2
560 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
561 ; SSE2-NEXT:    retq
562 ;
563 ; SSE4-LABEL: test24:
564 ; SSE4:       # BB#0: # %entry
565 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
566 ; SSE4-NEXT:    retq
567 ;
568 ; AVX-LABEL: test24:
569 ; AVX:       # BB#0: # %entry
570 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
571 ; AVX-NEXT:    retq
572 entry:
573   %cmp = icmp uge <4 x i32> %a, %b
574   %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b
575   ret <4 x i32> %sel
576 }
577
578 define <32 x i8> @test25(<32 x i8> %a, <32 x i8> %b) {
579 ; SSE2-LABEL: test25:
580 ; SSE2:       # BB#0: # %entry
581 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
582 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm4
583 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
584 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm5
585 ; SSE2-NEXT:    pand %xmm5, %xmm0
586 ; SSE2-NEXT:    pandn %xmm2, %xmm5
587 ; SSE2-NEXT:    por %xmm5, %xmm0
588 ; SSE2-NEXT:    pand %xmm4, %xmm1
589 ; SSE2-NEXT:    pandn %xmm3, %xmm4
590 ; SSE2-NEXT:    por %xmm4, %xmm1
591 ; SSE2-NEXT:    retq
592 ;
593 ; SSE4-LABEL: test25:
594 ; SSE4:       # BB#0: # %entry
595 ; SSE4-NEXT:    pminsb %xmm2, %xmm0
596 ; SSE4-NEXT:    pminsb %xmm3, %xmm1
597 ; SSE4-NEXT:    retq
598 ;
599 ; AVX1-LABEL: test25:
600 ; AVX1:       # BB#0: # %entry
601 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
602 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
603 ; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
604 ; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
605 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
606 ; AVX1-NEXT:    retq
607 ;
608 ; AVX2-LABEL: test25:
609 ; AVX2:       # BB#0: # %entry
610 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
611 ; AVX2-NEXT:    retq
612 ;
613 ; AVX512F-LABEL: test25:
614 ; AVX512F:       # BB#0: # %entry
615 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
616 ; AVX512F-NEXT:    retq
617 entry:
618   %cmp = icmp slt <32 x i8> %a, %b
619   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
620   ret <32 x i8> %sel
621 }
622
623 define <32 x i8> @test26(<32 x i8> %a, <32 x i8> %b) {
624 ; SSE2-LABEL: test26:
625 ; SSE2:       # BB#0: # %entry
626 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
627 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm6
628 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
629 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
630 ; SSE2-NEXT:    pxor %xmm7, %xmm4
631 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
632 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5
633 ; SSE2-NEXT:    pxor %xmm5, %xmm7
634 ; SSE2-NEXT:    pandn %xmm0, %xmm5
635 ; SSE2-NEXT:    pandn %xmm2, %xmm7
636 ; SSE2-NEXT:    por %xmm7, %xmm5
637 ; SSE2-NEXT:    pandn %xmm1, %xmm6
638 ; SSE2-NEXT:    pandn %xmm3, %xmm4
639 ; SSE2-NEXT:    por %xmm6, %xmm4
640 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
641 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
642 ; SSE2-NEXT:    retq
643 ;
644 ; SSE4-LABEL: test26:
645 ; SSE4:       # BB#0: # %entry
646 ; SSE4-NEXT:    pminsb %xmm2, %xmm0
647 ; SSE4-NEXT:    pminsb %xmm3, %xmm1
648 ; SSE4-NEXT:    retq
649 ;
650 ; AVX1-LABEL: test26:
651 ; AVX1:       # BB#0: # %entry
652 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
653 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
654 ; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
655 ; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
656 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
657 ; AVX1-NEXT:    retq
658 ;
659 ; AVX2-LABEL: test26:
660 ; AVX2:       # BB#0: # %entry
661 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
662 ; AVX2-NEXT:    retq
663 ;
664 ; AVX512F-LABEL: test26:
665 ; AVX512F:       # BB#0: # %entry
666 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
667 ; AVX512F-NEXT:    retq
668 entry:
669   %cmp = icmp sle <32 x i8> %a, %b
670   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
671   ret <32 x i8> %sel
672 }
673
674 define <32 x i8> @test27(<32 x i8> %a, <32 x i8> %b) {
675 ; SSE2-LABEL: test27:
676 ; SSE2:       # BB#0: # %entry
677 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
678 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
679 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
680 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5
681 ; SSE2-NEXT:    pand %xmm5, %xmm0
682 ; SSE2-NEXT:    pandn %xmm2, %xmm5
683 ; SSE2-NEXT:    por %xmm0, %xmm5
684 ; SSE2-NEXT:    pand %xmm4, %xmm1
685 ; SSE2-NEXT:    pandn %xmm3, %xmm4
686 ; SSE2-NEXT:    por %xmm1, %xmm4
687 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
688 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
689 ; SSE2-NEXT:    retq
690 ;
691 ; SSE4-LABEL: test27:
692 ; SSE4:       # BB#0: # %entry
693 ; SSE4-NEXT:    pmaxsb %xmm2, %xmm0
694 ; SSE4-NEXT:    pmaxsb %xmm3, %xmm1
695 ; SSE4-NEXT:    retq
696 ;
697 ; AVX1-LABEL: test27:
698 ; AVX1:       # BB#0: # %entry
699 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
700 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
701 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
702 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
703 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
704 ; AVX1-NEXT:    retq
705 ;
706 ; AVX2-LABEL: test27:
707 ; AVX2:       # BB#0: # %entry
708 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
709 ; AVX2-NEXT:    retq
710 ;
711 ; AVX512F-LABEL: test27:
712 ; AVX512F:       # BB#0: # %entry
713 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
714 ; AVX512F-NEXT:    retq
715 entry:
716   %cmp = icmp sgt <32 x i8> %a, %b
717   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
718   ret <32 x i8> %sel
719 }
720
721 define <32 x i8> @test28(<32 x i8> %a, <32 x i8> %b) {
722 ; SSE2-LABEL: test28:
723 ; SSE2:       # BB#0: # %entry
724 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
725 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm6
726 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
727 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
728 ; SSE2-NEXT:    pxor %xmm4, %xmm5
729 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
730 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm7
731 ; SSE2-NEXT:    pxor %xmm7, %xmm4
732 ; SSE2-NEXT:    pandn %xmm0, %xmm7
733 ; SSE2-NEXT:    pandn %xmm2, %xmm4
734 ; SSE2-NEXT:    por %xmm7, %xmm4
735 ; SSE2-NEXT:    pandn %xmm1, %xmm6
736 ; SSE2-NEXT:    pandn %xmm3, %xmm5
737 ; SSE2-NEXT:    por %xmm6, %xmm5
738 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
739 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
740 ; SSE2-NEXT:    retq
741 ;
742 ; SSE4-LABEL: test28:
743 ; SSE4:       # BB#0: # %entry
744 ; SSE4-NEXT:    pmaxsb %xmm2, %xmm0
745 ; SSE4-NEXT:    pmaxsb %xmm3, %xmm1
746 ; SSE4-NEXT:    retq
747 ;
748 ; AVX1-LABEL: test28:
749 ; AVX1:       # BB#0: # %entry
750 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
751 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
752 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
753 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
754 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
755 ; AVX1-NEXT:    retq
756 ;
757 ; AVX2-LABEL: test28:
758 ; AVX2:       # BB#0: # %entry
759 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
760 ; AVX2-NEXT:    retq
761 ;
762 ; AVX512F-LABEL: test28:
763 ; AVX512F:       # BB#0: # %entry
764 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
765 ; AVX512F-NEXT:    retq
766 entry:
767   %cmp = icmp sge <32 x i8> %a, %b
768   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
769   ret <32 x i8> %sel
770 }
771
772 define <32 x i8> @test29(<32 x i8> %a, <32 x i8> %b) {
773 ; SSE-LABEL: test29:
774 ; SSE:       # BB#0: # %entry
775 ; SSE-NEXT:    pminub %xmm2, %xmm0
776 ; SSE-NEXT:    pminub %xmm3, %xmm1
777 ; SSE-NEXT:    retq
778 ;
779 ; AVX1-LABEL: test29:
780 ; AVX1:       # BB#0: # %entry
781 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
782 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
783 ; AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
784 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
785 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
786 ; AVX1-NEXT:    retq
787 ;
788 ; AVX2-LABEL: test29:
789 ; AVX2:       # BB#0: # %entry
790 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
791 ; AVX2-NEXT:    retq
792 ;
793 ; AVX512F-LABEL: test29:
794 ; AVX512F:       # BB#0: # %entry
795 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm0
796 ; AVX512F-NEXT:    retq
797 entry:
798   %cmp = icmp ult <32 x i8> %a, %b
799   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
800   ret <32 x i8> %sel
801 }
802
803 define <32 x i8> @test30(<32 x i8> %a, <32 x i8> %b) {
804 ; SSE-LABEL: test30:
805 ; SSE:       # BB#0: # %entry
806 ; SSE-NEXT:    pminub %xmm2, %xmm0
807 ; SSE-NEXT:    pminub %xmm3, %xmm1
808 ; SSE-NEXT:    retq
809 ;
810 ; AVX1-LABEL: test30:
811 ; AVX1:       # BB#0: # %entry
812 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
813 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
814 ; AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
815 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
816 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
817 ; AVX1-NEXT:    retq
818 ;
819 ; AVX2-LABEL: test30:
820 ; AVX2:       # BB#0: # %entry
821 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
822 ; AVX2-NEXT:    retq
823 ;
824 ; AVX512F-LABEL: test30:
825 ; AVX512F:       # BB#0: # %entry
826 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm0
827 ; AVX512F-NEXT:    retq
828 entry:
829   %cmp = icmp ule <32 x i8> %a, %b
830   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
831   ret <32 x i8> %sel
832 }
833
834 define <32 x i8> @test31(<32 x i8> %a, <32 x i8> %b) {
835 ; SSE-LABEL: test31:
836 ; SSE:       # BB#0: # %entry
837 ; SSE-NEXT:    pmaxub %xmm2, %xmm0
838 ; SSE-NEXT:    pmaxub %xmm3, %xmm1
839 ; SSE-NEXT:    retq
840 ;
841 ; AVX1-LABEL: test31:
842 ; AVX1:       # BB#0: # %entry
843 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
844 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
845 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
846 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
847 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
848 ; AVX1-NEXT:    retq
849 ;
850 ; AVX2-LABEL: test31:
851 ; AVX2:       # BB#0: # %entry
852 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
853 ; AVX2-NEXT:    retq
854 ;
855 ; AVX512F-LABEL: test31:
856 ; AVX512F:       # BB#0: # %entry
857 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
858 ; AVX512F-NEXT:    retq
859 entry:
860   %cmp = icmp ugt <32 x i8> %a, %b
861   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
862   ret <32 x i8> %sel
863 }
864
865 define <32 x i8> @test32(<32 x i8> %a, <32 x i8> %b) {
866 ; SSE-LABEL: test32:
867 ; SSE:       # BB#0: # %entry
868 ; SSE-NEXT:    pmaxub %xmm2, %xmm0
869 ; SSE-NEXT:    pmaxub %xmm3, %xmm1
870 ; SSE-NEXT:    retq
871 ;
872 ; AVX1-LABEL: test32:
873 ; AVX1:       # BB#0: # %entry
874 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
875 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
876 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
877 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
878 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
879 ; AVX1-NEXT:    retq
880 ;
881 ; AVX2-LABEL: test32:
882 ; AVX2:       # BB#0: # %entry
883 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
884 ; AVX2-NEXT:    retq
885 ;
886 ; AVX512F-LABEL: test32:
887 ; AVX512F:       # BB#0: # %entry
888 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
889 ; AVX512F-NEXT:    retq
890 entry:
891   %cmp = icmp uge <32 x i8> %a, %b
892   %sel = select <32 x i1> %cmp, <32 x i8> %a, <32 x i8> %b
893   ret <32 x i8> %sel
894 }
895
896 define <16 x i16> @test33(<16 x i16> %a, <16 x i16> %b) {
897 ; SSE-LABEL: test33:
898 ; SSE:       # BB#0: # %entry
899 ; SSE-NEXT:    pminsw %xmm2, %xmm0
900 ; SSE-NEXT:    pminsw %xmm3, %xmm1
901 ; SSE-NEXT:    retq
902 ;
903 ; AVX1-LABEL: test33:
904 ; AVX1:       # BB#0: # %entry
905 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
906 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
907 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
908 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
909 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
910 ; AVX1-NEXT:    retq
911 ;
912 ; AVX2-LABEL: test33:
913 ; AVX2:       # BB#0: # %entry
914 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
915 ; AVX2-NEXT:    retq
916 ;
917 ; AVX512F-LABEL: test33:
918 ; AVX512F:       # BB#0: # %entry
919 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
920 ; AVX512F-NEXT:    retq
921 entry:
922   %cmp = icmp slt <16 x i16> %a, %b
923   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
924   ret <16 x i16> %sel
925 }
926
927 define <16 x i16> @test34(<16 x i16> %a, <16 x i16> %b) {
928 ; SSE-LABEL: test34:
929 ; SSE:       # BB#0: # %entry
930 ; SSE-NEXT:    pminsw %xmm2, %xmm0
931 ; SSE-NEXT:    pminsw %xmm3, %xmm1
932 ; SSE-NEXT:    retq
933 ;
934 ; AVX1-LABEL: test34:
935 ; AVX1:       # BB#0: # %entry
936 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
937 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
938 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
939 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
940 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
941 ; AVX1-NEXT:    retq
942 ;
943 ; AVX2-LABEL: test34:
944 ; AVX2:       # BB#0: # %entry
945 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
946 ; AVX2-NEXT:    retq
947 ;
948 ; AVX512F-LABEL: test34:
949 ; AVX512F:       # BB#0: # %entry
950 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
951 ; AVX512F-NEXT:    retq
952 entry:
953   %cmp = icmp sle <16 x i16> %a, %b
954   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
955   ret <16 x i16> %sel
956 }
957
958 define <16 x i16> @test35(<16 x i16> %a, <16 x i16> %b) {
959 ; SSE-LABEL: test35:
960 ; SSE:       # BB#0: # %entry
961 ; SSE-NEXT:    pmaxsw %xmm2, %xmm0
962 ; SSE-NEXT:    pmaxsw %xmm3, %xmm1
963 ; SSE-NEXT:    retq
964 ;
965 ; AVX1-LABEL: test35:
966 ; AVX1:       # BB#0: # %entry
967 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
968 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
969 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
970 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
971 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
972 ; AVX1-NEXT:    retq
973 ;
974 ; AVX2-LABEL: test35:
975 ; AVX2:       # BB#0: # %entry
976 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
977 ; AVX2-NEXT:    retq
978 ;
979 ; AVX512F-LABEL: test35:
980 ; AVX512F:       # BB#0: # %entry
981 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
982 ; AVX512F-NEXT:    retq
983 entry:
984   %cmp = icmp sgt <16 x i16> %a, %b
985   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
986   ret <16 x i16> %sel
987 }
988
989 define <16 x i16> @test36(<16 x i16> %a, <16 x i16> %b) {
990 ; SSE-LABEL: test36:
991 ; SSE:       # BB#0: # %entry
992 ; SSE-NEXT:    pmaxsw %xmm2, %xmm0
993 ; SSE-NEXT:    pmaxsw %xmm3, %xmm1
994 ; SSE-NEXT:    retq
995 ;
996 ; AVX1-LABEL: test36:
997 ; AVX1:       # BB#0: # %entry
998 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
999 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1000 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1001 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1002 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1003 ; AVX1-NEXT:    retq
1004 ;
1005 ; AVX2-LABEL: test36:
1006 ; AVX2:       # BB#0: # %entry
1007 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1008 ; AVX2-NEXT:    retq
1009 ;
1010 ; AVX512F-LABEL: test36:
1011 ; AVX512F:       # BB#0: # %entry
1012 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1013 ; AVX512F-NEXT:    retq
1014 entry:
1015   %cmp = icmp sge <16 x i16> %a, %b
1016   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
1017   ret <16 x i16> %sel
1018 }
1019
1020 define <16 x i16> @test37(<16 x i16> %a, <16 x i16> %b) {
1021 ; SSE2-LABEL: test37:
1022 ; SSE2:       # BB#0: # %entry
1023 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1024 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
1025 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1026 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1027 ; SSE2-NEXT:    pxor %xmm4, %xmm6
1028 ; SSE2-NEXT:    pcmpgtw %xmm5, %xmm6
1029 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1030 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1031 ; SSE2-NEXT:    pxor %xmm2, %xmm4
1032 ; SSE2-NEXT:    pcmpgtw %xmm5, %xmm4
1033 ; SSE2-NEXT:    pand %xmm4, %xmm0
1034 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1035 ; SSE2-NEXT:    por %xmm4, %xmm0
1036 ; SSE2-NEXT:    pand %xmm6, %xmm1
1037 ; SSE2-NEXT:    pandn %xmm3, %xmm6
1038 ; SSE2-NEXT:    por %xmm6, %xmm1
1039 ; SSE2-NEXT:    retq
1040 ;
1041 ; SSE4-LABEL: test37:
1042 ; SSE4:       # BB#0: # %entry
1043 ; SSE4-NEXT:    pminuw %xmm2, %xmm0
1044 ; SSE4-NEXT:    pminuw %xmm3, %xmm1
1045 ; SSE4-NEXT:    retq
1046 ;
1047 ; AVX1-LABEL: test37:
1048 ; AVX1:       # BB#0: # %entry
1049 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1050 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1051 ; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1052 ; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1053 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1054 ; AVX1-NEXT:    retq
1055 ;
1056 ; AVX2-LABEL: test37:
1057 ; AVX2:       # BB#0: # %entry
1058 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1059 ; AVX2-NEXT:    retq
1060 ;
1061 ; AVX512F-LABEL: test37:
1062 ; AVX512F:       # BB#0: # %entry
1063 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1064 ; AVX512F-NEXT:    retq
1065 entry:
1066   %cmp = icmp ult <16 x i16> %a, %b
1067   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
1068   ret <16 x i16> %sel
1069 }
1070
1071 define <16 x i16> @test38(<16 x i16> %a, <16 x i16> %b) {
1072 ; SSE2-LABEL: test38:
1073 ; SSE2:       # BB#0: # %entry
1074 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1075 ; SSE2-NEXT:    psubusw %xmm3, %xmm4
1076 ; SSE2-NEXT:    pxor %xmm6, %xmm6
1077 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm4
1078 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1079 ; SSE2-NEXT:    psubusw %xmm2, %xmm5
1080 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm5
1081 ; SSE2-NEXT:    pand %xmm5, %xmm0
1082 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1083 ; SSE2-NEXT:    por %xmm0, %xmm5
1084 ; SSE2-NEXT:    pand %xmm4, %xmm1
1085 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1086 ; SSE2-NEXT:    por %xmm1, %xmm4
1087 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1088 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1089 ; SSE2-NEXT:    retq
1090 ;
1091 ; SSE4-LABEL: test38:
1092 ; SSE4:       # BB#0: # %entry
1093 ; SSE4-NEXT:    pminuw %xmm2, %xmm0
1094 ; SSE4-NEXT:    pminuw %xmm3, %xmm1
1095 ; SSE4-NEXT:    retq
1096 ;
1097 ; AVX1-LABEL: test38:
1098 ; AVX1:       # BB#0: # %entry
1099 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1100 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1101 ; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1102 ; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1103 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1104 ; AVX1-NEXT:    retq
1105 ;
1106 ; AVX2-LABEL: test38:
1107 ; AVX2:       # BB#0: # %entry
1108 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1109 ; AVX2-NEXT:    retq
1110 ;
1111 ; AVX512F-LABEL: test38:
1112 ; AVX512F:       # BB#0: # %entry
1113 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1114 ; AVX512F-NEXT:    retq
1115 entry:
1116   %cmp = icmp ule <16 x i16> %a, %b
1117   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
1118   ret <16 x i16> %sel
1119 }
1120
1121 define <16 x i16> @test39(<16 x i16> %a, <16 x i16> %b) {
1122 ; SSE2-LABEL: test39:
1123 ; SSE2:       # BB#0: # %entry
1124 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768]
1125 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1126 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1127 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1128 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1129 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm4
1130 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1131 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1132 ; SSE2-NEXT:    pxor %xmm0, %xmm5
1133 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm5
1134 ; SSE2-NEXT:    pand %xmm5, %xmm0
1135 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1136 ; SSE2-NEXT:    por %xmm5, %xmm0
1137 ; SSE2-NEXT:    pand %xmm4, %xmm1
1138 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1139 ; SSE2-NEXT:    por %xmm1, %xmm4
1140 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1141 ; SSE2-NEXT:    retq
1142 ;
1143 ; SSE4-LABEL: test39:
1144 ; SSE4:       # BB#0: # %entry
1145 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1146 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1147 ; SSE4-NEXT:    retq
1148 ;
1149 ; AVX1-LABEL: test39:
1150 ; AVX1:       # BB#0: # %entry
1151 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1152 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1153 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1154 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1155 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1156 ; AVX1-NEXT:    retq
1157 ;
1158 ; AVX2-LABEL: test39:
1159 ; AVX2:       # BB#0: # %entry
1160 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1161 ; AVX2-NEXT:    retq
1162 ;
1163 ; AVX512F-LABEL: test39:
1164 ; AVX512F:       # BB#0: # %entry
1165 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1166 ; AVX512F-NEXT:    retq
1167 entry:
1168   %cmp = icmp ugt <16 x i16> %a, %b
1169   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
1170   ret <16 x i16> %sel
1171 }
1172
1173 define <16 x i16> @test40(<16 x i16> %a, <16 x i16> %b) {
1174 ; SSE2-LABEL: test40:
1175 ; SSE2:       # BB#0: # %entry
1176 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1177 ; SSE2-NEXT:    psubusw %xmm1, %xmm4
1178 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1179 ; SSE2-NEXT:    pcmpeqw %xmm5, %xmm4
1180 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1181 ; SSE2-NEXT:    psubusw %xmm0, %xmm6
1182 ; SSE2-NEXT:    pcmpeqw %xmm5, %xmm6
1183 ; SSE2-NEXT:    pand %xmm6, %xmm0
1184 ; SSE2-NEXT:    pandn %xmm2, %xmm6
1185 ; SSE2-NEXT:    por %xmm6, %xmm0
1186 ; SSE2-NEXT:    pand %xmm4, %xmm1
1187 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1188 ; SSE2-NEXT:    por %xmm4, %xmm1
1189 ; SSE2-NEXT:    retq
1190 ;
1191 ; SSE4-LABEL: test40:
1192 ; SSE4:       # BB#0: # %entry
1193 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1194 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1195 ; SSE4-NEXT:    retq
1196 ;
1197 ; AVX1-LABEL: test40:
1198 ; AVX1:       # BB#0: # %entry
1199 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1200 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1201 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1202 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1203 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1204 ; AVX1-NEXT:    retq
1205 ;
1206 ; AVX2-LABEL: test40:
1207 ; AVX2:       # BB#0: # %entry
1208 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1209 ; AVX2-NEXT:    retq
1210 ;
1211 ; AVX512F-LABEL: test40:
1212 ; AVX512F:       # BB#0: # %entry
1213 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1214 ; AVX512F-NEXT:    retq
1215 entry:
1216   %cmp = icmp uge <16 x i16> %a, %b
1217   %sel = select <16 x i1> %cmp, <16 x i16> %a, <16 x i16> %b
1218   ret <16 x i16> %sel
1219 }
1220
1221 define <8 x i32> @test41(<8 x i32> %a, <8 x i32> %b) {
1222 ; SSE2-LABEL: test41:
1223 ; SSE2:       # BB#0: # %entry
1224 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1225 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1226 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1227 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
1228 ; SSE2-NEXT:    pand %xmm5, %xmm0
1229 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1230 ; SSE2-NEXT:    por %xmm5, %xmm0
1231 ; SSE2-NEXT:    pand %xmm4, %xmm1
1232 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1233 ; SSE2-NEXT:    por %xmm4, %xmm1
1234 ; SSE2-NEXT:    retq
1235 ;
1236 ; SSE4-LABEL: test41:
1237 ; SSE4:       # BB#0: # %entry
1238 ; SSE4-NEXT:    pminsd %xmm2, %xmm0
1239 ; SSE4-NEXT:    pminsd %xmm3, %xmm1
1240 ; SSE4-NEXT:    retq
1241 ;
1242 ; AVX1-LABEL: test41:
1243 ; AVX1:       # BB#0: # %entry
1244 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1245 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1246 ; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
1247 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
1248 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1249 ; AVX1-NEXT:    retq
1250 ;
1251 ; AVX2-LABEL: test41:
1252 ; AVX2:       # BB#0: # %entry
1253 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1254 ; AVX2-NEXT:    retq
1255 ;
1256 ; AVX512F-LABEL: test41:
1257 ; AVX512F:       # BB#0: # %entry
1258 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1259 ; AVX512F-NEXT:    retq
1260 entry:
1261   %cmp = icmp slt <8 x i32> %a, %b
1262   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1263   ret <8 x i32> %sel
1264 }
1265
1266 define <8 x i32> @test42(<8 x i32> %a, <8 x i32> %b) {
1267 ; SSE2-LABEL: test42:
1268 ; SSE2:       # BB#0: # %entry
1269 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1270 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
1271 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
1272 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1273 ; SSE2-NEXT:    pxor %xmm7, %xmm4
1274 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1275 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1276 ; SSE2-NEXT:    pxor %xmm5, %xmm7
1277 ; SSE2-NEXT:    pandn %xmm0, %xmm5
1278 ; SSE2-NEXT:    pandn %xmm2, %xmm7
1279 ; SSE2-NEXT:    por %xmm7, %xmm5
1280 ; SSE2-NEXT:    pandn %xmm1, %xmm6
1281 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1282 ; SSE2-NEXT:    por %xmm6, %xmm4
1283 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1284 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1285 ; SSE2-NEXT:    retq
1286 ;
1287 ; SSE4-LABEL: test42:
1288 ; SSE4:       # BB#0: # %entry
1289 ; SSE4-NEXT:    pminsd %xmm2, %xmm0
1290 ; SSE4-NEXT:    pminsd %xmm3, %xmm1
1291 ; SSE4-NEXT:    retq
1292 ;
1293 ; AVX1-LABEL: test42:
1294 ; AVX1:       # BB#0: # %entry
1295 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1296 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1297 ; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
1298 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
1299 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1300 ; AVX1-NEXT:    retq
1301 ;
1302 ; AVX2-LABEL: test42:
1303 ; AVX2:       # BB#0: # %entry
1304 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1305 ; AVX2-NEXT:    retq
1306 ;
1307 ; AVX512F-LABEL: test42:
1308 ; AVX512F:       # BB#0: # %entry
1309 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1310 ; AVX512F-NEXT:    retq
1311 entry:
1312   %cmp = icmp sle <8 x i32> %a, %b
1313   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1314   ret <8 x i32> %sel
1315 }
1316
1317 define <8 x i32> @test43(<8 x i32> %a, <8 x i32> %b) {
1318 ; SSE2-LABEL: test43:
1319 ; SSE2:       # BB#0: # %entry
1320 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1321 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1322 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1323 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1324 ; SSE2-NEXT:    pand %xmm5, %xmm0
1325 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1326 ; SSE2-NEXT:    por %xmm0, %xmm5
1327 ; SSE2-NEXT:    pand %xmm4, %xmm1
1328 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1329 ; SSE2-NEXT:    por %xmm1, %xmm4
1330 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1331 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1332 ; SSE2-NEXT:    retq
1333 ;
1334 ; SSE4-LABEL: test43:
1335 ; SSE4:       # BB#0: # %entry
1336 ; SSE4-NEXT:    pmaxsd %xmm2, %xmm0
1337 ; SSE4-NEXT:    pmaxsd %xmm3, %xmm1
1338 ; SSE4-NEXT:    retq
1339 ;
1340 ; AVX1-LABEL: test43:
1341 ; AVX1:       # BB#0: # %entry
1342 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1343 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1344 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
1345 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1346 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1347 ; AVX1-NEXT:    retq
1348 ;
1349 ; AVX2-LABEL: test43:
1350 ; AVX2:       # BB#0: # %entry
1351 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1352 ; AVX2-NEXT:    retq
1353 ;
1354 ; AVX512F-LABEL: test43:
1355 ; AVX512F:       # BB#0: # %entry
1356 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1357 ; AVX512F-NEXT:    retq
1358 entry:
1359   %cmp = icmp sgt <8 x i32> %a, %b
1360   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1361   ret <8 x i32> %sel
1362 }
1363
1364 define <8 x i32> @test44(<8 x i32> %a, <8 x i32> %b) {
1365 ; SSE2-LABEL: test44:
1366 ; SSE2:       # BB#0: # %entry
1367 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1368 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1369 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1370 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
1371 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1372 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
1373 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
1374 ; SSE2-NEXT:    pxor %xmm7, %xmm4
1375 ; SSE2-NEXT:    pandn %xmm0, %xmm7
1376 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1377 ; SSE2-NEXT:    por %xmm7, %xmm4
1378 ; SSE2-NEXT:    pandn %xmm1, %xmm6
1379 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1380 ; SSE2-NEXT:    por %xmm6, %xmm5
1381 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1382 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1383 ; SSE2-NEXT:    retq
1384 ;
1385 ; SSE4-LABEL: test44:
1386 ; SSE4:       # BB#0: # %entry
1387 ; SSE4-NEXT:    pmaxsd %xmm2, %xmm0
1388 ; SSE4-NEXT:    pmaxsd %xmm3, %xmm1
1389 ; SSE4-NEXT:    retq
1390 ;
1391 ; AVX1-LABEL: test44:
1392 ; AVX1:       # BB#0: # %entry
1393 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1394 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1395 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
1396 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1397 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1398 ; AVX1-NEXT:    retq
1399 ;
1400 ; AVX2-LABEL: test44:
1401 ; AVX2:       # BB#0: # %entry
1402 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1403 ; AVX2-NEXT:    retq
1404 ;
1405 ; AVX512F-LABEL: test44:
1406 ; AVX512F:       # BB#0: # %entry
1407 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1408 ; AVX512F-NEXT:    retq
1409 entry:
1410   %cmp = icmp sge <8 x i32> %a, %b
1411   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1412   ret <8 x i32> %sel
1413 }
1414
1415 define <8 x i32> @test45(<8 x i32> %a, <8 x i32> %b) {
1416 ; SSE2-LABEL: test45:
1417 ; SSE2:       # BB#0: # %entry
1418 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1419 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
1420 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1421 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1422 ; SSE2-NEXT:    pxor %xmm4, %xmm6
1423 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1424 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1425 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1426 ; SSE2-NEXT:    pxor %xmm2, %xmm4
1427 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
1428 ; SSE2-NEXT:    pand %xmm4, %xmm0
1429 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1430 ; SSE2-NEXT:    por %xmm4, %xmm0
1431 ; SSE2-NEXT:    pand %xmm6, %xmm1
1432 ; SSE2-NEXT:    pandn %xmm3, %xmm6
1433 ; SSE2-NEXT:    por %xmm6, %xmm1
1434 ; SSE2-NEXT:    retq
1435 ;
1436 ; SSE4-LABEL: test45:
1437 ; SSE4:       # BB#0: # %entry
1438 ; SSE4-NEXT:    pminud %xmm2, %xmm0
1439 ; SSE4-NEXT:    pminud %xmm3, %xmm1
1440 ; SSE4-NEXT:    retq
1441 ;
1442 ; AVX1-LABEL: test45:
1443 ; AVX1:       # BB#0: # %entry
1444 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1445 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1446 ; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1447 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1448 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1449 ; AVX1-NEXT:    retq
1450 ;
1451 ; AVX2-LABEL: test45:
1452 ; AVX2:       # BB#0: # %entry
1453 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1454 ; AVX2-NEXT:    retq
1455 ;
1456 ; AVX512F-LABEL: test45:
1457 ; AVX512F:       # BB#0: # %entry
1458 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1459 ; AVX512F-NEXT:    retq
1460 entry:
1461   %cmp = icmp ult <8 x i32> %a, %b
1462   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1463   ret <8 x i32> %sel
1464 }
1465
1466 define <8 x i32> @test46(<8 x i32> %a, <8 x i32> %b) {
1467 ; SSE2-LABEL: test46:
1468 ; SSE2:       # BB#0: # %entry
1469 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1470 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1471 ; SSE2-NEXT:    pxor %xmm6, %xmm4
1472 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
1473 ; SSE2-NEXT:    pxor %xmm6, %xmm7
1474 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
1475 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1476 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
1477 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1478 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
1479 ; SSE2-NEXT:    pxor %xmm6, %xmm8
1480 ; SSE2-NEXT:    pxor %xmm0, %xmm6
1481 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
1482 ; SSE2-NEXT:    pxor %xmm6, %xmm4
1483 ; SSE2-NEXT:    pandn %xmm0, %xmm6
1484 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1485 ; SSE2-NEXT:    por %xmm6, %xmm4
1486 ; SSE2-NEXT:    pandn %xmm1, %xmm7
1487 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1488 ; SSE2-NEXT:    por %xmm7, %xmm5
1489 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1490 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1491 ; SSE2-NEXT:    retq
1492 ;
1493 ; SSE4-LABEL: test46:
1494 ; SSE4:       # BB#0: # %entry
1495 ; SSE4-NEXT:    pminud %xmm2, %xmm0
1496 ; SSE4-NEXT:    pminud %xmm3, %xmm1
1497 ; SSE4-NEXT:    retq
1498 ;
1499 ; AVX1-LABEL: test46:
1500 ; AVX1:       # BB#0: # %entry
1501 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1502 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1503 ; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1504 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1505 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1506 ; AVX1-NEXT:    retq
1507 ;
1508 ; AVX2-LABEL: test46:
1509 ; AVX2:       # BB#0: # %entry
1510 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1511 ; AVX2-NEXT:    retq
1512 ;
1513 ; AVX512F-LABEL: test46:
1514 ; AVX512F:       # BB#0: # %entry
1515 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1516 ; AVX512F-NEXT:    retq
1517 entry:
1518   %cmp = icmp ule <8 x i32> %a, %b
1519   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1520   ret <8 x i32> %sel
1521 }
1522
1523 define <8 x i32> @test47(<8 x i32> %a, <8 x i32> %b) {
1524 ; SSE2-LABEL: test47:
1525 ; SSE2:       # BB#0: # %entry
1526 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
1527 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1528 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1529 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1530 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1531 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
1532 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1533 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1534 ; SSE2-NEXT:    pxor %xmm0, %xmm5
1535 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1536 ; SSE2-NEXT:    pand %xmm5, %xmm0
1537 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1538 ; SSE2-NEXT:    por %xmm5, %xmm0
1539 ; SSE2-NEXT:    pand %xmm4, %xmm1
1540 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1541 ; SSE2-NEXT:    por %xmm1, %xmm4
1542 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1543 ; SSE2-NEXT:    retq
1544 ;
1545 ; SSE4-LABEL: test47:
1546 ; SSE4:       # BB#0: # %entry
1547 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1548 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1549 ; SSE4-NEXT:    retq
1550 ;
1551 ; AVX1-LABEL: test47:
1552 ; AVX1:       # BB#0: # %entry
1553 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1554 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1555 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
1556 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1557 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1558 ; AVX1-NEXT:    retq
1559 ;
1560 ; AVX2-LABEL: test47:
1561 ; AVX2:       # BB#0: # %entry
1562 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1563 ; AVX2-NEXT:    retq
1564 ;
1565 ; AVX512F-LABEL: test47:
1566 ; AVX512F:       # BB#0: # %entry
1567 ; AVX512F-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1568 ; AVX512F-NEXT:    retq
1569 entry:
1570   %cmp = icmp ugt <8 x i32> %a, %b
1571   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1572   ret <8 x i32> %sel
1573 }
1574
1575 define <8 x i32> @test48(<8 x i32> %a, <8 x i32> %b) {
1576 ; SSE2-LABEL: test48:
1577 ; SSE2:       # BB#0: # %entry
1578 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1579 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1580 ; SSE2-NEXT:    pxor %xmm6, %xmm4
1581 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
1582 ; SSE2-NEXT:    pxor %xmm6, %xmm7
1583 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
1584 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1585 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
1586 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1587 ; SSE2-NEXT:    movdqa %xmm0, %xmm8
1588 ; SSE2-NEXT:    pxor %xmm6, %xmm8
1589 ; SSE2-NEXT:    pxor %xmm2, %xmm6
1590 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
1591 ; SSE2-NEXT:    pxor %xmm6, %xmm4
1592 ; SSE2-NEXT:    pandn %xmm0, %xmm6
1593 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1594 ; SSE2-NEXT:    por %xmm6, %xmm4
1595 ; SSE2-NEXT:    pandn %xmm1, %xmm7
1596 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1597 ; SSE2-NEXT:    por %xmm7, %xmm5
1598 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1599 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1600 ; SSE2-NEXT:    retq
1601 ;
1602 ; SSE4-LABEL: test48:
1603 ; SSE4:       # BB#0: # %entry
1604 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1605 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1606 ; SSE4-NEXT:    retq
1607 ;
1608 ; AVX1-LABEL: test48:
1609 ; AVX1:       # BB#0: # %entry
1610 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1611 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1612 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
1613 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1614 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1615 ; AVX1-NEXT:    retq
1616 ;
1617 ; AVX2-LABEL: test48:
1618 ; AVX2:       # BB#0: # %entry
1619 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1620 ; AVX2-NEXT:    retq
1621 ;
1622 ; AVX512F-LABEL: test48:
1623 ; AVX512F:       # BB#0: # %entry
1624 ; AVX512F-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1625 ; AVX512F-NEXT:    retq
1626 entry:
1627   %cmp = icmp uge <8 x i32> %a, %b
1628   %sel = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b
1629   ret <8 x i32> %sel
1630 }
1631
1632 define <16 x i8> @test49(<16 x i8> %a, <16 x i8> %b) {
1633 ; SSE2-LABEL: test49:
1634 ; SSE2:       # BB#0: # %entry
1635 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1636 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1637 ; SSE2-NEXT:    pand %xmm2, %xmm1
1638 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1639 ; SSE2-NEXT:    por %xmm1, %xmm2
1640 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1641 ; SSE2-NEXT:    retq
1642 ;
1643 ; SSE4-LABEL: test49:
1644 ; SSE4:       # BB#0: # %entry
1645 ; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
1646 ; SSE4-NEXT:    retq
1647 ;
1648 ; AVX-LABEL: test49:
1649 ; AVX:       # BB#0: # %entry
1650 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1651 ; AVX-NEXT:    retq
1652 entry:
1653   %cmp = icmp slt <16 x i8> %a, %b
1654   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1655   ret <16 x i8> %sel
1656 }
1657
1658 define <16 x i8> @test50(<16 x i8> %a, <16 x i8> %b) {
1659 ; SSE2-LABEL: test50:
1660 ; SSE2:       # BB#0: # %entry
1661 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1662 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1663 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1664 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1665 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1666 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1667 ; SSE2-NEXT:    por %xmm3, %xmm2
1668 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1669 ; SSE2-NEXT:    retq
1670 ;
1671 ; SSE4-LABEL: test50:
1672 ; SSE4:       # BB#0: # %entry
1673 ; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
1674 ; SSE4-NEXT:    retq
1675 ;
1676 ; AVX-LABEL: test50:
1677 ; AVX:       # BB#0: # %entry
1678 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1679 ; AVX-NEXT:    retq
1680 entry:
1681   %cmp = icmp sle <16 x i8> %a, %b
1682   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1683   ret <16 x i8> %sel
1684 }
1685
1686 define <16 x i8> @test51(<16 x i8> %a, <16 x i8> %b) {
1687 ; SSE2-LABEL: test51:
1688 ; SSE2:       # BB#0: # %entry
1689 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1690 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1691 ; SSE2-NEXT:    pand %xmm2, %xmm1
1692 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1693 ; SSE2-NEXT:    por %xmm1, %xmm2
1694 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1695 ; SSE2-NEXT:    retq
1696 ;
1697 ; SSE4-LABEL: test51:
1698 ; SSE4:       # BB#0: # %entry
1699 ; SSE4-NEXT:    pminsb %xmm1, %xmm0
1700 ; SSE4-NEXT:    retq
1701 ;
1702 ; AVX-LABEL: test51:
1703 ; AVX:       # BB#0: # %entry
1704 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1705 ; AVX-NEXT:    retq
1706 entry:
1707   %cmp = icmp sgt <16 x i8> %a, %b
1708   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1709   ret <16 x i8> %sel
1710 }
1711
1712 define <16 x i8> @test52(<16 x i8> %a, <16 x i8> %b) {
1713 ; SSE2-LABEL: test52:
1714 ; SSE2:       # BB#0: # %entry
1715 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1716 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
1717 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
1718 ; SSE2-NEXT:    pxor %xmm3, %xmm2
1719 ; SSE2-NEXT:    pandn %xmm1, %xmm3
1720 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1721 ; SSE2-NEXT:    por %xmm3, %xmm2
1722 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1723 ; SSE2-NEXT:    retq
1724 ;
1725 ; SSE4-LABEL: test52:
1726 ; SSE4:       # BB#0: # %entry
1727 ; SSE4-NEXT:    pminsb %xmm1, %xmm0
1728 ; SSE4-NEXT:    retq
1729 ;
1730 ; AVX-LABEL: test52:
1731 ; AVX:       # BB#0: # %entry
1732 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1733 ; AVX-NEXT:    retq
1734 entry:
1735   %cmp = icmp sge <16 x i8> %a, %b
1736   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1737   ret <16 x i8> %sel
1738 }
1739
1740 define <16 x i8> @test53(<16 x i8> %a, <16 x i8> %b) {
1741 ; SSE-LABEL: test53:
1742 ; SSE:       # BB#0: # %entry
1743 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
1744 ; SSE-NEXT:    retq
1745 ;
1746 ; AVX-LABEL: test53:
1747 ; AVX:       # BB#0: # %entry
1748 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1749 ; AVX-NEXT:    retq
1750 entry:
1751   %cmp = icmp ult <16 x i8> %a, %b
1752   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1753   ret <16 x i8> %sel
1754 }
1755
1756 define <16 x i8> @test54(<16 x i8> %a, <16 x i8> %b) {
1757 ; SSE-LABEL: test54:
1758 ; SSE:       # BB#0: # %entry
1759 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
1760 ; SSE-NEXT:    retq
1761 ;
1762 ; AVX-LABEL: test54:
1763 ; AVX:       # BB#0: # %entry
1764 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1765 ; AVX-NEXT:    retq
1766 entry:
1767   %cmp = icmp ule <16 x i8> %a, %b
1768   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1769   ret <16 x i8> %sel
1770 }
1771
1772 define <16 x i8> @test55(<16 x i8> %a, <16 x i8> %b) {
1773 ; SSE-LABEL: test55:
1774 ; SSE:       # BB#0: # %entry
1775 ; SSE-NEXT:    pminub %xmm1, %xmm0
1776 ; SSE-NEXT:    retq
1777 ;
1778 ; AVX-LABEL: test55:
1779 ; AVX:       # BB#0: # %entry
1780 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1781 ; AVX-NEXT:    retq
1782 entry:
1783   %cmp = icmp ugt <16 x i8> %a, %b
1784   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1785   ret <16 x i8> %sel
1786 }
1787
1788 define <16 x i8> @test56(<16 x i8> %a, <16 x i8> %b) {
1789 ; SSE-LABEL: test56:
1790 ; SSE:       # BB#0: # %entry
1791 ; SSE-NEXT:    pminub %xmm1, %xmm0
1792 ; SSE-NEXT:    retq
1793 ;
1794 ; AVX-LABEL: test56:
1795 ; AVX:       # BB#0: # %entry
1796 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1797 ; AVX-NEXT:    retq
1798 entry:
1799   %cmp = icmp uge <16 x i8> %a, %b
1800   %sel = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %a
1801   ret <16 x i8> %sel
1802 }
1803
1804 define <8 x i16> @test57(<8 x i16> %a, <8 x i16> %b) {
1805 ; SSE-LABEL: test57:
1806 ; SSE:       # BB#0: # %entry
1807 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
1808 ; SSE-NEXT:    retq
1809 ;
1810 ; AVX-LABEL: test57:
1811 ; AVX:       # BB#0: # %entry
1812 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1813 ; AVX-NEXT:    retq
1814 entry:
1815   %cmp = icmp slt <8 x i16> %a, %b
1816   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1817   ret <8 x i16> %sel
1818 }
1819
1820 define <8 x i16> @test58(<8 x i16> %a, <8 x i16> %b) {
1821 ; SSE-LABEL: test58:
1822 ; SSE:       # BB#0: # %entry
1823 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
1824 ; SSE-NEXT:    retq
1825 ;
1826 ; AVX-LABEL: test58:
1827 ; AVX:       # BB#0: # %entry
1828 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1829 ; AVX-NEXT:    retq
1830 entry:
1831   %cmp = icmp sle <8 x i16> %a, %b
1832   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1833   ret <8 x i16> %sel
1834 }
1835
1836 define <8 x i16> @test59(<8 x i16> %a, <8 x i16> %b) {
1837 ; SSE-LABEL: test59:
1838 ; SSE:       # BB#0: # %entry
1839 ; SSE-NEXT:    pminsw %xmm1, %xmm0
1840 ; SSE-NEXT:    retq
1841 ;
1842 ; AVX-LABEL: test59:
1843 ; AVX:       # BB#0: # %entry
1844 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1845 ; AVX-NEXT:    retq
1846 entry:
1847   %cmp = icmp sgt <8 x i16> %a, %b
1848   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1849   ret <8 x i16> %sel
1850 }
1851
1852 define <8 x i16> @test60(<8 x i16> %a, <8 x i16> %b) {
1853 ; SSE-LABEL: test60:
1854 ; SSE:       # BB#0: # %entry
1855 ; SSE-NEXT:    pminsw %xmm1, %xmm0
1856 ; SSE-NEXT:    retq
1857 ;
1858 ; AVX-LABEL: test60:
1859 ; AVX:       # BB#0: # %entry
1860 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1861 ; AVX-NEXT:    retq
1862 entry:
1863   %cmp = icmp sge <8 x i16> %a, %b
1864   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1865   ret <8 x i16> %sel
1866 }
1867
1868 define <8 x i16> @test61(<8 x i16> %a, <8 x i16> %b) {
1869 ; SSE2-LABEL: test61:
1870 ; SSE2:       # BB#0: # %entry
1871 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1872 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1873 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1874 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1875 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
1876 ; SSE2-NEXT:    pand %xmm2, %xmm1
1877 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1878 ; SSE2-NEXT:    por %xmm1, %xmm2
1879 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1880 ; SSE2-NEXT:    retq
1881 ;
1882 ; SSE4-LABEL: test61:
1883 ; SSE4:       # BB#0: # %entry
1884 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1885 ; SSE4-NEXT:    retq
1886 ;
1887 ; AVX-LABEL: test61:
1888 ; AVX:       # BB#0: # %entry
1889 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1890 ; AVX-NEXT:    retq
1891 entry:
1892   %cmp = icmp ult <8 x i16> %a, %b
1893   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1894   ret <8 x i16> %sel
1895 }
1896
1897 define <8 x i16> @test62(<8 x i16> %a, <8 x i16> %b) {
1898 ; SSE2-LABEL: test62:
1899 ; SSE2:       # BB#0: # %entry
1900 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1901 ; SSE2-NEXT:    psubusw %xmm1, %xmm3
1902 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1903 ; SSE2-NEXT:    pcmpeqw %xmm3, %xmm2
1904 ; SSE2-NEXT:    pand %xmm2, %xmm1
1905 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1906 ; SSE2-NEXT:    por %xmm1, %xmm2
1907 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1908 ; SSE2-NEXT:    retq
1909 ;
1910 ; SSE4-LABEL: test62:
1911 ; SSE4:       # BB#0: # %entry
1912 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1913 ; SSE4-NEXT:    retq
1914 ;
1915 ; AVX-LABEL: test62:
1916 ; AVX:       # BB#0: # %entry
1917 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1918 ; AVX-NEXT:    retq
1919 entry:
1920   %cmp = icmp ule <8 x i16> %a, %b
1921   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1922   ret <8 x i16> %sel
1923 }
1924
1925 define <8 x i16> @test63(<8 x i16> %a, <8 x i16> %b) {
1926 ; SSE2-LABEL: test63:
1927 ; SSE2:       # BB#0: # %entry
1928 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1929 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1930 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1931 ; SSE2-NEXT:    pxor %xmm0, %xmm2
1932 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
1933 ; SSE2-NEXT:    pand %xmm2, %xmm1
1934 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1935 ; SSE2-NEXT:    por %xmm1, %xmm2
1936 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1937 ; SSE2-NEXT:    retq
1938 ;
1939 ; SSE4-LABEL: test63:
1940 ; SSE4:       # BB#0: # %entry
1941 ; SSE4-NEXT:    pminuw %xmm1, %xmm0
1942 ; SSE4-NEXT:    retq
1943 ;
1944 ; AVX-LABEL: test63:
1945 ; AVX:       # BB#0: # %entry
1946 ; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1947 ; AVX-NEXT:    retq
1948 entry:
1949   %cmp = icmp ugt <8 x i16> %a, %b
1950   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1951   ret <8 x i16> %sel
1952 }
1953
1954 define <8 x i16> @test64(<8 x i16> %a, <8 x i16> %b) {
1955 ; SSE2-LABEL: test64:
1956 ; SSE2:       # BB#0: # %entry
1957 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1958 ; SSE2-NEXT:    psubusw %xmm0, %xmm3
1959 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1960 ; SSE2-NEXT:    pcmpeqw %xmm3, %xmm2
1961 ; SSE2-NEXT:    pand %xmm2, %xmm1
1962 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1963 ; SSE2-NEXT:    por %xmm1, %xmm2
1964 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1965 ; SSE2-NEXT:    retq
1966 ;
1967 ; SSE4-LABEL: test64:
1968 ; SSE4:       # BB#0: # %entry
1969 ; SSE4-NEXT:    pminuw %xmm1, %xmm0
1970 ; SSE4-NEXT:    retq
1971 ;
1972 ; AVX-LABEL: test64:
1973 ; AVX:       # BB#0: # %entry
1974 ; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1975 ; AVX-NEXT:    retq
1976 entry:
1977   %cmp = icmp uge <8 x i16> %a, %b
1978   %sel = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %a
1979   ret <8 x i16> %sel
1980 }
1981
1982 define <4 x i32> @test65(<4 x i32> %a, <4 x i32> %b) {
1983 ; SSE2-LABEL: test65:
1984 ; SSE2:       # BB#0: # %entry
1985 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1986 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1987 ; SSE2-NEXT:    pand %xmm2, %xmm1
1988 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1989 ; SSE2-NEXT:    por %xmm1, %xmm2
1990 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1991 ; SSE2-NEXT:    retq
1992 ;
1993 ; SSE4-LABEL: test65:
1994 ; SSE4:       # BB#0: # %entry
1995 ; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
1996 ; SSE4-NEXT:    retq
1997 ;
1998 ; AVX-LABEL: test65:
1999 ; AVX:       # BB#0: # %entry
2000 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
2001 ; AVX-NEXT:    retq
2002 entry:
2003   %cmp = icmp slt <4 x i32> %a, %b
2004   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2005   ret <4 x i32> %sel
2006 }
2007
2008 define <4 x i32> @test66(<4 x i32> %a, <4 x i32> %b) {
2009 ; SSE2-LABEL: test66:
2010 ; SSE2:       # BB#0: # %entry
2011 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2012 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2013 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
2014 ; SSE2-NEXT:    pxor %xmm2, %xmm3
2015 ; SSE2-NEXT:    pandn %xmm1, %xmm2
2016 ; SSE2-NEXT:    pandn %xmm0, %xmm3
2017 ; SSE2-NEXT:    por %xmm3, %xmm2
2018 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2019 ; SSE2-NEXT:    retq
2020 ;
2021 ; SSE4-LABEL: test66:
2022 ; SSE4:       # BB#0: # %entry
2023 ; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
2024 ; SSE4-NEXT:    retq
2025 ;
2026 ; AVX-LABEL: test66:
2027 ; AVX:       # BB#0: # %entry
2028 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
2029 ; AVX-NEXT:    retq
2030 entry:
2031   %cmp = icmp sle <4 x i32> %a, %b
2032   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2033   ret <4 x i32> %sel
2034 }
2035
2036 define <4 x i32> @test67(<4 x i32> %a, <4 x i32> %b) {
2037 ; SSE2-LABEL: test67:
2038 ; SSE2:       # BB#0: # %entry
2039 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2040 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2041 ; SSE2-NEXT:    pand %xmm2, %xmm1
2042 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2043 ; SSE2-NEXT:    por %xmm1, %xmm2
2044 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2045 ; SSE2-NEXT:    retq
2046 ;
2047 ; SSE4-LABEL: test67:
2048 ; SSE4:       # BB#0: # %entry
2049 ; SSE4-NEXT:    pminsd %xmm1, %xmm0
2050 ; SSE4-NEXT:    retq
2051 ;
2052 ; AVX-LABEL: test67:
2053 ; AVX:       # BB#0: # %entry
2054 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
2055 ; AVX-NEXT:    retq
2056 entry:
2057   %cmp = icmp sgt <4 x i32> %a, %b
2058   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2059   ret <4 x i32> %sel
2060 }
2061
2062 define <4 x i32> @test68(<4 x i32> %a, <4 x i32> %b) {
2063 ; SSE2-LABEL: test68:
2064 ; SSE2:       # BB#0: # %entry
2065 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2066 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2067 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
2068 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2069 ; SSE2-NEXT:    pandn %xmm1, %xmm3
2070 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2071 ; SSE2-NEXT:    por %xmm3, %xmm2
2072 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2073 ; SSE2-NEXT:    retq
2074 ;
2075 ; SSE4-LABEL: test68:
2076 ; SSE4:       # BB#0: # %entry
2077 ; SSE4-NEXT:    pminsd %xmm1, %xmm0
2078 ; SSE4-NEXT:    retq
2079 ;
2080 ; AVX-LABEL: test68:
2081 ; AVX:       # BB#0: # %entry
2082 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
2083 ; AVX-NEXT:    retq
2084 entry:
2085   %cmp = icmp sge <4 x i32> %a, %b
2086   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2087   ret <4 x i32> %sel
2088 }
2089
2090 define <4 x i32> @test69(<4 x i32> %a, <4 x i32> %b) {
2091 ; SSE2-LABEL: test69:
2092 ; SSE2:       # BB#0: # %entry
2093 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
2094 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2095 ; SSE2-NEXT:    pxor %xmm2, %xmm3
2096 ; SSE2-NEXT:    pxor %xmm1, %xmm2
2097 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
2098 ; SSE2-NEXT:    pand %xmm2, %xmm1
2099 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2100 ; SSE2-NEXT:    por %xmm1, %xmm2
2101 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2102 ; SSE2-NEXT:    retq
2103 ;
2104 ; SSE4-LABEL: test69:
2105 ; SSE4:       # BB#0: # %entry
2106 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
2107 ; SSE4-NEXT:    retq
2108 ;
2109 ; AVX-LABEL: test69:
2110 ; AVX:       # BB#0: # %entry
2111 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
2112 ; AVX-NEXT:    retq
2113 entry:
2114   %cmp = icmp ult <4 x i32> %a, %b
2115   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2116   ret <4 x i32> %sel
2117 }
2118
2119 define <4 x i32> @test70(<4 x i32> %a, <4 x i32> %b) {
2120 ; SSE2-LABEL: test70:
2121 ; SSE2:       # BB#0: # %entry
2122 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2123 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2124 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2125 ; SSE2-NEXT:    pxor %xmm0, %xmm3
2126 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
2127 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
2128 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2129 ; SSE2-NEXT:    pandn %xmm1, %xmm3
2130 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2131 ; SSE2-NEXT:    por %xmm3, %xmm2
2132 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2133 ; SSE2-NEXT:    retq
2134 ;
2135 ; SSE4-LABEL: test70:
2136 ; SSE4:       # BB#0: # %entry
2137 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
2138 ; SSE4-NEXT:    retq
2139 ;
2140 ; AVX-LABEL: test70:
2141 ; AVX:       # BB#0: # %entry
2142 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
2143 ; AVX-NEXT:    retq
2144 entry:
2145   %cmp = icmp ule <4 x i32> %a, %b
2146   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2147   ret <4 x i32> %sel
2148 }
2149
2150 define <4 x i32> @test71(<4 x i32> %a, <4 x i32> %b) {
2151 ; SSE2-LABEL: test71:
2152 ; SSE2:       # BB#0: # %entry
2153 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
2154 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2155 ; SSE2-NEXT:    pxor %xmm2, %xmm3
2156 ; SSE2-NEXT:    pxor %xmm0, %xmm2
2157 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
2158 ; SSE2-NEXT:    pand %xmm2, %xmm1
2159 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2160 ; SSE2-NEXT:    por %xmm1, %xmm2
2161 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2162 ; SSE2-NEXT:    retq
2163 ;
2164 ; SSE4-LABEL: test71:
2165 ; SSE4:       # BB#0: # %entry
2166 ; SSE4-NEXT:    pminud %xmm1, %xmm0
2167 ; SSE4-NEXT:    retq
2168 ;
2169 ; AVX-LABEL: test71:
2170 ; AVX:       # BB#0: # %entry
2171 ; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
2172 ; AVX-NEXT:    retq
2173 entry:
2174   %cmp = icmp ugt <4 x i32> %a, %b
2175   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2176   ret <4 x i32> %sel
2177 }
2178
2179 define <4 x i32> @test72(<4 x i32> %a, <4 x i32> %b) {
2180 ; SSE2-LABEL: test72:
2181 ; SSE2:       # BB#0: # %entry
2182 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2183 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2184 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2185 ; SSE2-NEXT:    pxor %xmm1, %xmm3
2186 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
2187 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
2188 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2189 ; SSE2-NEXT:    pandn %xmm1, %xmm3
2190 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2191 ; SSE2-NEXT:    por %xmm3, %xmm2
2192 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2193 ; SSE2-NEXT:    retq
2194 ;
2195 ; SSE4-LABEL: test72:
2196 ; SSE4:       # BB#0: # %entry
2197 ; SSE4-NEXT:    pminud %xmm1, %xmm0
2198 ; SSE4-NEXT:    retq
2199 ;
2200 ; AVX-LABEL: test72:
2201 ; AVX:       # BB#0: # %entry
2202 ; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
2203 ; AVX-NEXT:    retq
2204 entry:
2205   %cmp = icmp uge <4 x i32> %a, %b
2206   %sel = select <4 x i1> %cmp, <4 x i32> %b, <4 x i32> %a
2207   ret <4 x i32> %sel
2208 }
2209
2210 define <32 x i8> @test73(<32 x i8> %a, <32 x i8> %b) {
2211 ; SSE2-LABEL: test73:
2212 ; SSE2:       # BB#0: # %entry
2213 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2214 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm4
2215 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2216 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm5
2217 ; SSE2-NEXT:    pand %xmm5, %xmm2
2218 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2219 ; SSE2-NEXT:    por %xmm2, %xmm5
2220 ; SSE2-NEXT:    pand %xmm4, %xmm3
2221 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2222 ; SSE2-NEXT:    por %xmm3, %xmm4
2223 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2224 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2225 ; SSE2-NEXT:    retq
2226 ;
2227 ; SSE4-LABEL: test73:
2228 ; SSE4:       # BB#0: # %entry
2229 ; SSE4-NEXT:    pmaxsb %xmm2, %xmm0
2230 ; SSE4-NEXT:    pmaxsb %xmm3, %xmm1
2231 ; SSE4-NEXT:    retq
2232 ;
2233 ; AVX1-LABEL: test73:
2234 ; AVX1:       # BB#0: # %entry
2235 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2236 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2237 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2238 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
2239 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2240 ; AVX1-NEXT:    retq
2241 ;
2242 ; AVX2-LABEL: test73:
2243 ; AVX2:       # BB#0: # %entry
2244 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2245 ; AVX2-NEXT:    retq
2246 ;
2247 ; AVX512F-LABEL: test73:
2248 ; AVX512F:       # BB#0: # %entry
2249 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2250 ; AVX512F-NEXT:    retq
2251 entry:
2252   %cmp = icmp slt <32 x i8> %a, %b
2253   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2254   ret <32 x i8> %sel
2255 }
2256
2257 define <32 x i8> @test74(<32 x i8> %a, <32 x i8> %b) {
2258 ; SSE2-LABEL: test74:
2259 ; SSE2:       # BB#0: # %entry
2260 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
2261 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm6
2262 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
2263 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
2264 ; SSE2-NEXT:    pxor %xmm7, %xmm4
2265 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2266 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5
2267 ; SSE2-NEXT:    pxor %xmm5, %xmm7
2268 ; SSE2-NEXT:    pandn %xmm2, %xmm5
2269 ; SSE2-NEXT:    pandn %xmm0, %xmm7
2270 ; SSE2-NEXT:    por %xmm7, %xmm5
2271 ; SSE2-NEXT:    pandn %xmm3, %xmm6
2272 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2273 ; SSE2-NEXT:    por %xmm6, %xmm4
2274 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2275 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2276 ; SSE2-NEXT:    retq
2277 ;
2278 ; SSE4-LABEL: test74:
2279 ; SSE4:       # BB#0: # %entry
2280 ; SSE4-NEXT:    pmaxsb %xmm2, %xmm0
2281 ; SSE4-NEXT:    pmaxsb %xmm3, %xmm1
2282 ; SSE4-NEXT:    retq
2283 ;
2284 ; AVX1-LABEL: test74:
2285 ; AVX1:       # BB#0: # %entry
2286 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2287 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2288 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2289 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
2290 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2291 ; AVX1-NEXT:    retq
2292 ;
2293 ; AVX2-LABEL: test74:
2294 ; AVX2:       # BB#0: # %entry
2295 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2296 ; AVX2-NEXT:    retq
2297 ;
2298 ; AVX512F-LABEL: test74:
2299 ; AVX512F:       # BB#0: # %entry
2300 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2301 ; AVX512F-NEXT:    retq
2302 entry:
2303   %cmp = icmp sle <32 x i8> %a, %b
2304   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2305   ret <32 x i8> %sel
2306 }
2307
2308 define <32 x i8> @test75(<32 x i8> %a, <32 x i8> %b) {
2309 ; SSE2-LABEL: test75:
2310 ; SSE2:       # BB#0: # %entry
2311 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2312 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
2313 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2314 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5
2315 ; SSE2-NEXT:    pand %xmm5, %xmm2
2316 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2317 ; SSE2-NEXT:    por %xmm2, %xmm5
2318 ; SSE2-NEXT:    pand %xmm4, %xmm3
2319 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2320 ; SSE2-NEXT:    por %xmm3, %xmm4
2321 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2322 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2323 ; SSE2-NEXT:    retq
2324 ;
2325 ; SSE4-LABEL: test75:
2326 ; SSE4:       # BB#0: # %entry
2327 ; SSE4-NEXT:    pminsb %xmm2, %xmm0
2328 ; SSE4-NEXT:    pminsb %xmm3, %xmm1
2329 ; SSE4-NEXT:    retq
2330 ;
2331 ; AVX1-LABEL: test75:
2332 ; AVX1:       # BB#0: # %entry
2333 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2334 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2335 ; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
2336 ; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
2337 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2338 ; AVX1-NEXT:    retq
2339 ;
2340 ; AVX2-LABEL: test75:
2341 ; AVX2:       # BB#0: # %entry
2342 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
2343 ; AVX2-NEXT:    retq
2344 ;
2345 ; AVX512F-LABEL: test75:
2346 ; AVX512F:       # BB#0: # %entry
2347 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
2348 ; AVX512F-NEXT:    retq
2349 entry:
2350   %cmp = icmp sgt <32 x i8> %a, %b
2351   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2352   ret <32 x i8> %sel
2353 }
2354
2355 define <32 x i8> @test76(<32 x i8> %a, <32 x i8> %b) {
2356 ; SSE2-LABEL: test76:
2357 ; SSE2:       # BB#0: # %entry
2358 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
2359 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm6
2360 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
2361 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
2362 ; SSE2-NEXT:    pxor %xmm4, %xmm5
2363 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
2364 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm7
2365 ; SSE2-NEXT:    pxor %xmm7, %xmm4
2366 ; SSE2-NEXT:    pandn %xmm2, %xmm7
2367 ; SSE2-NEXT:    pandn %xmm0, %xmm4
2368 ; SSE2-NEXT:    por %xmm7, %xmm4
2369 ; SSE2-NEXT:    pandn %xmm3, %xmm6
2370 ; SSE2-NEXT:    pandn %xmm1, %xmm5
2371 ; SSE2-NEXT:    por %xmm6, %xmm5
2372 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2373 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
2374 ; SSE2-NEXT:    retq
2375 ;
2376 ; SSE4-LABEL: test76:
2377 ; SSE4:       # BB#0: # %entry
2378 ; SSE4-NEXT:    pminsb %xmm2, %xmm0
2379 ; SSE4-NEXT:    pminsb %xmm3, %xmm1
2380 ; SSE4-NEXT:    retq
2381 ;
2382 ; AVX1-LABEL: test76:
2383 ; AVX1:       # BB#0: # %entry
2384 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2385 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2386 ; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
2387 ; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
2388 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2389 ; AVX1-NEXT:    retq
2390 ;
2391 ; AVX2-LABEL: test76:
2392 ; AVX2:       # BB#0: # %entry
2393 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
2394 ; AVX2-NEXT:    retq
2395 ;
2396 ; AVX512F-LABEL: test76:
2397 ; AVX512F:       # BB#0: # %entry
2398 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
2399 ; AVX512F-NEXT:    retq
2400 entry:
2401   %cmp = icmp sge <32 x i8> %a, %b
2402   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2403   ret <32 x i8> %sel
2404 }
2405
2406 define <32 x i8> @test77(<32 x i8> %a, <32 x i8> %b) {
2407 ; SSE-LABEL: test77:
2408 ; SSE:       # BB#0: # %entry
2409 ; SSE-NEXT:    pmaxub %xmm2, %xmm0
2410 ; SSE-NEXT:    pmaxub %xmm3, %xmm1
2411 ; SSE-NEXT:    retq
2412 ;
2413 ; AVX1-LABEL: test77:
2414 ; AVX1:       # BB#0: # %entry
2415 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2416 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2417 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2418 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2419 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2420 ; AVX1-NEXT:    retq
2421 ;
2422 ; AVX2-LABEL: test77:
2423 ; AVX2:       # BB#0: # %entry
2424 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2425 ; AVX2-NEXT:    retq
2426 ;
2427 ; AVX512F-LABEL: test77:
2428 ; AVX512F:       # BB#0: # %entry
2429 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2430 ; AVX512F-NEXT:    retq
2431 entry:
2432   %cmp = icmp ult <32 x i8> %a, %b
2433   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2434   ret <32 x i8> %sel
2435 }
2436
2437 define <32 x i8> @test78(<32 x i8> %a, <32 x i8> %b) {
2438 ; SSE-LABEL: test78:
2439 ; SSE:       # BB#0: # %entry
2440 ; SSE-NEXT:    pmaxub %xmm2, %xmm0
2441 ; SSE-NEXT:    pmaxub %xmm3, %xmm1
2442 ; SSE-NEXT:    retq
2443 ;
2444 ; AVX1-LABEL: test78:
2445 ; AVX1:       # BB#0: # %entry
2446 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2447 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2448 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2449 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2450 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2451 ; AVX1-NEXT:    retq
2452 ;
2453 ; AVX2-LABEL: test78:
2454 ; AVX2:       # BB#0: # %entry
2455 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2456 ; AVX2-NEXT:    retq
2457 ;
2458 ; AVX512F-LABEL: test78:
2459 ; AVX512F:       # BB#0: # %entry
2460 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2461 ; AVX512F-NEXT:    retq
2462 entry:
2463   %cmp = icmp ule <32 x i8> %a, %b
2464   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2465   ret <32 x i8> %sel
2466 }
2467
2468 define <32 x i8> @test79(<32 x i8> %a, <32 x i8> %b) {
2469 ; SSE-LABEL: test79:
2470 ; SSE:       # BB#0: # %entry
2471 ; SSE-NEXT:    pminub %xmm2, %xmm0
2472 ; SSE-NEXT:    pminub %xmm3, %xmm1
2473 ; SSE-NEXT:    retq
2474 ;
2475 ; AVX1-LABEL: test79:
2476 ; AVX1:       # BB#0: # %entry
2477 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2478 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2479 ; AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
2480 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2481 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2482 ; AVX1-NEXT:    retq
2483 ;
2484 ; AVX2-LABEL: test79:
2485 ; AVX2:       # BB#0: # %entry
2486 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2487 ; AVX2-NEXT:    retq
2488 ;
2489 ; AVX512F-LABEL: test79:
2490 ; AVX512F:       # BB#0: # %entry
2491 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2492 ; AVX512F-NEXT:    retq
2493 entry:
2494   %cmp = icmp ugt <32 x i8> %a, %b
2495   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2496   ret <32 x i8> %sel
2497 }
2498
2499 define <32 x i8> @test80(<32 x i8> %a, <32 x i8> %b) {
2500 ; SSE-LABEL: test80:
2501 ; SSE:       # BB#0: # %entry
2502 ; SSE-NEXT:    pminub %xmm2, %xmm0
2503 ; SSE-NEXT:    pminub %xmm3, %xmm1
2504 ; SSE-NEXT:    retq
2505 ;
2506 ; AVX1-LABEL: test80:
2507 ; AVX1:       # BB#0: # %entry
2508 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2509 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2510 ; AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
2511 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2512 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2513 ; AVX1-NEXT:    retq
2514 ;
2515 ; AVX2-LABEL: test80:
2516 ; AVX2:       # BB#0: # %entry
2517 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2518 ; AVX2-NEXT:    retq
2519 ;
2520 ; AVX512F-LABEL: test80:
2521 ; AVX512F:       # BB#0: # %entry
2522 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2523 ; AVX512F-NEXT:    retq
2524 entry:
2525   %cmp = icmp uge <32 x i8> %a, %b
2526   %sel = select <32 x i1> %cmp, <32 x i8> %b, <32 x i8> %a
2527   ret <32 x i8> %sel
2528 }
2529
2530 define <16 x i16> @test81(<16 x i16> %a, <16 x i16> %b) {
2531 ; SSE-LABEL: test81:
2532 ; SSE:       # BB#0: # %entry
2533 ; SSE-NEXT:    pmaxsw %xmm2, %xmm0
2534 ; SSE-NEXT:    pmaxsw %xmm3, %xmm1
2535 ; SSE-NEXT:    retq
2536 ;
2537 ; AVX1-LABEL: test81:
2538 ; AVX1:       # BB#0: # %entry
2539 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2540 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2541 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
2542 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
2543 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2544 ; AVX1-NEXT:    retq
2545 ;
2546 ; AVX2-LABEL: test81:
2547 ; AVX2:       # BB#0: # %entry
2548 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
2549 ; AVX2-NEXT:    retq
2550 ;
2551 ; AVX512F-LABEL: test81:
2552 ; AVX512F:       # BB#0: # %entry
2553 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
2554 ; AVX512F-NEXT:    retq
2555 entry:
2556   %cmp = icmp slt <16 x i16> %a, %b
2557   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2558   ret <16 x i16> %sel
2559 }
2560
2561 define <16 x i16> @test82(<16 x i16> %a, <16 x i16> %b) {
2562 ; SSE-LABEL: test82:
2563 ; SSE:       # BB#0: # %entry
2564 ; SSE-NEXT:    pmaxsw %xmm2, %xmm0
2565 ; SSE-NEXT:    pmaxsw %xmm3, %xmm1
2566 ; SSE-NEXT:    retq
2567 ;
2568 ; AVX1-LABEL: test82:
2569 ; AVX1:       # BB#0: # %entry
2570 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2571 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2572 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
2573 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
2574 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2575 ; AVX1-NEXT:    retq
2576 ;
2577 ; AVX2-LABEL: test82:
2578 ; AVX2:       # BB#0: # %entry
2579 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
2580 ; AVX2-NEXT:    retq
2581 ;
2582 ; AVX512F-LABEL: test82:
2583 ; AVX512F:       # BB#0: # %entry
2584 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
2585 ; AVX512F-NEXT:    retq
2586 entry:
2587   %cmp = icmp sle <16 x i16> %a, %b
2588   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2589   ret <16 x i16> %sel
2590 }
2591
2592 define <16 x i16> @test83(<16 x i16> %a, <16 x i16> %b) {
2593 ; SSE-LABEL: test83:
2594 ; SSE:       # BB#0: # %entry
2595 ; SSE-NEXT:    pminsw %xmm2, %xmm0
2596 ; SSE-NEXT:    pminsw %xmm3, %xmm1
2597 ; SSE-NEXT:    retq
2598 ;
2599 ; AVX1-LABEL: test83:
2600 ; AVX1:       # BB#0: # %entry
2601 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2602 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2603 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
2604 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
2605 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2606 ; AVX1-NEXT:    retq
2607 ;
2608 ; AVX2-LABEL: test83:
2609 ; AVX2:       # BB#0: # %entry
2610 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
2611 ; AVX2-NEXT:    retq
2612 ;
2613 ; AVX512F-LABEL: test83:
2614 ; AVX512F:       # BB#0: # %entry
2615 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
2616 ; AVX512F-NEXT:    retq
2617 entry:
2618   %cmp = icmp sgt <16 x i16> %a, %b
2619   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2620   ret <16 x i16> %sel
2621 }
2622
2623 define <16 x i16> @test84(<16 x i16> %a, <16 x i16> %b) {
2624 ; SSE-LABEL: test84:
2625 ; SSE:       # BB#0: # %entry
2626 ; SSE-NEXT:    pminsw %xmm2, %xmm0
2627 ; SSE-NEXT:    pminsw %xmm3, %xmm1
2628 ; SSE-NEXT:    retq
2629 ;
2630 ; AVX1-LABEL: test84:
2631 ; AVX1:       # BB#0: # %entry
2632 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2633 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2634 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
2635 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
2636 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2637 ; AVX1-NEXT:    retq
2638 ;
2639 ; AVX2-LABEL: test84:
2640 ; AVX2:       # BB#0: # %entry
2641 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
2642 ; AVX2-NEXT:    retq
2643 ;
2644 ; AVX512F-LABEL: test84:
2645 ; AVX512F:       # BB#0: # %entry
2646 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
2647 ; AVX512F-NEXT:    retq
2648 entry:
2649   %cmp = icmp sge <16 x i16> %a, %b
2650   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2651   ret <16 x i16> %sel
2652 }
2653
2654 define <16 x i16> @test85(<16 x i16> %a, <16 x i16> %b) {
2655 ; SSE2-LABEL: test85:
2656 ; SSE2:       # BB#0: # %entry
2657 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2658 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
2659 ; SSE2-NEXT:    pxor %xmm4, %xmm6
2660 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
2661 ; SSE2-NEXT:    pxor %xmm4, %xmm5
2662 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm5
2663 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
2664 ; SSE2-NEXT:    pxor %xmm4, %xmm6
2665 ; SSE2-NEXT:    pxor %xmm2, %xmm4
2666 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm4
2667 ; SSE2-NEXT:    pand %xmm4, %xmm2
2668 ; SSE2-NEXT:    pandn %xmm0, %xmm4
2669 ; SSE2-NEXT:    por %xmm2, %xmm4
2670 ; SSE2-NEXT:    pand %xmm5, %xmm3
2671 ; SSE2-NEXT:    pandn %xmm1, %xmm5
2672 ; SSE2-NEXT:    por %xmm3, %xmm5
2673 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2674 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
2675 ; SSE2-NEXT:    retq
2676 ;
2677 ; SSE4-LABEL: test85:
2678 ; SSE4:       # BB#0: # %entry
2679 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
2680 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
2681 ; SSE4-NEXT:    retq
2682 ;
2683 ; AVX1-LABEL: test85:
2684 ; AVX1:       # BB#0: # %entry
2685 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2686 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2687 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
2688 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
2689 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2690 ; AVX1-NEXT:    retq
2691 ;
2692 ; AVX2-LABEL: test85:
2693 ; AVX2:       # BB#0: # %entry
2694 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
2695 ; AVX2-NEXT:    retq
2696 ;
2697 ; AVX512F-LABEL: test85:
2698 ; AVX512F:       # BB#0: # %entry
2699 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
2700 ; AVX512F-NEXT:    retq
2701 entry:
2702   %cmp = icmp ult <16 x i16> %a, %b
2703   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2704   ret <16 x i16> %sel
2705 }
2706
2707 define <16 x i16> @test86(<16 x i16> %a, <16 x i16> %b) {
2708 ; SSE2-LABEL: test86:
2709 ; SSE2:       # BB#0: # %entry
2710 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2711 ; SSE2-NEXT:    psubusw %xmm3, %xmm4
2712 ; SSE2-NEXT:    pxor %xmm6, %xmm6
2713 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm4
2714 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2715 ; SSE2-NEXT:    psubusw %xmm2, %xmm5
2716 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm5
2717 ; SSE2-NEXT:    pand %xmm5, %xmm2
2718 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2719 ; SSE2-NEXT:    por %xmm2, %xmm5
2720 ; SSE2-NEXT:    pand %xmm4, %xmm3
2721 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2722 ; SSE2-NEXT:    por %xmm3, %xmm4
2723 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2724 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2725 ; SSE2-NEXT:    retq
2726 ;
2727 ; SSE4-LABEL: test86:
2728 ; SSE4:       # BB#0: # %entry
2729 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
2730 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
2731 ; SSE4-NEXT:    retq
2732 ;
2733 ; AVX1-LABEL: test86:
2734 ; AVX1:       # BB#0: # %entry
2735 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2736 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2737 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
2738 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
2739 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2740 ; AVX1-NEXT:    retq
2741 ;
2742 ; AVX2-LABEL: test86:
2743 ; AVX2:       # BB#0: # %entry
2744 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
2745 ; AVX2-NEXT:    retq
2746 ;
2747 ; AVX512F-LABEL: test86:
2748 ; AVX512F:       # BB#0: # %entry
2749 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
2750 ; AVX512F-NEXT:    retq
2751 entry:
2752   %cmp = icmp ule <16 x i16> %a, %b
2753   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2754   ret <16 x i16> %sel
2755 }
2756
2757 define <16 x i16> @test87(<16 x i16> %a, <16 x i16> %b) {
2758 ; SSE2-LABEL: test87:
2759 ; SSE2:       # BB#0: # %entry
2760 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2761 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
2762 ; SSE2-NEXT:    pxor %xmm4, %xmm6
2763 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
2764 ; SSE2-NEXT:    pxor %xmm4, %xmm5
2765 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm5
2766 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
2767 ; SSE2-NEXT:    pxor %xmm4, %xmm6
2768 ; SSE2-NEXT:    pxor %xmm0, %xmm4
2769 ; SSE2-NEXT:    pcmpgtw %xmm6, %xmm4
2770 ; SSE2-NEXT:    pand %xmm4, %xmm2
2771 ; SSE2-NEXT:    pandn %xmm0, %xmm4
2772 ; SSE2-NEXT:    por %xmm2, %xmm4
2773 ; SSE2-NEXT:    pand %xmm5, %xmm3
2774 ; SSE2-NEXT:    pandn %xmm1, %xmm5
2775 ; SSE2-NEXT:    por %xmm3, %xmm5
2776 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2777 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
2778 ; SSE2-NEXT:    retq
2779 ;
2780 ; SSE4-LABEL: test87:
2781 ; SSE4:       # BB#0: # %entry
2782 ; SSE4-NEXT:    pminuw %xmm2, %xmm0
2783 ; SSE4-NEXT:    pminuw %xmm3, %xmm1
2784 ; SSE4-NEXT:    retq
2785 ;
2786 ; AVX1-LABEL: test87:
2787 ; AVX1:       # BB#0: # %entry
2788 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2789 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2790 ; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
2791 ; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
2792 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2793 ; AVX1-NEXT:    retq
2794 ;
2795 ; AVX2-LABEL: test87:
2796 ; AVX2:       # BB#0: # %entry
2797 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
2798 ; AVX2-NEXT:    retq
2799 ;
2800 ; AVX512F-LABEL: test87:
2801 ; AVX512F:       # BB#0: # %entry
2802 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
2803 ; AVX512F-NEXT:    retq
2804 entry:
2805   %cmp = icmp ugt <16 x i16> %a, %b
2806   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2807   ret <16 x i16> %sel
2808 }
2809
2810 define <16 x i16> @test88(<16 x i16> %a, <16 x i16> %b) {
2811 ; SSE2-LABEL: test88:
2812 ; SSE2:       # BB#0: # %entry
2813 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2814 ; SSE2-NEXT:    psubusw %xmm1, %xmm4
2815 ; SSE2-NEXT:    pxor %xmm6, %xmm6
2816 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm4
2817 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2818 ; SSE2-NEXT:    psubusw %xmm0, %xmm5
2819 ; SSE2-NEXT:    pcmpeqw %xmm6, %xmm5
2820 ; SSE2-NEXT:    pand %xmm5, %xmm2
2821 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2822 ; SSE2-NEXT:    por %xmm2, %xmm5
2823 ; SSE2-NEXT:    pand %xmm4, %xmm3
2824 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2825 ; SSE2-NEXT:    por %xmm3, %xmm4
2826 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2827 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2828 ; SSE2-NEXT:    retq
2829 ;
2830 ; SSE4-LABEL: test88:
2831 ; SSE4:       # BB#0: # %entry
2832 ; SSE4-NEXT:    pminuw %xmm2, %xmm0
2833 ; SSE4-NEXT:    pminuw %xmm3, %xmm1
2834 ; SSE4-NEXT:    retq
2835 ;
2836 ; AVX1-LABEL: test88:
2837 ; AVX1:       # BB#0: # %entry
2838 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2839 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2840 ; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
2841 ; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
2842 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2843 ; AVX1-NEXT:    retq
2844 ;
2845 ; AVX2-LABEL: test88:
2846 ; AVX2:       # BB#0: # %entry
2847 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
2848 ; AVX2-NEXT:    retq
2849 ;
2850 ; AVX512F-LABEL: test88:
2851 ; AVX512F:       # BB#0: # %entry
2852 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
2853 ; AVX512F-NEXT:    retq
2854 entry:
2855   %cmp = icmp uge <16 x i16> %a, %b
2856   %sel = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %a
2857   ret <16 x i16> %sel
2858 }
2859
2860 define <8 x i32> @test89(<8 x i32> %a, <8 x i32> %b) {
2861 ; SSE2-LABEL: test89:
2862 ; SSE2:       # BB#0: # %entry
2863 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2864 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
2865 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2866 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
2867 ; SSE2-NEXT:    pand %xmm5, %xmm2
2868 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2869 ; SSE2-NEXT:    por %xmm2, %xmm5
2870 ; SSE2-NEXT:    pand %xmm4, %xmm3
2871 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2872 ; SSE2-NEXT:    por %xmm3, %xmm4
2873 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2874 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2875 ; SSE2-NEXT:    retq
2876 ;
2877 ; SSE4-LABEL: test89:
2878 ; SSE4:       # BB#0: # %entry
2879 ; SSE4-NEXT:    pmaxsd %xmm2, %xmm0
2880 ; SSE4-NEXT:    pmaxsd %xmm3, %xmm1
2881 ; SSE4-NEXT:    retq
2882 ;
2883 ; AVX1-LABEL: test89:
2884 ; AVX1:       # BB#0: # %entry
2885 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2886 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2887 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
2888 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
2889 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2890 ; AVX1-NEXT:    retq
2891 ;
2892 ; AVX2-LABEL: test89:
2893 ; AVX2:       # BB#0: # %entry
2894 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2895 ; AVX2-NEXT:    retq
2896 ;
2897 ; AVX512F-LABEL: test89:
2898 ; AVX512F:       # BB#0: # %entry
2899 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2900 ; AVX512F-NEXT:    retq
2901 entry:
2902   %cmp = icmp slt <8 x i32> %a, %b
2903   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
2904   ret <8 x i32> %sel
2905 }
2906
2907 define <8 x i32> @test90(<8 x i32> %a, <8 x i32> %b) {
2908 ; SSE2-LABEL: test90:
2909 ; SSE2:       # BB#0: # %entry
2910 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
2911 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
2912 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
2913 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
2914 ; SSE2-NEXT:    pxor %xmm7, %xmm4
2915 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2916 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
2917 ; SSE2-NEXT:    pxor %xmm5, %xmm7
2918 ; SSE2-NEXT:    pandn %xmm2, %xmm5
2919 ; SSE2-NEXT:    pandn %xmm0, %xmm7
2920 ; SSE2-NEXT:    por %xmm7, %xmm5
2921 ; SSE2-NEXT:    pandn %xmm3, %xmm6
2922 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2923 ; SSE2-NEXT:    por %xmm6, %xmm4
2924 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2925 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2926 ; SSE2-NEXT:    retq
2927 ;
2928 ; SSE4-LABEL: test90:
2929 ; SSE4:       # BB#0: # %entry
2930 ; SSE4-NEXT:    pmaxsd %xmm2, %xmm0
2931 ; SSE4-NEXT:    pmaxsd %xmm3, %xmm1
2932 ; SSE4-NEXT:    retq
2933 ;
2934 ; AVX1-LABEL: test90:
2935 ; AVX1:       # BB#0: # %entry
2936 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2937 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2938 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
2939 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
2940 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2941 ; AVX1-NEXT:    retq
2942 ;
2943 ; AVX2-LABEL: test90:
2944 ; AVX2:       # BB#0: # %entry
2945 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2946 ; AVX2-NEXT:    retq
2947 ;
2948 ; AVX512F-LABEL: test90:
2949 ; AVX512F:       # BB#0: # %entry
2950 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2951 ; AVX512F-NEXT:    retq
2952 entry:
2953   %cmp = icmp sle <8 x i32> %a, %b
2954   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
2955   ret <8 x i32> %sel
2956 }
2957
2958 define <8 x i32> @test91(<8 x i32> %a, <8 x i32> %b) {
2959 ; SSE2-LABEL: test91:
2960 ; SSE2:       # BB#0: # %entry
2961 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2962 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2963 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2964 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
2965 ; SSE2-NEXT:    pand %xmm5, %xmm2
2966 ; SSE2-NEXT:    pandn %xmm0, %xmm5
2967 ; SSE2-NEXT:    por %xmm2, %xmm5
2968 ; SSE2-NEXT:    pand %xmm4, %xmm3
2969 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2970 ; SSE2-NEXT:    por %xmm3, %xmm4
2971 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2972 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
2973 ; SSE2-NEXT:    retq
2974 ;
2975 ; SSE4-LABEL: test91:
2976 ; SSE4:       # BB#0: # %entry
2977 ; SSE4-NEXT:    pminsd %xmm2, %xmm0
2978 ; SSE4-NEXT:    pminsd %xmm3, %xmm1
2979 ; SSE4-NEXT:    retq
2980 ;
2981 ; AVX1-LABEL: test91:
2982 ; AVX1:       # BB#0: # %entry
2983 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2984 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2985 ; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
2986 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
2987 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2988 ; AVX1-NEXT:    retq
2989 ;
2990 ; AVX2-LABEL: test91:
2991 ; AVX2:       # BB#0: # %entry
2992 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2993 ; AVX2-NEXT:    retq
2994 ;
2995 ; AVX512F-LABEL: test91:
2996 ; AVX512F:       # BB#0: # %entry
2997 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2998 ; AVX512F-NEXT:    retq
2999 entry:
3000   %cmp = icmp sgt <8 x i32> %a, %b
3001   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3002   ret <8 x i32> %sel
3003 }
3004
3005 define <8 x i32> @test92(<8 x i32> %a, <8 x i32> %b) {
3006 ; SSE2-LABEL: test92:
3007 ; SSE2:       # BB#0: # %entry
3008 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
3009 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
3010 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
3011 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
3012 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3013 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
3014 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
3015 ; SSE2-NEXT:    pxor %xmm7, %xmm4
3016 ; SSE2-NEXT:    pandn %xmm2, %xmm7
3017 ; SSE2-NEXT:    pandn %xmm0, %xmm4
3018 ; SSE2-NEXT:    por %xmm7, %xmm4
3019 ; SSE2-NEXT:    pandn %xmm3, %xmm6
3020 ; SSE2-NEXT:    pandn %xmm1, %xmm5
3021 ; SSE2-NEXT:    por %xmm6, %xmm5
3022 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3023 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
3024 ; SSE2-NEXT:    retq
3025 ;
3026 ; SSE4-LABEL: test92:
3027 ; SSE4:       # BB#0: # %entry
3028 ; SSE4-NEXT:    pminsd %xmm2, %xmm0
3029 ; SSE4-NEXT:    pminsd %xmm3, %xmm1
3030 ; SSE4-NEXT:    retq
3031 ;
3032 ; AVX1-LABEL: test92:
3033 ; AVX1:       # BB#0: # %entry
3034 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3035 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3036 ; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
3037 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
3038 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3039 ; AVX1-NEXT:    retq
3040 ;
3041 ; AVX2-LABEL: test92:
3042 ; AVX2:       # BB#0: # %entry
3043 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
3044 ; AVX2-NEXT:    retq
3045 ;
3046 ; AVX512F-LABEL: test92:
3047 ; AVX512F:       # BB#0: # %entry
3048 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
3049 ; AVX512F-NEXT:    retq
3050 entry:
3051   %cmp = icmp sge <8 x i32> %a, %b
3052   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3053   ret <8 x i32> %sel
3054 }
3055
3056 define <8 x i32> @test93(<8 x i32> %a, <8 x i32> %b) {
3057 ; SSE2-LABEL: test93:
3058 ; SSE2:       # BB#0: # %entry
3059 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
3060 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
3061 ; SSE2-NEXT:    pxor %xmm4, %xmm6
3062 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
3063 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3064 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
3065 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
3066 ; SSE2-NEXT:    pxor %xmm4, %xmm6
3067 ; SSE2-NEXT:    pxor %xmm2, %xmm4
3068 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
3069 ; SSE2-NEXT:    pand %xmm4, %xmm2
3070 ; SSE2-NEXT:    pandn %xmm0, %xmm4
3071 ; SSE2-NEXT:    por %xmm2, %xmm4
3072 ; SSE2-NEXT:    pand %xmm5, %xmm3
3073 ; SSE2-NEXT:    pandn %xmm1, %xmm5
3074 ; SSE2-NEXT:    por %xmm3, %xmm5
3075 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3076 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
3077 ; SSE2-NEXT:    retq
3078 ;
3079 ; SSE4-LABEL: test93:
3080 ; SSE4:       # BB#0: # %entry
3081 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
3082 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
3083 ; SSE4-NEXT:    retq
3084 ;
3085 ; AVX1-LABEL: test93:
3086 ; AVX1:       # BB#0: # %entry
3087 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3088 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3089 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
3090 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
3091 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3092 ; AVX1-NEXT:    retq
3093 ;
3094 ; AVX2-LABEL: test93:
3095 ; AVX2:       # BB#0: # %entry
3096 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
3097 ; AVX2-NEXT:    retq
3098 ;
3099 ; AVX512F-LABEL: test93:
3100 ; AVX512F:       # BB#0: # %entry
3101 ; AVX512F-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
3102 ; AVX512F-NEXT:    retq
3103 entry:
3104   %cmp = icmp ult <8 x i32> %a, %b
3105   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3106   ret <8 x i32> %sel
3107 }
3108
3109 define <8 x i32> @test94(<8 x i32> %a, <8 x i32> %b) {
3110 ; SSE2-LABEL: test94:
3111 ; SSE2:       # BB#0: # %entry
3112 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
3113 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3114 ; SSE2-NEXT:    pxor %xmm6, %xmm4
3115 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
3116 ; SSE2-NEXT:    pxor %xmm6, %xmm7
3117 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
3118 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
3119 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
3120 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3121 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
3122 ; SSE2-NEXT:    pxor %xmm6, %xmm8
3123 ; SSE2-NEXT:    pxor %xmm0, %xmm6
3124 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
3125 ; SSE2-NEXT:    pxor %xmm6, %xmm4
3126 ; SSE2-NEXT:    pandn %xmm2, %xmm6
3127 ; SSE2-NEXT:    pandn %xmm0, %xmm4
3128 ; SSE2-NEXT:    por %xmm6, %xmm4
3129 ; SSE2-NEXT:    pandn %xmm3, %xmm7
3130 ; SSE2-NEXT:    pandn %xmm1, %xmm5
3131 ; SSE2-NEXT:    por %xmm7, %xmm5
3132 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3133 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
3134 ; SSE2-NEXT:    retq
3135 ;
3136 ; SSE4-LABEL: test94:
3137 ; SSE4:       # BB#0: # %entry
3138 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
3139 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
3140 ; SSE4-NEXT:    retq
3141 ;
3142 ; AVX1-LABEL: test94:
3143 ; AVX1:       # BB#0: # %entry
3144 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3145 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3146 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
3147 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
3148 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3149 ; AVX1-NEXT:    retq
3150 ;
3151 ; AVX2-LABEL: test94:
3152 ; AVX2:       # BB#0: # %entry
3153 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
3154 ; AVX2-NEXT:    retq
3155 ;
3156 ; AVX512F-LABEL: test94:
3157 ; AVX512F:       # BB#0: # %entry
3158 ; AVX512F-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
3159 ; AVX512F-NEXT:    retq
3160 entry:
3161   %cmp = icmp ule <8 x i32> %a, %b
3162   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3163   ret <8 x i32> %sel
3164 }
3165
3166 define <8 x i32> @test95(<8 x i32> %a, <8 x i32> %b) {
3167 ; SSE2-LABEL: test95:
3168 ; SSE2:       # BB#0: # %entry
3169 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
3170 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
3171 ; SSE2-NEXT:    pxor %xmm4, %xmm6
3172 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
3173 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3174 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
3175 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
3176 ; SSE2-NEXT:    pxor %xmm4, %xmm6
3177 ; SSE2-NEXT:    pxor %xmm0, %xmm4
3178 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
3179 ; SSE2-NEXT:    pand %xmm4, %xmm2
3180 ; SSE2-NEXT:    pandn %xmm0, %xmm4
3181 ; SSE2-NEXT:    por %xmm2, %xmm4
3182 ; SSE2-NEXT:    pand %xmm5, %xmm3
3183 ; SSE2-NEXT:    pandn %xmm1, %xmm5
3184 ; SSE2-NEXT:    por %xmm3, %xmm5
3185 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3186 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
3187 ; SSE2-NEXT:    retq
3188 ;
3189 ; SSE4-LABEL: test95:
3190 ; SSE4:       # BB#0: # %entry
3191 ; SSE4-NEXT:    pminud %xmm2, %xmm0
3192 ; SSE4-NEXT:    pminud %xmm3, %xmm1
3193 ; SSE4-NEXT:    retq
3194 ;
3195 ; AVX1-LABEL: test95:
3196 ; AVX1:       # BB#0: # %entry
3197 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3198 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3199 ; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
3200 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3201 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3202 ; AVX1-NEXT:    retq
3203 ;
3204 ; AVX2-LABEL: test95:
3205 ; AVX2:       # BB#0: # %entry
3206 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3207 ; AVX2-NEXT:    retq
3208 ;
3209 ; AVX512F-LABEL: test95:
3210 ; AVX512F:       # BB#0: # %entry
3211 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3212 ; AVX512F-NEXT:    retq
3213 entry:
3214   %cmp = icmp ugt <8 x i32> %a, %b
3215   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3216   ret <8 x i32> %sel
3217 }
3218
3219 define <8 x i32> @test96(<8 x i32> %a, <8 x i32> %b) {
3220 ; SSE2-LABEL: test96:
3221 ; SSE2:       # BB#0: # %entry
3222 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
3223 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
3224 ; SSE2-NEXT:    pxor %xmm6, %xmm4
3225 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
3226 ; SSE2-NEXT:    pxor %xmm6, %xmm7
3227 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
3228 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
3229 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
3230 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3231 ; SSE2-NEXT:    movdqa %xmm0, %xmm8
3232 ; SSE2-NEXT:    pxor %xmm6, %xmm8
3233 ; SSE2-NEXT:    pxor %xmm2, %xmm6
3234 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
3235 ; SSE2-NEXT:    pxor %xmm6, %xmm4
3236 ; SSE2-NEXT:    pandn %xmm2, %xmm6
3237 ; SSE2-NEXT:    pandn %xmm0, %xmm4
3238 ; SSE2-NEXT:    por %xmm6, %xmm4
3239 ; SSE2-NEXT:    pandn %xmm3, %xmm7
3240 ; SSE2-NEXT:    pandn %xmm1, %xmm5
3241 ; SSE2-NEXT:    por %xmm7, %xmm5
3242 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3243 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
3244 ; SSE2-NEXT:    retq
3245 ;
3246 ; SSE4-LABEL: test96:
3247 ; SSE4:       # BB#0: # %entry
3248 ; SSE4-NEXT:    pminud %xmm2, %xmm0
3249 ; SSE4-NEXT:    pminud %xmm3, %xmm1
3250 ; SSE4-NEXT:    retq
3251 ;
3252 ; AVX1-LABEL: test96:
3253 ; AVX1:       # BB#0: # %entry
3254 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3255 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3256 ; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
3257 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3258 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3259 ; AVX1-NEXT:    retq
3260 ;
3261 ; AVX2-LABEL: test96:
3262 ; AVX2:       # BB#0: # %entry
3263 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3264 ; AVX2-NEXT:    retq
3265 ;
3266 ; AVX512F-LABEL: test96:
3267 ; AVX512F:       # BB#0: # %entry
3268 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3269 ; AVX512F-NEXT:    retq
3270 entry:
3271   %cmp = icmp uge <8 x i32> %a, %b
3272   %sel = select <8 x i1> %cmp, <8 x i32> %b, <8 x i32> %a
3273   ret <8 x i32> %sel
3274 }
3275
3276 ; ----------------------------
3277
3278 define <64 x i8> @test97(<64 x i8> %a, <64 x i8> %b) {
3279 ; SSE2-LABEL: test97:
3280 ; SSE2:       # BB#0: # %entry
3281 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
3282 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm8
3283 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
3284 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm9
3285 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
3286 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm10
3287 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
3288 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm11
3289 ; SSE2-NEXT:    pand %xmm11, %xmm0
3290 ; SSE2-NEXT:    pandn %xmm4, %xmm11
3291 ; SSE2-NEXT:    por %xmm11, %xmm0
3292 ; SSE2-NEXT:    pand %xmm10, %xmm1
3293 ; SSE2-NEXT:    pandn %xmm5, %xmm10
3294 ; SSE2-NEXT:    por %xmm10, %xmm1
3295 ; SSE2-NEXT:    pand %xmm9, %xmm2
3296 ; SSE2-NEXT:    pandn %xmm6, %xmm9
3297 ; SSE2-NEXT:    por %xmm9, %xmm2
3298 ; SSE2-NEXT:    pand %xmm8, %xmm3
3299 ; SSE2-NEXT:    pandn %xmm7, %xmm8
3300 ; SSE2-NEXT:    por %xmm8, %xmm3
3301 ; SSE2-NEXT:    retq
3302 ;
3303 ; SSE4-LABEL: test97:
3304 ; SSE4:       # BB#0: # %entry
3305 ; SSE4-NEXT:    pminsb %xmm4, %xmm0
3306 ; SSE4-NEXT:    pminsb %xmm5, %xmm1
3307 ; SSE4-NEXT:    pminsb %xmm6, %xmm2
3308 ; SSE4-NEXT:    pminsb %xmm7, %xmm3
3309 ; SSE4-NEXT:    retq
3310 ;
3311 ; AVX1-LABEL: test97:
3312 ; AVX1:       # BB#0: # %entry
3313 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3314 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3315 ; AVX1-NEXT:    vpminsb %xmm4, %xmm5, %xmm4
3316 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
3317 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3318 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3319 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3320 ; AVX1-NEXT:    vpminsb %xmm2, %xmm4, %xmm2
3321 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm1
3322 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3323 ; AVX1-NEXT:    retq
3324 ;
3325 ; AVX2-LABEL: test97:
3326 ; AVX2:       # BB#0: # %entry
3327 ; AVX2-NEXT:    vpminsb %ymm2, %ymm0, %ymm0
3328 ; AVX2-NEXT:    vpminsb %ymm3, %ymm1, %ymm1
3329 ; AVX2-NEXT:    retq
3330 ;
3331 ; AVX512BW-LABEL: test97:
3332 ; AVX512BW:       # BB#0: # %entry
3333 ; AVX512BW-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
3334 ; AVX512BW-NEXT:    retq
3335 entry:
3336   %cmp = icmp slt <64 x i8> %a, %b
3337   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3338   ret <64 x i8> %sel
3339 }
3340
3341 define <64 x i8> @test98(<64 x i8> %a, <64 x i8> %b) {
3342 ; SSE2-LABEL: test98:
3343 ; SSE2:       # BB#0: # %entry
3344 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
3345 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
3346 ; SSE2-NEXT:    movdqa %xmm8, %xmm12
3347 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm12
3348 ; SSE2-NEXT:    pcmpeqd %xmm13, %xmm13
3349 ; SSE2-NEXT:    movdqa %xmm12, %xmm3
3350 ; SSE2-NEXT:    pxor %xmm13, %xmm3
3351 ; SSE2-NEXT:    movdqa %xmm9, %xmm14
3352 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm14
3353 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
3354 ; SSE2-NEXT:    pxor %xmm13, %xmm2
3355 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
3356 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm15
3357 ; SSE2-NEXT:    movdqa %xmm15, %xmm10
3358 ; SSE2-NEXT:    pxor %xmm13, %xmm10
3359 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
3360 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11
3361 ; SSE2-NEXT:    pxor %xmm11, %xmm13
3362 ; SSE2-NEXT:    pandn %xmm0, %xmm11
3363 ; SSE2-NEXT:    pandn %xmm4, %xmm13
3364 ; SSE2-NEXT:    por %xmm13, %xmm11
3365 ; SSE2-NEXT:    pandn %xmm1, %xmm15
3366 ; SSE2-NEXT:    pandn %xmm5, %xmm10
3367 ; SSE2-NEXT:    por %xmm15, %xmm10
3368 ; SSE2-NEXT:    pandn %xmm9, %xmm14
3369 ; SSE2-NEXT:    pandn %xmm6, %xmm2
3370 ; SSE2-NEXT:    por %xmm14, %xmm2
3371 ; SSE2-NEXT:    pandn %xmm8, %xmm12
3372 ; SSE2-NEXT:    pandn %xmm7, %xmm3
3373 ; SSE2-NEXT:    por %xmm12, %xmm3
3374 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
3375 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
3376 ; SSE2-NEXT:    retq
3377 ;
3378 ; SSE4-LABEL: test98:
3379 ; SSE4:       # BB#0: # %entry
3380 ; SSE4-NEXT:    pminsb %xmm4, %xmm0
3381 ; SSE4-NEXT:    pminsb %xmm5, %xmm1
3382 ; SSE4-NEXT:    pminsb %xmm6, %xmm2
3383 ; SSE4-NEXT:    pminsb %xmm7, %xmm3
3384 ; SSE4-NEXT:    retq
3385 ;
3386 ; AVX1-LABEL: test98:
3387 ; AVX1:       # BB#0: # %entry
3388 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3389 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3390 ; AVX1-NEXT:    vpminsb %xmm4, %xmm5, %xmm4
3391 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
3392 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3393 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3394 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3395 ; AVX1-NEXT:    vpminsb %xmm2, %xmm4, %xmm2
3396 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm1
3397 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3398 ; AVX1-NEXT:    retq
3399 ;
3400 ; AVX2-LABEL: test98:
3401 ; AVX2:       # BB#0: # %entry
3402 ; AVX2-NEXT:    vpminsb %ymm2, %ymm0, %ymm0
3403 ; AVX2-NEXT:    vpminsb %ymm3, %ymm1, %ymm1
3404 ; AVX2-NEXT:    retq
3405 ;
3406 ; AVX512BW-LABEL: test98:
3407 ; AVX512BW:       # BB#0: # %entry
3408 ; AVX512BW-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
3409 ; AVX512BW-NEXT:    retq
3410 entry:
3411   %cmp = icmp sle <64 x i8> %a, %b
3412   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3413   ret <64 x i8> %sel
3414 }
3415
3416 define <64 x i8> @test99(<64 x i8> %a, <64 x i8> %b) {
3417 ; SSE2-LABEL: test99:
3418 ; SSE2:       # BB#0: # %entry
3419 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
3420 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm3
3421 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
3422 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm9
3423 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
3424 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm10
3425 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
3426 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11
3427 ; SSE2-NEXT:    pand %xmm11, %xmm0
3428 ; SSE2-NEXT:    pandn %xmm4, %xmm11
3429 ; SSE2-NEXT:    por %xmm0, %xmm11
3430 ; SSE2-NEXT:    pand %xmm10, %xmm1
3431 ; SSE2-NEXT:    pandn %xmm5, %xmm10
3432 ; SSE2-NEXT:    por %xmm1, %xmm10
3433 ; SSE2-NEXT:    pand %xmm9, %xmm2
3434 ; SSE2-NEXT:    pandn %xmm6, %xmm9
3435 ; SSE2-NEXT:    por %xmm2, %xmm9
3436 ; SSE2-NEXT:    pand %xmm3, %xmm8
3437 ; SSE2-NEXT:    pandn %xmm7, %xmm3
3438 ; SSE2-NEXT:    por %xmm8, %xmm3
3439 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
3440 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
3441 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
3442 ; SSE2-NEXT:    retq
3443 ;
3444 ; SSE4-LABEL: test99:
3445 ; SSE4:       # BB#0: # %entry
3446 ; SSE4-NEXT:    pmaxsb %xmm4, %xmm0
3447 ; SSE4-NEXT:    pmaxsb %xmm5, %xmm1
3448 ; SSE4-NEXT:    pmaxsb %xmm6, %xmm2
3449 ; SSE4-NEXT:    pmaxsb %xmm7, %xmm3
3450 ; SSE4-NEXT:    retq
3451 ;
3452 ; AVX1-LABEL: test99:
3453 ; AVX1:       # BB#0: # %entry
3454 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3455 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3456 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
3457 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
3458 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3459 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3460 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3461 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm4, %xmm2
3462 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
3463 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3464 ; AVX1-NEXT:    retq
3465 ;
3466 ; AVX2-LABEL: test99:
3467 ; AVX2:       # BB#0: # %entry
3468 ; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
3469 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
3470 ; AVX2-NEXT:    retq
3471 ;
3472 ; AVX512BW-LABEL: test99:
3473 ; AVX512BW:       # BB#0: # %entry
3474 ; AVX512BW-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
3475 ; AVX512BW-NEXT:    retq
3476 entry:
3477   %cmp = icmp sgt <64 x i8> %a, %b
3478   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3479   ret <64 x i8> %sel
3480 }
3481
3482 define <64 x i8> @test100(<64 x i8> %a, <64 x i8> %b) {
3483 ; SSE2-LABEL: test100:
3484 ; SSE2:       # BB#0: # %entry
3485 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
3486 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
3487 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
3488 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
3489 ; SSE2-NEXT:    pcmpgtb %xmm8, %xmm12
3490 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
3491 ; SSE2-NEXT:    movdqa %xmm12, %xmm3
3492 ; SSE2-NEXT:    pxor %xmm0, %xmm3
3493 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
3494 ; SSE2-NEXT:    pcmpgtb %xmm9, %xmm13
3495 ; SSE2-NEXT:    movdqa %xmm13, %xmm2
3496 ; SSE2-NEXT:    pxor %xmm0, %xmm2
3497 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
3498 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm14
3499 ; SSE2-NEXT:    movdqa %xmm14, %xmm11
3500 ; SSE2-NEXT:    pxor %xmm0, %xmm11
3501 ; SSE2-NEXT:    movdqa %xmm4, %xmm15
3502 ; SSE2-NEXT:    pcmpgtb %xmm10, %xmm15
3503 ; SSE2-NEXT:    pxor %xmm15, %xmm0
3504 ; SSE2-NEXT:    pandn %xmm10, %xmm15
3505 ; SSE2-NEXT:    pandn %xmm4, %xmm0
3506 ; SSE2-NEXT:    por %xmm15, %xmm0
3507 ; SSE2-NEXT:    pandn %xmm1, %xmm14
3508 ; SSE2-NEXT:    pandn %xmm5, %xmm11
3509 ; SSE2-NEXT:    por %xmm14, %xmm11
3510 ; SSE2-NEXT:    pandn %xmm9, %xmm13
3511 ; SSE2-NEXT:    pandn %xmm6, %xmm2
3512 ; SSE2-NEXT:    por %xmm13, %xmm2
3513 ; SSE2-NEXT:    pandn %xmm8, %xmm12
3514 ; SSE2-NEXT:    pandn %xmm7, %xmm3
3515 ; SSE2-NEXT:    por %xmm12, %xmm3
3516 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
3517 ; SSE2-NEXT:    retq
3518 ;
3519 ; SSE4-LABEL: test100:
3520 ; SSE4:       # BB#0: # %entry
3521 ; SSE4-NEXT:    pmaxsb %xmm4, %xmm0
3522 ; SSE4-NEXT:    pmaxsb %xmm5, %xmm1
3523 ; SSE4-NEXT:    pmaxsb %xmm6, %xmm2
3524 ; SSE4-NEXT:    pmaxsb %xmm7, %xmm3
3525 ; SSE4-NEXT:    retq
3526 ;
3527 ; AVX1-LABEL: test100:
3528 ; AVX1:       # BB#0: # %entry
3529 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3530 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3531 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
3532 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
3533 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3534 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3535 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3536 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm4, %xmm2
3537 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
3538 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3539 ; AVX1-NEXT:    retq
3540 ;
3541 ; AVX2-LABEL: test100:
3542 ; AVX2:       # BB#0: # %entry
3543 ; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
3544 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
3545 ; AVX2-NEXT:    retq
3546 ;
3547 ; AVX512BW-LABEL: test100:
3548 ; AVX512BW:       # BB#0: # %entry
3549 ; AVX512BW-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
3550 ; AVX512BW-NEXT:    retq
3551 entry:
3552   %cmp = icmp sge <64 x i8> %a, %b
3553   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3554   ret <64 x i8> %sel
3555 }
3556
3557 define <64 x i8> @test101(<64 x i8> %a, <64 x i8> %b) {
3558 ; SSE-LABEL: test101:
3559 ; SSE:       # BB#0: # %entry
3560 ; SSE-NEXT:    pminub %xmm4, %xmm0
3561 ; SSE-NEXT:    pminub %xmm5, %xmm1
3562 ; SSE-NEXT:    pminub %xmm6, %xmm2
3563 ; SSE-NEXT:    pminub %xmm7, %xmm3
3564 ; SSE-NEXT:    retq
3565 ;
3566 ; AVX1-LABEL: test101:
3567 ; AVX1:       # BB#0: # %entry
3568 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3569 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3570 ; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
3571 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
3572 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3573 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3574 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3575 ; AVX1-NEXT:    vpminub %xmm2, %xmm4, %xmm2
3576 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm1
3577 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3578 ; AVX1-NEXT:    retq
3579 ;
3580 ; AVX2-LABEL: test101:
3581 ; AVX2:       # BB#0: # %entry
3582 ; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
3583 ; AVX2-NEXT:    vpminub %ymm3, %ymm1, %ymm1
3584 ; AVX2-NEXT:    retq
3585 ;
3586 ; AVX512BW-LABEL: test101:
3587 ; AVX512BW:       # BB#0: # %entry
3588 ; AVX512BW-NEXT:    vpminub %zmm1, %zmm0, %zmm0
3589 ; AVX512BW-NEXT:    retq
3590 entry:
3591   %cmp = icmp ult <64 x i8> %a, %b
3592   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3593   ret <64 x i8> %sel
3594 }
3595
3596 define <64 x i8> @test102(<64 x i8> %a, <64 x i8> %b) {
3597 ; SSE-LABEL: test102:
3598 ; SSE:       # BB#0: # %entry
3599 ; SSE-NEXT:    pminub %xmm4, %xmm0
3600 ; SSE-NEXT:    pminub %xmm5, %xmm1
3601 ; SSE-NEXT:    pminub %xmm6, %xmm2
3602 ; SSE-NEXT:    pminub %xmm7, %xmm3
3603 ; SSE-NEXT:    retq
3604 ;
3605 ; AVX1-LABEL: test102:
3606 ; AVX1:       # BB#0: # %entry
3607 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3608 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3609 ; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
3610 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
3611 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3612 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3613 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3614 ; AVX1-NEXT:    vpminub %xmm2, %xmm4, %xmm2
3615 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm1
3616 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3617 ; AVX1-NEXT:    retq
3618 ;
3619 ; AVX2-LABEL: test102:
3620 ; AVX2:       # BB#0: # %entry
3621 ; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
3622 ; AVX2-NEXT:    vpminub %ymm3, %ymm1, %ymm1
3623 ; AVX2-NEXT:    retq
3624 ;
3625 ; AVX512BW-LABEL: test102:
3626 ; AVX512BW:       # BB#0: # %entry
3627 ; AVX512BW-NEXT:    vpminub %zmm1, %zmm0, %zmm0
3628 ; AVX512BW-NEXT:    retq
3629 entry:
3630   %cmp = icmp ule <64 x i8> %a, %b
3631   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3632   ret <64 x i8> %sel
3633 }
3634
3635 define <64 x i8> @test103(<64 x i8> %a, <64 x i8> %b) {
3636 ; SSE-LABEL: test103:
3637 ; SSE:       # BB#0: # %entry
3638 ; SSE-NEXT:    pmaxub %xmm4, %xmm0
3639 ; SSE-NEXT:    pmaxub %xmm5, %xmm1
3640 ; SSE-NEXT:    pmaxub %xmm6, %xmm2
3641 ; SSE-NEXT:    pmaxub %xmm7, %xmm3
3642 ; SSE-NEXT:    retq
3643 ;
3644 ; AVX1-LABEL: test103:
3645 ; AVX1:       # BB#0: # %entry
3646 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3647 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3648 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
3649 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
3650 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3651 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3652 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3653 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm4, %xmm2
3654 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
3655 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3656 ; AVX1-NEXT:    retq
3657 ;
3658 ; AVX2-LABEL: test103:
3659 ; AVX2:       # BB#0: # %entry
3660 ; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
3661 ; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
3662 ; AVX2-NEXT:    retq
3663 ;
3664 ; AVX512BW-LABEL: test103:
3665 ; AVX512BW:       # BB#0: # %entry
3666 ; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
3667 ; AVX512BW-NEXT:    retq
3668 entry:
3669   %cmp = icmp ugt <64 x i8> %a, %b
3670   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3671   ret <64 x i8> %sel
3672 }
3673
3674 define <64 x i8> @test104(<64 x i8> %a, <64 x i8> %b) {
3675 ; SSE-LABEL: test104:
3676 ; SSE:       # BB#0: # %entry
3677 ; SSE-NEXT:    pmaxub %xmm4, %xmm0
3678 ; SSE-NEXT:    pmaxub %xmm5, %xmm1
3679 ; SSE-NEXT:    pmaxub %xmm6, %xmm2
3680 ; SSE-NEXT:    pmaxub %xmm7, %xmm3
3681 ; SSE-NEXT:    retq
3682 ;
3683 ; AVX1-LABEL: test104:
3684 ; AVX1:       # BB#0: # %entry
3685 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3686 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3687 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
3688 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
3689 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3690 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3691 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3692 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm4, %xmm2
3693 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
3694 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3695 ; AVX1-NEXT:    retq
3696 ;
3697 ; AVX2-LABEL: test104:
3698 ; AVX2:       # BB#0: # %entry
3699 ; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
3700 ; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
3701 ; AVX2-NEXT:    retq
3702 ;
3703 ; AVX512BW-LABEL: test104:
3704 ; AVX512BW:       # BB#0: # %entry
3705 ; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
3706 ; AVX512BW-NEXT:    retq
3707 entry:
3708   %cmp = icmp uge <64 x i8> %a, %b
3709   %sel = select <64 x i1> %cmp, <64 x i8> %a, <64 x i8> %b
3710   ret <64 x i8> %sel
3711 }
3712
3713 define <32 x i16> @test105(<32 x i16> %a, <32 x i16> %b) {
3714 ; SSE-LABEL: test105:
3715 ; SSE:       # BB#0: # %entry
3716 ; SSE-NEXT:    pminsw %xmm4, %xmm0
3717 ; SSE-NEXT:    pminsw %xmm5, %xmm1
3718 ; SSE-NEXT:    pminsw %xmm6, %xmm2
3719 ; SSE-NEXT:    pminsw %xmm7, %xmm3
3720 ; SSE-NEXT:    retq
3721 ;
3722 ; AVX1-LABEL: test105:
3723 ; AVX1:       # BB#0: # %entry
3724 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3725 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3726 ; AVX1-NEXT:    vpminsw %xmm4, %xmm5, %xmm4
3727 ; AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
3728 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3729 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3730 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3731 ; AVX1-NEXT:    vpminsw %xmm2, %xmm4, %xmm2
3732 ; AVX1-NEXT:    vpminsw %xmm3, %xmm1, %xmm1
3733 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3734 ; AVX1-NEXT:    retq
3735 ;
3736 ; AVX2-LABEL: test105:
3737 ; AVX2:       # BB#0: # %entry
3738 ; AVX2-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3739 ; AVX2-NEXT:    vpminsw %ymm3, %ymm1, %ymm1
3740 ; AVX2-NEXT:    retq
3741 ;
3742 ; AVX512BW-LABEL: test105:
3743 ; AVX512BW:       # BB#0: # %entry
3744 ; AVX512BW-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
3745 ; AVX512BW-NEXT:    retq
3746 entry:
3747   %cmp = icmp slt <32 x i16> %a, %b
3748   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
3749   ret <32 x i16> %sel
3750 }
3751
3752 define <32 x i16> @test106(<32 x i16> %a, <32 x i16> %b) {
3753 ; SSE-LABEL: test106:
3754 ; SSE:       # BB#0: # %entry
3755 ; SSE-NEXT:    pminsw %xmm4, %xmm0
3756 ; SSE-NEXT:    pminsw %xmm5, %xmm1
3757 ; SSE-NEXT:    pminsw %xmm6, %xmm2
3758 ; SSE-NEXT:    pminsw %xmm7, %xmm3
3759 ; SSE-NEXT:    retq
3760 ;
3761 ; AVX1-LABEL: test106:
3762 ; AVX1:       # BB#0: # %entry
3763 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3764 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3765 ; AVX1-NEXT:    vpminsw %xmm4, %xmm5, %xmm4
3766 ; AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
3767 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3768 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3769 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3770 ; AVX1-NEXT:    vpminsw %xmm2, %xmm4, %xmm2
3771 ; AVX1-NEXT:    vpminsw %xmm3, %xmm1, %xmm1
3772 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3773 ; AVX1-NEXT:    retq
3774 ;
3775 ; AVX2-LABEL: test106:
3776 ; AVX2:       # BB#0: # %entry
3777 ; AVX2-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3778 ; AVX2-NEXT:    vpminsw %ymm3, %ymm1, %ymm1
3779 ; AVX2-NEXT:    retq
3780 ;
3781 ; AVX512BW-LABEL: test106:
3782 ; AVX512BW:       # BB#0: # %entry
3783 ; AVX512BW-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
3784 ; AVX512BW-NEXT:    retq
3785 entry:
3786   %cmp = icmp sle <32 x i16> %a, %b
3787   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
3788   ret <32 x i16> %sel
3789 }
3790
3791 define <32 x i16> @test107(<32 x i16> %a, <32 x i16> %b) {
3792 ; SSE-LABEL: test107:
3793 ; SSE:       # BB#0: # %entry
3794 ; SSE-NEXT:    pmaxsw %xmm4, %xmm0
3795 ; SSE-NEXT:    pmaxsw %xmm5, %xmm1
3796 ; SSE-NEXT:    pmaxsw %xmm6, %xmm2
3797 ; SSE-NEXT:    pmaxsw %xmm7, %xmm3
3798 ; SSE-NEXT:    retq
3799 ;
3800 ; AVX1-LABEL: test107:
3801 ; AVX1:       # BB#0: # %entry
3802 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3803 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3804 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
3805 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
3806 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3807 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3808 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3809 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm4, %xmm2
3810 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
3811 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3812 ; AVX1-NEXT:    retq
3813 ;
3814 ; AVX2-LABEL: test107:
3815 ; AVX2:       # BB#0: # %entry
3816 ; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3817 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
3818 ; AVX2-NEXT:    retq
3819 ;
3820 ; AVX512BW-LABEL: test107:
3821 ; AVX512BW:       # BB#0: # %entry
3822 ; AVX512BW-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
3823 ; AVX512BW-NEXT:    retq
3824 entry:
3825   %cmp = icmp sgt <32 x i16> %a, %b
3826   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
3827   ret <32 x i16> %sel
3828 }
3829
3830 define <32 x i16> @test108(<32 x i16> %a, <32 x i16> %b) {
3831 ; SSE-LABEL: test108:
3832 ; SSE:       # BB#0: # %entry
3833 ; SSE-NEXT:    pmaxsw %xmm4, %xmm0
3834 ; SSE-NEXT:    pmaxsw %xmm5, %xmm1
3835 ; SSE-NEXT:    pmaxsw %xmm6, %xmm2
3836 ; SSE-NEXT:    pmaxsw %xmm7, %xmm3
3837 ; SSE-NEXT:    retq
3838 ;
3839 ; AVX1-LABEL: test108:
3840 ; AVX1:       # BB#0: # %entry
3841 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3842 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3843 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
3844 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
3845 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3846 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3847 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3848 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm4, %xmm2
3849 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
3850 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3851 ; AVX1-NEXT:    retq
3852 ;
3853 ; AVX2-LABEL: test108:
3854 ; AVX2:       # BB#0: # %entry
3855 ; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3856 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
3857 ; AVX2-NEXT:    retq
3858 ;
3859 ; AVX512BW-LABEL: test108:
3860 ; AVX512BW:       # BB#0: # %entry
3861 ; AVX512BW-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
3862 ; AVX512BW-NEXT:    retq
3863 entry:
3864   %cmp = icmp sge <32 x i16> %a, %b
3865   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
3866   ret <32 x i16> %sel
3867 }
3868
3869 define <32 x i16> @test109(<32 x i16> %a, <32 x i16> %b) {
3870 ; SSE2-LABEL: test109:
3871 ; SSE2:       # BB#0: # %entry
3872 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [32768,32768,32768,32768,32768,32768,32768,32768]
3873 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
3874 ; SSE2-NEXT:    pxor %xmm10, %xmm9
3875 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
3876 ; SSE2-NEXT:    pxor %xmm10, %xmm8
3877 ; SSE2-NEXT:    pcmpgtw %xmm9, %xmm8
3878 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
3879 ; SSE2-NEXT:    pxor %xmm10, %xmm11
3880 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
3881 ; SSE2-NEXT:    pxor %xmm10, %xmm9
3882 ; SSE2-NEXT:    pcmpgtw %xmm11, %xmm9
3883 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
3884 ; SSE2-NEXT:    pxor %xmm10, %xmm11
3885 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
3886 ; SSE2-NEXT:    pxor %xmm10, %xmm12
3887 ; SSE2-NEXT:    pcmpgtw %xmm11, %xmm12
3888 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
3889 ; SSE2-NEXT:    pxor %xmm10, %xmm11
3890 ; SSE2-NEXT:    pxor %xmm4, %xmm10
3891 ; SSE2-NEXT:    pcmpgtw %xmm11, %xmm10
3892 ; SSE2-NEXT:    pand %xmm10, %xmm0
3893 ; SSE2-NEXT:    pandn %xmm4, %xmm10
3894 ; SSE2-NEXT:    por %xmm10, %xmm0
3895 ; SSE2-NEXT:    pand %xmm12, %xmm1
3896 ; SSE2-NEXT:    pandn %xmm5, %xmm12
3897 ; SSE2-NEXT:    por %xmm12, %xmm1
3898 ; SSE2-NEXT:    pand %xmm9, %xmm2
3899 ; SSE2-NEXT:    pandn %xmm6, %xmm9
3900 ; SSE2-NEXT:    por %xmm9, %xmm2
3901 ; SSE2-NEXT:    pand %xmm8, %xmm3
3902 ; SSE2-NEXT:    pandn %xmm7, %xmm8
3903 ; SSE2-NEXT:    por %xmm8, %xmm3
3904 ; SSE2-NEXT:    retq
3905 ;
3906 ; SSE4-LABEL: test109:
3907 ; SSE4:       # BB#0: # %entry
3908 ; SSE4-NEXT:    pminuw %xmm4, %xmm0
3909 ; SSE4-NEXT:    pminuw %xmm5, %xmm1
3910 ; SSE4-NEXT:    pminuw %xmm6, %xmm2
3911 ; SSE4-NEXT:    pminuw %xmm7, %xmm3
3912 ; SSE4-NEXT:    retq
3913 ;
3914 ; AVX1-LABEL: test109:
3915 ; AVX1:       # BB#0: # %entry
3916 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3917 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3918 ; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
3919 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
3920 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3921 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3922 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3923 ; AVX1-NEXT:    vpminuw %xmm2, %xmm4, %xmm2
3924 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
3925 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3926 ; AVX1-NEXT:    retq
3927 ;
3928 ; AVX2-LABEL: test109:
3929 ; AVX2:       # BB#0: # %entry
3930 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
3931 ; AVX2-NEXT:    vpminuw %ymm3, %ymm1, %ymm1
3932 ; AVX2-NEXT:    retq
3933 ;
3934 ; AVX512BW-LABEL: test109:
3935 ; AVX512BW:       # BB#0: # %entry
3936 ; AVX512BW-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
3937 ; AVX512BW-NEXT:    retq
3938 entry:
3939   %cmp = icmp ult <32 x i16> %a, %b
3940   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
3941   ret <32 x i16> %sel
3942 }
3943
3944 define <32 x i16> @test110(<32 x i16> %a, <32 x i16> %b) {
3945 ; SSE2-LABEL: test110:
3946 ; SSE2:       # BB#0: # %entry
3947 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
3948 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
3949 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
3950 ; SSE2-NEXT:    psubusw %xmm7, %xmm3
3951 ; SSE2-NEXT:    pxor %xmm12, %xmm12
3952 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm3
3953 ; SSE2-NEXT:    psubusw %xmm6, %xmm2
3954 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm2
3955 ; SSE2-NEXT:    psubusw %xmm5, %xmm1
3956 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm1
3957 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
3958 ; SSE2-NEXT:    psubusw %xmm4, %xmm11
3959 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm11
3960 ; SSE2-NEXT:    pand %xmm11, %xmm0
3961 ; SSE2-NEXT:    pandn %xmm4, %xmm11
3962 ; SSE2-NEXT:    por %xmm0, %xmm11
3963 ; SSE2-NEXT:    pand %xmm1, %xmm10
3964 ; SSE2-NEXT:    pandn %xmm5, %xmm1
3965 ; SSE2-NEXT:    por %xmm10, %xmm1
3966 ; SSE2-NEXT:    pand %xmm2, %xmm9
3967 ; SSE2-NEXT:    pandn %xmm6, %xmm2
3968 ; SSE2-NEXT:    por %xmm9, %xmm2
3969 ; SSE2-NEXT:    pand %xmm3, %xmm8
3970 ; SSE2-NEXT:    pandn %xmm7, %xmm3
3971 ; SSE2-NEXT:    por %xmm8, %xmm3
3972 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
3973 ; SSE2-NEXT:    retq
3974 ;
3975 ; SSE4-LABEL: test110:
3976 ; SSE4:       # BB#0: # %entry
3977 ; SSE4-NEXT:    pminuw %xmm4, %xmm0
3978 ; SSE4-NEXT:    pminuw %xmm5, %xmm1
3979 ; SSE4-NEXT:    pminuw %xmm6, %xmm2
3980 ; SSE4-NEXT:    pminuw %xmm7, %xmm3
3981 ; SSE4-NEXT:    retq
3982 ;
3983 ; AVX1-LABEL: test110:
3984 ; AVX1:       # BB#0: # %entry
3985 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
3986 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
3987 ; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
3988 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
3989 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
3990 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
3991 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3992 ; AVX1-NEXT:    vpminuw %xmm2, %xmm4, %xmm2
3993 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
3994 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3995 ; AVX1-NEXT:    retq
3996 ;
3997 ; AVX2-LABEL: test110:
3998 ; AVX2:       # BB#0: # %entry
3999 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
4000 ; AVX2-NEXT:    vpminuw %ymm3, %ymm1, %ymm1
4001 ; AVX2-NEXT:    retq
4002 ;
4003 ; AVX512BW-LABEL: test110:
4004 ; AVX512BW:       # BB#0: # %entry
4005 ; AVX512BW-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
4006 ; AVX512BW-NEXT:    retq
4007 entry:
4008   %cmp = icmp ule <32 x i16> %a, %b
4009   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
4010   ret <32 x i16> %sel
4011 }
4012
4013 define <32 x i16> @test111(<32 x i16> %a, <32 x i16> %b) {
4014 ; SSE2-LABEL: test111:
4015 ; SSE2:       # BB#0: # %entry
4016 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [32768,32768,32768,32768,32768,32768,32768,32768]
4017 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
4018 ; SSE2-NEXT:    pxor %xmm11, %xmm9
4019 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4020 ; SSE2-NEXT:    pxor %xmm11, %xmm8
4021 ; SSE2-NEXT:    pcmpgtw %xmm9, %xmm8
4022 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
4023 ; SSE2-NEXT:    pxor %xmm11, %xmm10
4024 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4025 ; SSE2-NEXT:    pxor %xmm11, %xmm9
4026 ; SSE2-NEXT:    pcmpgtw %xmm10, %xmm9
4027 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
4028 ; SSE2-NEXT:    pxor %xmm11, %xmm12
4029 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
4030 ; SSE2-NEXT:    pxor %xmm11, %xmm10
4031 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm10
4032 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
4033 ; SSE2-NEXT:    pxor %xmm11, %xmm12
4034 ; SSE2-NEXT:    pxor %xmm0, %xmm11
4035 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm11
4036 ; SSE2-NEXT:    pand %xmm11, %xmm0
4037 ; SSE2-NEXT:    pandn %xmm4, %xmm11
4038 ; SSE2-NEXT:    por %xmm11, %xmm0
4039 ; SSE2-NEXT:    pand %xmm10, %xmm1
4040 ; SSE2-NEXT:    pandn %xmm5, %xmm10
4041 ; SSE2-NEXT:    por %xmm1, %xmm10
4042 ; SSE2-NEXT:    pand %xmm9, %xmm2
4043 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4044 ; SSE2-NEXT:    por %xmm2, %xmm9
4045 ; SSE2-NEXT:    pand %xmm8, %xmm3
4046 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4047 ; SSE2-NEXT:    por %xmm3, %xmm8
4048 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
4049 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
4050 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
4051 ; SSE2-NEXT:    retq
4052 ;
4053 ; SSE4-LABEL: test111:
4054 ; SSE4:       # BB#0: # %entry
4055 ; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
4056 ; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
4057 ; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
4058 ; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
4059 ; SSE4-NEXT:    retq
4060 ;
4061 ; AVX1-LABEL: test111:
4062 ; AVX1:       # BB#0: # %entry
4063 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4064 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4065 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
4066 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
4067 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4068 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4069 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4070 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm4, %xmm2
4071 ; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
4072 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4073 ; AVX1-NEXT:    retq
4074 ;
4075 ; AVX2-LABEL: test111:
4076 ; AVX2:       # BB#0: # %entry
4077 ; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
4078 ; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
4079 ; AVX2-NEXT:    retq
4080 ;
4081 ; AVX512BW-LABEL: test111:
4082 ; AVX512BW:       # BB#0: # %entry
4083 ; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
4084 ; AVX512BW-NEXT:    retq
4085 entry:
4086   %cmp = icmp ugt <32 x i16> %a, %b
4087   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
4088   ret <32 x i16> %sel
4089 }
4090
4091 define <32 x i16> @test112(<32 x i16> %a, <32 x i16> %b) {
4092 ; SSE2-LABEL: test112:
4093 ; SSE2:       # BB#0: # %entry
4094 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
4095 ; SSE2-NEXT:    psubusw %xmm3, %xmm8
4096 ; SSE2-NEXT:    pxor %xmm9, %xmm9
4097 ; SSE2-NEXT:    pcmpeqw %xmm9, %xmm8
4098 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
4099 ; SSE2-NEXT:    psubusw %xmm2, %xmm10
4100 ; SSE2-NEXT:    pcmpeqw %xmm9, %xmm10
4101 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
4102 ; SSE2-NEXT:    psubusw %xmm1, %xmm11
4103 ; SSE2-NEXT:    pcmpeqw %xmm9, %xmm11
4104 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
4105 ; SSE2-NEXT:    psubusw %xmm0, %xmm12
4106 ; SSE2-NEXT:    pcmpeqw %xmm9, %xmm12
4107 ; SSE2-NEXT:    pand %xmm12, %xmm0
4108 ; SSE2-NEXT:    pandn %xmm4, %xmm12
4109 ; SSE2-NEXT:    por %xmm12, %xmm0
4110 ; SSE2-NEXT:    pand %xmm11, %xmm1
4111 ; SSE2-NEXT:    pandn %xmm5, %xmm11
4112 ; SSE2-NEXT:    por %xmm11, %xmm1
4113 ; SSE2-NEXT:    pand %xmm10, %xmm2
4114 ; SSE2-NEXT:    pandn %xmm6, %xmm10
4115 ; SSE2-NEXT:    por %xmm10, %xmm2
4116 ; SSE2-NEXT:    pand %xmm8, %xmm3
4117 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4118 ; SSE2-NEXT:    por %xmm8, %xmm3
4119 ; SSE2-NEXT:    retq
4120 ;
4121 ; SSE4-LABEL: test112:
4122 ; SSE4:       # BB#0: # %entry
4123 ; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
4124 ; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
4125 ; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
4126 ; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
4127 ; SSE4-NEXT:    retq
4128 ;
4129 ; AVX1-LABEL: test112:
4130 ; AVX1:       # BB#0: # %entry
4131 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4132 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4133 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
4134 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
4135 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4136 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4137 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4138 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm4, %xmm2
4139 ; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
4140 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4141 ; AVX1-NEXT:    retq
4142 ;
4143 ; AVX2-LABEL: test112:
4144 ; AVX2:       # BB#0: # %entry
4145 ; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
4146 ; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
4147 ; AVX2-NEXT:    retq
4148 ;
4149 ; AVX512BW-LABEL: test112:
4150 ; AVX512BW:       # BB#0: # %entry
4151 ; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
4152 ; AVX512BW-NEXT:    retq
4153 entry:
4154   %cmp = icmp uge <32 x i16> %a, %b
4155   %sel = select <32 x i1> %cmp, <32 x i16> %a, <32 x i16> %b
4156   ret <32 x i16> %sel
4157 }
4158
4159 define <16 x i32> @test113(<16 x i32> %a, <16 x i32> %b) {
4160 ; SSE2-LABEL: test113:
4161 ; SSE2:       # BB#0: # %entry
4162 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
4163 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm8
4164 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
4165 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm9
4166 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
4167 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
4168 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
4169 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm11
4170 ; SSE2-NEXT:    pand %xmm11, %xmm0
4171 ; SSE2-NEXT:    pandn %xmm4, %xmm11
4172 ; SSE2-NEXT:    por %xmm11, %xmm0
4173 ; SSE2-NEXT:    pand %xmm10, %xmm1
4174 ; SSE2-NEXT:    pandn %xmm5, %xmm10
4175 ; SSE2-NEXT:    por %xmm10, %xmm1
4176 ; SSE2-NEXT:    pand %xmm9, %xmm2
4177 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4178 ; SSE2-NEXT:    por %xmm9, %xmm2
4179 ; SSE2-NEXT:    pand %xmm8, %xmm3
4180 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4181 ; SSE2-NEXT:    por %xmm8, %xmm3
4182 ; SSE2-NEXT:    retq
4183 ;
4184 ; SSE4-LABEL: test113:
4185 ; SSE4:       # BB#0: # %entry
4186 ; SSE4-NEXT:    pminsd %xmm4, %xmm0
4187 ; SSE4-NEXT:    pminsd %xmm5, %xmm1
4188 ; SSE4-NEXT:    pminsd %xmm6, %xmm2
4189 ; SSE4-NEXT:    pminsd %xmm7, %xmm3
4190 ; SSE4-NEXT:    retq
4191 ;
4192 ; AVX1-LABEL: test113:
4193 ; AVX1:       # BB#0: # %entry
4194 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4195 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4196 ; AVX1-NEXT:    vpminsd %xmm4, %xmm5, %xmm4
4197 ; AVX1-NEXT:    vpminsd %xmm2, %xmm0, %xmm0
4198 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4199 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4200 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4201 ; AVX1-NEXT:    vpminsd %xmm2, %xmm4, %xmm2
4202 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm1
4203 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4204 ; AVX1-NEXT:    retq
4205 ;
4206 ; AVX2-LABEL: test113:
4207 ; AVX2:       # BB#0: # %entry
4208 ; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
4209 ; AVX2-NEXT:    vpminsd %ymm3, %ymm1, %ymm1
4210 ; AVX2-NEXT:    retq
4211 ;
4212 ; AVX512F-LABEL: test113:
4213 ; AVX512F:       # BB#0: # %entry
4214 ; AVX512F-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
4215 ; AVX512F-NEXT:    retq
4216 entry:
4217   %cmp = icmp slt <16 x i32> %a, %b
4218   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4219   ret <16 x i32> %sel
4220 }
4221
4222 define <16 x i32> @test114(<16 x i32> %a, <16 x i32> %b) {
4223 ; SSE2-LABEL: test114:
4224 ; SSE2:       # BB#0: # %entry
4225 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4226 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4227 ; SSE2-NEXT:    movdqa %xmm8, %xmm12
4228 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm12
4229 ; SSE2-NEXT:    pcmpeqd %xmm13, %xmm13
4230 ; SSE2-NEXT:    movdqa %xmm12, %xmm3
4231 ; SSE2-NEXT:    pxor %xmm13, %xmm3
4232 ; SSE2-NEXT:    movdqa %xmm9, %xmm14
4233 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm14
4234 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4235 ; SSE2-NEXT:    pxor %xmm13, %xmm2
4236 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
4237 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm15
4238 ; SSE2-NEXT:    movdqa %xmm15, %xmm10
4239 ; SSE2-NEXT:    pxor %xmm13, %xmm10
4240 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
4241 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
4242 ; SSE2-NEXT:    pxor %xmm11, %xmm13
4243 ; SSE2-NEXT:    pandn %xmm0, %xmm11
4244 ; SSE2-NEXT:    pandn %xmm4, %xmm13
4245 ; SSE2-NEXT:    por %xmm13, %xmm11
4246 ; SSE2-NEXT:    pandn %xmm1, %xmm15
4247 ; SSE2-NEXT:    pandn %xmm5, %xmm10
4248 ; SSE2-NEXT:    por %xmm15, %xmm10
4249 ; SSE2-NEXT:    pandn %xmm9, %xmm14
4250 ; SSE2-NEXT:    pandn %xmm6, %xmm2
4251 ; SSE2-NEXT:    por %xmm14, %xmm2
4252 ; SSE2-NEXT:    pandn %xmm8, %xmm12
4253 ; SSE2-NEXT:    pandn %xmm7, %xmm3
4254 ; SSE2-NEXT:    por %xmm12, %xmm3
4255 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
4256 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
4257 ; SSE2-NEXT:    retq
4258 ;
4259 ; SSE4-LABEL: test114:
4260 ; SSE4:       # BB#0: # %entry
4261 ; SSE4-NEXT:    pminsd %xmm4, %xmm0
4262 ; SSE4-NEXT:    pminsd %xmm5, %xmm1
4263 ; SSE4-NEXT:    pminsd %xmm6, %xmm2
4264 ; SSE4-NEXT:    pminsd %xmm7, %xmm3
4265 ; SSE4-NEXT:    retq
4266 ;
4267 ; AVX1-LABEL: test114:
4268 ; AVX1:       # BB#0: # %entry
4269 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4270 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4271 ; AVX1-NEXT:    vpminsd %xmm4, %xmm5, %xmm4
4272 ; AVX1-NEXT:    vpminsd %xmm2, %xmm0, %xmm0
4273 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4274 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4275 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4276 ; AVX1-NEXT:    vpminsd %xmm2, %xmm4, %xmm2
4277 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm1
4278 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4279 ; AVX1-NEXT:    retq
4280 ;
4281 ; AVX2-LABEL: test114:
4282 ; AVX2:       # BB#0: # %entry
4283 ; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
4284 ; AVX2-NEXT:    vpminsd %ymm3, %ymm1, %ymm1
4285 ; AVX2-NEXT:    retq
4286 ;
4287 ; AVX512F-LABEL: test114:
4288 ; AVX512F:       # BB#0: # %entry
4289 ; AVX512F-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
4290 ; AVX512F-NEXT:    retq
4291 entry:
4292   %cmp = icmp sle <16 x i32> %a, %b
4293   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4294   ret <16 x i32> %sel
4295 }
4296
4297 define <16 x i32> @test115(<16 x i32> %a, <16 x i32> %b) {
4298 ; SSE2-LABEL: test115:
4299 ; SSE2:       # BB#0: # %entry
4300 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4301 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
4302 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4303 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm9
4304 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
4305 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm10
4306 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
4307 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
4308 ; SSE2-NEXT:    pand %xmm11, %xmm0
4309 ; SSE2-NEXT:    pandn %xmm4, %xmm11
4310 ; SSE2-NEXT:    por %xmm0, %xmm11
4311 ; SSE2-NEXT:    pand %xmm10, %xmm1
4312 ; SSE2-NEXT:    pandn %xmm5, %xmm10
4313 ; SSE2-NEXT:    por %xmm1, %xmm10
4314 ; SSE2-NEXT:    pand %xmm9, %xmm2
4315 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4316 ; SSE2-NEXT:    por %xmm2, %xmm9
4317 ; SSE2-NEXT:    pand %xmm3, %xmm8
4318 ; SSE2-NEXT:    pandn %xmm7, %xmm3
4319 ; SSE2-NEXT:    por %xmm8, %xmm3
4320 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
4321 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
4322 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
4323 ; SSE2-NEXT:    retq
4324 ;
4325 ; SSE4-LABEL: test115:
4326 ; SSE4:       # BB#0: # %entry
4327 ; SSE4-NEXT:    pmaxsd %xmm4, %xmm0
4328 ; SSE4-NEXT:    pmaxsd %xmm5, %xmm1
4329 ; SSE4-NEXT:    pmaxsd %xmm6, %xmm2
4330 ; SSE4-NEXT:    pmaxsd %xmm7, %xmm3
4331 ; SSE4-NEXT:    retq
4332 ;
4333 ; AVX1-LABEL: test115:
4334 ; AVX1:       # BB#0: # %entry
4335 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4336 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4337 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm5, %xmm4
4338 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
4339 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4340 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4341 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4342 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
4343 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
4344 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4345 ; AVX1-NEXT:    retq
4346 ;
4347 ; AVX2-LABEL: test115:
4348 ; AVX2:       # BB#0: # %entry
4349 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
4350 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
4351 ; AVX2-NEXT:    retq
4352 ;
4353 ; AVX512F-LABEL: test115:
4354 ; AVX512F:       # BB#0: # %entry
4355 ; AVX512F-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
4356 ; AVX512F-NEXT:    retq
4357 entry:
4358   %cmp = icmp sgt <16 x i32> %a, %b
4359   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4360   ret <16 x i32> %sel
4361 }
4362
4363 define <16 x i32> @test116(<16 x i32> %a, <16 x i32> %b) {
4364 ; SSE2-LABEL: test116:
4365 ; SSE2:       # BB#0: # %entry
4366 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4367 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4368 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
4369 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
4370 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm12
4371 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
4372 ; SSE2-NEXT:    movdqa %xmm12, %xmm3
4373 ; SSE2-NEXT:    pxor %xmm0, %xmm3
4374 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
4375 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm13
4376 ; SSE2-NEXT:    movdqa %xmm13, %xmm2
4377 ; SSE2-NEXT:    pxor %xmm0, %xmm2
4378 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
4379 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm14
4380 ; SSE2-NEXT:    movdqa %xmm14, %xmm11
4381 ; SSE2-NEXT:    pxor %xmm0, %xmm11
4382 ; SSE2-NEXT:    movdqa %xmm4, %xmm15
4383 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm15
4384 ; SSE2-NEXT:    pxor %xmm15, %xmm0
4385 ; SSE2-NEXT:    pandn %xmm10, %xmm15
4386 ; SSE2-NEXT:    pandn %xmm4, %xmm0
4387 ; SSE2-NEXT:    por %xmm15, %xmm0
4388 ; SSE2-NEXT:    pandn %xmm1, %xmm14
4389 ; SSE2-NEXT:    pandn %xmm5, %xmm11
4390 ; SSE2-NEXT:    por %xmm14, %xmm11
4391 ; SSE2-NEXT:    pandn %xmm9, %xmm13
4392 ; SSE2-NEXT:    pandn %xmm6, %xmm2
4393 ; SSE2-NEXT:    por %xmm13, %xmm2
4394 ; SSE2-NEXT:    pandn %xmm8, %xmm12
4395 ; SSE2-NEXT:    pandn %xmm7, %xmm3
4396 ; SSE2-NEXT:    por %xmm12, %xmm3
4397 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
4398 ; SSE2-NEXT:    retq
4399 ;
4400 ; SSE4-LABEL: test116:
4401 ; SSE4:       # BB#0: # %entry
4402 ; SSE4-NEXT:    pmaxsd %xmm4, %xmm0
4403 ; SSE4-NEXT:    pmaxsd %xmm5, %xmm1
4404 ; SSE4-NEXT:    pmaxsd %xmm6, %xmm2
4405 ; SSE4-NEXT:    pmaxsd %xmm7, %xmm3
4406 ; SSE4-NEXT:    retq
4407 ;
4408 ; AVX1-LABEL: test116:
4409 ; AVX1:       # BB#0: # %entry
4410 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4411 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4412 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm5, %xmm4
4413 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
4414 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4415 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4416 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4417 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
4418 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
4419 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4420 ; AVX1-NEXT:    retq
4421 ;
4422 ; AVX2-LABEL: test116:
4423 ; AVX2:       # BB#0: # %entry
4424 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
4425 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
4426 ; AVX2-NEXT:    retq
4427 ;
4428 ; AVX512F-LABEL: test116:
4429 ; AVX512F:       # BB#0: # %entry
4430 ; AVX512F-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
4431 ; AVX512F-NEXT:    retq
4432 entry:
4433   %cmp = icmp sge <16 x i32> %a, %b
4434   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4435   ret <16 x i32> %sel
4436 }
4437
4438 define <16 x i32> @test117(<16 x i32> %a, <16 x i32> %b) {
4439 ; SSE2-LABEL: test117:
4440 ; SSE2:       # BB#0: # %entry
4441 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
4442 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
4443 ; SSE2-NEXT:    pxor %xmm10, %xmm9
4444 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
4445 ; SSE2-NEXT:    pxor %xmm10, %xmm8
4446 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm8
4447 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
4448 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4449 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
4450 ; SSE2-NEXT:    pxor %xmm10, %xmm9
4451 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm9
4452 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
4453 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4454 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
4455 ; SSE2-NEXT:    pxor %xmm10, %xmm12
4456 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm12
4457 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
4458 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4459 ; SSE2-NEXT:    pxor %xmm4, %xmm10
4460 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm10
4461 ; SSE2-NEXT:    pand %xmm10, %xmm0
4462 ; SSE2-NEXT:    pandn %xmm4, %xmm10
4463 ; SSE2-NEXT:    por %xmm10, %xmm0
4464 ; SSE2-NEXT:    pand %xmm12, %xmm1
4465 ; SSE2-NEXT:    pandn %xmm5, %xmm12
4466 ; SSE2-NEXT:    por %xmm12, %xmm1
4467 ; SSE2-NEXT:    pand %xmm9, %xmm2
4468 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4469 ; SSE2-NEXT:    por %xmm9, %xmm2
4470 ; SSE2-NEXT:    pand %xmm8, %xmm3
4471 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4472 ; SSE2-NEXT:    por %xmm8, %xmm3
4473 ; SSE2-NEXT:    retq
4474 ;
4475 ; SSE4-LABEL: test117:
4476 ; SSE4:       # BB#0: # %entry
4477 ; SSE4-NEXT:    pminud %xmm4, %xmm0
4478 ; SSE4-NEXT:    pminud %xmm5, %xmm1
4479 ; SSE4-NEXT:    pminud %xmm6, %xmm2
4480 ; SSE4-NEXT:    pminud %xmm7, %xmm3
4481 ; SSE4-NEXT:    retq
4482 ;
4483 ; AVX1-LABEL: test117:
4484 ; AVX1:       # BB#0: # %entry
4485 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4486 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4487 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
4488 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
4489 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4490 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4491 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4492 ; AVX1-NEXT:    vpminud %xmm2, %xmm4, %xmm2
4493 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
4494 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4495 ; AVX1-NEXT:    retq
4496 ;
4497 ; AVX2-LABEL: test117:
4498 ; AVX2:       # BB#0: # %entry
4499 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
4500 ; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
4501 ; AVX2-NEXT:    retq
4502 ;
4503 ; AVX512F-LABEL: test117:
4504 ; AVX512F:       # BB#0: # %entry
4505 ; AVX512F-NEXT:    vpminud %zmm1, %zmm0, %zmm0
4506 ; AVX512F-NEXT:    retq
4507 entry:
4508   %cmp = icmp ult <16 x i32> %a, %b
4509   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4510   ret <16 x i32> %sel
4511 }
4512
4513 define <16 x i32> @test118(<16 x i32> %a, <16 x i32> %b) {
4514 ; SSE2-LABEL: test118:
4515 ; SSE2:       # BB#0: # %entry
4516 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
4517 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [2147483648,2147483648,2147483648,2147483648]
4518 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
4519 ; SSE2-NEXT:    pxor %xmm14, %xmm0
4520 ; SSE2-NEXT:    movdqa %xmm3, %xmm12
4521 ; SSE2-NEXT:    pxor %xmm14, %xmm12
4522 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm12
4523 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
4524 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
4525 ; SSE2-NEXT:    pxor %xmm0, %xmm8
4526 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
4527 ; SSE2-NEXT:    pxor %xmm14, %xmm9
4528 ; SSE2-NEXT:    movdqa %xmm2, %xmm13
4529 ; SSE2-NEXT:    pxor %xmm14, %xmm13
4530 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm13
4531 ; SSE2-NEXT:    movdqa %xmm13, %xmm9
4532 ; SSE2-NEXT:    pxor %xmm0, %xmm9
4533 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
4534 ; SSE2-NEXT:    pxor %xmm14, %xmm11
4535 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
4536 ; SSE2-NEXT:    pxor %xmm14, %xmm15
4537 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
4538 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
4539 ; SSE2-NEXT:    pxor %xmm14, %xmm11
4540 ; SSE2-NEXT:    pxor %xmm10, %xmm14
4541 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
4542 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
4543 ; SSE2-NEXT:    pxor %xmm0, %xmm11
4544 ; SSE2-NEXT:    pxor %xmm14, %xmm0
4545 ; SSE2-NEXT:    pandn %xmm10, %xmm14
4546 ; SSE2-NEXT:    pandn %xmm4, %xmm0
4547 ; SSE2-NEXT:    por %xmm14, %xmm0
4548 ; SSE2-NEXT:    pandn %xmm1, %xmm15
4549 ; SSE2-NEXT:    pandn %xmm5, %xmm11
4550 ; SSE2-NEXT:    por %xmm15, %xmm11
4551 ; SSE2-NEXT:    pandn %xmm2, %xmm13
4552 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4553 ; SSE2-NEXT:    por %xmm13, %xmm9
4554 ; SSE2-NEXT:    pandn %xmm3, %xmm12
4555 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4556 ; SSE2-NEXT:    por %xmm12, %xmm8
4557 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
4558 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
4559 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
4560 ; SSE2-NEXT:    retq
4561 ;
4562 ; SSE4-LABEL: test118:
4563 ; SSE4:       # BB#0: # %entry
4564 ; SSE4-NEXT:    pminud %xmm4, %xmm0
4565 ; SSE4-NEXT:    pminud %xmm5, %xmm1
4566 ; SSE4-NEXT:    pminud %xmm6, %xmm2
4567 ; SSE4-NEXT:    pminud %xmm7, %xmm3
4568 ; SSE4-NEXT:    retq
4569 ;
4570 ; AVX1-LABEL: test118:
4571 ; AVX1:       # BB#0: # %entry
4572 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4573 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4574 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
4575 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
4576 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4577 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4578 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4579 ; AVX1-NEXT:    vpminud %xmm2, %xmm4, %xmm2
4580 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
4581 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4582 ; AVX1-NEXT:    retq
4583 ;
4584 ; AVX2-LABEL: test118:
4585 ; AVX2:       # BB#0: # %entry
4586 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
4587 ; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
4588 ; AVX2-NEXT:    retq
4589 ;
4590 ; AVX512F-LABEL: test118:
4591 ; AVX512F:       # BB#0: # %entry
4592 ; AVX512F-NEXT:    vpminud %zmm1, %zmm0, %zmm0
4593 ; AVX512F-NEXT:    retq
4594 entry:
4595   %cmp = icmp ule <16 x i32> %a, %b
4596   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4597   ret <16 x i32> %sel
4598 }
4599
4600 define <16 x i32> @test119(<16 x i32> %a, <16 x i32> %b) {
4601 ; SSE2-LABEL: test119:
4602 ; SSE2:       # BB#0: # %entry
4603 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
4604 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
4605 ; SSE2-NEXT:    pxor %xmm11, %xmm9
4606 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4607 ; SSE2-NEXT:    pxor %xmm11, %xmm8
4608 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm8
4609 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
4610 ; SSE2-NEXT:    pxor %xmm11, %xmm10
4611 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4612 ; SSE2-NEXT:    pxor %xmm11, %xmm9
4613 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
4614 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
4615 ; SSE2-NEXT:    pxor %xmm11, %xmm12
4616 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
4617 ; SSE2-NEXT:    pxor %xmm11, %xmm10
4618 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm10
4619 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
4620 ; SSE2-NEXT:    pxor %xmm11, %xmm12
4621 ; SSE2-NEXT:    pxor %xmm0, %xmm11
4622 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm11
4623 ; SSE2-NEXT:    pand %xmm11, %xmm0
4624 ; SSE2-NEXT:    pandn %xmm4, %xmm11
4625 ; SSE2-NEXT:    por %xmm11, %xmm0
4626 ; SSE2-NEXT:    pand %xmm10, %xmm1
4627 ; SSE2-NEXT:    pandn %xmm5, %xmm10
4628 ; SSE2-NEXT:    por %xmm1, %xmm10
4629 ; SSE2-NEXT:    pand %xmm9, %xmm2
4630 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4631 ; SSE2-NEXT:    por %xmm2, %xmm9
4632 ; SSE2-NEXT:    pand %xmm8, %xmm3
4633 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4634 ; SSE2-NEXT:    por %xmm3, %xmm8
4635 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
4636 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
4637 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
4638 ; SSE2-NEXT:    retq
4639 ;
4640 ; SSE4-LABEL: test119:
4641 ; SSE4:       # BB#0: # %entry
4642 ; SSE4-NEXT:    pmaxud %xmm4, %xmm0
4643 ; SSE4-NEXT:    pmaxud %xmm5, %xmm1
4644 ; SSE4-NEXT:    pmaxud %xmm6, %xmm2
4645 ; SSE4-NEXT:    pmaxud %xmm7, %xmm3
4646 ; SSE4-NEXT:    retq
4647 ;
4648 ; AVX1-LABEL: test119:
4649 ; AVX1:       # BB#0: # %entry
4650 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4651 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4652 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
4653 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
4654 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4655 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4656 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4657 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm2
4658 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
4659 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4660 ; AVX1-NEXT:    retq
4661 ;
4662 ; AVX2-LABEL: test119:
4663 ; AVX2:       # BB#0: # %entry
4664 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
4665 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
4666 ; AVX2-NEXT:    retq
4667 ;
4668 ; AVX512F-LABEL: test119:
4669 ; AVX512F:       # BB#0: # %entry
4670 ; AVX512F-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
4671 ; AVX512F-NEXT:    retq
4672 entry:
4673   %cmp = icmp ugt <16 x i32> %a, %b
4674   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4675   ret <16 x i32> %sel
4676 }
4677
4678 define <16 x i32> @test120(<16 x i32> %a, <16 x i32> %b) {
4679 ; SSE2-LABEL: test120:
4680 ; SSE2:       # BB#0: # %entry
4681 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
4682 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [2147483648,2147483648,2147483648,2147483648]
4683 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
4684 ; SSE2-NEXT:    pxor %xmm14, %xmm0
4685 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
4686 ; SSE2-NEXT:    pxor %xmm14, %xmm12
4687 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm12
4688 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
4689 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
4690 ; SSE2-NEXT:    pxor %xmm0, %xmm8
4691 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
4692 ; SSE2-NEXT:    pxor %xmm14, %xmm9
4693 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
4694 ; SSE2-NEXT:    pxor %xmm14, %xmm13
4695 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm13
4696 ; SSE2-NEXT:    movdqa %xmm13, %xmm9
4697 ; SSE2-NEXT:    pxor %xmm0, %xmm9
4698 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
4699 ; SSE2-NEXT:    pxor %xmm14, %xmm11
4700 ; SSE2-NEXT:    movdqa %xmm5, %xmm15
4701 ; SSE2-NEXT:    pxor %xmm14, %xmm15
4702 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
4703 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
4704 ; SSE2-NEXT:    pxor %xmm14, %xmm11
4705 ; SSE2-NEXT:    pxor %xmm4, %xmm14
4706 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
4707 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
4708 ; SSE2-NEXT:    pxor %xmm0, %xmm11
4709 ; SSE2-NEXT:    pxor %xmm14, %xmm0
4710 ; SSE2-NEXT:    pandn %xmm10, %xmm14
4711 ; SSE2-NEXT:    pandn %xmm4, %xmm0
4712 ; SSE2-NEXT:    por %xmm14, %xmm0
4713 ; SSE2-NEXT:    pandn %xmm1, %xmm15
4714 ; SSE2-NEXT:    pandn %xmm5, %xmm11
4715 ; SSE2-NEXT:    por %xmm15, %xmm11
4716 ; SSE2-NEXT:    pandn %xmm2, %xmm13
4717 ; SSE2-NEXT:    pandn %xmm6, %xmm9
4718 ; SSE2-NEXT:    por %xmm13, %xmm9
4719 ; SSE2-NEXT:    pandn %xmm3, %xmm12
4720 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4721 ; SSE2-NEXT:    por %xmm12, %xmm8
4722 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
4723 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
4724 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
4725 ; SSE2-NEXT:    retq
4726 ;
4727 ; SSE4-LABEL: test120:
4728 ; SSE4:       # BB#0: # %entry
4729 ; SSE4-NEXT:    pmaxud %xmm4, %xmm0
4730 ; SSE4-NEXT:    pmaxud %xmm5, %xmm1
4731 ; SSE4-NEXT:    pmaxud %xmm6, %xmm2
4732 ; SSE4-NEXT:    pmaxud %xmm7, %xmm3
4733 ; SSE4-NEXT:    retq
4734 ;
4735 ; AVX1-LABEL: test120:
4736 ; AVX1:       # BB#0: # %entry
4737 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
4738 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4739 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
4740 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
4741 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
4742 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
4743 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4744 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm2
4745 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
4746 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4747 ; AVX1-NEXT:    retq
4748 ;
4749 ; AVX2-LABEL: test120:
4750 ; AVX2:       # BB#0: # %entry
4751 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
4752 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
4753 ; AVX2-NEXT:    retq
4754 ;
4755 ; AVX512F-LABEL: test120:
4756 ; AVX512F:       # BB#0: # %entry
4757 ; AVX512F-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
4758 ; AVX512F-NEXT:    retq
4759 entry:
4760   %cmp = icmp uge <16 x i32> %a, %b
4761   %sel = select <16 x i1> %cmp, <16 x i32> %a, <16 x i32> %b
4762   ret <16 x i32> %sel
4763 }
4764
4765 define <8 x i64> @test121(<8 x i64> %a, <8 x i64> %b) {
4766 ; SSE2-LABEL: test121:
4767 ; SSE2:       # BB#0: # %entry
4768 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,0,2147483648,0]
4769 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
4770 ; SSE2-NEXT:    pxor %xmm9, %xmm8
4771 ; SSE2-NEXT:    movdqa %xmm7, %xmm10
4772 ; SSE2-NEXT:    pxor %xmm9, %xmm10
4773 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
4774 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
4775 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
4776 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm10
4777 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
4778 ; SSE2-NEXT:    pand %xmm12, %xmm10
4779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm11[1,1,3,3]
4780 ; SSE2-NEXT:    por %xmm10, %xmm8
4781 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
4782 ; SSE2-NEXT:    pxor %xmm9, %xmm10
4783 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
4784 ; SSE2-NEXT:    pxor %xmm9, %xmm11
4785 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
4786 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm12
4787 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
4788 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
4789 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
4790 ; SSE2-NEXT:    pand %xmm13, %xmm11
4791 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm12[1,1,3,3]
4792 ; SSE2-NEXT:    por %xmm11, %xmm10
4793 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
4794 ; SSE2-NEXT:    pxor %xmm9, %xmm11
4795 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
4796 ; SSE2-NEXT:    pxor %xmm9, %xmm12
4797 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
4798 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
4799 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
4800 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm12
4801 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
4802 ; SSE2-NEXT:    pand %xmm14, %xmm11
4803 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
4804 ; SSE2-NEXT:    por %xmm11, %xmm12
4805 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
4806 ; SSE2-NEXT:    pxor %xmm9, %xmm11
4807 ; SSE2-NEXT:    pxor %xmm4, %xmm9
4808 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
4809 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
4810 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
4811 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
4812 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
4813 ; SSE2-NEXT:    pand %xmm14, %xmm9
4814 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
4815 ; SSE2-NEXT:    por %xmm9, %xmm11
4816 ; SSE2-NEXT:    pand %xmm11, %xmm0
4817 ; SSE2-NEXT:    pandn %xmm4, %xmm11
4818 ; SSE2-NEXT:    por %xmm11, %xmm0
4819 ; SSE2-NEXT:    pand %xmm12, %xmm1
4820 ; SSE2-NEXT:    pandn %xmm5, %xmm12
4821 ; SSE2-NEXT:    por %xmm12, %xmm1
4822 ; SSE2-NEXT:    pand %xmm10, %xmm2
4823 ; SSE2-NEXT:    pandn %xmm6, %xmm10
4824 ; SSE2-NEXT:    por %xmm10, %xmm2
4825 ; SSE2-NEXT:    pand %xmm8, %xmm3
4826 ; SSE2-NEXT:    pandn %xmm7, %xmm8
4827 ; SSE2-NEXT:    por %xmm8, %xmm3
4828 ; SSE2-NEXT:    retq
4829 ;
4830 ; SSE4-LABEL: test121:
4831 ; SSE4:       # BB#0: # %entry
4832 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
4833 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
4834 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm9
4835 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
4836 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm10
4837 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
4838 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm11
4839 ; SSE4-NEXT:    movdqa %xmm4, %xmm0
4840 ; SSE4-NEXT:    pcmpgtq %xmm8, %xmm0
4841 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
4842 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
4843 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
4844 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
4845 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
4846 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
4847 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
4848 ; SSE4-NEXT:    movapd %xmm4, %xmm0
4849 ; SSE4-NEXT:    movapd %xmm5, %xmm1
4850 ; SSE4-NEXT:    movapd %xmm6, %xmm2
4851 ; SSE4-NEXT:    movapd %xmm7, %xmm3
4852 ; SSE4-NEXT:    retq
4853 ;
4854 ; AVX1-LABEL: test121:
4855 ; AVX1:       # BB#0: # %entry
4856 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
4857 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
4858 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
4859 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm5
4860 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
4861 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
4862 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
4863 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
4864 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm6
4865 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
4866 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
4867 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
4868 ; AVX1-NEXT:    retq
4869 ;
4870 ; AVX2-LABEL: test121:
4871 ; AVX2:       # BB#0: # %entry
4872 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm4
4873 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm5
4874 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
4875 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
4876 ; AVX2-NEXT:    retq
4877 ;
4878 ; AVX512F-LABEL: test121:
4879 ; AVX512F:       # BB#0: # %entry
4880 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
4881 ; AVX512F-NEXT:    retq
4882 entry:
4883   %cmp = icmp slt <8 x i64> %a, %b
4884   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
4885   ret <8 x i64> %sel
4886 }
4887
4888 define <8 x i64> @test122(<8 x i64> %a, <8 x i64> %b) {
4889 ; SSE2-LABEL: test122:
4890 ; SSE2:       # BB#0: # %entry
4891 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
4892 ; SSE2-NEXT:    movdqa %xmm8, -{{[0-9]+}}(%rsp) # 16-byte Spill
4893 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
4894 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
4895 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
4896 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
4897 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0]
4898 ; SSE2-NEXT:    pxor %xmm10, %xmm8
4899 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
4900 ; SSE2-NEXT:    pxor %xmm10, %xmm0
4901 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
4902 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
4903 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
4904 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
4905 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4906 ; SSE2-NEXT:    pand %xmm12, %xmm0
4907 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
4908 ; SSE2-NEXT:    por %xmm0, %xmm12
4909 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
4910 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
4911 ; SSE2-NEXT:    pxor %xmm1, %xmm8
4912 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
4913 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4914 ; SSE2-NEXT:    movdqa %xmm3, %xmm13
4915 ; SSE2-NEXT:    pxor %xmm10, %xmm13
4916 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
4917 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
4918 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
4919 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
4920 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
4921 ; SSE2-NEXT:    pand %xmm15, %xmm11
4922 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
4923 ; SSE2-NEXT:    por %xmm11, %xmm13
4924 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
4925 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4926 ; SSE2-NEXT:    movdqa %xmm2, %xmm14
4927 ; SSE2-NEXT:    pxor %xmm10, %xmm14
4928 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
4929 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
4930 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
4931 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
4932 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
4933 ; SSE2-NEXT:    pand %xmm11, %xmm14
4934 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
4935 ; SSE2-NEXT:    por %xmm14, %xmm15
4936 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
4937 ; SSE2-NEXT:    pxor %xmm10, %xmm11
4938 ; SSE2-NEXT:    pxor %xmm9, %xmm10
4939 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
4940 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
4941 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
4942 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
4943 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
4944 ; SSE2-NEXT:    pand %xmm11, %xmm0
4945 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
4946 ; SSE2-NEXT:    pxor %xmm1, %xmm10
4947 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
4948 ; SSE2-NEXT:    por %xmm0, %xmm14
4949 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
4950 ; SSE2-NEXT:    pxor %xmm1, %xmm11
4951 ; SSE2-NEXT:    pxor %xmm14, %xmm1
4952 ; SSE2-NEXT:    pandn %xmm9, %xmm14
4953 ; SSE2-NEXT:    pandn %xmm4, %xmm1
4954 ; SSE2-NEXT:    por %xmm14, %xmm1
4955 ; SSE2-NEXT:    pandn %xmm2, %xmm15
4956 ; SSE2-NEXT:    pandn %xmm5, %xmm11
4957 ; SSE2-NEXT:    por %xmm15, %xmm11
4958 ; SSE2-NEXT:    pandn %xmm3, %xmm13
4959 ; SSE2-NEXT:    pandn %xmm6, %xmm10
4960 ; SSE2-NEXT:    por %xmm13, %xmm10
4961 ; SSE2-NEXT:    pandn %xmm7, %xmm12
4962 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm8 # 16-byte Folded Reload
4963 ; SSE2-NEXT:    por %xmm12, %xmm8
4964 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
4965 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
4966 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
4967 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
4968 ; SSE2-NEXT:    retq
4969 ;
4970 ; SSE4-LABEL: test122:
4971 ; SSE4:       # BB#0: # %entry
4972 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
4973 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
4974 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm9
4975 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
4976 ; SSE4-NEXT:    pxor %xmm12, %xmm9
4977 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
4978 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm10
4979 ; SSE4-NEXT:    pxor %xmm12, %xmm10
4980 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
4981 ; SSE4-NEXT:    pcmpgtq %xmm5, %xmm11
4982 ; SSE4-NEXT:    pxor %xmm12, %xmm11
4983 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
4984 ; SSE4-NEXT:    pxor %xmm12, %xmm0
4985 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
4986 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
4987 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
4988 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
4989 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
4990 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
4991 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
4992 ; SSE4-NEXT:    movapd %xmm4, %xmm0
4993 ; SSE4-NEXT:    movapd %xmm5, %xmm1
4994 ; SSE4-NEXT:    movapd %xmm6, %xmm2
4995 ; SSE4-NEXT:    movapd %xmm7, %xmm3
4996 ; SSE4-NEXT:    retq
4997 ;
4998 ; AVX1-LABEL: test122:
4999 ; AVX1:       # BB#0: # %entry
5000 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5001 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
5002 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
5003 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
5004 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
5005 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm6
5006 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
5007 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5008 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
5009 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
5010 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5011 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
5012 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm7
5013 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm5
5014 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5015 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5016 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5017 ; AVX1-NEXT:    retq
5018 ;
5019 ; AVX2-LABEL: test122:
5020 ; AVX2:       # BB#0: # %entry
5021 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
5022 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
5023 ; AVX2-NEXT:    vpxor %ymm5, %ymm4, %ymm4
5024 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm6
5025 ; AVX2-NEXT:    vpxor %ymm5, %ymm6, %ymm5
5026 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5027 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5028 ; AVX2-NEXT:    retq
5029 ;
5030 ; AVX512F-LABEL: test122:
5031 ; AVX512F:       # BB#0: # %entry
5032 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
5033 ; AVX512F-NEXT:    retq
5034 entry:
5035   %cmp = icmp sle <8 x i64> %a, %b
5036   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5037   ret <8 x i64> %sel
5038 }
5039
5040 define <8 x i64> @test123(<8 x i64> %a, <8 x i64> %b) {
5041 ; SSE2-LABEL: test123:
5042 ; SSE2:       # BB#0: # %entry
5043 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,0,2147483648,0]
5044 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
5045 ; SSE2-NEXT:    pxor %xmm9, %xmm8
5046 ; SSE2-NEXT:    movdqa %xmm3, %xmm10
5047 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5048 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
5049 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5050 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5051 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm10
5052 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
5053 ; SSE2-NEXT:    pand %xmm12, %xmm10
5054 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm11[1,1,3,3]
5055 ; SSE2-NEXT:    por %xmm10, %xmm8
5056 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
5057 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5058 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
5059 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5060 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
5061 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm12
5062 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
5063 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
5064 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
5065 ; SSE2-NEXT:    pand %xmm13, %xmm11
5066 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm12[1,1,3,3]
5067 ; SSE2-NEXT:    por %xmm11, %xmm10
5068 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
5069 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5070 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
5071 ; SSE2-NEXT:    pxor %xmm9, %xmm12
5072 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
5073 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5074 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5075 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm12
5076 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
5077 ; SSE2-NEXT:    pand %xmm14, %xmm11
5078 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
5079 ; SSE2-NEXT:    por %xmm11, %xmm12
5080 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
5081 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5082 ; SSE2-NEXT:    pxor %xmm0, %xmm9
5083 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
5084 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5085 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5086 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
5087 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
5088 ; SSE2-NEXT:    pand %xmm14, %xmm9
5089 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5090 ; SSE2-NEXT:    por %xmm9, %xmm11
5091 ; SSE2-NEXT:    pand %xmm11, %xmm0
5092 ; SSE2-NEXT:    pandn %xmm4, %xmm11
5093 ; SSE2-NEXT:    por %xmm11, %xmm0
5094 ; SSE2-NEXT:    pand %xmm12, %xmm1
5095 ; SSE2-NEXT:    pandn %xmm5, %xmm12
5096 ; SSE2-NEXT:    por %xmm12, %xmm1
5097 ; SSE2-NEXT:    pand %xmm10, %xmm2
5098 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5099 ; SSE2-NEXT:    por %xmm10, %xmm2
5100 ; SSE2-NEXT:    pand %xmm8, %xmm3
5101 ; SSE2-NEXT:    pandn %xmm7, %xmm8
5102 ; SSE2-NEXT:    por %xmm8, %xmm3
5103 ; SSE2-NEXT:    retq
5104 ;
5105 ; SSE4-LABEL: test123:
5106 ; SSE4:       # BB#0: # %entry
5107 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
5108 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
5109 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm9
5110 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
5111 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm10
5112 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
5113 ; SSE4-NEXT:    pcmpgtq %xmm5, %xmm11
5114 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
5115 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
5116 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5117 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5118 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5119 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5120 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
5121 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5122 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5123 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5124 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5125 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5126 ; SSE4-NEXT:    retq
5127 ;
5128 ; AVX1-LABEL: test123:
5129 ; AVX1:       # BB#0: # %entry
5130 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5131 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
5132 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
5133 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm5
5134 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
5135 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
5136 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
5137 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
5138 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm6
5139 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
5140 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5141 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5142 ; AVX1-NEXT:    retq
5143 ;
5144 ; AVX2-LABEL: test123:
5145 ; AVX2:       # BB#0: # %entry
5146 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
5147 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm5
5148 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5149 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5150 ; AVX2-NEXT:    retq
5151 ;
5152 ; AVX512F-LABEL: test123:
5153 ; AVX512F:       # BB#0: # %entry
5154 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
5155 ; AVX512F-NEXT:    retq
5156 entry:
5157   %cmp = icmp sgt <8 x i64> %a, %b
5158   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5159   ret <8 x i64> %sel
5160 }
5161
5162 define <8 x i64> @test124(<8 x i64> %a, <8 x i64> %b) {
5163 ; SSE2-LABEL: test124:
5164 ; SSE2:       # BB#0: # %entry
5165 ; SSE2-NEXT:    movdqa %xmm7, %xmm11
5166 ; SSE2-NEXT:    movdqa %xmm11, -{{[0-9]+}}(%rsp) # 16-byte Spill
5167 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
5168 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
5169 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
5170 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
5171 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0]
5172 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
5173 ; SSE2-NEXT:    pxor %xmm10, %xmm8
5174 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
5175 ; SSE2-NEXT:    pxor %xmm10, %xmm0
5176 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
5177 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5178 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5179 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
5180 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
5181 ; SSE2-NEXT:    pand %xmm12, %xmm0
5182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
5183 ; SSE2-NEXT:    por %xmm0, %xmm12
5184 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
5185 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
5186 ; SSE2-NEXT:    pxor %xmm1, %xmm8
5187 ; SSE2-NEXT:    movdqa %xmm3, %xmm11
5188 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5189 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
5190 ; SSE2-NEXT:    pxor %xmm10, %xmm13
5191 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
5192 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5193 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
5194 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
5195 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5196 ; SSE2-NEXT:    pand %xmm15, %xmm11
5197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
5198 ; SSE2-NEXT:    por %xmm11, %xmm13
5199 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
5200 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5201 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
5202 ; SSE2-NEXT:    pxor %xmm10, %xmm14
5203 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
5204 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
5205 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
5206 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
5207 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5208 ; SSE2-NEXT:    pand %xmm11, %xmm14
5209 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
5210 ; SSE2-NEXT:    por %xmm14, %xmm15
5211 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
5212 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5213 ; SSE2-NEXT:    pxor %xmm4, %xmm10
5214 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
5215 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5216 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
5217 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
5218 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
5219 ; SSE2-NEXT:    pand %xmm11, %xmm0
5220 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
5221 ; SSE2-NEXT:    pxor %xmm1, %xmm10
5222 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5223 ; SSE2-NEXT:    por %xmm0, %xmm14
5224 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
5225 ; SSE2-NEXT:    pxor %xmm1, %xmm11
5226 ; SSE2-NEXT:    pxor %xmm14, %xmm1
5227 ; SSE2-NEXT:    pandn %xmm9, %xmm14
5228 ; SSE2-NEXT:    pandn %xmm4, %xmm1
5229 ; SSE2-NEXT:    por %xmm14, %xmm1
5230 ; SSE2-NEXT:    pandn %xmm2, %xmm15
5231 ; SSE2-NEXT:    pandn %xmm5, %xmm11
5232 ; SSE2-NEXT:    por %xmm15, %xmm11
5233 ; SSE2-NEXT:    pandn %xmm3, %xmm13
5234 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5235 ; SSE2-NEXT:    por %xmm13, %xmm10
5236 ; SSE2-NEXT:    pandn %xmm7, %xmm12
5237 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm8 # 16-byte Folded Reload
5238 ; SSE2-NEXT:    por %xmm12, %xmm8
5239 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5240 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
5241 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
5242 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
5243 ; SSE2-NEXT:    retq
5244 ;
5245 ; SSE4-LABEL: test124:
5246 ; SSE4:       # BB#0: # %entry
5247 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
5248 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
5249 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm9
5250 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
5251 ; SSE4-NEXT:    pxor %xmm0, %xmm9
5252 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
5253 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm10
5254 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5255 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
5256 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm11
5257 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5258 ; SSE4-NEXT:    movdqa %xmm4, %xmm12
5259 ; SSE4-NEXT:    pcmpgtq %xmm8, %xmm12
5260 ; SSE4-NEXT:    pxor %xmm12, %xmm0
5261 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
5262 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5263 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5264 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5265 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5266 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
5267 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5268 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5269 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5270 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5271 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5272 ; SSE4-NEXT:    retq
5273 ;
5274 ; AVX1-LABEL: test124:
5275 ; AVX1:       # BB#0: # %entry
5276 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
5277 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
5278 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
5279 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
5280 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
5281 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm6
5282 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
5283 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5284 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
5285 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
5286 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5287 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
5288 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm7
5289 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm5
5290 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5291 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5292 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5293 ; AVX1-NEXT:    retq
5294 ;
5295 ; AVX2-LABEL: test124:
5296 ; AVX2:       # BB#0: # %entry
5297 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm4
5298 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
5299 ; AVX2-NEXT:    vpxor %ymm5, %ymm4, %ymm4
5300 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm6
5301 ; AVX2-NEXT:    vpxor %ymm5, %ymm6, %ymm5
5302 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5303 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5304 ; AVX2-NEXT:    retq
5305 ;
5306 ; AVX512F-LABEL: test124:
5307 ; AVX512F:       # BB#0: # %entry
5308 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
5309 ; AVX512F-NEXT:    retq
5310 entry:
5311   %cmp = icmp sge <8 x i64> %a, %b
5312   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5313   ret <8 x i64> %sel
5314 }
5315
5316 define <8 x i64> @test125(<8 x i64> %a, <8 x i64> %b) {
5317 ; SSE2-LABEL: test125:
5318 ; SSE2:       # BB#0: # %entry
5319 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
5320 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
5321 ; SSE2-NEXT:    pxor %xmm9, %xmm8
5322 ; SSE2-NEXT:    movdqa %xmm7, %xmm10
5323 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5324 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
5325 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5326 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5327 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm10
5328 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
5329 ; SSE2-NEXT:    pand %xmm12, %xmm10
5330 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm11[1,1,3,3]
5331 ; SSE2-NEXT:    por %xmm10, %xmm8
5332 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
5333 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5334 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
5335 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5336 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
5337 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm12
5338 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
5339 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
5340 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
5341 ; SSE2-NEXT:    pand %xmm13, %xmm11
5342 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm12[1,1,3,3]
5343 ; SSE2-NEXT:    por %xmm11, %xmm10
5344 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
5345 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5346 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
5347 ; SSE2-NEXT:    pxor %xmm9, %xmm12
5348 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
5349 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5350 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5351 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm12
5352 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
5353 ; SSE2-NEXT:    pand %xmm14, %xmm11
5354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
5355 ; SSE2-NEXT:    por %xmm11, %xmm12
5356 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
5357 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5358 ; SSE2-NEXT:    pxor %xmm4, %xmm9
5359 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
5360 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5361 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5362 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
5363 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
5364 ; SSE2-NEXT:    pand %xmm14, %xmm9
5365 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5366 ; SSE2-NEXT:    por %xmm9, %xmm11
5367 ; SSE2-NEXT:    pand %xmm11, %xmm0
5368 ; SSE2-NEXT:    pandn %xmm4, %xmm11
5369 ; SSE2-NEXT:    por %xmm11, %xmm0
5370 ; SSE2-NEXT:    pand %xmm12, %xmm1
5371 ; SSE2-NEXT:    pandn %xmm5, %xmm12
5372 ; SSE2-NEXT:    por %xmm12, %xmm1
5373 ; SSE2-NEXT:    pand %xmm10, %xmm2
5374 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5375 ; SSE2-NEXT:    por %xmm10, %xmm2
5376 ; SSE2-NEXT:    pand %xmm8, %xmm3
5377 ; SSE2-NEXT:    pandn %xmm7, %xmm8
5378 ; SSE2-NEXT:    por %xmm8, %xmm3
5379 ; SSE2-NEXT:    retq
5380 ;
5381 ; SSE4-LABEL: test125:
5382 ; SSE4:       # BB#0: # %entry
5383 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
5384 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
5385 ; SSE4-NEXT:    movdqa %xmm3, %xmm10
5386 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5387 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
5388 ; SSE4-NEXT:    pxor %xmm0, %xmm9
5389 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
5390 ; SSE4-NEXT:    movdqa %xmm2, %xmm11
5391 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5392 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
5393 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5394 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
5395 ; SSE4-NEXT:    movdqa %xmm1, %xmm12
5396 ; SSE4-NEXT:    pxor %xmm0, %xmm12
5397 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
5398 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5399 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm11
5400 ; SSE4-NEXT:    movdqa %xmm8, %xmm12
5401 ; SSE4-NEXT:    pxor %xmm0, %xmm12
5402 ; SSE4-NEXT:    pxor %xmm4, %xmm0
5403 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm0
5404 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
5405 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5406 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5407 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5408 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5409 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
5410 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5411 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5412 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5413 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5414 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5415 ; SSE4-NEXT:    retq
5416 ;
5417 ; AVX1-LABEL: test125:
5418 ; AVX1:       # BB#0: # %entry
5419 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
5420 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
5421 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
5422 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
5423 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5424 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
5425 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm6
5426 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm7
5427 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5428 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5429 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
5430 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5431 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
5432 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
5433 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5434 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm7
5435 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm5
5436 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
5437 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5438 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5439 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5440 ; AVX1-NEXT:    retq
5441 ;
5442 ; AVX2-LABEL: test125:
5443 ; AVX2:       # BB#0: # %entry
5444 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
5445 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
5446 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm6
5447 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
5448 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
5449 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm4
5450 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm4, %ymm4
5451 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
5452 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
5453 ; AVX2-NEXT:    retq
5454 ;
5455 ; AVX512F-LABEL: test125:
5456 ; AVX512F:       # BB#0: # %entry
5457 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
5458 ; AVX512F-NEXT:    retq
5459 entry:
5460   %cmp = icmp ult <8 x i64> %a, %b
5461   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5462   ret <8 x i64> %sel
5463 }
5464
5465 define <8 x i64> @test126(<8 x i64> %a, <8 x i64> %b) {
5466 ; SSE2-LABEL: test126:
5467 ; SSE2:       # BB#0: # %entry
5468 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
5469 ; SSE2-NEXT:    movdqa %xmm8, -{{[0-9]+}}(%rsp) # 16-byte Spill
5470 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
5471 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
5472 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
5473 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
5474 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
5475 ; SSE2-NEXT:    pxor %xmm10, %xmm8
5476 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
5477 ; SSE2-NEXT:    pxor %xmm10, %xmm0
5478 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
5479 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5480 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5481 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
5482 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
5483 ; SSE2-NEXT:    pand %xmm12, %xmm0
5484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
5485 ; SSE2-NEXT:    por %xmm0, %xmm12
5486 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
5487 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
5488 ; SSE2-NEXT:    pxor %xmm1, %xmm8
5489 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
5490 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5491 ; SSE2-NEXT:    movdqa %xmm3, %xmm13
5492 ; SSE2-NEXT:    pxor %xmm10, %xmm13
5493 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
5494 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5495 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
5496 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
5497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5498 ; SSE2-NEXT:    pand %xmm15, %xmm11
5499 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
5500 ; SSE2-NEXT:    por %xmm11, %xmm13
5501 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
5502 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5503 ; SSE2-NEXT:    movdqa %xmm2, %xmm14
5504 ; SSE2-NEXT:    pxor %xmm10, %xmm14
5505 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
5506 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
5507 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
5508 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
5509 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5510 ; SSE2-NEXT:    pand %xmm11, %xmm14
5511 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
5512 ; SSE2-NEXT:    por %xmm14, %xmm15
5513 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
5514 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5515 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5516 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
5517 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5518 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
5519 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
5520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
5521 ; SSE2-NEXT:    pand %xmm11, %xmm0
5522 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
5523 ; SSE2-NEXT:    pxor %xmm1, %xmm10
5524 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5525 ; SSE2-NEXT:    por %xmm0, %xmm14
5526 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
5527 ; SSE2-NEXT:    pxor %xmm1, %xmm11
5528 ; SSE2-NEXT:    pxor %xmm14, %xmm1
5529 ; SSE2-NEXT:    pandn %xmm9, %xmm14
5530 ; SSE2-NEXT:    pandn %xmm4, %xmm1
5531 ; SSE2-NEXT:    por %xmm14, %xmm1
5532 ; SSE2-NEXT:    pandn %xmm2, %xmm15
5533 ; SSE2-NEXT:    pandn %xmm5, %xmm11
5534 ; SSE2-NEXT:    por %xmm15, %xmm11
5535 ; SSE2-NEXT:    pandn %xmm3, %xmm13
5536 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5537 ; SSE2-NEXT:    por %xmm13, %xmm10
5538 ; SSE2-NEXT:    pandn %xmm7, %xmm12
5539 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm8 # 16-byte Folded Reload
5540 ; SSE2-NEXT:    por %xmm12, %xmm8
5541 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5542 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
5543 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
5544 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
5545 ; SSE2-NEXT:    retq
5546 ;
5547 ; SSE4-LABEL: test126:
5548 ; SSE4:       # BB#0: # %entry
5549 ; SSE4-NEXT:    movdqa %xmm0, %xmm9
5550 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
5551 ; SSE4-NEXT:    movdqa %xmm7, %xmm10
5552 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5553 ; SSE4-NEXT:    movdqa %xmm3, %xmm8
5554 ; SSE4-NEXT:    pxor %xmm0, %xmm8
5555 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm8
5556 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
5557 ; SSE4-NEXT:    pxor %xmm12, %xmm8
5558 ; SSE4-NEXT:    movdqa %xmm6, %xmm11
5559 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5560 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
5561 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5562 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
5563 ; SSE4-NEXT:    pxor %xmm12, %xmm10
5564 ; SSE4-NEXT:    movdqa %xmm5, %xmm13
5565 ; SSE4-NEXT:    pxor %xmm0, %xmm13
5566 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
5567 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5568 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm11
5569 ; SSE4-NEXT:    pxor %xmm12, %xmm11
5570 ; SSE4-NEXT:    movdqa %xmm4, %xmm13
5571 ; SSE4-NEXT:    pxor %xmm0, %xmm13
5572 ; SSE4-NEXT:    pxor %xmm9, %xmm0
5573 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm0
5574 ; SSE4-NEXT:    pxor %xmm12, %xmm0
5575 ; SSE4-NEXT:    blendvpd %xmm9, %xmm4
5576 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5577 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5578 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5579 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5580 ; SSE4-NEXT:    movdqa %xmm8, %xmm0
5581 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5582 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5583 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5584 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5585 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5586 ; SSE4-NEXT:    retq
5587 ;
5588 ; AVX1-LABEL: test126:
5589 ; AVX1:       # BB#0: # %entry
5590 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5591 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
5592 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
5593 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
5594 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5595 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
5596 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
5597 ; AVX1-NEXT:    vpxor %xmm8, %xmm4, %xmm4
5598 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm7
5599 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm6
5600 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
5601 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
5602 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5603 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
5604 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5605 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
5606 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
5607 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5608 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
5609 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm7
5610 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm5
5611 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
5612 ; AVX1-NEXT:    vpxor %xmm8, %xmm5, %xmm5
5613 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5614 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5615 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5616 ; AVX1-NEXT:    retq
5617 ;
5618 ; AVX2-LABEL: test126:
5619 ; AVX2:       # BB#0: # %entry
5620 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
5621 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm5
5622 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm6
5623 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
5624 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
5625 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
5626 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm7
5627 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm4
5628 ; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm4, %ymm4
5629 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
5630 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
5631 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
5632 ; AVX2-NEXT:    retq
5633 ;
5634 ; AVX512F-LABEL: test126:
5635 ; AVX512F:       # BB#0: # %entry
5636 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
5637 ; AVX512F-NEXT:    retq
5638 entry:
5639   %cmp = icmp ule <8 x i64> %a, %b
5640   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5641   ret <8 x i64> %sel
5642 }
5643
5644 define <8 x i64> @test127(<8 x i64> %a, <8 x i64> %b) {
5645 ; SSE2-LABEL: test127:
5646 ; SSE2:       # BB#0: # %entry
5647 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
5648 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
5649 ; SSE2-NEXT:    pxor %xmm9, %xmm8
5650 ; SSE2-NEXT:    movdqa %xmm3, %xmm10
5651 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5652 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
5653 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5654 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5655 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm10
5656 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
5657 ; SSE2-NEXT:    pand %xmm12, %xmm10
5658 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm11[1,1,3,3]
5659 ; SSE2-NEXT:    por %xmm10, %xmm8
5660 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
5661 ; SSE2-NEXT:    pxor %xmm9, %xmm10
5662 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
5663 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5664 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
5665 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm12
5666 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
5667 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
5668 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
5669 ; SSE2-NEXT:    pand %xmm13, %xmm11
5670 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm12[1,1,3,3]
5671 ; SSE2-NEXT:    por %xmm11, %xmm10
5672 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
5673 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5674 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
5675 ; SSE2-NEXT:    pxor %xmm9, %xmm12
5676 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
5677 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5678 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5679 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm12
5680 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
5681 ; SSE2-NEXT:    pand %xmm14, %xmm11
5682 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
5683 ; SSE2-NEXT:    por %xmm11, %xmm12
5684 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
5685 ; SSE2-NEXT:    pxor %xmm9, %xmm11
5686 ; SSE2-NEXT:    pxor %xmm0, %xmm9
5687 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
5688 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm13
5689 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
5690 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
5691 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
5692 ; SSE2-NEXT:    pand %xmm14, %xmm9
5693 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5694 ; SSE2-NEXT:    por %xmm9, %xmm11
5695 ; SSE2-NEXT:    pand %xmm11, %xmm0
5696 ; SSE2-NEXT:    pandn %xmm4, %xmm11
5697 ; SSE2-NEXT:    por %xmm11, %xmm0
5698 ; SSE2-NEXT:    pand %xmm12, %xmm1
5699 ; SSE2-NEXT:    pandn %xmm5, %xmm12
5700 ; SSE2-NEXT:    por %xmm12, %xmm1
5701 ; SSE2-NEXT:    pand %xmm10, %xmm2
5702 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5703 ; SSE2-NEXT:    por %xmm10, %xmm2
5704 ; SSE2-NEXT:    pand %xmm8, %xmm3
5705 ; SSE2-NEXT:    pandn %xmm7, %xmm8
5706 ; SSE2-NEXT:    por %xmm8, %xmm3
5707 ; SSE2-NEXT:    retq
5708 ;
5709 ; SSE4-LABEL: test127:
5710 ; SSE4:       # BB#0: # %entry
5711 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
5712 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
5713 ; SSE4-NEXT:    movdqa %xmm7, %xmm10
5714 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5715 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
5716 ; SSE4-NEXT:    pxor %xmm0, %xmm9
5717 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
5718 ; SSE4-NEXT:    movdqa %xmm6, %xmm11
5719 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5720 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
5721 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5722 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
5723 ; SSE4-NEXT:    movdqa %xmm5, %xmm12
5724 ; SSE4-NEXT:    pxor %xmm0, %xmm12
5725 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
5726 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5727 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm11
5728 ; SSE4-NEXT:    movdqa %xmm4, %xmm12
5729 ; SSE4-NEXT:    pxor %xmm0, %xmm12
5730 ; SSE4-NEXT:    pxor %xmm8, %xmm0
5731 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm0
5732 ; SSE4-NEXT:    blendvpd %xmm8, %xmm4
5733 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5734 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5735 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5736 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5737 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
5738 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5739 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5740 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5741 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5742 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5743 ; SSE4-NEXT:    retq
5744 ;
5745 ; AVX1-LABEL: test127:
5746 ; AVX1:       # BB#0: # %entry
5747 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5748 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
5749 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
5750 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
5751 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5752 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
5753 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm6
5754 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm7
5755 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5756 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5757 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
5758 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5759 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
5760 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
5761 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5762 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm7
5763 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm5
5764 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
5765 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5766 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5767 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5768 ; AVX1-NEXT:    retq
5769 ;
5770 ; AVX2-LABEL: test127:
5771 ; AVX2:       # BB#0: # %entry
5772 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
5773 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm5
5774 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm6
5775 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
5776 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm6
5777 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm4
5778 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm4, %ymm4
5779 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
5780 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
5781 ; AVX2-NEXT:    retq
5782 ;
5783 ; AVX512F-LABEL: test127:
5784 ; AVX512F:       # BB#0: # %entry
5785 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
5786 ; AVX512F-NEXT:    retq
5787 entry:
5788   %cmp = icmp ugt <8 x i64> %a, %b
5789   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5790   ret <8 x i64> %sel
5791 }
5792
5793 define <8 x i64> @test128(<8 x i64> %a, <8 x i64> %b) {
5794 ; SSE2-LABEL: test128:
5795 ; SSE2:       # BB#0: # %entry
5796 ; SSE2-NEXT:    movdqa %xmm7, %xmm11
5797 ; SSE2-NEXT:    movdqa %xmm11, -{{[0-9]+}}(%rsp) # 16-byte Spill
5798 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
5799 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
5800 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
5801 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
5802 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
5803 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
5804 ; SSE2-NEXT:    pxor %xmm10, %xmm8
5805 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
5806 ; SSE2-NEXT:    pxor %xmm10, %xmm0
5807 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
5808 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
5809 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
5810 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
5811 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
5812 ; SSE2-NEXT:    pand %xmm12, %xmm0
5813 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
5814 ; SSE2-NEXT:    por %xmm0, %xmm12
5815 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
5816 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
5817 ; SSE2-NEXT:    pxor %xmm1, %xmm8
5818 ; SSE2-NEXT:    movdqa %xmm3, %xmm11
5819 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5820 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
5821 ; SSE2-NEXT:    pxor %xmm10, %xmm13
5822 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
5823 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
5825 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
5826 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
5827 ; SSE2-NEXT:    pand %xmm15, %xmm11
5828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
5829 ; SSE2-NEXT:    por %xmm11, %xmm13
5830 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
5831 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5832 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
5833 ; SSE2-NEXT:    pxor %xmm10, %xmm14
5834 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
5835 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
5836 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
5837 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
5838 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5839 ; SSE2-NEXT:    pand %xmm11, %xmm14
5840 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
5841 ; SSE2-NEXT:    por %xmm14, %xmm15
5842 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
5843 ; SSE2-NEXT:    pxor %xmm10, %xmm11
5844 ; SSE2-NEXT:    pxor %xmm4, %xmm10
5845 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
5846 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
5847 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
5848 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
5849 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
5850 ; SSE2-NEXT:    pand %xmm11, %xmm0
5851 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
5852 ; SSE2-NEXT:    pxor %xmm1, %xmm10
5853 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
5854 ; SSE2-NEXT:    por %xmm0, %xmm14
5855 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
5856 ; SSE2-NEXT:    pxor %xmm1, %xmm11
5857 ; SSE2-NEXT:    pxor %xmm14, %xmm1
5858 ; SSE2-NEXT:    pandn %xmm9, %xmm14
5859 ; SSE2-NEXT:    pandn %xmm4, %xmm1
5860 ; SSE2-NEXT:    por %xmm14, %xmm1
5861 ; SSE2-NEXT:    pandn %xmm2, %xmm15
5862 ; SSE2-NEXT:    pandn %xmm5, %xmm11
5863 ; SSE2-NEXT:    por %xmm15, %xmm11
5864 ; SSE2-NEXT:    pandn %xmm3, %xmm13
5865 ; SSE2-NEXT:    pandn %xmm6, %xmm10
5866 ; SSE2-NEXT:    por %xmm13, %xmm10
5867 ; SSE2-NEXT:    pandn %xmm7, %xmm12
5868 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm8 # 16-byte Folded Reload
5869 ; SSE2-NEXT:    por %xmm12, %xmm8
5870 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5871 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
5872 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
5873 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
5874 ; SSE2-NEXT:    retq
5875 ;
5876 ; SSE4-LABEL: test128:
5877 ; SSE4:       # BB#0: # %entry
5878 ; SSE4-NEXT:    movdqa %xmm0, %xmm9
5879 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
5880 ; SSE4-NEXT:    movdqa %xmm3, %xmm10
5881 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5882 ; SSE4-NEXT:    movdqa %xmm7, %xmm8
5883 ; SSE4-NEXT:    pxor %xmm0, %xmm8
5884 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm8
5885 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
5886 ; SSE4-NEXT:    pxor %xmm12, %xmm8
5887 ; SSE4-NEXT:    movdqa %xmm2, %xmm11
5888 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5889 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
5890 ; SSE4-NEXT:    pxor %xmm0, %xmm10
5891 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
5892 ; SSE4-NEXT:    pxor %xmm12, %xmm10
5893 ; SSE4-NEXT:    movdqa %xmm1, %xmm13
5894 ; SSE4-NEXT:    pxor %xmm0, %xmm13
5895 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
5896 ; SSE4-NEXT:    pxor %xmm0, %xmm11
5897 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm11
5898 ; SSE4-NEXT:    pxor %xmm12, %xmm11
5899 ; SSE4-NEXT:    movdqa %xmm9, %xmm13
5900 ; SSE4-NEXT:    pxor %xmm0, %xmm13
5901 ; SSE4-NEXT:    pxor %xmm4, %xmm0
5902 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm0
5903 ; SSE4-NEXT:    pxor %xmm12, %xmm0
5904 ; SSE4-NEXT:    blendvpd %xmm9, %xmm4
5905 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
5906 ; SSE4-NEXT:    blendvpd %xmm1, %xmm5
5907 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
5908 ; SSE4-NEXT:    blendvpd %xmm2, %xmm6
5909 ; SSE4-NEXT:    movdqa %xmm8, %xmm0
5910 ; SSE4-NEXT:    blendvpd %xmm3, %xmm7
5911 ; SSE4-NEXT:    movapd %xmm4, %xmm0
5912 ; SSE4-NEXT:    movapd %xmm5, %xmm1
5913 ; SSE4-NEXT:    movapd %xmm6, %xmm2
5914 ; SSE4-NEXT:    movapd %xmm7, %xmm3
5915 ; SSE4-NEXT:    retq
5916 ;
5917 ; AVX1-LABEL: test128:
5918 ; AVX1:       # BB#0: # %entry
5919 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
5920 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
5921 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
5922 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
5923 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5924 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
5925 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
5926 ; AVX1-NEXT:    vpxor %xmm8, %xmm4, %xmm4
5927 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm7
5928 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm6
5929 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
5930 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
5931 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
5932 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
5933 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
5934 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
5935 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
5936 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
5937 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
5938 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm7
5939 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm5
5940 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
5941 ; AVX1-NEXT:    vpxor %xmm8, %xmm5, %xmm5
5942 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
5943 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
5944 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
5945 ; AVX1-NEXT:    retq
5946 ;
5947 ; AVX2-LABEL: test128:
5948 ; AVX2:       # BB#0: # %entry
5949 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
5950 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
5951 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm6
5952 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
5953 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
5954 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
5955 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm7
5956 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm4
5957 ; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm4, %ymm4
5958 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
5959 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
5960 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
5961 ; AVX2-NEXT:    retq
5962 ;
5963 ; AVX512F-LABEL: test128:
5964 ; AVX512F:       # BB#0: # %entry
5965 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
5966 ; AVX512F-NEXT:    retq
5967 entry:
5968   %cmp = icmp uge <8 x i64> %a, %b
5969   %sel = select <8 x i1> %cmp, <8 x i64> %a, <8 x i64> %b
5970   ret <8 x i64> %sel
5971 }
5972
5973 define <64 x i8> @test129(<64 x i8> %a, <64 x i8> %b) {
5974 ; SSE2-LABEL: test129:
5975 ; SSE2:       # BB#0: # %entry
5976 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
5977 ; SSE2-NEXT:    movdqa %xmm7, %xmm3
5978 ; SSE2-NEXT:    pcmpgtb %xmm8, %xmm3
5979 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
5980 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm9
5981 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
5982 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm10
5983 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
5984 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm11
5985 ; SSE2-NEXT:    pand %xmm11, %xmm4
5986 ; SSE2-NEXT:    pandn %xmm0, %xmm11
5987 ; SSE2-NEXT:    por %xmm4, %xmm11
5988 ; SSE2-NEXT:    pand %xmm10, %xmm5
5989 ; SSE2-NEXT:    pandn %xmm1, %xmm10
5990 ; SSE2-NEXT:    por %xmm5, %xmm10
5991 ; SSE2-NEXT:    pand %xmm9, %xmm6
5992 ; SSE2-NEXT:    pandn %xmm2, %xmm9
5993 ; SSE2-NEXT:    por %xmm6, %xmm9
5994 ; SSE2-NEXT:    pand %xmm3, %xmm7
5995 ; SSE2-NEXT:    pandn %xmm8, %xmm3
5996 ; SSE2-NEXT:    por %xmm7, %xmm3
5997 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
5998 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
5999 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
6000 ; SSE2-NEXT:    retq
6001 ;
6002 ; SSE4-LABEL: test129:
6003 ; SSE4:       # BB#0: # %entry
6004 ; SSE4-NEXT:    pmaxsb %xmm4, %xmm0
6005 ; SSE4-NEXT:    pmaxsb %xmm5, %xmm1
6006 ; SSE4-NEXT:    pmaxsb %xmm6, %xmm2
6007 ; SSE4-NEXT:    pmaxsb %xmm7, %xmm3
6008 ; SSE4-NEXT:    retq
6009 ;
6010 ; AVX1-LABEL: test129:
6011 ; AVX1:       # BB#0: # %entry
6012 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6013 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6014 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
6015 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
6016 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6017 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6018 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6019 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm4, %xmm2
6020 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
6021 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6022 ; AVX1-NEXT:    retq
6023 ;
6024 ; AVX2-LABEL: test129:
6025 ; AVX2:       # BB#0: # %entry
6026 ; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
6027 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
6028 ; AVX2-NEXT:    retq
6029 ;
6030 ; AVX512BW-LABEL: test129:
6031 ; AVX512BW:       # BB#0: # %entry
6032 ; AVX512BW-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
6033 ; AVX512BW-NEXT:    retq
6034 entry:
6035   %cmp = icmp slt <64 x i8> %a, %b
6036   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6037   ret <64 x i8> %sel
6038 }
6039
6040 define <64 x i8> @test130(<64 x i8> %a, <64 x i8> %b) {
6041 ; SSE2-LABEL: test130:
6042 ; SSE2:       # BB#0: # %entry
6043 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
6044 ; SSE2-NEXT:    movdqa %xmm3, %xmm12
6045 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm12
6046 ; SSE2-NEXT:    pcmpeqd %xmm13, %xmm13
6047 ; SSE2-NEXT:    movdqa %xmm12, %xmm9
6048 ; SSE2-NEXT:    pxor %xmm13, %xmm9
6049 ; SSE2-NEXT:    movdqa %xmm8, %xmm14
6050 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm14
6051 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
6052 ; SSE2-NEXT:    pxor %xmm13, %xmm2
6053 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
6054 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm15
6055 ; SSE2-NEXT:    movdqa %xmm15, %xmm10
6056 ; SSE2-NEXT:    pxor %xmm13, %xmm10
6057 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6058 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11
6059 ; SSE2-NEXT:    pxor %xmm11, %xmm13
6060 ; SSE2-NEXT:    pandn %xmm4, %xmm11
6061 ; SSE2-NEXT:    pandn %xmm0, %xmm13
6062 ; SSE2-NEXT:    por %xmm13, %xmm11
6063 ; SSE2-NEXT:    pandn %xmm5, %xmm15
6064 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6065 ; SSE2-NEXT:    por %xmm15, %xmm10
6066 ; SSE2-NEXT:    pandn %xmm6, %xmm14
6067 ; SSE2-NEXT:    pandn %xmm8, %xmm2
6068 ; SSE2-NEXT:    por %xmm14, %xmm2
6069 ; SSE2-NEXT:    pandn %xmm7, %xmm12
6070 ; SSE2-NEXT:    pandn %xmm3, %xmm9
6071 ; SSE2-NEXT:    por %xmm12, %xmm9
6072 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6073 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6074 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
6075 ; SSE2-NEXT:    retq
6076 ;
6077 ; SSE4-LABEL: test130:
6078 ; SSE4:       # BB#0: # %entry
6079 ; SSE4-NEXT:    pmaxsb %xmm4, %xmm0
6080 ; SSE4-NEXT:    pmaxsb %xmm5, %xmm1
6081 ; SSE4-NEXT:    pmaxsb %xmm6, %xmm2
6082 ; SSE4-NEXT:    pmaxsb %xmm7, %xmm3
6083 ; SSE4-NEXT:    retq
6084 ;
6085 ; AVX1-LABEL: test130:
6086 ; AVX1:       # BB#0: # %entry
6087 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6088 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6089 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
6090 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
6091 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6092 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6093 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6094 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm4, %xmm2
6095 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
6096 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6097 ; AVX1-NEXT:    retq
6098 ;
6099 ; AVX2-LABEL: test130:
6100 ; AVX2:       # BB#0: # %entry
6101 ; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
6102 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
6103 ; AVX2-NEXT:    retq
6104 ;
6105 ; AVX512BW-LABEL: test130:
6106 ; AVX512BW:       # BB#0: # %entry
6107 ; AVX512BW-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
6108 ; AVX512BW-NEXT:    retq
6109 entry:
6110   %cmp = icmp sle <64 x i8> %a, %b
6111   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6112   ret <64 x i8> %sel
6113 }
6114
6115 define <64 x i8> @test131(<64 x i8> %a, <64 x i8> %b) {
6116 ; SSE2-LABEL: test131:
6117 ; SSE2:       # BB#0: # %entry
6118 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
6119 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm3
6120 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
6121 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm9
6122 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
6123 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm10
6124 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6125 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11
6126 ; SSE2-NEXT:    pand %xmm11, %xmm4
6127 ; SSE2-NEXT:    pandn %xmm0, %xmm11
6128 ; SSE2-NEXT:    por %xmm4, %xmm11
6129 ; SSE2-NEXT:    pand %xmm10, %xmm5
6130 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6131 ; SSE2-NEXT:    por %xmm5, %xmm10
6132 ; SSE2-NEXT:    pand %xmm9, %xmm6
6133 ; SSE2-NEXT:    pandn %xmm2, %xmm9
6134 ; SSE2-NEXT:    por %xmm6, %xmm9
6135 ; SSE2-NEXT:    pand %xmm3, %xmm7
6136 ; SSE2-NEXT:    pandn %xmm8, %xmm3
6137 ; SSE2-NEXT:    por %xmm7, %xmm3
6138 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6139 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6140 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
6141 ; SSE2-NEXT:    retq
6142 ;
6143 ; SSE4-LABEL: test131:
6144 ; SSE4:       # BB#0: # %entry
6145 ; SSE4-NEXT:    pminsb %xmm4, %xmm0
6146 ; SSE4-NEXT:    pminsb %xmm5, %xmm1
6147 ; SSE4-NEXT:    pminsb %xmm6, %xmm2
6148 ; SSE4-NEXT:    pminsb %xmm7, %xmm3
6149 ; SSE4-NEXT:    retq
6150 ;
6151 ; AVX1-LABEL: test131:
6152 ; AVX1:       # BB#0: # %entry
6153 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6154 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6155 ; AVX1-NEXT:    vpminsb %xmm4, %xmm5, %xmm4
6156 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
6157 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6158 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6159 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6160 ; AVX1-NEXT:    vpminsb %xmm2, %xmm4, %xmm2
6161 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm1
6162 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6163 ; AVX1-NEXT:    retq
6164 ;
6165 ; AVX2-LABEL: test131:
6166 ; AVX2:       # BB#0: # %entry
6167 ; AVX2-NEXT:    vpminsb %ymm2, %ymm0, %ymm0
6168 ; AVX2-NEXT:    vpminsb %ymm3, %ymm1, %ymm1
6169 ; AVX2-NEXT:    retq
6170 ;
6171 ; AVX512BW-LABEL: test131:
6172 ; AVX512BW:       # BB#0: # %entry
6173 ; AVX512BW-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
6174 ; AVX512BW-NEXT:    retq
6175 entry:
6176   %cmp = icmp sgt <64 x i8> %a, %b
6177   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6178   ret <64 x i8> %sel
6179 }
6180
6181 define <64 x i8> @test132(<64 x i8> %a, <64 x i8> %b) {
6182 ; SSE2-LABEL: test132:
6183 ; SSE2:       # BB#0: # %entry
6184 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
6185 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
6186 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
6187 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm12
6188 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
6189 ; SSE2-NEXT:    movdqa %xmm12, %xmm9
6190 ; SSE2-NEXT:    pxor %xmm0, %xmm9
6191 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
6192 ; SSE2-NEXT:    pcmpgtb %xmm8, %xmm13
6193 ; SSE2-NEXT:    movdqa %xmm13, %xmm2
6194 ; SSE2-NEXT:    pxor %xmm0, %xmm2
6195 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
6196 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm14
6197 ; SSE2-NEXT:    movdqa %xmm14, %xmm11
6198 ; SSE2-NEXT:    pxor %xmm0, %xmm11
6199 ; SSE2-NEXT:    movdqa %xmm4, %xmm15
6200 ; SSE2-NEXT:    pcmpgtb %xmm10, %xmm15
6201 ; SSE2-NEXT:    pxor %xmm15, %xmm0
6202 ; SSE2-NEXT:    pandn %xmm4, %xmm15
6203 ; SSE2-NEXT:    pandn %xmm10, %xmm0
6204 ; SSE2-NEXT:    por %xmm15, %xmm0
6205 ; SSE2-NEXT:    pandn %xmm5, %xmm14
6206 ; SSE2-NEXT:    pandn %xmm1, %xmm11
6207 ; SSE2-NEXT:    por %xmm14, %xmm11
6208 ; SSE2-NEXT:    pandn %xmm6, %xmm13
6209 ; SSE2-NEXT:    pandn %xmm8, %xmm2
6210 ; SSE2-NEXT:    por %xmm13, %xmm2
6211 ; SSE2-NEXT:    pandn %xmm7, %xmm12
6212 ; SSE2-NEXT:    pandn %xmm3, %xmm9
6213 ; SSE2-NEXT:    por %xmm12, %xmm9
6214 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
6215 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
6216 ; SSE2-NEXT:    retq
6217 ;
6218 ; SSE4-LABEL: test132:
6219 ; SSE4:       # BB#0: # %entry
6220 ; SSE4-NEXT:    pminsb %xmm4, %xmm0
6221 ; SSE4-NEXT:    pminsb %xmm5, %xmm1
6222 ; SSE4-NEXT:    pminsb %xmm6, %xmm2
6223 ; SSE4-NEXT:    pminsb %xmm7, %xmm3
6224 ; SSE4-NEXT:    retq
6225 ;
6226 ; AVX1-LABEL: test132:
6227 ; AVX1:       # BB#0: # %entry
6228 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6229 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6230 ; AVX1-NEXT:    vpminsb %xmm4, %xmm5, %xmm4
6231 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
6232 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6233 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6234 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6235 ; AVX1-NEXT:    vpminsb %xmm2, %xmm4, %xmm2
6236 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm1
6237 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6238 ; AVX1-NEXT:    retq
6239 ;
6240 ; AVX2-LABEL: test132:
6241 ; AVX2:       # BB#0: # %entry
6242 ; AVX2-NEXT:    vpminsb %ymm2, %ymm0, %ymm0
6243 ; AVX2-NEXT:    vpminsb %ymm3, %ymm1, %ymm1
6244 ; AVX2-NEXT:    retq
6245 ;
6246 ; AVX512BW-LABEL: test132:
6247 ; AVX512BW:       # BB#0: # %entry
6248 ; AVX512BW-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
6249 ; AVX512BW-NEXT:    retq
6250 entry:
6251   %cmp = icmp sge <64 x i8> %a, %b
6252   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6253   ret <64 x i8> %sel
6254 }
6255
6256 define <64 x i8> @test133(<64 x i8> %a, <64 x i8> %b) {
6257 ; SSE-LABEL: test133:
6258 ; SSE:       # BB#0: # %entry
6259 ; SSE-NEXT:    pmaxub %xmm4, %xmm0
6260 ; SSE-NEXT:    pmaxub %xmm5, %xmm1
6261 ; SSE-NEXT:    pmaxub %xmm6, %xmm2
6262 ; SSE-NEXT:    pmaxub %xmm7, %xmm3
6263 ; SSE-NEXT:    retq
6264 ;
6265 ; AVX1-LABEL: test133:
6266 ; AVX1:       # BB#0: # %entry
6267 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6268 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6269 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
6270 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
6271 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6272 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6273 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6274 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm4, %xmm2
6275 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
6276 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6277 ; AVX1-NEXT:    retq
6278 ;
6279 ; AVX2-LABEL: test133:
6280 ; AVX2:       # BB#0: # %entry
6281 ; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
6282 ; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
6283 ; AVX2-NEXT:    retq
6284 ;
6285 ; AVX512BW-LABEL: test133:
6286 ; AVX512BW:       # BB#0: # %entry
6287 ; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
6288 ; AVX512BW-NEXT:    retq
6289 entry:
6290   %cmp = icmp ult <64 x i8> %a, %b
6291   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6292   ret <64 x i8> %sel
6293 }
6294
6295 define <64 x i8> @test134(<64 x i8> %a, <64 x i8> %b) {
6296 ; SSE-LABEL: test134:
6297 ; SSE:       # BB#0: # %entry
6298 ; SSE-NEXT:    pmaxub %xmm4, %xmm0
6299 ; SSE-NEXT:    pmaxub %xmm5, %xmm1
6300 ; SSE-NEXT:    pmaxub %xmm6, %xmm2
6301 ; SSE-NEXT:    pmaxub %xmm7, %xmm3
6302 ; SSE-NEXT:    retq
6303 ;
6304 ; AVX1-LABEL: test134:
6305 ; AVX1:       # BB#0: # %entry
6306 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6307 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6308 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
6309 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
6310 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6311 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6312 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6313 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm4, %xmm2
6314 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
6315 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6316 ; AVX1-NEXT:    retq
6317 ;
6318 ; AVX2-LABEL: test134:
6319 ; AVX2:       # BB#0: # %entry
6320 ; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
6321 ; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
6322 ; AVX2-NEXT:    retq
6323 ;
6324 ; AVX512BW-LABEL: test134:
6325 ; AVX512BW:       # BB#0: # %entry
6326 ; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
6327 ; AVX512BW-NEXT:    retq
6328 entry:
6329   %cmp = icmp ule <64 x i8> %a, %b
6330   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6331   ret <64 x i8> %sel
6332 }
6333
6334 define <64 x i8> @test135(<64 x i8> %a, <64 x i8> %b) {
6335 ; SSE-LABEL: test135:
6336 ; SSE:       # BB#0: # %entry
6337 ; SSE-NEXT:    pminub %xmm4, %xmm0
6338 ; SSE-NEXT:    pminub %xmm5, %xmm1
6339 ; SSE-NEXT:    pminub %xmm6, %xmm2
6340 ; SSE-NEXT:    pminub %xmm7, %xmm3
6341 ; SSE-NEXT:    retq
6342 ;
6343 ; AVX1-LABEL: test135:
6344 ; AVX1:       # BB#0: # %entry
6345 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6346 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6347 ; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
6348 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
6349 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6350 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6351 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6352 ; AVX1-NEXT:    vpminub %xmm2, %xmm4, %xmm2
6353 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm1
6354 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6355 ; AVX1-NEXT:    retq
6356 ;
6357 ; AVX2-LABEL: test135:
6358 ; AVX2:       # BB#0: # %entry
6359 ; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
6360 ; AVX2-NEXT:    vpminub %ymm3, %ymm1, %ymm1
6361 ; AVX2-NEXT:    retq
6362 ;
6363 ; AVX512BW-LABEL: test135:
6364 ; AVX512BW:       # BB#0: # %entry
6365 ; AVX512BW-NEXT:    vpminub %zmm1, %zmm0, %zmm0
6366 ; AVX512BW-NEXT:    retq
6367 entry:
6368   %cmp = icmp ugt <64 x i8> %a, %b
6369   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6370   ret <64 x i8> %sel
6371 }
6372
6373 define <64 x i8> @test136(<64 x i8> %a, <64 x i8> %b) {
6374 ; SSE-LABEL: test136:
6375 ; SSE:       # BB#0: # %entry
6376 ; SSE-NEXT:    pminub %xmm4, %xmm0
6377 ; SSE-NEXT:    pminub %xmm5, %xmm1
6378 ; SSE-NEXT:    pminub %xmm6, %xmm2
6379 ; SSE-NEXT:    pminub %xmm7, %xmm3
6380 ; SSE-NEXT:    retq
6381 ;
6382 ; AVX1-LABEL: test136:
6383 ; AVX1:       # BB#0: # %entry
6384 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6385 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6386 ; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
6387 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
6388 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6389 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6390 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6391 ; AVX1-NEXT:    vpminub %xmm2, %xmm4, %xmm2
6392 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm1
6393 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6394 ; AVX1-NEXT:    retq
6395 ;
6396 ; AVX2-LABEL: test136:
6397 ; AVX2:       # BB#0: # %entry
6398 ; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
6399 ; AVX2-NEXT:    vpminub %ymm3, %ymm1, %ymm1
6400 ; AVX2-NEXT:    retq
6401 ;
6402 ; AVX512BW-LABEL: test136:
6403 ; AVX512BW:       # BB#0: # %entry
6404 ; AVX512BW-NEXT:    vpminub %zmm1, %zmm0, %zmm0
6405 ; AVX512BW-NEXT:    retq
6406 entry:
6407   %cmp = icmp uge <64 x i8> %a, %b
6408   %sel = select <64 x i1> %cmp, <64 x i8> %b, <64 x i8> %a
6409   ret <64 x i8> %sel
6410 }
6411
6412 define <32 x i16> @test137(<32 x i16> %a, <32 x i16> %b) {
6413 ; SSE-LABEL: test137:
6414 ; SSE:       # BB#0: # %entry
6415 ; SSE-NEXT:    pmaxsw %xmm4, %xmm0
6416 ; SSE-NEXT:    pmaxsw %xmm5, %xmm1
6417 ; SSE-NEXT:    pmaxsw %xmm6, %xmm2
6418 ; SSE-NEXT:    pmaxsw %xmm7, %xmm3
6419 ; SSE-NEXT:    retq
6420 ;
6421 ; AVX1-LABEL: test137:
6422 ; AVX1:       # BB#0: # %entry
6423 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6424 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6425 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
6426 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
6427 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6428 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6429 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6430 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm4, %xmm2
6431 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
6432 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6433 ; AVX1-NEXT:    retq
6434 ;
6435 ; AVX2-LABEL: test137:
6436 ; AVX2:       # BB#0: # %entry
6437 ; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
6438 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
6439 ; AVX2-NEXT:    retq
6440 ;
6441 ; AVX512BW-LABEL: test137:
6442 ; AVX512BW:       # BB#0: # %entry
6443 ; AVX512BW-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
6444 ; AVX512BW-NEXT:    retq
6445 entry:
6446   %cmp = icmp slt <32 x i16> %a, %b
6447   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6448   ret <32 x i16> %sel
6449 }
6450
6451 define <32 x i16> @test138(<32 x i16> %a, <32 x i16> %b) {
6452 ; SSE-LABEL: test138:
6453 ; SSE:       # BB#0: # %entry
6454 ; SSE-NEXT:    pmaxsw %xmm4, %xmm0
6455 ; SSE-NEXT:    pmaxsw %xmm5, %xmm1
6456 ; SSE-NEXT:    pmaxsw %xmm6, %xmm2
6457 ; SSE-NEXT:    pmaxsw %xmm7, %xmm3
6458 ; SSE-NEXT:    retq
6459 ;
6460 ; AVX1-LABEL: test138:
6461 ; AVX1:       # BB#0: # %entry
6462 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6463 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6464 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
6465 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
6466 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6467 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6468 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6469 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm4, %xmm2
6470 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
6471 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6472 ; AVX1-NEXT:    retq
6473 ;
6474 ; AVX2-LABEL: test138:
6475 ; AVX2:       # BB#0: # %entry
6476 ; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
6477 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
6478 ; AVX2-NEXT:    retq
6479 ;
6480 ; AVX512BW-LABEL: test138:
6481 ; AVX512BW:       # BB#0: # %entry
6482 ; AVX512BW-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
6483 ; AVX512BW-NEXT:    retq
6484 entry:
6485   %cmp = icmp sle <32 x i16> %a, %b
6486   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6487   ret <32 x i16> %sel
6488 }
6489
6490 define <32 x i16> @test139(<32 x i16> %a, <32 x i16> %b) {
6491 ; SSE-LABEL: test139:
6492 ; SSE:       # BB#0: # %entry
6493 ; SSE-NEXT:    pminsw %xmm4, %xmm0
6494 ; SSE-NEXT:    pminsw %xmm5, %xmm1
6495 ; SSE-NEXT:    pminsw %xmm6, %xmm2
6496 ; SSE-NEXT:    pminsw %xmm7, %xmm3
6497 ; SSE-NEXT:    retq
6498 ;
6499 ; AVX1-LABEL: test139:
6500 ; AVX1:       # BB#0: # %entry
6501 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6502 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6503 ; AVX1-NEXT:    vpminsw %xmm4, %xmm5, %xmm4
6504 ; AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
6505 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6506 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6507 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6508 ; AVX1-NEXT:    vpminsw %xmm2, %xmm4, %xmm2
6509 ; AVX1-NEXT:    vpminsw %xmm3, %xmm1, %xmm1
6510 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6511 ; AVX1-NEXT:    retq
6512 ;
6513 ; AVX2-LABEL: test139:
6514 ; AVX2:       # BB#0: # %entry
6515 ; AVX2-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
6516 ; AVX2-NEXT:    vpminsw %ymm3, %ymm1, %ymm1
6517 ; AVX2-NEXT:    retq
6518 ;
6519 ; AVX512BW-LABEL: test139:
6520 ; AVX512BW:       # BB#0: # %entry
6521 ; AVX512BW-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
6522 ; AVX512BW-NEXT:    retq
6523 entry:
6524   %cmp = icmp sgt <32 x i16> %a, %b
6525   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6526   ret <32 x i16> %sel
6527 }
6528
6529 define <32 x i16> @test140(<32 x i16> %a, <32 x i16> %b) {
6530 ; SSE-LABEL: test140:
6531 ; SSE:       # BB#0: # %entry
6532 ; SSE-NEXT:    pminsw %xmm4, %xmm0
6533 ; SSE-NEXT:    pminsw %xmm5, %xmm1
6534 ; SSE-NEXT:    pminsw %xmm6, %xmm2
6535 ; SSE-NEXT:    pminsw %xmm7, %xmm3
6536 ; SSE-NEXT:    retq
6537 ;
6538 ; AVX1-LABEL: test140:
6539 ; AVX1:       # BB#0: # %entry
6540 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6541 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6542 ; AVX1-NEXT:    vpminsw %xmm4, %xmm5, %xmm4
6543 ; AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
6544 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6545 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6546 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6547 ; AVX1-NEXT:    vpminsw %xmm2, %xmm4, %xmm2
6548 ; AVX1-NEXT:    vpminsw %xmm3, %xmm1, %xmm1
6549 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6550 ; AVX1-NEXT:    retq
6551 ;
6552 ; AVX2-LABEL: test140:
6553 ; AVX2:       # BB#0: # %entry
6554 ; AVX2-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
6555 ; AVX2-NEXT:    vpminsw %ymm3, %ymm1, %ymm1
6556 ; AVX2-NEXT:    retq
6557 ;
6558 ; AVX512BW-LABEL: test140:
6559 ; AVX512BW:       # BB#0: # %entry
6560 ; AVX512BW-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
6561 ; AVX512BW-NEXT:    retq
6562 entry:
6563   %cmp = icmp sge <32 x i16> %a, %b
6564   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6565   ret <32 x i16> %sel
6566 }
6567
6568 define <32 x i16> @test141(<32 x i16> %a, <32 x i16> %b) {
6569 ; SSE2-LABEL: test141:
6570 ; SSE2:       # BB#0: # %entry
6571 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6572 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768,32768,32768,32768,32768]
6573 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
6574 ; SSE2-NEXT:    pxor %xmm0, %xmm9
6575 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
6576 ; SSE2-NEXT:    pxor %xmm0, %xmm8
6577 ; SSE2-NEXT:    pcmpgtw %xmm9, %xmm8
6578 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
6579 ; SSE2-NEXT:    pxor %xmm0, %xmm10
6580 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
6581 ; SSE2-NEXT:    pxor %xmm0, %xmm9
6582 ; SSE2-NEXT:    pcmpgtw %xmm10, %xmm9
6583 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
6584 ; SSE2-NEXT:    pxor %xmm0, %xmm12
6585 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
6586 ; SSE2-NEXT:    pxor %xmm0, %xmm10
6587 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm10
6588 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
6589 ; SSE2-NEXT:    pxor %xmm0, %xmm12
6590 ; SSE2-NEXT:    pxor %xmm4, %xmm0
6591 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm0
6592 ; SSE2-NEXT:    pand %xmm0, %xmm4
6593 ; SSE2-NEXT:    pandn %xmm11, %xmm0
6594 ; SSE2-NEXT:    por %xmm4, %xmm0
6595 ; SSE2-NEXT:    pand %xmm10, %xmm5
6596 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6597 ; SSE2-NEXT:    por %xmm5, %xmm10
6598 ; SSE2-NEXT:    pand %xmm9, %xmm6
6599 ; SSE2-NEXT:    pandn %xmm2, %xmm9
6600 ; SSE2-NEXT:    por %xmm6, %xmm9
6601 ; SSE2-NEXT:    pand %xmm8, %xmm7
6602 ; SSE2-NEXT:    pandn %xmm3, %xmm8
6603 ; SSE2-NEXT:    por %xmm7, %xmm8
6604 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6605 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
6606 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
6607 ; SSE2-NEXT:    retq
6608 ;
6609 ; SSE4-LABEL: test141:
6610 ; SSE4:       # BB#0: # %entry
6611 ; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
6612 ; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
6613 ; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
6614 ; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
6615 ; SSE4-NEXT:    retq
6616 ;
6617 ; AVX1-LABEL: test141:
6618 ; AVX1:       # BB#0: # %entry
6619 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6620 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6621 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
6622 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
6623 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6624 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6625 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6626 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm4, %xmm2
6627 ; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
6628 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6629 ; AVX1-NEXT:    retq
6630 ;
6631 ; AVX2-LABEL: test141:
6632 ; AVX2:       # BB#0: # %entry
6633 ; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
6634 ; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
6635 ; AVX2-NEXT:    retq
6636 ;
6637 ; AVX512BW-LABEL: test141:
6638 ; AVX512BW:       # BB#0: # %entry
6639 ; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
6640 ; AVX512BW-NEXT:    retq
6641 entry:
6642   %cmp = icmp ult <32 x i16> %a, %b
6643   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6644   ret <32 x i16> %sel
6645 }
6646
6647 define <32 x i16> @test142(<32 x i16> %a, <32 x i16> %b) {
6648 ; SSE2-LABEL: test142:
6649 ; SSE2:       # BB#0: # %entry
6650 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
6651 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
6652 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
6653 ; SSE2-NEXT:    psubusw %xmm7, %xmm3
6654 ; SSE2-NEXT:    pxor %xmm12, %xmm12
6655 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm3
6656 ; SSE2-NEXT:    psubusw %xmm6, %xmm2
6657 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm2
6658 ; SSE2-NEXT:    psubusw %xmm5, %xmm1
6659 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm1
6660 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6661 ; SSE2-NEXT:    psubusw %xmm4, %xmm11
6662 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm11
6663 ; SSE2-NEXT:    pand %xmm11, %xmm4
6664 ; SSE2-NEXT:    pandn %xmm0, %xmm11
6665 ; SSE2-NEXT:    por %xmm4, %xmm11
6666 ; SSE2-NEXT:    pand %xmm1, %xmm5
6667 ; SSE2-NEXT:    pandn %xmm10, %xmm1
6668 ; SSE2-NEXT:    por %xmm5, %xmm1
6669 ; SSE2-NEXT:    pand %xmm2, %xmm6
6670 ; SSE2-NEXT:    pandn %xmm9, %xmm2
6671 ; SSE2-NEXT:    por %xmm6, %xmm2
6672 ; SSE2-NEXT:    pand %xmm3, %xmm7
6673 ; SSE2-NEXT:    pandn %xmm8, %xmm3
6674 ; SSE2-NEXT:    por %xmm7, %xmm3
6675 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6676 ; SSE2-NEXT:    retq
6677 ;
6678 ; SSE4-LABEL: test142:
6679 ; SSE4:       # BB#0: # %entry
6680 ; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
6681 ; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
6682 ; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
6683 ; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
6684 ; SSE4-NEXT:    retq
6685 ;
6686 ; AVX1-LABEL: test142:
6687 ; AVX1:       # BB#0: # %entry
6688 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6689 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6690 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
6691 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
6692 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6693 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6694 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6695 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm4, %xmm2
6696 ; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
6697 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6698 ; AVX1-NEXT:    retq
6699 ;
6700 ; AVX2-LABEL: test142:
6701 ; AVX2:       # BB#0: # %entry
6702 ; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
6703 ; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
6704 ; AVX2-NEXT:    retq
6705 ;
6706 ; AVX512BW-LABEL: test142:
6707 ; AVX512BW:       # BB#0: # %entry
6708 ; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
6709 ; AVX512BW-NEXT:    retq
6710 entry:
6711   %cmp = icmp ule <32 x i16> %a, %b
6712   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6713   ret <32 x i16> %sel
6714 }
6715
6716 define <32 x i16> @test143(<32 x i16> %a, <32 x i16> %b) {
6717 ; SSE2-LABEL: test143:
6718 ; SSE2:       # BB#0: # %entry
6719 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6720 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768,32768,32768,32768,32768]
6721 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
6722 ; SSE2-NEXT:    pxor %xmm0, %xmm9
6723 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
6724 ; SSE2-NEXT:    pxor %xmm0, %xmm8
6725 ; SSE2-NEXT:    pcmpgtw %xmm9, %xmm8
6726 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
6727 ; SSE2-NEXT:    pxor %xmm0, %xmm10
6728 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
6729 ; SSE2-NEXT:    pxor %xmm0, %xmm9
6730 ; SSE2-NEXT:    pcmpgtw %xmm10, %xmm9
6731 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
6732 ; SSE2-NEXT:    pxor %xmm0, %xmm12
6733 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
6734 ; SSE2-NEXT:    pxor %xmm0, %xmm10
6735 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm10
6736 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
6737 ; SSE2-NEXT:    pxor %xmm0, %xmm12
6738 ; SSE2-NEXT:    pxor %xmm11, %xmm0
6739 ; SSE2-NEXT:    pcmpgtw %xmm12, %xmm0
6740 ; SSE2-NEXT:    pand %xmm0, %xmm4
6741 ; SSE2-NEXT:    pandn %xmm11, %xmm0
6742 ; SSE2-NEXT:    por %xmm4, %xmm0
6743 ; SSE2-NEXT:    pand %xmm10, %xmm5
6744 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6745 ; SSE2-NEXT:    por %xmm5, %xmm10
6746 ; SSE2-NEXT:    pand %xmm9, %xmm6
6747 ; SSE2-NEXT:    pandn %xmm2, %xmm9
6748 ; SSE2-NEXT:    por %xmm6, %xmm9
6749 ; SSE2-NEXT:    pand %xmm8, %xmm7
6750 ; SSE2-NEXT:    pandn %xmm3, %xmm8
6751 ; SSE2-NEXT:    por %xmm7, %xmm8
6752 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6753 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
6754 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
6755 ; SSE2-NEXT:    retq
6756 ;
6757 ; SSE4-LABEL: test143:
6758 ; SSE4:       # BB#0: # %entry
6759 ; SSE4-NEXT:    pminuw %xmm4, %xmm0
6760 ; SSE4-NEXT:    pminuw %xmm5, %xmm1
6761 ; SSE4-NEXT:    pminuw %xmm6, %xmm2
6762 ; SSE4-NEXT:    pminuw %xmm7, %xmm3
6763 ; SSE4-NEXT:    retq
6764 ;
6765 ; AVX1-LABEL: test143:
6766 ; AVX1:       # BB#0: # %entry
6767 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6768 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6769 ; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
6770 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
6771 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6772 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6773 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6774 ; AVX1-NEXT:    vpminuw %xmm2, %xmm4, %xmm2
6775 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
6776 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6777 ; AVX1-NEXT:    retq
6778 ;
6779 ; AVX2-LABEL: test143:
6780 ; AVX2:       # BB#0: # %entry
6781 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
6782 ; AVX2-NEXT:    vpminuw %ymm3, %ymm1, %ymm1
6783 ; AVX2-NEXT:    retq
6784 ;
6785 ; AVX512BW-LABEL: test143:
6786 ; AVX512BW:       # BB#0: # %entry
6787 ; AVX512BW-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
6788 ; AVX512BW-NEXT:    retq
6789 entry:
6790   %cmp = icmp ugt <32 x i16> %a, %b
6791   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6792   ret <32 x i16> %sel
6793 }
6794
6795 define <32 x i16> @test144(<32 x i16> %a, <32 x i16> %b) {
6796 ; SSE2-LABEL: test144:
6797 ; SSE2:       # BB#0: # %entry
6798 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
6799 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
6800 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
6801 ; SSE2-NEXT:    movdqa %xmm7, %xmm3
6802 ; SSE2-NEXT:    psubusw %xmm8, %xmm3
6803 ; SSE2-NEXT:    pxor %xmm12, %xmm12
6804 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm3
6805 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
6806 ; SSE2-NEXT:    psubusw %xmm9, %xmm2
6807 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm2
6808 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
6809 ; SSE2-NEXT:    psubusw %xmm10, %xmm1
6810 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm1
6811 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
6812 ; SSE2-NEXT:    psubusw %xmm0, %xmm11
6813 ; SSE2-NEXT:    pcmpeqw %xmm12, %xmm11
6814 ; SSE2-NEXT:    pand %xmm11, %xmm4
6815 ; SSE2-NEXT:    pandn %xmm0, %xmm11
6816 ; SSE2-NEXT:    por %xmm4, %xmm11
6817 ; SSE2-NEXT:    pand %xmm1, %xmm5
6818 ; SSE2-NEXT:    pandn %xmm10, %xmm1
6819 ; SSE2-NEXT:    por %xmm5, %xmm1
6820 ; SSE2-NEXT:    pand %xmm2, %xmm6
6821 ; SSE2-NEXT:    pandn %xmm9, %xmm2
6822 ; SSE2-NEXT:    por %xmm6, %xmm2
6823 ; SSE2-NEXT:    pand %xmm3, %xmm7
6824 ; SSE2-NEXT:    pandn %xmm8, %xmm3
6825 ; SSE2-NEXT:    por %xmm7, %xmm3
6826 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6827 ; SSE2-NEXT:    retq
6828 ;
6829 ; SSE4-LABEL: test144:
6830 ; SSE4:       # BB#0: # %entry
6831 ; SSE4-NEXT:    pminuw %xmm4, %xmm0
6832 ; SSE4-NEXT:    pminuw %xmm5, %xmm1
6833 ; SSE4-NEXT:    pminuw %xmm6, %xmm2
6834 ; SSE4-NEXT:    pminuw %xmm7, %xmm3
6835 ; SSE4-NEXT:    retq
6836 ;
6837 ; AVX1-LABEL: test144:
6838 ; AVX1:       # BB#0: # %entry
6839 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6840 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6841 ; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
6842 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
6843 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6844 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6845 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6846 ; AVX1-NEXT:    vpminuw %xmm2, %xmm4, %xmm2
6847 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
6848 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6849 ; AVX1-NEXT:    retq
6850 ;
6851 ; AVX2-LABEL: test144:
6852 ; AVX2:       # BB#0: # %entry
6853 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
6854 ; AVX2-NEXT:    vpminuw %ymm3, %ymm1, %ymm1
6855 ; AVX2-NEXT:    retq
6856 ;
6857 ; AVX512BW-LABEL: test144:
6858 ; AVX512BW:       # BB#0: # %entry
6859 ; AVX512BW-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
6860 ; AVX512BW-NEXT:    retq
6861 entry:
6862   %cmp = icmp uge <32 x i16> %a, %b
6863   %sel = select <32 x i1> %cmp, <32 x i16> %b, <32 x i16> %a
6864   ret <32 x i16> %sel
6865 }
6866
6867 define <16 x i32> @test145(<16 x i32> %a, <16 x i32> %b) {
6868 ; SSE2-LABEL: test145:
6869 ; SSE2:       # BB#0: # %entry
6870 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
6871 ; SSE2-NEXT:    movdqa %xmm7, %xmm3
6872 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
6873 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
6874 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm9
6875 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
6876 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
6877 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
6878 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm11
6879 ; SSE2-NEXT:    pand %xmm11, %xmm4
6880 ; SSE2-NEXT:    pandn %xmm0, %xmm11
6881 ; SSE2-NEXT:    por %xmm4, %xmm11
6882 ; SSE2-NEXT:    pand %xmm10, %xmm5
6883 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6884 ; SSE2-NEXT:    por %xmm5, %xmm10
6885 ; SSE2-NEXT:    pand %xmm9, %xmm6
6886 ; SSE2-NEXT:    pandn %xmm2, %xmm9
6887 ; SSE2-NEXT:    por %xmm6, %xmm9
6888 ; SSE2-NEXT:    pand %xmm3, %xmm7
6889 ; SSE2-NEXT:    pandn %xmm8, %xmm3
6890 ; SSE2-NEXT:    por %xmm7, %xmm3
6891 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6892 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6893 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
6894 ; SSE2-NEXT:    retq
6895 ;
6896 ; SSE4-LABEL: test145:
6897 ; SSE4:       # BB#0: # %entry
6898 ; SSE4-NEXT:    pmaxsd %xmm4, %xmm0
6899 ; SSE4-NEXT:    pmaxsd %xmm5, %xmm1
6900 ; SSE4-NEXT:    pmaxsd %xmm6, %xmm2
6901 ; SSE4-NEXT:    pmaxsd %xmm7, %xmm3
6902 ; SSE4-NEXT:    retq
6903 ;
6904 ; AVX1-LABEL: test145:
6905 ; AVX1:       # BB#0: # %entry
6906 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6907 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6908 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm5, %xmm4
6909 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
6910 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6911 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6912 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6913 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
6914 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
6915 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6916 ; AVX1-NEXT:    retq
6917 ;
6918 ; AVX2-LABEL: test145:
6919 ; AVX2:       # BB#0: # %entry
6920 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
6921 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
6922 ; AVX2-NEXT:    retq
6923 ;
6924 ; AVX512F-LABEL: test145:
6925 ; AVX512F:       # BB#0: # %entry
6926 ; AVX512F-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
6927 ; AVX512F-NEXT:    retq
6928 entry:
6929   %cmp = icmp slt <16 x i32> %a, %b
6930   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
6931   ret <16 x i32> %sel
6932 }
6933
6934 define <16 x i32> @test146(<16 x i32> %a, <16 x i32> %b) {
6935 ; SSE2-LABEL: test146:
6936 ; SSE2:       # BB#0: # %entry
6937 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
6938 ; SSE2-NEXT:    movdqa %xmm3, %xmm12
6939 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm12
6940 ; SSE2-NEXT:    pcmpeqd %xmm13, %xmm13
6941 ; SSE2-NEXT:    movdqa %xmm12, %xmm9
6942 ; SSE2-NEXT:    pxor %xmm13, %xmm9
6943 ; SSE2-NEXT:    movdqa %xmm8, %xmm14
6944 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm14
6945 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
6946 ; SSE2-NEXT:    pxor %xmm13, %xmm2
6947 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
6948 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm15
6949 ; SSE2-NEXT:    movdqa %xmm15, %xmm10
6950 ; SSE2-NEXT:    pxor %xmm13, %xmm10
6951 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
6952 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
6953 ; SSE2-NEXT:    pxor %xmm11, %xmm13
6954 ; SSE2-NEXT:    pandn %xmm4, %xmm11
6955 ; SSE2-NEXT:    pandn %xmm0, %xmm13
6956 ; SSE2-NEXT:    por %xmm13, %xmm11
6957 ; SSE2-NEXT:    pandn %xmm5, %xmm15
6958 ; SSE2-NEXT:    pandn %xmm1, %xmm10
6959 ; SSE2-NEXT:    por %xmm15, %xmm10
6960 ; SSE2-NEXT:    pandn %xmm6, %xmm14
6961 ; SSE2-NEXT:    pandn %xmm8, %xmm2
6962 ; SSE2-NEXT:    por %xmm14, %xmm2
6963 ; SSE2-NEXT:    pandn %xmm7, %xmm12
6964 ; SSE2-NEXT:    pandn %xmm3, %xmm9
6965 ; SSE2-NEXT:    por %xmm12, %xmm9
6966 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
6967 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
6968 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
6969 ; SSE2-NEXT:    retq
6970 ;
6971 ; SSE4-LABEL: test146:
6972 ; SSE4:       # BB#0: # %entry
6973 ; SSE4-NEXT:    pmaxsd %xmm4, %xmm0
6974 ; SSE4-NEXT:    pmaxsd %xmm5, %xmm1
6975 ; SSE4-NEXT:    pmaxsd %xmm6, %xmm2
6976 ; SSE4-NEXT:    pmaxsd %xmm7, %xmm3
6977 ; SSE4-NEXT:    retq
6978 ;
6979 ; AVX1-LABEL: test146:
6980 ; AVX1:       # BB#0: # %entry
6981 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
6982 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
6983 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm5, %xmm4
6984 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
6985 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
6986 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
6987 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
6988 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
6989 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
6990 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
6991 ; AVX1-NEXT:    retq
6992 ;
6993 ; AVX2-LABEL: test146:
6994 ; AVX2:       # BB#0: # %entry
6995 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
6996 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
6997 ; AVX2-NEXT:    retq
6998 ;
6999 ; AVX512F-LABEL: test146:
7000 ; AVX512F:       # BB#0: # %entry
7001 ; AVX512F-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
7002 ; AVX512F-NEXT:    retq
7003 entry:
7004   %cmp = icmp sle <16 x i32> %a, %b
7005   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7006   ret <16 x i32> %sel
7007 }
7008
7009 define <16 x i32> @test147(<16 x i32> %a, <16 x i32> %b) {
7010 ; SSE2-LABEL: test147:
7011 ; SSE2:       # BB#0: # %entry
7012 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
7013 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
7014 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
7015 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm9
7016 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
7017 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm10
7018 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
7019 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
7020 ; SSE2-NEXT:    pand %xmm11, %xmm4
7021 ; SSE2-NEXT:    pandn %xmm0, %xmm11
7022 ; SSE2-NEXT:    por %xmm4, %xmm11
7023 ; SSE2-NEXT:    pand %xmm10, %xmm5
7024 ; SSE2-NEXT:    pandn %xmm1, %xmm10
7025 ; SSE2-NEXT:    por %xmm5, %xmm10
7026 ; SSE2-NEXT:    pand %xmm9, %xmm6
7027 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7028 ; SSE2-NEXT:    por %xmm6, %xmm9
7029 ; SSE2-NEXT:    pand %xmm3, %xmm7
7030 ; SSE2-NEXT:    pandn %xmm8, %xmm3
7031 ; SSE2-NEXT:    por %xmm7, %xmm3
7032 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
7033 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
7034 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7035 ; SSE2-NEXT:    retq
7036 ;
7037 ; SSE4-LABEL: test147:
7038 ; SSE4:       # BB#0: # %entry
7039 ; SSE4-NEXT:    pminsd %xmm4, %xmm0
7040 ; SSE4-NEXT:    pminsd %xmm5, %xmm1
7041 ; SSE4-NEXT:    pminsd %xmm6, %xmm2
7042 ; SSE4-NEXT:    pminsd %xmm7, %xmm3
7043 ; SSE4-NEXT:    retq
7044 ;
7045 ; AVX1-LABEL: test147:
7046 ; AVX1:       # BB#0: # %entry
7047 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7048 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7049 ; AVX1-NEXT:    vpminsd %xmm4, %xmm5, %xmm4
7050 ; AVX1-NEXT:    vpminsd %xmm2, %xmm0, %xmm0
7051 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7052 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7053 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7054 ; AVX1-NEXT:    vpminsd %xmm2, %xmm4, %xmm2
7055 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm1
7056 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7057 ; AVX1-NEXT:    retq
7058 ;
7059 ; AVX2-LABEL: test147:
7060 ; AVX2:       # BB#0: # %entry
7061 ; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
7062 ; AVX2-NEXT:    vpminsd %ymm3, %ymm1, %ymm1
7063 ; AVX2-NEXT:    retq
7064 ;
7065 ; AVX512F-LABEL: test147:
7066 ; AVX512F:       # BB#0: # %entry
7067 ; AVX512F-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
7068 ; AVX512F-NEXT:    retq
7069 entry:
7070   %cmp = icmp sgt <16 x i32> %a, %b
7071   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7072   ret <16 x i32> %sel
7073 }
7074
7075 define <16 x i32> @test148(<16 x i32> %a, <16 x i32> %b) {
7076 ; SSE2-LABEL: test148:
7077 ; SSE2:       # BB#0: # %entry
7078 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
7079 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
7080 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
7081 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm12
7082 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
7083 ; SSE2-NEXT:    movdqa %xmm12, %xmm9
7084 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7085 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
7086 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm13
7087 ; SSE2-NEXT:    movdqa %xmm13, %xmm2
7088 ; SSE2-NEXT:    pxor %xmm0, %xmm2
7089 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
7090 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm14
7091 ; SSE2-NEXT:    movdqa %xmm14, %xmm11
7092 ; SSE2-NEXT:    pxor %xmm0, %xmm11
7093 ; SSE2-NEXT:    movdqa %xmm4, %xmm15
7094 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm15
7095 ; SSE2-NEXT:    pxor %xmm15, %xmm0
7096 ; SSE2-NEXT:    pandn %xmm4, %xmm15
7097 ; SSE2-NEXT:    pandn %xmm10, %xmm0
7098 ; SSE2-NEXT:    por %xmm15, %xmm0
7099 ; SSE2-NEXT:    pandn %xmm5, %xmm14
7100 ; SSE2-NEXT:    pandn %xmm1, %xmm11
7101 ; SSE2-NEXT:    por %xmm14, %xmm11
7102 ; SSE2-NEXT:    pandn %xmm6, %xmm13
7103 ; SSE2-NEXT:    pandn %xmm8, %xmm2
7104 ; SSE2-NEXT:    por %xmm13, %xmm2
7105 ; SSE2-NEXT:    pandn %xmm7, %xmm12
7106 ; SSE2-NEXT:    pandn %xmm3, %xmm9
7107 ; SSE2-NEXT:    por %xmm12, %xmm9
7108 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
7109 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
7110 ; SSE2-NEXT:    retq
7111 ;
7112 ; SSE4-LABEL: test148:
7113 ; SSE4:       # BB#0: # %entry
7114 ; SSE4-NEXT:    pminsd %xmm4, %xmm0
7115 ; SSE4-NEXT:    pminsd %xmm5, %xmm1
7116 ; SSE4-NEXT:    pminsd %xmm6, %xmm2
7117 ; SSE4-NEXT:    pminsd %xmm7, %xmm3
7118 ; SSE4-NEXT:    retq
7119 ;
7120 ; AVX1-LABEL: test148:
7121 ; AVX1:       # BB#0: # %entry
7122 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7123 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7124 ; AVX1-NEXT:    vpminsd %xmm4, %xmm5, %xmm4
7125 ; AVX1-NEXT:    vpminsd %xmm2, %xmm0, %xmm0
7126 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7127 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7128 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7129 ; AVX1-NEXT:    vpminsd %xmm2, %xmm4, %xmm2
7130 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm1
7131 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7132 ; AVX1-NEXT:    retq
7133 ;
7134 ; AVX2-LABEL: test148:
7135 ; AVX2:       # BB#0: # %entry
7136 ; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
7137 ; AVX2-NEXT:    vpminsd %ymm3, %ymm1, %ymm1
7138 ; AVX2-NEXT:    retq
7139 ;
7140 ; AVX512F-LABEL: test148:
7141 ; AVX512F:       # BB#0: # %entry
7142 ; AVX512F-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
7143 ; AVX512F-NEXT:    retq
7144 entry:
7145   %cmp = icmp sge <16 x i32> %a, %b
7146   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7147   ret <16 x i32> %sel
7148 }
7149
7150 define <16 x i32> @test149(<16 x i32> %a, <16 x i32> %b) {
7151 ; SSE2-LABEL: test149:
7152 ; SSE2:       # BB#0: # %entry
7153 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
7154 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
7155 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
7156 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7157 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
7158 ; SSE2-NEXT:    pxor %xmm0, %xmm8
7159 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm8
7160 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
7161 ; SSE2-NEXT:    pxor %xmm0, %xmm10
7162 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
7163 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7164 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
7165 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
7166 ; SSE2-NEXT:    pxor %xmm0, %xmm12
7167 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
7168 ; SSE2-NEXT:    pxor %xmm0, %xmm10
7169 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm10
7170 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
7171 ; SSE2-NEXT:    pxor %xmm0, %xmm12
7172 ; SSE2-NEXT:    pxor %xmm4, %xmm0
7173 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm0
7174 ; SSE2-NEXT:    pand %xmm0, %xmm4
7175 ; SSE2-NEXT:    pandn %xmm11, %xmm0
7176 ; SSE2-NEXT:    por %xmm4, %xmm0
7177 ; SSE2-NEXT:    pand %xmm10, %xmm5
7178 ; SSE2-NEXT:    pandn %xmm1, %xmm10
7179 ; SSE2-NEXT:    por %xmm5, %xmm10
7180 ; SSE2-NEXT:    pand %xmm9, %xmm6
7181 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7182 ; SSE2-NEXT:    por %xmm6, %xmm9
7183 ; SSE2-NEXT:    pand %xmm8, %xmm7
7184 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7185 ; SSE2-NEXT:    por %xmm7, %xmm8
7186 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
7187 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7188 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7189 ; SSE2-NEXT:    retq
7190 ;
7191 ; SSE4-LABEL: test149:
7192 ; SSE4:       # BB#0: # %entry
7193 ; SSE4-NEXT:    pmaxud %xmm4, %xmm0
7194 ; SSE4-NEXT:    pmaxud %xmm5, %xmm1
7195 ; SSE4-NEXT:    pmaxud %xmm6, %xmm2
7196 ; SSE4-NEXT:    pmaxud %xmm7, %xmm3
7197 ; SSE4-NEXT:    retq
7198 ;
7199 ; AVX1-LABEL: test149:
7200 ; AVX1:       # BB#0: # %entry
7201 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7202 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7203 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
7204 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
7205 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7206 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7207 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7208 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm2
7209 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
7210 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7211 ; AVX1-NEXT:    retq
7212 ;
7213 ; AVX2-LABEL: test149:
7214 ; AVX2:       # BB#0: # %entry
7215 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
7216 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
7217 ; AVX2-NEXT:    retq
7218 ;
7219 ; AVX512F-LABEL: test149:
7220 ; AVX512F:       # BB#0: # %entry
7221 ; AVX512F-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
7222 ; AVX512F-NEXT:    retq
7223 entry:
7224   %cmp = icmp ult <16 x i32> %a, %b
7225   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7226   ret <16 x i32> %sel
7227 }
7228
7229 define <16 x i32> @test150(<16 x i32> %a, <16 x i32> %b) {
7230 ; SSE2-LABEL: test150:
7231 ; SSE2:       # BB#0: # %entry
7232 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
7233 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [2147483648,2147483648,2147483648,2147483648]
7234 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
7235 ; SSE2-NEXT:    pxor %xmm14, %xmm0
7236 ; SSE2-NEXT:    movdqa %xmm3, %xmm12
7237 ; SSE2-NEXT:    pxor %xmm14, %xmm12
7238 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm12
7239 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
7240 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
7241 ; SSE2-NEXT:    pxor %xmm0, %xmm8
7242 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
7243 ; SSE2-NEXT:    pxor %xmm14, %xmm9
7244 ; SSE2-NEXT:    movdqa %xmm2, %xmm13
7245 ; SSE2-NEXT:    pxor %xmm14, %xmm13
7246 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm13
7247 ; SSE2-NEXT:    movdqa %xmm13, %xmm9
7248 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7249 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
7250 ; SSE2-NEXT:    pxor %xmm14, %xmm11
7251 ; SSE2-NEXT:    movdqa %xmm1, %xmm15
7252 ; SSE2-NEXT:    pxor %xmm14, %xmm15
7253 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
7254 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
7255 ; SSE2-NEXT:    pxor %xmm14, %xmm11
7256 ; SSE2-NEXT:    pxor %xmm10, %xmm14
7257 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7258 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
7259 ; SSE2-NEXT:    pxor %xmm0, %xmm11
7260 ; SSE2-NEXT:    pxor %xmm14, %xmm0
7261 ; SSE2-NEXT:    pandn %xmm4, %xmm14
7262 ; SSE2-NEXT:    pandn %xmm10, %xmm0
7263 ; SSE2-NEXT:    por %xmm14, %xmm0
7264 ; SSE2-NEXT:    pandn %xmm5, %xmm15
7265 ; SSE2-NEXT:    pandn %xmm1, %xmm11
7266 ; SSE2-NEXT:    por %xmm15, %xmm11
7267 ; SSE2-NEXT:    pandn %xmm6, %xmm13
7268 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7269 ; SSE2-NEXT:    por %xmm13, %xmm9
7270 ; SSE2-NEXT:    pandn %xmm7, %xmm12
7271 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7272 ; SSE2-NEXT:    por %xmm12, %xmm8
7273 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
7274 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7275 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7276 ; SSE2-NEXT:    retq
7277 ;
7278 ; SSE4-LABEL: test150:
7279 ; SSE4:       # BB#0: # %entry
7280 ; SSE4-NEXT:    pmaxud %xmm4, %xmm0
7281 ; SSE4-NEXT:    pmaxud %xmm5, %xmm1
7282 ; SSE4-NEXT:    pmaxud %xmm6, %xmm2
7283 ; SSE4-NEXT:    pmaxud %xmm7, %xmm3
7284 ; SSE4-NEXT:    retq
7285 ;
7286 ; AVX1-LABEL: test150:
7287 ; AVX1:       # BB#0: # %entry
7288 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7289 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7290 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
7291 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
7292 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7293 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7294 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7295 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm2
7296 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
7297 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7298 ; AVX1-NEXT:    retq
7299 ;
7300 ; AVX2-LABEL: test150:
7301 ; AVX2:       # BB#0: # %entry
7302 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
7303 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
7304 ; AVX2-NEXT:    retq
7305 ;
7306 ; AVX512F-LABEL: test150:
7307 ; AVX512F:       # BB#0: # %entry
7308 ; AVX512F-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
7309 ; AVX512F-NEXT:    retq
7310 entry:
7311   %cmp = icmp ule <16 x i32> %a, %b
7312   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7313   ret <16 x i32> %sel
7314 }
7315
7316 define <16 x i32> @test151(<16 x i32> %a, <16 x i32> %b) {
7317 ; SSE2-LABEL: test151:
7318 ; SSE2:       # BB#0: # %entry
7319 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
7320 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
7321 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
7322 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7323 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
7324 ; SSE2-NEXT:    pxor %xmm0, %xmm8
7325 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm8
7326 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
7327 ; SSE2-NEXT:    pxor %xmm0, %xmm10
7328 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
7329 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7330 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
7331 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
7332 ; SSE2-NEXT:    pxor %xmm0, %xmm12
7333 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
7334 ; SSE2-NEXT:    pxor %xmm0, %xmm10
7335 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm10
7336 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
7337 ; SSE2-NEXT:    pxor %xmm0, %xmm12
7338 ; SSE2-NEXT:    pxor %xmm11, %xmm0
7339 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm0
7340 ; SSE2-NEXT:    pand %xmm0, %xmm4
7341 ; SSE2-NEXT:    pandn %xmm11, %xmm0
7342 ; SSE2-NEXT:    por %xmm4, %xmm0
7343 ; SSE2-NEXT:    pand %xmm10, %xmm5
7344 ; SSE2-NEXT:    pandn %xmm1, %xmm10
7345 ; SSE2-NEXT:    por %xmm5, %xmm10
7346 ; SSE2-NEXT:    pand %xmm9, %xmm6
7347 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7348 ; SSE2-NEXT:    por %xmm6, %xmm9
7349 ; SSE2-NEXT:    pand %xmm8, %xmm7
7350 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7351 ; SSE2-NEXT:    por %xmm7, %xmm8
7352 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
7353 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7354 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7355 ; SSE2-NEXT:    retq
7356 ;
7357 ; SSE4-LABEL: test151:
7358 ; SSE4:       # BB#0: # %entry
7359 ; SSE4-NEXT:    pminud %xmm4, %xmm0
7360 ; SSE4-NEXT:    pminud %xmm5, %xmm1
7361 ; SSE4-NEXT:    pminud %xmm6, %xmm2
7362 ; SSE4-NEXT:    pminud %xmm7, %xmm3
7363 ; SSE4-NEXT:    retq
7364 ;
7365 ; AVX1-LABEL: test151:
7366 ; AVX1:       # BB#0: # %entry
7367 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7368 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7369 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
7370 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
7371 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7372 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7373 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7374 ; AVX1-NEXT:    vpminud %xmm2, %xmm4, %xmm2
7375 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
7376 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7377 ; AVX1-NEXT:    retq
7378 ;
7379 ; AVX2-LABEL: test151:
7380 ; AVX2:       # BB#0: # %entry
7381 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
7382 ; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
7383 ; AVX2-NEXT:    retq
7384 ;
7385 ; AVX512F-LABEL: test151:
7386 ; AVX512F:       # BB#0: # %entry
7387 ; AVX512F-NEXT:    vpminud %zmm1, %zmm0, %zmm0
7388 ; AVX512F-NEXT:    retq
7389 entry:
7390   %cmp = icmp ugt <16 x i32> %a, %b
7391   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7392   ret <16 x i32> %sel
7393 }
7394
7395 define <16 x i32> @test152(<16 x i32> %a, <16 x i32> %b) {
7396 ; SSE2-LABEL: test152:
7397 ; SSE2:       # BB#0: # %entry
7398 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
7399 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [2147483648,2147483648,2147483648,2147483648]
7400 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
7401 ; SSE2-NEXT:    pxor %xmm14, %xmm0
7402 ; SSE2-NEXT:    movdqa %xmm7, %xmm12
7403 ; SSE2-NEXT:    pxor %xmm14, %xmm12
7404 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm12
7405 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
7406 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
7407 ; SSE2-NEXT:    pxor %xmm0, %xmm8
7408 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
7409 ; SSE2-NEXT:    pxor %xmm14, %xmm9
7410 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
7411 ; SSE2-NEXT:    pxor %xmm14, %xmm13
7412 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm13
7413 ; SSE2-NEXT:    movdqa %xmm13, %xmm9
7414 ; SSE2-NEXT:    pxor %xmm0, %xmm9
7415 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
7416 ; SSE2-NEXT:    pxor %xmm14, %xmm11
7417 ; SSE2-NEXT:    movdqa %xmm5, %xmm15
7418 ; SSE2-NEXT:    pxor %xmm14, %xmm15
7419 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
7420 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
7421 ; SSE2-NEXT:    pxor %xmm14, %xmm11
7422 ; SSE2-NEXT:    pxor %xmm4, %xmm14
7423 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7424 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
7425 ; SSE2-NEXT:    pxor %xmm0, %xmm11
7426 ; SSE2-NEXT:    pxor %xmm14, %xmm0
7427 ; SSE2-NEXT:    pandn %xmm4, %xmm14
7428 ; SSE2-NEXT:    pandn %xmm10, %xmm0
7429 ; SSE2-NEXT:    por %xmm14, %xmm0
7430 ; SSE2-NEXT:    pandn %xmm5, %xmm15
7431 ; SSE2-NEXT:    pandn %xmm1, %xmm11
7432 ; SSE2-NEXT:    por %xmm15, %xmm11
7433 ; SSE2-NEXT:    pandn %xmm6, %xmm13
7434 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7435 ; SSE2-NEXT:    por %xmm13, %xmm9
7436 ; SSE2-NEXT:    pandn %xmm7, %xmm12
7437 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7438 ; SSE2-NEXT:    por %xmm12, %xmm8
7439 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
7440 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7441 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7442 ; SSE2-NEXT:    retq
7443 ;
7444 ; SSE4-LABEL: test152:
7445 ; SSE4:       # BB#0: # %entry
7446 ; SSE4-NEXT:    pminud %xmm4, %xmm0
7447 ; SSE4-NEXT:    pminud %xmm5, %xmm1
7448 ; SSE4-NEXT:    pminud %xmm6, %xmm2
7449 ; SSE4-NEXT:    pminud %xmm7, %xmm3
7450 ; SSE4-NEXT:    retq
7451 ;
7452 ; AVX1-LABEL: test152:
7453 ; AVX1:       # BB#0: # %entry
7454 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
7455 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7456 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
7457 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
7458 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
7459 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
7460 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7461 ; AVX1-NEXT:    vpminud %xmm2, %xmm4, %xmm2
7462 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
7463 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
7464 ; AVX1-NEXT:    retq
7465 ;
7466 ; AVX2-LABEL: test152:
7467 ; AVX2:       # BB#0: # %entry
7468 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
7469 ; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
7470 ; AVX2-NEXT:    retq
7471 ;
7472 ; AVX512F-LABEL: test152:
7473 ; AVX512F:       # BB#0: # %entry
7474 ; AVX512F-NEXT:    vpminud %zmm1, %zmm0, %zmm0
7475 ; AVX512F-NEXT:    retq
7476 entry:
7477   %cmp = icmp uge <16 x i32> %a, %b
7478   %sel = select <16 x i1> %cmp, <16 x i32> %b, <16 x i32> %a
7479   ret <16 x i32> %sel
7480 }
7481
7482 ; -----------------------
7483
7484 define <8 x i64> @test153(<8 x i64> %a, <8 x i64> %b) {
7485 ; SSE2-LABEL: test153:
7486 ; SSE2:       # BB#0: # %entry
7487 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,0,2147483648,0]
7488 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
7489 ; SSE2-NEXT:    pxor %xmm11, %xmm8
7490 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
7491 ; SSE2-NEXT:    pxor %xmm11, %xmm9
7492 ; SSE2-NEXT:    movdqa %xmm9, %xmm10
7493 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
7494 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm10[0,0,2,2]
7495 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm9
7496 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
7497 ; SSE2-NEXT:    pand %xmm12, %xmm9
7498 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
7499 ; SSE2-NEXT:    por %xmm9, %xmm8
7500 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
7501 ; SSE2-NEXT:    pxor %xmm11, %xmm9
7502 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
7503 ; SSE2-NEXT:    pxor %xmm11, %xmm10
7504 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
7505 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
7506 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
7507 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
7508 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
7509 ; SSE2-NEXT:    pand %xmm13, %xmm10
7510 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
7511 ; SSE2-NEXT:    por %xmm10, %xmm9
7512 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
7513 ; SSE2-NEXT:    pxor %xmm11, %xmm10
7514 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
7515 ; SSE2-NEXT:    pxor %xmm11, %xmm12
7516 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
7517 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm13
7518 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
7519 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm12
7520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
7521 ; SSE2-NEXT:    pand %xmm14, %xmm12
7522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm13[1,1,3,3]
7523 ; SSE2-NEXT:    por %xmm12, %xmm10
7524 ; SSE2-NEXT:    movdqa %xmm0, %xmm12
7525 ; SSE2-NEXT:    pxor %xmm11, %xmm12
7526 ; SSE2-NEXT:    pxor %xmm4, %xmm11
7527 ; SSE2-NEXT:    movdqa %xmm11, %xmm13
7528 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm13
7529 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
7530 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm11
7531 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
7532 ; SSE2-NEXT:    pand %xmm14, %xmm12
7533 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
7534 ; SSE2-NEXT:    por %xmm12, %xmm11
7535 ; SSE2-NEXT:    pand %xmm11, %xmm4
7536 ; SSE2-NEXT:    pandn %xmm0, %xmm11
7537 ; SSE2-NEXT:    por %xmm4, %xmm11
7538 ; SSE2-NEXT:    pand %xmm10, %xmm5
7539 ; SSE2-NEXT:    pandn %xmm1, %xmm10
7540 ; SSE2-NEXT:    por %xmm5, %xmm10
7541 ; SSE2-NEXT:    pand %xmm9, %xmm6
7542 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7543 ; SSE2-NEXT:    por %xmm6, %xmm9
7544 ; SSE2-NEXT:    pand %xmm8, %xmm7
7545 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7546 ; SSE2-NEXT:    por %xmm7, %xmm8
7547 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
7548 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
7549 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7550 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7551 ; SSE2-NEXT:    retq
7552 ;
7553 ; SSE4-LABEL: test153:
7554 ; SSE4:       # BB#0: # %entry
7555 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
7556 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
7557 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm9
7558 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
7559 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm10
7560 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
7561 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm11
7562 ; SSE4-NEXT:    movdqa %xmm4, %xmm0
7563 ; SSE4-NEXT:    pcmpgtq %xmm8, %xmm0
7564 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
7565 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
7566 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
7567 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
7568 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
7569 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
7570 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
7571 ; SSE4-NEXT:    movapd %xmm8, %xmm0
7572 ; SSE4-NEXT:    retq
7573 ;
7574 ; AVX1-LABEL: test153:
7575 ; AVX1:       # BB#0: # %entry
7576 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7577 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
7578 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
7579 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm5
7580 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
7581 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
7582 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
7583 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
7584 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm6
7585 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
7586 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7587 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7588 ; AVX1-NEXT:    retq
7589 ;
7590 ; AVX2-LABEL: test153:
7591 ; AVX2:       # BB#0: # %entry
7592 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm4
7593 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm5
7594 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7595 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7596 ; AVX2-NEXT:    retq
7597 ;
7598 ; AVX512F-LABEL: test153:
7599 ; AVX512F:       # BB#0: # %entry
7600 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
7601 ; AVX512F-NEXT:    retq
7602 entry:
7603   %cmp = icmp slt <8 x i64> %a, %b
7604   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
7605   ret <8 x i64> %sel
7606 }
7607
7608 define <8 x i64> @test154(<8 x i64> %a, <8 x i64> %b) {
7609 ; SSE2-LABEL: test154:
7610 ; SSE2:       # BB#0: # %entry
7611 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
7612 ; SSE2-NEXT:    movdqa %xmm8, -{{[0-9]+}}(%rsp) # 16-byte Spill
7613 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
7614 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
7615 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
7616 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
7617 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0]
7618 ; SSE2-NEXT:    pxor %xmm10, %xmm8
7619 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
7620 ; SSE2-NEXT:    pxor %xmm10, %xmm0
7621 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
7622 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
7623 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
7624 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
7625 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
7626 ; SSE2-NEXT:    pand %xmm12, %xmm0
7627 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
7628 ; SSE2-NEXT:    por %xmm0, %xmm12
7629 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
7630 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
7631 ; SSE2-NEXT:    pxor %xmm1, %xmm8
7632 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
7633 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7634 ; SSE2-NEXT:    movdqa %xmm3, %xmm13
7635 ; SSE2-NEXT:    pxor %xmm10, %xmm13
7636 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
7637 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7638 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
7639 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
7640 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
7641 ; SSE2-NEXT:    pand %xmm15, %xmm11
7642 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
7643 ; SSE2-NEXT:    por %xmm11, %xmm13
7644 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
7645 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7646 ; SSE2-NEXT:    movdqa %xmm2, %xmm14
7647 ; SSE2-NEXT:    pxor %xmm10, %xmm14
7648 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
7649 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
7650 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
7651 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
7652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
7653 ; SSE2-NEXT:    pand %xmm11, %xmm14
7654 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
7655 ; SSE2-NEXT:    por %xmm14, %xmm15
7656 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
7657 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7658 ; SSE2-NEXT:    pxor %xmm9, %xmm10
7659 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
7660 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7661 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
7662 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
7663 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
7664 ; SSE2-NEXT:    pand %xmm11, %xmm0
7665 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
7666 ; SSE2-NEXT:    pxor %xmm1, %xmm10
7667 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
7668 ; SSE2-NEXT:    por %xmm0, %xmm14
7669 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
7670 ; SSE2-NEXT:    pxor %xmm1, %xmm11
7671 ; SSE2-NEXT:    pxor %xmm14, %xmm1
7672 ; SSE2-NEXT:    pandn %xmm4, %xmm14
7673 ; SSE2-NEXT:    pandn %xmm9, %xmm1
7674 ; SSE2-NEXT:    por %xmm14, %xmm1
7675 ; SSE2-NEXT:    pandn %xmm5, %xmm15
7676 ; SSE2-NEXT:    pandn %xmm2, %xmm11
7677 ; SSE2-NEXT:    por %xmm15, %xmm11
7678 ; SSE2-NEXT:    pandn %xmm6, %xmm13
7679 ; SSE2-NEXT:    pandn %xmm3, %xmm10
7680 ; SSE2-NEXT:    por %xmm13, %xmm10
7681 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm12 # 16-byte Folded Reload
7682 ; SSE2-NEXT:    pandn %xmm7, %xmm8
7683 ; SSE2-NEXT:    por %xmm12, %xmm8
7684 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
7685 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
7686 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
7687 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7688 ; SSE2-NEXT:    retq
7689 ;
7690 ; SSE4-LABEL: test154:
7691 ; SSE4:       # BB#0: # %entry
7692 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
7693 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
7694 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm9
7695 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
7696 ; SSE4-NEXT:    pxor %xmm12, %xmm9
7697 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
7698 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm10
7699 ; SSE4-NEXT:    pxor %xmm12, %xmm10
7700 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
7701 ; SSE4-NEXT:    pcmpgtq %xmm5, %xmm11
7702 ; SSE4-NEXT:    pxor %xmm12, %xmm11
7703 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
7704 ; SSE4-NEXT:    pxor %xmm12, %xmm0
7705 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
7706 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
7707 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
7708 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
7709 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
7710 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
7711 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
7712 ; SSE4-NEXT:    movapd %xmm8, %xmm0
7713 ; SSE4-NEXT:    retq
7714 ;
7715 ; AVX1-LABEL: test154:
7716 ; AVX1:       # BB#0: # %entry
7717 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
7718 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
7719 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
7720 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
7721 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
7722 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm6
7723 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
7724 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
7725 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
7726 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
7727 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
7728 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
7729 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm7
7730 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm5
7731 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
7732 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7733 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7734 ; AVX1-NEXT:    retq
7735 ;
7736 ; AVX2-LABEL: test154:
7737 ; AVX2:       # BB#0: # %entry
7738 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
7739 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
7740 ; AVX2-NEXT:    vpxor %ymm5, %ymm4, %ymm4
7741 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm6
7742 ; AVX2-NEXT:    vpxor %ymm5, %ymm6, %ymm5
7743 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7744 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7745 ; AVX2-NEXT:    retq
7746 ;
7747 ; AVX512F-LABEL: test154:
7748 ; AVX512F:       # BB#0: # %entry
7749 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
7750 ; AVX512F-NEXT:    retq
7751 entry:
7752   %cmp = icmp sle <8 x i64> %a, %b
7753   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
7754   ret <8 x i64> %sel
7755 }
7756
7757 define <8 x i64> @test155(<8 x i64> %a, <8 x i64> %b) {
7758 ; SSE2-LABEL: test155:
7759 ; SSE2:       # BB#0: # %entry
7760 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,0,2147483648,0]
7761 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
7762 ; SSE2-NEXT:    pxor %xmm11, %xmm8
7763 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
7764 ; SSE2-NEXT:    pxor %xmm11, %xmm9
7765 ; SSE2-NEXT:    movdqa %xmm9, %xmm10
7766 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
7767 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm10[0,0,2,2]
7768 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm9
7769 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
7770 ; SSE2-NEXT:    pand %xmm12, %xmm9
7771 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
7772 ; SSE2-NEXT:    por %xmm9, %xmm8
7773 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
7774 ; SSE2-NEXT:    pxor %xmm11, %xmm9
7775 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
7776 ; SSE2-NEXT:    pxor %xmm11, %xmm10
7777 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
7778 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
7779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
7780 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
7781 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
7782 ; SSE2-NEXT:    pand %xmm13, %xmm10
7783 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
7784 ; SSE2-NEXT:    por %xmm10, %xmm9
7785 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
7786 ; SSE2-NEXT:    pxor %xmm11, %xmm10
7787 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
7788 ; SSE2-NEXT:    pxor %xmm11, %xmm12
7789 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
7790 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm13
7791 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
7792 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm12
7793 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
7794 ; SSE2-NEXT:    pand %xmm14, %xmm12
7795 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm13[1,1,3,3]
7796 ; SSE2-NEXT:    por %xmm12, %xmm10
7797 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
7798 ; SSE2-NEXT:    pxor %xmm11, %xmm12
7799 ; SSE2-NEXT:    pxor %xmm0, %xmm11
7800 ; SSE2-NEXT:    movdqa %xmm11, %xmm13
7801 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm13
7802 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
7803 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm11
7804 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
7805 ; SSE2-NEXT:    pand %xmm14, %xmm12
7806 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
7807 ; SSE2-NEXT:    por %xmm12, %xmm11
7808 ; SSE2-NEXT:    pand %xmm11, %xmm4
7809 ; SSE2-NEXT:    pandn %xmm0, %xmm11
7810 ; SSE2-NEXT:    por %xmm4, %xmm11
7811 ; SSE2-NEXT:    pand %xmm10, %xmm5
7812 ; SSE2-NEXT:    pandn %xmm1, %xmm10
7813 ; SSE2-NEXT:    por %xmm5, %xmm10
7814 ; SSE2-NEXT:    pand %xmm9, %xmm6
7815 ; SSE2-NEXT:    pandn %xmm2, %xmm9
7816 ; SSE2-NEXT:    por %xmm6, %xmm9
7817 ; SSE2-NEXT:    pand %xmm8, %xmm7
7818 ; SSE2-NEXT:    pandn %xmm3, %xmm8
7819 ; SSE2-NEXT:    por %xmm7, %xmm8
7820 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
7821 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
7822 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
7823 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7824 ; SSE2-NEXT:    retq
7825 ;
7826 ; SSE4-LABEL: test155:
7827 ; SSE4:       # BB#0: # %entry
7828 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
7829 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
7830 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm9
7831 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
7832 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm10
7833 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
7834 ; SSE4-NEXT:    pcmpgtq %xmm5, %xmm11
7835 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
7836 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
7837 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
7838 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
7839 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
7840 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
7841 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
7842 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
7843 ; SSE4-NEXT:    movapd %xmm8, %xmm0
7844 ; SSE4-NEXT:    retq
7845 ;
7846 ; AVX1-LABEL: test155:
7847 ; AVX1:       # BB#0: # %entry
7848 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
7849 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
7850 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
7851 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm5
7852 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
7853 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
7854 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
7855 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
7856 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm6
7857 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
7858 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7859 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7860 ; AVX1-NEXT:    retq
7861 ;
7862 ; AVX2-LABEL: test155:
7863 ; AVX2:       # BB#0: # %entry
7864 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
7865 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm5
7866 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
7867 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
7868 ; AVX2-NEXT:    retq
7869 ;
7870 ; AVX512F-LABEL: test155:
7871 ; AVX512F:       # BB#0: # %entry
7872 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
7873 ; AVX512F-NEXT:    retq
7874 entry:
7875   %cmp = icmp sgt <8 x i64> %a, %b
7876   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
7877   ret <8 x i64> %sel
7878 }
7879
7880 define <8 x i64> @test156(<8 x i64> %a, <8 x i64> %b) {
7881 ; SSE2-LABEL: test156:
7882 ; SSE2:       # BB#0: # %entry
7883 ; SSE2-NEXT:    movdqa %xmm7, %xmm11
7884 ; SSE2-NEXT:    movdqa %xmm11, -{{[0-9]+}}(%rsp) # 16-byte Spill
7885 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
7886 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
7887 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
7888 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
7889 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0]
7890 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
7891 ; SSE2-NEXT:    pxor %xmm10, %xmm8
7892 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
7893 ; SSE2-NEXT:    pxor %xmm10, %xmm0
7894 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
7895 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
7896 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
7897 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
7898 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
7899 ; SSE2-NEXT:    pand %xmm12, %xmm0
7900 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
7901 ; SSE2-NEXT:    por %xmm0, %xmm12
7902 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
7903 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
7904 ; SSE2-NEXT:    pxor %xmm1, %xmm8
7905 ; SSE2-NEXT:    movdqa %xmm3, %xmm11
7906 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7907 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
7908 ; SSE2-NEXT:    pxor %xmm10, %xmm13
7909 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
7910 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7911 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
7912 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
7913 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
7914 ; SSE2-NEXT:    pand %xmm15, %xmm11
7915 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
7916 ; SSE2-NEXT:    por %xmm11, %xmm13
7917 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
7918 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7919 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
7920 ; SSE2-NEXT:    pxor %xmm10, %xmm14
7921 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
7922 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
7923 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
7924 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
7925 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
7926 ; SSE2-NEXT:    pand %xmm11, %xmm14
7927 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
7928 ; SSE2-NEXT:    por %xmm14, %xmm15
7929 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
7930 ; SSE2-NEXT:    pxor %xmm10, %xmm11
7931 ; SSE2-NEXT:    pxor %xmm4, %xmm10
7932 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
7933 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
7934 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
7935 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
7936 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
7937 ; SSE2-NEXT:    pand %xmm11, %xmm0
7938 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
7939 ; SSE2-NEXT:    pxor %xmm1, %xmm10
7940 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
7941 ; SSE2-NEXT:    por %xmm0, %xmm14
7942 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
7943 ; SSE2-NEXT:    pxor %xmm1, %xmm11
7944 ; SSE2-NEXT:    pxor %xmm14, %xmm1
7945 ; SSE2-NEXT:    pandn %xmm4, %xmm14
7946 ; SSE2-NEXT:    pandn %xmm9, %xmm1
7947 ; SSE2-NEXT:    por %xmm14, %xmm1
7948 ; SSE2-NEXT:    pandn %xmm5, %xmm15
7949 ; SSE2-NEXT:    pandn %xmm2, %xmm11
7950 ; SSE2-NEXT:    por %xmm15, %xmm11
7951 ; SSE2-NEXT:    pandn %xmm6, %xmm13
7952 ; SSE2-NEXT:    pandn %xmm3, %xmm10
7953 ; SSE2-NEXT:    por %xmm13, %xmm10
7954 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm12 # 16-byte Folded Reload
7955 ; SSE2-NEXT:    pandn %xmm7, %xmm8
7956 ; SSE2-NEXT:    por %xmm12, %xmm8
7957 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
7958 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
7959 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
7960 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
7961 ; SSE2-NEXT:    retq
7962 ;
7963 ; SSE4-LABEL: test156:
7964 ; SSE4:       # BB#0: # %entry
7965 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
7966 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
7967 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm9
7968 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
7969 ; SSE4-NEXT:    pxor %xmm0, %xmm9
7970 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
7971 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm10
7972 ; SSE4-NEXT:    pxor %xmm0, %xmm10
7973 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
7974 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm11
7975 ; SSE4-NEXT:    pxor %xmm0, %xmm11
7976 ; SSE4-NEXT:    movdqa %xmm4, %xmm12
7977 ; SSE4-NEXT:    pcmpgtq %xmm8, %xmm12
7978 ; SSE4-NEXT:    pxor %xmm12, %xmm0
7979 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
7980 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
7981 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
7982 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
7983 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
7984 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
7985 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
7986 ; SSE4-NEXT:    movapd %xmm8, %xmm0
7987 ; SSE4-NEXT:    retq
7988 ;
7989 ; AVX1-LABEL: test156:
7990 ; AVX1:       # BB#0: # %entry
7991 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
7992 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
7993 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
7994 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
7995 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
7996 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm6
7997 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
7998 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
7999 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
8000 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
8001 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8002 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
8003 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm7
8004 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm5
8005 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
8006 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8007 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8008 ; AVX1-NEXT:    retq
8009 ;
8010 ; AVX2-LABEL: test156:
8011 ; AVX2:       # BB#0: # %entry
8012 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm4
8013 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
8014 ; AVX2-NEXT:    vpxor %ymm5, %ymm4, %ymm4
8015 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm6
8016 ; AVX2-NEXT:    vpxor %ymm5, %ymm6, %ymm5
8017 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8018 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8019 ; AVX2-NEXT:    retq
8020 ;
8021 ; AVX512F-LABEL: test156:
8022 ; AVX512F:       # BB#0: # %entry
8023 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
8024 ; AVX512F-NEXT:    retq
8025 entry:
8026   %cmp = icmp sge <8 x i64> %a, %b
8027   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
8028   ret <8 x i64> %sel
8029 }
8030
8031 define <8 x i64> @test157(<8 x i64> %a, <8 x i64> %b) {
8032 ; SSE2-LABEL: test157:
8033 ; SSE2:       # BB#0: # %entry
8034 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
8035 ; SSE2-NEXT:    movdqa %xmm3, %xmm8
8036 ; SSE2-NEXT:    pxor %xmm11, %xmm8
8037 ; SSE2-NEXT:    movdqa %xmm7, %xmm9
8038 ; SSE2-NEXT:    pxor %xmm11, %xmm9
8039 ; SSE2-NEXT:    movdqa %xmm9, %xmm10
8040 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
8041 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm10[0,0,2,2]
8042 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm9
8043 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
8044 ; SSE2-NEXT:    pand %xmm12, %xmm9
8045 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
8046 ; SSE2-NEXT:    por %xmm9, %xmm8
8047 ; SSE2-NEXT:    movdqa %xmm2, %xmm9
8048 ; SSE2-NEXT:    pxor %xmm11, %xmm9
8049 ; SSE2-NEXT:    movdqa %xmm6, %xmm10
8050 ; SSE2-NEXT:    pxor %xmm11, %xmm10
8051 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
8052 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
8053 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
8054 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
8055 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
8056 ; SSE2-NEXT:    pand %xmm13, %xmm10
8057 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
8058 ; SSE2-NEXT:    por %xmm10, %xmm9
8059 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
8060 ; SSE2-NEXT:    pxor %xmm11, %xmm10
8061 ; SSE2-NEXT:    movdqa %xmm5, %xmm12
8062 ; SSE2-NEXT:    pxor %xmm11, %xmm12
8063 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
8064 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm13
8065 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
8066 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm12
8067 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
8068 ; SSE2-NEXT:    pand %xmm14, %xmm12
8069 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm13[1,1,3,3]
8070 ; SSE2-NEXT:    por %xmm12, %xmm10
8071 ; SSE2-NEXT:    movdqa %xmm0, %xmm12
8072 ; SSE2-NEXT:    pxor %xmm11, %xmm12
8073 ; SSE2-NEXT:    pxor %xmm4, %xmm11
8074 ; SSE2-NEXT:    movdqa %xmm11, %xmm13
8075 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm13
8076 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
8077 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm11
8078 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
8079 ; SSE2-NEXT:    pand %xmm14, %xmm12
8080 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
8081 ; SSE2-NEXT:    por %xmm12, %xmm11
8082 ; SSE2-NEXT:    pand %xmm11, %xmm4
8083 ; SSE2-NEXT:    pandn %xmm0, %xmm11
8084 ; SSE2-NEXT:    por %xmm4, %xmm11
8085 ; SSE2-NEXT:    pand %xmm10, %xmm5
8086 ; SSE2-NEXT:    pandn %xmm1, %xmm10
8087 ; SSE2-NEXT:    por %xmm5, %xmm10
8088 ; SSE2-NEXT:    pand %xmm9, %xmm6
8089 ; SSE2-NEXT:    pandn %xmm2, %xmm9
8090 ; SSE2-NEXT:    por %xmm6, %xmm9
8091 ; SSE2-NEXT:    pand %xmm8, %xmm7
8092 ; SSE2-NEXT:    pandn %xmm3, %xmm8
8093 ; SSE2-NEXT:    por %xmm7, %xmm8
8094 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
8095 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
8096 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
8097 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
8098 ; SSE2-NEXT:    retq
8099 ;
8100 ; SSE4-LABEL: test157:
8101 ; SSE4:       # BB#0: # %entry
8102 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
8103 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
8104 ; SSE4-NEXT:    movdqa %xmm3, %xmm10
8105 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8106 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
8107 ; SSE4-NEXT:    pxor %xmm0, %xmm9
8108 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
8109 ; SSE4-NEXT:    movdqa %xmm2, %xmm11
8110 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8111 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
8112 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8113 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
8114 ; SSE4-NEXT:    movdqa %xmm1, %xmm12
8115 ; SSE4-NEXT:    pxor %xmm0, %xmm12
8116 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
8117 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8118 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm11
8119 ; SSE4-NEXT:    movdqa %xmm8, %xmm12
8120 ; SSE4-NEXT:    pxor %xmm0, %xmm12
8121 ; SSE4-NEXT:    pxor %xmm4, %xmm0
8122 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm0
8123 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
8124 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
8125 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
8126 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
8127 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
8128 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
8129 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
8130 ; SSE4-NEXT:    movapd %xmm8, %xmm0
8131 ; SSE4-NEXT:    retq
8132 ;
8133 ; AVX1-LABEL: test157:
8134 ; AVX1:       # BB#0: # %entry
8135 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
8136 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
8137 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
8138 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
8139 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8140 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
8141 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm6
8142 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm7
8143 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8144 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
8145 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
8146 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8147 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
8148 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
8149 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8150 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm7
8151 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm5
8152 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
8153 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
8154 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8155 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8156 ; AVX1-NEXT:    retq
8157 ;
8158 ; AVX2-LABEL: test157:
8159 ; AVX2:       # BB#0: # %entry
8160 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
8161 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
8162 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm6
8163 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
8164 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
8165 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm4
8166 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm4, %ymm4
8167 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
8168 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm1, %ymm1
8169 ; AVX2-NEXT:    retq
8170 ;
8171 ; AVX512F-LABEL: test157:
8172 ; AVX512F:       # BB#0: # %entry
8173 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
8174 ; AVX512F-NEXT:    retq
8175 entry:
8176   %cmp = icmp ult <8 x i64> %a, %b
8177   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
8178   ret <8 x i64> %sel
8179 }
8180
8181 define <8 x i64> @test158(<8 x i64> %a, <8 x i64> %b) {
8182 ; SSE2-LABEL: test158:
8183 ; SSE2:       # BB#0: # %entry
8184 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
8185 ; SSE2-NEXT:    movdqa %xmm8, -{{[0-9]+}}(%rsp) # 16-byte Spill
8186 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
8187 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
8188 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
8189 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
8190 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
8191 ; SSE2-NEXT:    pxor %xmm10, %xmm8
8192 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
8193 ; SSE2-NEXT:    pxor %xmm10, %xmm0
8194 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
8195 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
8196 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
8197 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
8198 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
8199 ; SSE2-NEXT:    pand %xmm12, %xmm0
8200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
8201 ; SSE2-NEXT:    por %xmm0, %xmm12
8202 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
8203 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
8204 ; SSE2-NEXT:    pxor %xmm1, %xmm8
8205 ; SSE2-NEXT:    movdqa %xmm6, %xmm11
8206 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8207 ; SSE2-NEXT:    movdqa %xmm3, %xmm13
8208 ; SSE2-NEXT:    pxor %xmm10, %xmm13
8209 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
8210 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
8211 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
8212 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
8213 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
8214 ; SSE2-NEXT:    pand %xmm15, %xmm11
8215 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
8216 ; SSE2-NEXT:    por %xmm11, %xmm13
8217 ; SSE2-NEXT:    movdqa %xmm5, %xmm11
8218 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8219 ; SSE2-NEXT:    movdqa %xmm2, %xmm14
8220 ; SSE2-NEXT:    pxor %xmm10, %xmm14
8221 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
8222 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
8223 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
8224 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
8225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
8226 ; SSE2-NEXT:    pand %xmm11, %xmm14
8227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
8228 ; SSE2-NEXT:    por %xmm14, %xmm15
8229 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
8230 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8231 ; SSE2-NEXT:    pxor %xmm9, %xmm10
8232 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
8233 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
8234 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
8235 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
8236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
8237 ; SSE2-NEXT:    pand %xmm11, %xmm0
8238 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
8239 ; SSE2-NEXT:    pxor %xmm1, %xmm10
8240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
8241 ; SSE2-NEXT:    por %xmm0, %xmm14
8242 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
8243 ; SSE2-NEXT:    pxor %xmm1, %xmm11
8244 ; SSE2-NEXT:    pxor %xmm14, %xmm1
8245 ; SSE2-NEXT:    pandn %xmm4, %xmm14
8246 ; SSE2-NEXT:    pandn %xmm9, %xmm1
8247 ; SSE2-NEXT:    por %xmm14, %xmm1
8248 ; SSE2-NEXT:    pandn %xmm5, %xmm15
8249 ; SSE2-NEXT:    pandn %xmm2, %xmm11
8250 ; SSE2-NEXT:    por %xmm15, %xmm11
8251 ; SSE2-NEXT:    pandn %xmm6, %xmm13
8252 ; SSE2-NEXT:    pandn %xmm3, %xmm10
8253 ; SSE2-NEXT:    por %xmm13, %xmm10
8254 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm12 # 16-byte Folded Reload
8255 ; SSE2-NEXT:    pandn %xmm7, %xmm8
8256 ; SSE2-NEXT:    por %xmm12, %xmm8
8257 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
8258 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
8259 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
8260 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
8261 ; SSE2-NEXT:    retq
8262 ;
8263 ; SSE4-LABEL: test158:
8264 ; SSE4:       # BB#0: # %entry
8265 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
8266 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
8267 ; SSE4-NEXT:    movdqa %xmm7, %xmm10
8268 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8269 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
8270 ; SSE4-NEXT:    pxor %xmm0, %xmm9
8271 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
8272 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
8273 ; SSE4-NEXT:    pxor %xmm12, %xmm9
8274 ; SSE4-NEXT:    movdqa %xmm6, %xmm11
8275 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8276 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
8277 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8278 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
8279 ; SSE4-NEXT:    pxor %xmm12, %xmm10
8280 ; SSE4-NEXT:    movdqa %xmm5, %xmm13
8281 ; SSE4-NEXT:    pxor %xmm0, %xmm13
8282 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
8283 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8284 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm11
8285 ; SSE4-NEXT:    pxor %xmm12, %xmm11
8286 ; SSE4-NEXT:    movdqa %xmm4, %xmm13
8287 ; SSE4-NEXT:    pxor %xmm0, %xmm13
8288 ; SSE4-NEXT:    pxor %xmm8, %xmm0
8289 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm0
8290 ; SSE4-NEXT:    pxor %xmm12, %xmm0
8291 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
8292 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
8293 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
8294 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
8295 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
8296 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
8297 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
8298 ; SSE4-NEXT:    movapd %xmm8, %xmm0
8299 ; SSE4-NEXT:    retq
8300 ;
8301 ; AVX1-LABEL: test158:
8302 ; AVX1:       # BB#0: # %entry
8303 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
8304 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
8305 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
8306 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
8307 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8308 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
8309 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
8310 ; AVX1-NEXT:    vpxor %xmm8, %xmm4, %xmm4
8311 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm7
8312 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm6
8313 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
8314 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
8315 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
8316 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
8317 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8318 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
8319 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
8320 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8321 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
8322 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm7
8323 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm5
8324 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
8325 ; AVX1-NEXT:    vpxor %xmm8, %xmm5, %xmm5
8326 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
8327 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8328 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8329 ; AVX1-NEXT:    retq
8330 ;
8331 ; AVX2-LABEL: test158:
8332 ; AVX2:       # BB#0: # %entry
8333 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
8334 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm5
8335 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm6
8336 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
8337 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
8338 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
8339 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm7
8340 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm4
8341 ; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm4, %ymm4
8342 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
8343 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
8344 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm1, %ymm1
8345 ; AVX2-NEXT:    retq
8346 ;
8347 ; AVX512F-LABEL: test158:
8348 ; AVX512F:       # BB#0: # %entry
8349 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
8350 ; AVX512F-NEXT:    retq
8351 entry:
8352   %cmp = icmp ule <8 x i64> %a, %b
8353   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
8354   ret <8 x i64> %sel
8355 }
8356
8357 define <8 x i64> @test159(<8 x i64> %a, <8 x i64> %b) {
8358 ; SSE2-LABEL: test159:
8359 ; SSE2:       # BB#0: # %entry
8360 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
8361 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
8362 ; SSE2-NEXT:    pxor %xmm11, %xmm8
8363 ; SSE2-NEXT:    movdqa %xmm3, %xmm9
8364 ; SSE2-NEXT:    pxor %xmm11, %xmm9
8365 ; SSE2-NEXT:    movdqa %xmm9, %xmm10
8366 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
8367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm10[0,0,2,2]
8368 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm9
8369 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
8370 ; SSE2-NEXT:    pand %xmm12, %xmm9
8371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
8372 ; SSE2-NEXT:    por %xmm9, %xmm8
8373 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
8374 ; SSE2-NEXT:    pxor %xmm11, %xmm9
8375 ; SSE2-NEXT:    movdqa %xmm2, %xmm10
8376 ; SSE2-NEXT:    pxor %xmm11, %xmm10
8377 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
8378 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
8379 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
8380 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
8381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
8382 ; SSE2-NEXT:    pand %xmm13, %xmm10
8383 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
8384 ; SSE2-NEXT:    por %xmm10, %xmm9
8385 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
8386 ; SSE2-NEXT:    pxor %xmm11, %xmm10
8387 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
8388 ; SSE2-NEXT:    pxor %xmm11, %xmm12
8389 ; SSE2-NEXT:    movdqa %xmm12, %xmm13
8390 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm13
8391 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
8392 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm12
8393 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
8394 ; SSE2-NEXT:    pand %xmm14, %xmm12
8395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm13[1,1,3,3]
8396 ; SSE2-NEXT:    por %xmm12, %xmm10
8397 ; SSE2-NEXT:    movdqa %xmm4, %xmm12
8398 ; SSE2-NEXT:    pxor %xmm11, %xmm12
8399 ; SSE2-NEXT:    pxor %xmm0, %xmm11
8400 ; SSE2-NEXT:    movdqa %xmm11, %xmm13
8401 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm13
8402 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
8403 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm11
8404 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
8405 ; SSE2-NEXT:    pand %xmm14, %xmm12
8406 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
8407 ; SSE2-NEXT:    por %xmm12, %xmm11
8408 ; SSE2-NEXT:    pand %xmm11, %xmm4
8409 ; SSE2-NEXT:    pandn %xmm0, %xmm11
8410 ; SSE2-NEXT:    por %xmm4, %xmm11
8411 ; SSE2-NEXT:    pand %xmm10, %xmm5
8412 ; SSE2-NEXT:    pandn %xmm1, %xmm10
8413 ; SSE2-NEXT:    por %xmm5, %xmm10
8414 ; SSE2-NEXT:    pand %xmm9, %xmm6
8415 ; SSE2-NEXT:    pandn %xmm2, %xmm9
8416 ; SSE2-NEXT:    por %xmm6, %xmm9
8417 ; SSE2-NEXT:    pand %xmm8, %xmm7
8418 ; SSE2-NEXT:    pandn %xmm3, %xmm8
8419 ; SSE2-NEXT:    por %xmm7, %xmm8
8420 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
8421 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
8422 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
8423 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
8424 ; SSE2-NEXT:    retq
8425 ;
8426 ; SSE4-LABEL: test159:
8427 ; SSE4:       # BB#0: # %entry
8428 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
8429 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
8430 ; SSE4-NEXT:    movdqa %xmm7, %xmm10
8431 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8432 ; SSE4-NEXT:    movdqa %xmm3, %xmm9
8433 ; SSE4-NEXT:    pxor %xmm0, %xmm9
8434 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
8435 ; SSE4-NEXT:    movdqa %xmm6, %xmm11
8436 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8437 ; SSE4-NEXT:    movdqa %xmm2, %xmm10
8438 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8439 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
8440 ; SSE4-NEXT:    movdqa %xmm5, %xmm12
8441 ; SSE4-NEXT:    pxor %xmm0, %xmm12
8442 ; SSE4-NEXT:    movdqa %xmm1, %xmm11
8443 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8444 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm11
8445 ; SSE4-NEXT:    movdqa %xmm4, %xmm12
8446 ; SSE4-NEXT:    pxor %xmm0, %xmm12
8447 ; SSE4-NEXT:    pxor %xmm8, %xmm0
8448 ; SSE4-NEXT:    pcmpgtq %xmm12, %xmm0
8449 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
8450 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
8451 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
8452 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
8453 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
8454 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
8455 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
8456 ; SSE4-NEXT:    movapd %xmm8, %xmm0
8457 ; SSE4-NEXT:    retq
8458 ;
8459 ; AVX1-LABEL: test159:
8460 ; AVX1:       # BB#0: # %entry
8461 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
8462 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
8463 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
8464 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
8465 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8466 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
8467 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm6
8468 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm7
8469 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8470 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
8471 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
8472 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8473 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
8474 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
8475 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8476 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm7
8477 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm5
8478 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
8479 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
8480 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8481 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8482 ; AVX1-NEXT:    retq
8483 ;
8484 ; AVX2-LABEL: test159:
8485 ; AVX2:       # BB#0: # %entry
8486 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
8487 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm5
8488 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm6
8489 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
8490 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm6
8491 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm4
8492 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm4, %ymm4
8493 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
8494 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm1, %ymm1
8495 ; AVX2-NEXT:    retq
8496 ;
8497 ; AVX512F-LABEL: test159:
8498 ; AVX512F:       # BB#0: # %entry
8499 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
8500 ; AVX512F-NEXT:    retq
8501 entry:
8502   %cmp = icmp ugt <8 x i64> %a, %b
8503   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
8504   ret <8 x i64> %sel
8505 }
8506
8507 define <8 x i64> @test160(<8 x i64> %a, <8 x i64> %b) {
8508 ; SSE2-LABEL: test160:
8509 ; SSE2:       # BB#0: # %entry
8510 ; SSE2-NEXT:    movdqa %xmm7, %xmm11
8511 ; SSE2-NEXT:    movdqa %xmm11, -{{[0-9]+}}(%rsp) # 16-byte Spill
8512 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
8513 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
8514 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
8515 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
8516 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
8517 ; SSE2-NEXT:    movdqa %xmm7, %xmm8
8518 ; SSE2-NEXT:    pxor %xmm10, %xmm8
8519 ; SSE2-NEXT:    movdqa %xmm11, %xmm0
8520 ; SSE2-NEXT:    pxor %xmm10, %xmm0
8521 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
8522 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm11
8523 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
8524 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
8525 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
8526 ; SSE2-NEXT:    pand %xmm12, %xmm0
8527 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
8528 ; SSE2-NEXT:    por %xmm0, %xmm12
8529 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
8530 ; SSE2-NEXT:    movdqa %xmm12, %xmm8
8531 ; SSE2-NEXT:    pxor %xmm1, %xmm8
8532 ; SSE2-NEXT:    movdqa %xmm3, %xmm11
8533 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8534 ; SSE2-NEXT:    movdqa %xmm6, %xmm13
8535 ; SSE2-NEXT:    pxor %xmm10, %xmm13
8536 ; SSE2-NEXT:    movdqa %xmm13, %xmm14
8537 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
8538 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
8539 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm13
8540 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm13[1,1,3,3]
8541 ; SSE2-NEXT:    pand %xmm15, %xmm11
8542 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm14[1,1,3,3]
8543 ; SSE2-NEXT:    por %xmm11, %xmm13
8544 ; SSE2-NEXT:    movdqa %xmm2, %xmm11
8545 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8546 ; SSE2-NEXT:    movdqa %xmm5, %xmm14
8547 ; SSE2-NEXT:    pxor %xmm10, %xmm14
8548 ; SSE2-NEXT:    movdqa %xmm14, %xmm15
8549 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm15
8550 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm14
8551 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm15[0,0,2,2]
8552 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
8553 ; SSE2-NEXT:    pand %xmm11, %xmm14
8554 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm15[1,1,3,3]
8555 ; SSE2-NEXT:    por %xmm14, %xmm15
8556 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
8557 ; SSE2-NEXT:    pxor %xmm10, %xmm11
8558 ; SSE2-NEXT:    pxor %xmm4, %xmm10
8559 ; SSE2-NEXT:    movdqa %xmm10, %xmm14
8560 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm14
8561 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm10
8562 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[0,0,2,2]
8563 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
8564 ; SSE2-NEXT:    pand %xmm11, %xmm0
8565 ; SSE2-NEXT:    movdqa %xmm13, %xmm10
8566 ; SSE2-NEXT:    pxor %xmm1, %xmm10
8567 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm14[1,1,3,3]
8568 ; SSE2-NEXT:    por %xmm0, %xmm14
8569 ; SSE2-NEXT:    movdqa %xmm15, %xmm11
8570 ; SSE2-NEXT:    pxor %xmm1, %xmm11
8571 ; SSE2-NEXT:    pxor %xmm14, %xmm1
8572 ; SSE2-NEXT:    pandn %xmm4, %xmm14
8573 ; SSE2-NEXT:    pandn %xmm9, %xmm1
8574 ; SSE2-NEXT:    por %xmm14, %xmm1
8575 ; SSE2-NEXT:    pandn %xmm5, %xmm15
8576 ; SSE2-NEXT:    pandn %xmm2, %xmm11
8577 ; SSE2-NEXT:    por %xmm15, %xmm11
8578 ; SSE2-NEXT:    pandn %xmm6, %xmm13
8579 ; SSE2-NEXT:    pandn %xmm3, %xmm10
8580 ; SSE2-NEXT:    por %xmm13, %xmm10
8581 ; SSE2-NEXT:    pandn -{{[0-9]+}}(%rsp), %xmm12 # 16-byte Folded Reload
8582 ; SSE2-NEXT:    pandn %xmm7, %xmm8
8583 ; SSE2-NEXT:    por %xmm12, %xmm8
8584 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
8585 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
8586 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
8587 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
8588 ; SSE2-NEXT:    retq
8589 ;
8590 ; SSE4-LABEL: test160:
8591 ; SSE4:       # BB#0: # %entry
8592 ; SSE4-NEXT:    movdqa %xmm0, %xmm8
8593 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
8594 ; SSE4-NEXT:    movdqa %xmm3, %xmm10
8595 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8596 ; SSE4-NEXT:    movdqa %xmm7, %xmm9
8597 ; SSE4-NEXT:    pxor %xmm0, %xmm9
8598 ; SSE4-NEXT:    pcmpgtq %xmm10, %xmm9
8599 ; SSE4-NEXT:    pcmpeqd %xmm12, %xmm12
8600 ; SSE4-NEXT:    pxor %xmm12, %xmm9
8601 ; SSE4-NEXT:    movdqa %xmm2, %xmm11
8602 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8603 ; SSE4-NEXT:    movdqa %xmm6, %xmm10
8604 ; SSE4-NEXT:    pxor %xmm0, %xmm10
8605 ; SSE4-NEXT:    pcmpgtq %xmm11, %xmm10
8606 ; SSE4-NEXT:    pxor %xmm12, %xmm10
8607 ; SSE4-NEXT:    movdqa %xmm1, %xmm13
8608 ; SSE4-NEXT:    pxor %xmm0, %xmm13
8609 ; SSE4-NEXT:    movdqa %xmm5, %xmm11
8610 ; SSE4-NEXT:    pxor %xmm0, %xmm11
8611 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm11
8612 ; SSE4-NEXT:    pxor %xmm12, %xmm11
8613 ; SSE4-NEXT:    movdqa %xmm8, %xmm13
8614 ; SSE4-NEXT:    pxor %xmm0, %xmm13
8615 ; SSE4-NEXT:    pxor %xmm4, %xmm0
8616 ; SSE4-NEXT:    pcmpgtq %xmm13, %xmm0
8617 ; SSE4-NEXT:    pxor %xmm12, %xmm0
8618 ; SSE4-NEXT:    blendvpd %xmm4, %xmm8
8619 ; SSE4-NEXT:    movdqa %xmm11, %xmm0
8620 ; SSE4-NEXT:    blendvpd %xmm5, %xmm1
8621 ; SSE4-NEXT:    movdqa %xmm10, %xmm0
8622 ; SSE4-NEXT:    blendvpd %xmm6, %xmm2
8623 ; SSE4-NEXT:    movdqa %xmm9, %xmm0
8624 ; SSE4-NEXT:    blendvpd %xmm7, %xmm3
8625 ; SSE4-NEXT:    movapd %xmm8, %xmm0
8626 ; SSE4-NEXT:    retq
8627 ;
8628 ; AVX1-LABEL: test160:
8629 ; AVX1:       # BB#0: # %entry
8630 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
8631 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
8632 ; AVX1-NEXT:    vxorps %xmm5, %xmm4, %xmm4
8633 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
8634 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8635 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
8636 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
8637 ; AVX1-NEXT:    vpxor %xmm8, %xmm4, %xmm4
8638 ; AVX1-NEXT:    vxorps %xmm5, %xmm1, %xmm7
8639 ; AVX1-NEXT:    vxorps %xmm5, %xmm3, %xmm6
8640 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
8641 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
8642 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm4
8643 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
8644 ; AVX1-NEXT:    vxorps %xmm5, %xmm6, %xmm6
8645 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
8646 ; AVX1-NEXT:    vxorps %xmm5, %xmm7, %xmm7
8647 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
8648 ; AVX1-NEXT:    vpxor %xmm8, %xmm6, %xmm6
8649 ; AVX1-NEXT:    vxorps %xmm5, %xmm0, %xmm7
8650 ; AVX1-NEXT:    vxorps %xmm5, %xmm2, %xmm5
8651 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm5
8652 ; AVX1-NEXT:    vpxor %xmm8, %xmm5, %xmm5
8653 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
8654 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
8655 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm1, %ymm1
8656 ; AVX1-NEXT:    retq
8657 ;
8658 ; AVX2-LABEL: test160:
8659 ; AVX2:       # BB#0: # %entry
8660 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm4
8661 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
8662 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm6
8663 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
8664 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
8665 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
8666 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm7
8667 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm4
8668 ; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm4, %ymm4
8669 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
8670 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
8671 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm1, %ymm1
8672 ; AVX2-NEXT:    retq
8673 ;
8674 ; AVX512F-LABEL: test160:
8675 ; AVX512F:       # BB#0: # %entry
8676 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
8677 ; AVX512F-NEXT:    retq
8678 entry:
8679   %cmp = icmp uge <8 x i64> %a, %b
8680   %sel = select <8 x i1> %cmp, <8 x i64> %b, <8 x i64> %a
8681   ret <8 x i64> %sel
8682 }
8683
8684 define <4 x i64> @test161(<4 x i64> %a, <4 x i64> %b) {
8685 ; SSE2-LABEL: test161:
8686 ; SSE2:       # BB#0: # %entry
8687 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
8688 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
8689 ; SSE2-NEXT:    pxor %xmm4, %xmm5
8690 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
8691 ; SSE2-NEXT:    pxor %xmm4, %xmm6
8692 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
8693 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
8694 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
8695 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
8696 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
8697 ; SSE2-NEXT:    pand %xmm8, %xmm5
8698 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
8699 ; SSE2-NEXT:    por %xmm5, %xmm6
8700 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
8701 ; SSE2-NEXT:    pxor %xmm4, %xmm5
8702 ; SSE2-NEXT:    pxor %xmm2, %xmm4
8703 ; SSE2-NEXT:    movdqa %xmm4, %xmm7
8704 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
8705 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
8706 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
8707 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
8708 ; SSE2-NEXT:    pand %xmm8, %xmm4
8709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
8710 ; SSE2-NEXT:    por %xmm4, %xmm5
8711 ; SSE2-NEXT:    pand %xmm5, %xmm0
8712 ; SSE2-NEXT:    pandn %xmm2, %xmm5
8713 ; SSE2-NEXT:    por %xmm5, %xmm0
8714 ; SSE2-NEXT:    pand %xmm6, %xmm1
8715 ; SSE2-NEXT:    pandn %xmm3, %xmm6
8716 ; SSE2-NEXT:    por %xmm6, %xmm1
8717 ; SSE2-NEXT:    retq
8718 ;
8719 ; SSE4-LABEL: test161:
8720 ; SSE4:       # BB#0: # %entry
8721 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
8722 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
8723 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm5
8724 ; SSE4-NEXT:    movdqa %xmm2, %xmm0
8725 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
8726 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
8727 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
8728 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
8729 ; SSE4-NEXT:    movapd %xmm2, %xmm0
8730 ; SSE4-NEXT:    movapd %xmm3, %xmm1
8731 ; SSE4-NEXT:    retq
8732 ;
8733 ; AVX1-LABEL: test161:
8734 ; AVX1:       # BB#0: # %entry
8735 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
8736 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
8737 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
8738 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
8739 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
8740 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8741 ; AVX1-NEXT:    retq
8742 ;
8743 ; AVX2-LABEL: test161:
8744 ; AVX2:       # BB#0: # %entry
8745 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
8746 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8747 ; AVX2-NEXT:    retq
8748 ;
8749 ; AVX512BW-LABEL: test161:
8750 ; AVX512BW:       # BB#0: # %entry
8751 ; AVX512BW-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
8752 ; AVX512BW-NEXT:    retq
8753 entry:
8754   %cmp = icmp slt <4 x i64> %a, %b
8755   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
8756   ret <4 x i64> %sel
8757 }
8758
8759 define <4 x i64> @test162(<4 x i64> %a, <4 x i64> %b) {
8760 ; SSE2-LABEL: test162:
8761 ; SSE2:       # BB#0: # %entry
8762 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
8763 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
8764 ; SSE2-NEXT:    pxor %xmm7, %xmm4
8765 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
8766 ; SSE2-NEXT:    pxor %xmm7, %xmm5
8767 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
8768 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
8769 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
8770 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
8771 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
8772 ; SSE2-NEXT:    pand %xmm8, %xmm4
8773 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
8774 ; SSE2-NEXT:    por %xmm4, %xmm8
8775 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
8776 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
8777 ; SSE2-NEXT:    pxor %xmm4, %xmm9
8778 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
8779 ; SSE2-NEXT:    pxor %xmm7, %xmm6
8780 ; SSE2-NEXT:    pxor %xmm0, %xmm7
8781 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
8782 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
8783 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
8784 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
8785 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
8786 ; SSE2-NEXT:    pand %xmm10, %xmm6
8787 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
8788 ; SSE2-NEXT:    por %xmm6, %xmm5
8789 ; SSE2-NEXT:    pxor %xmm5, %xmm4
8790 ; SSE2-NEXT:    pandn %xmm0, %xmm5
8791 ; SSE2-NEXT:    pandn %xmm2, %xmm4
8792 ; SSE2-NEXT:    por %xmm5, %xmm4
8793 ; SSE2-NEXT:    pandn %xmm1, %xmm8
8794 ; SSE2-NEXT:    pandn %xmm3, %xmm9
8795 ; SSE2-NEXT:    por %xmm8, %xmm9
8796 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
8797 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
8798 ; SSE2-NEXT:    retq
8799 ;
8800 ; SSE4-LABEL: test162:
8801 ; SSE4:       # BB#0: # %entry
8802 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
8803 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
8804 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm5
8805 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
8806 ; SSE4-NEXT:    pxor %xmm6, %xmm5
8807 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
8808 ; SSE4-NEXT:    pxor %xmm6, %xmm0
8809 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
8810 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
8811 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
8812 ; SSE4-NEXT:    movapd %xmm2, %xmm0
8813 ; SSE4-NEXT:    movapd %xmm3, %xmm1
8814 ; SSE4-NEXT:    retq
8815 ;
8816 ; AVX1-LABEL: test162:
8817 ; AVX1:       # BB#0: # %entry
8818 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
8819 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
8820 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
8821 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
8822 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
8823 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm4
8824 ; AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm3
8825 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
8826 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8827 ; AVX1-NEXT:    retq
8828 ;
8829 ; AVX2-LABEL: test162:
8830 ; AVX2:       # BB#0: # %entry
8831 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
8832 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
8833 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
8834 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8835 ; AVX2-NEXT:    retq
8836 ;
8837 ; AVX512BW-LABEL: test162:
8838 ; AVX512BW:       # BB#0: # %entry
8839 ; AVX512BW-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
8840 ; AVX512BW-NEXT:    retq
8841 entry:
8842   %cmp = icmp sle <4 x i64> %a, %b
8843   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
8844   ret <4 x i64> %sel
8845 }
8846
8847 define <4 x i64> @test163(<4 x i64> %a, <4 x i64> %b) {
8848 ; SSE2-LABEL: test163:
8849 ; SSE2:       # BB#0: # %entry
8850 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
8851 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
8852 ; SSE2-NEXT:    pxor %xmm4, %xmm5
8853 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
8854 ; SSE2-NEXT:    pxor %xmm4, %xmm6
8855 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
8856 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
8857 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
8858 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
8859 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
8860 ; SSE2-NEXT:    pand %xmm8, %xmm5
8861 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
8862 ; SSE2-NEXT:    por %xmm5, %xmm6
8863 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
8864 ; SSE2-NEXT:    pxor %xmm4, %xmm5
8865 ; SSE2-NEXT:    pxor %xmm0, %xmm4
8866 ; SSE2-NEXT:    movdqa %xmm4, %xmm7
8867 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
8868 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
8869 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
8870 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
8871 ; SSE2-NEXT:    pand %xmm8, %xmm4
8872 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
8873 ; SSE2-NEXT:    por %xmm4, %xmm5
8874 ; SSE2-NEXT:    pand %xmm5, %xmm0
8875 ; SSE2-NEXT:    pandn %xmm2, %xmm5
8876 ; SSE2-NEXT:    por %xmm5, %xmm0
8877 ; SSE2-NEXT:    pand %xmm6, %xmm1
8878 ; SSE2-NEXT:    pandn %xmm3, %xmm6
8879 ; SSE2-NEXT:    por %xmm6, %xmm1
8880 ; SSE2-NEXT:    retq
8881 ;
8882 ; SSE4-LABEL: test163:
8883 ; SSE4:       # BB#0: # %entry
8884 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
8885 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
8886 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm5
8887 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
8888 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
8889 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
8890 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
8891 ; SSE4-NEXT:    movapd %xmm2, %xmm0
8892 ; SSE4-NEXT:    movapd %xmm3, %xmm1
8893 ; SSE4-NEXT:    retq
8894 ;
8895 ; AVX1-LABEL: test163:
8896 ; AVX1:       # BB#0: # %entry
8897 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
8898 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
8899 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
8900 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
8901 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
8902 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8903 ; AVX1-NEXT:    retq
8904 ;
8905 ; AVX2-LABEL: test163:
8906 ; AVX2:       # BB#0: # %entry
8907 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
8908 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8909 ; AVX2-NEXT:    retq
8910 ;
8911 ; AVX512BW-LABEL: test163:
8912 ; AVX512BW:       # BB#0: # %entry
8913 ; AVX512BW-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
8914 ; AVX512BW-NEXT:    retq
8915 entry:
8916   %cmp = icmp sgt <4 x i64> %a, %b
8917   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
8918   ret <4 x i64> %sel
8919 }
8920
8921 define <4 x i64> @test164(<4 x i64> %a, <4 x i64> %b) {
8922 ; SSE2-LABEL: test164:
8923 ; SSE2:       # BB#0: # %entry
8924 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
8925 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
8926 ; SSE2-NEXT:    pxor %xmm7, %xmm4
8927 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
8928 ; SSE2-NEXT:    pxor %xmm7, %xmm5
8929 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
8930 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
8931 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
8932 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
8933 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
8934 ; SSE2-NEXT:    pand %xmm8, %xmm4
8935 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
8936 ; SSE2-NEXT:    por %xmm4, %xmm8
8937 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
8938 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
8939 ; SSE2-NEXT:    pxor %xmm4, %xmm9
8940 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
8941 ; SSE2-NEXT:    pxor %xmm7, %xmm6
8942 ; SSE2-NEXT:    pxor %xmm2, %xmm7
8943 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
8944 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
8945 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
8946 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
8947 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
8948 ; SSE2-NEXT:    pand %xmm10, %xmm6
8949 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
8950 ; SSE2-NEXT:    por %xmm6, %xmm5
8951 ; SSE2-NEXT:    pxor %xmm5, %xmm4
8952 ; SSE2-NEXT:    pandn %xmm0, %xmm5
8953 ; SSE2-NEXT:    pandn %xmm2, %xmm4
8954 ; SSE2-NEXT:    por %xmm5, %xmm4
8955 ; SSE2-NEXT:    pandn %xmm1, %xmm8
8956 ; SSE2-NEXT:    pandn %xmm3, %xmm9
8957 ; SSE2-NEXT:    por %xmm8, %xmm9
8958 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
8959 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
8960 ; SSE2-NEXT:    retq
8961 ;
8962 ; SSE4-LABEL: test164:
8963 ; SSE4:       # BB#0: # %entry
8964 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
8965 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
8966 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm5
8967 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
8968 ; SSE4-NEXT:    pxor %xmm0, %xmm5
8969 ; SSE4-NEXT:    movdqa %xmm2, %xmm6
8970 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm6
8971 ; SSE4-NEXT:    pxor %xmm6, %xmm0
8972 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
8973 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
8974 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
8975 ; SSE4-NEXT:    movapd %xmm2, %xmm0
8976 ; SSE4-NEXT:    movapd %xmm3, %xmm1
8977 ; SSE4-NEXT:    retq
8978 ;
8979 ; AVX1-LABEL: test164:
8980 ; AVX1:       # BB#0: # %entry
8981 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
8982 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
8983 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
8984 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
8985 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
8986 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
8987 ; AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm3
8988 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
8989 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8990 ; AVX1-NEXT:    retq
8991 ;
8992 ; AVX2-LABEL: test164:
8993 ; AVX2:       # BB#0: # %entry
8994 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
8995 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
8996 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
8997 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
8998 ; AVX2-NEXT:    retq
8999 ;
9000 ; AVX512BW-LABEL: test164:
9001 ; AVX512BW:       # BB#0: # %entry
9002 ; AVX512BW-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
9003 ; AVX512BW-NEXT:    retq
9004 entry:
9005   %cmp = icmp sge <4 x i64> %a, %b
9006   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
9007   ret <4 x i64> %sel
9008 }
9009
9010 define <4 x i64> @test165(<4 x i64> %a, <4 x i64> %b) {
9011 ; SSE2-LABEL: test165:
9012 ; SSE2:       # BB#0: # %entry
9013 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
9014 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
9015 ; SSE2-NEXT:    pxor %xmm4, %xmm5
9016 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
9017 ; SSE2-NEXT:    pxor %xmm4, %xmm6
9018 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9019 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
9020 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9021 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
9022 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
9023 ; SSE2-NEXT:    pand %xmm8, %xmm5
9024 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9025 ; SSE2-NEXT:    por %xmm5, %xmm6
9026 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
9027 ; SSE2-NEXT:    pxor %xmm4, %xmm5
9028 ; SSE2-NEXT:    pxor %xmm2, %xmm4
9029 ; SSE2-NEXT:    movdqa %xmm4, %xmm7
9030 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
9031 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9032 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
9033 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
9034 ; SSE2-NEXT:    pand %xmm8, %xmm4
9035 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9036 ; SSE2-NEXT:    por %xmm4, %xmm5
9037 ; SSE2-NEXT:    pand %xmm5, %xmm0
9038 ; SSE2-NEXT:    pandn %xmm2, %xmm5
9039 ; SSE2-NEXT:    por %xmm5, %xmm0
9040 ; SSE2-NEXT:    pand %xmm6, %xmm1
9041 ; SSE2-NEXT:    pandn %xmm3, %xmm6
9042 ; SSE2-NEXT:    por %xmm6, %xmm1
9043 ; SSE2-NEXT:    retq
9044 ;
9045 ; SSE4-LABEL: test165:
9046 ; SSE4:       # BB#0: # %entry
9047 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9048 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9049 ; SSE4-NEXT:    movdqa %xmm1, %xmm6
9050 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9051 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
9052 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9053 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9054 ; SSE4-NEXT:    movdqa %xmm4, %xmm6
9055 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9056 ; SSE4-NEXT:    pxor %xmm2, %xmm0
9057 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm0
9058 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
9059 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9060 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
9061 ; SSE4-NEXT:    movapd %xmm2, %xmm0
9062 ; SSE4-NEXT:    movapd %xmm3, %xmm1
9063 ; SSE4-NEXT:    retq
9064 ;
9065 ; AVX1-LABEL: test165:
9066 ; AVX1:       # BB#0: # %entry
9067 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
9068 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9069 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9070 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
9071 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9072 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9073 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm4
9074 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm3
9075 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
9076 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9077 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9078 ; AVX1-NEXT:    retq
9079 ;
9080 ; AVX2-LABEL: test165:
9081 ; AVX2:       # BB#0: # %entry
9082 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9083 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
9084 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
9085 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9086 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9087 ; AVX2-NEXT:    retq
9088 ;
9089 ; AVX512BW-LABEL: test165:
9090 ; AVX512BW:       # BB#0: # %entry
9091 ; AVX512BW-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
9092 ; AVX512BW-NEXT:    retq
9093 entry:
9094   %cmp = icmp ult <4 x i64> %a, %b
9095   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
9096   ret <4 x i64> %sel
9097 }
9098
9099 define <4 x i64> @test166(<4 x i64> %a, <4 x i64> %b) {
9100 ; SSE2-LABEL: test166:
9101 ; SSE2:       # BB#0: # %entry
9102 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
9103 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
9104 ; SSE2-NEXT:    pxor %xmm7, %xmm4
9105 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
9106 ; SSE2-NEXT:    pxor %xmm7, %xmm5
9107 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
9108 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
9109 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
9110 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
9111 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
9112 ; SSE2-NEXT:    pand %xmm8, %xmm4
9113 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
9114 ; SSE2-NEXT:    por %xmm4, %xmm8
9115 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
9116 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
9117 ; SSE2-NEXT:    pxor %xmm4, %xmm9
9118 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
9119 ; SSE2-NEXT:    pxor %xmm7, %xmm6
9120 ; SSE2-NEXT:    pxor %xmm0, %xmm7
9121 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
9122 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
9123 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
9124 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
9125 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9126 ; SSE2-NEXT:    pand %xmm10, %xmm6
9127 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
9128 ; SSE2-NEXT:    por %xmm6, %xmm5
9129 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9130 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9131 ; SSE2-NEXT:    pandn %xmm2, %xmm4
9132 ; SSE2-NEXT:    por %xmm5, %xmm4
9133 ; SSE2-NEXT:    pandn %xmm1, %xmm8
9134 ; SSE2-NEXT:    pandn %xmm3, %xmm9
9135 ; SSE2-NEXT:    por %xmm8, %xmm9
9136 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
9137 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
9138 ; SSE2-NEXT:    retq
9139 ;
9140 ; SSE4-LABEL: test166:
9141 ; SSE4:       # BB#0: # %entry
9142 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9143 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9144 ; SSE4-NEXT:    movdqa %xmm3, %xmm6
9145 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9146 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9147 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9148 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9149 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
9150 ; SSE4-NEXT:    pxor %xmm6, %xmm5
9151 ; SSE4-NEXT:    movdqa %xmm2, %xmm7
9152 ; SSE4-NEXT:    pxor %xmm0, %xmm7
9153 ; SSE4-NEXT:    pxor %xmm4, %xmm0
9154 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm0
9155 ; SSE4-NEXT:    pxor %xmm6, %xmm0
9156 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
9157 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9158 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
9159 ; SSE4-NEXT:    movapd %xmm2, %xmm0
9160 ; SSE4-NEXT:    movapd %xmm3, %xmm1
9161 ; SSE4-NEXT:    retq
9162 ;
9163 ; AVX1-LABEL: test166:
9164 ; AVX1:       # BB#0: # %entry
9165 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9166 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9167 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9168 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
9169 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9170 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9171 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
9172 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
9173 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm5
9174 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm3
9175 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
9176 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
9177 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9178 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9179 ; AVX1-NEXT:    retq
9180 ;
9181 ; AVX2-LABEL: test166:
9182 ; AVX2:       # BB#0: # %entry
9183 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9184 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
9185 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
9186 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9187 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
9188 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
9189 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9190 ; AVX2-NEXT:    retq
9191 ;
9192 ; AVX512BW-LABEL: test166:
9193 ; AVX512BW:       # BB#0: # %entry
9194 ; AVX512BW-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
9195 ; AVX512BW-NEXT:    retq
9196 entry:
9197   %cmp = icmp ule <4 x i64> %a, %b
9198   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
9199   ret <4 x i64> %sel
9200 }
9201
9202 define <4 x i64> @test167(<4 x i64> %a, <4 x i64> %b) {
9203 ; SSE2-LABEL: test167:
9204 ; SSE2:       # BB#0: # %entry
9205 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
9206 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
9207 ; SSE2-NEXT:    pxor %xmm4, %xmm5
9208 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
9209 ; SSE2-NEXT:    pxor %xmm4, %xmm6
9210 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9211 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
9212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9213 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
9214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
9215 ; SSE2-NEXT:    pand %xmm8, %xmm5
9216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9217 ; SSE2-NEXT:    por %xmm5, %xmm6
9218 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
9219 ; SSE2-NEXT:    pxor %xmm4, %xmm5
9220 ; SSE2-NEXT:    pxor %xmm0, %xmm4
9221 ; SSE2-NEXT:    movdqa %xmm4, %xmm7
9222 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
9223 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9224 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
9225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
9226 ; SSE2-NEXT:    pand %xmm8, %xmm4
9227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9228 ; SSE2-NEXT:    por %xmm4, %xmm5
9229 ; SSE2-NEXT:    pand %xmm5, %xmm0
9230 ; SSE2-NEXT:    pandn %xmm2, %xmm5
9231 ; SSE2-NEXT:    por %xmm5, %xmm0
9232 ; SSE2-NEXT:    pand %xmm6, %xmm1
9233 ; SSE2-NEXT:    pandn %xmm3, %xmm6
9234 ; SSE2-NEXT:    por %xmm6, %xmm1
9235 ; SSE2-NEXT:    retq
9236 ;
9237 ; SSE4-LABEL: test167:
9238 ; SSE4:       # BB#0: # %entry
9239 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9240 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9241 ; SSE4-NEXT:    movdqa %xmm3, %xmm6
9242 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9243 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9244 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9245 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9246 ; SSE4-NEXT:    movdqa %xmm2, %xmm6
9247 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9248 ; SSE4-NEXT:    pxor %xmm4, %xmm0
9249 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm0
9250 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
9251 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9252 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
9253 ; SSE4-NEXT:    movapd %xmm2, %xmm0
9254 ; SSE4-NEXT:    movapd %xmm3, %xmm1
9255 ; SSE4-NEXT:    retq
9256 ;
9257 ; AVX1-LABEL: test167:
9258 ; AVX1:       # BB#0: # %entry
9259 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9260 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9261 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9262 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
9263 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9264 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9265 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm4
9266 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm3
9267 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
9268 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9269 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9270 ; AVX1-NEXT:    retq
9271 ;
9272 ; AVX2-LABEL: test167:
9273 ; AVX2:       # BB#0: # %entry
9274 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9275 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
9276 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
9277 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9278 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9279 ; AVX2-NEXT:    retq
9280 ;
9281 ; AVX512BW-LABEL: test167:
9282 ; AVX512BW:       # BB#0: # %entry
9283 ; AVX512BW-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
9284 ; AVX512BW-NEXT:    retq
9285 entry:
9286   %cmp = icmp ugt <4 x i64> %a, %b
9287   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
9288   ret <4 x i64> %sel
9289 }
9290
9291 define <4 x i64> @test168(<4 x i64> %a, <4 x i64> %b) {
9292 ; SSE2-LABEL: test168:
9293 ; SSE2:       # BB#0: # %entry
9294 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
9295 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
9296 ; SSE2-NEXT:    pxor %xmm7, %xmm4
9297 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
9298 ; SSE2-NEXT:    pxor %xmm7, %xmm5
9299 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
9300 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
9301 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
9302 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
9303 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
9304 ; SSE2-NEXT:    pand %xmm8, %xmm4
9305 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
9306 ; SSE2-NEXT:    por %xmm4, %xmm8
9307 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
9308 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
9309 ; SSE2-NEXT:    pxor %xmm4, %xmm9
9310 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
9311 ; SSE2-NEXT:    pxor %xmm7, %xmm6
9312 ; SSE2-NEXT:    pxor %xmm2, %xmm7
9313 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
9314 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
9315 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
9316 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
9317 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9318 ; SSE2-NEXT:    pand %xmm10, %xmm6
9319 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
9320 ; SSE2-NEXT:    por %xmm6, %xmm5
9321 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9322 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9323 ; SSE2-NEXT:    pandn %xmm2, %xmm4
9324 ; SSE2-NEXT:    por %xmm5, %xmm4
9325 ; SSE2-NEXT:    pandn %xmm1, %xmm8
9326 ; SSE2-NEXT:    pandn %xmm3, %xmm9
9327 ; SSE2-NEXT:    por %xmm8, %xmm9
9328 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
9329 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
9330 ; SSE2-NEXT:    retq
9331 ;
9332 ; SSE4-LABEL: test168:
9333 ; SSE4:       # BB#0: # %entry
9334 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9335 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9336 ; SSE4-NEXT:    movdqa %xmm1, %xmm6
9337 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9338 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
9339 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9340 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9341 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
9342 ; SSE4-NEXT:    pxor %xmm6, %xmm5
9343 ; SSE4-NEXT:    movdqa %xmm4, %xmm7
9344 ; SSE4-NEXT:    pxor %xmm0, %xmm7
9345 ; SSE4-NEXT:    pxor %xmm2, %xmm0
9346 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm0
9347 ; SSE4-NEXT:    pxor %xmm6, %xmm0
9348 ; SSE4-NEXT:    blendvpd %xmm4, %xmm2
9349 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9350 ; SSE4-NEXT:    blendvpd %xmm1, %xmm3
9351 ; SSE4-NEXT:    movapd %xmm2, %xmm0
9352 ; SSE4-NEXT:    movapd %xmm3, %xmm1
9353 ; SSE4-NEXT:    retq
9354 ;
9355 ; AVX1-LABEL: test168:
9356 ; AVX1:       # BB#0: # %entry
9357 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
9358 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9359 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9360 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
9361 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9362 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9363 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
9364 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
9365 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm5
9366 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm3
9367 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
9368 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
9369 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9370 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9371 ; AVX1-NEXT:    retq
9372 ;
9373 ; AVX2-LABEL: test168:
9374 ; AVX2:       # BB#0: # %entry
9375 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9376 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
9377 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
9378 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9379 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
9380 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
9381 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
9382 ; AVX2-NEXT:    retq
9383 ;
9384 ; AVX512BW-LABEL: test168:
9385 ; AVX512BW:       # BB#0: # %entry
9386 ; AVX512BW-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
9387 ; AVX512BW-NEXT:    retq
9388 entry:
9389   %cmp = icmp uge <4 x i64> %a, %b
9390   %sel = select <4 x i1> %cmp, <4 x i64> %a, <4 x i64> %b
9391   ret <4 x i64> %sel
9392 }
9393
9394 define <4 x i64> @test169(<4 x i64> %a, <4 x i64> %b) {
9395 ; SSE2-LABEL: test169:
9396 ; SSE2:       # BB#0: # %entry
9397 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,0,2147483648,0]
9398 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
9399 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9400 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
9401 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9402 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9403 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
9404 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9405 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
9406 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
9407 ; SSE2-NEXT:    pand %xmm8, %xmm6
9408 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
9409 ; SSE2-NEXT:    por %xmm6, %xmm4
9410 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
9411 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9412 ; SSE2-NEXT:    pxor %xmm2, %xmm5
9413 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
9414 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
9415 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9416 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
9417 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
9418 ; SSE2-NEXT:    pand %xmm8, %xmm6
9419 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9420 ; SSE2-NEXT:    por %xmm6, %xmm5
9421 ; SSE2-NEXT:    pand %xmm5, %xmm2
9422 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9423 ; SSE2-NEXT:    por %xmm2, %xmm5
9424 ; SSE2-NEXT:    pand %xmm4, %xmm3
9425 ; SSE2-NEXT:    pandn %xmm1, %xmm4
9426 ; SSE2-NEXT:    por %xmm3, %xmm4
9427 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
9428 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
9429 ; SSE2-NEXT:    retq
9430 ;
9431 ; SSE4-LABEL: test169:
9432 ; SSE4:       # BB#0: # %entry
9433 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9434 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
9435 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm5
9436 ; SSE4-NEXT:    movdqa %xmm2, %xmm0
9437 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm0
9438 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9439 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9440 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9441 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9442 ; SSE4-NEXT:    retq
9443 ;
9444 ; AVX1-LABEL: test169:
9445 ; AVX1:       # BB#0: # %entry
9446 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
9447 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
9448 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
9449 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
9450 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9451 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9452 ; AVX1-NEXT:    retq
9453 ;
9454 ; AVX2-LABEL: test169:
9455 ; AVX2:       # BB#0: # %entry
9456 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
9457 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9458 ; AVX2-NEXT:    retq
9459 ;
9460 ; AVX512BW-LABEL: test169:
9461 ; AVX512BW:       # BB#0: # %entry
9462 ; AVX512BW-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
9463 ; AVX512BW-NEXT:    retq
9464 entry:
9465   %cmp = icmp slt <4 x i64> %a, %b
9466   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9467   ret <4 x i64> %sel
9468 }
9469
9470 define <4 x i64> @test170(<4 x i64> %a, <4 x i64> %b) {
9471 ; SSE2-LABEL: test170:
9472 ; SSE2:       # BB#0: # %entry
9473 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
9474 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
9475 ; SSE2-NEXT:    pxor %xmm7, %xmm4
9476 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
9477 ; SSE2-NEXT:    pxor %xmm7, %xmm5
9478 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
9479 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
9480 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
9481 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
9482 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
9483 ; SSE2-NEXT:    pand %xmm8, %xmm4
9484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
9485 ; SSE2-NEXT:    por %xmm4, %xmm8
9486 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
9487 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
9488 ; SSE2-NEXT:    pxor %xmm4, %xmm9
9489 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
9490 ; SSE2-NEXT:    pxor %xmm7, %xmm6
9491 ; SSE2-NEXT:    pxor %xmm0, %xmm7
9492 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
9493 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
9494 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
9495 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
9496 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9497 ; SSE2-NEXT:    pand %xmm10, %xmm6
9498 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
9499 ; SSE2-NEXT:    por %xmm6, %xmm5
9500 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9501 ; SSE2-NEXT:    pandn %xmm2, %xmm5
9502 ; SSE2-NEXT:    pandn %xmm0, %xmm4
9503 ; SSE2-NEXT:    por %xmm5, %xmm4
9504 ; SSE2-NEXT:    pandn %xmm3, %xmm8
9505 ; SSE2-NEXT:    pandn %xmm1, %xmm9
9506 ; SSE2-NEXT:    por %xmm8, %xmm9
9507 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
9508 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
9509 ; SSE2-NEXT:    retq
9510 ;
9511 ; SSE4-LABEL: test170:
9512 ; SSE4:       # BB#0: # %entry
9513 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9514 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9515 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm5
9516 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
9517 ; SSE4-NEXT:    pxor %xmm6, %xmm5
9518 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
9519 ; SSE4-NEXT:    pxor %xmm6, %xmm0
9520 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9521 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9522 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9523 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9524 ; SSE4-NEXT:    retq
9525 ;
9526 ; AVX1-LABEL: test170:
9527 ; AVX1:       # BB#0: # %entry
9528 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9529 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
9530 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
9531 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
9532 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
9533 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm4
9534 ; AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm3
9535 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9536 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9537 ; AVX1-NEXT:    retq
9538 ;
9539 ; AVX2-LABEL: test170:
9540 ; AVX2:       # BB#0: # %entry
9541 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
9542 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
9543 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
9544 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9545 ; AVX2-NEXT:    retq
9546 ;
9547 ; AVX512BW-LABEL: test170:
9548 ; AVX512BW:       # BB#0: # %entry
9549 ; AVX512BW-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
9550 ; AVX512BW-NEXT:    retq
9551 entry:
9552   %cmp = icmp sle <4 x i64> %a, %b
9553   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9554   ret <4 x i64> %sel
9555 }
9556
9557 define <4 x i64> @test171(<4 x i64> %a, <4 x i64> %b) {
9558 ; SSE2-LABEL: test171:
9559 ; SSE2:       # BB#0: # %entry
9560 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,0,2147483648,0]
9561 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
9562 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9563 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
9564 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9565 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9566 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
9567 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9568 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
9569 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
9570 ; SSE2-NEXT:    pand %xmm8, %xmm6
9571 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
9572 ; SSE2-NEXT:    por %xmm6, %xmm4
9573 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
9574 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9575 ; SSE2-NEXT:    pxor %xmm0, %xmm5
9576 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
9577 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
9578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9579 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
9580 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
9581 ; SSE2-NEXT:    pand %xmm8, %xmm6
9582 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9583 ; SSE2-NEXT:    por %xmm6, %xmm5
9584 ; SSE2-NEXT:    pand %xmm5, %xmm2
9585 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9586 ; SSE2-NEXT:    por %xmm2, %xmm5
9587 ; SSE2-NEXT:    pand %xmm4, %xmm3
9588 ; SSE2-NEXT:    pandn %xmm1, %xmm4
9589 ; SSE2-NEXT:    por %xmm3, %xmm4
9590 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
9591 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
9592 ; SSE2-NEXT:    retq
9593 ;
9594 ; SSE4-LABEL: test171:
9595 ; SSE4:       # BB#0: # %entry
9596 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9597 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9598 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm5
9599 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
9600 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9601 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9602 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9603 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9604 ; SSE4-NEXT:    retq
9605 ;
9606 ; AVX1-LABEL: test171:
9607 ; AVX1:       # BB#0: # %entry
9608 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9609 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
9610 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
9611 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
9612 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9613 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9614 ; AVX1-NEXT:    retq
9615 ;
9616 ; AVX2-LABEL: test171:
9617 ; AVX2:       # BB#0: # %entry
9618 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
9619 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9620 ; AVX2-NEXT:    retq
9621 ;
9622 ; AVX512BW-LABEL: test171:
9623 ; AVX512BW:       # BB#0: # %entry
9624 ; AVX512BW-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
9625 ; AVX512BW-NEXT:    retq
9626 entry:
9627   %cmp = icmp sgt <4 x i64> %a, %b
9628   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9629   ret <4 x i64> %sel
9630 }
9631
9632 define <4 x i64> @test172(<4 x i64> %a, <4 x i64> %b) {
9633 ; SSE2-LABEL: test172:
9634 ; SSE2:       # BB#0: # %entry
9635 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
9636 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
9637 ; SSE2-NEXT:    pxor %xmm7, %xmm4
9638 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
9639 ; SSE2-NEXT:    pxor %xmm7, %xmm5
9640 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
9641 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
9642 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
9643 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
9644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
9645 ; SSE2-NEXT:    pand %xmm8, %xmm4
9646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
9647 ; SSE2-NEXT:    por %xmm4, %xmm8
9648 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
9649 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
9650 ; SSE2-NEXT:    pxor %xmm4, %xmm9
9651 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
9652 ; SSE2-NEXT:    pxor %xmm7, %xmm6
9653 ; SSE2-NEXT:    pxor %xmm2, %xmm7
9654 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
9655 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
9656 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
9657 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
9658 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9659 ; SSE2-NEXT:    pand %xmm10, %xmm6
9660 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
9661 ; SSE2-NEXT:    por %xmm6, %xmm5
9662 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9663 ; SSE2-NEXT:    pandn %xmm2, %xmm5
9664 ; SSE2-NEXT:    pandn %xmm0, %xmm4
9665 ; SSE2-NEXT:    por %xmm5, %xmm4
9666 ; SSE2-NEXT:    pandn %xmm3, %xmm8
9667 ; SSE2-NEXT:    pandn %xmm1, %xmm9
9668 ; SSE2-NEXT:    por %xmm8, %xmm9
9669 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
9670 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
9671 ; SSE2-NEXT:    retq
9672 ;
9673 ; SSE4-LABEL: test172:
9674 ; SSE4:       # BB#0: # %entry
9675 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9676 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
9677 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm5
9678 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
9679 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9680 ; SSE4-NEXT:    movdqa %xmm2, %xmm6
9681 ; SSE4-NEXT:    pcmpgtq %xmm4, %xmm6
9682 ; SSE4-NEXT:    pxor %xmm6, %xmm0
9683 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9684 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9685 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9686 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9687 ; SSE4-NEXT:    retq
9688 ;
9689 ; AVX1-LABEL: test172:
9690 ; AVX1:       # BB#0: # %entry
9691 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
9692 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
9693 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
9694 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
9695 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
9696 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
9697 ; AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm3
9698 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9699 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9700 ; AVX1-NEXT:    retq
9701 ;
9702 ; AVX2-LABEL: test172:
9703 ; AVX2:       # BB#0: # %entry
9704 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
9705 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
9706 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
9707 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9708 ; AVX2-NEXT:    retq
9709 ;
9710 ; AVX512BW-LABEL: test172:
9711 ; AVX512BW:       # BB#0: # %entry
9712 ; AVX512BW-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
9713 ; AVX512BW-NEXT:    retq
9714 entry:
9715   %cmp = icmp sge <4 x i64> %a, %b
9716   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9717   ret <4 x i64> %sel
9718 }
9719
9720 define <4 x i64> @test173(<4 x i64> %a, <4 x i64> %b) {
9721 ; SSE2-LABEL: test173:
9722 ; SSE2:       # BB#0: # %entry
9723 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
9724 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
9725 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9726 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
9727 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9728 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9729 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
9730 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9731 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
9732 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
9733 ; SSE2-NEXT:    pand %xmm8, %xmm6
9734 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
9735 ; SSE2-NEXT:    por %xmm6, %xmm4
9736 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
9737 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9738 ; SSE2-NEXT:    pxor %xmm2, %xmm5
9739 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
9740 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
9741 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9742 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
9743 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
9744 ; SSE2-NEXT:    pand %xmm8, %xmm6
9745 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9746 ; SSE2-NEXT:    por %xmm6, %xmm5
9747 ; SSE2-NEXT:    pand %xmm5, %xmm2
9748 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9749 ; SSE2-NEXT:    por %xmm2, %xmm5
9750 ; SSE2-NEXT:    pand %xmm4, %xmm3
9751 ; SSE2-NEXT:    pandn %xmm1, %xmm4
9752 ; SSE2-NEXT:    por %xmm3, %xmm4
9753 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
9754 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
9755 ; SSE2-NEXT:    retq
9756 ;
9757 ; SSE4-LABEL: test173:
9758 ; SSE4:       # BB#0: # %entry
9759 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9760 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9761 ; SSE4-NEXT:    movdqa %xmm1, %xmm6
9762 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9763 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
9764 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9765 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9766 ; SSE4-NEXT:    movdqa %xmm4, %xmm6
9767 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9768 ; SSE4-NEXT:    pxor %xmm2, %xmm0
9769 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm0
9770 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9771 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9772 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9773 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9774 ; SSE4-NEXT:    retq
9775 ;
9776 ; AVX1-LABEL: test173:
9777 ; AVX1:       # BB#0: # %entry
9778 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
9779 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9780 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9781 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
9782 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9783 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9784 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm4
9785 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm3
9786 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
9787 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9788 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9789 ; AVX1-NEXT:    retq
9790 ;
9791 ; AVX2-LABEL: test173:
9792 ; AVX2:       # BB#0: # %entry
9793 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9794 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
9795 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
9796 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9797 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9798 ; AVX2-NEXT:    retq
9799 ;
9800 ; AVX512BW-LABEL: test173:
9801 ; AVX512BW:       # BB#0: # %entry
9802 ; AVX512BW-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
9803 ; AVX512BW-NEXT:    retq
9804 entry:
9805   %cmp = icmp ult <4 x i64> %a, %b
9806   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9807   ret <4 x i64> %sel
9808 }
9809
9810 define <4 x i64> @test174(<4 x i64> %a, <4 x i64> %b) {
9811 ; SSE2-LABEL: test174:
9812 ; SSE2:       # BB#0: # %entry
9813 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
9814 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
9815 ; SSE2-NEXT:    pxor %xmm7, %xmm4
9816 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
9817 ; SSE2-NEXT:    pxor %xmm7, %xmm5
9818 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
9819 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
9820 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
9821 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
9822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
9823 ; SSE2-NEXT:    pand %xmm8, %xmm4
9824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
9825 ; SSE2-NEXT:    por %xmm4, %xmm8
9826 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
9827 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
9828 ; SSE2-NEXT:    pxor %xmm4, %xmm9
9829 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
9830 ; SSE2-NEXT:    pxor %xmm7, %xmm6
9831 ; SSE2-NEXT:    pxor %xmm0, %xmm7
9832 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
9833 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
9834 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
9835 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
9836 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
9837 ; SSE2-NEXT:    pand %xmm10, %xmm6
9838 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
9839 ; SSE2-NEXT:    por %xmm6, %xmm5
9840 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9841 ; SSE2-NEXT:    pandn %xmm2, %xmm5
9842 ; SSE2-NEXT:    pandn %xmm0, %xmm4
9843 ; SSE2-NEXT:    por %xmm5, %xmm4
9844 ; SSE2-NEXT:    pandn %xmm3, %xmm8
9845 ; SSE2-NEXT:    pandn %xmm1, %xmm9
9846 ; SSE2-NEXT:    por %xmm8, %xmm9
9847 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
9848 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
9849 ; SSE2-NEXT:    retq
9850 ;
9851 ; SSE4-LABEL: test174:
9852 ; SSE4:       # BB#0: # %entry
9853 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9854 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9855 ; SSE4-NEXT:    movdqa %xmm3, %xmm6
9856 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9857 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9858 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9859 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9860 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
9861 ; SSE4-NEXT:    pxor %xmm6, %xmm5
9862 ; SSE4-NEXT:    movdqa %xmm2, %xmm7
9863 ; SSE4-NEXT:    pxor %xmm0, %xmm7
9864 ; SSE4-NEXT:    pxor %xmm4, %xmm0
9865 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm0
9866 ; SSE4-NEXT:    pxor %xmm6, %xmm0
9867 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9868 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9869 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9870 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9871 ; SSE4-NEXT:    retq
9872 ;
9873 ; AVX1-LABEL: test174:
9874 ; AVX1:       # BB#0: # %entry
9875 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9876 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9877 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9878 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
9879 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9880 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9881 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
9882 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
9883 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm5
9884 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm3
9885 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
9886 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
9887 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9888 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9889 ; AVX1-NEXT:    retq
9890 ;
9891 ; AVX2-LABEL: test174:
9892 ; AVX2:       # BB#0: # %entry
9893 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9894 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
9895 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
9896 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9897 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
9898 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
9899 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9900 ; AVX2-NEXT:    retq
9901 ;
9902 ; AVX512BW-LABEL: test174:
9903 ; AVX512BW:       # BB#0: # %entry
9904 ; AVX512BW-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
9905 ; AVX512BW-NEXT:    retq
9906 entry:
9907   %cmp = icmp ule <4 x i64> %a, %b
9908   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9909   ret <4 x i64> %sel
9910 }
9911
9912 define <4 x i64> @test175(<4 x i64> %a, <4 x i64> %b) {
9913 ; SSE2-LABEL: test175:
9914 ; SSE2:       # BB#0: # %entry
9915 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
9916 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
9917 ; SSE2-NEXT:    pxor %xmm5, %xmm4
9918 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
9919 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9920 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
9921 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
9922 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9923 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
9924 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
9925 ; SSE2-NEXT:    pand %xmm8, %xmm6
9926 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
9927 ; SSE2-NEXT:    por %xmm6, %xmm4
9928 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
9929 ; SSE2-NEXT:    pxor %xmm5, %xmm6
9930 ; SSE2-NEXT:    pxor %xmm0, %xmm5
9931 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
9932 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
9933 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
9934 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
9935 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
9936 ; SSE2-NEXT:    pand %xmm8, %xmm6
9937 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
9938 ; SSE2-NEXT:    por %xmm6, %xmm5
9939 ; SSE2-NEXT:    pand %xmm5, %xmm2
9940 ; SSE2-NEXT:    pandn %xmm0, %xmm5
9941 ; SSE2-NEXT:    por %xmm2, %xmm5
9942 ; SSE2-NEXT:    pand %xmm4, %xmm3
9943 ; SSE2-NEXT:    pandn %xmm1, %xmm4
9944 ; SSE2-NEXT:    por %xmm3, %xmm4
9945 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
9946 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
9947 ; SSE2-NEXT:    retq
9948 ;
9949 ; SSE4-LABEL: test175:
9950 ; SSE4:       # BB#0: # %entry
9951 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
9952 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
9953 ; SSE4-NEXT:    movdqa %xmm3, %xmm6
9954 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9955 ; SSE4-NEXT:    movdqa %xmm1, %xmm5
9956 ; SSE4-NEXT:    pxor %xmm0, %xmm5
9957 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
9958 ; SSE4-NEXT:    movdqa %xmm2, %xmm6
9959 ; SSE4-NEXT:    pxor %xmm0, %xmm6
9960 ; SSE4-NEXT:    pxor %xmm4, %xmm0
9961 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm0
9962 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
9963 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
9964 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
9965 ; SSE4-NEXT:    movapd %xmm4, %xmm0
9966 ; SSE4-NEXT:    retq
9967 ;
9968 ; AVX1-LABEL: test175:
9969 ; AVX1:       # BB#0: # %entry
9970 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
9971 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
9972 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
9973 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
9974 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
9975 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
9976 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm4
9977 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm3
9978 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
9979 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
9980 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9981 ; AVX1-NEXT:    retq
9982 ;
9983 ; AVX2-LABEL: test175:
9984 ; AVX2:       # BB#0: # %entry
9985 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
9986 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
9987 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
9988 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
9989 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
9990 ; AVX2-NEXT:    retq
9991 ;
9992 ; AVX512BW-LABEL: test175:
9993 ; AVX512BW:       # BB#0: # %entry
9994 ; AVX512BW-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
9995 ; AVX512BW-NEXT:    retq
9996 entry:
9997   %cmp = icmp ugt <4 x i64> %a, %b
9998   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
9999   ret <4 x i64> %sel
10000 }
10001
10002 define <4 x i64> @test176(<4 x i64> %a, <4 x i64> %b) {
10003 ; SSE2-LABEL: test176:
10004 ; SSE2:       # BB#0: # %entry
10005 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
10006 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
10007 ; SSE2-NEXT:    pxor %xmm7, %xmm4
10008 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
10009 ; SSE2-NEXT:    pxor %xmm7, %xmm5
10010 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
10011 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
10012 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
10013 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
10014 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
10015 ; SSE2-NEXT:    pand %xmm8, %xmm4
10016 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
10017 ; SSE2-NEXT:    por %xmm4, %xmm8
10018 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
10019 ; SSE2-NEXT:    movdqa %xmm8, %xmm9
10020 ; SSE2-NEXT:    pxor %xmm4, %xmm9
10021 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
10022 ; SSE2-NEXT:    pxor %xmm7, %xmm6
10023 ; SSE2-NEXT:    pxor %xmm2, %xmm7
10024 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
10025 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
10026 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
10027 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
10028 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
10029 ; SSE2-NEXT:    pand %xmm10, %xmm6
10030 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
10031 ; SSE2-NEXT:    por %xmm6, %xmm5
10032 ; SSE2-NEXT:    pxor %xmm5, %xmm4
10033 ; SSE2-NEXT:    pandn %xmm2, %xmm5
10034 ; SSE2-NEXT:    pandn %xmm0, %xmm4
10035 ; SSE2-NEXT:    por %xmm5, %xmm4
10036 ; SSE2-NEXT:    pandn %xmm3, %xmm8
10037 ; SSE2-NEXT:    pandn %xmm1, %xmm9
10038 ; SSE2-NEXT:    por %xmm8, %xmm9
10039 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
10040 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
10041 ; SSE2-NEXT:    retq
10042 ;
10043 ; SSE4-LABEL: test176:
10044 ; SSE4:       # BB#0: # %entry
10045 ; SSE4-NEXT:    movdqa %xmm0, %xmm4
10046 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
10047 ; SSE4-NEXT:    movdqa %xmm1, %xmm6
10048 ; SSE4-NEXT:    pxor %xmm0, %xmm6
10049 ; SSE4-NEXT:    movdqa %xmm3, %xmm5
10050 ; SSE4-NEXT:    pxor %xmm0, %xmm5
10051 ; SSE4-NEXT:    pcmpgtq %xmm6, %xmm5
10052 ; SSE4-NEXT:    pcmpeqd %xmm6, %xmm6
10053 ; SSE4-NEXT:    pxor %xmm6, %xmm5
10054 ; SSE4-NEXT:    movdqa %xmm4, %xmm7
10055 ; SSE4-NEXT:    pxor %xmm0, %xmm7
10056 ; SSE4-NEXT:    pxor %xmm2, %xmm0
10057 ; SSE4-NEXT:    pcmpgtq %xmm7, %xmm0
10058 ; SSE4-NEXT:    pxor %xmm6, %xmm0
10059 ; SSE4-NEXT:    blendvpd %xmm2, %xmm4
10060 ; SSE4-NEXT:    movdqa %xmm5, %xmm0
10061 ; SSE4-NEXT:    blendvpd %xmm3, %xmm1
10062 ; SSE4-NEXT:    movapd %xmm4, %xmm0
10063 ; SSE4-NEXT:    retq
10064 ;
10065 ; AVX1-LABEL: test176:
10066 ; AVX1:       # BB#0: # %entry
10067 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
10068 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
10069 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm2
10070 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
10071 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm4
10072 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
10073 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
10074 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
10075 ; AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm5
10076 ; AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm3
10077 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
10078 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
10079 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
10080 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
10081 ; AVX1-NEXT:    retq
10082 ;
10083 ; AVX2-LABEL: test176:
10084 ; AVX2:       # BB#0: # %entry
10085 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
10086 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
10087 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
10088 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
10089 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
10090 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
10091 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
10092 ; AVX2-NEXT:    retq
10093 ;
10094 ; AVX512BW-LABEL: test176:
10095 ; AVX512BW:       # BB#0: # %entry
10096 ; AVX512BW-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
10097 ; AVX512BW-NEXT:    retq
10098 entry:
10099   %cmp = icmp uge <4 x i64> %a, %b
10100   %sel = select <4 x i1> %cmp, <4 x i64> %b, <4 x i64> %a
10101   ret <4 x i64> %sel
10102 }
10103
10104 define <2 x i64> @test177(<2 x i64> %a, <2 x i64> %b) {
10105 ; SSE2-LABEL: test177:
10106 ; SSE2:       # BB#0: # %entry
10107 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10108 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10109 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10110 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10111 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10112 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10113 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10114 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10115 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10116 ; SSE2-NEXT:    pand %xmm5, %xmm2
10117 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10118 ; SSE2-NEXT:    por %xmm2, %xmm3
10119 ; SSE2-NEXT:    pand %xmm3, %xmm0
10120 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10121 ; SSE2-NEXT:    por %xmm3, %xmm0
10122 ; SSE2-NEXT:    retq
10123 ;
10124 ; SSE4-LABEL: test177:
10125 ; SSE4:       # BB#0: # %entry
10126 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10127 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
10128 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
10129 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10130 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10131 ; SSE4-NEXT:    retq
10132 ;
10133 ; AVX1-LABEL: test177:
10134 ; AVX1:       # BB#0: # %entry
10135 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10136 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10137 ; AVX1-NEXT:    retq
10138 ;
10139 ; AVX2-LABEL: test177:
10140 ; AVX2:       # BB#0: # %entry
10141 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10142 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10143 ; AVX2-NEXT:    retq
10144 ;
10145 ; AVX512BW-LABEL: test177:
10146 ; AVX512BW:       # BB#0: # %entry
10147 ; AVX512BW-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
10148 ; AVX512BW-NEXT:    retq
10149 entry:
10150   %cmp = icmp slt <2 x i64> %a, %b
10151   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10152   ret <2 x i64> %sel
10153 }
10154
10155 define <2 x i64> @test178(<2 x i64> %a, <2 x i64> %b) {
10156 ; SSE2-LABEL: test178:
10157 ; SSE2:       # BB#0: # %entry
10158 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10159 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10160 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10161 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10162 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10163 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10164 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10165 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10166 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10167 ; SSE2-NEXT:    pand %xmm5, %xmm2
10168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10169 ; SSE2-NEXT:    por %xmm2, %xmm3
10170 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10171 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10172 ; SSE2-NEXT:    pandn %xmm0, %xmm3
10173 ; SSE2-NEXT:    pandn %xmm1, %xmm2
10174 ; SSE2-NEXT:    por %xmm3, %xmm2
10175 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10176 ; SSE2-NEXT:    retq
10177 ;
10178 ; SSE4-LABEL: test178:
10179 ; SSE4:       # BB#0: # %entry
10180 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10181 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
10182 ; SSE4-NEXT:    pcmpeqd %xmm3, %xmm3
10183 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10184 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10185 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10186 ; SSE4-NEXT:    retq
10187 ;
10188 ; AVX1-LABEL: test178:
10189 ; AVX1:       # BB#0: # %entry
10190 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10191 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10192 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10193 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10194 ; AVX1-NEXT:    retq
10195 ;
10196 ; AVX2-LABEL: test178:
10197 ; AVX2:       # BB#0: # %entry
10198 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10199 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10200 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10201 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10202 ; AVX2-NEXT:    retq
10203 ;
10204 ; AVX512BW-LABEL: test178:
10205 ; AVX512BW:       # BB#0: # %entry
10206 ; AVX512BW-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
10207 ; AVX512BW-NEXT:    retq
10208 entry:
10209   %cmp = icmp sle <2 x i64> %a, %b
10210   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10211   ret <2 x i64> %sel
10212 }
10213
10214 define <2 x i64> @test179(<2 x i64> %a, <2 x i64> %b) {
10215 ; SSE2-LABEL: test179:
10216 ; SSE2:       # BB#0: # %entry
10217 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10218 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10219 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10220 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10221 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10222 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10223 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10224 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10226 ; SSE2-NEXT:    pand %xmm5, %xmm2
10227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10228 ; SSE2-NEXT:    por %xmm2, %xmm3
10229 ; SSE2-NEXT:    pand %xmm3, %xmm0
10230 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10231 ; SSE2-NEXT:    por %xmm3, %xmm0
10232 ; SSE2-NEXT:    retq
10233 ;
10234 ; SSE4-LABEL: test179:
10235 ; SSE4:       # BB#0: # %entry
10236 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10237 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
10238 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10239 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10240 ; SSE4-NEXT:    retq
10241 ;
10242 ; AVX1-LABEL: test179:
10243 ; AVX1:       # BB#0: # %entry
10244 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10245 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10246 ; AVX1-NEXT:    retq
10247 ;
10248 ; AVX2-LABEL: test179:
10249 ; AVX2:       # BB#0: # %entry
10250 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10251 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10252 ; AVX2-NEXT:    retq
10253 ;
10254 ; AVX512BW-LABEL: test179:
10255 ; AVX512BW:       # BB#0: # %entry
10256 ; AVX512BW-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
10257 ; AVX512BW-NEXT:    retq
10258 entry:
10259   %cmp = icmp sgt <2 x i64> %a, %b
10260   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10261   ret <2 x i64> %sel
10262 }
10263
10264 define <2 x i64> @test180(<2 x i64> %a, <2 x i64> %b) {
10265 ; SSE2-LABEL: test180:
10266 ; SSE2:       # BB#0: # %entry
10267 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10268 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10269 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10270 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10271 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10272 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10273 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10274 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10275 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10276 ; SSE2-NEXT:    pand %xmm5, %xmm2
10277 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10278 ; SSE2-NEXT:    por %xmm2, %xmm3
10279 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10280 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10281 ; SSE2-NEXT:    pandn %xmm0, %xmm3
10282 ; SSE2-NEXT:    pandn %xmm1, %xmm2
10283 ; SSE2-NEXT:    por %xmm3, %xmm2
10284 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10285 ; SSE2-NEXT:    retq
10286 ;
10287 ; SSE4-LABEL: test180:
10288 ; SSE4:       # BB#0: # %entry
10289 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10290 ; SSE4-NEXT:    movdqa %xmm1, %xmm3
10291 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm3
10292 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
10293 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10294 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10295 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10296 ; SSE4-NEXT:    retq
10297 ;
10298 ; AVX1-LABEL: test180:
10299 ; AVX1:       # BB#0: # %entry
10300 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10301 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10302 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10303 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10304 ; AVX1-NEXT:    retq
10305 ;
10306 ; AVX2-LABEL: test180:
10307 ; AVX2:       # BB#0: # %entry
10308 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10309 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10310 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10311 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10312 ; AVX2-NEXT:    retq
10313 ;
10314 ; AVX512BW-LABEL: test180:
10315 ; AVX512BW:       # BB#0: # %entry
10316 ; AVX512BW-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
10317 ; AVX512BW-NEXT:    retq
10318 entry:
10319   %cmp = icmp sge <2 x i64> %a, %b
10320   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10321   ret <2 x i64> %sel
10322 }
10323
10324 define <2 x i64> @test181(<2 x i64> %a, <2 x i64> %b) {
10325 ; SSE2-LABEL: test181:
10326 ; SSE2:       # BB#0: # %entry
10327 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10328 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10329 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10330 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10331 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10332 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10334 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10336 ; SSE2-NEXT:    pand %xmm5, %xmm2
10337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10338 ; SSE2-NEXT:    por %xmm2, %xmm3
10339 ; SSE2-NEXT:    pand %xmm3, %xmm0
10340 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10341 ; SSE2-NEXT:    por %xmm3, %xmm0
10342 ; SSE2-NEXT:    retq
10343 ;
10344 ; SSE4-LABEL: test181:
10345 ; SSE4:       # BB#0: # %entry
10346 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10347 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
10348 ; SSE4-NEXT:    movdqa %xmm2, %xmm3
10349 ; SSE4-NEXT:    pxor %xmm0, %xmm3
10350 ; SSE4-NEXT:    pxor %xmm1, %xmm0
10351 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
10352 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10353 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10354 ; SSE4-NEXT:    retq
10355 ;
10356 ; AVX1-LABEL: test181:
10357 ; AVX1:       # BB#0: # %entry
10358 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10359 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10360 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10361 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10362 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10363 ; AVX1-NEXT:    retq
10364 ;
10365 ; AVX2-LABEL: test181:
10366 ; AVX2:       # BB#0: # %entry
10367 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10368 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10369 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10370 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10371 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10372 ; AVX2-NEXT:    retq
10373 ;
10374 ; AVX512BW-LABEL: test181:
10375 ; AVX512BW:       # BB#0: # %entry
10376 ; AVX512BW-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
10377 ; AVX512BW-NEXT:    retq
10378 entry:
10379   %cmp = icmp ult <2 x i64> %a, %b
10380   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10381   ret <2 x i64> %sel
10382 }
10383
10384 define <2 x i64> @test182(<2 x i64> %a, <2 x i64> %b) {
10385 ; SSE2-LABEL: test182:
10386 ; SSE2:       # BB#0: # %entry
10387 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10388 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10389 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10390 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10391 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10392 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10393 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10394 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10396 ; SSE2-NEXT:    pand %xmm5, %xmm2
10397 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10398 ; SSE2-NEXT:    por %xmm2, %xmm3
10399 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10400 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10401 ; SSE2-NEXT:    pandn %xmm0, %xmm3
10402 ; SSE2-NEXT:    pandn %xmm1, %xmm2
10403 ; SSE2-NEXT:    por %xmm3, %xmm2
10404 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10405 ; SSE2-NEXT:    retq
10406 ;
10407 ; SSE4-LABEL: test182:
10408 ; SSE4:       # BB#0: # %entry
10409 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10410 ; SSE4-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
10411 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
10412 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10413 ; SSE4-NEXT:    pxor %xmm2, %xmm3
10414 ; SSE4-NEXT:    pcmpgtq %xmm0, %xmm3
10415 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
10416 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10417 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10418 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10419 ; SSE4-NEXT:    retq
10420 ;
10421 ; AVX1-LABEL: test182:
10422 ; AVX1:       # BB#0: # %entry
10423 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10424 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10425 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10426 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10427 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10428 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10429 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10430 ; AVX1-NEXT:    retq
10431 ;
10432 ; AVX2-LABEL: test182:
10433 ; AVX2:       # BB#0: # %entry
10434 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10435 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10436 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10437 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10438 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10439 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10440 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10441 ; AVX2-NEXT:    retq
10442 ;
10443 ; AVX512BW-LABEL: test182:
10444 ; AVX512BW:       # BB#0: # %entry
10445 ; AVX512BW-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
10446 ; AVX512BW-NEXT:    retq
10447 entry:
10448   %cmp = icmp ule <2 x i64> %a, %b
10449   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10450   ret <2 x i64> %sel
10451 }
10452
10453 define <2 x i64> @test183(<2 x i64> %a, <2 x i64> %b) {
10454 ; SSE2-LABEL: test183:
10455 ; SSE2:       # BB#0: # %entry
10456 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10457 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10458 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10459 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10460 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10461 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10462 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10463 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10464 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10465 ; SSE2-NEXT:    pand %xmm5, %xmm2
10466 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10467 ; SSE2-NEXT:    por %xmm2, %xmm3
10468 ; SSE2-NEXT:    pand %xmm3, %xmm0
10469 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10470 ; SSE2-NEXT:    por %xmm3, %xmm0
10471 ; SSE2-NEXT:    retq
10472 ;
10473 ; SSE4-LABEL: test183:
10474 ; SSE4:       # BB#0: # %entry
10475 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10476 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
10477 ; SSE4-NEXT:    movdqa %xmm1, %xmm3
10478 ; SSE4-NEXT:    pxor %xmm0, %xmm3
10479 ; SSE4-NEXT:    pxor %xmm2, %xmm0
10480 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
10481 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10482 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10483 ; SSE4-NEXT:    retq
10484 ;
10485 ; AVX1-LABEL: test183:
10486 ; AVX1:       # BB#0: # %entry
10487 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10488 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10489 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10490 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10491 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10492 ; AVX1-NEXT:    retq
10493 ;
10494 ; AVX2-LABEL: test183:
10495 ; AVX2:       # BB#0: # %entry
10496 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10497 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10498 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10499 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10500 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10501 ; AVX2-NEXT:    retq
10502 ;
10503 ; AVX512BW-LABEL: test183:
10504 ; AVX512BW:       # BB#0: # %entry
10505 ; AVX512BW-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
10506 ; AVX512BW-NEXT:    retq
10507 entry:
10508   %cmp = icmp ugt <2 x i64> %a, %b
10509   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10510   ret <2 x i64> %sel
10511 }
10512
10513 define <2 x i64> @test184(<2 x i64> %a, <2 x i64> %b) {
10514 ; SSE2-LABEL: test184:
10515 ; SSE2:       # BB#0: # %entry
10516 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10517 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10518 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10519 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10520 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10521 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10523 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10524 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10525 ; SSE2-NEXT:    pand %xmm5, %xmm2
10526 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10527 ; SSE2-NEXT:    por %xmm2, %xmm3
10528 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10529 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10530 ; SSE2-NEXT:    pandn %xmm0, %xmm3
10531 ; SSE2-NEXT:    pandn %xmm1, %xmm2
10532 ; SSE2-NEXT:    por %xmm3, %xmm2
10533 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10534 ; SSE2-NEXT:    retq
10535 ;
10536 ; SSE4-LABEL: test184:
10537 ; SSE4:       # BB#0: # %entry
10538 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10539 ; SSE4-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
10540 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10541 ; SSE4-NEXT:    pxor %xmm1, %xmm3
10542 ; SSE4-NEXT:    pcmpgtq %xmm0, %xmm3
10543 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
10544 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10545 ; SSE4-NEXT:    blendvpd %xmm2, %xmm1
10546 ; SSE4-NEXT:    movapd %xmm1, %xmm0
10547 ; SSE4-NEXT:    retq
10548 ;
10549 ; AVX1-LABEL: test184:
10550 ; AVX1:       # BB#0: # %entry
10551 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10552 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10553 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10554 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10555 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10556 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10557 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10558 ; AVX1-NEXT:    retq
10559 ;
10560 ; AVX2-LABEL: test184:
10561 ; AVX2:       # BB#0: # %entry
10562 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10563 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10564 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10565 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10566 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10567 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10568 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
10569 ; AVX2-NEXT:    retq
10570 ;
10571 ; AVX512BW-LABEL: test184:
10572 ; AVX512BW:       # BB#0: # %entry
10573 ; AVX512BW-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
10574 ; AVX512BW-NEXT:    retq
10575 entry:
10576   %cmp = icmp uge <2 x i64> %a, %b
10577   %sel = select <2 x i1> %cmp, <2 x i64> %a, <2 x i64> %b
10578   ret <2 x i64> %sel
10579 }
10580
10581 define <2 x i64> @test185(<2 x i64> %a, <2 x i64> %b) {
10582 ; SSE2-LABEL: test185:
10583 ; SSE2:       # BB#0: # %entry
10584 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10585 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10586 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10587 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10588 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10589 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10590 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10591 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10592 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
10593 ; SSE2-NEXT:    pand %xmm5, %xmm3
10594 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
10595 ; SSE2-NEXT:    por %xmm3, %xmm2
10596 ; SSE2-NEXT:    pand %xmm2, %xmm1
10597 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10598 ; SSE2-NEXT:    por %xmm1, %xmm2
10599 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10600 ; SSE2-NEXT:    retq
10601 ;
10602 ; SSE4-LABEL: test185:
10603 ; SSE4:       # BB#0: # %entry
10604 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10605 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
10606 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
10607 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10608 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10609 ; SSE4-NEXT:    retq
10610 ;
10611 ; AVX1-LABEL: test185:
10612 ; AVX1:       # BB#0: # %entry
10613 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10614 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10615 ; AVX1-NEXT:    retq
10616 ;
10617 ; AVX2-LABEL: test185:
10618 ; AVX2:       # BB#0: # %entry
10619 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10620 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10621 ; AVX2-NEXT:    retq
10622 ;
10623 ; AVX512BW-LABEL: test185:
10624 ; AVX512BW:       # BB#0: # %entry
10625 ; AVX512BW-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
10626 ; AVX512BW-NEXT:    retq
10627 entry:
10628   %cmp = icmp slt <2 x i64> %a, %b
10629   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10630   ret <2 x i64> %sel
10631 }
10632
10633 define <2 x i64> @test186(<2 x i64> %a, <2 x i64> %b) {
10634 ; SSE2-LABEL: test186:
10635 ; SSE2:       # BB#0: # %entry
10636 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10637 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10638 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10639 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10640 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10641 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10642 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10643 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10645 ; SSE2-NEXT:    pand %xmm5, %xmm2
10646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10647 ; SSE2-NEXT:    por %xmm2, %xmm3
10648 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10649 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10650 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10651 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10652 ; SSE2-NEXT:    por %xmm3, %xmm2
10653 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10654 ; SSE2-NEXT:    retq
10655 ;
10656 ; SSE4-LABEL: test186:
10657 ; SSE4:       # BB#0: # %entry
10658 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10659 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
10660 ; SSE4-NEXT:    pcmpeqd %xmm3, %xmm3
10661 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10662 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10663 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10664 ; SSE4-NEXT:    retq
10665 ;
10666 ; AVX1-LABEL: test186:
10667 ; AVX1:       # BB#0: # %entry
10668 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10669 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10670 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10671 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10672 ; AVX1-NEXT:    retq
10673 ;
10674 ; AVX2-LABEL: test186:
10675 ; AVX2:       # BB#0: # %entry
10676 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10677 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10678 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10679 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10680 ; AVX2-NEXT:    retq
10681 ;
10682 ; AVX512BW-LABEL: test186:
10683 ; AVX512BW:       # BB#0: # %entry
10684 ; AVX512BW-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
10685 ; AVX512BW-NEXT:    retq
10686 entry:
10687   %cmp = icmp sle <2 x i64> %a, %b
10688   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10689   ret <2 x i64> %sel
10690 }
10691
10692 define <2 x i64> @test187(<2 x i64> %a, <2 x i64> %b) {
10693 ; SSE2-LABEL: test187:
10694 ; SSE2:       # BB#0: # %entry
10695 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10696 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10697 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10698 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10699 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10700 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10701 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10702 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10703 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
10704 ; SSE2-NEXT:    pand %xmm5, %xmm3
10705 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
10706 ; SSE2-NEXT:    por %xmm3, %xmm2
10707 ; SSE2-NEXT:    pand %xmm2, %xmm1
10708 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10709 ; SSE2-NEXT:    por %xmm1, %xmm2
10710 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10711 ; SSE2-NEXT:    retq
10712 ;
10713 ; SSE4-LABEL: test187:
10714 ; SSE4:       # BB#0: # %entry
10715 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10716 ; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
10717 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10718 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10719 ; SSE4-NEXT:    retq
10720 ;
10721 ; AVX1-LABEL: test187:
10722 ; AVX1:       # BB#0: # %entry
10723 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10724 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10725 ; AVX1-NEXT:    retq
10726 ;
10727 ; AVX2-LABEL: test187:
10728 ; AVX2:       # BB#0: # %entry
10729 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
10730 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10731 ; AVX2-NEXT:    retq
10732 ;
10733 ; AVX512BW-LABEL: test187:
10734 ; AVX512BW:       # BB#0: # %entry
10735 ; AVX512BW-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
10736 ; AVX512BW-NEXT:    retq
10737 entry:
10738   %cmp = icmp sgt <2 x i64> %a, %b
10739   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10740   ret <2 x i64> %sel
10741 }
10742
10743 define <2 x i64> @test188(<2 x i64> %a, <2 x i64> %b) {
10744 ; SSE2-LABEL: test188:
10745 ; SSE2:       # BB#0: # %entry
10746 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
10747 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10748 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10749 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10750 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10751 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10752 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10753 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10754 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10755 ; SSE2-NEXT:    pand %xmm5, %xmm2
10756 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10757 ; SSE2-NEXT:    por %xmm2, %xmm3
10758 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10759 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10760 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10761 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10762 ; SSE2-NEXT:    por %xmm3, %xmm2
10763 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10764 ; SSE2-NEXT:    retq
10765 ;
10766 ; SSE4-LABEL: test188:
10767 ; SSE4:       # BB#0: # %entry
10768 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10769 ; SSE4-NEXT:    movdqa %xmm1, %xmm3
10770 ; SSE4-NEXT:    pcmpgtq %xmm2, %xmm3
10771 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
10772 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10773 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10774 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10775 ; SSE4-NEXT:    retq
10776 ;
10777 ; AVX1-LABEL: test188:
10778 ; AVX1:       # BB#0: # %entry
10779 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10780 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10781 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10782 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10783 ; AVX1-NEXT:    retq
10784 ;
10785 ; AVX2-LABEL: test188:
10786 ; AVX2:       # BB#0: # %entry
10787 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
10788 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10789 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10790 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10791 ; AVX2-NEXT:    retq
10792 ;
10793 ; AVX512BW-LABEL: test188:
10794 ; AVX512BW:       # BB#0: # %entry
10795 ; AVX512BW-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
10796 ; AVX512BW-NEXT:    retq
10797 entry:
10798   %cmp = icmp sge <2 x i64> %a, %b
10799   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10800   ret <2 x i64> %sel
10801 }
10802
10803 define <2 x i64> @test189(<2 x i64> %a, <2 x i64> %b) {
10804 ; SSE2-LABEL: test189:
10805 ; SSE2:       # BB#0: # %entry
10806 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10807 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10808 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10809 ; SSE2-NEXT:    pxor %xmm1, %xmm2
10810 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10811 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10812 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10813 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10814 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
10815 ; SSE2-NEXT:    pand %xmm5, %xmm3
10816 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
10817 ; SSE2-NEXT:    por %xmm3, %xmm2
10818 ; SSE2-NEXT:    pand %xmm2, %xmm1
10819 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10820 ; SSE2-NEXT:    por %xmm1, %xmm2
10821 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10822 ; SSE2-NEXT:    retq
10823 ;
10824 ; SSE4-LABEL: test189:
10825 ; SSE4:       # BB#0: # %entry
10826 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10827 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
10828 ; SSE4-NEXT:    movdqa %xmm2, %xmm3
10829 ; SSE4-NEXT:    pxor %xmm0, %xmm3
10830 ; SSE4-NEXT:    pxor %xmm1, %xmm0
10831 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
10832 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10833 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10834 ; SSE4-NEXT:    retq
10835 ;
10836 ; AVX1-LABEL: test189:
10837 ; AVX1:       # BB#0: # %entry
10838 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10839 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10840 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10841 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10842 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10843 ; AVX1-NEXT:    retq
10844 ;
10845 ; AVX2-LABEL: test189:
10846 ; AVX2:       # BB#0: # %entry
10847 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10848 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
10849 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
10850 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10851 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10852 ; AVX2-NEXT:    retq
10853 ;
10854 ; AVX512BW-LABEL: test189:
10855 ; AVX512BW:       # BB#0: # %entry
10856 ; AVX512BW-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
10857 ; AVX512BW-NEXT:    retq
10858 entry:
10859   %cmp = icmp ult <2 x i64> %a, %b
10860   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10861   ret <2 x i64> %sel
10862 }
10863
10864 define <2 x i64> @test190(<2 x i64> %a, <2 x i64> %b) {
10865 ; SSE2-LABEL: test190:
10866 ; SSE2:       # BB#0: # %entry
10867 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10868 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10869 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10870 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10871 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10872 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10873 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10874 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10875 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
10876 ; SSE2-NEXT:    pand %xmm5, %xmm2
10877 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
10878 ; SSE2-NEXT:    por %xmm2, %xmm3
10879 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
10880 ; SSE2-NEXT:    pxor %xmm3, %xmm2
10881 ; SSE2-NEXT:    pandn %xmm1, %xmm3
10882 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10883 ; SSE2-NEXT:    por %xmm3, %xmm2
10884 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10885 ; SSE2-NEXT:    retq
10886 ;
10887 ; SSE4-LABEL: test190:
10888 ; SSE4:       # BB#0: # %entry
10889 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10890 ; SSE4-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
10891 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
10892 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10893 ; SSE4-NEXT:    pxor %xmm2, %xmm3
10894 ; SSE4-NEXT:    pcmpgtq %xmm0, %xmm3
10895 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
10896 ; SSE4-NEXT:    pxor %xmm3, %xmm0
10897 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10898 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10899 ; SSE4-NEXT:    retq
10900 ;
10901 ; AVX1-LABEL: test190:
10902 ; AVX1:       # BB#0: # %entry
10903 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10904 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10905 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10906 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10907 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10908 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10909 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10910 ; AVX1-NEXT:    retq
10911 ;
10912 ; AVX2-LABEL: test190:
10913 ; AVX2:       # BB#0: # %entry
10914 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10915 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10916 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10917 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10918 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
10919 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
10920 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10921 ; AVX2-NEXT:    retq
10922 ;
10923 ; AVX512BW-LABEL: test190:
10924 ; AVX512BW:       # BB#0: # %entry
10925 ; AVX512BW-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
10926 ; AVX512BW-NEXT:    retq
10927 entry:
10928   %cmp = icmp ule <2 x i64> %a, %b
10929   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10930   ret <2 x i64> %sel
10931 }
10932
10933 define <2 x i64> @test191(<2 x i64> %a, <2 x i64> %b) {
10934 ; SSE2-LABEL: test191:
10935 ; SSE2:       # BB#0: # %entry
10936 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10937 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
10938 ; SSE2-NEXT:    pxor %xmm2, %xmm3
10939 ; SSE2-NEXT:    pxor %xmm0, %xmm2
10940 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
10941 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
10942 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
10943 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
10944 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
10945 ; SSE2-NEXT:    pand %xmm5, %xmm3
10946 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
10947 ; SSE2-NEXT:    por %xmm3, %xmm2
10948 ; SSE2-NEXT:    pand %xmm2, %xmm1
10949 ; SSE2-NEXT:    pandn %xmm0, %xmm2
10950 ; SSE2-NEXT:    por %xmm1, %xmm2
10951 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
10952 ; SSE2-NEXT:    retq
10953 ;
10954 ; SSE4-LABEL: test191:
10955 ; SSE4:       # BB#0: # %entry
10956 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
10957 ; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
10958 ; SSE4-NEXT:    movdqa %xmm1, %xmm3
10959 ; SSE4-NEXT:    pxor %xmm0, %xmm3
10960 ; SSE4-NEXT:    pxor %xmm2, %xmm0
10961 ; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
10962 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
10963 ; SSE4-NEXT:    movapd %xmm2, %xmm0
10964 ; SSE4-NEXT:    retq
10965 ;
10966 ; AVX1-LABEL: test191:
10967 ; AVX1:       # BB#0: # %entry
10968 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10969 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10970 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10971 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10972 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10973 ; AVX1-NEXT:    retq
10974 ;
10975 ; AVX2-LABEL: test191:
10976 ; AVX2:       # BB#0: # %entry
10977 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
10978 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
10979 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
10980 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
10981 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
10982 ; AVX2-NEXT:    retq
10983 ;
10984 ; AVX512BW-LABEL: test191:
10985 ; AVX512BW:       # BB#0: # %entry
10986 ; AVX512BW-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
10987 ; AVX512BW-NEXT:    retq
10988 entry:
10989   %cmp = icmp ugt <2 x i64> %a, %b
10990   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
10991   ret <2 x i64> %sel
10992 }
10993
10994 define <2 x i64> @test192(<2 x i64> %a, <2 x i64> %b) {
10995 ; SSE2-LABEL: test192:
10996 ; SSE2:       # BB#0: # %entry
10997 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
10998 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
10999 ; SSE2-NEXT:    pxor %xmm2, %xmm3
11000 ; SSE2-NEXT:    pxor %xmm1, %xmm2
11001 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
11002 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
11003 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
11004 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
11005 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
11006 ; SSE2-NEXT:    pand %xmm5, %xmm2
11007 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
11008 ; SSE2-NEXT:    por %xmm2, %xmm3
11009 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
11010 ; SSE2-NEXT:    pxor %xmm3, %xmm2
11011 ; SSE2-NEXT:    pandn %xmm1, %xmm3
11012 ; SSE2-NEXT:    pandn %xmm0, %xmm2
11013 ; SSE2-NEXT:    por %xmm3, %xmm2
11014 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
11015 ; SSE2-NEXT:    retq
11016 ;
11017 ; SSE4-LABEL: test192:
11018 ; SSE4:       # BB#0: # %entry
11019 ; SSE4-NEXT:    movdqa %xmm0, %xmm2
11020 ; SSE4-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
11021 ; SSE4-NEXT:    pxor %xmm3, %xmm0
11022 ; SSE4-NEXT:    pxor %xmm1, %xmm3
11023 ; SSE4-NEXT:    pcmpgtq %xmm0, %xmm3
11024 ; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
11025 ; SSE4-NEXT:    pxor %xmm3, %xmm0
11026 ; SSE4-NEXT:    blendvpd %xmm1, %xmm2
11027 ; SSE4-NEXT:    movapd %xmm2, %xmm0
11028 ; SSE4-NEXT:    retq
11029 ;
11030 ; AVX1-LABEL: test192:
11031 ; AVX1:       # BB#0: # %entry
11032 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
11033 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
11034 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
11035 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
11036 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
11037 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
11038 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
11039 ; AVX1-NEXT:    retq
11040 ;
11041 ; AVX2-LABEL: test192:
11042 ; AVX2:       # BB#0: # %entry
11043 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
11044 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
11045 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
11046 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
11047 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
11048 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
11049 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
11050 ; AVX2-NEXT:    retq
11051 ;
11052 ; AVX512BW-LABEL: test192:
11053 ; AVX512BW:       # BB#0: # %entry
11054 ; AVX512BW-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
11055 ; AVX512BW-NEXT:    retq
11056 entry:
11057   %cmp = icmp uge <2 x i64> %a, %b
11058   %sel = select <2 x i1> %cmp, <2 x i64> %b, <2 x i64> %a
11059   ret <2 x i64> %sel
11060 }