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