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