xref: /llvm-project/llvm/test/CodeGen/X86/vec_minmax_sint.ll (revision be6c752e157638849f1f59f7e2b7ecbe11a022fe)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
9
10;
11; Signed Maximum (GT)
12;
13
14define <2 x i64> @max_gt_v2i64(<2 x i64> %a, <2 x i64> %b) {
15; SSE2-LABEL: max_gt_v2i64:
16; SSE2:       # %bb.0:
17; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
18; SSE2-NEXT:    movdqa %xmm1, %xmm3
19; SSE2-NEXT:    pxor %xmm2, %xmm3
20; SSE2-NEXT:    pxor %xmm0, %xmm2
21; SSE2-NEXT:    movdqa %xmm2, %xmm4
22; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
23; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
24; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
25; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
26; SSE2-NEXT:    pand %xmm5, %xmm2
27; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
28; SSE2-NEXT:    por %xmm2, %xmm3
29; SSE2-NEXT:    pand %xmm3, %xmm0
30; SSE2-NEXT:    pandn %xmm1, %xmm3
31; SSE2-NEXT:    por %xmm3, %xmm0
32; SSE2-NEXT:    retq
33;
34; SSE41-LABEL: max_gt_v2i64:
35; SSE41:       # %bb.0:
36; SSE41-NEXT:    movdqa %xmm0, %xmm2
37; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
38; SSE41-NEXT:    movdqa %xmm1, %xmm0
39; SSE41-NEXT:    pxor %xmm3, %xmm0
40; SSE41-NEXT:    pxor %xmm2, %xmm3
41; SSE41-NEXT:    movdqa %xmm3, %xmm4
42; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
43; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
44; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
45; SSE41-NEXT:    pand %xmm4, %xmm0
46; SSE41-NEXT:    por %xmm3, %xmm0
47; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
48; SSE41-NEXT:    movapd %xmm1, %xmm0
49; SSE41-NEXT:    retq
50;
51; SSE42-LABEL: max_gt_v2i64:
52; SSE42:       # %bb.0:
53; SSE42-NEXT:    movdqa %xmm0, %xmm2
54; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
55; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
56; SSE42-NEXT:    movapd %xmm1, %xmm0
57; SSE42-NEXT:    retq
58;
59; AVX1-LABEL: max_gt_v2i64:
60; AVX1:       # %bb.0:
61; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
62; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
63; AVX1-NEXT:    retq
64;
65; AVX2-LABEL: max_gt_v2i64:
66; AVX2:       # %bb.0:
67; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
68; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
69; AVX2-NEXT:    retq
70;
71; AVX512-LABEL: max_gt_v2i64:
72; AVX512:       # %bb.0:
73; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
74; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
75; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
76; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
77; AVX512-NEXT:    vzeroupper
78; AVX512-NEXT:    retq
79  %1 = icmp sgt <2 x i64> %a, %b
80  %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
81  ret <2 x i64> %2
82}
83
84define <4 x i64> @max_gt_v4i64(<4 x i64> %a, <4 x i64> %b) {
85; SSE2-LABEL: max_gt_v4i64:
86; SSE2:       # %bb.0:
87; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
88; SSE2-NEXT:    movdqa %xmm2, %xmm5
89; SSE2-NEXT:    pxor %xmm4, %xmm5
90; SSE2-NEXT:    movdqa %xmm0, %xmm6
91; SSE2-NEXT:    pxor %xmm4, %xmm6
92; SSE2-NEXT:    movdqa %xmm6, %xmm7
93; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
94; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
95; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
96; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
97; SSE2-NEXT:    pand %xmm8, %xmm5
98; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
99; SSE2-NEXT:    por %xmm5, %xmm6
100; SSE2-NEXT:    pand %xmm6, %xmm0
101; SSE2-NEXT:    pandn %xmm2, %xmm6
102; SSE2-NEXT:    por %xmm6, %xmm0
103; SSE2-NEXT:    movdqa %xmm3, %xmm2
104; SSE2-NEXT:    pxor %xmm4, %xmm2
105; SSE2-NEXT:    pxor %xmm1, %xmm4
106; SSE2-NEXT:    movdqa %xmm4, %xmm5
107; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
108; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
109; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
110; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
111; SSE2-NEXT:    pand %xmm6, %xmm2
112; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
113; SSE2-NEXT:    por %xmm2, %xmm4
114; SSE2-NEXT:    pand %xmm4, %xmm1
115; SSE2-NEXT:    pandn %xmm3, %xmm4
116; SSE2-NEXT:    por %xmm4, %xmm1
117; SSE2-NEXT:    retq
118;
119; SSE41-LABEL: max_gt_v4i64:
120; SSE41:       # %bb.0:
121; SSE41-NEXT:    movdqa %xmm0, %xmm4
122; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = [2147483648,2147483648]
123; SSE41-NEXT:    movdqa %xmm2, %xmm0
124; SSE41-NEXT:    pxor %xmm5, %xmm0
125; SSE41-NEXT:    movdqa %xmm4, %xmm6
126; SSE41-NEXT:    pxor %xmm5, %xmm6
127; SSE41-NEXT:    movdqa %xmm6, %xmm7
128; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
129; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
130; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
131; SSE41-NEXT:    pand %xmm7, %xmm0
132; SSE41-NEXT:    por %xmm6, %xmm0
133; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
134; SSE41-NEXT:    movdqa %xmm3, %xmm0
135; SSE41-NEXT:    pxor %xmm5, %xmm0
136; SSE41-NEXT:    pxor %xmm1, %xmm5
137; SSE41-NEXT:    movdqa %xmm5, %xmm4
138; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
139; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
140; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
141; SSE41-NEXT:    pand %xmm4, %xmm0
142; SSE41-NEXT:    por %xmm5, %xmm0
143; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
144; SSE41-NEXT:    movapd %xmm2, %xmm0
145; SSE41-NEXT:    movapd %xmm3, %xmm1
146; SSE41-NEXT:    retq
147;
148; SSE42-LABEL: max_gt_v4i64:
149; SSE42:       # %bb.0:
150; SSE42-NEXT:    movdqa %xmm0, %xmm4
151; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
152; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
153; SSE42-NEXT:    movdqa %xmm1, %xmm0
154; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
155; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
156; SSE42-NEXT:    movapd %xmm2, %xmm0
157; SSE42-NEXT:    movapd %xmm3, %xmm1
158; SSE42-NEXT:    retq
159;
160; AVX1-LABEL: max_gt_v4i64:
161; AVX1:       # %bb.0:
162; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
163; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
164; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
165; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
166; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
167; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
168; AVX1-NEXT:    retq
169;
170; AVX2-LABEL: max_gt_v4i64:
171; AVX2:       # %bb.0:
172; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
173; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
174; AVX2-NEXT:    retq
175;
176; AVX512-LABEL: max_gt_v4i64:
177; AVX512:       # %bb.0:
178; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
179; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
180; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
181; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
182; AVX512-NEXT:    retq
183  %1 = icmp sgt <4 x i64> %a, %b
184  %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
185  ret <4 x i64> %2
186}
187
188define <4 x i32> @max_gt_v4i32(<4 x i32> %a, <4 x i32> %b) {
189; SSE2-LABEL: max_gt_v4i32:
190; SSE2:       # %bb.0:
191; SSE2-NEXT:    movdqa %xmm0, %xmm2
192; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
193; SSE2-NEXT:    pand %xmm2, %xmm0
194; SSE2-NEXT:    pandn %xmm1, %xmm2
195; SSE2-NEXT:    por %xmm2, %xmm0
196; SSE2-NEXT:    retq
197;
198; SSE41-LABEL: max_gt_v4i32:
199; SSE41:       # %bb.0:
200; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
201; SSE41-NEXT:    retq
202;
203; SSE42-LABEL: max_gt_v4i32:
204; SSE42:       # %bb.0:
205; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
206; SSE42-NEXT:    retq
207;
208; AVX-LABEL: max_gt_v4i32:
209; AVX:       # %bb.0:
210; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
211; AVX-NEXT:    retq
212  %1 = icmp sgt <4 x i32> %a, %b
213  %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
214  ret <4 x i32> %2
215}
216
217define <8 x i32> @max_gt_v8i32(<8 x i32> %a, <8 x i32> %b) {
218; SSE2-LABEL: max_gt_v8i32:
219; SSE2:       # %bb.0:
220; SSE2-NEXT:    movdqa %xmm0, %xmm4
221; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
222; SSE2-NEXT:    pand %xmm4, %xmm0
223; SSE2-NEXT:    pandn %xmm2, %xmm4
224; SSE2-NEXT:    por %xmm4, %xmm0
225; SSE2-NEXT:    movdqa %xmm1, %xmm2
226; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
227; SSE2-NEXT:    pand %xmm2, %xmm1
228; SSE2-NEXT:    pandn %xmm3, %xmm2
229; SSE2-NEXT:    por %xmm2, %xmm1
230; SSE2-NEXT:    retq
231;
232; SSE41-LABEL: max_gt_v8i32:
233; SSE41:       # %bb.0:
234; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
235; SSE41-NEXT:    pmaxsd %xmm3, %xmm1
236; SSE41-NEXT:    retq
237;
238; SSE42-LABEL: max_gt_v8i32:
239; SSE42:       # %bb.0:
240; SSE42-NEXT:    pmaxsd %xmm2, %xmm0
241; SSE42-NEXT:    pmaxsd %xmm3, %xmm1
242; SSE42-NEXT:    retq
243;
244; AVX1-LABEL: max_gt_v8i32:
245; AVX1:       # %bb.0:
246; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
247; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
248; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
249; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
250; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
251; AVX1-NEXT:    retq
252;
253; AVX2-LABEL: max_gt_v8i32:
254; AVX2:       # %bb.0:
255; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
256; AVX2-NEXT:    retq
257;
258; AVX512-LABEL: max_gt_v8i32:
259; AVX512:       # %bb.0:
260; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
261; AVX512-NEXT:    retq
262  %1 = icmp sgt <8 x i32> %a, %b
263  %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
264  ret <8 x i32> %2
265}
266
267define <8 x i16> @max_gt_v8i16(<8 x i16> %a, <8 x i16> %b) {
268; SSE-LABEL: max_gt_v8i16:
269; SSE:       # %bb.0:
270; SSE-NEXT:    pmaxsw %xmm1, %xmm0
271; SSE-NEXT:    retq
272;
273; AVX-LABEL: max_gt_v8i16:
274; AVX:       # %bb.0:
275; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
276; AVX-NEXT:    retq
277  %1 = icmp sgt <8 x i16> %a, %b
278  %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
279  ret <8 x i16> %2
280}
281
282define <16 x i16> @max_gt_v16i16(<16 x i16> %a, <16 x i16> %b) {
283; SSE-LABEL: max_gt_v16i16:
284; SSE:       # %bb.0:
285; SSE-NEXT:    pmaxsw %xmm2, %xmm0
286; SSE-NEXT:    pmaxsw %xmm3, %xmm1
287; SSE-NEXT:    retq
288;
289; AVX1-LABEL: max_gt_v16i16:
290; AVX1:       # %bb.0:
291; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
292; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
293; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
294; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
295; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
296; AVX1-NEXT:    retq
297;
298; AVX2-LABEL: max_gt_v16i16:
299; AVX2:       # %bb.0:
300; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
301; AVX2-NEXT:    retq
302;
303; AVX512-LABEL: max_gt_v16i16:
304; AVX512:       # %bb.0:
305; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
306; AVX512-NEXT:    retq
307  %1 = icmp sgt <16 x i16> %a, %b
308  %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
309  ret <16 x i16> %2
310}
311
312define <16 x i8> @max_gt_v16i8(<16 x i8> %a, <16 x i8> %b) {
313; SSE2-LABEL: max_gt_v16i8:
314; SSE2:       # %bb.0:
315; SSE2-NEXT:    movdqa %xmm0, %xmm2
316; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
317; SSE2-NEXT:    pand %xmm2, %xmm0
318; SSE2-NEXT:    pandn %xmm1, %xmm2
319; SSE2-NEXT:    por %xmm2, %xmm0
320; SSE2-NEXT:    retq
321;
322; SSE41-LABEL: max_gt_v16i8:
323; SSE41:       # %bb.0:
324; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
325; SSE41-NEXT:    retq
326;
327; SSE42-LABEL: max_gt_v16i8:
328; SSE42:       # %bb.0:
329; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
330; SSE42-NEXT:    retq
331;
332; AVX-LABEL: max_gt_v16i8:
333; AVX:       # %bb.0:
334; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
335; AVX-NEXT:    retq
336  %1 = icmp sgt <16 x i8> %a, %b
337  %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
338  ret <16 x i8> %2
339}
340
341define <32 x i8> @max_gt_v32i8(<32 x i8> %a, <32 x i8> %b) {
342; SSE2-LABEL: max_gt_v32i8:
343; SSE2:       # %bb.0:
344; SSE2-NEXT:    movdqa %xmm0, %xmm4
345; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4
346; SSE2-NEXT:    pand %xmm4, %xmm0
347; SSE2-NEXT:    pandn %xmm2, %xmm4
348; SSE2-NEXT:    por %xmm4, %xmm0
349; SSE2-NEXT:    movdqa %xmm1, %xmm2
350; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2
351; SSE2-NEXT:    pand %xmm2, %xmm1
352; SSE2-NEXT:    pandn %xmm3, %xmm2
353; SSE2-NEXT:    por %xmm2, %xmm1
354; SSE2-NEXT:    retq
355;
356; SSE41-LABEL: max_gt_v32i8:
357; SSE41:       # %bb.0:
358; SSE41-NEXT:    pmaxsb %xmm2, %xmm0
359; SSE41-NEXT:    pmaxsb %xmm3, %xmm1
360; SSE41-NEXT:    retq
361;
362; SSE42-LABEL: max_gt_v32i8:
363; SSE42:       # %bb.0:
364; SSE42-NEXT:    pmaxsb %xmm2, %xmm0
365; SSE42-NEXT:    pmaxsb %xmm3, %xmm1
366; SSE42-NEXT:    retq
367;
368; AVX1-LABEL: max_gt_v32i8:
369; AVX1:       # %bb.0:
370; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
371; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
372; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
373; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
374; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
375; AVX1-NEXT:    retq
376;
377; AVX2-LABEL: max_gt_v32i8:
378; AVX2:       # %bb.0:
379; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
380; AVX2-NEXT:    retq
381;
382; AVX512-LABEL: max_gt_v32i8:
383; AVX512:       # %bb.0:
384; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
385; AVX512-NEXT:    retq
386  %1 = icmp sgt <32 x i8> %a, %b
387  %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
388  ret <32 x i8> %2
389}
390
391;
392; Signed Maximum (GE)
393;
394
395define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
396; SSE2-LABEL: max_ge_v2i64:
397; SSE2:       # %bb.0:
398; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
399; SSE2-NEXT:    movdqa %xmm1, %xmm3
400; SSE2-NEXT:    pxor %xmm2, %xmm3
401; SSE2-NEXT:    pxor %xmm0, %xmm2
402; SSE2-NEXT:    movdqa %xmm2, %xmm4
403; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
404; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
405; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
406; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
407; SSE2-NEXT:    pand %xmm5, %xmm2
408; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
409; SSE2-NEXT:    por %xmm2, %xmm3
410; SSE2-NEXT:    pand %xmm3, %xmm0
411; SSE2-NEXT:    pandn %xmm1, %xmm3
412; SSE2-NEXT:    por %xmm3, %xmm0
413; SSE2-NEXT:    retq
414;
415; SSE41-LABEL: max_ge_v2i64:
416; SSE41:       # %bb.0:
417; SSE41-NEXT:    movdqa %xmm0, %xmm2
418; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
419; SSE41-NEXT:    movdqa %xmm1, %xmm0
420; SSE41-NEXT:    pxor %xmm3, %xmm0
421; SSE41-NEXT:    pxor %xmm2, %xmm3
422; SSE41-NEXT:    movdqa %xmm3, %xmm4
423; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
424; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
425; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
426; SSE41-NEXT:    pand %xmm4, %xmm0
427; SSE41-NEXT:    por %xmm3, %xmm0
428; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
429; SSE41-NEXT:    movapd %xmm1, %xmm0
430; SSE41-NEXT:    retq
431;
432; SSE42-LABEL: max_ge_v2i64:
433; SSE42:       # %bb.0:
434; SSE42-NEXT:    movdqa %xmm0, %xmm2
435; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
436; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
437; SSE42-NEXT:    movapd %xmm1, %xmm0
438; SSE42-NEXT:    retq
439;
440; AVX1-LABEL: max_ge_v2i64:
441; AVX1:       # %bb.0:
442; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
443; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
444; AVX1-NEXT:    retq
445;
446; AVX2-LABEL: max_ge_v2i64:
447; AVX2:       # %bb.0:
448; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
449; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
450; AVX2-NEXT:    retq
451;
452; AVX512-LABEL: max_ge_v2i64:
453; AVX512:       # %bb.0:
454; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
455; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
456; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
457; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
458; AVX512-NEXT:    vzeroupper
459; AVX512-NEXT:    retq
460  %1 = icmp sge <2 x i64> %a, %b
461  %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
462  ret <2 x i64> %2
463}
464
465define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
466; SSE2-LABEL: max_ge_v4i64:
467; SSE2:       # %bb.0:
468; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
469; SSE2-NEXT:    movdqa %xmm2, %xmm5
470; SSE2-NEXT:    pxor %xmm4, %xmm5
471; SSE2-NEXT:    movdqa %xmm0, %xmm6
472; SSE2-NEXT:    pxor %xmm4, %xmm6
473; SSE2-NEXT:    movdqa %xmm6, %xmm7
474; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
475; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
476; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
477; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
478; SSE2-NEXT:    pand %xmm8, %xmm5
479; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
480; SSE2-NEXT:    por %xmm5, %xmm6
481; SSE2-NEXT:    pand %xmm6, %xmm0
482; SSE2-NEXT:    pandn %xmm2, %xmm6
483; SSE2-NEXT:    por %xmm6, %xmm0
484; SSE2-NEXT:    movdqa %xmm3, %xmm2
485; SSE2-NEXT:    pxor %xmm4, %xmm2
486; SSE2-NEXT:    pxor %xmm1, %xmm4
487; SSE2-NEXT:    movdqa %xmm4, %xmm5
488; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
489; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
490; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
491; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
492; SSE2-NEXT:    pand %xmm6, %xmm2
493; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
494; SSE2-NEXT:    por %xmm2, %xmm4
495; SSE2-NEXT:    pand %xmm4, %xmm1
496; SSE2-NEXT:    pandn %xmm3, %xmm4
497; SSE2-NEXT:    por %xmm4, %xmm1
498; SSE2-NEXT:    retq
499;
500; SSE41-LABEL: max_ge_v4i64:
501; SSE41:       # %bb.0:
502; SSE41-NEXT:    movdqa %xmm0, %xmm4
503; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = [2147483648,2147483648]
504; SSE41-NEXT:    movdqa %xmm2, %xmm0
505; SSE41-NEXT:    pxor %xmm5, %xmm0
506; SSE41-NEXT:    movdqa %xmm4, %xmm6
507; SSE41-NEXT:    pxor %xmm5, %xmm6
508; SSE41-NEXT:    movdqa %xmm6, %xmm7
509; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
510; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
511; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
512; SSE41-NEXT:    pand %xmm7, %xmm0
513; SSE41-NEXT:    por %xmm6, %xmm0
514; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
515; SSE41-NEXT:    movdqa %xmm3, %xmm0
516; SSE41-NEXT:    pxor %xmm5, %xmm0
517; SSE41-NEXT:    pxor %xmm1, %xmm5
518; SSE41-NEXT:    movdqa %xmm5, %xmm4
519; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
520; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
521; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
522; SSE41-NEXT:    pand %xmm4, %xmm0
523; SSE41-NEXT:    por %xmm5, %xmm0
524; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
525; SSE41-NEXT:    movapd %xmm2, %xmm0
526; SSE41-NEXT:    movapd %xmm3, %xmm1
527; SSE41-NEXT:    retq
528;
529; SSE42-LABEL: max_ge_v4i64:
530; SSE42:       # %bb.0:
531; SSE42-NEXT:    movdqa %xmm0, %xmm4
532; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
533; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
534; SSE42-NEXT:    movdqa %xmm1, %xmm0
535; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
536; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
537; SSE42-NEXT:    movapd %xmm2, %xmm0
538; SSE42-NEXT:    movapd %xmm3, %xmm1
539; SSE42-NEXT:    retq
540;
541; AVX1-LABEL: max_ge_v4i64:
542; AVX1:       # %bb.0:
543; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
544; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
545; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
546; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
547; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
548; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
549; AVX1-NEXT:    retq
550;
551; AVX2-LABEL: max_ge_v4i64:
552; AVX2:       # %bb.0:
553; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
554; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
555; AVX2-NEXT:    retq
556;
557; AVX512-LABEL: max_ge_v4i64:
558; AVX512:       # %bb.0:
559; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
560; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
561; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
562; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
563; AVX512-NEXT:    retq
564  %1 = icmp sge <4 x i64> %a, %b
565  %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
566  ret <4 x i64> %2
567}
568
569define <4 x i32> @max_ge_v4i32(<4 x i32> %a, <4 x i32> %b) {
570; SSE2-LABEL: max_ge_v4i32:
571; SSE2:       # %bb.0:
572; SSE2-NEXT:    movdqa %xmm0, %xmm2
573; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
574; SSE2-NEXT:    pand %xmm2, %xmm0
575; SSE2-NEXT:    pandn %xmm1, %xmm2
576; SSE2-NEXT:    por %xmm2, %xmm0
577; SSE2-NEXT:    retq
578;
579; SSE41-LABEL: max_ge_v4i32:
580; SSE41:       # %bb.0:
581; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
582; SSE41-NEXT:    retq
583;
584; SSE42-LABEL: max_ge_v4i32:
585; SSE42:       # %bb.0:
586; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
587; SSE42-NEXT:    retq
588;
589; AVX-LABEL: max_ge_v4i32:
590; AVX:       # %bb.0:
591; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
592; AVX-NEXT:    retq
593  %1 = icmp sge <4 x i32> %a, %b
594  %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
595  ret <4 x i32> %2
596}
597
598define <8 x i32> @max_ge_v8i32(<8 x i32> %a, <8 x i32> %b) {
599; SSE2-LABEL: max_ge_v8i32:
600; SSE2:       # %bb.0:
601; SSE2-NEXT:    movdqa %xmm0, %xmm4
602; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
603; SSE2-NEXT:    pand %xmm4, %xmm0
604; SSE2-NEXT:    pandn %xmm2, %xmm4
605; SSE2-NEXT:    por %xmm4, %xmm0
606; SSE2-NEXT:    movdqa %xmm1, %xmm2
607; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
608; SSE2-NEXT:    pand %xmm2, %xmm1
609; SSE2-NEXT:    pandn %xmm3, %xmm2
610; SSE2-NEXT:    por %xmm2, %xmm1
611; SSE2-NEXT:    retq
612;
613; SSE41-LABEL: max_ge_v8i32:
614; SSE41:       # %bb.0:
615; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
616; SSE41-NEXT:    pmaxsd %xmm3, %xmm1
617; SSE41-NEXT:    retq
618;
619; SSE42-LABEL: max_ge_v8i32:
620; SSE42:       # %bb.0:
621; SSE42-NEXT:    pmaxsd %xmm2, %xmm0
622; SSE42-NEXT:    pmaxsd %xmm3, %xmm1
623; SSE42-NEXT:    retq
624;
625; AVX1-LABEL: max_ge_v8i32:
626; AVX1:       # %bb.0:
627; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
628; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
629; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
630; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
631; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
632; AVX1-NEXT:    retq
633;
634; AVX2-LABEL: max_ge_v8i32:
635; AVX2:       # %bb.0:
636; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
637; AVX2-NEXT:    retq
638;
639; AVX512-LABEL: max_ge_v8i32:
640; AVX512:       # %bb.0:
641; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
642; AVX512-NEXT:    retq
643  %1 = icmp sge <8 x i32> %a, %b
644  %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
645  ret <8 x i32> %2
646}
647
648define <8 x i16> @max_ge_v8i16(<8 x i16> %a, <8 x i16> %b) {
649; SSE-LABEL: max_ge_v8i16:
650; SSE:       # %bb.0:
651; SSE-NEXT:    pmaxsw %xmm1, %xmm0
652; SSE-NEXT:    retq
653;
654; AVX-LABEL: max_ge_v8i16:
655; AVX:       # %bb.0:
656; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
657; AVX-NEXT:    retq
658  %1 = icmp sge <8 x i16> %a, %b
659  %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
660  ret <8 x i16> %2
661}
662
663define <16 x i16> @max_ge_v16i16(<16 x i16> %a, <16 x i16> %b) {
664; SSE-LABEL: max_ge_v16i16:
665; SSE:       # %bb.0:
666; SSE-NEXT:    pmaxsw %xmm2, %xmm0
667; SSE-NEXT:    pmaxsw %xmm3, %xmm1
668; SSE-NEXT:    retq
669;
670; AVX1-LABEL: max_ge_v16i16:
671; AVX1:       # %bb.0:
672; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
673; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
674; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
675; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
676; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
677; AVX1-NEXT:    retq
678;
679; AVX2-LABEL: max_ge_v16i16:
680; AVX2:       # %bb.0:
681; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
682; AVX2-NEXT:    retq
683;
684; AVX512-LABEL: max_ge_v16i16:
685; AVX512:       # %bb.0:
686; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
687; AVX512-NEXT:    retq
688  %1 = icmp sge <16 x i16> %a, %b
689  %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
690  ret <16 x i16> %2
691}
692
693define <16 x i8> @max_ge_v16i8(<16 x i8> %a, <16 x i8> %b) {
694; SSE2-LABEL: max_ge_v16i8:
695; SSE2:       # %bb.0:
696; SSE2-NEXT:    movdqa %xmm0, %xmm2
697; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
698; SSE2-NEXT:    pand %xmm2, %xmm0
699; SSE2-NEXT:    pandn %xmm1, %xmm2
700; SSE2-NEXT:    por %xmm2, %xmm0
701; SSE2-NEXT:    retq
702;
703; SSE41-LABEL: max_ge_v16i8:
704; SSE41:       # %bb.0:
705; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
706; SSE41-NEXT:    retq
707;
708; SSE42-LABEL: max_ge_v16i8:
709; SSE42:       # %bb.0:
710; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
711; SSE42-NEXT:    retq
712;
713; AVX-LABEL: max_ge_v16i8:
714; AVX:       # %bb.0:
715; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
716; AVX-NEXT:    retq
717  %1 = icmp sge <16 x i8> %a, %b
718  %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
719  ret <16 x i8> %2
720}
721
722define <32 x i8> @max_ge_v32i8(<32 x i8> %a, <32 x i8> %b) {
723; SSE2-LABEL: max_ge_v32i8:
724; SSE2:       # %bb.0:
725; SSE2-NEXT:    movdqa %xmm0, %xmm4
726; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4
727; SSE2-NEXT:    pand %xmm4, %xmm0
728; SSE2-NEXT:    pandn %xmm2, %xmm4
729; SSE2-NEXT:    por %xmm4, %xmm0
730; SSE2-NEXT:    movdqa %xmm1, %xmm2
731; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2
732; SSE2-NEXT:    pand %xmm2, %xmm1
733; SSE2-NEXT:    pandn %xmm3, %xmm2
734; SSE2-NEXT:    por %xmm2, %xmm1
735; SSE2-NEXT:    retq
736;
737; SSE41-LABEL: max_ge_v32i8:
738; SSE41:       # %bb.0:
739; SSE41-NEXT:    pmaxsb %xmm2, %xmm0
740; SSE41-NEXT:    pmaxsb %xmm3, %xmm1
741; SSE41-NEXT:    retq
742;
743; SSE42-LABEL: max_ge_v32i8:
744; SSE42:       # %bb.0:
745; SSE42-NEXT:    pmaxsb %xmm2, %xmm0
746; SSE42-NEXT:    pmaxsb %xmm3, %xmm1
747; SSE42-NEXT:    retq
748;
749; AVX1-LABEL: max_ge_v32i8:
750; AVX1:       # %bb.0:
751; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
752; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
753; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
754; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
755; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
756; AVX1-NEXT:    retq
757;
758; AVX2-LABEL: max_ge_v32i8:
759; AVX2:       # %bb.0:
760; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
761; AVX2-NEXT:    retq
762;
763; AVX512-LABEL: max_ge_v32i8:
764; AVX512:       # %bb.0:
765; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
766; AVX512-NEXT:    retq
767  %1 = icmp sge <32 x i8> %a, %b
768  %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
769  ret <32 x i8> %2
770}
771
772;
773; Signed Minimum (LT)
774;
775
776define <2 x i64> @min_lt_v2i64(<2 x i64> %a, <2 x i64> %b) {
777; SSE2-LABEL: min_lt_v2i64:
778; SSE2:       # %bb.0:
779; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
780; SSE2-NEXT:    movdqa %xmm0, %xmm3
781; SSE2-NEXT:    pxor %xmm2, %xmm3
782; SSE2-NEXT:    pxor %xmm1, %xmm2
783; SSE2-NEXT:    movdqa %xmm2, %xmm4
784; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
785; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
786; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
787; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
788; SSE2-NEXT:    pand %xmm5, %xmm2
789; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
790; SSE2-NEXT:    por %xmm2, %xmm3
791; SSE2-NEXT:    pand %xmm3, %xmm0
792; SSE2-NEXT:    pandn %xmm1, %xmm3
793; SSE2-NEXT:    por %xmm3, %xmm0
794; SSE2-NEXT:    retq
795;
796; SSE41-LABEL: min_lt_v2i64:
797; SSE41:       # %bb.0:
798; SSE41-NEXT:    movdqa %xmm0, %xmm2
799; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
800; SSE41-NEXT:    pxor %xmm3, %xmm0
801; SSE41-NEXT:    pxor %xmm1, %xmm3
802; SSE41-NEXT:    movdqa %xmm3, %xmm4
803; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
804; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
805; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
806; SSE41-NEXT:    pand %xmm4, %xmm0
807; SSE41-NEXT:    por %xmm3, %xmm0
808; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
809; SSE41-NEXT:    movapd %xmm1, %xmm0
810; SSE41-NEXT:    retq
811;
812; SSE42-LABEL: min_lt_v2i64:
813; SSE42:       # %bb.0:
814; SSE42-NEXT:    movdqa %xmm0, %xmm2
815; SSE42-NEXT:    movdqa %xmm1, %xmm0
816; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
817; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
818; SSE42-NEXT:    movapd %xmm1, %xmm0
819; SSE42-NEXT:    retq
820;
821; AVX1-LABEL: min_lt_v2i64:
822; AVX1:       # %bb.0:
823; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
824; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
825; AVX1-NEXT:    retq
826;
827; AVX2-LABEL: min_lt_v2i64:
828; AVX2:       # %bb.0:
829; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
830; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
831; AVX2-NEXT:    retq
832;
833; AVX512-LABEL: min_lt_v2i64:
834; AVX512:       # %bb.0:
835; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
836; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
837; AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
838; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
839; AVX512-NEXT:    vzeroupper
840; AVX512-NEXT:    retq
841  %1 = icmp slt <2 x i64> %a, %b
842  %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
843  ret <2 x i64> %2
844}
845
846define <4 x i64> @min_lt_v4i64(<4 x i64> %a, <4 x i64> %b) {
847; SSE2-LABEL: min_lt_v4i64:
848; SSE2:       # %bb.0:
849; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
850; SSE2-NEXT:    movdqa %xmm0, %xmm5
851; SSE2-NEXT:    pxor %xmm4, %xmm5
852; SSE2-NEXT:    movdqa %xmm2, %xmm6
853; SSE2-NEXT:    pxor %xmm4, %xmm6
854; SSE2-NEXT:    movdqa %xmm6, %xmm7
855; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
856; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
857; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
858; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
859; SSE2-NEXT:    pand %xmm8, %xmm5
860; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
861; SSE2-NEXT:    por %xmm5, %xmm6
862; SSE2-NEXT:    pand %xmm6, %xmm0
863; SSE2-NEXT:    pandn %xmm2, %xmm6
864; SSE2-NEXT:    por %xmm6, %xmm0
865; SSE2-NEXT:    movdqa %xmm1, %xmm2
866; SSE2-NEXT:    pxor %xmm4, %xmm2
867; SSE2-NEXT:    pxor %xmm3, %xmm4
868; SSE2-NEXT:    movdqa %xmm4, %xmm5
869; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
870; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
871; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
872; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
873; SSE2-NEXT:    pand %xmm6, %xmm2
874; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
875; SSE2-NEXT:    por %xmm2, %xmm4
876; SSE2-NEXT:    pand %xmm4, %xmm1
877; SSE2-NEXT:    pandn %xmm3, %xmm4
878; SSE2-NEXT:    por %xmm4, %xmm1
879; SSE2-NEXT:    retq
880;
881; SSE41-LABEL: min_lt_v4i64:
882; SSE41:       # %bb.0:
883; SSE41-NEXT:    movdqa %xmm0, %xmm4
884; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = [2147483648,2147483648]
885; SSE41-NEXT:    pxor %xmm5, %xmm0
886; SSE41-NEXT:    movdqa %xmm2, %xmm6
887; SSE41-NEXT:    pxor %xmm5, %xmm6
888; SSE41-NEXT:    movdqa %xmm6, %xmm7
889; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
890; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
891; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
892; SSE41-NEXT:    pand %xmm7, %xmm0
893; SSE41-NEXT:    por %xmm6, %xmm0
894; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
895; SSE41-NEXT:    movdqa %xmm1, %xmm0
896; SSE41-NEXT:    pxor %xmm5, %xmm0
897; SSE41-NEXT:    pxor %xmm3, %xmm5
898; SSE41-NEXT:    movdqa %xmm5, %xmm4
899; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
900; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
901; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
902; SSE41-NEXT:    pand %xmm4, %xmm0
903; SSE41-NEXT:    por %xmm5, %xmm0
904; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
905; SSE41-NEXT:    movapd %xmm2, %xmm0
906; SSE41-NEXT:    movapd %xmm3, %xmm1
907; SSE41-NEXT:    retq
908;
909; SSE42-LABEL: min_lt_v4i64:
910; SSE42:       # %bb.0:
911; SSE42-NEXT:    movdqa %xmm0, %xmm4
912; SSE42-NEXT:    movdqa %xmm2, %xmm0
913; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
914; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
915; SSE42-NEXT:    movdqa %xmm3, %xmm0
916; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
917; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
918; SSE42-NEXT:    movapd %xmm2, %xmm0
919; SSE42-NEXT:    movapd %xmm3, %xmm1
920; SSE42-NEXT:    retq
921;
922; AVX1-LABEL: min_lt_v4i64:
923; AVX1:       # %bb.0:
924; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
925; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
926; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
927; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
928; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
929; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
930; AVX1-NEXT:    retq
931;
932; AVX2-LABEL: min_lt_v4i64:
933; AVX2:       # %bb.0:
934; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
935; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
936; AVX2-NEXT:    retq
937;
938; AVX512-LABEL: min_lt_v4i64:
939; AVX512:       # %bb.0:
940; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
941; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
942; AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
943; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
944; AVX512-NEXT:    retq
945  %1 = icmp slt <4 x i64> %a, %b
946  %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
947  ret <4 x i64> %2
948}
949
950define <4 x i32> @min_lt_v4i32(<4 x i32> %a, <4 x i32> %b) {
951; SSE2-LABEL: min_lt_v4i32:
952; SSE2:       # %bb.0:
953; SSE2-NEXT:    movdqa %xmm1, %xmm2
954; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
955; SSE2-NEXT:    pand %xmm2, %xmm0
956; SSE2-NEXT:    pandn %xmm1, %xmm2
957; SSE2-NEXT:    por %xmm2, %xmm0
958; SSE2-NEXT:    retq
959;
960; SSE41-LABEL: min_lt_v4i32:
961; SSE41:       # %bb.0:
962; SSE41-NEXT:    pminsd %xmm1, %xmm0
963; SSE41-NEXT:    retq
964;
965; SSE42-LABEL: min_lt_v4i32:
966; SSE42:       # %bb.0:
967; SSE42-NEXT:    pminsd %xmm1, %xmm0
968; SSE42-NEXT:    retq
969;
970; AVX-LABEL: min_lt_v4i32:
971; AVX:       # %bb.0:
972; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
973; AVX-NEXT:    retq
974  %1 = icmp slt <4 x i32> %a, %b
975  %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
976  ret <4 x i32> %2
977}
978
979define <8 x i32> @min_lt_v8i32(<8 x i32> %a, <8 x i32> %b) {
980; SSE2-LABEL: min_lt_v8i32:
981; SSE2:       # %bb.0:
982; SSE2-NEXT:    movdqa %xmm2, %xmm4
983; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
984; SSE2-NEXT:    pand %xmm4, %xmm0
985; SSE2-NEXT:    pandn %xmm2, %xmm4
986; SSE2-NEXT:    por %xmm4, %xmm0
987; SSE2-NEXT:    movdqa %xmm3, %xmm2
988; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
989; SSE2-NEXT:    pand %xmm2, %xmm1
990; SSE2-NEXT:    pandn %xmm3, %xmm2
991; SSE2-NEXT:    por %xmm2, %xmm1
992; SSE2-NEXT:    retq
993;
994; SSE41-LABEL: min_lt_v8i32:
995; SSE41:       # %bb.0:
996; SSE41-NEXT:    pminsd %xmm2, %xmm0
997; SSE41-NEXT:    pminsd %xmm3, %xmm1
998; SSE41-NEXT:    retq
999;
1000; SSE42-LABEL: min_lt_v8i32:
1001; SSE42:       # %bb.0:
1002; SSE42-NEXT:    pminsd %xmm2, %xmm0
1003; SSE42-NEXT:    pminsd %xmm3, %xmm1
1004; SSE42-NEXT:    retq
1005;
1006; AVX1-LABEL: min_lt_v8i32:
1007; AVX1:       # %bb.0:
1008; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1009; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1010; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
1011; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
1012; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1013; AVX1-NEXT:    retq
1014;
1015; AVX2-LABEL: min_lt_v8i32:
1016; AVX2:       # %bb.0:
1017; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1018; AVX2-NEXT:    retq
1019;
1020; AVX512-LABEL: min_lt_v8i32:
1021; AVX512:       # %bb.0:
1022; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1023; AVX512-NEXT:    retq
1024  %1 = icmp slt <8 x i32> %a, %b
1025  %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1026  ret <8 x i32> %2
1027}
1028
1029define <8 x i16> @min_lt_v8i16(<8 x i16> %a, <8 x i16> %b) {
1030; SSE-LABEL: min_lt_v8i16:
1031; SSE:       # %bb.0:
1032; SSE-NEXT:    pminsw %xmm1, %xmm0
1033; SSE-NEXT:    retq
1034;
1035; AVX-LABEL: min_lt_v8i16:
1036; AVX:       # %bb.0:
1037; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1038; AVX-NEXT:    retq
1039  %1 = icmp slt <8 x i16> %a, %b
1040  %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1041  ret <8 x i16> %2
1042}
1043
1044define <16 x i16> @min_lt_v16i16(<16 x i16> %a, <16 x i16> %b) {
1045; SSE-LABEL: min_lt_v16i16:
1046; SSE:       # %bb.0:
1047; SSE-NEXT:    pminsw %xmm2, %xmm0
1048; SSE-NEXT:    pminsw %xmm3, %xmm1
1049; SSE-NEXT:    retq
1050;
1051; AVX1-LABEL: min_lt_v16i16:
1052; AVX1:       # %bb.0:
1053; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1054; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1055; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
1056; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1057; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1058; AVX1-NEXT:    retq
1059;
1060; AVX2-LABEL: min_lt_v16i16:
1061; AVX2:       # %bb.0:
1062; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1063; AVX2-NEXT:    retq
1064;
1065; AVX512-LABEL: min_lt_v16i16:
1066; AVX512:       # %bb.0:
1067; AVX512-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1068; AVX512-NEXT:    retq
1069  %1 = icmp slt <16 x i16> %a, %b
1070  %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1071  ret <16 x i16> %2
1072}
1073
1074define <16 x i8> @min_lt_v16i8(<16 x i8> %a, <16 x i8> %b) {
1075; SSE2-LABEL: min_lt_v16i8:
1076; SSE2:       # %bb.0:
1077; SSE2-NEXT:    movdqa %xmm1, %xmm2
1078; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1079; SSE2-NEXT:    pand %xmm2, %xmm0
1080; SSE2-NEXT:    pandn %xmm1, %xmm2
1081; SSE2-NEXT:    por %xmm2, %xmm0
1082; SSE2-NEXT:    retq
1083;
1084; SSE41-LABEL: min_lt_v16i8:
1085; SSE41:       # %bb.0:
1086; SSE41-NEXT:    pminsb %xmm1, %xmm0
1087; SSE41-NEXT:    retq
1088;
1089; SSE42-LABEL: min_lt_v16i8:
1090; SSE42:       # %bb.0:
1091; SSE42-NEXT:    pminsb %xmm1, %xmm0
1092; SSE42-NEXT:    retq
1093;
1094; AVX-LABEL: min_lt_v16i8:
1095; AVX:       # %bb.0:
1096; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1097; AVX-NEXT:    retq
1098  %1 = icmp slt <16 x i8> %a, %b
1099  %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1100  ret <16 x i8> %2
1101}
1102
1103define <32 x i8> @min_lt_v32i8(<32 x i8> %a, <32 x i8> %b) {
1104; SSE2-LABEL: min_lt_v32i8:
1105; SSE2:       # %bb.0:
1106; SSE2-NEXT:    movdqa %xmm2, %xmm4
1107; SSE2-NEXT:    pcmpgtb %xmm0, %xmm4
1108; SSE2-NEXT:    pand %xmm4, %xmm0
1109; SSE2-NEXT:    pandn %xmm2, %xmm4
1110; SSE2-NEXT:    por %xmm4, %xmm0
1111; SSE2-NEXT:    movdqa %xmm3, %xmm2
1112; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1113; SSE2-NEXT:    pand %xmm2, %xmm1
1114; SSE2-NEXT:    pandn %xmm3, %xmm2
1115; SSE2-NEXT:    por %xmm2, %xmm1
1116; SSE2-NEXT:    retq
1117;
1118; SSE41-LABEL: min_lt_v32i8:
1119; SSE41:       # %bb.0:
1120; SSE41-NEXT:    pminsb %xmm2, %xmm0
1121; SSE41-NEXT:    pminsb %xmm3, %xmm1
1122; SSE41-NEXT:    retq
1123;
1124; SSE42-LABEL: min_lt_v32i8:
1125; SSE42:       # %bb.0:
1126; SSE42-NEXT:    pminsb %xmm2, %xmm0
1127; SSE42-NEXT:    pminsb %xmm3, %xmm1
1128; SSE42-NEXT:    retq
1129;
1130; AVX1-LABEL: min_lt_v32i8:
1131; AVX1:       # %bb.0:
1132; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1133; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1134; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
1135; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1136; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1137; AVX1-NEXT:    retq
1138;
1139; AVX2-LABEL: min_lt_v32i8:
1140; AVX2:       # %bb.0:
1141; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
1142; AVX2-NEXT:    retq
1143;
1144; AVX512-LABEL: min_lt_v32i8:
1145; AVX512:       # %bb.0:
1146; AVX512-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
1147; AVX512-NEXT:    retq
1148  %1 = icmp slt <32 x i8> %a, %b
1149  %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1150  ret <32 x i8> %2
1151}
1152
1153;
1154; Signed Minimum (LE)
1155;
1156
1157define <2 x i64> @min_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
1158; SSE2-LABEL: min_le_v2i64:
1159; SSE2:       # %bb.0:
1160; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1161; SSE2-NEXT:    movdqa %xmm0, %xmm3
1162; SSE2-NEXT:    pxor %xmm2, %xmm3
1163; SSE2-NEXT:    pxor %xmm1, %xmm2
1164; SSE2-NEXT:    movdqa %xmm2, %xmm4
1165; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1166; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1167; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1168; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1169; SSE2-NEXT:    pand %xmm5, %xmm2
1170; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1171; SSE2-NEXT:    por %xmm2, %xmm3
1172; SSE2-NEXT:    pand %xmm3, %xmm0
1173; SSE2-NEXT:    pandn %xmm1, %xmm3
1174; SSE2-NEXT:    por %xmm3, %xmm0
1175; SSE2-NEXT:    retq
1176;
1177; SSE41-LABEL: min_le_v2i64:
1178; SSE41:       # %bb.0:
1179; SSE41-NEXT:    movdqa %xmm0, %xmm2
1180; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
1181; SSE41-NEXT:    pxor %xmm3, %xmm0
1182; SSE41-NEXT:    pxor %xmm1, %xmm3
1183; SSE41-NEXT:    movdqa %xmm3, %xmm4
1184; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1185; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1186; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1187; SSE41-NEXT:    pand %xmm4, %xmm0
1188; SSE41-NEXT:    por %xmm3, %xmm0
1189; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1190; SSE41-NEXT:    movapd %xmm1, %xmm0
1191; SSE41-NEXT:    retq
1192;
1193; SSE42-LABEL: min_le_v2i64:
1194; SSE42:       # %bb.0:
1195; SSE42-NEXT:    movdqa %xmm0, %xmm2
1196; SSE42-NEXT:    movdqa %xmm1, %xmm0
1197; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
1198; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1199; SSE42-NEXT:    movapd %xmm1, %xmm0
1200; SSE42-NEXT:    retq
1201;
1202; AVX1-LABEL: min_le_v2i64:
1203; AVX1:       # %bb.0:
1204; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1205; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1206; AVX1-NEXT:    retq
1207;
1208; AVX2-LABEL: min_le_v2i64:
1209; AVX2:       # %bb.0:
1210; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1211; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1212; AVX2-NEXT:    retq
1213;
1214; AVX512-LABEL: min_le_v2i64:
1215; AVX512:       # %bb.0:
1216; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1217; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1218; AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
1219; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1220; AVX512-NEXT:    vzeroupper
1221; AVX512-NEXT:    retq
1222  %1 = icmp sle <2 x i64> %a, %b
1223  %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
1224  ret <2 x i64> %2
1225}
1226
1227define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
1228; SSE2-LABEL: min_le_v4i64:
1229; SSE2:       # %bb.0:
1230; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1231; SSE2-NEXT:    movdqa %xmm0, %xmm5
1232; SSE2-NEXT:    pxor %xmm4, %xmm5
1233; SSE2-NEXT:    movdqa %xmm2, %xmm6
1234; SSE2-NEXT:    pxor %xmm4, %xmm6
1235; SSE2-NEXT:    movdqa %xmm6, %xmm7
1236; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1237; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1238; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1239; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1240; SSE2-NEXT:    pand %xmm8, %xmm5
1241; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1242; SSE2-NEXT:    por %xmm5, %xmm6
1243; SSE2-NEXT:    pand %xmm6, %xmm0
1244; SSE2-NEXT:    pandn %xmm2, %xmm6
1245; SSE2-NEXT:    por %xmm6, %xmm0
1246; SSE2-NEXT:    movdqa %xmm1, %xmm2
1247; SSE2-NEXT:    pxor %xmm4, %xmm2
1248; SSE2-NEXT:    pxor %xmm3, %xmm4
1249; SSE2-NEXT:    movdqa %xmm4, %xmm5
1250; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1251; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1252; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1253; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1254; SSE2-NEXT:    pand %xmm6, %xmm2
1255; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1256; SSE2-NEXT:    por %xmm2, %xmm4
1257; SSE2-NEXT:    pand %xmm4, %xmm1
1258; SSE2-NEXT:    pandn %xmm3, %xmm4
1259; SSE2-NEXT:    por %xmm4, %xmm1
1260; SSE2-NEXT:    retq
1261;
1262; SSE41-LABEL: min_le_v4i64:
1263; SSE41:       # %bb.0:
1264; SSE41-NEXT:    movdqa %xmm0, %xmm4
1265; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = [2147483648,2147483648]
1266; SSE41-NEXT:    pxor %xmm5, %xmm0
1267; SSE41-NEXT:    movdqa %xmm2, %xmm6
1268; SSE41-NEXT:    pxor %xmm5, %xmm6
1269; SSE41-NEXT:    movdqa %xmm6, %xmm7
1270; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
1271; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1272; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1273; SSE41-NEXT:    pand %xmm7, %xmm0
1274; SSE41-NEXT:    por %xmm6, %xmm0
1275; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1276; SSE41-NEXT:    movdqa %xmm1, %xmm0
1277; SSE41-NEXT:    pxor %xmm5, %xmm0
1278; SSE41-NEXT:    pxor %xmm3, %xmm5
1279; SSE41-NEXT:    movdqa %xmm5, %xmm4
1280; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1281; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1282; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1283; SSE41-NEXT:    pand %xmm4, %xmm0
1284; SSE41-NEXT:    por %xmm5, %xmm0
1285; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1286; SSE41-NEXT:    movapd %xmm2, %xmm0
1287; SSE41-NEXT:    movapd %xmm3, %xmm1
1288; SSE41-NEXT:    retq
1289;
1290; SSE42-LABEL: min_le_v4i64:
1291; SSE42:       # %bb.0:
1292; SSE42-NEXT:    movdqa %xmm0, %xmm4
1293; SSE42-NEXT:    movdqa %xmm2, %xmm0
1294; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
1295; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1296; SSE42-NEXT:    movdqa %xmm3, %xmm0
1297; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1298; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1299; SSE42-NEXT:    movapd %xmm2, %xmm0
1300; SSE42-NEXT:    movapd %xmm3, %xmm1
1301; SSE42-NEXT:    retq
1302;
1303; AVX1-LABEL: min_le_v4i64:
1304; AVX1:       # %bb.0:
1305; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1306; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1307; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1308; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
1309; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1310; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1311; AVX1-NEXT:    retq
1312;
1313; AVX2-LABEL: min_le_v4i64:
1314; AVX2:       # %bb.0:
1315; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1316; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1317; AVX2-NEXT:    retq
1318;
1319; AVX512-LABEL: min_le_v4i64:
1320; AVX512:       # %bb.0:
1321; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1322; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1323; AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
1324; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1325; AVX512-NEXT:    retq
1326  %1 = icmp sle <4 x i64> %a, %b
1327  %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
1328  ret <4 x i64> %2
1329}
1330
1331define <4 x i32> @min_le_v4i32(<4 x i32> %a, <4 x i32> %b) {
1332; SSE2-LABEL: min_le_v4i32:
1333; SSE2:       # %bb.0:
1334; SSE2-NEXT:    movdqa %xmm1, %xmm2
1335; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1336; SSE2-NEXT:    pand %xmm2, %xmm0
1337; SSE2-NEXT:    pandn %xmm1, %xmm2
1338; SSE2-NEXT:    por %xmm2, %xmm0
1339; SSE2-NEXT:    retq
1340;
1341; SSE41-LABEL: min_le_v4i32:
1342; SSE41:       # %bb.0:
1343; SSE41-NEXT:    pminsd %xmm1, %xmm0
1344; SSE41-NEXT:    retq
1345;
1346; SSE42-LABEL: min_le_v4i32:
1347; SSE42:       # %bb.0:
1348; SSE42-NEXT:    pminsd %xmm1, %xmm0
1349; SSE42-NEXT:    retq
1350;
1351; AVX-LABEL: min_le_v4i32:
1352; AVX:       # %bb.0:
1353; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
1354; AVX-NEXT:    retq
1355  %1 = icmp sle <4 x i32> %a, %b
1356  %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
1357  ret <4 x i32> %2
1358}
1359
1360define <8 x i32> @min_le_v8i32(<8 x i32> %a, <8 x i32> %b) {
1361; SSE2-LABEL: min_le_v8i32:
1362; SSE2:       # %bb.0:
1363; SSE2-NEXT:    movdqa %xmm2, %xmm4
1364; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1365; SSE2-NEXT:    pand %xmm4, %xmm0
1366; SSE2-NEXT:    pandn %xmm2, %xmm4
1367; SSE2-NEXT:    por %xmm4, %xmm0
1368; SSE2-NEXT:    movdqa %xmm3, %xmm2
1369; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1370; SSE2-NEXT:    pand %xmm2, %xmm1
1371; SSE2-NEXT:    pandn %xmm3, %xmm2
1372; SSE2-NEXT:    por %xmm2, %xmm1
1373; SSE2-NEXT:    retq
1374;
1375; SSE41-LABEL: min_le_v8i32:
1376; SSE41:       # %bb.0:
1377; SSE41-NEXT:    pminsd %xmm2, %xmm0
1378; SSE41-NEXT:    pminsd %xmm3, %xmm1
1379; SSE41-NEXT:    retq
1380;
1381; SSE42-LABEL: min_le_v8i32:
1382; SSE42:       # %bb.0:
1383; SSE42-NEXT:    pminsd %xmm2, %xmm0
1384; SSE42-NEXT:    pminsd %xmm3, %xmm1
1385; SSE42-NEXT:    retq
1386;
1387; AVX1-LABEL: min_le_v8i32:
1388; AVX1:       # %bb.0:
1389; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1390; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1391; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm2
1392; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
1393; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1394; AVX1-NEXT:    retq
1395;
1396; AVX2-LABEL: min_le_v8i32:
1397; AVX2:       # %bb.0:
1398; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1399; AVX2-NEXT:    retq
1400;
1401; AVX512-LABEL: min_le_v8i32:
1402; AVX512:       # %bb.0:
1403; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1404; AVX512-NEXT:    retq
1405  %1 = icmp sle <8 x i32> %a, %b
1406  %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1407  ret <8 x i32> %2
1408}
1409
1410define <8 x i16> @min_le_v8i16(<8 x i16> %a, <8 x i16> %b) {
1411; SSE-LABEL: min_le_v8i16:
1412; SSE:       # %bb.0:
1413; SSE-NEXT:    pminsw %xmm1, %xmm0
1414; SSE-NEXT:    retq
1415;
1416; AVX-LABEL: min_le_v8i16:
1417; AVX:       # %bb.0:
1418; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1419; AVX-NEXT:    retq
1420  %1 = icmp sle <8 x i16> %a, %b
1421  %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1422  ret <8 x i16> %2
1423}
1424
1425define <16 x i16> @min_le_v16i16(<16 x i16> %a, <16 x i16> %b) {
1426; SSE-LABEL: min_le_v16i16:
1427; SSE:       # %bb.0:
1428; SSE-NEXT:    pminsw %xmm2, %xmm0
1429; SSE-NEXT:    pminsw %xmm3, %xmm1
1430; SSE-NEXT:    retq
1431;
1432; AVX1-LABEL: min_le_v16i16:
1433; AVX1:       # %bb.0:
1434; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1435; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1436; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
1437; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
1438; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1439; AVX1-NEXT:    retq
1440;
1441; AVX2-LABEL: min_le_v16i16:
1442; AVX2:       # %bb.0:
1443; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1444; AVX2-NEXT:    retq
1445;
1446; AVX512-LABEL: min_le_v16i16:
1447; AVX512:       # %bb.0:
1448; AVX512-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1449; AVX512-NEXT:    retq
1450  %1 = icmp sle <16 x i16> %a, %b
1451  %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1452  ret <16 x i16> %2
1453}
1454
1455define <16 x i8> @min_le_v16i8(<16 x i8> %a, <16 x i8> %b) {
1456; SSE2-LABEL: min_le_v16i8:
1457; SSE2:       # %bb.0:
1458; SSE2-NEXT:    movdqa %xmm1, %xmm2
1459; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1460; SSE2-NEXT:    pand %xmm2, %xmm0
1461; SSE2-NEXT:    pandn %xmm1, %xmm2
1462; SSE2-NEXT:    por %xmm2, %xmm0
1463; SSE2-NEXT:    retq
1464;
1465; SSE41-LABEL: min_le_v16i8:
1466; SSE41:       # %bb.0:
1467; SSE41-NEXT:    pminsb %xmm1, %xmm0
1468; SSE41-NEXT:    retq
1469;
1470; SSE42-LABEL: min_le_v16i8:
1471; SSE42:       # %bb.0:
1472; SSE42-NEXT:    pminsb %xmm1, %xmm0
1473; SSE42-NEXT:    retq
1474;
1475; AVX-LABEL: min_le_v16i8:
1476; AVX:       # %bb.0:
1477; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1478; AVX-NEXT:    retq
1479  %1 = icmp sle <16 x i8> %a, %b
1480  %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1481  ret <16 x i8> %2
1482}
1483
1484define <32 x i8> @min_le_v32i8(<32 x i8> %a, <32 x i8> %b) {
1485; SSE2-LABEL: min_le_v32i8:
1486; SSE2:       # %bb.0:
1487; SSE2-NEXT:    movdqa %xmm2, %xmm4
1488; SSE2-NEXT:    pcmpgtb %xmm0, %xmm4
1489; SSE2-NEXT:    pand %xmm4, %xmm0
1490; SSE2-NEXT:    pandn %xmm2, %xmm4
1491; SSE2-NEXT:    por %xmm4, %xmm0
1492; SSE2-NEXT:    movdqa %xmm3, %xmm2
1493; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1494; SSE2-NEXT:    pand %xmm2, %xmm1
1495; SSE2-NEXT:    pandn %xmm3, %xmm2
1496; SSE2-NEXT:    por %xmm2, %xmm1
1497; SSE2-NEXT:    retq
1498;
1499; SSE41-LABEL: min_le_v32i8:
1500; SSE41:       # %bb.0:
1501; SSE41-NEXT:    pminsb %xmm2, %xmm0
1502; SSE41-NEXT:    pminsb %xmm3, %xmm1
1503; SSE41-NEXT:    retq
1504;
1505; SSE42-LABEL: min_le_v32i8:
1506; SSE42:       # %bb.0:
1507; SSE42-NEXT:    pminsb %xmm2, %xmm0
1508; SSE42-NEXT:    pminsb %xmm3, %xmm1
1509; SSE42-NEXT:    retq
1510;
1511; AVX1-LABEL: min_le_v32i8:
1512; AVX1:       # %bb.0:
1513; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1514; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1515; AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
1516; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
1517; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1518; AVX1-NEXT:    retq
1519;
1520; AVX2-LABEL: min_le_v32i8:
1521; AVX2:       # %bb.0:
1522; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
1523; AVX2-NEXT:    retq
1524;
1525; AVX512-LABEL: min_le_v32i8:
1526; AVX512:       # %bb.0:
1527; AVX512-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
1528; AVX512-NEXT:    retq
1529  %1 = icmp sle <32 x i8> %a, %b
1530  %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1531  ret <32 x i8> %2
1532}
1533
1534;
1535; Constant Folding
1536;
1537
1538define <2 x i64> @max_gt_v2i64c() {
1539; SSE-LABEL: max_gt_v2i64c:
1540; SSE:       # %bb.0:
1541; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551615,7]
1542; SSE-NEXT:    retq
1543;
1544; AVX1-LABEL: max_gt_v2i64c:
1545; AVX1:       # %bb.0:
1546; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551615,7]
1547; AVX1-NEXT:    retq
1548;
1549; AVX2-LABEL: max_gt_v2i64c:
1550; AVX2:       # %bb.0:
1551; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551615,7]
1552; AVX2-NEXT:    retq
1553;
1554; AVX512-LABEL: max_gt_v2i64c:
1555; AVX512:       # %bb.0:
1556; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm0 = [18446744073709551615,7]
1557; AVX512-NEXT:    retq
1558  %1 = insertelement <2 x i64> <i64 -7, i64 7>, i64 -7, i32 0
1559  %2 = insertelement <2 x i64> <i64 -1, i64 1>, i64 -1, i32 0
1560  %3 = icmp sgt <2 x i64> %1, %2
1561  %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1562  ret <2 x i64> %4
1563}
1564
1565define <4 x i64> @max_gt_v4i64c() {
1566; SSE-LABEL: max_gt_v4i64c:
1567; SSE:       # %bb.0:
1568; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,7]
1569; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
1570; SSE-NEXT:    retq
1571;
1572; AVX1-LABEL: max_gt_v4i64c:
1573; AVX1:       # %bb.0:
1574; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1575; AVX1-NEXT:    retq
1576;
1577; AVX2-LABEL: max_gt_v4i64c:
1578; AVX2:       # %bb.0:
1579; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1580; AVX2-NEXT:    retq
1581;
1582; AVX512-LABEL: max_gt_v4i64c:
1583; AVX512:       # %bb.0:
1584; AVX512-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1585; AVX512-NEXT:    retq
1586  %1 = insertelement <4 x i64> <i64 -7, i64 -1, i64 1, i64 7>, i64 -7, i32 0
1587  %2 = insertelement <4 x i64> <i64 -1, i64 -7, i64 7, i64 1>, i64 -1, i32 0
1588  %3 = icmp sgt <4 x i64> %1, %2
1589  %4 = select <4 x i1> %3, <4 x i64> %1, <4 x i64> %2
1590  ret <4 x i64> %4
1591}
1592
1593define <4 x i32> @max_gt_v4i32c() {
1594; SSE-LABEL: max_gt_v4i32c:
1595; SSE:       # %bb.0:
1596; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1597; SSE-NEXT:    retq
1598;
1599; AVX1-LABEL: max_gt_v4i32c:
1600; AVX1:       # %bb.0:
1601; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1602; AVX1-NEXT:    retq
1603;
1604; AVX2-LABEL: max_gt_v4i32c:
1605; AVX2:       # %bb.0:
1606; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1607; AVX2-NEXT:    retq
1608;
1609; AVX512-LABEL: max_gt_v4i32c:
1610; AVX512:       # %bb.0:
1611; AVX512-NEXT:    vpmovsxbd {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1612; AVX512-NEXT:    retq
1613  %1 = insertelement <4 x i32> <i32 -7, i32 -1, i32 1, i32 7>, i32 -7, i32 0
1614  %2 = insertelement <4 x i32> <i32 -1, i32 -7, i32 7, i32 1>, i32 -1, i32 0
1615  %3 = icmp sgt <4 x i32> %1, %2
1616  %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1617  ret <4 x i32> %4
1618}
1619
1620define <8 x i32> @max_gt_v8i32c() {
1621; SSE-LABEL: max_gt_v8i32c:
1622; SSE:       # %bb.0:
1623; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,4294967293,4294967293,4294967295]
1624; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,5,5,7]
1625; SSE-NEXT:    retq
1626;
1627; AVX1-LABEL: max_gt_v8i32c:
1628; AVX1:       # %bb.0:
1629; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1630; AVX1-NEXT:    retq
1631;
1632; AVX2-LABEL: max_gt_v8i32c:
1633; AVX2:       # %bb.0:
1634; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1635; AVX2-NEXT:    retq
1636;
1637; AVX512-LABEL: max_gt_v8i32c:
1638; AVX512:       # %bb.0:
1639; AVX512-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1640; AVX512-NEXT:    retq
1641  %1 = insertelement <8 x i32> <i32 -7, i32 -5, i32 -3, i32 -1, i32 1, i32 3, i32 5, i32 7>, i32 -7, i32 0
1642  %2 = insertelement <8 x i32> <i32 -1, i32 -3, i32 -5, i32 -7, i32 7, i32 5, i32 3, i32 1>, i32 -1, i32 0
1643  %3 = icmp sgt <8 x i32> %1, %2
1644  %4 = select <8 x i1> %3, <8 x i32> %1, <8 x i32> %2
1645  ret <8 x i32> %4
1646}
1647
1648define <8 x i16> @max_gt_v8i16c() {
1649; SSE-LABEL: max_gt_v8i16c:
1650; SSE:       # %bb.0:
1651; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65535,65533,65533,65535,7,5,5,7]
1652; SSE-NEXT:    retq
1653;
1654; AVX-LABEL: max_gt_v8i16c:
1655; AVX:       # %bb.0:
1656; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [65535,65533,65533,65535,7,5,5,7]
1657; AVX-NEXT:    retq
1658  %1 = insertelement <8 x i16> <i16 -7, i16 -5, i16 -3, i16 -1, i16 1, i16 3, i16 5, i16 7>, i16 -7, i32 0
1659  %2 = insertelement <8 x i16> <i16 -1, i16 -3, i16 -5, i16 -7, i16 7, i16 5, i16 3, i16 1>, i16 -1, i32 0
1660  %3 = icmp sgt <8 x i16> %1, %2
1661  %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1662  ret <8 x i16> %4
1663}
1664
1665define <16 x i16> @max_gt_v16i16c() {
1666; SSE-LABEL: max_gt_v16i16c:
1667; SSE:       # %bb.0:
1668; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65535,65534,65533,65532,65533,65534,65535,0]
1669; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,6,5,4,5,6,7,8]
1670; SSE-NEXT:    retq
1671;
1672; AVX-LABEL: max_gt_v16i16c:
1673; AVX:       # %bb.0:
1674; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [65535,65534,65533,65532,65533,65534,65535,0,7,6,5,4,5,6,7,8]
1675; AVX-NEXT:    retq
1676  %1 = insertelement <16 x i16> <i16 -7, i16 -6, i16 -5, i16 -4, i16 -3, i16 -2, i16 -1, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, i16 -7, i32 0
1677  %2 = insertelement <16 x i16> <i16 -1, i16 -2, i16 -3, i16 -4, i16 -5, i16 -6, i16 -7, i16 0, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1, i16 0>, i16 -1, i32 0
1678  %3 = icmp sgt <16 x i16> %1, %2
1679  %4 = select <16 x i1> %3, <16 x i16> %1, <16 x i16> %2
1680  ret <16 x i16> %4
1681}
1682
1683define <16 x i8> @max_gt_v16i8c() {
1684; SSE-LABEL: max_gt_v16i8c:
1685; SSE:       # %bb.0:
1686; SSE-NEXT:    movaps {{.*#+}} xmm0 = [255,254,253,252,253,254,255,0,7,6,5,4,5,6,7,8]
1687; SSE-NEXT:    retq
1688;
1689; AVX-LABEL: max_gt_v16i8c:
1690; AVX:       # %bb.0:
1691; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [255,254,253,252,253,254,255,0,7,6,5,4,5,6,7,8]
1692; AVX-NEXT:    retq
1693  %1 = insertelement <16 x i8> <i8 -7, i8 -6, i8 -5, i8 -4, i8 -3, i8 -2, i8 -1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, i8 -7, i32 0
1694  %2 = insertelement <16 x i8> <i8 -1, i8 -2, i8 -3, i8 -4, i8 -5, i8 -6, i8 -7, i8 0, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, i8 -1, i32 0
1695  %3 = icmp sgt <16 x i8> %1, %2
1696  %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1697  ret <16 x i8> %4
1698}
1699
1700define <2 x i64> @max_ge_v2i64c() {
1701; SSE-LABEL: max_ge_v2i64c:
1702; SSE:       # %bb.0:
1703; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551615,7]
1704; SSE-NEXT:    retq
1705;
1706; AVX1-LABEL: max_ge_v2i64c:
1707; AVX1:       # %bb.0:
1708; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551615,7]
1709; AVX1-NEXT:    retq
1710;
1711; AVX2-LABEL: max_ge_v2i64c:
1712; AVX2:       # %bb.0:
1713; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551615,7]
1714; AVX2-NEXT:    retq
1715;
1716; AVX512-LABEL: max_ge_v2i64c:
1717; AVX512:       # %bb.0:
1718; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm0 = [18446744073709551615,7]
1719; AVX512-NEXT:    retq
1720  %1 = insertelement <2 x i64> <i64 -7, i64 7>, i64 -7, i32 0
1721  %2 = insertelement <2 x i64> <i64 -1, i64 1>, i64 -1, i32 0
1722  %3 = icmp sge <2 x i64> %1, %2
1723  %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1724  ret <2 x i64> %4
1725}
1726
1727define <4 x i64> @max_ge_v4i64c() {
1728; SSE-LABEL: max_ge_v4i64c:
1729; SSE:       # %bb.0:
1730; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,7]
1731; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
1732; SSE-NEXT:    retq
1733;
1734; AVX1-LABEL: max_ge_v4i64c:
1735; AVX1:       # %bb.0:
1736; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1737; AVX1-NEXT:    retq
1738;
1739; AVX2-LABEL: max_ge_v4i64c:
1740; AVX2:       # %bb.0:
1741; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1742; AVX2-NEXT:    retq
1743;
1744; AVX512-LABEL: max_ge_v4i64c:
1745; AVX512:       # %bb.0:
1746; AVX512-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,7,7]
1747; AVX512-NEXT:    retq
1748  %1 = insertelement <4 x i64> <i64 -7, i64 -1, i64 1, i64 7>, i64 -7, i32 0
1749  %2 = insertelement <4 x i64> <i64 -1, i64 -7, i64 7, i64 1>, i64 -1, i32 0
1750  %3 = icmp sge <4 x i64> %1, %2
1751  %4 = select <4 x i1> %3, <4 x i64> %1, <4 x i64> %2
1752  ret <4 x i64> %4
1753}
1754
1755define <4 x i32> @max_ge_v4i32c() {
1756; SSE-LABEL: max_ge_v4i32c:
1757; SSE:       # %bb.0:
1758; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1759; SSE-NEXT:    retq
1760;
1761; AVX1-LABEL: max_ge_v4i32c:
1762; AVX1:       # %bb.0:
1763; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1764; AVX1-NEXT:    retq
1765;
1766; AVX2-LABEL: max_ge_v4i32c:
1767; AVX2:       # %bb.0:
1768; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1769; AVX2-NEXT:    retq
1770;
1771; AVX512-LABEL: max_ge_v4i32c:
1772; AVX512:       # %bb.0:
1773; AVX512-NEXT:    vpmovsxbd {{.*#+}} xmm0 = [4294967295,4294967295,7,7]
1774; AVX512-NEXT:    retq
1775  %1 = insertelement <4 x i32> <i32 -7, i32 -1, i32 1, i32 7>, i32 -7, i32 0
1776  %2 = insertelement <4 x i32> <i32 -1, i32 -7, i32 7, i32 1>, i32 -1, i32 0
1777  %3 = icmp sge <4 x i32> %1, %2
1778  %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1779  ret <4 x i32> %4
1780}
1781
1782define <8 x i32> @max_ge_v8i32c() {
1783; SSE-LABEL: max_ge_v8i32c:
1784; SSE:       # %bb.0:
1785; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,4294967293,4294967293,4294967295]
1786; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,5,5,7]
1787; SSE-NEXT:    retq
1788;
1789; AVX1-LABEL: max_ge_v8i32c:
1790; AVX1:       # %bb.0:
1791; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1792; AVX1-NEXT:    retq
1793;
1794; AVX2-LABEL: max_ge_v8i32c:
1795; AVX2:       # %bb.0:
1796; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1797; AVX2-NEXT:    retq
1798;
1799; AVX512-LABEL: max_ge_v8i32c:
1800; AVX512:       # %bb.0:
1801; AVX512-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [4294967295,4294967293,4294967293,4294967295,7,5,5,7]
1802; AVX512-NEXT:    retq
1803  %1 = insertelement <8 x i32> <i32 -7, i32 -5, i32 -3, i32 -1, i32 1, i32 3, i32 5, i32 7>, i32 -7, i32 0
1804  %2 = insertelement <8 x i32> <i32 -1, i32 -3, i32 -5, i32 -7, i32 7, i32 5, i32 3, i32 1>, i32 -1, i32 0
1805  %3 = icmp sge <8 x i32> %1, %2
1806  %4 = select <8 x i1> %3, <8 x i32> %1, <8 x i32> %2
1807  ret <8 x i32> %4
1808}
1809
1810define <8 x i16> @max_ge_v8i16c() {
1811; SSE-LABEL: max_ge_v8i16c:
1812; SSE:       # %bb.0:
1813; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65535,65533,65533,65535,7,5,5,7]
1814; SSE-NEXT:    retq
1815;
1816; AVX-LABEL: max_ge_v8i16c:
1817; AVX:       # %bb.0:
1818; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [65535,65533,65533,65535,7,5,5,7]
1819; AVX-NEXT:    retq
1820  %1 = insertelement <8 x i16> <i16 -7, i16 -5, i16 -3, i16 -1, i16 1, i16 3, i16 5, i16 7>, i16 -7, i32 0
1821  %2 = insertelement <8 x i16> <i16 -1, i16 -3, i16 -5, i16 -7, i16 7, i16 5, i16 3, i16 1>, i16 -1, i32 0
1822  %3 = icmp sge <8 x i16> %1, %2
1823  %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1824  ret <8 x i16> %4
1825}
1826
1827define <16 x i16> @max_ge_v16i16c() {
1828; SSE-LABEL: max_ge_v16i16c:
1829; SSE:       # %bb.0:
1830; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65535,65534,65533,65532,65533,65534,65535,0]
1831; SSE-NEXT:    movaps {{.*#+}} xmm1 = [7,6,5,4,5,6,7,8]
1832; SSE-NEXT:    retq
1833;
1834; AVX-LABEL: max_ge_v16i16c:
1835; AVX:       # %bb.0:
1836; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [65535,65534,65533,65532,65533,65534,65535,0,7,6,5,4,5,6,7,8]
1837; AVX-NEXT:    retq
1838  %1 = insertelement <16 x i16> <i16 -7, i16 -6, i16 -5, i16 -4, i16 -3, i16 -2, i16 -1, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, i16 -7, i32 0
1839  %2 = insertelement <16 x i16> <i16 -1, i16 -2, i16 -3, i16 -4, i16 -5, i16 -6, i16 -7, i16 0, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1, i16 0>, i16 -1, i32 0
1840  %3 = icmp sge <16 x i16> %1, %2
1841  %4 = select <16 x i1> %3, <16 x i16> %1, <16 x i16> %2
1842  ret <16 x i16> %4
1843}
1844
1845define <16 x i8> @max_ge_v16i8c() {
1846; SSE-LABEL: max_ge_v16i8c:
1847; SSE:       # %bb.0:
1848; SSE-NEXT:    movaps {{.*#+}} xmm0 = [255,254,253,252,253,254,255,0,7,6,5,4,5,6,7,8]
1849; SSE-NEXT:    retq
1850;
1851; AVX-LABEL: max_ge_v16i8c:
1852; AVX:       # %bb.0:
1853; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [255,254,253,252,253,254,255,0,7,6,5,4,5,6,7,8]
1854; AVX-NEXT:    retq
1855  %1 = insertelement <16 x i8> <i8 -7, i8 -6, i8 -5, i8 -4, i8 -3, i8 -2, i8 -1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, i8 -7, i32 0
1856  %2 = insertelement <16 x i8> <i8 -1, i8 -2, i8 -3, i8 -4, i8 -5, i8 -6, i8 -7, i8 0, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, i8 -1, i32 0
1857  %3 = icmp sge <16 x i8> %1, %2
1858  %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1859  ret <16 x i8> %4
1860}
1861
1862define <2 x i64> @min_lt_v2i64c() {
1863; SSE-LABEL: min_lt_v2i64c:
1864; SSE:       # %bb.0:
1865; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551609,1]
1866; SSE-NEXT:    retq
1867;
1868; AVX1-LABEL: min_lt_v2i64c:
1869; AVX1:       # %bb.0:
1870; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551609,1]
1871; AVX1-NEXT:    retq
1872;
1873; AVX2-LABEL: min_lt_v2i64c:
1874; AVX2:       # %bb.0:
1875; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551609,1]
1876; AVX2-NEXT:    retq
1877;
1878; AVX512-LABEL: min_lt_v2i64c:
1879; AVX512:       # %bb.0:
1880; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm0 = [18446744073709551609,1]
1881; AVX512-NEXT:    retq
1882  %1 = insertelement <2 x i64> <i64 -7, i64 7>, i64 -7, i32 0
1883  %2 = insertelement <2 x i64> <i64 -1, i64 1>, i64 -1, i32 0
1884  %3 = icmp slt <2 x i64> %1, %2
1885  %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1886  ret <2 x i64> %4
1887}
1888
1889define <4 x i64> @min_lt_v4i64c() {
1890; SSE-LABEL: min_lt_v4i64c:
1891; SSE:       # %bb.0:
1892; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551609,18446744073709551609]
1893; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,1]
1894; SSE-NEXT:    retq
1895;
1896; AVX1-LABEL: min_lt_v4i64c:
1897; AVX1:       # %bb.0:
1898; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
1899; AVX1-NEXT:    retq
1900;
1901; AVX2-LABEL: min_lt_v4i64c:
1902; AVX2:       # %bb.0:
1903; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
1904; AVX2-NEXT:    retq
1905;
1906; AVX512-LABEL: min_lt_v4i64c:
1907; AVX512:       # %bb.0:
1908; AVX512-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
1909; AVX512-NEXT:    retq
1910  %1 = insertelement <4 x i64> <i64 -7, i64 -1, i64 1, i64 7>, i64 -7, i32 0
1911  %2 = insertelement <4 x i64> <i64 -1, i64 -7, i64 7, i64 1>, i64 -1, i32 0
1912  %3 = icmp slt <4 x i64> %1, %2
1913  %4 = select <4 x i1> %3, <4 x i64> %1, <4 x i64> %2
1914  ret <4 x i64> %4
1915}
1916
1917define <4 x i32> @min_lt_v4i32c() {
1918; SSE-LABEL: min_lt_v4i32c:
1919; SSE:       # %bb.0:
1920; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
1921; SSE-NEXT:    retq
1922;
1923; AVX1-LABEL: min_lt_v4i32c:
1924; AVX1:       # %bb.0:
1925; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
1926; AVX1-NEXT:    retq
1927;
1928; AVX2-LABEL: min_lt_v4i32c:
1929; AVX2:       # %bb.0:
1930; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
1931; AVX2-NEXT:    retq
1932;
1933; AVX512-LABEL: min_lt_v4i32c:
1934; AVX512:       # %bb.0:
1935; AVX512-NEXT:    vpmovsxbd {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
1936; AVX512-NEXT:    retq
1937  %1 = insertelement <4 x i32> <i32 -7, i32 -1, i32 1, i32 7>, i32 -7, i32 0
1938  %2 = insertelement <4 x i32> <i32 -1, i32 -7, i32 7, i32 1>, i32 -1, i32 0
1939  %3 = icmp slt <4 x i32> %1, %2
1940  %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1941  ret <4 x i32> %4
1942}
1943
1944define <8 x i32> @min_lt_v8i32c() {
1945; SSE-LABEL: min_lt_v8i32c:
1946; SSE:       # %bb.0:
1947; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967289,4294967291,4294967291,4294967289]
1948; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,3,3,1]
1949; SSE-NEXT:    retq
1950;
1951; AVX1-LABEL: min_lt_v8i32c:
1952; AVX1:       # %bb.0:
1953; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
1954; AVX1-NEXT:    retq
1955;
1956; AVX2-LABEL: min_lt_v8i32c:
1957; AVX2:       # %bb.0:
1958; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
1959; AVX2-NEXT:    retq
1960;
1961; AVX512-LABEL: min_lt_v8i32c:
1962; AVX512:       # %bb.0:
1963; AVX512-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
1964; AVX512-NEXT:    retq
1965  %1 = insertelement <8 x i32> <i32 -7, i32 -5, i32 -3, i32 -1, i32 1, i32 3, i32 5, i32 7>, i32 -7, i32 0
1966  %2 = insertelement <8 x i32> <i32 -1, i32 -3, i32 -5, i32 -7, i32 7, i32 5, i32 3, i32 1>, i32 -1, i32 0
1967  %3 = icmp slt <8 x i32> %1, %2
1968  %4 = select <8 x i1> %3, <8 x i32> %1, <8 x i32> %2
1969  ret <8 x i32> %4
1970}
1971
1972define <8 x i16> @min_lt_v8i16c() {
1973; SSE-LABEL: min_lt_v8i16c:
1974; SSE:       # %bb.0:
1975; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65529,65531,65531,65529,1,3,3,1]
1976; SSE-NEXT:    retq
1977;
1978; AVX-LABEL: min_lt_v8i16c:
1979; AVX:       # %bb.0:
1980; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [65529,65531,65531,65529,1,3,3,1]
1981; AVX-NEXT:    retq
1982  %1 = insertelement <8 x i16> <i16 -7, i16 -5, i16 -3, i16 -1, i16 1, i16 3, i16 5, i16 7>, i16 -7, i32 0
1983  %2 = insertelement <8 x i16> <i16 -1, i16 -3, i16 -5, i16 -7, i16 7, i16 5, i16 3, i16 1>, i16 -1, i32 0
1984  %3 = icmp slt <8 x i16> %1, %2
1985  %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1986  ret <8 x i16> %4
1987}
1988
1989define <16 x i16> @min_lt_v16i16c() {
1990; SSE-LABEL: min_lt_v16i16c:
1991; SSE:       # %bb.0:
1992; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65529,65530,65531,65532,65531,65530,65529,0]
1993; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,2,3,4,3,2,1,0]
1994; SSE-NEXT:    retq
1995;
1996; AVX-LABEL: min_lt_v16i16c:
1997; AVX:       # %bb.0:
1998; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [65529,65530,65531,65532,65531,65530,65529,0,1,2,3,4,3,2,1,0]
1999; AVX-NEXT:    retq
2000  %1 = insertelement <16 x i16> <i16 -7, i16 -6, i16 -5, i16 -4, i16 -3, i16 -2, i16 -1, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, i16 -7, i32 0
2001  %2 = insertelement <16 x i16> <i16 -1, i16 -2, i16 -3, i16 -4, i16 -5, i16 -6, i16 -7, i16 0, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1, i16 0>, i16 -1, i32 0
2002  %3 = icmp slt <16 x i16> %1, %2
2003  %4 = select <16 x i1> %3, <16 x i16> %1, <16 x i16> %2
2004  ret <16 x i16> %4
2005}
2006
2007define <16 x i8> @min_lt_v16i8c() {
2008; SSE-LABEL: min_lt_v16i8c:
2009; SSE:       # %bb.0:
2010; SSE-NEXT:    movaps {{.*#+}} xmm0 = [249,250,251,252,251,250,249,0,1,2,3,4,3,2,1,0]
2011; SSE-NEXT:    retq
2012;
2013; AVX-LABEL: min_lt_v16i8c:
2014; AVX:       # %bb.0:
2015; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [249,250,251,252,251,250,249,0,1,2,3,4,3,2,1,0]
2016; AVX-NEXT:    retq
2017  %1 = insertelement <16 x i8> <i8 -7, i8 -6, i8 -5, i8 -4, i8 -3, i8 -2, i8 -1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, i8 -7, i32 0
2018  %2 = insertelement <16 x i8> <i8 -1, i8 -2, i8 -3, i8 -4, i8 -5, i8 -6, i8 -7, i8 0, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, i8 -1, i32 0
2019  %3 = icmp slt <16 x i8> %1, %2
2020  %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
2021  ret <16 x i8> %4
2022}
2023
2024define <2 x i64> @min_le_v2i64c() {
2025; SSE-LABEL: min_le_v2i64c:
2026; SSE:       # %bb.0:
2027; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551609,1]
2028; SSE-NEXT:    retq
2029;
2030; AVX1-LABEL: min_le_v2i64c:
2031; AVX1:       # %bb.0:
2032; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551609,1]
2033; AVX1-NEXT:    retq
2034;
2035; AVX2-LABEL: min_le_v2i64c:
2036; AVX2:       # %bb.0:
2037; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [18446744073709551609,1]
2038; AVX2-NEXT:    retq
2039;
2040; AVX512-LABEL: min_le_v2i64c:
2041; AVX512:       # %bb.0:
2042; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm0 = [18446744073709551609,1]
2043; AVX512-NEXT:    retq
2044  %1 = insertelement <2 x i64> <i64 -7, i64 7>, i64 -7, i32 0
2045  %2 = insertelement <2 x i64> <i64 -1, i64 1>, i64 -1, i32 0
2046  %3 = icmp sle <2 x i64> %1, %2
2047  %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
2048  ret <2 x i64> %4
2049}
2050
2051define <4 x i64> @min_le_v4i64c() {
2052; SSE-LABEL: min_le_v4i64c:
2053; SSE:       # %bb.0:
2054; SSE-NEXT:    movaps {{.*#+}} xmm0 = [18446744073709551609,18446744073709551609]
2055; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,1]
2056; SSE-NEXT:    retq
2057;
2058; AVX1-LABEL: min_le_v4i64c:
2059; AVX1:       # %bb.0:
2060; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
2061; AVX1-NEXT:    retq
2062;
2063; AVX2-LABEL: min_le_v4i64c:
2064; AVX2:       # %bb.0:
2065; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
2066; AVX2-NEXT:    retq
2067;
2068; AVX512-LABEL: min_le_v4i64c:
2069; AVX512:       # %bb.0:
2070; AVX512-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [18446744073709551609,18446744073709551609,1,1]
2071; AVX512-NEXT:    retq
2072  %1 = insertelement <4 x i64> <i64 -7, i64 -1, i64 1, i64 7>, i64 -7, i32 0
2073  %2 = insertelement <4 x i64> <i64 -1, i64 -7, i64 7, i64 1>, i64 -1, i32 0
2074  %3 = icmp sle <4 x i64> %1, %2
2075  %4 = select <4 x i1> %3, <4 x i64> %1, <4 x i64> %2
2076  ret <4 x i64> %4
2077}
2078
2079define <4 x i32> @min_le_v4i32c() {
2080; SSE-LABEL: min_le_v4i32c:
2081; SSE:       # %bb.0:
2082; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
2083; SSE-NEXT:    retq
2084;
2085; AVX1-LABEL: min_le_v4i32c:
2086; AVX1:       # %bb.0:
2087; AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
2088; AVX1-NEXT:    retq
2089;
2090; AVX2-LABEL: min_le_v4i32c:
2091; AVX2:       # %bb.0:
2092; AVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
2093; AVX2-NEXT:    retq
2094;
2095; AVX512-LABEL: min_le_v4i32c:
2096; AVX512:       # %bb.0:
2097; AVX512-NEXT:    vpmovsxbd {{.*#+}} xmm0 = [4294967289,4294967289,1,1]
2098; AVX512-NEXT:    retq
2099  %1 = insertelement <4 x i32> <i32 -7, i32 -1, i32 1, i32 7>, i32 -7, i32 0
2100  %2 = insertelement <4 x i32> <i32 -1, i32 -7, i32 7, i32 1>, i32 -1, i32 0
2101  %3 = icmp sle <4 x i32> %1, %2
2102  %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
2103  ret <4 x i32> %4
2104}
2105
2106define <8 x i32> @min_le_v8i32c() {
2107; SSE-LABEL: min_le_v8i32c:
2108; SSE:       # %bb.0:
2109; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967289,4294967291,4294967291,4294967289]
2110; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,3,3,1]
2111; SSE-NEXT:    retq
2112;
2113; AVX1-LABEL: min_le_v8i32c:
2114; AVX1:       # %bb.0:
2115; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
2116; AVX1-NEXT:    retq
2117;
2118; AVX2-LABEL: min_le_v8i32c:
2119; AVX2:       # %bb.0:
2120; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
2121; AVX2-NEXT:    retq
2122;
2123; AVX512-LABEL: min_le_v8i32c:
2124; AVX512:       # %bb.0:
2125; AVX512-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [4294967289,4294967291,4294967291,4294967289,1,3,3,1]
2126; AVX512-NEXT:    retq
2127  %1 = insertelement <8 x i32> <i32 -7, i32 -5, i32 -3, i32 -1, i32 1, i32 3, i32 5, i32 7>, i32 -7, i32 0
2128  %2 = insertelement <8 x i32> <i32 -1, i32 -3, i32 -5, i32 -7, i32 7, i32 5, i32 3, i32 1>, i32 -1, i32 0
2129  %3 = icmp sle <8 x i32> %1, %2
2130  %4 = select <8 x i1> %3, <8 x i32> %1, <8 x i32> %2
2131  ret <8 x i32> %4
2132}
2133
2134define <8 x i16> @min_le_v8i16c() {
2135; SSE-LABEL: min_le_v8i16c:
2136; SSE:       # %bb.0:
2137; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65529,65531,65531,65529,1,3,3,1]
2138; SSE-NEXT:    retq
2139;
2140; AVX-LABEL: min_le_v8i16c:
2141; AVX:       # %bb.0:
2142; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [65529,65531,65531,65529,1,3,3,1]
2143; AVX-NEXT:    retq
2144  %1 = insertelement <8 x i16> <i16 -7, i16 -5, i16 -3, i16 -1, i16 1, i16 3, i16 5, i16 7>, i16 -7, i32 0
2145  %2 = insertelement <8 x i16> <i16 -1, i16 -3, i16 -5, i16 -7, i16 7, i16 5, i16 3, i16 1>, i16 -1, i32 0
2146  %3 = icmp sle <8 x i16> %1, %2
2147  %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
2148  ret <8 x i16> %4
2149}
2150
2151define <16 x i16> @min_le_v16i16c() {
2152; SSE-LABEL: min_le_v16i16c:
2153; SSE:       # %bb.0:
2154; SSE-NEXT:    movaps {{.*#+}} xmm0 = [65529,65530,65531,65532,65531,65530,65529,0]
2155; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1,2,3,4,3,2,1,0]
2156; SSE-NEXT:    retq
2157;
2158; AVX-LABEL: min_le_v16i16c:
2159; AVX:       # %bb.0:
2160; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [65529,65530,65531,65532,65531,65530,65529,0,1,2,3,4,3,2,1,0]
2161; AVX-NEXT:    retq
2162  %1 = insertelement <16 x i16> <i16 -7, i16 -6, i16 -5, i16 -4, i16 -3, i16 -2, i16 -1, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, i16 -7, i32 0
2163  %2 = insertelement <16 x i16> <i16 -1, i16 -2, i16 -3, i16 -4, i16 -5, i16 -6, i16 -7, i16 0, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1, i16 0>, i16 -1, i32 0
2164  %3 = icmp sle <16 x i16> %1, %2
2165  %4 = select <16 x i1> %3, <16 x i16> %1, <16 x i16> %2
2166  ret <16 x i16> %4
2167}
2168
2169define <16 x i8> @min_le_v16i8c() {
2170; SSE-LABEL: min_le_v16i8c:
2171; SSE:       # %bb.0:
2172; SSE-NEXT:    movaps {{.*#+}} xmm0 = [249,250,251,252,251,250,249,0,1,2,3,4,3,2,1,0]
2173; SSE-NEXT:    retq
2174;
2175; AVX-LABEL: min_le_v16i8c:
2176; AVX:       # %bb.0:
2177; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [249,250,251,252,251,250,249,0,1,2,3,4,3,2,1,0]
2178; AVX-NEXT:    retq
2179  %1 = insertelement <16 x i8> <i8 -7, i8 -6, i8 -5, i8 -4, i8 -3, i8 -2, i8 -1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, i8 -7, i32 0
2180  %2 = insertelement <16 x i8> <i8 -1, i8 -2, i8 -3, i8 -4, i8 -5, i8 -6, i8 -7, i8 0, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, i8 -1, i32 0
2181  %3 = icmp sle <16 x i8> %1, %2
2182  %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
2183  ret <16 x i8> %4
2184}
2185