Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / horizontal-reduce-umin.ll
blobe4b92239c23f982b8e600044b95080cd108635d7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+sse2     | FileCheck %s --check-prefix=X86 --check-prefix=X86-SSE --check-prefix=X86-SSE2
3 ; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+sse4.2   | FileCheck %s --check-prefix=X86 --check-prefix=X86-SSE --check-prefix=X86-SSE42
4 ; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx      | FileCheck %s --check-prefix=X86 --check-prefix=X86-AVX --check-prefix=X86-AVX1
5 ; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx2     | FileCheck %s --check-prefix=X86 --check-prefix=X86-AVX --check-prefix=X86-AVX2
6 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse2   | FileCheck %s --check-prefix=X64 --check-prefix=X64-SSE --check-prefix=X64-SSE2
7 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse4.2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-SSE --check-prefix=X64-SSE42
8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx    | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX1
9 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2   | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX2
10 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX512
13 ; 128-bit Vectors
16 define i64 @test_reduce_v2i64(<2 x i64> %a0) {
17 ; X86-SSE2-LABEL: test_reduce_v2i64:
18 ; X86-SSE2:       ## %bb.0:
19 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
20 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
21 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
22 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
23 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
24 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
25 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
26 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
27 ; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
28 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
29 ; X86-SSE2-NEXT:    pand %xmm5, %xmm2
30 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
31 ; X86-SSE2-NEXT:    por %xmm2, %xmm3
32 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
33 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
34 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
35 ; X86-SSE2-NEXT:    movd %xmm3, %eax
36 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
37 ; X86-SSE2-NEXT:    movd %xmm0, %edx
38 ; X86-SSE2-NEXT:    retl
40 ; X86-SSE42-LABEL: test_reduce_v2i64:
41 ; X86-SSE42:       ## %bb.0:
42 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
43 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
44 ; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,2147483648,0,2147483648]
45 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
46 ; X86-SSE42-NEXT:    pxor %xmm0, %xmm3
47 ; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
48 ; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
49 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
50 ; X86-SSE42-NEXT:    movd %xmm2, %eax
51 ; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
52 ; X86-SSE42-NEXT:    retl
54 ; X86-AVX-LABEL: test_reduce_v2i64:
55 ; X86-AVX:       ## %bb.0:
56 ; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
57 ; X86-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
58 ; X86-AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm3
59 ; X86-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
60 ; X86-AVX-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
61 ; X86-AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
62 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
63 ; X86-AVX-NEXT:    vpextrd $1, %xmm0, %edx
64 ; X86-AVX-NEXT:    retl
66 ; X64-SSE2-LABEL: test_reduce_v2i64:
67 ; X64-SSE2:       ## %bb.0:
68 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
69 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
70 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
71 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
72 ; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
73 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
74 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
75 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
76 ; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
77 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
78 ; X64-SSE2-NEXT:    pand %xmm5, %xmm2
79 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
80 ; X64-SSE2-NEXT:    por %xmm2, %xmm3
81 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
82 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
83 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
84 ; X64-SSE2-NEXT:    movq %xmm3, %rax
85 ; X64-SSE2-NEXT:    retq
87 ; X64-SSE42-LABEL: test_reduce_v2i64:
88 ; X64-SSE42:       ## %bb.0:
89 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
90 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
91 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
92 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm3
93 ; X64-SSE42-NEXT:    pxor %xmm0, %xmm3
94 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm0
95 ; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
96 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
97 ; X64-SSE42-NEXT:    movq %xmm2, %rax
98 ; X64-SSE42-NEXT:    retq
100 ; X64-AVX1-LABEL: test_reduce_v2i64:
101 ; X64-AVX1:       ## %bb.0:
102 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
103 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
104 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
105 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
106 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
107 ; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
108 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
109 ; X64-AVX1-NEXT:    retq
111 ; X64-AVX2-LABEL: test_reduce_v2i64:
112 ; X64-AVX2:       ## %bb.0:
113 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
114 ; X64-AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
115 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
116 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
117 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
118 ; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
119 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
120 ; X64-AVX2-NEXT:    retq
122 ; X64-AVX512-LABEL: test_reduce_v2i64:
123 ; X64-AVX512:       ## %bb.0:
124 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
125 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
126 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
127 ; X64-AVX512-NEXT:    retq
128   %1 = shufflevector <2 x i64> %a0, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>
129   %2 = icmp ult <2 x i64> %a0, %1
130   %3 = select <2 x i1> %2, <2 x i64> %a0, <2 x i64> %1
131   %4 = extractelement <2 x i64> %3, i32 0
132   ret i64 %4
135 define i32 @test_reduce_v4i32(<4 x i32> %a0) {
136 ; X86-SSE2-LABEL: test_reduce_v4i32:
137 ; X86-SSE2:       ## %bb.0:
138 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
139 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
140 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
141 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
142 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
143 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
144 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
145 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
146 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
147 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
148 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
149 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
150 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
151 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
152 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
153 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
154 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
155 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
156 ; X86-SSE2-NEXT:    movd %xmm2, %eax
157 ; X86-SSE2-NEXT:    retl
159 ; X86-SSE42-LABEL: test_reduce_v4i32:
160 ; X86-SSE42:       ## %bb.0:
161 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
162 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
163 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
164 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
165 ; X86-SSE42-NEXT:    movd %xmm0, %eax
166 ; X86-SSE42-NEXT:    retl
168 ; X86-AVX-LABEL: test_reduce_v4i32:
169 ; X86-AVX:       ## %bb.0:
170 ; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
171 ; X86-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
172 ; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
173 ; X86-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
174 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
175 ; X86-AVX-NEXT:    retl
177 ; X64-SSE2-LABEL: test_reduce_v4i32:
178 ; X64-SSE2:       ## %bb.0:
179 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
180 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
181 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
182 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
183 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
184 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
185 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
186 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
187 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
188 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
189 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
190 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
191 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
192 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
193 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
194 ; X64-SSE2-NEXT:    pand %xmm2, %xmm4
195 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
196 ; X64-SSE2-NEXT:    por %xmm4, %xmm2
197 ; X64-SSE2-NEXT:    movd %xmm2, %eax
198 ; X64-SSE2-NEXT:    retq
200 ; X64-SSE42-LABEL: test_reduce_v4i32:
201 ; X64-SSE42:       ## %bb.0:
202 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
203 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
204 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
205 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
206 ; X64-SSE42-NEXT:    movd %xmm0, %eax
207 ; X64-SSE42-NEXT:    retq
209 ; X64-AVX-LABEL: test_reduce_v4i32:
210 ; X64-AVX:       ## %bb.0:
211 ; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
212 ; X64-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
213 ; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
214 ; X64-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
215 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
216 ; X64-AVX-NEXT:    retq
217   %1 = shufflevector <4 x i32> %a0, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
218   %2 = icmp ult <4 x i32> %a0, %1
219   %3 = select <4 x i1> %2, <4 x i32> %a0, <4 x i32> %1
220   %4 = shufflevector <4 x i32> %3, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
221   %5 = icmp ult <4 x i32> %3, %4
222   %6 = select <4 x i1> %5, <4 x i32> %3, <4 x i32> %4
223   %7 = extractelement <4 x i32> %6, i32 0
224   ret i32 %7
227 define i16 @test_reduce_v8i16(<8 x i16> %a0) {
228 ; X86-SSE2-LABEL: test_reduce_v8i16:
229 ; X86-SSE2:       ## %bb.0:
230 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
231 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
232 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
233 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
234 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
235 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
236 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
237 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
238 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
239 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
240 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
241 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
242 ; X86-SSE2-NEXT:    psrld $16, %xmm1
243 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
244 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
245 ; X86-SSE2-NEXT:    movd %xmm1, %eax
246 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
247 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
248 ; X86-SSE2-NEXT:    retl
250 ; X86-SSE42-LABEL: test_reduce_v8i16:
251 ; X86-SSE42:       ## %bb.0:
252 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
253 ; X86-SSE42-NEXT:    movd %xmm0, %eax
254 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
255 ; X86-SSE42-NEXT:    retl
257 ; X86-AVX-LABEL: test_reduce_v8i16:
258 ; X86-AVX:       ## %bb.0:
259 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
260 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
261 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
262 ; X86-AVX-NEXT:    retl
264 ; X64-SSE2-LABEL: test_reduce_v8i16:
265 ; X64-SSE2:       ## %bb.0:
266 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
267 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
268 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
269 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
270 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
271 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
272 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
273 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
274 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
275 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
276 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
277 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
278 ; X64-SSE2-NEXT:    psrld $16, %xmm1
279 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
280 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
281 ; X64-SSE2-NEXT:    movd %xmm1, %eax
282 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
283 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
284 ; X64-SSE2-NEXT:    retq
286 ; X64-SSE42-LABEL: test_reduce_v8i16:
287 ; X64-SSE42:       ## %bb.0:
288 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
289 ; X64-SSE42-NEXT:    movd %xmm0, %eax
290 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
291 ; X64-SSE42-NEXT:    retq
293 ; X64-AVX-LABEL: test_reduce_v8i16:
294 ; X64-AVX:       ## %bb.0:
295 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
296 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
297 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
298 ; X64-AVX-NEXT:    retq
299   %1  = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
300   %2  = icmp ult <8 x i16> %a0, %1
301   %3  = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
302   %4  = shufflevector <8 x i16> %3, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
303   %5  = icmp ult <8 x i16> %3, %4
304   %6  = select <8 x i1> %5, <8 x i16> %3, <8 x i16> %4
305   %7  = shufflevector <8 x i16> %6, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
306   %8  = icmp ult <8 x i16> %6, %7
307   %9  = select <8 x i1> %8, <8 x i16> %6, <8 x i16> %7
308   %10 = extractelement <8 x i16> %9, i32 0
309   ret i16 %10
312 define i8 @test_reduce_v16i8(<16 x i8> %a0) {
313 ; X86-SSE2-LABEL: test_reduce_v16i8:
314 ; X86-SSE2:       ## %bb.0:
315 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
316 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
317 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
318 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
319 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
320 ; X86-SSE2-NEXT:    psrld $16, %xmm1
321 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
322 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
323 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
324 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
325 ; X86-SSE2-NEXT:    movd %xmm0, %eax
326 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
327 ; X86-SSE2-NEXT:    retl
329 ; X86-SSE42-LABEL: test_reduce_v16i8:
330 ; X86-SSE42:       ## %bb.0:
331 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
332 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
333 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
334 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
335 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
336 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
337 ; X86-SSE42-NEXT:    retl
339 ; X86-AVX-LABEL: test_reduce_v16i8:
340 ; X86-AVX:       ## %bb.0:
341 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
342 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
343 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
344 ; X86-AVX-NEXT:    vpextrb $0, %xmm0, %eax
345 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
346 ; X86-AVX-NEXT:    retl
348 ; X64-SSE2-LABEL: test_reduce_v16i8:
349 ; X64-SSE2:       ## %bb.0:
350 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
351 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
352 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
353 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
354 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
355 ; X64-SSE2-NEXT:    psrld $16, %xmm1
356 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
357 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
358 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
359 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
360 ; X64-SSE2-NEXT:    movd %xmm0, %eax
361 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
362 ; X64-SSE2-NEXT:    retq
364 ; X64-SSE42-LABEL: test_reduce_v16i8:
365 ; X64-SSE42:       ## %bb.0:
366 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
367 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
368 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
369 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
370 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
371 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
372 ; X64-SSE42-NEXT:    retq
374 ; X64-AVX-LABEL: test_reduce_v16i8:
375 ; X64-AVX:       ## %bb.0:
376 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
377 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
378 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
379 ; X64-AVX-NEXT:    vpextrb $0, %xmm0, %eax
380 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
381 ; X64-AVX-NEXT:    retq
382   %1  = shufflevector <16 x i8> %a0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
383   %2  = icmp ult <16 x i8> %a0, %1
384   %3  = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
385   %4  = shufflevector <16 x i8> %3, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
386   %5  = icmp ult <16 x i8> %3, %4
387   %6  = select <16 x i1> %5, <16 x i8> %3, <16 x i8> %4
388   %7  = shufflevector <16 x i8> %6, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
389   %8  = icmp ult <16 x i8> %6, %7
390   %9  = select <16 x i1> %8, <16 x i8> %6, <16 x i8> %7
391   %10 = shufflevector <16 x i8> %9, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
392   %11 = icmp ult <16 x i8> %9, %10
393   %12 = select <16 x i1> %11, <16 x i8> %9, <16 x i8> %10
394   %13 = extractelement <16 x i8> %12, i32 0
395   ret i8 %13
399 ; 256-bit Vectors
402 define i64 @test_reduce_v4i64(<4 x i64> %a0) {
403 ; X86-SSE2-LABEL: test_reduce_v4i64:
404 ; X86-SSE2:       ## %bb.0:
405 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
406 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
407 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
408 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
409 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
410 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
411 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
412 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
413 ; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
414 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
415 ; X86-SSE2-NEXT:    pand %xmm6, %xmm3
416 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
417 ; X86-SSE2-NEXT:    por %xmm3, %xmm4
418 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
419 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
420 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
421 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
422 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
423 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
424 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
425 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
426 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
427 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
428 ; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
429 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
430 ; X86-SSE2-NEXT:    pand %xmm5, %xmm1
431 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
432 ; X86-SSE2-NEXT:    por %xmm1, %xmm2
433 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
434 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
435 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
436 ; X86-SSE2-NEXT:    movd %xmm2, %eax
437 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
438 ; X86-SSE2-NEXT:    movd %xmm0, %edx
439 ; X86-SSE2-NEXT:    retl
441 ; X86-SSE42-LABEL: test_reduce_v4i64:
442 ; X86-SSE42:       ## %bb.0:
443 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
444 ; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
445 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm4
446 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm4
447 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
448 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
449 ; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
450 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
451 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
452 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
453 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
454 ; X86-SSE42-NEXT:    pxor %xmm2, %xmm3
455 ; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
456 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
457 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
458 ; X86-SSE42-NEXT:    movd %xmm2, %eax
459 ; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
460 ; X86-SSE42-NEXT:    retl
462 ; X86-AVX1-LABEL: test_reduce_v4i64:
463 ; X86-AVX1:       ## %bb.0:
464 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
465 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
466 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
467 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
468 ; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
469 ; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm4
470 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
471 ; X86-AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
472 ; X86-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
473 ; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
474 ; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
475 ; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
476 ; X86-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
477 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
478 ; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
479 ; X86-AVX1-NEXT:    vzeroupper
480 ; X86-AVX1-NEXT:    retl
482 ; X86-AVX2-LABEL: test_reduce_v4i64:
483 ; X86-AVX2:       ## %bb.0:
484 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
485 ; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
486 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
487 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
488 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
489 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
490 ; X86-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
491 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
492 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm2
493 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
494 ; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
495 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
496 ; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
497 ; X86-AVX2-NEXT:    vzeroupper
498 ; X86-AVX2-NEXT:    retl
500 ; X64-SSE2-LABEL: test_reduce_v4i64:
501 ; X64-SSE2:       ## %bb.0:
502 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
503 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
504 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
505 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
506 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
507 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
508 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
509 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
510 ; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
511 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
512 ; X64-SSE2-NEXT:    pand %xmm6, %xmm3
513 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
514 ; X64-SSE2-NEXT:    por %xmm3, %xmm4
515 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
516 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
517 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
518 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
519 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
520 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
521 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
522 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
523 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
524 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
525 ; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
526 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
527 ; X64-SSE2-NEXT:    pand %xmm5, %xmm1
528 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
529 ; X64-SSE2-NEXT:    por %xmm1, %xmm2
530 ; X64-SSE2-NEXT:    pand %xmm2, %xmm4
531 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
532 ; X64-SSE2-NEXT:    por %xmm4, %xmm2
533 ; X64-SSE2-NEXT:    movq %xmm2, %rax
534 ; X64-SSE2-NEXT:    retq
536 ; X64-SSE42-LABEL: test_reduce_v4i64:
537 ; X64-SSE42:       ## %bb.0:
538 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm2
539 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
540 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
541 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm4
542 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
543 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
544 ; X64-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
545 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
546 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
547 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
548 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
549 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm3
550 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
551 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
552 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
553 ; X64-SSE42-NEXT:    movq %xmm2, %rax
554 ; X64-SSE42-NEXT:    retq
556 ; X64-AVX1-LABEL: test_reduce_v4i64:
557 ; X64-AVX1:       ## %bb.0:
558 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
559 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
560 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
561 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
562 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
563 ; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm4
564 ; X64-AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
565 ; X64-AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
566 ; X64-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
567 ; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
568 ; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
569 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
570 ; X64-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
571 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
572 ; X64-AVX1-NEXT:    vzeroupper
573 ; X64-AVX1-NEXT:    retq
575 ; X64-AVX2-LABEL: test_reduce_v4i64:
576 ; X64-AVX2:       ## %bb.0:
577 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
578 ; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
579 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
580 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
581 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
582 ; X64-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
583 ; X64-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
584 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
585 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm2
586 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
587 ; X64-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
588 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
589 ; X64-AVX2-NEXT:    vzeroupper
590 ; X64-AVX2-NEXT:    retq
592 ; X64-AVX512-LABEL: test_reduce_v4i64:
593 ; X64-AVX512:       ## %bb.0:
594 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
595 ; X64-AVX512-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
596 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
597 ; X64-AVX512-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
598 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
599 ; X64-AVX512-NEXT:    vzeroupper
600 ; X64-AVX512-NEXT:    retq
601   %1 = shufflevector <4 x i64> %a0, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
602   %2 = icmp ult <4 x i64> %a0, %1
603   %3 = select <4 x i1> %2, <4 x i64> %a0, <4 x i64> %1
604   %4 = shufflevector <4 x i64> %3, <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
605   %5 = icmp ult <4 x i64> %3, %4
606   %6 = select <4 x i1> %5, <4 x i64> %3, <4 x i64> %4
607   %7 = extractelement <4 x i64> %6, i32 0
608   ret i64 %7
611 define i32 @test_reduce_v8i32(<8 x i32> %a0) {
612 ; X86-SSE2-LABEL: test_reduce_v8i32:
613 ; X86-SSE2:       ## %bb.0:
614 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
615 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
616 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
617 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
618 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
619 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
620 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
621 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
622 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
623 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
624 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
625 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
626 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
627 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
628 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
629 ; X86-SSE2-NEXT:    pand %xmm3, %xmm4
630 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
631 ; X86-SSE2-NEXT:    por %xmm4, %xmm3
632 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
633 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
634 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
635 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
636 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
637 ; X86-SSE2-NEXT:    pand %xmm2, %xmm3
638 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
639 ; X86-SSE2-NEXT:    por %xmm3, %xmm2
640 ; X86-SSE2-NEXT:    movd %xmm2, %eax
641 ; X86-SSE2-NEXT:    retl
643 ; X86-SSE42-LABEL: test_reduce_v8i32:
644 ; X86-SSE42:       ## %bb.0:
645 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
646 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
647 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
648 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
649 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
650 ; X86-SSE42-NEXT:    movd %xmm0, %eax
651 ; X86-SSE42-NEXT:    retl
653 ; X86-AVX1-LABEL: test_reduce_v8i32:
654 ; X86-AVX1:       ## %bb.0:
655 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
656 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
657 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
658 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
659 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
660 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
661 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
662 ; X86-AVX1-NEXT:    vzeroupper
663 ; X86-AVX1-NEXT:    retl
665 ; X86-AVX2-LABEL: test_reduce_v8i32:
666 ; X86-AVX2:       ## %bb.0:
667 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
668 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
669 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
670 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
671 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
672 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
673 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
674 ; X86-AVX2-NEXT:    vzeroupper
675 ; X86-AVX2-NEXT:    retl
677 ; X64-SSE2-LABEL: test_reduce_v8i32:
678 ; X64-SSE2:       ## %bb.0:
679 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
680 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
681 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
682 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
683 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
684 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
685 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
686 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
687 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
688 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
689 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
690 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
691 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
692 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
693 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
694 ; X64-SSE2-NEXT:    pand %xmm3, %xmm4
695 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
696 ; X64-SSE2-NEXT:    por %xmm4, %xmm3
697 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
698 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
699 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
700 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
701 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
702 ; X64-SSE2-NEXT:    pand %xmm2, %xmm3
703 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
704 ; X64-SSE2-NEXT:    por %xmm3, %xmm2
705 ; X64-SSE2-NEXT:    movd %xmm2, %eax
706 ; X64-SSE2-NEXT:    retq
708 ; X64-SSE42-LABEL: test_reduce_v8i32:
709 ; X64-SSE42:       ## %bb.0:
710 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
711 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
712 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
713 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
714 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
715 ; X64-SSE42-NEXT:    movd %xmm0, %eax
716 ; X64-SSE42-NEXT:    retq
718 ; X64-AVX1-LABEL: test_reduce_v8i32:
719 ; X64-AVX1:       ## %bb.0:
720 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
721 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
722 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
723 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
724 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
725 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
726 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
727 ; X64-AVX1-NEXT:    vzeroupper
728 ; X64-AVX1-NEXT:    retq
730 ; X64-AVX2-LABEL: test_reduce_v8i32:
731 ; X64-AVX2:       ## %bb.0:
732 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
733 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
734 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
735 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
736 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
737 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
738 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
739 ; X64-AVX2-NEXT:    vzeroupper
740 ; X64-AVX2-NEXT:    retq
742 ; X64-AVX512-LABEL: test_reduce_v8i32:
743 ; X64-AVX512:       ## %bb.0:
744 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
745 ; X64-AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
746 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
747 ; X64-AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
748 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
749 ; X64-AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
750 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
751 ; X64-AVX512-NEXT:    vzeroupper
752 ; X64-AVX512-NEXT:    retq
753   %1  = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
754   %2  = icmp ult <8 x i32> %a0, %1
755   %3  = select <8 x i1> %2, <8 x i32> %a0, <8 x i32> %1
756   %4  = shufflevector <8 x i32> %3, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
757   %5  = icmp ult <8 x i32> %3, %4
758   %6  = select <8 x i1> %5, <8 x i32> %3, <8 x i32> %4
759   %7  = shufflevector <8 x i32> %6, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
760   %8  = icmp ult <8 x i32> %6, %7
761   %9  = select <8 x i1> %8, <8 x i32> %6, <8 x i32> %7
762   %10 = extractelement <8 x i32> %9, i32 0
763   ret i32 %10
766 define i16 @test_reduce_v16i16(<16 x i16> %a0) {
767 ; X86-SSE2-LABEL: test_reduce_v16i16:
768 ; X86-SSE2:       ## %bb.0:
769 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
770 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
771 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
772 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
773 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
774 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
775 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
776 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
777 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
778 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
779 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
780 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
781 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
782 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
783 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
784 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
785 ; X86-SSE2-NEXT:    psrld $16, %xmm1
786 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
787 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
788 ; X86-SSE2-NEXT:    movd %xmm1, %eax
789 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
790 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
791 ; X86-SSE2-NEXT:    retl
793 ; X86-SSE42-LABEL: test_reduce_v16i16:
794 ; X86-SSE42:       ## %bb.0:
795 ; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
796 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
797 ; X86-SSE42-NEXT:    movd %xmm0, %eax
798 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
799 ; X86-SSE42-NEXT:    retl
801 ; X86-AVX1-LABEL: test_reduce_v16i16:
802 ; X86-AVX1:       ## %bb.0:
803 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
804 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
805 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
806 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
807 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
808 ; X86-AVX1-NEXT:    vzeroupper
809 ; X86-AVX1-NEXT:    retl
811 ; X86-AVX2-LABEL: test_reduce_v16i16:
812 ; X86-AVX2:       ## %bb.0:
813 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
814 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
815 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
816 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
817 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
818 ; X86-AVX2-NEXT:    vzeroupper
819 ; X86-AVX2-NEXT:    retl
821 ; X64-SSE2-LABEL: test_reduce_v16i16:
822 ; X64-SSE2:       ## %bb.0:
823 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
824 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
825 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
826 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
827 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
828 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
829 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
830 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
831 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
832 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
833 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
834 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
835 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
836 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
837 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
838 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
839 ; X64-SSE2-NEXT:    psrld $16, %xmm1
840 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
841 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
842 ; X64-SSE2-NEXT:    movd %xmm1, %eax
843 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
844 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
845 ; X64-SSE2-NEXT:    retq
847 ; X64-SSE42-LABEL: test_reduce_v16i16:
848 ; X64-SSE42:       ## %bb.0:
849 ; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
850 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
851 ; X64-SSE42-NEXT:    movd %xmm0, %eax
852 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
853 ; X64-SSE42-NEXT:    retq
855 ; X64-AVX1-LABEL: test_reduce_v16i16:
856 ; X64-AVX1:       ## %bb.0:
857 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
858 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
859 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
860 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
861 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
862 ; X64-AVX1-NEXT:    vzeroupper
863 ; X64-AVX1-NEXT:    retq
865 ; X64-AVX2-LABEL: test_reduce_v16i16:
866 ; X64-AVX2:       ## %bb.0:
867 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
868 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
869 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
870 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
871 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
872 ; X64-AVX2-NEXT:    vzeroupper
873 ; X64-AVX2-NEXT:    retq
875 ; X64-AVX512-LABEL: test_reduce_v16i16:
876 ; X64-AVX512:       ## %bb.0:
877 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
878 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
879 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
880 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
881 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
882 ; X64-AVX512-NEXT:    vzeroupper
883 ; X64-AVX512-NEXT:    retq
884   %1  = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
885   %2  = icmp ult <16 x i16> %a0, %1
886   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
887   %4  = shufflevector <16 x i16> %3, <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
888   %5  = icmp ult <16 x i16> %3, %4
889   %6  = select <16 x i1> %5, <16 x i16> %3, <16 x i16> %4
890   %7  = shufflevector <16 x i16> %6, <16 x i16> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
891   %8  = icmp ult <16 x i16> %6, %7
892   %9  = select <16 x i1> %8, <16 x i16> %6, <16 x i16> %7
893   %10 = shufflevector <16 x i16> %9, <16 x i16> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
894   %11 = icmp ult <16 x i16> %9, %10
895   %12 = select <16 x i1> %11, <16 x i16> %9, <16 x i16> %10
896   %13 = extractelement <16 x i16> %12, i32 0
897   ret i16 %13
900 define i8 @test_reduce_v32i8(<32 x i8> %a0) {
901 ; X86-SSE2-LABEL: test_reduce_v32i8:
902 ; X86-SSE2:       ## %bb.0:
903 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
904 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
905 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
906 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
907 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
908 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
909 ; X86-SSE2-NEXT:    psrld $16, %xmm1
910 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
911 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
912 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
913 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
914 ; X86-SSE2-NEXT:    movd %xmm0, %eax
915 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
916 ; X86-SSE2-NEXT:    retl
918 ; X86-SSE42-LABEL: test_reduce_v32i8:
919 ; X86-SSE42:       ## %bb.0:
920 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
921 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
922 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
923 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
924 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
925 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
926 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
927 ; X86-SSE42-NEXT:    retl
929 ; X86-AVX1-LABEL: test_reduce_v32i8:
930 ; X86-AVX1:       ## %bb.0:
931 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
932 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
933 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
934 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
935 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
936 ; X86-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
937 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
938 ; X86-AVX1-NEXT:    vzeroupper
939 ; X86-AVX1-NEXT:    retl
941 ; X86-AVX2-LABEL: test_reduce_v32i8:
942 ; X86-AVX2:       ## %bb.0:
943 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
944 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
945 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
946 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
947 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
948 ; X86-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
949 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
950 ; X86-AVX2-NEXT:    vzeroupper
951 ; X86-AVX2-NEXT:    retl
953 ; X64-SSE2-LABEL: test_reduce_v32i8:
954 ; X64-SSE2:       ## %bb.0:
955 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
956 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
957 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
958 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
959 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
960 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
961 ; X64-SSE2-NEXT:    psrld $16, %xmm1
962 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
963 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
964 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
965 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
966 ; X64-SSE2-NEXT:    movd %xmm0, %eax
967 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
968 ; X64-SSE2-NEXT:    retq
970 ; X64-SSE42-LABEL: test_reduce_v32i8:
971 ; X64-SSE42:       ## %bb.0:
972 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
973 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
974 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
975 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
976 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
977 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
978 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
979 ; X64-SSE42-NEXT:    retq
981 ; X64-AVX1-LABEL: test_reduce_v32i8:
982 ; X64-AVX1:       ## %bb.0:
983 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
984 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
985 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
986 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
987 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
988 ; X64-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
989 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
990 ; X64-AVX1-NEXT:    vzeroupper
991 ; X64-AVX1-NEXT:    retq
993 ; X64-AVX2-LABEL: test_reduce_v32i8:
994 ; X64-AVX2:       ## %bb.0:
995 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
996 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
997 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
998 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
999 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1000 ; X64-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1001 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1002 ; X64-AVX2-NEXT:    vzeroupper
1003 ; X64-AVX2-NEXT:    retq
1005 ; X64-AVX512-LABEL: test_reduce_v32i8:
1006 ; X64-AVX512:       ## %bb.0:
1007 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1008 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1009 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1010 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1011 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1012 ; X64-AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1013 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
1014 ; X64-AVX512-NEXT:    vzeroupper
1015 ; X64-AVX512-NEXT:    retq
1016   %1  = shufflevector <32 x i8> %a0, <32 x i8> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1017   %2  = icmp ult <32 x i8> %a0, %1
1018   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
1019   %4  = shufflevector <32 x i8> %3, <32 x i8> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1020   %5  = icmp ult <32 x i8> %3, %4
1021   %6  = select <32 x i1> %5, <32 x i8> %3, <32 x i8> %4
1022   %7  = shufflevector <32 x i8> %6, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1023   %8  = icmp ult <32 x i8> %6, %7
1024   %9  = select <32 x i1> %8, <32 x i8> %6, <32 x i8> %7
1025   %10 = shufflevector <32 x i8> %9, <32 x i8> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1026   %11 = icmp ult <32 x i8> %9, %10
1027   %12 = select <32 x i1> %11, <32 x i8> %9, <32 x i8> %10
1028   %13 = shufflevector <32 x i8> %12, <32 x i8> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1029   %14 = icmp ult <32 x i8> %12, %13
1030   %15 = select <32 x i1> %14, <32 x i8> %12, <32 x i8> %13
1031   %16 = extractelement <32 x i8> %15, i32 0
1032   ret i8 %16
1036 ; 512-bit Vectors
1039 define i64 @test_reduce_v8i64(<8 x i64> %a0) {
1040 ; X86-SSE2-LABEL: test_reduce_v8i64:
1041 ; X86-SSE2:       ## %bb.0:
1042 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1043 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
1044 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
1045 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1046 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
1047 ; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
1048 ; X86-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1049 ; X86-SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1050 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1051 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1052 ; X86-SSE2-NEXT:    pand %xmm5, %xmm6
1053 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1054 ; X86-SSE2-NEXT:    por %xmm6, %xmm5
1055 ; X86-SSE2-NEXT:    pand %xmm5, %xmm1
1056 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
1057 ; X86-SSE2-NEXT:    por %xmm1, %xmm5
1058 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1059 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1060 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1061 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1062 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1063 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1064 ; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
1065 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
1066 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1067 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
1068 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
1069 ; X86-SSE2-NEXT:    por %xmm3, %xmm1
1070 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1071 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
1072 ; X86-SSE2-NEXT:    por %xmm0, %xmm1
1073 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1074 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1075 ; X86-SSE2-NEXT:    movdqa %xmm5, %xmm2
1076 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1077 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1078 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1079 ; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
1080 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1081 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1082 ; X86-SSE2-NEXT:    pand %xmm0, %xmm2
1083 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1084 ; X86-SSE2-NEXT:    por %xmm2, %xmm0
1085 ; X86-SSE2-NEXT:    pand %xmm0, %xmm1
1086 ; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
1087 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
1088 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1089 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
1090 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1091 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
1092 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm3
1093 ; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1094 ; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1095 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1096 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1097 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
1098 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1099 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
1100 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1101 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
1102 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
1103 ; X86-SSE2-NEXT:    movd %xmm2, %eax
1104 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1105 ; X86-SSE2-NEXT:    movd %xmm0, %edx
1106 ; X86-SSE2-NEXT:    retl
1108 ; X86-SSE42-LABEL: test_reduce_v8i64:
1109 ; X86-SSE42:       ## %bb.0:
1110 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm5
1111 ; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
1112 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm6
1113 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm6
1114 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
1115 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1116 ; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
1117 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1118 ; X86-SSE42-NEXT:    movdqa %xmm5, %xmm1
1119 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm1
1120 ; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
1121 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1122 ; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1123 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1124 ; X86-SSE42-NEXT:    movapd %xmm2, %xmm1
1125 ; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
1126 ; X86-SSE42-NEXT:    movapd %xmm3, %xmm0
1127 ; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
1128 ; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1129 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1130 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1131 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
1132 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1133 ; X86-SSE42-NEXT:    pxor %xmm1, %xmm4
1134 ; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
1135 ; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
1136 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1137 ; X86-SSE42-NEXT:    movd %xmm1, %eax
1138 ; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
1139 ; X86-SSE42-NEXT:    retl
1141 ; X86-AVX1-LABEL: test_reduce_v8i64:
1142 ; X86-AVX1:       ## %bb.0:
1143 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1144 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
1145 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
1146 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1147 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm4
1148 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1149 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm4
1150 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm5
1151 ; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1152 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
1153 ; X86-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1154 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1155 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1156 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm4
1157 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1158 ; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm4
1159 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1160 ; X86-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1161 ; X86-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1162 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1163 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
1164 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1165 ; X86-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1166 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1167 ; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
1168 ; X86-AVX1-NEXT:    vzeroupper
1169 ; X86-AVX1-NEXT:    retl
1171 ; X86-AVX2-LABEL: test_reduce_v8i64:
1172 ; X86-AVX2:       ## %bb.0:
1173 ; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
1174 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1175 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
1176 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1177 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1178 ; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1179 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
1180 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm4
1181 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1182 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1183 ; X86-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1184 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
1185 ; X86-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm2
1186 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
1187 ; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1188 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1189 ; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
1190 ; X86-AVX2-NEXT:    vzeroupper
1191 ; X86-AVX2-NEXT:    retl
1193 ; X64-SSE2-LABEL: test_reduce_v8i64:
1194 ; X64-SSE2:       ## %bb.0:
1195 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1196 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
1197 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
1198 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1199 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
1200 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
1201 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1202 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1203 ; X64-SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1204 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1205 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
1206 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1207 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
1208 ; X64-SSE2-NEXT:    pand %xmm5, %xmm1
1209 ; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
1210 ; X64-SSE2-NEXT:    por %xmm1, %xmm5
1211 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1212 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1213 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
1214 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1215 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1216 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1217 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1218 ; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
1219 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1220 ; X64-SSE2-NEXT:    pand %xmm7, %xmm1
1221 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1222 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1223 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1224 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
1225 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
1226 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
1227 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1228 ; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
1229 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1230 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1231 ; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1232 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1233 ; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
1234 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1235 ; X64-SSE2-NEXT:    pand %xmm6, %xmm0
1236 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1237 ; X64-SSE2-NEXT:    por %xmm0, %xmm1
1238 ; X64-SSE2-NEXT:    pand %xmm1, %xmm3
1239 ; X64-SSE2-NEXT:    pandn %xmm5, %xmm1
1240 ; X64-SSE2-NEXT:    por %xmm3, %xmm1
1241 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1242 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1243 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1244 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
1245 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm3
1246 ; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1247 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1248 ; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1249 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1250 ; X64-SSE2-NEXT:    pand %xmm5, %xmm2
1251 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1252 ; X64-SSE2-NEXT:    por %xmm2, %xmm3
1253 ; X64-SSE2-NEXT:    pand %xmm3, %xmm1
1254 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
1255 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1256 ; X64-SSE2-NEXT:    movq %xmm3, %rax
1257 ; X64-SSE2-NEXT:    retq
1259 ; X64-SSE42-LABEL: test_reduce_v8i64:
1260 ; X64-SSE42:       ## %bb.0:
1261 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm5
1262 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1263 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm6
1264 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm6
1265 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
1266 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1267 ; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
1268 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1269 ; X64-SSE42-NEXT:    movdqa %xmm5, %xmm1
1270 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm1
1271 ; X64-SSE42-NEXT:    movdqa %xmm2, %xmm0
1272 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1273 ; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1274 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1275 ; X64-SSE42-NEXT:    movapd %xmm2, %xmm1
1276 ; X64-SSE42-NEXT:    xorpd %xmm4, %xmm1
1277 ; X64-SSE42-NEXT:    movapd %xmm3, %xmm0
1278 ; X64-SSE42-NEXT:    xorpd %xmm4, %xmm0
1279 ; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1280 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1281 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1282 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
1283 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1284 ; X64-SSE42-NEXT:    pxor %xmm1, %xmm4
1285 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
1286 ; X64-SSE42-NEXT:    movdqa %xmm4, %xmm0
1287 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1288 ; X64-SSE42-NEXT:    movq %xmm1, %rax
1289 ; X64-SSE42-NEXT:    retq
1291 ; X64-AVX1-LABEL: test_reduce_v8i64:
1292 ; X64-AVX1:       ## %bb.0:
1293 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1294 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1295 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
1296 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1297 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm4
1298 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1299 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm4
1300 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm5
1301 ; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1302 ; X64-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
1303 ; X64-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1304 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1305 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1306 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm4
1307 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1308 ; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm4
1309 ; X64-AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1310 ; X64-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1311 ; X64-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1312 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1313 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
1314 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1315 ; X64-AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1316 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
1317 ; X64-AVX1-NEXT:    vzeroupper
1318 ; X64-AVX1-NEXT:    retq
1320 ; X64-AVX2-LABEL: test_reduce_v8i64:
1321 ; X64-AVX2:       ## %bb.0:
1322 ; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1323 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1324 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
1325 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1326 ; X64-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1327 ; X64-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1328 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
1329 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm4
1330 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1331 ; X64-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1332 ; X64-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1333 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm0, %ymm3
1334 ; X64-AVX2-NEXT:    vxorpd %ymm2, %ymm1, %ymm2
1335 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
1336 ; X64-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1337 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
1338 ; X64-AVX2-NEXT:    vzeroupper
1339 ; X64-AVX2-NEXT:    retq
1341 ; X64-AVX512-LABEL: test_reduce_v8i64:
1342 ; X64-AVX512:       ## %bb.0:
1343 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1344 ; X64-AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
1345 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1346 ; X64-AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
1347 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1348 ; X64-AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
1349 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
1350 ; X64-AVX512-NEXT:    vzeroupper
1351 ; X64-AVX512-NEXT:    retq
1352   %1  = shufflevector <8 x i64> %a0, <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
1353   %2  = icmp ult <8 x i64> %a0, %1
1354   %3  = select <8 x i1> %2, <8 x i64> %a0, <8 x i64> %1
1355   %4  = shufflevector <8 x i64> %3, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1356   %5  = icmp ult <8 x i64> %3, %4
1357   %6  = select <8 x i1> %5, <8 x i64> %3, <8 x i64> %4
1358   %7  = shufflevector <8 x i64> %6, <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1359   %8  = icmp ult <8 x i64> %6, %7
1360   %9  = select <8 x i1> %8, <8 x i64> %6, <8 x i64> %7
1361   %10 = extractelement <8 x i64> %9, i32 0
1362   ret i64 %10
1365 define i32 @test_reduce_v16i32(<16 x i32> %a0) {
1366 ; X86-SSE2-LABEL: test_reduce_v16i32:
1367 ; X86-SSE2:       ## %bb.0:
1368 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1369 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
1370 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
1371 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1372 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
1373 ; X86-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1374 ; X86-SSE2-NEXT:    pand %xmm6, %xmm1
1375 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm6
1376 ; X86-SSE2-NEXT:    por %xmm1, %xmm6
1377 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1378 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1379 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1380 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1381 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1382 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
1383 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm3
1384 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
1385 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm0
1386 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1387 ; X86-SSE2-NEXT:    movdqa %xmm6, %xmm1
1388 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1389 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1390 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
1391 ; X86-SSE2-NEXT:    pandn %xmm6, %xmm1
1392 ; X86-SSE2-NEXT:    por %xmm3, %xmm1
1393 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1394 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
1395 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1396 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
1397 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1398 ; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1399 ; X86-SSE2-NEXT:    pand %xmm3, %xmm1
1400 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
1401 ; X86-SSE2-NEXT:    por %xmm1, %xmm3
1402 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1403 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
1404 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1405 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm4
1406 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1407 ; X86-SSE2-NEXT:    pand %xmm4, %xmm3
1408 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm4
1409 ; X86-SSE2-NEXT:    por %xmm3, %xmm4
1410 ; X86-SSE2-NEXT:    movd %xmm4, %eax
1411 ; X86-SSE2-NEXT:    retl
1413 ; X86-SSE42-LABEL: test_reduce_v16i32:
1414 ; X86-SSE42:       ## %bb.0:
1415 ; X86-SSE42-NEXT:    pminud %xmm3, %xmm1
1416 ; X86-SSE42-NEXT:    pminud %xmm2, %xmm0
1417 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
1418 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1419 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
1420 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1421 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
1422 ; X86-SSE42-NEXT:    movd %xmm0, %eax
1423 ; X86-SSE42-NEXT:    retl
1425 ; X86-AVX1-LABEL: test_reduce_v16i32:
1426 ; X86-AVX1:       ## %bb.0:
1427 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1428 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1429 ; X86-AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1430 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1431 ; X86-AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1432 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1433 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1434 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1435 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1436 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1437 ; X86-AVX1-NEXT:    vzeroupper
1438 ; X86-AVX1-NEXT:    retl
1440 ; X86-AVX2-LABEL: test_reduce_v16i32:
1441 ; X86-AVX2:       ## %bb.0:
1442 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1443 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1444 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1445 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1446 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1447 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1448 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1449 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1450 ; X86-AVX2-NEXT:    vzeroupper
1451 ; X86-AVX2-NEXT:    retl
1453 ; X64-SSE2-LABEL: test_reduce_v16i32:
1454 ; X64-SSE2:       ## %bb.0:
1455 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1456 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
1457 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
1458 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1459 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
1460 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1461 ; X64-SSE2-NEXT:    pand %xmm6, %xmm1
1462 ; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
1463 ; X64-SSE2-NEXT:    por %xmm1, %xmm6
1464 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1465 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1466 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
1467 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1468 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1469 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1470 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
1471 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
1472 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
1473 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1474 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm1
1475 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1476 ; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1477 ; X64-SSE2-NEXT:    pand %xmm1, %xmm3
1478 ; X64-SSE2-NEXT:    pandn %xmm6, %xmm1
1479 ; X64-SSE2-NEXT:    por %xmm3, %xmm1
1480 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1481 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1482 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1483 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
1484 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1485 ; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1486 ; X64-SSE2-NEXT:    pand %xmm3, %xmm1
1487 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
1488 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1489 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1490 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
1491 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1492 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
1493 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1494 ; X64-SSE2-NEXT:    pand %xmm4, %xmm3
1495 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm4
1496 ; X64-SSE2-NEXT:    por %xmm3, %xmm4
1497 ; X64-SSE2-NEXT:    movd %xmm4, %eax
1498 ; X64-SSE2-NEXT:    retq
1500 ; X64-SSE42-LABEL: test_reduce_v16i32:
1501 ; X64-SSE42:       ## %bb.0:
1502 ; X64-SSE42-NEXT:    pminud %xmm3, %xmm1
1503 ; X64-SSE42-NEXT:    pminud %xmm2, %xmm0
1504 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
1505 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1506 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
1507 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1508 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
1509 ; X64-SSE42-NEXT:    movd %xmm0, %eax
1510 ; X64-SSE42-NEXT:    retq
1512 ; X64-AVX1-LABEL: test_reduce_v16i32:
1513 ; X64-AVX1:       ## %bb.0:
1514 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1515 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1516 ; X64-AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1517 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1518 ; X64-AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1519 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1520 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1521 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1522 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1523 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
1524 ; X64-AVX1-NEXT:    vzeroupper
1525 ; X64-AVX1-NEXT:    retq
1527 ; X64-AVX2-LABEL: test_reduce_v16i32:
1528 ; X64-AVX2:       ## %bb.0:
1529 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1530 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1531 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1532 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1533 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1534 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1535 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1536 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
1537 ; X64-AVX2-NEXT:    vzeroupper
1538 ; X64-AVX2-NEXT:    retq
1540 ; X64-AVX512-LABEL: test_reduce_v16i32:
1541 ; X64-AVX512:       ## %bb.0:
1542 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1543 ; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1544 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1545 ; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1546 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1547 ; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1548 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1549 ; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1550 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
1551 ; X64-AVX512-NEXT:    vzeroupper
1552 ; X64-AVX512-NEXT:    retq
1553   %1  = shufflevector <16 x i32> %a0, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1554   %2  = icmp ult <16 x i32> %a0, %1
1555   %3  = select <16 x i1> %2, <16 x i32> %a0, <16 x i32> %1
1556   %4  = shufflevector <16 x i32> %3, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1557   %5  = icmp ult <16 x i32> %3, %4
1558   %6  = select <16 x i1> %5, <16 x i32> %3, <16 x i32> %4
1559   %7  = shufflevector <16 x i32> %6, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1560   %8  = icmp ult <16 x i32> %6, %7
1561   %9  = select <16 x i1> %8, <16 x i32> %6, <16 x i32> %7
1562   %10 = shufflevector <16 x i32> %9, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1563   %11 = icmp ult <16 x i32> %9, %10
1564   %12 = select <16 x i1> %11, <16 x i32> %9, <16 x i32> %10
1565   %13 = extractelement <16 x i32> %12, i32 0
1566   ret i32 %13
1569 define i16 @test_reduce_v32i16(<32 x i16> %a0) {
1570 ; X86-SSE2-LABEL: test_reduce_v32i16:
1571 ; X86-SSE2:       ## %bb.0:
1572 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1573 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1574 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1575 ; X86-SSE2-NEXT:    pminsw %xmm3, %xmm1
1576 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1577 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1578 ; X86-SSE2-NEXT:    pminsw %xmm2, %xmm0
1579 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
1580 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1581 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1582 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1583 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1584 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1585 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1586 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1587 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1588 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1589 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
1590 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1591 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1592 ; X86-SSE2-NEXT:    psrld $16, %xmm1
1593 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1594 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1595 ; X86-SSE2-NEXT:    movd %xmm1, %eax
1596 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1597 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1598 ; X86-SSE2-NEXT:    retl
1600 ; X86-SSE42-LABEL: test_reduce_v32i16:
1601 ; X86-SSE42:       ## %bb.0:
1602 ; X86-SSE42-NEXT:    pminuw %xmm3, %xmm1
1603 ; X86-SSE42-NEXT:    pminuw %xmm2, %xmm0
1604 ; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
1605 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1606 ; X86-SSE42-NEXT:    movd %xmm0, %eax
1607 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1608 ; X86-SSE42-NEXT:    retl
1610 ; X86-AVX1-LABEL: test_reduce_v32i16:
1611 ; X86-AVX1:       ## %bb.0:
1612 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1613 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1614 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1615 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1616 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
1617 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1618 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1619 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
1620 ; X86-AVX1-NEXT:    vzeroupper
1621 ; X86-AVX1-NEXT:    retl
1623 ; X86-AVX2-LABEL: test_reduce_v32i16:
1624 ; X86-AVX2:       ## %bb.0:
1625 ; X86-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1626 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1627 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1628 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1629 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1630 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
1631 ; X86-AVX2-NEXT:    vzeroupper
1632 ; X86-AVX2-NEXT:    retl
1634 ; X64-SSE2-LABEL: test_reduce_v32i16:
1635 ; X64-SSE2:       ## %bb.0:
1636 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1637 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1638 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1639 ; X64-SSE2-NEXT:    pminsw %xmm3, %xmm1
1640 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1641 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1642 ; X64-SSE2-NEXT:    pminsw %xmm2, %xmm0
1643 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
1644 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1645 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1646 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1647 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1648 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1649 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
1650 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1651 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1652 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1653 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
1654 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1655 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1656 ; X64-SSE2-NEXT:    psrld $16, %xmm1
1657 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1658 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1659 ; X64-SSE2-NEXT:    movd %xmm1, %eax
1660 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1661 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1662 ; X64-SSE2-NEXT:    retq
1664 ; X64-SSE42-LABEL: test_reduce_v32i16:
1665 ; X64-SSE42:       ## %bb.0:
1666 ; X64-SSE42-NEXT:    pminuw %xmm3, %xmm1
1667 ; X64-SSE42-NEXT:    pminuw %xmm2, %xmm0
1668 ; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
1669 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1670 ; X64-SSE42-NEXT:    movd %xmm0, %eax
1671 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1672 ; X64-SSE42-NEXT:    retq
1674 ; X64-AVX1-LABEL: test_reduce_v32i16:
1675 ; X64-AVX1:       ## %bb.0:
1676 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1677 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1678 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1679 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1680 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
1681 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1682 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
1683 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
1684 ; X64-AVX1-NEXT:    vzeroupper
1685 ; X64-AVX1-NEXT:    retq
1687 ; X64-AVX2-LABEL: test_reduce_v32i16:
1688 ; X64-AVX2:       ## %bb.0:
1689 ; X64-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1690 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1691 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1692 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1693 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
1694 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
1695 ; X64-AVX2-NEXT:    vzeroupper
1696 ; X64-AVX2-NEXT:    retq
1698 ; X64-AVX512-LABEL: test_reduce_v32i16:
1699 ; X64-AVX512:       ## %bb.0:
1700 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1701 ; X64-AVX512-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1702 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1703 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1704 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1705 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
1706 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
1707 ; X64-AVX512-NEXT:    vzeroupper
1708 ; X64-AVX512-NEXT:    retq
1709   %1  = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1710   %2  = icmp ult <32 x i16> %a0, %1
1711   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
1712   %4  = shufflevector <32 x i16> %3, <32 x i16> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1713   %5  = icmp ult <32 x i16> %3, %4
1714   %6  = select <32 x i1> %5, <32 x i16> %3, <32 x i16> %4
1715   %7  = shufflevector <32 x i16> %6, <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1716   %8  = icmp ult <32 x i16> %6, %7
1717   %9  = select <32 x i1> %8, <32 x i16> %6, <32 x i16> %7
1718   %10 = shufflevector <32 x i16> %9, <32 x i16> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1719   %11 = icmp ult <32 x i16> %9, %10
1720   %12 = select <32 x i1> %11, <32 x i16> %9, <32 x i16> %10
1721   %13 = shufflevector <32 x i16> %12, <32 x i16> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1722   %14 = icmp ult <32 x i16> %12, %13
1723   %15 = select <32 x i1> %14, <32 x i16> %12, <32 x i16> %13
1724   %16 = extractelement <32 x i16> %15, i32 0
1725   ret i16 %16
1728 define i8 @test_reduce_v64i8(<64 x i8> %a0) {
1729 ; X86-SSE2-LABEL: test_reduce_v64i8:
1730 ; X86-SSE2:       ## %bb.0:
1731 ; X86-SSE2-NEXT:    pminub %xmm3, %xmm1
1732 ; X86-SSE2-NEXT:    pminub %xmm2, %xmm0
1733 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
1734 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1735 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
1736 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1737 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
1738 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1739 ; X86-SSE2-NEXT:    psrld $16, %xmm1
1740 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
1741 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1742 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
1743 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
1744 ; X86-SSE2-NEXT:    movd %xmm0, %eax
1745 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
1746 ; X86-SSE2-NEXT:    retl
1748 ; X86-SSE42-LABEL: test_reduce_v64i8:
1749 ; X86-SSE42:       ## %bb.0:
1750 ; X86-SSE42-NEXT:    pminub %xmm3, %xmm1
1751 ; X86-SSE42-NEXT:    pminub %xmm2, %xmm0
1752 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
1753 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
1754 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
1755 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
1756 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
1757 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
1758 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
1759 ; X86-SSE42-NEXT:    retl
1761 ; X86-AVX1-LABEL: test_reduce_v64i8:
1762 ; X86-AVX1:       ## %bb.0:
1763 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1764 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1765 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
1766 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1767 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
1768 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1769 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1770 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1771 ; X86-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1772 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
1773 ; X86-AVX1-NEXT:    vzeroupper
1774 ; X86-AVX1-NEXT:    retl
1776 ; X86-AVX2-LABEL: test_reduce_v64i8:
1777 ; X86-AVX2:       ## %bb.0:
1778 ; X86-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1779 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1780 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1781 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1782 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1783 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1784 ; X86-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1785 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1786 ; X86-AVX2-NEXT:    vzeroupper
1787 ; X86-AVX2-NEXT:    retl
1789 ; X64-SSE2-LABEL: test_reduce_v64i8:
1790 ; X64-SSE2:       ## %bb.0:
1791 ; X64-SSE2-NEXT:    pminub %xmm3, %xmm1
1792 ; X64-SSE2-NEXT:    pminub %xmm2, %xmm0
1793 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
1794 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1795 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
1796 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1797 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
1798 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1799 ; X64-SSE2-NEXT:    psrld $16, %xmm1
1800 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
1801 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
1802 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
1803 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
1804 ; X64-SSE2-NEXT:    movd %xmm0, %eax
1805 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
1806 ; X64-SSE2-NEXT:    retq
1808 ; X64-SSE42-LABEL: test_reduce_v64i8:
1809 ; X64-SSE42:       ## %bb.0:
1810 ; X64-SSE42-NEXT:    pminub %xmm3, %xmm1
1811 ; X64-SSE42-NEXT:    pminub %xmm2, %xmm0
1812 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
1813 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
1814 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
1815 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
1816 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
1817 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
1818 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
1819 ; X64-SSE42-NEXT:    retq
1821 ; X64-AVX1-LABEL: test_reduce_v64i8:
1822 ; X64-AVX1:       ## %bb.0:
1823 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1824 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1825 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
1826 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1827 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
1828 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1829 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1830 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1831 ; X64-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1832 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
1833 ; X64-AVX1-NEXT:    vzeroupper
1834 ; X64-AVX1-NEXT:    retq
1836 ; X64-AVX2-LABEL: test_reduce_v64i8:
1837 ; X64-AVX2:       ## %bb.0:
1838 ; X64-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1839 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1840 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1841 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1842 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1843 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1844 ; X64-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1845 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1846 ; X64-AVX2-NEXT:    vzeroupper
1847 ; X64-AVX2-NEXT:    retq
1849 ; X64-AVX512-LABEL: test_reduce_v64i8:
1850 ; X64-AVX512:       ## %bb.0:
1851 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1852 ; X64-AVX512-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1853 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1854 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1855 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1856 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1857 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1858 ; X64-AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1859 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
1860 ; X64-AVX512-NEXT:    vzeroupper
1861 ; X64-AVX512-NEXT:    retq
1862   %1  = shufflevector <64 x i8> %a0, <64 x i8> undef, <64 x i32> <i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1863   %2  = icmp ult <64 x i8> %a0, %1
1864   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
1865   %4  = shufflevector <64 x i8> %3, <64 x i8> undef, <64 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1866   %5  = icmp ult <64 x i8> %3, %4
1867   %6  = select <64 x i1> %5, <64 x i8> %3, <64 x i8> %4
1868   %7  = shufflevector <64 x i8> %6, <64 x i8> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1869   %8  = icmp ult <64 x i8> %6, %7
1870   %9  = select <64 x i1> %8, <64 x i8> %6, <64 x i8> %7
1871   %10 = shufflevector <64 x i8> %9, <64 x i8> undef, <64 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1872   %11 = icmp ult <64 x i8> %9, %10
1873   %12 = select <64 x i1> %11, <64 x i8> %9, <64 x i8> %10
1874   %13 = shufflevector <64 x i8> %12, <64 x i8> undef, <64 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1875   %14 = icmp ult <64 x i8> %12, %13
1876   %15 = select <64 x i1> %14, <64 x i8> %12, <64 x i8> %13
1877   %16 = shufflevector <64 x i8> %15, <64 x i8> undef, <64 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1878   %17 = icmp ult <64 x i8> %15, %16
1879   %18 = select <64 x i1> %17, <64 x i8> %15, <64 x i8> %16
1880   %19 = extractelement <64 x i8> %18, i32 0
1881   ret i8 %19