• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=sse2 -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=SSE
3; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx2 -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
4; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx512vl,avx512bw -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
5
6; Verify that 128-bit vector logical ops are reassociated.
7
8define <4 x i32> @reassociate_and_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
9; SSE-LABEL: reassociate_and_v4i32:
10; SSE:       # %bb.0:
11; SSE-NEXT:    paddd %xmm1, %xmm0
12; SSE-NEXT:    pand %xmm3, %xmm2
13; SSE-NEXT:    pand %xmm2, %xmm0
14; SSE-NEXT:    retq
15;
16; AVX2-LABEL: reassociate_and_v4i32:
17; AVX2:       # %bb.0:
18; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
19; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm1
20; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
21; AVX2-NEXT:    retq
22;
23; AVX512-LABEL: reassociate_and_v4i32:
24; AVX512:       # %bb.0:
25; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
26; AVX512-NEXT:    vpternlogd $128, %xmm2, %xmm3, %xmm0
27; AVX512-NEXT:    retq
28
29  %t0 = add <4 x i32> %x0, %x1
30  %t1 = and <4 x i32> %x2, %t0
31  %t2 = and <4 x i32> %x3, %t1
32  ret <4 x i32> %t2
33}
34
35define <4 x i32> @reassociate_or_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
36; SSE-LABEL: reassociate_or_v4i32:
37; SSE:       # %bb.0:
38; SSE-NEXT:    paddd %xmm1, %xmm0
39; SSE-NEXT:    por %xmm3, %xmm2
40; SSE-NEXT:    por %xmm2, %xmm0
41; SSE-NEXT:    retq
42;
43; AVX2-LABEL: reassociate_or_v4i32:
44; AVX2:       # %bb.0:
45; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
46; AVX2-NEXT:    vpor %xmm3, %xmm2, %xmm1
47; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
48; AVX2-NEXT:    retq
49;
50; AVX512-LABEL: reassociate_or_v4i32:
51; AVX512:       # %bb.0:
52; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
53; AVX512-NEXT:    vpternlogd $254, %xmm2, %xmm3, %xmm0
54; AVX512-NEXT:    retq
55
56  %t0 = add <4 x i32> %x0, %x1
57  %t1 = or <4 x i32> %x2, %t0
58  %t2 = or <4 x i32> %x3, %t1
59  ret <4 x i32> %t2
60}
61
62define <4 x i32> @reassociate_xor_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
63; SSE-LABEL: reassociate_xor_v4i32:
64; SSE:       # %bb.0:
65; SSE-NEXT:    paddd %xmm1, %xmm0
66; SSE-NEXT:    pxor %xmm3, %xmm2
67; SSE-NEXT:    pxor %xmm2, %xmm0
68; SSE-NEXT:    retq
69;
70; AVX2-LABEL: reassociate_xor_v4i32:
71; AVX2:       # %bb.0:
72; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
73; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm1
74; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
75; AVX2-NEXT:    retq
76;
77; AVX512-LABEL: reassociate_xor_v4i32:
78; AVX512:       # %bb.0:
79; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
80; AVX512-NEXT:    vpternlogd $150, %xmm2, %xmm3, %xmm0
81; AVX512-NEXT:    retq
82
83  %t0 = add <4 x i32> %x0, %x1
84  %t1 = xor <4 x i32> %x2, %t0
85  %t2 = xor <4 x i32> %x3, %t1
86  ret <4 x i32> %t2
87}
88
89; Verify that 256-bit vector logical ops are reassociated.
90
91define <8 x i32> @reassociate_and_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
92; SSE-LABEL: reassociate_and_v8i32:
93; SSE:       # %bb.0:
94; SSE-NEXT:    paddd %xmm2, %xmm0
95; SSE-NEXT:    pand %xmm6, %xmm4
96; SSE-NEXT:    pand %xmm4, %xmm0
97; SSE-NEXT:    paddd %xmm3, %xmm1
98; SSE-NEXT:    pand %xmm7, %xmm5
99; SSE-NEXT:    pand %xmm5, %xmm1
100; SSE-NEXT:    retq
101;
102; AVX2-LABEL: reassociate_and_v8i32:
103; AVX2:       # %bb.0:
104; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
105; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm1
106; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
107; AVX2-NEXT:    retq
108;
109; AVX512-LABEL: reassociate_and_v8i32:
110; AVX512:       # %bb.0:
111; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
112; AVX512-NEXT:    vpternlogd $128, %ymm2, %ymm3, %ymm0
113; AVX512-NEXT:    retq
114
115  %t0 = add <8 x i32> %x0, %x1
116  %t1 = and <8 x i32> %x2, %t0
117  %t2 = and <8 x i32> %x3, %t1
118  ret <8 x i32> %t2
119}
120
121define <8 x i32> @reassociate_or_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
122; SSE-LABEL: reassociate_or_v8i32:
123; SSE:       # %bb.0:
124; SSE-NEXT:    paddd %xmm2, %xmm0
125; SSE-NEXT:    por %xmm6, %xmm4
126; SSE-NEXT:    por %xmm4, %xmm0
127; SSE-NEXT:    paddd %xmm3, %xmm1
128; SSE-NEXT:    por %xmm7, %xmm5
129; SSE-NEXT:    por %xmm5, %xmm1
130; SSE-NEXT:    retq
131;
132; AVX2-LABEL: reassociate_or_v8i32:
133; AVX2:       # %bb.0:
134; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
135; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm1
136; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
137; AVX2-NEXT:    retq
138;
139; AVX512-LABEL: reassociate_or_v8i32:
140; AVX512:       # %bb.0:
141; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
142; AVX512-NEXT:    vpternlogd $254, %ymm2, %ymm3, %ymm0
143; AVX512-NEXT:    retq
144
145  %t0 = add <8 x i32> %x0, %x1
146  %t1 = or <8 x i32> %x2, %t0
147  %t2 = or <8 x i32> %x3, %t1
148  ret <8 x i32> %t2
149}
150
151define <8 x i32> @reassociate_xor_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
152; SSE-LABEL: reassociate_xor_v8i32:
153; SSE:       # %bb.0:
154; SSE-NEXT:    paddd %xmm2, %xmm0
155; SSE-NEXT:    pxor %xmm6, %xmm4
156; SSE-NEXT:    pxor %xmm4, %xmm0
157; SSE-NEXT:    paddd %xmm3, %xmm1
158; SSE-NEXT:    pxor %xmm7, %xmm5
159; SSE-NEXT:    pxor %xmm5, %xmm1
160; SSE-NEXT:    retq
161;
162; AVX2-LABEL: reassociate_xor_v8i32:
163; AVX2:       # %bb.0:
164; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
165; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm1
166; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
167; AVX2-NEXT:    retq
168;
169; AVX512-LABEL: reassociate_xor_v8i32:
170; AVX512:       # %bb.0:
171; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
172; AVX512-NEXT:    vpternlogd $150, %ymm2, %ymm3, %ymm0
173; AVX512-NEXT:    retq
174
175  %t0 = add <8 x i32> %x0, %x1
176  %t1 = xor <8 x i32> %x2, %t0
177  %t2 = xor <8 x i32> %x3, %t1
178  ret <8 x i32> %t2
179}
180
181
182; Verify that 512-bit vector logical ops are reassociated.
183
184define <16 x i32> @reassociate_and_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
185; SSE-LABEL: reassociate_and_v16i32:
186; SSE:       # %bb.0:
187; SSE-NEXT:    paddd %xmm4, %xmm0
188; SSE-NEXT:    paddd %xmm5, %xmm1
189; SSE-NEXT:    paddd %xmm6, %xmm2
190; SSE-NEXT:    paddd %xmm7, %xmm3
191; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm3
192; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm2
193; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm1
194; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm0
195; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm0
196; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm1
197; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm2
198; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm3
199; SSE-NEXT:    retq
200;
201; AVX2-LABEL: reassociate_and_v16i32:
202; AVX2:       # %bb.0:
203; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
204; AVX2-NEXT:    vpand %ymm6, %ymm4, %ymm2
205; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
206; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
207; AVX2-NEXT:    vpand %ymm7, %ymm5, %ymm2
208; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
209; AVX2-NEXT:    retq
210;
211; AVX512-LABEL: reassociate_and_v16i32:
212; AVX512:       # %bb.0:
213; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
214; AVX512-NEXT:    vpternlogd $128, %zmm2, %zmm3, %zmm0
215; AVX512-NEXT:    retq
216
217  %t0 = add <16 x i32> %x0, %x1
218  %t1 = and <16 x i32> %x2, %t0
219  %t2 = and <16 x i32> %x3, %t1
220  ret <16 x i32> %t2
221}
222
223define <16 x i32> @reassociate_or_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
224; SSE-LABEL: reassociate_or_v16i32:
225; SSE:       # %bb.0:
226; SSE-NEXT:    paddd %xmm4, %xmm0
227; SSE-NEXT:    paddd %xmm5, %xmm1
228; SSE-NEXT:    paddd %xmm6, %xmm2
229; SSE-NEXT:    paddd %xmm7, %xmm3
230; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm3
231; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm2
232; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm1
233; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm0
234; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm0
235; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm1
236; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm2
237; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm3
238; SSE-NEXT:    retq
239;
240; AVX2-LABEL: reassociate_or_v16i32:
241; AVX2:       # %bb.0:
242; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
243; AVX2-NEXT:    vpor %ymm6, %ymm4, %ymm2
244; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
245; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
246; AVX2-NEXT:    vpor %ymm7, %ymm5, %ymm2
247; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
248; AVX2-NEXT:    retq
249;
250; AVX512-LABEL: reassociate_or_v16i32:
251; AVX512:       # %bb.0:
252; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
253; AVX512-NEXT:    vpternlogd $254, %zmm2, %zmm3, %zmm0
254; AVX512-NEXT:    retq
255
256  %t0 = add <16 x i32> %x0, %x1
257  %t1 = or <16 x i32> %x2, %t0
258  %t2 = or <16 x i32> %x3, %t1
259  ret <16 x i32> %t2
260}
261
262define <16 x i32> @reassociate_xor_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
263; SSE-LABEL: reassociate_xor_v16i32:
264; SSE:       # %bb.0:
265; SSE-NEXT:    paddd %xmm4, %xmm0
266; SSE-NEXT:    paddd %xmm5, %xmm1
267; SSE-NEXT:    paddd %xmm6, %xmm2
268; SSE-NEXT:    paddd %xmm7, %xmm3
269; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm3
270; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm2
271; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm1
272; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm0
273; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm0
274; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm1
275; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm2
276; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm3
277; SSE-NEXT:    retq
278;
279; AVX2-LABEL: reassociate_xor_v16i32:
280; AVX2:       # %bb.0:
281; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
282; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm2
283; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
284; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
285; AVX2-NEXT:    vpxor %ymm7, %ymm5, %ymm2
286; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
287; AVX2-NEXT:    retq
288;
289; AVX512-LABEL: reassociate_xor_v16i32:
290; AVX512:       # %bb.0:
291; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
292; AVX512-NEXT:    vpternlogd $150, %zmm2, %zmm3, %zmm0
293; AVX512-NEXT:    retq
294
295  %t0 = add <16 x i32> %x0, %x1
296  %t1 = xor <16 x i32> %x2, %t0
297  %t2 = xor <16 x i32> %x3, %t1
298  ret <16 x i32> %t2
299}
300
301; Verify that 128-bit vector min/max are reassociated.
302
303define <16 x i8> @reassociate_umax_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) {
304; SSE-LABEL: reassociate_umax_v16i8:
305; SSE:       # %bb.0:
306; SSE-NEXT:    paddb %xmm1, %xmm0
307; SSE-NEXT:    pmaxub %xmm3, %xmm2
308; SSE-NEXT:    pmaxub %xmm2, %xmm0
309; SSE-NEXT:    retq
310;
311; AVX-LABEL: reassociate_umax_v16i8:
312; AVX:       # %bb.0:
313; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
314; AVX-NEXT:    vpmaxub %xmm3, %xmm2, %xmm1
315; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
316; AVX-NEXT:    retq
317
318  %t0 = add <16 x i8> %x0, %x1
319  %t1 = icmp ugt <16 x i8> %x2, %t0
320  %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0
321  %t3 = icmp ugt <16 x i8> %x3, %t2
322  %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2
323  ret <16 x i8> %t4
324}
325
326define <8 x i16> @reassociate_umax_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) {
327; SSE-LABEL: reassociate_umax_v8i16:
328; SSE:       # %bb.0:
329; SSE-NEXT:    paddw %xmm1, %xmm0
330; SSE-NEXT:    psubusw %xmm2, %xmm0
331; SSE-NEXT:    paddw %xmm2, %xmm0
332; SSE-NEXT:    psubusw %xmm3, %xmm0
333; SSE-NEXT:    paddw %xmm3, %xmm0
334; SSE-NEXT:    retq
335;
336; AVX-LABEL: reassociate_umax_v8i16:
337; AVX:       # %bb.0:
338; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
339; AVX-NEXT:    vpmaxuw %xmm3, %xmm2, %xmm1
340; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
341; AVX-NEXT:    retq
342
343  %t0 = add <8 x i16> %x0, %x1
344  %t1 = icmp ugt <8 x i16> %x2, %t0
345  %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0
346  %t3 = icmp ugt <8 x i16> %x3, %t2
347  %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2
348  ret <8 x i16> %t4
349}
350
351define <4 x i32> @reassociate_umax_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
352; SSE-LABEL: reassociate_umax_v4i32:
353; SSE:       # %bb.0:
354; SSE-NEXT:    paddd %xmm1, %xmm0
355; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
356; SSE-NEXT:    movdqa %xmm2, %xmm4
357; SSE-NEXT:    pxor %xmm1, %xmm4
358; SSE-NEXT:    movdqa %xmm0, %xmm5
359; SSE-NEXT:    pxor %xmm1, %xmm5
360; SSE-NEXT:    pcmpgtd %xmm5, %xmm4
361; SSE-NEXT:    pand %xmm4, %xmm2
362; SSE-NEXT:    pandn %xmm0, %xmm4
363; SSE-NEXT:    por %xmm2, %xmm4
364; SSE-NEXT:    movdqa %xmm4, %xmm0
365; SSE-NEXT:    pxor %xmm1, %xmm0
366; SSE-NEXT:    pxor %xmm3, %xmm1
367; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
368; SSE-NEXT:    pand %xmm1, %xmm3
369; SSE-NEXT:    pandn %xmm4, %xmm1
370; SSE-NEXT:    por %xmm3, %xmm1
371; SSE-NEXT:    movdqa %xmm1, %xmm0
372; SSE-NEXT:    retq
373;
374; AVX-LABEL: reassociate_umax_v4i32:
375; AVX:       # %bb.0:
376; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
377; AVX-NEXT:    vpmaxud %xmm3, %xmm2, %xmm1
378; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
379; AVX-NEXT:    retq
380
381  %t0 = add <4 x i32> %x0, %x1
382  %t1 = icmp ugt <4 x i32> %x2, %t0
383  %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0
384  %t3 = icmp ugt <4 x i32> %x3, %t2
385  %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2
386  ret <4 x i32> %t4
387}
388
389define <2 x i64> @reassociate_umax_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) {
390; SSE-LABEL: reassociate_umax_v2i64:
391; SSE:       # %bb.0:
392; SSE-NEXT:    paddq %xmm1, %xmm0
393; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
394; SSE-NEXT:    movdqa %xmm2, %xmm4
395; SSE-NEXT:    pxor %xmm1, %xmm4
396; SSE-NEXT:    movdqa %xmm0, %xmm5
397; SSE-NEXT:    pxor %xmm1, %xmm5
398; SSE-NEXT:    movdqa %xmm4, %xmm6
399; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
400; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
401; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
402; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
403; SSE-NEXT:    pand %xmm7, %xmm4
404; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
405; SSE-NEXT:    por %xmm4, %xmm5
406; SSE-NEXT:    pand %xmm5, %xmm2
407; SSE-NEXT:    pandn %xmm0, %xmm5
408; SSE-NEXT:    por %xmm2, %xmm5
409; SSE-NEXT:    movdqa %xmm5, %xmm0
410; SSE-NEXT:    pxor %xmm1, %xmm0
411; SSE-NEXT:    pxor %xmm3, %xmm1
412; SSE-NEXT:    movdqa %xmm1, %xmm2
413; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
414; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
415; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
416; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
417; SSE-NEXT:    pand %xmm4, %xmm1
418; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
419; SSE-NEXT:    por %xmm1, %xmm0
420; SSE-NEXT:    pand %xmm0, %xmm3
421; SSE-NEXT:    pandn %xmm5, %xmm0
422; SSE-NEXT:    por %xmm3, %xmm0
423; SSE-NEXT:    retq
424;
425; AVX2-LABEL: reassociate_umax_v2i64:
426; AVX2:       # %bb.0:
427; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
428; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
429; AVX2-NEXT:    vpxor %xmm1, %xmm2, %xmm4
430; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm5
431; AVX2-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm4
432; AVX2-NEXT:    vblendvpd %xmm4, %xmm2, %xmm0, %xmm0
433; AVX2-NEXT:    vxorpd %xmm1, %xmm0, %xmm2
434; AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm1
435; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
436; AVX2-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
437; AVX2-NEXT:    retq
438;
439; AVX512-LABEL: reassociate_umax_v2i64:
440; AVX512:       # %bb.0:
441; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
442; AVX512-NEXT:    vpmaxuq %xmm3, %xmm2, %xmm1
443; AVX512-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
444; AVX512-NEXT:    retq
445
446  %t0 = add <2 x i64> %x0, %x1
447  %t1 = icmp ugt <2 x i64> %x2, %t0
448  %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0
449  %t3 = icmp ugt <2 x i64> %x3, %t2
450  %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2
451  ret <2 x i64> %t4
452}
453
454define <16 x i8> @reassociate_smax_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) {
455; SSE-LABEL: reassociate_smax_v16i8:
456; SSE:       # %bb.0:
457; SSE-NEXT:    paddb %xmm1, %xmm0
458; SSE-NEXT:    movdqa %xmm2, %xmm1
459; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
460; SSE-NEXT:    pand %xmm1, %xmm2
461; SSE-NEXT:    pandn %xmm0, %xmm1
462; SSE-NEXT:    por %xmm2, %xmm1
463; SSE-NEXT:    movdqa %xmm3, %xmm0
464; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
465; SSE-NEXT:    pand %xmm0, %xmm3
466; SSE-NEXT:    pandn %xmm1, %xmm0
467; SSE-NEXT:    por %xmm3, %xmm0
468; SSE-NEXT:    retq
469;
470; AVX-LABEL: reassociate_smax_v16i8:
471; AVX:       # %bb.0:
472; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
473; AVX-NEXT:    vpmaxsb %xmm3, %xmm2, %xmm1
474; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
475; AVX-NEXT:    retq
476
477  %t0 = add <16 x i8> %x0, %x1
478  %t1 = icmp sgt <16 x i8> %x2, %t0
479  %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0
480  %t3 = icmp sgt <16 x i8> %x3, %t2
481  %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2
482  ret <16 x i8> %t4
483}
484
485define <8 x i16> @reassociate_smax_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) {
486; SSE-LABEL: reassociate_smax_v8i16:
487; SSE:       # %bb.0:
488; SSE-NEXT:    paddw %xmm1, %xmm0
489; SSE-NEXT:    pmaxsw %xmm3, %xmm2
490; SSE-NEXT:    pmaxsw %xmm2, %xmm0
491; SSE-NEXT:    retq
492;
493; AVX-LABEL: reassociate_smax_v8i16:
494; AVX:       # %bb.0:
495; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
496; AVX-NEXT:    vpmaxsw %xmm3, %xmm2, %xmm1
497; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
498; AVX-NEXT:    retq
499
500  %t0 = add <8 x i16> %x0, %x1
501  %t1 = icmp sgt <8 x i16> %x2, %t0
502  %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0
503  %t3 = icmp sgt <8 x i16> %x3, %t2
504  %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2
505  ret <8 x i16> %t4
506}
507
508define <4 x i32> @reassociate_smax_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
509; SSE-LABEL: reassociate_smax_v4i32:
510; SSE:       # %bb.0:
511; SSE-NEXT:    paddd %xmm1, %xmm0
512; SSE-NEXT:    movdqa %xmm2, %xmm1
513; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
514; SSE-NEXT:    pand %xmm1, %xmm2
515; SSE-NEXT:    pandn %xmm0, %xmm1
516; SSE-NEXT:    por %xmm2, %xmm1
517; SSE-NEXT:    movdqa %xmm3, %xmm0
518; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
519; SSE-NEXT:    pand %xmm0, %xmm3
520; SSE-NEXT:    pandn %xmm1, %xmm0
521; SSE-NEXT:    por %xmm3, %xmm0
522; SSE-NEXT:    retq
523;
524; AVX-LABEL: reassociate_smax_v4i32:
525; AVX:       # %bb.0:
526; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
527; AVX-NEXT:    vpmaxsd %xmm3, %xmm2, %xmm1
528; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
529; AVX-NEXT:    retq
530
531  %t0 = add <4 x i32> %x0, %x1
532  %t1 = icmp sgt <4 x i32> %x2, %t0
533  %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0
534  %t3 = icmp sgt <4 x i32> %x3, %t2
535  %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2
536  ret <4 x i32> %t4
537}
538
539define <2 x i64> @reassociate_smax_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) {
540; SSE-LABEL: reassociate_smax_v2i64:
541; SSE:       # %bb.0:
542; SSE-NEXT:    paddq %xmm1, %xmm0
543; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
544; SSE-NEXT:    movdqa %xmm2, %xmm4
545; SSE-NEXT:    pxor %xmm1, %xmm4
546; SSE-NEXT:    movdqa %xmm0, %xmm5
547; SSE-NEXT:    pxor %xmm1, %xmm5
548; SSE-NEXT:    movdqa %xmm4, %xmm6
549; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
550; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
551; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
552; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
553; SSE-NEXT:    pand %xmm7, %xmm4
554; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
555; SSE-NEXT:    por %xmm4, %xmm5
556; SSE-NEXT:    pand %xmm5, %xmm2
557; SSE-NEXT:    pandn %xmm0, %xmm5
558; SSE-NEXT:    por %xmm2, %xmm5
559; SSE-NEXT:    movdqa %xmm5, %xmm0
560; SSE-NEXT:    pxor %xmm1, %xmm0
561; SSE-NEXT:    pxor %xmm3, %xmm1
562; SSE-NEXT:    movdqa %xmm1, %xmm2
563; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
564; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
565; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
566; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
567; SSE-NEXT:    pand %xmm4, %xmm1
568; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
569; SSE-NEXT:    por %xmm1, %xmm0
570; SSE-NEXT:    pand %xmm0, %xmm3
571; SSE-NEXT:    pandn %xmm5, %xmm0
572; SSE-NEXT:    por %xmm3, %xmm0
573; SSE-NEXT:    retq
574;
575; AVX2-LABEL: reassociate_smax_v2i64:
576; AVX2:       # %bb.0:
577; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
578; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
579; AVX2-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
580; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm1
581; AVX2-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
582; AVX2-NEXT:    retq
583;
584; AVX512-LABEL: reassociate_smax_v2i64:
585; AVX512:       # %bb.0:
586; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
587; AVX512-NEXT:    vpmaxsq %xmm3, %xmm2, %xmm1
588; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
589; AVX512-NEXT:    retq
590
591  %t0 = add <2 x i64> %x0, %x1
592  %t1 = icmp sgt <2 x i64> %x2, %t0
593  %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0
594  %t3 = icmp sgt <2 x i64> %x3, %t2
595  %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2
596  ret <2 x i64> %t4
597}
598
599define <16 x i8> @reassociate_umin_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) {
600; SSE-LABEL: reassociate_umin_v16i8:
601; SSE:       # %bb.0:
602; SSE-NEXT:    paddb %xmm1, %xmm0
603; SSE-NEXT:    pminub %xmm3, %xmm2
604; SSE-NEXT:    pminub %xmm2, %xmm0
605; SSE-NEXT:    retq
606;
607; AVX-LABEL: reassociate_umin_v16i8:
608; AVX:       # %bb.0:
609; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
610; AVX-NEXT:    vpminub %xmm3, %xmm2, %xmm1
611; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
612; AVX-NEXT:    retq
613
614  %t0 = add <16 x i8> %x0, %x1
615  %t1 = icmp ult <16 x i8> %x2, %t0
616  %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0
617  %t3 = icmp ult <16 x i8> %x3, %t2
618  %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2
619  ret <16 x i8> %t4
620}
621
622define <8 x i16> @reassociate_umin_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) {
623; SSE-LABEL: reassociate_umin_v8i16:
624; SSE:       # %bb.0:
625; SSE-NEXT:    paddw %xmm1, %xmm0
626; SSE-NEXT:    movdqa %xmm2, %xmm1
627; SSE-NEXT:    psubusw %xmm0, %xmm1
628; SSE-NEXT:    psubw %xmm1, %xmm2
629; SSE-NEXT:    movdqa %xmm3, %xmm0
630; SSE-NEXT:    psubusw %xmm2, %xmm0
631; SSE-NEXT:    psubw %xmm0, %xmm3
632; SSE-NEXT:    movdqa %xmm3, %xmm0
633; SSE-NEXT:    retq
634;
635; AVX-LABEL: reassociate_umin_v8i16:
636; AVX:       # %bb.0:
637; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
638; AVX-NEXT:    vpminuw %xmm3, %xmm2, %xmm1
639; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
640; AVX-NEXT:    retq
641
642  %t0 = add <8 x i16> %x0, %x1
643  %t1 = icmp ult <8 x i16> %x2, %t0
644  %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0
645  %t3 = icmp ult <8 x i16> %x3, %t2
646  %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2
647  ret <8 x i16> %t4
648}
649
650define <4 x i32> @reassociate_umin_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
651; SSE-LABEL: reassociate_umin_v4i32:
652; SSE:       # %bb.0:
653; SSE-NEXT:    paddd %xmm1, %xmm0
654; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
655; SSE-NEXT:    movdqa %xmm2, %xmm4
656; SSE-NEXT:    pxor %xmm1, %xmm4
657; SSE-NEXT:    movdqa %xmm0, %xmm5
658; SSE-NEXT:    pxor %xmm1, %xmm5
659; SSE-NEXT:    pcmpgtd %xmm4, %xmm5
660; SSE-NEXT:    pand %xmm5, %xmm2
661; SSE-NEXT:    pandn %xmm0, %xmm5
662; SSE-NEXT:    por %xmm2, %xmm5
663; SSE-NEXT:    movdqa %xmm5, %xmm0
664; SSE-NEXT:    pxor %xmm1, %xmm0
665; SSE-NEXT:    pxor %xmm3, %xmm1
666; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
667; SSE-NEXT:    pand %xmm0, %xmm3
668; SSE-NEXT:    pandn %xmm5, %xmm0
669; SSE-NEXT:    por %xmm3, %xmm0
670; SSE-NEXT:    retq
671;
672; AVX-LABEL: reassociate_umin_v4i32:
673; AVX:       # %bb.0:
674; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
675; AVX-NEXT:    vpminud %xmm3, %xmm2, %xmm1
676; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
677; AVX-NEXT:    retq
678
679  %t0 = add <4 x i32> %x0, %x1
680  %t1 = icmp ult <4 x i32> %x2, %t0
681  %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0
682  %t3 = icmp ult <4 x i32> %x3, %t2
683  %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2
684  ret <4 x i32> %t4
685}
686
687define <2 x i64> @reassociate_umin_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) {
688; SSE-LABEL: reassociate_umin_v2i64:
689; SSE:       # %bb.0:
690; SSE-NEXT:    paddq %xmm1, %xmm0
691; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
692; SSE-NEXT:    movdqa %xmm2, %xmm4
693; SSE-NEXT:    pxor %xmm1, %xmm4
694; SSE-NEXT:    movdqa %xmm0, %xmm5
695; SSE-NEXT:    pxor %xmm1, %xmm5
696; SSE-NEXT:    movdqa %xmm5, %xmm6
697; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
698; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
699; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
700; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
701; SSE-NEXT:    pand %xmm7, %xmm4
702; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
703; SSE-NEXT:    por %xmm4, %xmm5
704; SSE-NEXT:    pand %xmm5, %xmm2
705; SSE-NEXT:    pandn %xmm0, %xmm5
706; SSE-NEXT:    por %xmm2, %xmm5
707; SSE-NEXT:    movdqa %xmm5, %xmm0
708; SSE-NEXT:    pxor %xmm1, %xmm0
709; SSE-NEXT:    pxor %xmm3, %xmm1
710; SSE-NEXT:    movdqa %xmm0, %xmm2
711; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
712; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
713; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
714; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
715; SSE-NEXT:    pand %xmm4, %xmm1
716; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
717; SSE-NEXT:    por %xmm1, %xmm0
718; SSE-NEXT:    pand %xmm0, %xmm3
719; SSE-NEXT:    pandn %xmm5, %xmm0
720; SSE-NEXT:    por %xmm3, %xmm0
721; SSE-NEXT:    retq
722;
723; AVX2-LABEL: reassociate_umin_v2i64:
724; AVX2:       # %bb.0:
725; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
726; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
727; AVX2-NEXT:    vpxor %xmm1, %xmm2, %xmm4
728; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm5
729; AVX2-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
730; AVX2-NEXT:    vblendvpd %xmm4, %xmm2, %xmm0, %xmm0
731; AVX2-NEXT:    vxorpd %xmm1, %xmm0, %xmm2
732; AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm1
733; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
734; AVX2-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
735; AVX2-NEXT:    retq
736;
737; AVX512-LABEL: reassociate_umin_v2i64:
738; AVX512:       # %bb.0:
739; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
740; AVX512-NEXT:    vpminuq %xmm3, %xmm2, %xmm1
741; AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
742; AVX512-NEXT:    retq
743
744  %t0 = add <2 x i64> %x0, %x1
745  %t1 = icmp ult <2 x i64> %x2, %t0
746  %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0
747  %t3 = icmp ult <2 x i64> %x3, %t2
748  %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2
749  ret <2 x i64> %t4
750}
751
752define <16 x i8> @reassociate_smin_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) {
753; SSE-LABEL: reassociate_smin_v16i8:
754; SSE:       # %bb.0:
755; SSE-NEXT:    paddb %xmm1, %xmm0
756; SSE-NEXT:    movdqa %xmm0, %xmm1
757; SSE-NEXT:    pcmpgtb %xmm2, %xmm1
758; SSE-NEXT:    pand %xmm1, %xmm2
759; SSE-NEXT:    pandn %xmm0, %xmm1
760; SSE-NEXT:    por %xmm2, %xmm1
761; SSE-NEXT:    movdqa %xmm1, %xmm0
762; SSE-NEXT:    pcmpgtb %xmm3, %xmm0
763; SSE-NEXT:    pand %xmm0, %xmm3
764; SSE-NEXT:    pandn %xmm1, %xmm0
765; SSE-NEXT:    por %xmm3, %xmm0
766; SSE-NEXT:    retq
767;
768; AVX-LABEL: reassociate_smin_v16i8:
769; AVX:       # %bb.0:
770; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
771; AVX-NEXT:    vpminsb %xmm3, %xmm2, %xmm1
772; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
773; AVX-NEXT:    retq
774
775  %t0 = add <16 x i8> %x0, %x1
776  %t1 = icmp slt <16 x i8> %x2, %t0
777  %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0
778  %t3 = icmp slt <16 x i8> %x3, %t2
779  %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2
780  ret <16 x i8> %t4
781}
782
783define <8 x i16> @reassociate_smin_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) {
784; SSE-LABEL: reassociate_smin_v8i16:
785; SSE:       # %bb.0:
786; SSE-NEXT:    paddw %xmm1, %xmm0
787; SSE-NEXT:    pminsw %xmm3, %xmm2
788; SSE-NEXT:    pminsw %xmm2, %xmm0
789; SSE-NEXT:    retq
790;
791; AVX-LABEL: reassociate_smin_v8i16:
792; AVX:       # %bb.0:
793; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
794; AVX-NEXT:    vpminsw %xmm3, %xmm2, %xmm1
795; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
796; AVX-NEXT:    retq
797
798  %t0 = add <8 x i16> %x0, %x1
799  %t1 = icmp slt <8 x i16> %x2, %t0
800  %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0
801  %t3 = icmp slt <8 x i16> %x3, %t2
802  %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2
803  ret <8 x i16> %t4
804}
805
806define <4 x i32> @reassociate_smin_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) {
807; SSE-LABEL: reassociate_smin_v4i32:
808; SSE:       # %bb.0:
809; SSE-NEXT:    paddd %xmm1, %xmm0
810; SSE-NEXT:    movdqa %xmm0, %xmm1
811; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
812; SSE-NEXT:    pand %xmm1, %xmm2
813; SSE-NEXT:    pandn %xmm0, %xmm1
814; SSE-NEXT:    por %xmm2, %xmm1
815; SSE-NEXT:    movdqa %xmm1, %xmm0
816; SSE-NEXT:    pcmpgtd %xmm3, %xmm0
817; SSE-NEXT:    pand %xmm0, %xmm3
818; SSE-NEXT:    pandn %xmm1, %xmm0
819; SSE-NEXT:    por %xmm3, %xmm0
820; SSE-NEXT:    retq
821;
822; AVX-LABEL: reassociate_smin_v4i32:
823; AVX:       # %bb.0:
824; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
825; AVX-NEXT:    vpminsd %xmm3, %xmm2, %xmm1
826; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
827; AVX-NEXT:    retq
828
829  %t0 = add <4 x i32> %x0, %x1
830  %t1 = icmp slt <4 x i32> %x2, %t0
831  %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0
832  %t3 = icmp slt <4 x i32> %x3, %t2
833  %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2
834  ret <4 x i32> %t4
835}
836
837define <2 x i64> @reassociate_smin_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) {
838; SSE-LABEL: reassociate_smin_v2i64:
839; SSE:       # %bb.0:
840; SSE-NEXT:    paddq %xmm1, %xmm0
841; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
842; SSE-NEXT:    movdqa %xmm2, %xmm4
843; SSE-NEXT:    pxor %xmm1, %xmm4
844; SSE-NEXT:    movdqa %xmm0, %xmm5
845; SSE-NEXT:    pxor %xmm1, %xmm5
846; SSE-NEXT:    movdqa %xmm5, %xmm6
847; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
848; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
849; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
850; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
851; SSE-NEXT:    pand %xmm7, %xmm4
852; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
853; SSE-NEXT:    por %xmm4, %xmm5
854; SSE-NEXT:    pand %xmm5, %xmm2
855; SSE-NEXT:    pandn %xmm0, %xmm5
856; SSE-NEXT:    por %xmm2, %xmm5
857; SSE-NEXT:    movdqa %xmm5, %xmm0
858; SSE-NEXT:    pxor %xmm1, %xmm0
859; SSE-NEXT:    pxor %xmm3, %xmm1
860; SSE-NEXT:    movdqa %xmm0, %xmm2
861; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
862; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
863; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
864; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
865; SSE-NEXT:    pand %xmm4, %xmm1
866; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
867; SSE-NEXT:    por %xmm1, %xmm0
868; SSE-NEXT:    pand %xmm0, %xmm3
869; SSE-NEXT:    pandn %xmm5, %xmm0
870; SSE-NEXT:    por %xmm3, %xmm0
871; SSE-NEXT:    retq
872;
873; AVX2-LABEL: reassociate_smin_v2i64:
874; AVX2:       # %bb.0:
875; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
876; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm1
877; AVX2-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
878; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm1
879; AVX2-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
880; AVX2-NEXT:    retq
881;
882; AVX512-LABEL: reassociate_smin_v2i64:
883; AVX512:       # %bb.0:
884; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
885; AVX512-NEXT:    vpminsq %xmm3, %xmm2, %xmm1
886; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
887; AVX512-NEXT:    retq
888
889  %t0 = add <2 x i64> %x0, %x1
890  %t1 = icmp slt <2 x i64> %x2, %t0
891  %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0
892  %t3 = icmp slt <2 x i64> %x3, %t2
893  %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2
894  ret <2 x i64> %t4
895}
896
897; Verify that 256-bit vector min/max are reassociated.
898
899define <32 x i8> @reassociate_umax_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) {
900; SSE-LABEL: reassociate_umax_v32i8:
901; SSE:       # %bb.0:
902; SSE-NEXT:    paddb %xmm2, %xmm0
903; SSE-NEXT:    paddb %xmm3, %xmm1
904; SSE-NEXT:    pmaxub %xmm6, %xmm4
905; SSE-NEXT:    pmaxub %xmm4, %xmm0
906; SSE-NEXT:    pmaxub %xmm7, %xmm5
907; SSE-NEXT:    pmaxub %xmm5, %xmm1
908; SSE-NEXT:    retq
909;
910; AVX-LABEL: reassociate_umax_v32i8:
911; AVX:       # %bb.0:
912; AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
913; AVX-NEXT:    vpmaxub %ymm3, %ymm2, %ymm1
914; AVX-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
915; AVX-NEXT:    retq
916
917  %t0 = add <32 x i8> %x0, %x1
918  %t1 = icmp ugt <32 x i8> %x2, %t0
919  %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0
920  %t3 = icmp ugt <32 x i8> %x3, %t2
921  %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2
922  ret <32 x i8> %t4
923}
924
925define <16 x i16> @reassociate_umax_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) {
926; SSE-LABEL: reassociate_umax_v16i16:
927; SSE:       # %bb.0:
928; SSE-NEXT:    paddw %xmm2, %xmm0
929; SSE-NEXT:    paddw %xmm3, %xmm1
930; SSE-NEXT:    psubusw %xmm5, %xmm1
931; SSE-NEXT:    paddw %xmm5, %xmm1
932; SSE-NEXT:    psubusw %xmm4, %xmm0
933; SSE-NEXT:    paddw %xmm4, %xmm0
934; SSE-NEXT:    psubusw %xmm6, %xmm0
935; SSE-NEXT:    paddw %xmm6, %xmm0
936; SSE-NEXT:    psubusw %xmm7, %xmm1
937; SSE-NEXT:    paddw %xmm7, %xmm1
938; SSE-NEXT:    retq
939;
940; AVX-LABEL: reassociate_umax_v16i16:
941; AVX:       # %bb.0:
942; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
943; AVX-NEXT:    vpmaxuw %ymm3, %ymm2, %ymm1
944; AVX-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
945; AVX-NEXT:    retq
946
947  %t0 = add <16 x i16> %x0, %x1
948  %t1 = icmp ugt <16 x i16> %x2, %t0
949  %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0
950  %t3 = icmp ugt <16 x i16> %x3, %t2
951  %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2
952  ret <16 x i16> %t4
953}
954
955define <8 x i32> @reassociate_umax_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
956; SSE-LABEL: reassociate_umax_v8i32:
957; SSE:       # %bb.0:
958; SSE-NEXT:    movdqa %xmm1, %xmm8
959; SSE-NEXT:    paddd %xmm2, %xmm0
960; SSE-NEXT:    paddd %xmm3, %xmm8
961; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
962; SSE-NEXT:    movdqa %xmm5, %xmm2
963; SSE-NEXT:    pxor %xmm1, %xmm2
964; SSE-NEXT:    movdqa %xmm8, %xmm3
965; SSE-NEXT:    pxor %xmm1, %xmm3
966; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
967; SSE-NEXT:    pand %xmm2, %xmm5
968; SSE-NEXT:    pandn %xmm8, %xmm2
969; SSE-NEXT:    por %xmm5, %xmm2
970; SSE-NEXT:    movdqa %xmm4, %xmm3
971; SSE-NEXT:    pxor %xmm1, %xmm3
972; SSE-NEXT:    movdqa %xmm0, %xmm5
973; SSE-NEXT:    pxor %xmm1, %xmm5
974; SSE-NEXT:    pcmpgtd %xmm5, %xmm3
975; SSE-NEXT:    pand %xmm3, %xmm4
976; SSE-NEXT:    pandn %xmm0, %xmm3
977; SSE-NEXT:    por %xmm4, %xmm3
978; SSE-NEXT:    movdqa %xmm3, %xmm4
979; SSE-NEXT:    pxor %xmm1, %xmm4
980; SSE-NEXT:    movdqa %xmm6, %xmm0
981; SSE-NEXT:    pxor %xmm1, %xmm0
982; SSE-NEXT:    pcmpgtd %xmm4, %xmm0
983; SSE-NEXT:    pand %xmm0, %xmm6
984; SSE-NEXT:    pandn %xmm3, %xmm0
985; SSE-NEXT:    por %xmm6, %xmm0
986; SSE-NEXT:    movdqa %xmm2, %xmm3
987; SSE-NEXT:    pxor %xmm1, %xmm3
988; SSE-NEXT:    pxor %xmm7, %xmm1
989; SSE-NEXT:    pcmpgtd %xmm3, %xmm1
990; SSE-NEXT:    pand %xmm1, %xmm7
991; SSE-NEXT:    pandn %xmm2, %xmm1
992; SSE-NEXT:    por %xmm7, %xmm1
993; SSE-NEXT:    retq
994;
995; AVX-LABEL: reassociate_umax_v8i32:
996; AVX:       # %bb.0:
997; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
998; AVX-NEXT:    vpmaxud %ymm3, %ymm2, %ymm1
999; AVX-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1000; AVX-NEXT:    retq
1001
1002  %t0 = add <8 x i32> %x0, %x1
1003  %t1 = icmp ugt <8 x i32> %x2, %t0
1004  %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0
1005  %t3 = icmp ugt <8 x i32> %x3, %t2
1006  %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2
1007  ret <8 x i32> %t4
1008}
1009
1010define <4 x i64> @reassociate_umax_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) {
1011; SSE-LABEL: reassociate_umax_v4i64:
1012; SSE:       # %bb.0:
1013; SSE-NEXT:    paddq %xmm2, %xmm0
1014; SSE-NEXT:    paddq %xmm3, %xmm1
1015; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1016; SSE-NEXT:    movdqa %xmm5, %xmm3
1017; SSE-NEXT:    pxor %xmm8, %xmm3
1018; SSE-NEXT:    movdqa %xmm1, %xmm2
1019; SSE-NEXT:    pxor %xmm8, %xmm2
1020; SSE-NEXT:    movdqa %xmm3, %xmm9
1021; SSE-NEXT:    pcmpgtd %xmm2, %xmm9
1022; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1023; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
1024; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1025; SSE-NEXT:    pand %xmm10, %xmm2
1026; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
1027; SSE-NEXT:    por %xmm2, %xmm3
1028; SSE-NEXT:    pand %xmm3, %xmm5
1029; SSE-NEXT:    pandn %xmm1, %xmm3
1030; SSE-NEXT:    por %xmm5, %xmm3
1031; SSE-NEXT:    movdqa %xmm4, %xmm1
1032; SSE-NEXT:    pxor %xmm8, %xmm1
1033; SSE-NEXT:    movdqa %xmm0, %xmm2
1034; SSE-NEXT:    pxor %xmm8, %xmm2
1035; SSE-NEXT:    movdqa %xmm1, %xmm5
1036; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
1037; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1038; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
1039; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1040; SSE-NEXT:    pand %xmm9, %xmm1
1041; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1042; SSE-NEXT:    por %xmm1, %xmm2
1043; SSE-NEXT:    pand %xmm2, %xmm4
1044; SSE-NEXT:    pandn %xmm0, %xmm2
1045; SSE-NEXT:    por %xmm4, %xmm2
1046; SSE-NEXT:    movdqa %xmm2, %xmm0
1047; SSE-NEXT:    pxor %xmm8, %xmm0
1048; SSE-NEXT:    movdqa %xmm6, %xmm1
1049; SSE-NEXT:    pxor %xmm8, %xmm1
1050; SSE-NEXT:    movdqa %xmm1, %xmm4
1051; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
1052; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1053; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
1054; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1055; SSE-NEXT:    pand %xmm5, %xmm1
1056; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1057; SSE-NEXT:    por %xmm1, %xmm0
1058; SSE-NEXT:    pand %xmm0, %xmm6
1059; SSE-NEXT:    pandn %xmm2, %xmm0
1060; SSE-NEXT:    por %xmm6, %xmm0
1061; SSE-NEXT:    movdqa %xmm3, %xmm1
1062; SSE-NEXT:    pxor %xmm8, %xmm1
1063; SSE-NEXT:    pxor %xmm7, %xmm8
1064; SSE-NEXT:    movdqa %xmm8, %xmm2
1065; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
1066; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1067; SSE-NEXT:    pcmpeqd %xmm1, %xmm8
1068; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1069; SSE-NEXT:    pand %xmm4, %xmm5
1070; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1071; SSE-NEXT:    por %xmm5, %xmm1
1072; SSE-NEXT:    pand %xmm1, %xmm7
1073; SSE-NEXT:    pandn %xmm3, %xmm1
1074; SSE-NEXT:    por %xmm7, %xmm1
1075; SSE-NEXT:    retq
1076;
1077; AVX2-LABEL: reassociate_umax_v4i64:
1078; AVX2:       # %bb.0:
1079; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1080; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1081; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm4
1082; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm5
1083; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm4, %ymm4
1084; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
1085; AVX2-NEXT:    vxorpd %ymm1, %ymm0, %ymm2
1086; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1087; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm1
1088; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm0, %ymm0
1089; AVX2-NEXT:    retq
1090;
1091; AVX512-LABEL: reassociate_umax_v4i64:
1092; AVX512:       # %bb.0:
1093; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1094; AVX512-NEXT:    vpmaxuq %ymm3, %ymm2, %ymm1
1095; AVX512-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
1096; AVX512-NEXT:    retq
1097
1098  %t0 = add <4 x i64> %x0, %x1
1099  %t1 = icmp ugt <4 x i64> %x2, %t0
1100  %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0
1101  %t3 = icmp ugt <4 x i64> %x3, %t2
1102  %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2
1103  ret <4 x i64> %t4
1104}
1105
1106define <32 x i8> @reassociate_smax_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) {
1107; SSE-LABEL: reassociate_smax_v32i8:
1108; SSE:       # %bb.0:
1109; SSE-NEXT:    paddb %xmm2, %xmm0
1110; SSE-NEXT:    paddb %xmm3, %xmm1
1111; SSE-NEXT:    movdqa %xmm5, %xmm2
1112; SSE-NEXT:    pcmpgtb %xmm1, %xmm2
1113; SSE-NEXT:    pand %xmm2, %xmm5
1114; SSE-NEXT:    pandn %xmm1, %xmm2
1115; SSE-NEXT:    por %xmm5, %xmm2
1116; SSE-NEXT:    movdqa %xmm4, %xmm1
1117; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
1118; SSE-NEXT:    pand %xmm1, %xmm4
1119; SSE-NEXT:    pandn %xmm0, %xmm1
1120; SSE-NEXT:    por %xmm4, %xmm1
1121; SSE-NEXT:    movdqa %xmm6, %xmm0
1122; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
1123; SSE-NEXT:    pand %xmm0, %xmm6
1124; SSE-NEXT:    pandn %xmm1, %xmm0
1125; SSE-NEXT:    por %xmm6, %xmm0
1126; SSE-NEXT:    movdqa %xmm7, %xmm1
1127; SSE-NEXT:    pcmpgtb %xmm2, %xmm1
1128; SSE-NEXT:    pand %xmm1, %xmm7
1129; SSE-NEXT:    pandn %xmm2, %xmm1
1130; SSE-NEXT:    por %xmm7, %xmm1
1131; SSE-NEXT:    retq
1132;
1133; AVX-LABEL: reassociate_smax_v32i8:
1134; AVX:       # %bb.0:
1135; AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1136; AVX-NEXT:    vpmaxsb %ymm3, %ymm2, %ymm1
1137; AVX-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1138; AVX-NEXT:    retq
1139
1140  %t0 = add <32 x i8> %x0, %x1
1141  %t1 = icmp sgt <32 x i8> %x2, %t0
1142  %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0
1143  %t3 = icmp sgt <32 x i8> %x3, %t2
1144  %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2
1145  ret <32 x i8> %t4
1146}
1147
1148define <16 x i16> @reassociate_smax_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) {
1149; SSE-LABEL: reassociate_smax_v16i16:
1150; SSE:       # %bb.0:
1151; SSE-NEXT:    paddw %xmm2, %xmm0
1152; SSE-NEXT:    paddw %xmm3, %xmm1
1153; SSE-NEXT:    pmaxsw %xmm6, %xmm4
1154; SSE-NEXT:    pmaxsw %xmm4, %xmm0
1155; SSE-NEXT:    pmaxsw %xmm7, %xmm5
1156; SSE-NEXT:    pmaxsw %xmm5, %xmm1
1157; SSE-NEXT:    retq
1158;
1159; AVX-LABEL: reassociate_smax_v16i16:
1160; AVX:       # %bb.0:
1161; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1162; AVX-NEXT:    vpmaxsw %ymm3, %ymm2, %ymm1
1163; AVX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1164; AVX-NEXT:    retq
1165
1166  %t0 = add <16 x i16> %x0, %x1
1167  %t1 = icmp sgt <16 x i16> %x2, %t0
1168  %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0
1169  %t3 = icmp sgt <16 x i16> %x3, %t2
1170  %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2
1171  ret <16 x i16> %t4
1172}
1173
1174define <8 x i32> @reassociate_smax_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
1175; SSE-LABEL: reassociate_smax_v8i32:
1176; SSE:       # %bb.0:
1177; SSE-NEXT:    paddd %xmm2, %xmm0
1178; SSE-NEXT:    paddd %xmm3, %xmm1
1179; SSE-NEXT:    movdqa %xmm5, %xmm2
1180; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
1181; SSE-NEXT:    pand %xmm2, %xmm5
1182; SSE-NEXT:    pandn %xmm1, %xmm2
1183; SSE-NEXT:    por %xmm5, %xmm2
1184; SSE-NEXT:    movdqa %xmm4, %xmm1
1185; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
1186; SSE-NEXT:    pand %xmm1, %xmm4
1187; SSE-NEXT:    pandn %xmm0, %xmm1
1188; SSE-NEXT:    por %xmm4, %xmm1
1189; SSE-NEXT:    movdqa %xmm6, %xmm0
1190; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
1191; SSE-NEXT:    pand %xmm0, %xmm6
1192; SSE-NEXT:    pandn %xmm1, %xmm0
1193; SSE-NEXT:    por %xmm6, %xmm0
1194; SSE-NEXT:    movdqa %xmm7, %xmm1
1195; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
1196; SSE-NEXT:    pand %xmm1, %xmm7
1197; SSE-NEXT:    pandn %xmm2, %xmm1
1198; SSE-NEXT:    por %xmm7, %xmm1
1199; SSE-NEXT:    retq
1200;
1201; AVX-LABEL: reassociate_smax_v8i32:
1202; AVX:       # %bb.0:
1203; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
1204; AVX-NEXT:    vpmaxsd %ymm3, %ymm2, %ymm1
1205; AVX-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1206; AVX-NEXT:    retq
1207
1208  %t0 = add <8 x i32> %x0, %x1
1209  %t1 = icmp sgt <8 x i32> %x2, %t0
1210  %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0
1211  %t3 = icmp sgt <8 x i32> %x3, %t2
1212  %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2
1213  ret <8 x i32> %t4
1214}
1215
1216define <4 x i64> @reassociate_smax_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) {
1217; SSE-LABEL: reassociate_smax_v4i64:
1218; SSE:       # %bb.0:
1219; SSE-NEXT:    paddq %xmm2, %xmm0
1220; SSE-NEXT:    paddq %xmm3, %xmm1
1221; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1222; SSE-NEXT:    movdqa %xmm5, %xmm3
1223; SSE-NEXT:    pxor %xmm8, %xmm3
1224; SSE-NEXT:    movdqa %xmm1, %xmm2
1225; SSE-NEXT:    pxor %xmm8, %xmm2
1226; SSE-NEXT:    movdqa %xmm3, %xmm9
1227; SSE-NEXT:    pcmpgtd %xmm2, %xmm9
1228; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1229; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
1230; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1231; SSE-NEXT:    pand %xmm10, %xmm2
1232; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
1233; SSE-NEXT:    por %xmm2, %xmm3
1234; SSE-NEXT:    pand %xmm3, %xmm5
1235; SSE-NEXT:    pandn %xmm1, %xmm3
1236; SSE-NEXT:    por %xmm5, %xmm3
1237; SSE-NEXT:    movdqa %xmm4, %xmm1
1238; SSE-NEXT:    pxor %xmm8, %xmm1
1239; SSE-NEXT:    movdqa %xmm0, %xmm2
1240; SSE-NEXT:    pxor %xmm8, %xmm2
1241; SSE-NEXT:    movdqa %xmm1, %xmm5
1242; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
1243; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1244; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
1245; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1246; SSE-NEXT:    pand %xmm9, %xmm1
1247; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1248; SSE-NEXT:    por %xmm1, %xmm2
1249; SSE-NEXT:    pand %xmm2, %xmm4
1250; SSE-NEXT:    pandn %xmm0, %xmm2
1251; SSE-NEXT:    por %xmm4, %xmm2
1252; SSE-NEXT:    movdqa %xmm2, %xmm0
1253; SSE-NEXT:    pxor %xmm8, %xmm0
1254; SSE-NEXT:    movdqa %xmm6, %xmm1
1255; SSE-NEXT:    pxor %xmm8, %xmm1
1256; SSE-NEXT:    movdqa %xmm1, %xmm4
1257; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
1258; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1259; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
1260; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1261; SSE-NEXT:    pand %xmm5, %xmm1
1262; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1263; SSE-NEXT:    por %xmm1, %xmm0
1264; SSE-NEXT:    pand %xmm0, %xmm6
1265; SSE-NEXT:    pandn %xmm2, %xmm0
1266; SSE-NEXT:    por %xmm6, %xmm0
1267; SSE-NEXT:    movdqa %xmm3, %xmm1
1268; SSE-NEXT:    pxor %xmm8, %xmm1
1269; SSE-NEXT:    pxor %xmm7, %xmm8
1270; SSE-NEXT:    movdqa %xmm8, %xmm2
1271; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
1272; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1273; SSE-NEXT:    pcmpeqd %xmm1, %xmm8
1274; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1275; SSE-NEXT:    pand %xmm4, %xmm5
1276; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1277; SSE-NEXT:    por %xmm5, %xmm1
1278; SSE-NEXT:    pand %xmm1, %xmm7
1279; SSE-NEXT:    pandn %xmm3, %xmm1
1280; SSE-NEXT:    por %xmm7, %xmm1
1281; SSE-NEXT:    retq
1282;
1283; AVX2-LABEL: reassociate_smax_v4i64:
1284; AVX2:       # %bb.0:
1285; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1286; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm1
1287; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
1288; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm3, %ymm1
1289; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm0, %ymm0
1290; AVX2-NEXT:    retq
1291;
1292; AVX512-LABEL: reassociate_smax_v4i64:
1293; AVX512:       # %bb.0:
1294; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1295; AVX512-NEXT:    vpmaxsq %ymm3, %ymm2, %ymm1
1296; AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
1297; AVX512-NEXT:    retq
1298
1299  %t0 = add <4 x i64> %x0, %x1
1300  %t1 = icmp sgt <4 x i64> %x2, %t0
1301  %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0
1302  %t3 = icmp sgt <4 x i64> %x3, %t2
1303  %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2
1304  ret <4 x i64> %t4
1305}
1306
1307define <32 x i8> @reassociate_umin_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) {
1308; SSE-LABEL: reassociate_umin_v32i8:
1309; SSE:       # %bb.0:
1310; SSE-NEXT:    paddb %xmm2, %xmm0
1311; SSE-NEXT:    paddb %xmm3, %xmm1
1312; SSE-NEXT:    pminub %xmm6, %xmm4
1313; SSE-NEXT:    pminub %xmm4, %xmm0
1314; SSE-NEXT:    pminub %xmm7, %xmm5
1315; SSE-NEXT:    pminub %xmm5, %xmm1
1316; SSE-NEXT:    retq
1317;
1318; AVX-LABEL: reassociate_umin_v32i8:
1319; AVX:       # %bb.0:
1320; AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1321; AVX-NEXT:    vpminub %ymm3, %ymm2, %ymm1
1322; AVX-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1323; AVX-NEXT:    retq
1324
1325  %t0 = add <32 x i8> %x0, %x1
1326  %t1 = icmp ult <32 x i8> %x2, %t0
1327  %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0
1328  %t3 = icmp ult <32 x i8> %x3, %t2
1329  %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2
1330  ret <32 x i8> %t4
1331}
1332
1333define <16 x i16> @reassociate_umin_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) {
1334; SSE-LABEL: reassociate_umin_v16i16:
1335; SSE:       # %bb.0:
1336; SSE-NEXT:    paddw %xmm2, %xmm0
1337; SSE-NEXT:    paddw %xmm3, %xmm1
1338; SSE-NEXT:    movdqa %xmm5, %xmm2
1339; SSE-NEXT:    psubusw %xmm1, %xmm2
1340; SSE-NEXT:    psubw %xmm2, %xmm5
1341; SSE-NEXT:    movdqa %xmm4, %xmm1
1342; SSE-NEXT:    psubusw %xmm0, %xmm1
1343; SSE-NEXT:    psubw %xmm1, %xmm4
1344; SSE-NEXT:    movdqa %xmm6, %xmm0
1345; SSE-NEXT:    psubusw %xmm4, %xmm0
1346; SSE-NEXT:    psubw %xmm0, %xmm6
1347; SSE-NEXT:    movdqa %xmm7, %xmm0
1348; SSE-NEXT:    psubusw %xmm5, %xmm0
1349; SSE-NEXT:    psubw %xmm0, %xmm7
1350; SSE-NEXT:    movdqa %xmm6, %xmm0
1351; SSE-NEXT:    movdqa %xmm7, %xmm1
1352; SSE-NEXT:    retq
1353;
1354; AVX-LABEL: reassociate_umin_v16i16:
1355; AVX:       # %bb.0:
1356; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1357; AVX-NEXT:    vpminuw %ymm3, %ymm2, %ymm1
1358; AVX-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1359; AVX-NEXT:    retq
1360
1361  %t0 = add <16 x i16> %x0, %x1
1362  %t1 = icmp ult <16 x i16> %x2, %t0
1363  %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0
1364  %t3 = icmp ult <16 x i16> %x3, %t2
1365  %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2
1366  ret <16 x i16> %t4
1367}
1368
1369define <8 x i32> @reassociate_umin_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
1370; SSE-LABEL: reassociate_umin_v8i32:
1371; SSE:       # %bb.0:
1372; SSE-NEXT:    paddd %xmm2, %xmm0
1373; SSE-NEXT:    paddd %xmm3, %xmm1
1374; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1375; SSE-NEXT:    movdqa %xmm5, %xmm8
1376; SSE-NEXT:    pxor %xmm3, %xmm8
1377; SSE-NEXT:    movdqa %xmm1, %xmm2
1378; SSE-NEXT:    pxor %xmm3, %xmm2
1379; SSE-NEXT:    pcmpgtd %xmm8, %xmm2
1380; SSE-NEXT:    pand %xmm2, %xmm5
1381; SSE-NEXT:    pandn %xmm1, %xmm2
1382; SSE-NEXT:    por %xmm5, %xmm2
1383; SSE-NEXT:    movdqa %xmm4, %xmm1
1384; SSE-NEXT:    pxor %xmm3, %xmm1
1385; SSE-NEXT:    movdqa %xmm0, %xmm5
1386; SSE-NEXT:    pxor %xmm3, %xmm5
1387; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
1388; SSE-NEXT:    pand %xmm5, %xmm4
1389; SSE-NEXT:    pandn %xmm0, %xmm5
1390; SSE-NEXT:    por %xmm4, %xmm5
1391; SSE-NEXT:    movdqa %xmm5, %xmm0
1392; SSE-NEXT:    pxor %xmm3, %xmm0
1393; SSE-NEXT:    movdqa %xmm6, %xmm1
1394; SSE-NEXT:    pxor %xmm3, %xmm1
1395; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
1396; SSE-NEXT:    pand %xmm0, %xmm6
1397; SSE-NEXT:    pandn %xmm5, %xmm0
1398; SSE-NEXT:    por %xmm6, %xmm0
1399; SSE-NEXT:    movdqa %xmm2, %xmm1
1400; SSE-NEXT:    pxor %xmm3, %xmm1
1401; SSE-NEXT:    pxor %xmm7, %xmm3
1402; SSE-NEXT:    pcmpgtd %xmm3, %xmm1
1403; SSE-NEXT:    pand %xmm1, %xmm7
1404; SSE-NEXT:    pandn %xmm2, %xmm1
1405; SSE-NEXT:    por %xmm7, %xmm1
1406; SSE-NEXT:    retq
1407;
1408; AVX-LABEL: reassociate_umin_v8i32:
1409; AVX:       # %bb.0:
1410; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
1411; AVX-NEXT:    vpminud %ymm3, %ymm2, %ymm1
1412; AVX-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1413; AVX-NEXT:    retq
1414
1415  %t0 = add <8 x i32> %x0, %x1
1416  %t1 = icmp ult <8 x i32> %x2, %t0
1417  %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0
1418  %t3 = icmp ult <8 x i32> %x3, %t2
1419  %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2
1420  ret <8 x i32> %t4
1421}
1422
1423define <4 x i64> @reassociate_umin_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) {
1424; SSE-LABEL: reassociate_umin_v4i64:
1425; SSE:       # %bb.0:
1426; SSE-NEXT:    paddq %xmm2, %xmm0
1427; SSE-NEXT:    paddq %xmm3, %xmm1
1428; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1429; SSE-NEXT:    movdqa %xmm5, %xmm3
1430; SSE-NEXT:    pxor %xmm8, %xmm3
1431; SSE-NEXT:    movdqa %xmm1, %xmm2
1432; SSE-NEXT:    pxor %xmm8, %xmm2
1433; SSE-NEXT:    movdqa %xmm2, %xmm9
1434; SSE-NEXT:    pcmpgtd %xmm3, %xmm9
1435; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1436; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
1437; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1438; SSE-NEXT:    pand %xmm10, %xmm2
1439; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
1440; SSE-NEXT:    por %xmm2, %xmm3
1441; SSE-NEXT:    pand %xmm3, %xmm5
1442; SSE-NEXT:    pandn %xmm1, %xmm3
1443; SSE-NEXT:    por %xmm5, %xmm3
1444; SSE-NEXT:    movdqa %xmm4, %xmm1
1445; SSE-NEXT:    pxor %xmm8, %xmm1
1446; SSE-NEXT:    movdqa %xmm0, %xmm2
1447; SSE-NEXT:    pxor %xmm8, %xmm2
1448; SSE-NEXT:    movdqa %xmm2, %xmm5
1449; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
1450; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1451; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
1452; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1453; SSE-NEXT:    pand %xmm9, %xmm1
1454; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1455; SSE-NEXT:    por %xmm1, %xmm2
1456; SSE-NEXT:    pand %xmm2, %xmm4
1457; SSE-NEXT:    pandn %xmm0, %xmm2
1458; SSE-NEXT:    por %xmm4, %xmm2
1459; SSE-NEXT:    movdqa %xmm2, %xmm0
1460; SSE-NEXT:    pxor %xmm8, %xmm0
1461; SSE-NEXT:    movdqa %xmm6, %xmm1
1462; SSE-NEXT:    pxor %xmm8, %xmm1
1463; SSE-NEXT:    movdqa %xmm0, %xmm4
1464; SSE-NEXT:    pcmpgtd %xmm1, %xmm4
1465; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1466; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
1467; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1468; SSE-NEXT:    pand %xmm5, %xmm1
1469; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1470; SSE-NEXT:    por %xmm1, %xmm0
1471; SSE-NEXT:    pand %xmm0, %xmm6
1472; SSE-NEXT:    pandn %xmm2, %xmm0
1473; SSE-NEXT:    por %xmm6, %xmm0
1474; SSE-NEXT:    movdqa %xmm3, %xmm1
1475; SSE-NEXT:    pxor %xmm8, %xmm1
1476; SSE-NEXT:    pxor %xmm7, %xmm8
1477; SSE-NEXT:    movdqa %xmm1, %xmm2
1478; SSE-NEXT:    pcmpgtd %xmm8, %xmm2
1479; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1480; SSE-NEXT:    pcmpeqd %xmm1, %xmm8
1481; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1482; SSE-NEXT:    pand %xmm4, %xmm5
1483; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1484; SSE-NEXT:    por %xmm5, %xmm1
1485; SSE-NEXT:    pand %xmm1, %xmm7
1486; SSE-NEXT:    pandn %xmm3, %xmm1
1487; SSE-NEXT:    por %xmm7, %xmm1
1488; SSE-NEXT:    retq
1489;
1490; AVX2-LABEL: reassociate_umin_v4i64:
1491; AVX2:       # %bb.0:
1492; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1493; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1494; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm4
1495; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm5
1496; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1497; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm0, %ymm0
1498; AVX2-NEXT:    vxorpd %ymm1, %ymm0, %ymm2
1499; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1500; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
1501; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm0, %ymm0
1502; AVX2-NEXT:    retq
1503;
1504; AVX512-LABEL: reassociate_umin_v4i64:
1505; AVX512:       # %bb.0:
1506; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1507; AVX512-NEXT:    vpminuq %ymm3, %ymm2, %ymm1
1508; AVX512-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
1509; AVX512-NEXT:    retq
1510
1511  %t0 = add <4 x i64> %x0, %x1
1512  %t1 = icmp ult <4 x i64> %x2, %t0
1513  %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0
1514  %t3 = icmp ult <4 x i64> %x3, %t2
1515  %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2
1516  ret <4 x i64> %t4
1517}
1518
1519define <32 x i8> @reassociate_smin_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) {
1520; SSE-LABEL: reassociate_smin_v32i8:
1521; SSE:       # %bb.0:
1522; SSE-NEXT:    paddb %xmm2, %xmm0
1523; SSE-NEXT:    paddb %xmm3, %xmm1
1524; SSE-NEXT:    movdqa %xmm1, %xmm2
1525; SSE-NEXT:    pcmpgtb %xmm5, %xmm2
1526; SSE-NEXT:    pand %xmm2, %xmm5
1527; SSE-NEXT:    pandn %xmm1, %xmm2
1528; SSE-NEXT:    por %xmm5, %xmm2
1529; SSE-NEXT:    movdqa %xmm0, %xmm1
1530; SSE-NEXT:    pcmpgtb %xmm4, %xmm1
1531; SSE-NEXT:    pand %xmm1, %xmm4
1532; SSE-NEXT:    pandn %xmm0, %xmm1
1533; SSE-NEXT:    por %xmm4, %xmm1
1534; SSE-NEXT:    movdqa %xmm1, %xmm0
1535; SSE-NEXT:    pcmpgtb %xmm6, %xmm0
1536; SSE-NEXT:    pand %xmm0, %xmm6
1537; SSE-NEXT:    pandn %xmm1, %xmm0
1538; SSE-NEXT:    por %xmm6, %xmm0
1539; SSE-NEXT:    movdqa %xmm2, %xmm1
1540; SSE-NEXT:    pcmpgtb %xmm7, %xmm1
1541; SSE-NEXT:    pand %xmm1, %xmm7
1542; SSE-NEXT:    pandn %xmm2, %xmm1
1543; SSE-NEXT:    por %xmm7, %xmm1
1544; SSE-NEXT:    retq
1545;
1546; AVX-LABEL: reassociate_smin_v32i8:
1547; AVX:       # %bb.0:
1548; AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1549; AVX-NEXT:    vpminsb %ymm3, %ymm2, %ymm1
1550; AVX-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
1551; AVX-NEXT:    retq
1552
1553  %t0 = add <32 x i8> %x0, %x1
1554  %t1 = icmp slt <32 x i8> %x2, %t0
1555  %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0
1556  %t3 = icmp slt <32 x i8> %x3, %t2
1557  %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2
1558  ret <32 x i8> %t4
1559}
1560
1561define <16 x i16> @reassociate_smin_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) {
1562; SSE-LABEL: reassociate_smin_v16i16:
1563; SSE:       # %bb.0:
1564; SSE-NEXT:    paddw %xmm2, %xmm0
1565; SSE-NEXT:    paddw %xmm3, %xmm1
1566; SSE-NEXT:    pminsw %xmm6, %xmm4
1567; SSE-NEXT:    pminsw %xmm4, %xmm0
1568; SSE-NEXT:    pminsw %xmm7, %xmm5
1569; SSE-NEXT:    pminsw %xmm5, %xmm1
1570; SSE-NEXT:    retq
1571;
1572; AVX-LABEL: reassociate_smin_v16i16:
1573; AVX:       # %bb.0:
1574; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1575; AVX-NEXT:    vpminsw %ymm3, %ymm2, %ymm1
1576; AVX-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1577; AVX-NEXT:    retq
1578
1579  %t0 = add <16 x i16> %x0, %x1
1580  %t1 = icmp slt <16 x i16> %x2, %t0
1581  %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0
1582  %t3 = icmp slt <16 x i16> %x3, %t2
1583  %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2
1584  ret <16 x i16> %t4
1585}
1586
1587define <8 x i32> @reassociate_smin_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) {
1588; SSE-LABEL: reassociate_smin_v8i32:
1589; SSE:       # %bb.0:
1590; SSE-NEXT:    paddd %xmm2, %xmm0
1591; SSE-NEXT:    paddd %xmm3, %xmm1
1592; SSE-NEXT:    movdqa %xmm1, %xmm2
1593; SSE-NEXT:    pcmpgtd %xmm5, %xmm2
1594; SSE-NEXT:    pand %xmm2, %xmm5
1595; SSE-NEXT:    pandn %xmm1, %xmm2
1596; SSE-NEXT:    por %xmm5, %xmm2
1597; SSE-NEXT:    movdqa %xmm0, %xmm1
1598; SSE-NEXT:    pcmpgtd %xmm4, %xmm1
1599; SSE-NEXT:    pand %xmm1, %xmm4
1600; SSE-NEXT:    pandn %xmm0, %xmm1
1601; SSE-NEXT:    por %xmm4, %xmm1
1602; SSE-NEXT:    movdqa %xmm1, %xmm0
1603; SSE-NEXT:    pcmpgtd %xmm6, %xmm0
1604; SSE-NEXT:    pand %xmm0, %xmm6
1605; SSE-NEXT:    pandn %xmm1, %xmm0
1606; SSE-NEXT:    por %xmm6, %xmm0
1607; SSE-NEXT:    movdqa %xmm2, %xmm1
1608; SSE-NEXT:    pcmpgtd %xmm7, %xmm1
1609; SSE-NEXT:    pand %xmm1, %xmm7
1610; SSE-NEXT:    pandn %xmm2, %xmm1
1611; SSE-NEXT:    por %xmm7, %xmm1
1612; SSE-NEXT:    retq
1613;
1614; AVX-LABEL: reassociate_smin_v8i32:
1615; AVX:       # %bb.0:
1616; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
1617; AVX-NEXT:    vpminsd %ymm3, %ymm2, %ymm1
1618; AVX-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1619; AVX-NEXT:    retq
1620
1621  %t0 = add <8 x i32> %x0, %x1
1622  %t1 = icmp slt <8 x i32> %x2, %t0
1623  %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0
1624  %t3 = icmp slt <8 x i32> %x3, %t2
1625  %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2
1626  ret <8 x i32> %t4
1627}
1628
1629define <4 x i64> @reassociate_smin_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) {
1630; SSE-LABEL: reassociate_smin_v4i64:
1631; SSE:       # %bb.0:
1632; SSE-NEXT:    paddq %xmm2, %xmm0
1633; SSE-NEXT:    paddq %xmm3, %xmm1
1634; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1635; SSE-NEXT:    movdqa %xmm5, %xmm3
1636; SSE-NEXT:    pxor %xmm8, %xmm3
1637; SSE-NEXT:    movdqa %xmm1, %xmm2
1638; SSE-NEXT:    pxor %xmm8, %xmm2
1639; SSE-NEXT:    movdqa %xmm2, %xmm9
1640; SSE-NEXT:    pcmpgtd %xmm3, %xmm9
1641; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1642; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
1643; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1644; SSE-NEXT:    pand %xmm10, %xmm2
1645; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
1646; SSE-NEXT:    por %xmm2, %xmm3
1647; SSE-NEXT:    pand %xmm3, %xmm5
1648; SSE-NEXT:    pandn %xmm1, %xmm3
1649; SSE-NEXT:    por %xmm5, %xmm3
1650; SSE-NEXT:    movdqa %xmm4, %xmm1
1651; SSE-NEXT:    pxor %xmm8, %xmm1
1652; SSE-NEXT:    movdqa %xmm0, %xmm2
1653; SSE-NEXT:    pxor %xmm8, %xmm2
1654; SSE-NEXT:    movdqa %xmm2, %xmm5
1655; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
1656; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1657; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
1658; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1659; SSE-NEXT:    pand %xmm9, %xmm1
1660; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1661; SSE-NEXT:    por %xmm1, %xmm2
1662; SSE-NEXT:    pand %xmm2, %xmm4
1663; SSE-NEXT:    pandn %xmm0, %xmm2
1664; SSE-NEXT:    por %xmm4, %xmm2
1665; SSE-NEXT:    movdqa %xmm2, %xmm0
1666; SSE-NEXT:    pxor %xmm8, %xmm0
1667; SSE-NEXT:    movdqa %xmm6, %xmm1
1668; SSE-NEXT:    pxor %xmm8, %xmm1
1669; SSE-NEXT:    movdqa %xmm0, %xmm4
1670; SSE-NEXT:    pcmpgtd %xmm1, %xmm4
1671; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1672; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
1673; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1674; SSE-NEXT:    pand %xmm5, %xmm1
1675; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1676; SSE-NEXT:    por %xmm1, %xmm0
1677; SSE-NEXT:    pand %xmm0, %xmm6
1678; SSE-NEXT:    pandn %xmm2, %xmm0
1679; SSE-NEXT:    por %xmm6, %xmm0
1680; SSE-NEXT:    movdqa %xmm3, %xmm1
1681; SSE-NEXT:    pxor %xmm8, %xmm1
1682; SSE-NEXT:    pxor %xmm7, %xmm8
1683; SSE-NEXT:    movdqa %xmm1, %xmm2
1684; SSE-NEXT:    pcmpgtd %xmm8, %xmm2
1685; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1686; SSE-NEXT:    pcmpeqd %xmm1, %xmm8
1687; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1688; SSE-NEXT:    pand %xmm4, %xmm5
1689; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1690; SSE-NEXT:    por %xmm5, %xmm1
1691; SSE-NEXT:    pand %xmm1, %xmm7
1692; SSE-NEXT:    pandn %xmm3, %xmm1
1693; SSE-NEXT:    por %xmm7, %xmm1
1694; SSE-NEXT:    retq
1695;
1696; AVX2-LABEL: reassociate_smin_v4i64:
1697; AVX2:       # %bb.0:
1698; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1699; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm1
1700; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
1701; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm0, %ymm1
1702; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm0, %ymm0
1703; AVX2-NEXT:    retq
1704;
1705; AVX512-LABEL: reassociate_smin_v4i64:
1706; AVX512:       # %bb.0:
1707; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1708; AVX512-NEXT:    vpminsq %ymm3, %ymm2, %ymm1
1709; AVX512-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
1710; AVX512-NEXT:    retq
1711
1712  %t0 = add <4 x i64> %x0, %x1
1713  %t1 = icmp slt <4 x i64> %x2, %t0
1714  %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0
1715  %t3 = icmp slt <4 x i64> %x3, %t2
1716  %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2
1717  ret <4 x i64> %t4
1718}
1719
1720; Verify that 512-bit vector min/max are reassociated.
1721
1722define <64 x i8> @reassociate_umax_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) {
1723; SSE-LABEL: reassociate_umax_v64i8:
1724; SSE:       # %bb.0:
1725; SSE-NEXT:    paddb %xmm4, %xmm0
1726; SSE-NEXT:    paddb %xmm5, %xmm1
1727; SSE-NEXT:    paddb %xmm6, %xmm2
1728; SSE-NEXT:    paddb %xmm7, %xmm3
1729; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm3
1730; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm2
1731; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm1
1732; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm0
1733; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm0
1734; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm1
1735; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm2
1736; SSE-NEXT:    pmaxub {{[0-9]+}}(%rsp), %xmm3
1737; SSE-NEXT:    retq
1738;
1739; AVX2-LABEL: reassociate_umax_v64i8:
1740; AVX2:       # %bb.0:
1741; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
1742; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
1743; AVX2-NEXT:    vpmaxub %ymm6, %ymm4, %ymm2
1744; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
1745; AVX2-NEXT:    vpmaxub %ymm7, %ymm5, %ymm2
1746; AVX2-NEXT:    vpmaxub %ymm2, %ymm1, %ymm1
1747; AVX2-NEXT:    retq
1748;
1749; AVX512-LABEL: reassociate_umax_v64i8:
1750; AVX512:       # %bb.0:
1751; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1752; AVX512-NEXT:    vpmaxub %zmm3, %zmm2, %zmm1
1753; AVX512-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
1754; AVX512-NEXT:    retq
1755
1756  %t0 = add <64 x i8> %x0, %x1
1757  %t1 = icmp ugt <64 x i8> %x2, %t0
1758  %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0
1759  %t3 = icmp ugt <64 x i8> %x3, %t2
1760  %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2
1761  ret <64 x i8> %t4
1762}
1763
1764define <32 x i16> @reassociate_umax_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) {
1765; SSE-LABEL: reassociate_umax_v32i16:
1766; SSE:       # %bb.0:
1767; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
1768; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
1769; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
1770; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
1771; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
1772; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
1773; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
1774; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
1775; SSE-NEXT:    paddw %xmm4, %xmm0
1776; SSE-NEXT:    paddw %xmm5, %xmm1
1777; SSE-NEXT:    paddw %xmm6, %xmm2
1778; SSE-NEXT:    paddw %xmm7, %xmm3
1779; SSE-NEXT:    psubusw %xmm15, %xmm3
1780; SSE-NEXT:    paddw %xmm15, %xmm3
1781; SSE-NEXT:    psubusw %xmm14, %xmm2
1782; SSE-NEXT:    paddw %xmm14, %xmm2
1783; SSE-NEXT:    psubusw %xmm13, %xmm1
1784; SSE-NEXT:    paddw %xmm13, %xmm1
1785; SSE-NEXT:    psubusw %xmm12, %xmm0
1786; SSE-NEXT:    paddw %xmm12, %xmm0
1787; SSE-NEXT:    psubusw %xmm11, %xmm0
1788; SSE-NEXT:    paddw %xmm11, %xmm0
1789; SSE-NEXT:    psubusw %xmm10, %xmm1
1790; SSE-NEXT:    paddw %xmm10, %xmm1
1791; SSE-NEXT:    psubusw %xmm9, %xmm2
1792; SSE-NEXT:    paddw %xmm9, %xmm2
1793; SSE-NEXT:    psubusw %xmm8, %xmm3
1794; SSE-NEXT:    paddw %xmm8, %xmm3
1795; SSE-NEXT:    retq
1796;
1797; AVX2-LABEL: reassociate_umax_v32i16:
1798; AVX2:       # %bb.0:
1799; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
1800; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
1801; AVX2-NEXT:    vpmaxuw %ymm6, %ymm4, %ymm2
1802; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
1803; AVX2-NEXT:    vpmaxuw %ymm7, %ymm5, %ymm2
1804; AVX2-NEXT:    vpmaxuw %ymm2, %ymm1, %ymm1
1805; AVX2-NEXT:    retq
1806;
1807; AVX512-LABEL: reassociate_umax_v32i16:
1808; AVX512:       # %bb.0:
1809; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
1810; AVX512-NEXT:    vpmaxuw %zmm3, %zmm2, %zmm1
1811; AVX512-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
1812; AVX512-NEXT:    retq
1813
1814  %t0 = add <32 x i16> %x0, %x1
1815  %t1 = icmp ugt <32 x i16> %x2, %t0
1816  %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0
1817  %t3 = icmp ugt <32 x i16> %x3, %t2
1818  %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2
1819  ret <32 x i16> %t4
1820}
1821
1822define <16 x i32> @reassociate_umax_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
1823; SSE-LABEL: reassociate_umax_v16i32:
1824; SSE:       # %bb.0:
1825; SSE-NEXT:    movdqa %xmm7, %xmm9
1826; SSE-NEXT:    movdqa %xmm4, %xmm7
1827; SSE-NEXT:    movdqa %xmm3, %xmm8
1828; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
1829; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
1830; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
1831; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
1832; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
1833; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
1834; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm4
1835; SSE-NEXT:    paddd %xmm7, %xmm0
1836; SSE-NEXT:    paddd %xmm5, %xmm1
1837; SSE-NEXT:    paddd %xmm6, %xmm2
1838; SSE-NEXT:    paddd %xmm9, %xmm8
1839; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1840; SSE-NEXT:    movdqa %xmm4, %xmm6
1841; SSE-NEXT:    pxor %xmm3, %xmm6
1842; SSE-NEXT:    movdqa %xmm8, %xmm5
1843; SSE-NEXT:    pxor %xmm3, %xmm5
1844; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
1845; SSE-NEXT:    pand %xmm6, %xmm4
1846; SSE-NEXT:    pandn %xmm8, %xmm6
1847; SSE-NEXT:    por %xmm4, %xmm6
1848; SSE-NEXT:    movdqa %xmm15, %xmm5
1849; SSE-NEXT:    pxor %xmm3, %xmm5
1850; SSE-NEXT:    movdqa %xmm2, %xmm4
1851; SSE-NEXT:    pxor %xmm3, %xmm4
1852; SSE-NEXT:    pcmpgtd %xmm4, %xmm5
1853; SSE-NEXT:    pand %xmm5, %xmm15
1854; SSE-NEXT:    pandn %xmm2, %xmm5
1855; SSE-NEXT:    por %xmm15, %xmm5
1856; SSE-NEXT:    movdqa %xmm14, %xmm2
1857; SSE-NEXT:    pxor %xmm3, %xmm2
1858; SSE-NEXT:    movdqa %xmm1, %xmm4
1859; SSE-NEXT:    pxor %xmm3, %xmm4
1860; SSE-NEXT:    pcmpgtd %xmm4, %xmm2
1861; SSE-NEXT:    pand %xmm2, %xmm14
1862; SSE-NEXT:    pandn %xmm1, %xmm2
1863; SSE-NEXT:    por %xmm14, %xmm2
1864; SSE-NEXT:    movdqa %xmm13, %xmm1
1865; SSE-NEXT:    pxor %xmm3, %xmm1
1866; SSE-NEXT:    movdqa %xmm0, %xmm4
1867; SSE-NEXT:    pxor %xmm3, %xmm4
1868; SSE-NEXT:    pcmpgtd %xmm4, %xmm1
1869; SSE-NEXT:    pand %xmm1, %xmm13
1870; SSE-NEXT:    pandn %xmm0, %xmm1
1871; SSE-NEXT:    por %xmm13, %xmm1
1872; SSE-NEXT:    movdqa %xmm1, %xmm4
1873; SSE-NEXT:    pxor %xmm3, %xmm4
1874; SSE-NEXT:    movdqa %xmm12, %xmm0
1875; SSE-NEXT:    pxor %xmm3, %xmm0
1876; SSE-NEXT:    pcmpgtd %xmm4, %xmm0
1877; SSE-NEXT:    pand %xmm0, %xmm12
1878; SSE-NEXT:    pandn %xmm1, %xmm0
1879; SSE-NEXT:    por %xmm12, %xmm0
1880; SSE-NEXT:    movdqa %xmm2, %xmm4
1881; SSE-NEXT:    pxor %xmm3, %xmm4
1882; SSE-NEXT:    movdqa %xmm11, %xmm1
1883; SSE-NEXT:    pxor %xmm3, %xmm1
1884; SSE-NEXT:    pcmpgtd %xmm4, %xmm1
1885; SSE-NEXT:    pand %xmm1, %xmm11
1886; SSE-NEXT:    pandn %xmm2, %xmm1
1887; SSE-NEXT:    por %xmm11, %xmm1
1888; SSE-NEXT:    movdqa %xmm5, %xmm4
1889; SSE-NEXT:    pxor %xmm3, %xmm4
1890; SSE-NEXT:    movdqa %xmm10, %xmm2
1891; SSE-NEXT:    pxor %xmm3, %xmm2
1892; SSE-NEXT:    pcmpgtd %xmm4, %xmm2
1893; SSE-NEXT:    pand %xmm2, %xmm10
1894; SSE-NEXT:    pandn %xmm5, %xmm2
1895; SSE-NEXT:    por %xmm10, %xmm2
1896; SSE-NEXT:    movdqa %xmm6, %xmm4
1897; SSE-NEXT:    pxor %xmm3, %xmm4
1898; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
1899; SSE-NEXT:    pxor %xmm5, %xmm3
1900; SSE-NEXT:    pcmpgtd %xmm4, %xmm3
1901; SSE-NEXT:    pand %xmm3, %xmm5
1902; SSE-NEXT:    pandn %xmm6, %xmm3
1903; SSE-NEXT:    por %xmm5, %xmm3
1904; SSE-NEXT:    retq
1905;
1906; AVX2-LABEL: reassociate_umax_v16i32:
1907; AVX2:       # %bb.0:
1908; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
1909; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
1910; AVX2-NEXT:    vpmaxud %ymm6, %ymm4, %ymm2
1911; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
1912; AVX2-NEXT:    vpmaxud %ymm7, %ymm5, %ymm2
1913; AVX2-NEXT:    vpmaxud %ymm2, %ymm1, %ymm1
1914; AVX2-NEXT:    retq
1915;
1916; AVX512-LABEL: reassociate_umax_v16i32:
1917; AVX512:       # %bb.0:
1918; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
1919; AVX512-NEXT:    vpmaxud %zmm3, %zmm2, %zmm1
1920; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1921; AVX512-NEXT:    retq
1922
1923  %t0 = add <16 x i32> %x0, %x1
1924  %t1 = icmp ugt <16 x i32> %x2, %t0
1925  %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0
1926  %t3 = icmp ugt <16 x i32> %x3, %t2
1927  %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2
1928  ret <16 x i32> %t4
1929}
1930
1931define <8 x i64> @reassociate_umax_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) {
1932; SSE-LABEL: reassociate_umax_v8i64:
1933; SSE:       # %bb.0:
1934; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
1935; SSE-NEXT:    paddq %xmm4, %xmm0
1936; SSE-NEXT:    paddq %xmm5, %xmm1
1937; SSE-NEXT:    paddq %xmm6, %xmm2
1938; SSE-NEXT:    paddq %xmm7, %xmm3
1939; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1940; SSE-NEXT:    movdqa %xmm8, %xmm5
1941; SSE-NEXT:    pxor %xmm4, %xmm5
1942; SSE-NEXT:    movdqa %xmm3, %xmm6
1943; SSE-NEXT:    pxor %xmm4, %xmm6
1944; SSE-NEXT:    movdqa %xmm5, %xmm7
1945; SSE-NEXT:    pcmpgtd %xmm6, %xmm7
1946; SSE-NEXT:    pcmpeqd %xmm5, %xmm6
1947; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1948; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1949; SSE-NEXT:    pand %xmm5, %xmm6
1950; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
1951; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
1952; SSE-NEXT:    por %xmm6, %xmm9
1953; SSE-NEXT:    pand %xmm9, %xmm8
1954; SSE-NEXT:    pandn %xmm3, %xmm9
1955; SSE-NEXT:    por %xmm8, %xmm9
1956; SSE-NEXT:    movdqa %xmm5, %xmm3
1957; SSE-NEXT:    pxor %xmm4, %xmm3
1958; SSE-NEXT:    movdqa %xmm2, %xmm6
1959; SSE-NEXT:    pxor %xmm4, %xmm6
1960; SSE-NEXT:    movdqa %xmm3, %xmm7
1961; SSE-NEXT:    pcmpgtd %xmm6, %xmm7
1962; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
1963; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
1964; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1965; SSE-NEXT:    pand %xmm3, %xmm6
1966; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3
1967; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
1968; SSE-NEXT:    por %xmm6, %xmm8
1969; SSE-NEXT:    pand %xmm8, %xmm5
1970; SSE-NEXT:    pandn %xmm2, %xmm8
1971; SSE-NEXT:    por %xmm5, %xmm8
1972; SSE-NEXT:    movdqa %xmm3, %xmm2
1973; SSE-NEXT:    pxor %xmm4, %xmm2
1974; SSE-NEXT:    movdqa %xmm1, %xmm5
1975; SSE-NEXT:    pxor %xmm4, %xmm5
1976; SSE-NEXT:    movdqa %xmm2, %xmm6
1977; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
1978; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
1979; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
1980; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1981; SSE-NEXT:    pand %xmm2, %xmm5
1982; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
1983; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1984; SSE-NEXT:    por %xmm5, %xmm2
1985; SSE-NEXT:    pand %xmm2, %xmm3
1986; SSE-NEXT:    pandn %xmm1, %xmm2
1987; SSE-NEXT:    por %xmm3, %xmm2
1988; SSE-NEXT:    movdqa %xmm7, %xmm1
1989; SSE-NEXT:    pxor %xmm4, %xmm1
1990; SSE-NEXT:    movdqa %xmm0, %xmm3
1991; SSE-NEXT:    pxor %xmm4, %xmm3
1992; SSE-NEXT:    movdqa %xmm1, %xmm5
1993; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
1994; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
1995; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
1996; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1997; SSE-NEXT:    pand %xmm1, %xmm3
1998; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm1
1999; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2000; SSE-NEXT:    por %xmm3, %xmm5
2001; SSE-NEXT:    pand %xmm5, %xmm7
2002; SSE-NEXT:    pandn %xmm0, %xmm5
2003; SSE-NEXT:    por %xmm7, %xmm5
2004; SSE-NEXT:    movdqa %xmm5, %xmm0
2005; SSE-NEXT:    pxor %xmm4, %xmm0
2006; SSE-NEXT:    movdqa %xmm1, %xmm3
2007; SSE-NEXT:    pxor %xmm4, %xmm3
2008; SSE-NEXT:    movdqa %xmm3, %xmm6
2009; SSE-NEXT:    pcmpgtd %xmm0, %xmm6
2010; SSE-NEXT:    pcmpeqd %xmm0, %xmm3
2011; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2012; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2013; SSE-NEXT:    pand %xmm0, %xmm3
2014; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
2015; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2016; SSE-NEXT:    por %xmm3, %xmm0
2017; SSE-NEXT:    pand %xmm0, %xmm1
2018; SSE-NEXT:    pandn %xmm5, %xmm0
2019; SSE-NEXT:    por %xmm1, %xmm0
2020; SSE-NEXT:    movdqa %xmm2, %xmm1
2021; SSE-NEXT:    pxor %xmm4, %xmm1
2022; SSE-NEXT:    movdqa %xmm7, %xmm3
2023; SSE-NEXT:    pxor %xmm4, %xmm3
2024; SSE-NEXT:    movdqa %xmm3, %xmm5
2025; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
2026; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
2027; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
2028; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2029; SSE-NEXT:    pand %xmm1, %xmm3
2030; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm6
2031; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
2032; SSE-NEXT:    por %xmm3, %xmm1
2033; SSE-NEXT:    pand %xmm1, %xmm7
2034; SSE-NEXT:    pandn %xmm2, %xmm1
2035; SSE-NEXT:    por %xmm7, %xmm1
2036; SSE-NEXT:    movdqa %xmm8, %xmm2
2037; SSE-NEXT:    pxor %xmm4, %xmm2
2038; SSE-NEXT:    movdqa %xmm6, %xmm3
2039; SSE-NEXT:    pxor %xmm4, %xmm3
2040; SSE-NEXT:    movdqa %xmm3, %xmm5
2041; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
2042; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
2043; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
2044; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2045; SSE-NEXT:    pand %xmm2, %xmm3
2046; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
2047; SSE-NEXT:    por %xmm3, %xmm2
2048; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
2049; SSE-NEXT:    pand %xmm2, %xmm6
2050; SSE-NEXT:    pandn %xmm8, %xmm2
2051; SSE-NEXT:    por %xmm6, %xmm2
2052; SSE-NEXT:    movdqa %xmm9, %xmm3
2053; SSE-NEXT:    pxor %xmm4, %xmm3
2054; SSE-NEXT:    pxor %xmm5, %xmm4
2055; SSE-NEXT:    movdqa %xmm4, %xmm6
2056; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
2057; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
2058; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
2059; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2060; SSE-NEXT:    pand %xmm3, %xmm4
2061; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2062; SSE-NEXT:    por %xmm4, %xmm3
2063; SSE-NEXT:    pand %xmm3, %xmm5
2064; SSE-NEXT:    pandn %xmm9, %xmm3
2065; SSE-NEXT:    por %xmm5, %xmm3
2066; SSE-NEXT:    retq
2067;
2068; AVX2-LABEL: reassociate_umax_v8i64:
2069; AVX2:       # %bb.0:
2070; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
2071; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2072; AVX2-NEXT:    vpxor %ymm3, %ymm5, %ymm8
2073; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm9
2074; AVX2-NEXT:    vpcmpgtq %ymm9, %ymm8, %ymm8
2075; AVX2-NEXT:    vblendvpd %ymm8, %ymm5, %ymm1, %ymm1
2076; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
2077; AVX2-NEXT:    vpxor %ymm3, %ymm4, %ymm2
2078; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm5
2079; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm2, %ymm2
2080; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm0, %ymm0
2081; AVX2-NEXT:    vxorpd %ymm3, %ymm0, %ymm2
2082; AVX2-NEXT:    vpxor %ymm3, %ymm6, %ymm4
2083; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
2084; AVX2-NEXT:    vblendvpd %ymm2, %ymm6, %ymm0, %ymm0
2085; AVX2-NEXT:    vxorpd %ymm3, %ymm1, %ymm2
2086; AVX2-NEXT:    vpxor %ymm3, %ymm7, %ymm3
2087; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
2088; AVX2-NEXT:    vblendvpd %ymm2, %ymm7, %ymm1, %ymm1
2089; AVX2-NEXT:    retq
2090;
2091; AVX512-LABEL: reassociate_umax_v8i64:
2092; AVX512:       # %bb.0:
2093; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
2094; AVX512-NEXT:    vpmaxuq %zmm3, %zmm2, %zmm1
2095; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
2096; AVX512-NEXT:    retq
2097
2098  %t0 = add <8 x i64> %x0, %x1
2099  %t1 = icmp ugt <8 x i64> %x2, %t0
2100  %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0
2101  %t3 = icmp ugt <8 x i64> %x3, %t2
2102  %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2
2103  ret <8 x i64> %t4
2104}
2105
2106define <64 x i8> @reassociate_smax_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) {
2107; SSE-LABEL: reassociate_smax_v64i8:
2108; SSE:       # %bb.0:
2109; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2110; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
2111; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
2112; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
2113; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
2114; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
2115; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
2116; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
2117; SSE-NEXT:    paddb %xmm4, %xmm0
2118; SSE-NEXT:    paddb %xmm5, %xmm1
2119; SSE-NEXT:    paddb %xmm6, %xmm2
2120; SSE-NEXT:    paddb %xmm7, %xmm3
2121; SSE-NEXT:    movdqa %xmm15, %xmm4
2122; SSE-NEXT:    pcmpgtb %xmm3, %xmm4
2123; SSE-NEXT:    pand %xmm4, %xmm15
2124; SSE-NEXT:    pandn %xmm3, %xmm4
2125; SSE-NEXT:    por %xmm15, %xmm4
2126; SSE-NEXT:    movdqa %xmm14, %xmm3
2127; SSE-NEXT:    pcmpgtb %xmm2, %xmm3
2128; SSE-NEXT:    pand %xmm3, %xmm14
2129; SSE-NEXT:    pandn %xmm2, %xmm3
2130; SSE-NEXT:    por %xmm14, %xmm3
2131; SSE-NEXT:    movdqa %xmm13, %xmm2
2132; SSE-NEXT:    pcmpgtb %xmm1, %xmm2
2133; SSE-NEXT:    pand %xmm2, %xmm13
2134; SSE-NEXT:    pandn %xmm1, %xmm2
2135; SSE-NEXT:    por %xmm13, %xmm2
2136; SSE-NEXT:    movdqa %xmm12, %xmm1
2137; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
2138; SSE-NEXT:    pand %xmm1, %xmm12
2139; SSE-NEXT:    pandn %xmm0, %xmm1
2140; SSE-NEXT:    por %xmm12, %xmm1
2141; SSE-NEXT:    movdqa %xmm11, %xmm0
2142; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
2143; SSE-NEXT:    pand %xmm0, %xmm11
2144; SSE-NEXT:    pandn %xmm1, %xmm0
2145; SSE-NEXT:    por %xmm11, %xmm0
2146; SSE-NEXT:    movdqa %xmm10, %xmm1
2147; SSE-NEXT:    pcmpgtb %xmm2, %xmm1
2148; SSE-NEXT:    pand %xmm1, %xmm10
2149; SSE-NEXT:    pandn %xmm2, %xmm1
2150; SSE-NEXT:    por %xmm10, %xmm1
2151; SSE-NEXT:    movdqa %xmm9, %xmm2
2152; SSE-NEXT:    pcmpgtb %xmm3, %xmm2
2153; SSE-NEXT:    pand %xmm2, %xmm9
2154; SSE-NEXT:    pandn %xmm3, %xmm2
2155; SSE-NEXT:    por %xmm9, %xmm2
2156; SSE-NEXT:    movdqa %xmm8, %xmm3
2157; SSE-NEXT:    pcmpgtb %xmm4, %xmm3
2158; SSE-NEXT:    pand %xmm3, %xmm8
2159; SSE-NEXT:    pandn %xmm4, %xmm3
2160; SSE-NEXT:    por %xmm8, %xmm3
2161; SSE-NEXT:    retq
2162;
2163; AVX2-LABEL: reassociate_smax_v64i8:
2164; AVX2:       # %bb.0:
2165; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
2166; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
2167; AVX2-NEXT:    vpmaxsb %ymm6, %ymm4, %ymm2
2168; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
2169; AVX2-NEXT:    vpmaxsb %ymm7, %ymm5, %ymm2
2170; AVX2-NEXT:    vpmaxsb %ymm2, %ymm1, %ymm1
2171; AVX2-NEXT:    retq
2172;
2173; AVX512-LABEL: reassociate_smax_v64i8:
2174; AVX512:       # %bb.0:
2175; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
2176; AVX512-NEXT:    vpmaxsb %zmm3, %zmm2, %zmm1
2177; AVX512-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
2178; AVX512-NEXT:    retq
2179
2180  %t0 = add <64 x i8> %x0, %x1
2181  %t1 = icmp sgt <64 x i8> %x2, %t0
2182  %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0
2183  %t3 = icmp sgt <64 x i8> %x3, %t2
2184  %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2
2185  ret <64 x i8> %t4
2186}
2187
2188define <32 x i16> @reassociate_smax_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) {
2189; SSE-LABEL: reassociate_smax_v32i16:
2190; SSE:       # %bb.0:
2191; SSE-NEXT:    paddw %xmm4, %xmm0
2192; SSE-NEXT:    paddw %xmm5, %xmm1
2193; SSE-NEXT:    paddw %xmm6, %xmm2
2194; SSE-NEXT:    paddw %xmm7, %xmm3
2195; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm3
2196; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm2
2197; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm1
2198; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm0
2199; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm0
2200; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm1
2201; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm2
2202; SSE-NEXT:    pmaxsw {{[0-9]+}}(%rsp), %xmm3
2203; SSE-NEXT:    retq
2204;
2205; AVX2-LABEL: reassociate_smax_v32i16:
2206; AVX2:       # %bb.0:
2207; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
2208; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
2209; AVX2-NEXT:    vpmaxsw %ymm6, %ymm4, %ymm2
2210; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
2211; AVX2-NEXT:    vpmaxsw %ymm7, %ymm5, %ymm2
2212; AVX2-NEXT:    vpmaxsw %ymm2, %ymm1, %ymm1
2213; AVX2-NEXT:    retq
2214;
2215; AVX512-LABEL: reassociate_smax_v32i16:
2216; AVX512:       # %bb.0:
2217; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
2218; AVX512-NEXT:    vpmaxsw %zmm3, %zmm2, %zmm1
2219; AVX512-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
2220; AVX512-NEXT:    retq
2221
2222  %t0 = add <32 x i16> %x0, %x1
2223  %t1 = icmp sgt <32 x i16> %x2, %t0
2224  %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0
2225  %t3 = icmp sgt <32 x i16> %x3, %t2
2226  %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2
2227  ret <32 x i16> %t4
2228}
2229
2230define <16 x i32> @reassociate_smax_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
2231; SSE-LABEL: reassociate_smax_v16i32:
2232; SSE:       # %bb.0:
2233; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2234; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
2235; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
2236; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
2237; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
2238; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
2239; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
2240; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
2241; SSE-NEXT:    paddd %xmm4, %xmm0
2242; SSE-NEXT:    paddd %xmm5, %xmm1
2243; SSE-NEXT:    paddd %xmm6, %xmm2
2244; SSE-NEXT:    paddd %xmm7, %xmm3
2245; SSE-NEXT:    movdqa %xmm15, %xmm4
2246; SSE-NEXT:    pcmpgtd %xmm3, %xmm4
2247; SSE-NEXT:    pand %xmm4, %xmm15
2248; SSE-NEXT:    pandn %xmm3, %xmm4
2249; SSE-NEXT:    por %xmm15, %xmm4
2250; SSE-NEXT:    movdqa %xmm14, %xmm3
2251; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
2252; SSE-NEXT:    pand %xmm3, %xmm14
2253; SSE-NEXT:    pandn %xmm2, %xmm3
2254; SSE-NEXT:    por %xmm14, %xmm3
2255; SSE-NEXT:    movdqa %xmm13, %xmm2
2256; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
2257; SSE-NEXT:    pand %xmm2, %xmm13
2258; SSE-NEXT:    pandn %xmm1, %xmm2
2259; SSE-NEXT:    por %xmm13, %xmm2
2260; SSE-NEXT:    movdqa %xmm12, %xmm1
2261; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
2262; SSE-NEXT:    pand %xmm1, %xmm12
2263; SSE-NEXT:    pandn %xmm0, %xmm1
2264; SSE-NEXT:    por %xmm12, %xmm1
2265; SSE-NEXT:    movdqa %xmm11, %xmm0
2266; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
2267; SSE-NEXT:    pand %xmm0, %xmm11
2268; SSE-NEXT:    pandn %xmm1, %xmm0
2269; SSE-NEXT:    por %xmm11, %xmm0
2270; SSE-NEXT:    movdqa %xmm10, %xmm1
2271; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
2272; SSE-NEXT:    pand %xmm1, %xmm10
2273; SSE-NEXT:    pandn %xmm2, %xmm1
2274; SSE-NEXT:    por %xmm10, %xmm1
2275; SSE-NEXT:    movdqa %xmm9, %xmm2
2276; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
2277; SSE-NEXT:    pand %xmm2, %xmm9
2278; SSE-NEXT:    pandn %xmm3, %xmm2
2279; SSE-NEXT:    por %xmm9, %xmm2
2280; SSE-NEXT:    movdqa %xmm8, %xmm3
2281; SSE-NEXT:    pcmpgtd %xmm4, %xmm3
2282; SSE-NEXT:    pand %xmm3, %xmm8
2283; SSE-NEXT:    pandn %xmm4, %xmm3
2284; SSE-NEXT:    por %xmm8, %xmm3
2285; SSE-NEXT:    retq
2286;
2287; AVX2-LABEL: reassociate_smax_v16i32:
2288; AVX2:       # %bb.0:
2289; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
2290; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
2291; AVX2-NEXT:    vpmaxsd %ymm6, %ymm4, %ymm2
2292; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
2293; AVX2-NEXT:    vpmaxsd %ymm7, %ymm5, %ymm2
2294; AVX2-NEXT:    vpmaxsd %ymm2, %ymm1, %ymm1
2295; AVX2-NEXT:    retq
2296;
2297; AVX512-LABEL: reassociate_smax_v16i32:
2298; AVX512:       # %bb.0:
2299; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
2300; AVX512-NEXT:    vpmaxsd %zmm3, %zmm2, %zmm1
2301; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
2302; AVX512-NEXT:    retq
2303
2304  %t0 = add <16 x i32> %x0, %x1
2305  %t1 = icmp sgt <16 x i32> %x2, %t0
2306  %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0
2307  %t3 = icmp sgt <16 x i32> %x3, %t2
2308  %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2
2309  ret <16 x i32> %t4
2310}
2311
2312define <8 x i64> @reassociate_smax_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) {
2313; SSE-LABEL: reassociate_smax_v8i64:
2314; SSE:       # %bb.0:
2315; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2316; SSE-NEXT:    paddq %xmm4, %xmm0
2317; SSE-NEXT:    paddq %xmm5, %xmm1
2318; SSE-NEXT:    paddq %xmm6, %xmm2
2319; SSE-NEXT:    paddq %xmm7, %xmm3
2320; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
2321; SSE-NEXT:    movdqa %xmm8, %xmm5
2322; SSE-NEXT:    pxor %xmm4, %xmm5
2323; SSE-NEXT:    movdqa %xmm3, %xmm6
2324; SSE-NEXT:    pxor %xmm4, %xmm6
2325; SSE-NEXT:    movdqa %xmm5, %xmm7
2326; SSE-NEXT:    pcmpgtd %xmm6, %xmm7
2327; SSE-NEXT:    pcmpeqd %xmm5, %xmm6
2328; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
2329; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2330; SSE-NEXT:    pand %xmm5, %xmm6
2331; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
2332; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
2333; SSE-NEXT:    por %xmm6, %xmm9
2334; SSE-NEXT:    pand %xmm9, %xmm8
2335; SSE-NEXT:    pandn %xmm3, %xmm9
2336; SSE-NEXT:    por %xmm8, %xmm9
2337; SSE-NEXT:    movdqa %xmm5, %xmm3
2338; SSE-NEXT:    pxor %xmm4, %xmm3
2339; SSE-NEXT:    movdqa %xmm2, %xmm6
2340; SSE-NEXT:    pxor %xmm4, %xmm6
2341; SSE-NEXT:    movdqa %xmm3, %xmm7
2342; SSE-NEXT:    pcmpgtd %xmm6, %xmm7
2343; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
2344; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
2345; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2346; SSE-NEXT:    pand %xmm3, %xmm6
2347; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3
2348; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
2349; SSE-NEXT:    por %xmm6, %xmm8
2350; SSE-NEXT:    pand %xmm8, %xmm5
2351; SSE-NEXT:    pandn %xmm2, %xmm8
2352; SSE-NEXT:    por %xmm5, %xmm8
2353; SSE-NEXT:    movdqa %xmm3, %xmm2
2354; SSE-NEXT:    pxor %xmm4, %xmm2
2355; SSE-NEXT:    movdqa %xmm1, %xmm5
2356; SSE-NEXT:    pxor %xmm4, %xmm5
2357; SSE-NEXT:    movdqa %xmm2, %xmm6
2358; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
2359; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
2360; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
2361; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2362; SSE-NEXT:    pand %xmm2, %xmm5
2363; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
2364; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
2365; SSE-NEXT:    por %xmm5, %xmm2
2366; SSE-NEXT:    pand %xmm2, %xmm3
2367; SSE-NEXT:    pandn %xmm1, %xmm2
2368; SSE-NEXT:    por %xmm3, %xmm2
2369; SSE-NEXT:    movdqa %xmm7, %xmm1
2370; SSE-NEXT:    pxor %xmm4, %xmm1
2371; SSE-NEXT:    movdqa %xmm0, %xmm3
2372; SSE-NEXT:    pxor %xmm4, %xmm3
2373; SSE-NEXT:    movdqa %xmm1, %xmm5
2374; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
2375; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
2376; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
2377; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2378; SSE-NEXT:    pand %xmm1, %xmm3
2379; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm1
2380; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2381; SSE-NEXT:    por %xmm3, %xmm5
2382; SSE-NEXT:    pand %xmm5, %xmm7
2383; SSE-NEXT:    pandn %xmm0, %xmm5
2384; SSE-NEXT:    por %xmm7, %xmm5
2385; SSE-NEXT:    movdqa %xmm5, %xmm0
2386; SSE-NEXT:    pxor %xmm4, %xmm0
2387; SSE-NEXT:    movdqa %xmm1, %xmm3
2388; SSE-NEXT:    pxor %xmm4, %xmm3
2389; SSE-NEXT:    movdqa %xmm3, %xmm6
2390; SSE-NEXT:    pcmpgtd %xmm0, %xmm6
2391; SSE-NEXT:    pcmpeqd %xmm0, %xmm3
2392; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2393; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2394; SSE-NEXT:    pand %xmm0, %xmm3
2395; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
2396; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2397; SSE-NEXT:    por %xmm3, %xmm0
2398; SSE-NEXT:    pand %xmm0, %xmm1
2399; SSE-NEXT:    pandn %xmm5, %xmm0
2400; SSE-NEXT:    por %xmm1, %xmm0
2401; SSE-NEXT:    movdqa %xmm2, %xmm1
2402; SSE-NEXT:    pxor %xmm4, %xmm1
2403; SSE-NEXT:    movdqa %xmm7, %xmm3
2404; SSE-NEXT:    pxor %xmm4, %xmm3
2405; SSE-NEXT:    movdqa %xmm3, %xmm5
2406; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
2407; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
2408; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
2409; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2410; SSE-NEXT:    pand %xmm1, %xmm3
2411; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm6
2412; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
2413; SSE-NEXT:    por %xmm3, %xmm1
2414; SSE-NEXT:    pand %xmm1, %xmm7
2415; SSE-NEXT:    pandn %xmm2, %xmm1
2416; SSE-NEXT:    por %xmm7, %xmm1
2417; SSE-NEXT:    movdqa %xmm8, %xmm2
2418; SSE-NEXT:    pxor %xmm4, %xmm2
2419; SSE-NEXT:    movdqa %xmm6, %xmm3
2420; SSE-NEXT:    pxor %xmm4, %xmm3
2421; SSE-NEXT:    movdqa %xmm3, %xmm5
2422; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
2423; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
2424; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
2425; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2426; SSE-NEXT:    pand %xmm2, %xmm3
2427; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
2428; SSE-NEXT:    por %xmm3, %xmm2
2429; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
2430; SSE-NEXT:    pand %xmm2, %xmm6
2431; SSE-NEXT:    pandn %xmm8, %xmm2
2432; SSE-NEXT:    por %xmm6, %xmm2
2433; SSE-NEXT:    movdqa %xmm9, %xmm3
2434; SSE-NEXT:    pxor %xmm4, %xmm3
2435; SSE-NEXT:    pxor %xmm5, %xmm4
2436; SSE-NEXT:    movdqa %xmm4, %xmm6
2437; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
2438; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
2439; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
2440; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2441; SSE-NEXT:    pand %xmm3, %xmm4
2442; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2443; SSE-NEXT:    por %xmm4, %xmm3
2444; SSE-NEXT:    pand %xmm3, %xmm5
2445; SSE-NEXT:    pandn %xmm9, %xmm3
2446; SSE-NEXT:    por %xmm5, %xmm3
2447; SSE-NEXT:    retq
2448;
2449; AVX2-LABEL: reassociate_smax_v8i64:
2450; AVX2:       # %bb.0:
2451; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
2452; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm5, %ymm3
2453; AVX2-NEXT:    vblendvpd %ymm3, %ymm5, %ymm1, %ymm1
2454; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
2455; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm2
2456; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm0, %ymm0
2457; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm6, %ymm2
2458; AVX2-NEXT:    vblendvpd %ymm2, %ymm6, %ymm0, %ymm0
2459; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm7, %ymm2
2460; AVX2-NEXT:    vblendvpd %ymm2, %ymm7, %ymm1, %ymm1
2461; AVX2-NEXT:    retq
2462;
2463; AVX512-LABEL: reassociate_smax_v8i64:
2464; AVX512:       # %bb.0:
2465; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
2466; AVX512-NEXT:    vpmaxsq %zmm3, %zmm2, %zmm1
2467; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
2468; AVX512-NEXT:    retq
2469
2470  %t0 = add <8 x i64> %x0, %x1
2471  %t1 = icmp sgt <8 x i64> %x2, %t0
2472  %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0
2473  %t3 = icmp sgt <8 x i64> %x3, %t2
2474  %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2
2475  ret <8 x i64> %t4
2476}
2477
2478define <64 x i8> @reassociate_umin_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) {
2479; SSE-LABEL: reassociate_umin_v64i8:
2480; SSE:       # %bb.0:
2481; SSE-NEXT:    paddb %xmm4, %xmm0
2482; SSE-NEXT:    paddb %xmm5, %xmm1
2483; SSE-NEXT:    paddb %xmm6, %xmm2
2484; SSE-NEXT:    paddb %xmm7, %xmm3
2485; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm3
2486; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm2
2487; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm1
2488; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm0
2489; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm0
2490; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm1
2491; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm2
2492; SSE-NEXT:    pminub {{[0-9]+}}(%rsp), %xmm3
2493; SSE-NEXT:    retq
2494;
2495; AVX2-LABEL: reassociate_umin_v64i8:
2496; AVX2:       # %bb.0:
2497; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
2498; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
2499; AVX2-NEXT:    vpminub %ymm6, %ymm4, %ymm2
2500; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
2501; AVX2-NEXT:    vpminub %ymm7, %ymm5, %ymm2
2502; AVX2-NEXT:    vpminub %ymm2, %ymm1, %ymm1
2503; AVX2-NEXT:    retq
2504;
2505; AVX512-LABEL: reassociate_umin_v64i8:
2506; AVX512:       # %bb.0:
2507; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
2508; AVX512-NEXT:    vpminub %zmm3, %zmm2, %zmm1
2509; AVX512-NEXT:    vpminub %zmm1, %zmm0, %zmm0
2510; AVX512-NEXT:    retq
2511
2512  %t0 = add <64 x i8> %x0, %x1
2513  %t1 = icmp ult <64 x i8> %x2, %t0
2514  %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0
2515  %t3 = icmp ult <64 x i8> %x3, %t2
2516  %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2
2517  ret <64 x i8> %t4
2518}
2519
2520define <32 x i16> @reassociate_umin_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) {
2521; SSE-LABEL: reassociate_umin_v32i16:
2522; SSE:       # %bb.0:
2523; SSE-NEXT:    movdqa %xmm3, %xmm8
2524; SSE-NEXT:    movdqa %xmm2, %xmm9
2525; SSE-NEXT:    movdqa %xmm1, %xmm10
2526; SSE-NEXT:    movdqa %xmm0, %xmm11
2527; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3
2528; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm2
2529; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm1
2530; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0
2531; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
2532; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
2533; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
2534; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
2535; SSE-NEXT:    paddw %xmm4, %xmm11
2536; SSE-NEXT:    paddw %xmm5, %xmm10
2537; SSE-NEXT:    paddw %xmm6, %xmm9
2538; SSE-NEXT:    paddw %xmm7, %xmm8
2539; SSE-NEXT:    movdqa %xmm12, %xmm4
2540; SSE-NEXT:    psubusw %xmm8, %xmm4
2541; SSE-NEXT:    psubw %xmm4, %xmm12
2542; SSE-NEXT:    movdqa %xmm13, %xmm4
2543; SSE-NEXT:    psubusw %xmm9, %xmm4
2544; SSE-NEXT:    psubw %xmm4, %xmm13
2545; SSE-NEXT:    movdqa %xmm15, %xmm4
2546; SSE-NEXT:    psubusw %xmm10, %xmm4
2547; SSE-NEXT:    psubw %xmm4, %xmm15
2548; SSE-NEXT:    movdqa %xmm14, %xmm4
2549; SSE-NEXT:    psubusw %xmm11, %xmm4
2550; SSE-NEXT:    psubw %xmm4, %xmm14
2551; SSE-NEXT:    movdqa %xmm0, %xmm4
2552; SSE-NEXT:    psubusw %xmm14, %xmm4
2553; SSE-NEXT:    psubw %xmm4, %xmm0
2554; SSE-NEXT:    movdqa %xmm1, %xmm4
2555; SSE-NEXT:    psubusw %xmm15, %xmm4
2556; SSE-NEXT:    psubw %xmm4, %xmm1
2557; SSE-NEXT:    movdqa %xmm2, %xmm4
2558; SSE-NEXT:    psubusw %xmm13, %xmm4
2559; SSE-NEXT:    psubw %xmm4, %xmm2
2560; SSE-NEXT:    movdqa %xmm3, %xmm4
2561; SSE-NEXT:    psubusw %xmm12, %xmm4
2562; SSE-NEXT:    psubw %xmm4, %xmm3
2563; SSE-NEXT:    retq
2564;
2565; AVX2-LABEL: reassociate_umin_v32i16:
2566; AVX2:       # %bb.0:
2567; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
2568; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
2569; AVX2-NEXT:    vpminuw %ymm6, %ymm4, %ymm2
2570; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
2571; AVX2-NEXT:    vpminuw %ymm7, %ymm5, %ymm2
2572; AVX2-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
2573; AVX2-NEXT:    retq
2574;
2575; AVX512-LABEL: reassociate_umin_v32i16:
2576; AVX512:       # %bb.0:
2577; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
2578; AVX512-NEXT:    vpminuw %zmm3, %zmm2, %zmm1
2579; AVX512-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
2580; AVX512-NEXT:    retq
2581
2582  %t0 = add <32 x i16> %x0, %x1
2583  %t1 = icmp ult <32 x i16> %x2, %t0
2584  %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0
2585  %t3 = icmp ult <32 x i16> %x3, %t2
2586  %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2
2587  ret <32 x i16> %t4
2588}
2589
2590define <16 x i32> @reassociate_umin_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
2591; SSE-LABEL: reassociate_umin_v16i32:
2592; SSE:       # %bb.0:
2593; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2594; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
2595; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
2596; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
2597; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
2598; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
2599; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
2600; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
2601; SSE-NEXT:    paddd %xmm4, %xmm0
2602; SSE-NEXT:    paddd %xmm5, %xmm1
2603; SSE-NEXT:    paddd %xmm6, %xmm2
2604; SSE-NEXT:    paddd %xmm7, %xmm3
2605; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
2606; SSE-NEXT:    movdqa %xmm15, %xmm6
2607; SSE-NEXT:    pxor %xmm5, %xmm6
2608; SSE-NEXT:    movdqa %xmm3, %xmm4
2609; SSE-NEXT:    pxor %xmm5, %xmm4
2610; SSE-NEXT:    pcmpgtd %xmm6, %xmm4
2611; SSE-NEXT:    pand %xmm4, %xmm15
2612; SSE-NEXT:    pandn %xmm3, %xmm4
2613; SSE-NEXT:    por %xmm15, %xmm4
2614; SSE-NEXT:    movdqa %xmm14, %xmm6
2615; SSE-NEXT:    pxor %xmm5, %xmm6
2616; SSE-NEXT:    movdqa %xmm2, %xmm3
2617; SSE-NEXT:    pxor %xmm5, %xmm3
2618; SSE-NEXT:    pcmpgtd %xmm6, %xmm3
2619; SSE-NEXT:    pand %xmm3, %xmm14
2620; SSE-NEXT:    pandn %xmm2, %xmm3
2621; SSE-NEXT:    por %xmm14, %xmm3
2622; SSE-NEXT:    movdqa %xmm13, %xmm6
2623; SSE-NEXT:    pxor %xmm5, %xmm6
2624; SSE-NEXT:    movdqa %xmm1, %xmm2
2625; SSE-NEXT:    pxor %xmm5, %xmm2
2626; SSE-NEXT:    pcmpgtd %xmm6, %xmm2
2627; SSE-NEXT:    pand %xmm2, %xmm13
2628; SSE-NEXT:    pandn %xmm1, %xmm2
2629; SSE-NEXT:    por %xmm13, %xmm2
2630; SSE-NEXT:    movdqa %xmm12, %xmm1
2631; SSE-NEXT:    pxor %xmm5, %xmm1
2632; SSE-NEXT:    movdqa %xmm0, %xmm6
2633; SSE-NEXT:    pxor %xmm5, %xmm6
2634; SSE-NEXT:    pcmpgtd %xmm1, %xmm6
2635; SSE-NEXT:    pand %xmm6, %xmm12
2636; SSE-NEXT:    pandn %xmm0, %xmm6
2637; SSE-NEXT:    por %xmm12, %xmm6
2638; SSE-NEXT:    movdqa %xmm6, %xmm0
2639; SSE-NEXT:    pxor %xmm5, %xmm0
2640; SSE-NEXT:    movdqa %xmm11, %xmm1
2641; SSE-NEXT:    pxor %xmm5, %xmm1
2642; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
2643; SSE-NEXT:    pand %xmm0, %xmm11
2644; SSE-NEXT:    pandn %xmm6, %xmm0
2645; SSE-NEXT:    por %xmm11, %xmm0
2646; SSE-NEXT:    movdqa %xmm2, %xmm1
2647; SSE-NEXT:    pxor %xmm5, %xmm1
2648; SSE-NEXT:    movdqa %xmm10, %xmm6
2649; SSE-NEXT:    pxor %xmm5, %xmm6
2650; SSE-NEXT:    pcmpgtd %xmm6, %xmm1
2651; SSE-NEXT:    pand %xmm1, %xmm10
2652; SSE-NEXT:    pandn %xmm2, %xmm1
2653; SSE-NEXT:    por %xmm10, %xmm1
2654; SSE-NEXT:    movdqa %xmm3, %xmm2
2655; SSE-NEXT:    pxor %xmm5, %xmm2
2656; SSE-NEXT:    movdqa %xmm9, %xmm6
2657; SSE-NEXT:    pxor %xmm5, %xmm6
2658; SSE-NEXT:    pcmpgtd %xmm6, %xmm2
2659; SSE-NEXT:    pand %xmm2, %xmm9
2660; SSE-NEXT:    pandn %xmm3, %xmm2
2661; SSE-NEXT:    por %xmm9, %xmm2
2662; SSE-NEXT:    movdqa %xmm4, %xmm3
2663; SSE-NEXT:    pxor %xmm5, %xmm3
2664; SSE-NEXT:    pxor %xmm8, %xmm5
2665; SSE-NEXT:    pcmpgtd %xmm5, %xmm3
2666; SSE-NEXT:    pand %xmm3, %xmm8
2667; SSE-NEXT:    pandn %xmm4, %xmm3
2668; SSE-NEXT:    por %xmm8, %xmm3
2669; SSE-NEXT:    retq
2670;
2671; AVX2-LABEL: reassociate_umin_v16i32:
2672; AVX2:       # %bb.0:
2673; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
2674; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
2675; AVX2-NEXT:    vpminud %ymm6, %ymm4, %ymm2
2676; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
2677; AVX2-NEXT:    vpminud %ymm7, %ymm5, %ymm2
2678; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
2679; AVX2-NEXT:    retq
2680;
2681; AVX512-LABEL: reassociate_umin_v16i32:
2682; AVX512:       # %bb.0:
2683; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
2684; AVX512-NEXT:    vpminud %zmm3, %zmm2, %zmm1
2685; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
2686; AVX512-NEXT:    retq
2687
2688  %t0 = add <16 x i32> %x0, %x1
2689  %t1 = icmp ult <16 x i32> %x2, %t0
2690  %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0
2691  %t3 = icmp ult <16 x i32> %x3, %t2
2692  %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2
2693  ret <16 x i32> %t4
2694}
2695
2696define <8 x i64> @reassociate_umin_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) {
2697; SSE-LABEL: reassociate_umin_v8i64:
2698; SSE:       # %bb.0:
2699; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2700; SSE-NEXT:    paddq %xmm4, %xmm0
2701; SSE-NEXT:    paddq %xmm5, %xmm1
2702; SSE-NEXT:    paddq %xmm6, %xmm2
2703; SSE-NEXT:    paddq %xmm7, %xmm3
2704; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2705; SSE-NEXT:    movdqa %xmm8, %xmm5
2706; SSE-NEXT:    pxor %xmm4, %xmm5
2707; SSE-NEXT:    movdqa %xmm3, %xmm6
2708; SSE-NEXT:    pxor %xmm4, %xmm6
2709; SSE-NEXT:    movdqa %xmm6, %xmm7
2710; SSE-NEXT:    pcmpgtd %xmm5, %xmm7
2711; SSE-NEXT:    pcmpeqd %xmm5, %xmm6
2712; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
2713; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2714; SSE-NEXT:    pand %xmm5, %xmm6
2715; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
2716; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
2717; SSE-NEXT:    por %xmm6, %xmm9
2718; SSE-NEXT:    pand %xmm9, %xmm8
2719; SSE-NEXT:    pandn %xmm3, %xmm9
2720; SSE-NEXT:    por %xmm8, %xmm9
2721; SSE-NEXT:    movdqa %xmm5, %xmm3
2722; SSE-NEXT:    pxor %xmm4, %xmm3
2723; SSE-NEXT:    movdqa %xmm2, %xmm6
2724; SSE-NEXT:    pxor %xmm4, %xmm6
2725; SSE-NEXT:    movdqa %xmm6, %xmm7
2726; SSE-NEXT:    pcmpgtd %xmm3, %xmm7
2727; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
2728; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
2729; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2730; SSE-NEXT:    pand %xmm3, %xmm6
2731; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3
2732; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
2733; SSE-NEXT:    por %xmm6, %xmm8
2734; SSE-NEXT:    pand %xmm8, %xmm5
2735; SSE-NEXT:    pandn %xmm2, %xmm8
2736; SSE-NEXT:    por %xmm5, %xmm8
2737; SSE-NEXT:    movdqa %xmm3, %xmm2
2738; SSE-NEXT:    pxor %xmm4, %xmm2
2739; SSE-NEXT:    movdqa %xmm1, %xmm5
2740; SSE-NEXT:    pxor %xmm4, %xmm5
2741; SSE-NEXT:    movdqa %xmm5, %xmm6
2742; SSE-NEXT:    pcmpgtd %xmm2, %xmm6
2743; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
2744; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
2745; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2746; SSE-NEXT:    pand %xmm2, %xmm5
2747; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
2748; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
2749; SSE-NEXT:    por %xmm5, %xmm2
2750; SSE-NEXT:    pand %xmm2, %xmm3
2751; SSE-NEXT:    pandn %xmm1, %xmm2
2752; SSE-NEXT:    por %xmm3, %xmm2
2753; SSE-NEXT:    movdqa %xmm7, %xmm1
2754; SSE-NEXT:    pxor %xmm4, %xmm1
2755; SSE-NEXT:    movdqa %xmm0, %xmm3
2756; SSE-NEXT:    pxor %xmm4, %xmm3
2757; SSE-NEXT:    movdqa %xmm3, %xmm5
2758; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
2759; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
2760; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
2761; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2762; SSE-NEXT:    pand %xmm1, %xmm3
2763; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm1
2764; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2765; SSE-NEXT:    por %xmm3, %xmm5
2766; SSE-NEXT:    pand %xmm5, %xmm7
2767; SSE-NEXT:    pandn %xmm0, %xmm5
2768; SSE-NEXT:    por %xmm7, %xmm5
2769; SSE-NEXT:    movdqa %xmm5, %xmm0
2770; SSE-NEXT:    pxor %xmm4, %xmm0
2771; SSE-NEXT:    movdqa %xmm1, %xmm3
2772; SSE-NEXT:    pxor %xmm4, %xmm3
2773; SSE-NEXT:    movdqa %xmm0, %xmm6
2774; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
2775; SSE-NEXT:    pcmpeqd %xmm0, %xmm3
2776; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2777; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2778; SSE-NEXT:    pand %xmm0, %xmm3
2779; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
2780; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2781; SSE-NEXT:    por %xmm3, %xmm0
2782; SSE-NEXT:    pand %xmm0, %xmm1
2783; SSE-NEXT:    pandn %xmm5, %xmm0
2784; SSE-NEXT:    por %xmm1, %xmm0
2785; SSE-NEXT:    movdqa %xmm2, %xmm1
2786; SSE-NEXT:    pxor %xmm4, %xmm1
2787; SSE-NEXT:    movdqa %xmm7, %xmm3
2788; SSE-NEXT:    pxor %xmm4, %xmm3
2789; SSE-NEXT:    movdqa %xmm1, %xmm5
2790; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
2791; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
2792; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
2793; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2794; SSE-NEXT:    pand %xmm1, %xmm3
2795; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm6
2796; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
2797; SSE-NEXT:    por %xmm3, %xmm1
2798; SSE-NEXT:    pand %xmm1, %xmm7
2799; SSE-NEXT:    pandn %xmm2, %xmm1
2800; SSE-NEXT:    por %xmm7, %xmm1
2801; SSE-NEXT:    movdqa %xmm8, %xmm2
2802; SSE-NEXT:    pxor %xmm4, %xmm2
2803; SSE-NEXT:    movdqa %xmm6, %xmm3
2804; SSE-NEXT:    pxor %xmm4, %xmm3
2805; SSE-NEXT:    movdqa %xmm2, %xmm5
2806; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
2807; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
2808; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
2809; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2810; SSE-NEXT:    pand %xmm2, %xmm3
2811; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
2812; SSE-NEXT:    por %xmm3, %xmm2
2813; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
2814; SSE-NEXT:    pand %xmm2, %xmm6
2815; SSE-NEXT:    pandn %xmm8, %xmm2
2816; SSE-NEXT:    por %xmm6, %xmm2
2817; SSE-NEXT:    movdqa %xmm9, %xmm3
2818; SSE-NEXT:    pxor %xmm4, %xmm3
2819; SSE-NEXT:    pxor %xmm5, %xmm4
2820; SSE-NEXT:    movdqa %xmm3, %xmm6
2821; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
2822; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
2823; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
2824; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2825; SSE-NEXT:    pand %xmm3, %xmm4
2826; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2827; SSE-NEXT:    por %xmm4, %xmm3
2828; SSE-NEXT:    pand %xmm3, %xmm5
2829; SSE-NEXT:    pandn %xmm9, %xmm3
2830; SSE-NEXT:    por %xmm5, %xmm3
2831; SSE-NEXT:    retq
2832;
2833; AVX2-LABEL: reassociate_umin_v8i64:
2834; AVX2:       # %bb.0:
2835; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
2836; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2837; AVX2-NEXT:    vpxor %ymm3, %ymm5, %ymm8
2838; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm9
2839; AVX2-NEXT:    vpcmpgtq %ymm8, %ymm9, %ymm8
2840; AVX2-NEXT:    vblendvpd %ymm8, %ymm5, %ymm1, %ymm1
2841; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
2842; AVX2-NEXT:    vpxor %ymm3, %ymm4, %ymm2
2843; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm5
2844; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm5, %ymm2
2845; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm0, %ymm0
2846; AVX2-NEXT:    vxorpd %ymm3, %ymm0, %ymm2
2847; AVX2-NEXT:    vpxor %ymm3, %ymm6, %ymm4
2848; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm2
2849; AVX2-NEXT:    vblendvpd %ymm2, %ymm6, %ymm0, %ymm0
2850; AVX2-NEXT:    vxorpd %ymm3, %ymm1, %ymm2
2851; AVX2-NEXT:    vpxor %ymm3, %ymm7, %ymm3
2852; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
2853; AVX2-NEXT:    vblendvpd %ymm2, %ymm7, %ymm1, %ymm1
2854; AVX2-NEXT:    retq
2855;
2856; AVX512-LABEL: reassociate_umin_v8i64:
2857; AVX512:       # %bb.0:
2858; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
2859; AVX512-NEXT:    vpminuq %zmm3, %zmm2, %zmm1
2860; AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
2861; AVX512-NEXT:    retq
2862
2863  %t0 = add <8 x i64> %x0, %x1
2864  %t1 = icmp ult <8 x i64> %x2, %t0
2865  %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0
2866  %t3 = icmp ult <8 x i64> %x3, %t2
2867  %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2
2868  ret <8 x i64> %t4
2869}
2870
2871define <64 x i8> @reassociate_smin_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) {
2872; SSE-LABEL: reassociate_smin_v64i8:
2873; SSE:       # %bb.0:
2874; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2875; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
2876; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
2877; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
2878; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
2879; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
2880; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
2881; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
2882; SSE-NEXT:    paddb %xmm4, %xmm0
2883; SSE-NEXT:    paddb %xmm5, %xmm1
2884; SSE-NEXT:    paddb %xmm6, %xmm2
2885; SSE-NEXT:    paddb %xmm7, %xmm3
2886; SSE-NEXT:    movdqa %xmm3, %xmm4
2887; SSE-NEXT:    pcmpgtb %xmm15, %xmm4
2888; SSE-NEXT:    pand %xmm4, %xmm15
2889; SSE-NEXT:    pandn %xmm3, %xmm4
2890; SSE-NEXT:    por %xmm15, %xmm4
2891; SSE-NEXT:    movdqa %xmm2, %xmm3
2892; SSE-NEXT:    pcmpgtb %xmm14, %xmm3
2893; SSE-NEXT:    pand %xmm3, %xmm14
2894; SSE-NEXT:    pandn %xmm2, %xmm3
2895; SSE-NEXT:    por %xmm14, %xmm3
2896; SSE-NEXT:    movdqa %xmm1, %xmm2
2897; SSE-NEXT:    pcmpgtb %xmm13, %xmm2
2898; SSE-NEXT:    pand %xmm2, %xmm13
2899; SSE-NEXT:    pandn %xmm1, %xmm2
2900; SSE-NEXT:    por %xmm13, %xmm2
2901; SSE-NEXT:    movdqa %xmm0, %xmm1
2902; SSE-NEXT:    pcmpgtb %xmm12, %xmm1
2903; SSE-NEXT:    pand %xmm1, %xmm12
2904; SSE-NEXT:    pandn %xmm0, %xmm1
2905; SSE-NEXT:    por %xmm12, %xmm1
2906; SSE-NEXT:    movdqa %xmm1, %xmm0
2907; SSE-NEXT:    pcmpgtb %xmm11, %xmm0
2908; SSE-NEXT:    pand %xmm0, %xmm11
2909; SSE-NEXT:    pandn %xmm1, %xmm0
2910; SSE-NEXT:    por %xmm11, %xmm0
2911; SSE-NEXT:    movdqa %xmm2, %xmm1
2912; SSE-NEXT:    pcmpgtb %xmm10, %xmm1
2913; SSE-NEXT:    pand %xmm1, %xmm10
2914; SSE-NEXT:    pandn %xmm2, %xmm1
2915; SSE-NEXT:    por %xmm10, %xmm1
2916; SSE-NEXT:    movdqa %xmm3, %xmm2
2917; SSE-NEXT:    pcmpgtb %xmm9, %xmm2
2918; SSE-NEXT:    pand %xmm2, %xmm9
2919; SSE-NEXT:    pandn %xmm3, %xmm2
2920; SSE-NEXT:    por %xmm9, %xmm2
2921; SSE-NEXT:    movdqa %xmm4, %xmm3
2922; SSE-NEXT:    pcmpgtb %xmm8, %xmm3
2923; SSE-NEXT:    pand %xmm3, %xmm8
2924; SSE-NEXT:    pandn %xmm4, %xmm3
2925; SSE-NEXT:    por %xmm8, %xmm3
2926; SSE-NEXT:    retq
2927;
2928; AVX2-LABEL: reassociate_smin_v64i8:
2929; AVX2:       # %bb.0:
2930; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
2931; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
2932; AVX2-NEXT:    vpminsb %ymm6, %ymm4, %ymm2
2933; AVX2-NEXT:    vpminsb %ymm2, %ymm0, %ymm0
2934; AVX2-NEXT:    vpminsb %ymm7, %ymm5, %ymm2
2935; AVX2-NEXT:    vpminsb %ymm2, %ymm1, %ymm1
2936; AVX2-NEXT:    retq
2937;
2938; AVX512-LABEL: reassociate_smin_v64i8:
2939; AVX512:       # %bb.0:
2940; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
2941; AVX512-NEXT:    vpminsb %zmm3, %zmm2, %zmm1
2942; AVX512-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
2943; AVX512-NEXT:    retq
2944
2945  %t0 = add <64 x i8> %x0, %x1
2946  %t1 = icmp slt <64 x i8> %x2, %t0
2947  %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0
2948  %t3 = icmp slt <64 x i8> %x3, %t2
2949  %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2
2950  ret <64 x i8> %t4
2951}
2952
2953define <32 x i16> @reassociate_smin_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) {
2954; SSE-LABEL: reassociate_smin_v32i16:
2955; SSE:       # %bb.0:
2956; SSE-NEXT:    paddw %xmm4, %xmm0
2957; SSE-NEXT:    paddw %xmm5, %xmm1
2958; SSE-NEXT:    paddw %xmm6, %xmm2
2959; SSE-NEXT:    paddw %xmm7, %xmm3
2960; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm3
2961; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm2
2962; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm1
2963; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm0
2964; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm0
2965; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm1
2966; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm2
2967; SSE-NEXT:    pminsw {{[0-9]+}}(%rsp), %xmm3
2968; SSE-NEXT:    retq
2969;
2970; AVX2-LABEL: reassociate_smin_v32i16:
2971; AVX2:       # %bb.0:
2972; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
2973; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
2974; AVX2-NEXT:    vpminsw %ymm6, %ymm4, %ymm2
2975; AVX2-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
2976; AVX2-NEXT:    vpminsw %ymm7, %ymm5, %ymm2
2977; AVX2-NEXT:    vpminsw %ymm2, %ymm1, %ymm1
2978; AVX2-NEXT:    retq
2979;
2980; AVX512-LABEL: reassociate_smin_v32i16:
2981; AVX512:       # %bb.0:
2982; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
2983; AVX512-NEXT:    vpminsw %zmm3, %zmm2, %zmm1
2984; AVX512-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
2985; AVX512-NEXT:    retq
2986
2987  %t0 = add <32 x i16> %x0, %x1
2988  %t1 = icmp slt <32 x i16> %x2, %t0
2989  %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0
2990  %t3 = icmp slt <32 x i16> %x3, %t2
2991  %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2
2992  ret <32 x i16> %t4
2993}
2994
2995define <16 x i32> @reassociate_smin_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) {
2996; SSE-LABEL: reassociate_smin_v16i32:
2997; SSE:       # %bb.0:
2998; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
2999; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
3000; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm10
3001; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
3002; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
3003; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm13
3004; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm14
3005; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm15
3006; SSE-NEXT:    paddd %xmm4, %xmm0
3007; SSE-NEXT:    paddd %xmm5, %xmm1
3008; SSE-NEXT:    paddd %xmm6, %xmm2
3009; SSE-NEXT:    paddd %xmm7, %xmm3
3010; SSE-NEXT:    movdqa %xmm3, %xmm4
3011; SSE-NEXT:    pcmpgtd %xmm15, %xmm4
3012; SSE-NEXT:    pand %xmm4, %xmm15
3013; SSE-NEXT:    pandn %xmm3, %xmm4
3014; SSE-NEXT:    por %xmm15, %xmm4
3015; SSE-NEXT:    movdqa %xmm2, %xmm3
3016; SSE-NEXT:    pcmpgtd %xmm14, %xmm3
3017; SSE-NEXT:    pand %xmm3, %xmm14
3018; SSE-NEXT:    pandn %xmm2, %xmm3
3019; SSE-NEXT:    por %xmm14, %xmm3
3020; SSE-NEXT:    movdqa %xmm1, %xmm2
3021; SSE-NEXT:    pcmpgtd %xmm13, %xmm2
3022; SSE-NEXT:    pand %xmm2, %xmm13
3023; SSE-NEXT:    pandn %xmm1, %xmm2
3024; SSE-NEXT:    por %xmm13, %xmm2
3025; SSE-NEXT:    movdqa %xmm0, %xmm1
3026; SSE-NEXT:    pcmpgtd %xmm12, %xmm1
3027; SSE-NEXT:    pand %xmm1, %xmm12
3028; SSE-NEXT:    pandn %xmm0, %xmm1
3029; SSE-NEXT:    por %xmm12, %xmm1
3030; SSE-NEXT:    movdqa %xmm1, %xmm0
3031; SSE-NEXT:    pcmpgtd %xmm11, %xmm0
3032; SSE-NEXT:    pand %xmm0, %xmm11
3033; SSE-NEXT:    pandn %xmm1, %xmm0
3034; SSE-NEXT:    por %xmm11, %xmm0
3035; SSE-NEXT:    movdqa %xmm2, %xmm1
3036; SSE-NEXT:    pcmpgtd %xmm10, %xmm1
3037; SSE-NEXT:    pand %xmm1, %xmm10
3038; SSE-NEXT:    pandn %xmm2, %xmm1
3039; SSE-NEXT:    por %xmm10, %xmm1
3040; SSE-NEXT:    movdqa %xmm3, %xmm2
3041; SSE-NEXT:    pcmpgtd %xmm9, %xmm2
3042; SSE-NEXT:    pand %xmm2, %xmm9
3043; SSE-NEXT:    pandn %xmm3, %xmm2
3044; SSE-NEXT:    por %xmm9, %xmm2
3045; SSE-NEXT:    movdqa %xmm4, %xmm3
3046; SSE-NEXT:    pcmpgtd %xmm8, %xmm3
3047; SSE-NEXT:    pand %xmm3, %xmm8
3048; SSE-NEXT:    pandn %xmm4, %xmm3
3049; SSE-NEXT:    por %xmm8, %xmm3
3050; SSE-NEXT:    retq
3051;
3052; AVX2-LABEL: reassociate_smin_v16i32:
3053; AVX2:       # %bb.0:
3054; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
3055; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
3056; AVX2-NEXT:    vpminsd %ymm6, %ymm4, %ymm2
3057; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
3058; AVX2-NEXT:    vpminsd %ymm7, %ymm5, %ymm2
3059; AVX2-NEXT:    vpminsd %ymm2, %ymm1, %ymm1
3060; AVX2-NEXT:    retq
3061;
3062; AVX512-LABEL: reassociate_smin_v16i32:
3063; AVX512:       # %bb.0:
3064; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
3065; AVX512-NEXT:    vpminsd %zmm3, %zmm2, %zmm1
3066; AVX512-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
3067; AVX512-NEXT:    retq
3068
3069  %t0 = add <16 x i32> %x0, %x1
3070  %t1 = icmp slt <16 x i32> %x2, %t0
3071  %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0
3072  %t3 = icmp slt <16 x i32> %x3, %t2
3073  %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2
3074  ret <16 x i32> %t4
3075}
3076
3077define <8 x i64> @reassociate_smin_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) {
3078; SSE-LABEL: reassociate_smin_v8i64:
3079; SSE:       # %bb.0:
3080; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm8
3081; SSE-NEXT:    paddq %xmm4, %xmm0
3082; SSE-NEXT:    paddq %xmm5, %xmm1
3083; SSE-NEXT:    paddq %xmm6, %xmm2
3084; SSE-NEXT:    paddq %xmm7, %xmm3
3085; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
3086; SSE-NEXT:    movdqa %xmm8, %xmm5
3087; SSE-NEXT:    pxor %xmm4, %xmm5
3088; SSE-NEXT:    movdqa %xmm3, %xmm6
3089; SSE-NEXT:    pxor %xmm4, %xmm6
3090; SSE-NEXT:    movdqa %xmm6, %xmm7
3091; SSE-NEXT:    pcmpgtd %xmm5, %xmm7
3092; SSE-NEXT:    pcmpeqd %xmm5, %xmm6
3093; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
3094; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3095; SSE-NEXT:    pand %xmm5, %xmm6
3096; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
3097; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
3098; SSE-NEXT:    por %xmm6, %xmm9
3099; SSE-NEXT:    pand %xmm9, %xmm8
3100; SSE-NEXT:    pandn %xmm3, %xmm9
3101; SSE-NEXT:    por %xmm8, %xmm9
3102; SSE-NEXT:    movdqa %xmm5, %xmm3
3103; SSE-NEXT:    pxor %xmm4, %xmm3
3104; SSE-NEXT:    movdqa %xmm2, %xmm6
3105; SSE-NEXT:    pxor %xmm4, %xmm6
3106; SSE-NEXT:    movdqa %xmm6, %xmm7
3107; SSE-NEXT:    pcmpgtd %xmm3, %xmm7
3108; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
3109; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
3110; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3111; SSE-NEXT:    pand %xmm3, %xmm6
3112; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3
3113; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
3114; SSE-NEXT:    por %xmm6, %xmm8
3115; SSE-NEXT:    pand %xmm8, %xmm5
3116; SSE-NEXT:    pandn %xmm2, %xmm8
3117; SSE-NEXT:    por %xmm5, %xmm8
3118; SSE-NEXT:    movdqa %xmm3, %xmm2
3119; SSE-NEXT:    pxor %xmm4, %xmm2
3120; SSE-NEXT:    movdqa %xmm1, %xmm5
3121; SSE-NEXT:    pxor %xmm4, %xmm5
3122; SSE-NEXT:    movdqa %xmm5, %xmm6
3123; SSE-NEXT:    pcmpgtd %xmm2, %xmm6
3124; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
3125; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
3126; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3127; SSE-NEXT:    pand %xmm2, %xmm5
3128; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
3129; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
3130; SSE-NEXT:    por %xmm5, %xmm2
3131; SSE-NEXT:    pand %xmm2, %xmm3
3132; SSE-NEXT:    pandn %xmm1, %xmm2
3133; SSE-NEXT:    por %xmm3, %xmm2
3134; SSE-NEXT:    movdqa %xmm7, %xmm1
3135; SSE-NEXT:    pxor %xmm4, %xmm1
3136; SSE-NEXT:    movdqa %xmm0, %xmm3
3137; SSE-NEXT:    pxor %xmm4, %xmm3
3138; SSE-NEXT:    movdqa %xmm3, %xmm5
3139; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
3140; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
3141; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
3142; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3143; SSE-NEXT:    pand %xmm1, %xmm3
3144; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm1
3145; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3146; SSE-NEXT:    por %xmm3, %xmm5
3147; SSE-NEXT:    pand %xmm5, %xmm7
3148; SSE-NEXT:    pandn %xmm0, %xmm5
3149; SSE-NEXT:    por %xmm7, %xmm5
3150; SSE-NEXT:    movdqa %xmm5, %xmm0
3151; SSE-NEXT:    pxor %xmm4, %xmm0
3152; SSE-NEXT:    movdqa %xmm1, %xmm3
3153; SSE-NEXT:    pxor %xmm4, %xmm3
3154; SSE-NEXT:    movdqa %xmm0, %xmm6
3155; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
3156; SSE-NEXT:    pcmpeqd %xmm0, %xmm3
3157; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3158; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3159; SSE-NEXT:    pand %xmm0, %xmm3
3160; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
3161; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
3162; SSE-NEXT:    por %xmm3, %xmm0
3163; SSE-NEXT:    pand %xmm0, %xmm1
3164; SSE-NEXT:    pandn %xmm5, %xmm0
3165; SSE-NEXT:    por %xmm1, %xmm0
3166; SSE-NEXT:    movdqa %xmm2, %xmm1
3167; SSE-NEXT:    pxor %xmm4, %xmm1
3168; SSE-NEXT:    movdqa %xmm7, %xmm3
3169; SSE-NEXT:    pxor %xmm4, %xmm3
3170; SSE-NEXT:    movdqa %xmm1, %xmm5
3171; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
3172; SSE-NEXT:    pcmpeqd %xmm1, %xmm3
3173; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
3174; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3175; SSE-NEXT:    pand %xmm1, %xmm3
3176; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm6
3177; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
3178; SSE-NEXT:    por %xmm3, %xmm1
3179; SSE-NEXT:    pand %xmm1, %xmm7
3180; SSE-NEXT:    pandn %xmm2, %xmm1
3181; SSE-NEXT:    por %xmm7, %xmm1
3182; SSE-NEXT:    movdqa %xmm8, %xmm2
3183; SSE-NEXT:    pxor %xmm4, %xmm2
3184; SSE-NEXT:    movdqa %xmm6, %xmm3
3185; SSE-NEXT:    pxor %xmm4, %xmm3
3186; SSE-NEXT:    movdqa %xmm2, %xmm5
3187; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
3188; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
3189; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3190; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3191; SSE-NEXT:    pand %xmm2, %xmm3
3192; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3193; SSE-NEXT:    por %xmm3, %xmm2
3194; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm5
3195; SSE-NEXT:    pand %xmm2, %xmm6
3196; SSE-NEXT:    pandn %xmm8, %xmm2
3197; SSE-NEXT:    por %xmm6, %xmm2
3198; SSE-NEXT:    movdqa %xmm9, %xmm3
3199; SSE-NEXT:    pxor %xmm4, %xmm3
3200; SSE-NEXT:    pxor %xmm5, %xmm4
3201; SSE-NEXT:    movdqa %xmm3, %xmm6
3202; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
3203; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
3204; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
3205; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3206; SSE-NEXT:    pand %xmm3, %xmm4
3207; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3208; SSE-NEXT:    por %xmm4, %xmm3
3209; SSE-NEXT:    pand %xmm3, %xmm5
3210; SSE-NEXT:    pandn %xmm9, %xmm3
3211; SSE-NEXT:    por %xmm5, %xmm3
3212; SSE-NEXT:    retq
3213;
3214; AVX2-LABEL: reassociate_smin_v8i64:
3215; AVX2:       # %bb.0:
3216; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
3217; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm1, %ymm3
3218; AVX2-NEXT:    vblendvpd %ymm3, %ymm5, %ymm1, %ymm1
3219; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
3220; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm2
3221; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm0, %ymm0
3222; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm0, %ymm2
3223; AVX2-NEXT:    vblendvpd %ymm2, %ymm6, %ymm0, %ymm0
3224; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm1, %ymm2
3225; AVX2-NEXT:    vblendvpd %ymm2, %ymm7, %ymm1, %ymm1
3226; AVX2-NEXT:    retq
3227;
3228; AVX512-LABEL: reassociate_smin_v8i64:
3229; AVX512:       # %bb.0:
3230; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
3231; AVX512-NEXT:    vpminsq %zmm3, %zmm2, %zmm1
3232; AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
3233; AVX512-NEXT:    retq
3234
3235  %t0 = add <8 x i64> %x0, %x1
3236  %t1 = icmp slt <8 x i64> %x2, %t0
3237  %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0
3238  %t3 = icmp slt <8 x i64> %x3, %t2
3239  %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2
3240  ret <8 x i64> %t4
3241}
3242