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