[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / horizontal-reduce-umin.ll
blob5b4d3165eaa8d839810a4f0716951790dcdf259a
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-AVX1-LABEL: test_reduce_v2i64:
55 ; X86-AVX1:       ## %bb.0:
56 ; X86-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
57 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
58 ; X86-AVX1-NEXT:    ## xmm2 = mem[0,0]
59 ; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm3
60 ; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm2
61 ; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
62 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
63 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
64 ; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
65 ; X86-AVX1-NEXT:    retl
67 ; X86-AVX2-LABEL: test_reduce_v2i64:
68 ; X86-AVX2:       ## %bb.0:
69 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
70 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
71 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
72 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
73 ; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
74 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
75 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
76 ; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
77 ; X86-AVX2-NEXT:    retl
79 ; X64-SSE2-LABEL: test_reduce_v2i64:
80 ; X64-SSE2:       ## %bb.0:
81 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
82 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
83 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
84 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
85 ; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
86 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
87 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
88 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
89 ; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
90 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
91 ; X64-SSE2-NEXT:    pand %xmm5, %xmm2
92 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
93 ; X64-SSE2-NEXT:    por %xmm2, %xmm3
94 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
95 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
96 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
97 ; X64-SSE2-NEXT:    movq %xmm3, %rax
98 ; X64-SSE2-NEXT:    retq
100 ; X64-SSE42-LABEL: test_reduce_v2i64:
101 ; X64-SSE42:       ## %bb.0:
102 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
103 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
104 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
105 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm3
106 ; X64-SSE42-NEXT:    pxor %xmm0, %xmm3
107 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm0
108 ; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
109 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
110 ; X64-SSE42-NEXT:    movq %xmm2, %rax
111 ; X64-SSE42-NEXT:    retq
113 ; X64-AVX1-LABEL: test_reduce_v2i64:
114 ; X64-AVX1:       ## %bb.0:
115 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
116 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
117 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
118 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
119 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
120 ; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
121 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
122 ; X64-AVX1-NEXT:    retq
124 ; X64-AVX2-LABEL: test_reduce_v2i64:
125 ; X64-AVX2:       ## %bb.0:
126 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
127 ; X64-AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
128 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
129 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
130 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
131 ; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
132 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
133 ; X64-AVX2-NEXT:    retq
135 ; X64-AVX512-LABEL: test_reduce_v2i64:
136 ; X64-AVX512:       ## %bb.0:
137 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
138 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
139 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
140 ; X64-AVX512-NEXT:    retq
141   %1 = shufflevector <2 x i64> %a0, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>
142   %2 = icmp ult <2 x i64> %a0, %1
143   %3 = select <2 x i1> %2, <2 x i64> %a0, <2 x i64> %1
144   %4 = extractelement <2 x i64> %3, i32 0
145   ret i64 %4
148 define i32 @test_reduce_v4i32(<4 x i32> %a0) {
149 ; X86-SSE2-LABEL: test_reduce_v4i32:
150 ; X86-SSE2:       ## %bb.0:
151 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
152 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
153 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
154 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
155 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
156 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
157 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
158 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
159 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
160 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
161 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
162 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
163 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
164 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
165 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
166 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
167 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
168 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
169 ; X86-SSE2-NEXT:    movd %xmm2, %eax
170 ; X86-SSE2-NEXT:    retl
172 ; X86-SSE42-LABEL: test_reduce_v4i32:
173 ; X86-SSE42:       ## %bb.0:
174 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
175 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
176 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
177 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
178 ; X86-SSE42-NEXT:    movd %xmm0, %eax
179 ; X86-SSE42-NEXT:    retl
181 ; X86-AVX-LABEL: test_reduce_v4i32:
182 ; X86-AVX:       ## %bb.0:
183 ; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
184 ; X86-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
185 ; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
186 ; X86-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
187 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
188 ; X86-AVX-NEXT:    retl
190 ; X64-SSE2-LABEL: test_reduce_v4i32:
191 ; X64-SSE2:       ## %bb.0:
192 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
193 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
194 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
195 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
196 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
197 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
198 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
199 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
200 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
201 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
202 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
203 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
204 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
205 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
206 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
207 ; X64-SSE2-NEXT:    pand %xmm2, %xmm4
208 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
209 ; X64-SSE2-NEXT:    por %xmm4, %xmm2
210 ; X64-SSE2-NEXT:    movd %xmm2, %eax
211 ; X64-SSE2-NEXT:    retq
213 ; X64-SSE42-LABEL: test_reduce_v4i32:
214 ; X64-SSE42:       ## %bb.0:
215 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
216 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
217 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
218 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
219 ; X64-SSE42-NEXT:    movd %xmm0, %eax
220 ; X64-SSE42-NEXT:    retq
222 ; X64-AVX-LABEL: test_reduce_v4i32:
223 ; X64-AVX:       ## %bb.0:
224 ; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
225 ; X64-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
226 ; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
227 ; X64-AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
228 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
229 ; X64-AVX-NEXT:    retq
230   %1 = shufflevector <4 x i32> %a0, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
231   %2 = icmp ult <4 x i32> %a0, %1
232   %3 = select <4 x i1> %2, <4 x i32> %a0, <4 x i32> %1
233   %4 = shufflevector <4 x i32> %3, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
234   %5 = icmp ult <4 x i32> %3, %4
235   %6 = select <4 x i1> %5, <4 x i32> %3, <4 x i32> %4
236   %7 = extractelement <4 x i32> %6, i32 0
237   ret i32 %7
240 define i16 @test_reduce_v8i16(<8 x i16> %a0) {
241 ; X86-SSE2-LABEL: test_reduce_v8i16:
242 ; X86-SSE2:       ## %bb.0:
243 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
244 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
245 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
246 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
247 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
248 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
249 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
250 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
251 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
252 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
253 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
254 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
255 ; X86-SSE2-NEXT:    psrld $16, %xmm1
256 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
257 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
258 ; X86-SSE2-NEXT:    movd %xmm1, %eax
259 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
260 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
261 ; X86-SSE2-NEXT:    retl
263 ; X86-SSE42-LABEL: test_reduce_v8i16:
264 ; X86-SSE42:       ## %bb.0:
265 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
266 ; X86-SSE42-NEXT:    movd %xmm0, %eax
267 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
268 ; X86-SSE42-NEXT:    retl
270 ; X86-AVX-LABEL: test_reduce_v8i16:
271 ; X86-AVX:       ## %bb.0:
272 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
273 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
274 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
275 ; X86-AVX-NEXT:    retl
277 ; X64-SSE2-LABEL: test_reduce_v8i16:
278 ; X64-SSE2:       ## %bb.0:
279 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
280 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
281 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
282 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
283 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
284 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
285 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
286 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
287 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
288 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
289 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
290 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
291 ; X64-SSE2-NEXT:    psrld $16, %xmm1
292 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
293 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
294 ; X64-SSE2-NEXT:    movd %xmm1, %eax
295 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
296 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
297 ; X64-SSE2-NEXT:    retq
299 ; X64-SSE42-LABEL: test_reduce_v8i16:
300 ; X64-SSE42:       ## %bb.0:
301 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
302 ; X64-SSE42-NEXT:    movd %xmm0, %eax
303 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
304 ; X64-SSE42-NEXT:    retq
306 ; X64-AVX-LABEL: test_reduce_v8i16:
307 ; X64-AVX:       ## %bb.0:
308 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
309 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
310 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
311 ; X64-AVX-NEXT:    retq
312   %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>
313   %2  = icmp ult <8 x i16> %a0, %1
314   %3  = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
315   %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>
316   %5  = icmp ult <8 x i16> %3, %4
317   %6  = select <8 x i1> %5, <8 x i16> %3, <8 x i16> %4
318   %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>
319   %8  = icmp ult <8 x i16> %6, %7
320   %9  = select <8 x i1> %8, <8 x i16> %6, <8 x i16> %7
321   %10 = extractelement <8 x i16> %9, i32 0
322   ret i16 %10
325 define i8 @test_reduce_v16i8(<16 x i8> %a0) {
326 ; X86-SSE2-LABEL: test_reduce_v16i8:
327 ; X86-SSE2:       ## %bb.0:
328 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
329 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
330 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
331 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
332 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
333 ; X86-SSE2-NEXT:    psrld $16, %xmm1
334 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
335 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
336 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
337 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
338 ; X86-SSE2-NEXT:    movd %xmm0, %eax
339 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
340 ; X86-SSE2-NEXT:    retl
342 ; X86-SSE42-LABEL: test_reduce_v16i8:
343 ; X86-SSE42:       ## %bb.0:
344 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
345 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
346 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
347 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
348 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
349 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
350 ; X86-SSE42-NEXT:    retl
352 ; X86-AVX-LABEL: test_reduce_v16i8:
353 ; X86-AVX:       ## %bb.0:
354 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
355 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
356 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
357 ; X86-AVX-NEXT:    vpextrb $0, %xmm0, %eax
358 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
359 ; X86-AVX-NEXT:    retl
361 ; X64-SSE2-LABEL: test_reduce_v16i8:
362 ; X64-SSE2:       ## %bb.0:
363 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
364 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
365 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
366 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
367 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
368 ; X64-SSE2-NEXT:    psrld $16, %xmm1
369 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
370 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
371 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
372 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
373 ; X64-SSE2-NEXT:    movd %xmm0, %eax
374 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
375 ; X64-SSE2-NEXT:    retq
377 ; X64-SSE42-LABEL: test_reduce_v16i8:
378 ; X64-SSE42:       ## %bb.0:
379 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
380 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
381 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
382 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
383 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
384 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
385 ; X64-SSE42-NEXT:    retq
387 ; X64-AVX-LABEL: test_reduce_v16i8:
388 ; X64-AVX:       ## %bb.0:
389 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
390 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
391 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
392 ; X64-AVX-NEXT:    vpextrb $0, %xmm0, %eax
393 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
394 ; X64-AVX-NEXT:    retq
395   %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>
396   %2  = icmp ult <16 x i8> %a0, %1
397   %3  = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
398   %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>
399   %5  = icmp ult <16 x i8> %3, %4
400   %6  = select <16 x i1> %5, <16 x i8> %3, <16 x i8> %4
401   %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>
402   %8  = icmp ult <16 x i8> %6, %7
403   %9  = select <16 x i1> %8, <16 x i8> %6, <16 x i8> %7
404   %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>
405   %11 = icmp ult <16 x i8> %9, %10
406   %12 = select <16 x i1> %11, <16 x i8> %9, <16 x i8> %10
407   %13 = extractelement <16 x i8> %12, i32 0
408   ret i8 %13
412 ; 256-bit Vectors
415 define i64 @test_reduce_v4i64(<4 x i64> %a0) {
416 ; X86-SSE2-LABEL: test_reduce_v4i64:
417 ; X86-SSE2:       ## %bb.0:
418 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
419 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
420 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
421 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
422 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
423 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
424 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
425 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
426 ; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
427 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
428 ; X86-SSE2-NEXT:    pand %xmm6, %xmm3
429 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
430 ; X86-SSE2-NEXT:    por %xmm3, %xmm4
431 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
432 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
433 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
434 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
435 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
436 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
437 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
438 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
439 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
440 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
441 ; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
442 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
443 ; X86-SSE2-NEXT:    pand %xmm5, %xmm1
444 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
445 ; X86-SSE2-NEXT:    por %xmm1, %xmm2
446 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
447 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
448 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
449 ; X86-SSE2-NEXT:    movd %xmm2, %eax
450 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
451 ; X86-SSE2-NEXT:    movd %xmm0, %edx
452 ; X86-SSE2-NEXT:    retl
454 ; X86-SSE42-LABEL: test_reduce_v4i64:
455 ; X86-SSE42:       ## %bb.0:
456 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
457 ; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
458 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm4
459 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm4
460 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
461 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
462 ; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
463 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
464 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
465 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
466 ; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
467 ; X86-SSE42-NEXT:    pxor %xmm2, %xmm3
468 ; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
469 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
470 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
471 ; X86-SSE42-NEXT:    movd %xmm2, %eax
472 ; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
473 ; X86-SSE42-NEXT:    retl
475 ; X86-AVX1-LABEL: test_reduce_v4i64:
476 ; X86-AVX1:       ## %bb.0:
477 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0]
478 ; X86-AVX1-NEXT:    ## xmm1 = mem[0,0]
479 ; X86-AVX1-NEXT:    vxorps %xmm1, %xmm0, %xmm2
480 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
481 ; X86-AVX1-NEXT:    vxorps %xmm1, %xmm3, %xmm4
482 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
483 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
484 ; X86-AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[2,3,0,1]
485 ; X86-AVX1-NEXT:    vxorpd %xmm1, %xmm0, %xmm3
486 ; X86-AVX1-NEXT:    vxorpd %xmm1, %xmm2, %xmm1
487 ; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
488 ; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
489 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
490 ; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
491 ; X86-AVX1-NEXT:    vzeroupper
492 ; X86-AVX1-NEXT:    retl
494 ; X86-AVX2-LABEL: test_reduce_v4i64:
495 ; X86-AVX2:       ## %bb.0:
496 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
497 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
498 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
499 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm4
500 ; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
501 ; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
502 ; X86-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
503 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
504 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
505 ; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
506 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
507 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
508 ; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
509 ; X86-AVX2-NEXT:    vzeroupper
510 ; X86-AVX2-NEXT:    retl
512 ; X64-SSE2-LABEL: test_reduce_v4i64:
513 ; X64-SSE2:       ## %bb.0:
514 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
515 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
516 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
517 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
518 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
519 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
520 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
521 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
522 ; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
523 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
524 ; X64-SSE2-NEXT:    pand %xmm6, %xmm3
525 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
526 ; X64-SSE2-NEXT:    por %xmm3, %xmm4
527 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
528 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
529 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
530 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
531 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
532 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
533 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
534 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
535 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
536 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
537 ; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
538 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
539 ; X64-SSE2-NEXT:    pand %xmm5, %xmm1
540 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
541 ; X64-SSE2-NEXT:    por %xmm1, %xmm2
542 ; X64-SSE2-NEXT:    pand %xmm2, %xmm4
543 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
544 ; X64-SSE2-NEXT:    por %xmm4, %xmm2
545 ; X64-SSE2-NEXT:    movq %xmm2, %rax
546 ; X64-SSE2-NEXT:    retq
548 ; X64-SSE42-LABEL: test_reduce_v4i64:
549 ; X64-SSE42:       ## %bb.0:
550 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm2
551 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
552 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
553 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm4
554 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
555 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
556 ; X64-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
557 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
558 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
559 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
560 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
561 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm3
562 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
563 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
564 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
565 ; X64-SSE42-NEXT:    movq %xmm2, %rax
566 ; X64-SSE42-NEXT:    retq
568 ; X64-AVX1-LABEL: test_reduce_v4i64:
569 ; X64-AVX1:       ## %bb.0:
570 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
571 ; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
572 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
573 ; X64-AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm4
574 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
575 ; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
576 ; X64-AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[2,3,0,1]
577 ; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm0, %xmm3
578 ; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm2, %xmm1
579 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
580 ; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
581 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
582 ; X64-AVX1-NEXT:    vzeroupper
583 ; X64-AVX1-NEXT:    retq
585 ; X64-AVX2-LABEL: test_reduce_v4i64:
586 ; X64-AVX2:       ## %bb.0:
587 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
588 ; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
589 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
590 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm4
591 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
592 ; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
593 ; X64-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
594 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
595 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
596 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
597 ; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
598 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
599 ; X64-AVX2-NEXT:    vzeroupper
600 ; X64-AVX2-NEXT:    retq
602 ; X64-AVX512-LABEL: test_reduce_v4i64:
603 ; X64-AVX512:       ## %bb.0:
604 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
605 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
606 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
607 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
608 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
609 ; X64-AVX512-NEXT:    vzeroupper
610 ; X64-AVX512-NEXT:    retq
611   %1 = shufflevector <4 x i64> %a0, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
612   %2 = icmp ult <4 x i64> %a0, %1
613   %3 = select <4 x i1> %2, <4 x i64> %a0, <4 x i64> %1
614   %4 = shufflevector <4 x i64> %3, <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
615   %5 = icmp ult <4 x i64> %3, %4
616   %6 = select <4 x i1> %5, <4 x i64> %3, <4 x i64> %4
617   %7 = extractelement <4 x i64> %6, i32 0
618   ret i64 %7
621 define i32 @test_reduce_v8i32(<8 x i32> %a0) {
622 ; X86-SSE2-LABEL: test_reduce_v8i32:
623 ; X86-SSE2:       ## %bb.0:
624 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
625 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
626 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
627 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
628 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
629 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
630 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
631 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
632 ; X86-SSE2-NEXT:    por %xmm0, %xmm4
633 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
634 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
635 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
636 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
637 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
638 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
639 ; X86-SSE2-NEXT:    pand %xmm3, %xmm4
640 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
641 ; X86-SSE2-NEXT:    por %xmm4, %xmm3
642 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
643 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
644 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
645 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
646 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
647 ; X86-SSE2-NEXT:    pand %xmm2, %xmm3
648 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
649 ; X86-SSE2-NEXT:    por %xmm3, %xmm2
650 ; X86-SSE2-NEXT:    movd %xmm2, %eax
651 ; X86-SSE2-NEXT:    retl
653 ; X86-SSE42-LABEL: test_reduce_v8i32:
654 ; X86-SSE42:       ## %bb.0:
655 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
656 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
657 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
658 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
659 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
660 ; X86-SSE42-NEXT:    movd %xmm0, %eax
661 ; X86-SSE42-NEXT:    retl
663 ; X86-AVX1-LABEL: test_reduce_v8i32:
664 ; X86-AVX1:       ## %bb.0:
665 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
666 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
667 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
668 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
669 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
670 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
671 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
672 ; X86-AVX1-NEXT:    vzeroupper
673 ; X86-AVX1-NEXT:    retl
675 ; X86-AVX2-LABEL: test_reduce_v8i32:
676 ; X86-AVX2:       ## %bb.0:
677 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
678 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
679 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
680 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
681 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
682 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
683 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
684 ; X86-AVX2-NEXT:    vzeroupper
685 ; X86-AVX2-NEXT:    retl
687 ; X64-SSE2-LABEL: test_reduce_v8i32:
688 ; X64-SSE2:       ## %bb.0:
689 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
690 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
691 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
692 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
693 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
694 ; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
695 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
696 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
697 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
698 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
699 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
700 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
701 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
702 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
703 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
704 ; X64-SSE2-NEXT:    pand %xmm3, %xmm4
705 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
706 ; X64-SSE2-NEXT:    por %xmm4, %xmm3
707 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
708 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
709 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
710 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
711 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
712 ; X64-SSE2-NEXT:    pand %xmm2, %xmm3
713 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
714 ; X64-SSE2-NEXT:    por %xmm3, %xmm2
715 ; X64-SSE2-NEXT:    movd %xmm2, %eax
716 ; X64-SSE2-NEXT:    retq
718 ; X64-SSE42-LABEL: test_reduce_v8i32:
719 ; X64-SSE42:       ## %bb.0:
720 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
721 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
722 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
723 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
724 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
725 ; X64-SSE42-NEXT:    movd %xmm0, %eax
726 ; X64-SSE42-NEXT:    retq
728 ; X64-AVX1-LABEL: test_reduce_v8i32:
729 ; X64-AVX1:       ## %bb.0:
730 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
731 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
732 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
733 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
734 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
735 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
736 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
737 ; X64-AVX1-NEXT:    vzeroupper
738 ; X64-AVX1-NEXT:    retq
740 ; X64-AVX2-LABEL: test_reduce_v8i32:
741 ; X64-AVX2:       ## %bb.0:
742 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
743 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
744 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
745 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
746 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
747 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
748 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
749 ; X64-AVX2-NEXT:    vzeroupper
750 ; X64-AVX2-NEXT:    retq
752 ; X64-AVX512-LABEL: test_reduce_v8i32:
753 ; X64-AVX512:       ## %bb.0:
754 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
755 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
756 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
757 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
758 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
759 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
760 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
761 ; X64-AVX512-NEXT:    vzeroupper
762 ; X64-AVX512-NEXT:    retq
763   %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>
764   %2  = icmp ult <8 x i32> %a0, %1
765   %3  = select <8 x i1> %2, <8 x i32> %a0, <8 x i32> %1
766   %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>
767   %5  = icmp ult <8 x i32> %3, %4
768   %6  = select <8 x i1> %5, <8 x i32> %3, <8 x i32> %4
769   %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>
770   %8  = icmp ult <8 x i32> %6, %7
771   %9  = select <8 x i1> %8, <8 x i32> %6, <8 x i32> %7
772   %10 = extractelement <8 x i32> %9, i32 0
773   ret i32 %10
776 define i16 @test_reduce_v16i16(<16 x i16> %a0) {
777 ; X86-SSE2-LABEL: test_reduce_v16i16:
778 ; X86-SSE2:       ## %bb.0:
779 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
780 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
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:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
786 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
787 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
788 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
789 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
790 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
791 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
792 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
793 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
794 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
795 ; X86-SSE2-NEXT:    psrld $16, %xmm1
796 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
797 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
798 ; X86-SSE2-NEXT:    movd %xmm1, %eax
799 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
800 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
801 ; X86-SSE2-NEXT:    retl
803 ; X86-SSE42-LABEL: test_reduce_v16i16:
804 ; X86-SSE42:       ## %bb.0:
805 ; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
806 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
807 ; X86-SSE42-NEXT:    movd %xmm0, %eax
808 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
809 ; X86-SSE42-NEXT:    retl
811 ; X86-AVX1-LABEL: test_reduce_v16i16:
812 ; X86-AVX1:       ## %bb.0:
813 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
814 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
815 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
816 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
817 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
818 ; X86-AVX1-NEXT:    vzeroupper
819 ; X86-AVX1-NEXT:    retl
821 ; X86-AVX2-LABEL: test_reduce_v16i16:
822 ; X86-AVX2:       ## %bb.0:
823 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
824 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
825 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
826 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
827 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
828 ; X86-AVX2-NEXT:    vzeroupper
829 ; X86-AVX2-NEXT:    retl
831 ; X64-SSE2-LABEL: test_reduce_v16i16:
832 ; X64-SSE2:       ## %bb.0:
833 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
834 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
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:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
840 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
841 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
842 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
843 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
844 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
845 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
846 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
847 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
848 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
849 ; X64-SSE2-NEXT:    psrld $16, %xmm1
850 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
851 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
852 ; X64-SSE2-NEXT:    movd %xmm1, %eax
853 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
854 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
855 ; X64-SSE2-NEXT:    retq
857 ; X64-SSE42-LABEL: test_reduce_v16i16:
858 ; X64-SSE42:       ## %bb.0:
859 ; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
860 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
861 ; X64-SSE42-NEXT:    movd %xmm0, %eax
862 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
863 ; X64-SSE42-NEXT:    retq
865 ; X64-AVX1-LABEL: test_reduce_v16i16:
866 ; X64-AVX1:       ## %bb.0:
867 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
868 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
869 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
870 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
871 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
872 ; X64-AVX1-NEXT:    vzeroupper
873 ; X64-AVX1-NEXT:    retq
875 ; X64-AVX2-LABEL: test_reduce_v16i16:
876 ; X64-AVX2:       ## %bb.0:
877 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
878 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
879 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
880 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
881 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
882 ; X64-AVX2-NEXT:    vzeroupper
883 ; X64-AVX2-NEXT:    retq
885 ; X64-AVX512-LABEL: test_reduce_v16i16:
886 ; X64-AVX512:       ## %bb.0:
887 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
888 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
889 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
890 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
891 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
892 ; X64-AVX512-NEXT:    vzeroupper
893 ; X64-AVX512-NEXT:    retq
894   %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>
895   %2  = icmp ult <16 x i16> %a0, %1
896   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
897   %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>
898   %5  = icmp ult <16 x i16> %3, %4
899   %6  = select <16 x i1> %5, <16 x i16> %3, <16 x i16> %4
900   %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>
901   %8  = icmp ult <16 x i16> %6, %7
902   %9  = select <16 x i1> %8, <16 x i16> %6, <16 x i16> %7
903   %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>
904   %11 = icmp ult <16 x i16> %9, %10
905   %12 = select <16 x i1> %11, <16 x i16> %9, <16 x i16> %10
906   %13 = extractelement <16 x i16> %12, i32 0
907   ret i16 %13
910 define i8 @test_reduce_v32i8(<32 x i8> %a0) {
911 ; X86-SSE2-LABEL: test_reduce_v32i8:
912 ; X86-SSE2:       ## %bb.0:
913 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
914 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
915 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
916 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
917 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
918 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
919 ; X86-SSE2-NEXT:    psrld $16, %xmm1
920 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
921 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
922 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
923 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
924 ; X86-SSE2-NEXT:    movd %xmm0, %eax
925 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
926 ; X86-SSE2-NEXT:    retl
928 ; X86-SSE42-LABEL: test_reduce_v32i8:
929 ; X86-SSE42:       ## %bb.0:
930 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
931 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
932 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
933 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
934 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
935 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
936 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
937 ; X86-SSE42-NEXT:    retl
939 ; X86-AVX1-LABEL: test_reduce_v32i8:
940 ; X86-AVX1:       ## %bb.0:
941 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
942 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
943 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
944 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
945 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
946 ; X86-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
947 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
948 ; X86-AVX1-NEXT:    vzeroupper
949 ; X86-AVX1-NEXT:    retl
951 ; X86-AVX2-LABEL: test_reduce_v32i8:
952 ; X86-AVX2:       ## %bb.0:
953 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
954 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
955 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
956 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
957 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
958 ; X86-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
959 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
960 ; X86-AVX2-NEXT:    vzeroupper
961 ; X86-AVX2-NEXT:    retl
963 ; X64-SSE2-LABEL: test_reduce_v32i8:
964 ; X64-SSE2:       ## %bb.0:
965 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
966 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
967 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
968 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
969 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
970 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
971 ; X64-SSE2-NEXT:    psrld $16, %xmm1
972 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
973 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
974 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
975 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
976 ; X64-SSE2-NEXT:    movd %xmm0, %eax
977 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
978 ; X64-SSE2-NEXT:    retq
980 ; X64-SSE42-LABEL: test_reduce_v32i8:
981 ; X64-SSE42:       ## %bb.0:
982 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
983 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
984 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
985 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
986 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
987 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
988 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
989 ; X64-SSE42-NEXT:    retq
991 ; X64-AVX1-LABEL: test_reduce_v32i8:
992 ; X64-AVX1:       ## %bb.0:
993 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
994 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
995 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
996 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
997 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
998 ; X64-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
999 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
1000 ; X64-AVX1-NEXT:    vzeroupper
1001 ; X64-AVX1-NEXT:    retq
1003 ; X64-AVX2-LABEL: test_reduce_v32i8:
1004 ; X64-AVX2:       ## %bb.0:
1005 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1006 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1007 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1008 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1009 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1010 ; X64-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1011 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1012 ; X64-AVX2-NEXT:    vzeroupper
1013 ; X64-AVX2-NEXT:    retq
1015 ; X64-AVX512-LABEL: test_reduce_v32i8:
1016 ; X64-AVX512:       ## %bb.0:
1017 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1018 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1019 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1020 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1021 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1022 ; X64-AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1023 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
1024 ; X64-AVX512-NEXT:    vzeroupper
1025 ; X64-AVX512-NEXT:    retq
1026   %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>
1027   %2  = icmp ult <32 x i8> %a0, %1
1028   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
1029   %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>
1030   %5  = icmp ult <32 x i8> %3, %4
1031   %6  = select <32 x i1> %5, <32 x i8> %3, <32 x i8> %4
1032   %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>
1033   %8  = icmp ult <32 x i8> %6, %7
1034   %9  = select <32 x i1> %8, <32 x i8> %6, <32 x i8> %7
1035   %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>
1036   %11 = icmp ult <32 x i8> %9, %10
1037   %12 = select <32 x i1> %11, <32 x i8> %9, <32 x i8> %10
1038   %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>
1039   %14 = icmp ult <32 x i8> %12, %13
1040   %15 = select <32 x i1> %14, <32 x i8> %12, <32 x i8> %13
1041   %16 = extractelement <32 x i8> %15, i32 0
1042   ret i8 %16
1046 ; 512-bit Vectors
1049 define i64 @test_reduce_v8i64(<8 x i64> %a0) {
1050 ; X86-SSE2-LABEL: test_reduce_v8i64:
1051 ; X86-SSE2:       ## %bb.0:
1052 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1053 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
1054 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
1055 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1056 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
1057 ; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
1058 ; X86-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1059 ; X86-SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1060 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1061 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1062 ; X86-SSE2-NEXT:    pand %xmm5, %xmm6
1063 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1064 ; X86-SSE2-NEXT:    por %xmm6, %xmm5
1065 ; X86-SSE2-NEXT:    pand %xmm5, %xmm1
1066 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
1067 ; X86-SSE2-NEXT:    por %xmm1, %xmm5
1068 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1069 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1070 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1071 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1072 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1073 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1074 ; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
1075 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
1076 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1077 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
1078 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
1079 ; X86-SSE2-NEXT:    por %xmm3, %xmm1
1080 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1081 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
1082 ; X86-SSE2-NEXT:    por %xmm0, %xmm1
1083 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1084 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1085 ; X86-SSE2-NEXT:    movdqa %xmm5, %xmm2
1086 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1087 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1088 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1089 ; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
1090 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1091 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1092 ; X86-SSE2-NEXT:    pand %xmm0, %xmm2
1093 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1094 ; X86-SSE2-NEXT:    por %xmm2, %xmm0
1095 ; X86-SSE2-NEXT:    pand %xmm0, %xmm1
1096 ; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
1097 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
1098 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1099 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
1100 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1101 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
1102 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm3
1103 ; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1104 ; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1105 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1106 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1107 ; X86-SSE2-NEXT:    pand %xmm2, %xmm4
1108 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1109 ; X86-SSE2-NEXT:    por %xmm4, %xmm2
1110 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1111 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
1112 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
1113 ; X86-SSE2-NEXT:    movd %xmm2, %eax
1114 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1115 ; X86-SSE2-NEXT:    movd %xmm0, %edx
1116 ; X86-SSE2-NEXT:    retl
1118 ; X86-SSE42-LABEL: test_reduce_v8i64:
1119 ; X86-SSE42:       ## %bb.0:
1120 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm5
1121 ; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
1122 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm6
1123 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm6
1124 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
1125 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1126 ; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
1127 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1128 ; X86-SSE42-NEXT:    movdqa %xmm5, %xmm1
1129 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm1
1130 ; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
1131 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1132 ; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1133 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1134 ; X86-SSE42-NEXT:    movapd %xmm2, %xmm1
1135 ; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
1136 ; X86-SSE42-NEXT:    movapd %xmm3, %xmm0
1137 ; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
1138 ; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1139 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1140 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1141 ; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
1142 ; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
1143 ; X86-SSE42-NEXT:    pxor %xmm1, %xmm4
1144 ; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
1145 ; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
1146 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1147 ; X86-SSE42-NEXT:    movd %xmm1, %eax
1148 ; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
1149 ; X86-SSE42-NEXT:    retl
1151 ; X86-AVX1-LABEL: test_reduce_v8i64:
1152 ; X86-AVX1:       ## %bb.0:
1153 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1154 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0]
1155 ; X86-AVX1-NEXT:    ## xmm3 = mem[0,0]
1156 ; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm4
1157 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1158 ; X86-AVX1-NEXT:    vxorps %xmm3, %xmm5, %xmm6
1159 ; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
1160 ; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm6
1161 ; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm7
1162 ; X86-AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
1163 ; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm1, %xmm0
1164 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
1165 ; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm2, %xmm5, %xmm2
1166 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
1167 ; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
1168 ; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
1169 ; X86-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1170 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1171 ; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
1172 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1173 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1174 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1175 ; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
1176 ; X86-AVX1-NEXT:    vzeroupper
1177 ; X86-AVX1-NEXT:    retl
1179 ; X86-AVX2-LABEL: test_reduce_v8i64:
1180 ; X86-AVX2:       ## %bb.0:
1181 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1182 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1183 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
1184 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1185 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1186 ; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1187 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
1188 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm4
1189 ; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1190 ; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1191 ; X86-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1192 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
1193 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
1194 ; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
1195 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1196 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1197 ; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
1198 ; X86-AVX2-NEXT:    vzeroupper
1199 ; X86-AVX2-NEXT:    retl
1201 ; X64-SSE2-LABEL: test_reduce_v8i64:
1202 ; X64-SSE2:       ## %bb.0:
1203 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1204 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
1205 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
1206 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1207 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
1208 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
1209 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1210 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1211 ; X64-SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1212 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1213 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
1214 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1215 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
1216 ; X64-SSE2-NEXT:    pand %xmm5, %xmm1
1217 ; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
1218 ; X64-SSE2-NEXT:    por %xmm1, %xmm5
1219 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1220 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1221 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
1222 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1223 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1224 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1225 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1226 ; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
1227 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1228 ; X64-SSE2-NEXT:    pand %xmm7, %xmm1
1229 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1230 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1231 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1232 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
1233 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
1234 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
1235 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1236 ; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
1237 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1238 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1239 ; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1240 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1241 ; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
1242 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1243 ; X64-SSE2-NEXT:    pand %xmm6, %xmm0
1244 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1245 ; X64-SSE2-NEXT:    por %xmm0, %xmm1
1246 ; X64-SSE2-NEXT:    pand %xmm1, %xmm3
1247 ; X64-SSE2-NEXT:    pandn %xmm5, %xmm1
1248 ; X64-SSE2-NEXT:    por %xmm3, %xmm1
1249 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1250 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1251 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1252 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
1253 ; X64-SSE2-NEXT:    movdqa %xmm4, %xmm3
1254 ; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1255 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1256 ; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1257 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1258 ; X64-SSE2-NEXT:    pand %xmm5, %xmm2
1259 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1260 ; X64-SSE2-NEXT:    por %xmm2, %xmm3
1261 ; X64-SSE2-NEXT:    pand %xmm3, %xmm1
1262 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
1263 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1264 ; X64-SSE2-NEXT:    movq %xmm3, %rax
1265 ; X64-SSE2-NEXT:    retq
1267 ; X64-SSE42-LABEL: test_reduce_v8i64:
1268 ; X64-SSE42:       ## %bb.0:
1269 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm5
1270 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1271 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm6
1272 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm6
1273 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
1274 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1275 ; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
1276 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1277 ; X64-SSE42-NEXT:    movdqa %xmm5, %xmm1
1278 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm1
1279 ; X64-SSE42-NEXT:    movdqa %xmm2, %xmm0
1280 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1281 ; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1282 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1283 ; X64-SSE42-NEXT:    movapd %xmm2, %xmm1
1284 ; X64-SSE42-NEXT:    xorpd %xmm4, %xmm1
1285 ; X64-SSE42-NEXT:    movapd %xmm3, %xmm0
1286 ; X64-SSE42-NEXT:    xorpd %xmm4, %xmm0
1287 ; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
1288 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1289 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1290 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
1291 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
1292 ; X64-SSE42-NEXT:    pxor %xmm1, %xmm4
1293 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
1294 ; X64-SSE42-NEXT:    movdqa %xmm4, %xmm0
1295 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1296 ; X64-SSE42-NEXT:    movq %xmm1, %rax
1297 ; X64-SSE42-NEXT:    retq
1299 ; X64-AVX1-LABEL: test_reduce_v8i64:
1300 ; X64-AVX1:       ## %bb.0:
1301 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1302 ; X64-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1303 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
1304 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1305 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm6
1306 ; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
1307 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm6
1308 ; X64-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm7
1309 ; X64-AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
1310 ; X64-AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm1, %xmm0
1311 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
1312 ; X64-AVX1-NEXT:    vblendvpd %xmm4, %xmm2, %xmm5, %xmm2
1313 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
1314 ; X64-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
1315 ; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
1316 ; X64-AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1317 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
1318 ; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
1319 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1320 ; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1321 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
1322 ; X64-AVX1-NEXT:    vzeroupper
1323 ; X64-AVX1-NEXT:    retq
1325 ; X64-AVX2-LABEL: test_reduce_v8i64:
1326 ; X64-AVX2:       ## %bb.0:
1327 ; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1328 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1329 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
1330 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
1331 ; X64-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1332 ; X64-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1333 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
1334 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm4
1335 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1336 ; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1337 ; X64-AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1338 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
1339 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
1340 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
1341 ; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1342 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
1343 ; X64-AVX2-NEXT:    vzeroupper
1344 ; X64-AVX2-NEXT:    retq
1346 ; X64-AVX512-LABEL: test_reduce_v8i64:
1347 ; X64-AVX512:       ## %bb.0:
1348 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1349 ; X64-AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
1350 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1351 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
1352 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1353 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
1354 ; X64-AVX512-NEXT:    vmovq %xmm0, %rax
1355 ; X64-AVX512-NEXT:    vzeroupper
1356 ; X64-AVX512-NEXT:    retq
1357   %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>
1358   %2  = icmp ult <8 x i64> %a0, %1
1359   %3  = select <8 x i1> %2, <8 x i64> %a0, <8 x i64> %1
1360   %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>
1361   %5  = icmp ult <8 x i64> %3, %4
1362   %6  = select <8 x i1> %5, <8 x i64> %3, <8 x i64> %4
1363   %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>
1364   %8  = icmp ult <8 x i64> %6, %7
1365   %9  = select <8 x i1> %8, <8 x i64> %6, <8 x i64> %7
1366   %10 = extractelement <8 x i64> %9, i32 0
1367   ret i64 %10
1370 define i32 @test_reduce_v16i32(<16 x i32> %a0) {
1371 ; X86-SSE2-LABEL: test_reduce_v16i32:
1372 ; X86-SSE2:       ## %bb.0:
1373 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1374 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
1375 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
1376 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1377 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
1378 ; X86-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1379 ; X86-SSE2-NEXT:    pand %xmm6, %xmm1
1380 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm6
1381 ; X86-SSE2-NEXT:    por %xmm1, %xmm6
1382 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1383 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1384 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
1385 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1386 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1387 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
1388 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm3
1389 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
1390 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm0
1391 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1392 ; X86-SSE2-NEXT:    movdqa %xmm6, %xmm1
1393 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1394 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1395 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
1396 ; X86-SSE2-NEXT:    pandn %xmm6, %xmm1
1397 ; X86-SSE2-NEXT:    por %xmm3, %xmm1
1398 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1399 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
1400 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1401 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
1402 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1403 ; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1404 ; X86-SSE2-NEXT:    pand %xmm3, %xmm1
1405 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
1406 ; X86-SSE2-NEXT:    por %xmm1, %xmm3
1407 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1408 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
1409 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1410 ; X86-SSE2-NEXT:    pxor %xmm0, %xmm4
1411 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1412 ; X86-SSE2-NEXT:    pand %xmm4, %xmm3
1413 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm4
1414 ; X86-SSE2-NEXT:    por %xmm3, %xmm4
1415 ; X86-SSE2-NEXT:    movd %xmm4, %eax
1416 ; X86-SSE2-NEXT:    retl
1418 ; X86-SSE42-LABEL: test_reduce_v16i32:
1419 ; X86-SSE42:       ## %bb.0:
1420 ; X86-SSE42-NEXT:    pminud %xmm3, %xmm1
1421 ; X86-SSE42-NEXT:    pminud %xmm2, %xmm1
1422 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
1423 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1424 ; X86-SSE42-NEXT:    pminud %xmm1, %xmm0
1425 ; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1426 ; X86-SSE42-NEXT:    pminud %xmm0, %xmm1
1427 ; X86-SSE42-NEXT:    movd %xmm1, %eax
1428 ; X86-SSE42-NEXT:    retl
1430 ; X86-AVX1-LABEL: test_reduce_v16i32:
1431 ; X86-AVX1:       ## %bb.0:
1432 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1433 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1434 ; X86-AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1435 ; X86-AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
1436 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1437 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1438 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1439 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1440 ; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1441 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1442 ; X86-AVX1-NEXT:    vzeroupper
1443 ; X86-AVX1-NEXT:    retl
1445 ; X86-AVX2-LABEL: test_reduce_v16i32:
1446 ; X86-AVX2:       ## %bb.0:
1447 ; X86-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1448 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1449 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1450 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1451 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1452 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1453 ; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1454 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1455 ; X86-AVX2-NEXT:    vzeroupper
1456 ; X86-AVX2-NEXT:    retl
1458 ; X64-SSE2-LABEL: test_reduce_v16i32:
1459 ; X64-SSE2:       ## %bb.0:
1460 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1461 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
1462 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
1463 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
1464 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
1465 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1466 ; X64-SSE2-NEXT:    pand %xmm6, %xmm1
1467 ; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
1468 ; X64-SSE2-NEXT:    por %xmm1, %xmm6
1469 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1470 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1471 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
1472 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1473 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1474 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1475 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
1476 ; X64-SSE2-NEXT:    por %xmm0, %xmm3
1477 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
1478 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1479 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm1
1480 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1481 ; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1482 ; X64-SSE2-NEXT:    pand %xmm1, %xmm3
1483 ; X64-SSE2-NEXT:    pandn %xmm6, %xmm1
1484 ; X64-SSE2-NEXT:    por %xmm3, %xmm1
1485 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1486 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
1487 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1488 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
1489 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1490 ; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1491 ; X64-SSE2-NEXT:    pand %xmm3, %xmm1
1492 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
1493 ; X64-SSE2-NEXT:    por %xmm1, %xmm3
1494 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1495 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
1496 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1497 ; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
1498 ; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1499 ; X64-SSE2-NEXT:    pand %xmm4, %xmm3
1500 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm4
1501 ; X64-SSE2-NEXT:    por %xmm3, %xmm4
1502 ; X64-SSE2-NEXT:    movd %xmm4, %eax
1503 ; X64-SSE2-NEXT:    retq
1505 ; X64-SSE42-LABEL: test_reduce_v16i32:
1506 ; X64-SSE42:       ## %bb.0:
1507 ; X64-SSE42-NEXT:    pminud %xmm3, %xmm1
1508 ; X64-SSE42-NEXT:    pminud %xmm2, %xmm1
1509 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
1510 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1511 ; X64-SSE42-NEXT:    pminud %xmm1, %xmm0
1512 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1513 ; X64-SSE42-NEXT:    pminud %xmm0, %xmm1
1514 ; X64-SSE42-NEXT:    movd %xmm1, %eax
1515 ; X64-SSE42-NEXT:    retq
1517 ; X64-AVX1-LABEL: test_reduce_v16i32:
1518 ; X64-AVX1:       ## %bb.0:
1519 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1520 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1521 ; X64-AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1522 ; X64-AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
1523 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1524 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1525 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1526 ; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1527 ; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1528 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
1529 ; X64-AVX1-NEXT:    vzeroupper
1530 ; X64-AVX1-NEXT:    retq
1532 ; X64-AVX2-LABEL: test_reduce_v16i32:
1533 ; X64-AVX2:       ## %bb.0:
1534 ; X64-AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1535 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1536 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1537 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1538 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1539 ; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1540 ; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1541 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
1542 ; X64-AVX2-NEXT:    vzeroupper
1543 ; X64-AVX2-NEXT:    retq
1545 ; X64-AVX512-LABEL: test_reduce_v16i32:
1546 ; X64-AVX512:       ## %bb.0:
1547 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1548 ; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1549 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1550 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1551 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1552 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1553 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1554 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1555 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
1556 ; X64-AVX512-NEXT:    vzeroupper
1557 ; X64-AVX512-NEXT:    retq
1558   %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>
1559   %2  = icmp ult <16 x i32> %a0, %1
1560   %3  = select <16 x i1> %2, <16 x i32> %a0, <16 x i32> %1
1561   %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>
1562   %5  = icmp ult <16 x i32> %3, %4
1563   %6  = select <16 x i1> %5, <16 x i32> %3, <16 x i32> %4
1564   %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>
1565   %8  = icmp ult <16 x i32> %6, %7
1566   %9  = select <16 x i1> %8, <16 x i32> %6, <16 x i32> %7
1567   %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>
1568   %11 = icmp ult <16 x i32> %9, %10
1569   %12 = select <16 x i1> %11, <16 x i32> %9, <16 x i32> %10
1570   %13 = extractelement <16 x i32> %12, i32 0
1571   ret i32 %13
1574 define i16 @test_reduce_v32i16(<32 x i16> %a0) {
1575 ; X86-SSE2-LABEL: test_reduce_v32i16:
1576 ; X86-SSE2:       ## %bb.0:
1577 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1578 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
1579 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1580 ; X86-SSE2-NEXT:    pminsw %xmm3, %xmm1
1581 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
1582 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm2
1583 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1584 ; X86-SSE2-NEXT:    pminsw %xmm2, %xmm0
1585 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1586 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1587 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1588 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1589 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1590 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1591 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1592 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1593 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
1594 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
1595 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1596 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1597 ; X86-SSE2-NEXT:    psrld $16, %xmm1
1598 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
1599 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1600 ; X86-SSE2-NEXT:    movd %xmm1, %eax
1601 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1602 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1603 ; X86-SSE2-NEXT:    retl
1605 ; X86-SSE42-LABEL: test_reduce_v32i16:
1606 ; X86-SSE42:       ## %bb.0:
1607 ; X86-SSE42-NEXT:    pminuw %xmm3, %xmm1
1608 ; X86-SSE42-NEXT:    pminuw %xmm2, %xmm1
1609 ; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
1610 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
1611 ; X86-SSE42-NEXT:    movd %xmm0, %eax
1612 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1613 ; X86-SSE42-NEXT:    retl
1615 ; X86-AVX1-LABEL: test_reduce_v32i16:
1616 ; X86-AVX1:       ## %bb.0:
1617 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1618 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1619 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1620 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
1621 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1622 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1623 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
1624 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
1625 ; X86-AVX1-NEXT:    vzeroupper
1626 ; X86-AVX1-NEXT:    retl
1628 ; X86-AVX2-LABEL: test_reduce_v32i16:
1629 ; X86-AVX2:       ## %bb.0:
1630 ; X86-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1631 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1632 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1633 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1634 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
1635 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
1636 ; X86-AVX2-NEXT:    vzeroupper
1637 ; X86-AVX2-NEXT:    retl
1639 ; X64-SSE2-LABEL: test_reduce_v32i16:
1640 ; X64-SSE2:       ## %bb.0:
1641 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1642 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
1643 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1644 ; X64-SSE2-NEXT:    pminsw %xmm3, %xmm1
1645 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
1646 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm2
1647 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1648 ; X64-SSE2-NEXT:    pminsw %xmm2, %xmm0
1649 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1650 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1651 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1652 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1653 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1654 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
1655 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1656 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1657 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
1658 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
1659 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1660 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1661 ; X64-SSE2-NEXT:    psrld $16, %xmm1
1662 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
1663 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1664 ; X64-SSE2-NEXT:    movd %xmm1, %eax
1665 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1666 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1667 ; X64-SSE2-NEXT:    retq
1669 ; X64-SSE42-LABEL: test_reduce_v32i16:
1670 ; X64-SSE42:       ## %bb.0:
1671 ; X64-SSE42-NEXT:    pminuw %xmm3, %xmm1
1672 ; X64-SSE42-NEXT:    pminuw %xmm2, %xmm1
1673 ; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
1674 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
1675 ; X64-SSE42-NEXT:    movd %xmm0, %eax
1676 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1677 ; X64-SSE42-NEXT:    retq
1679 ; X64-AVX1-LABEL: test_reduce_v32i16:
1680 ; X64-AVX1:       ## %bb.0:
1681 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1682 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1683 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1684 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
1685 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1686 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1687 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
1688 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
1689 ; X64-AVX1-NEXT:    vzeroupper
1690 ; X64-AVX1-NEXT:    retq
1692 ; X64-AVX2-LABEL: test_reduce_v32i16:
1693 ; X64-AVX2:       ## %bb.0:
1694 ; X64-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1695 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1696 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1697 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1698 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
1699 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
1700 ; X64-AVX2-NEXT:    vzeroupper
1701 ; X64-AVX2-NEXT:    retq
1703 ; X64-AVX512-LABEL: test_reduce_v32i16:
1704 ; X64-AVX512:       ## %bb.0:
1705 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1706 ; X64-AVX512-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1707 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1708 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1709 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1710 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
1711 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
1712 ; X64-AVX512-NEXT:    vzeroupper
1713 ; X64-AVX512-NEXT:    retq
1714   %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>
1715   %2  = icmp ult <32 x i16> %a0, %1
1716   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
1717   %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>
1718   %5  = icmp ult <32 x i16> %3, %4
1719   %6  = select <32 x i1> %5, <32 x i16> %3, <32 x i16> %4
1720   %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>
1721   %8  = icmp ult <32 x i16> %6, %7
1722   %9  = select <32 x i1> %8, <32 x i16> %6, <32 x i16> %7
1723   %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>
1724   %11 = icmp ult <32 x i16> %9, %10
1725   %12 = select <32 x i1> %11, <32 x i16> %9, <32 x i16> %10
1726   %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>
1727   %14 = icmp ult <32 x i16> %12, %13
1728   %15 = select <32 x i1> %14, <32 x i16> %12, <32 x i16> %13
1729   %16 = extractelement <32 x i16> %15, i32 0
1730   ret i16 %16
1733 define i8 @test_reduce_v64i8(<64 x i8> %a0) {
1734 ; X86-SSE2-LABEL: test_reduce_v64i8:
1735 ; X86-SSE2:       ## %bb.0:
1736 ; X86-SSE2-NEXT:    pminub %xmm3, %xmm1
1737 ; X86-SSE2-NEXT:    pminub %xmm2, %xmm1
1738 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
1739 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1740 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
1741 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1742 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
1743 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1744 ; X86-SSE2-NEXT:    psrld $16, %xmm0
1745 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
1746 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1747 ; X86-SSE2-NEXT:    psrlw $8, %xmm1
1748 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
1749 ; X86-SSE2-NEXT:    movd %xmm1, %eax
1750 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
1751 ; X86-SSE2-NEXT:    retl
1753 ; X86-SSE42-LABEL: test_reduce_v64i8:
1754 ; X86-SSE42:       ## %bb.0:
1755 ; X86-SSE42-NEXT:    pminub %xmm3, %xmm1
1756 ; X86-SSE42-NEXT:    pminub %xmm2, %xmm1
1757 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
1758 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
1759 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
1760 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
1761 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1762 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
1763 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
1764 ; X86-SSE42-NEXT:    retl
1766 ; X86-AVX1-LABEL: test_reduce_v64i8:
1767 ; X86-AVX1:       ## %bb.0:
1768 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1769 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1770 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
1771 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm1, %xmm1
1772 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1773 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1774 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1775 ; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1776 ; X86-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1777 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
1778 ; X86-AVX1-NEXT:    vzeroupper
1779 ; X86-AVX1-NEXT:    retl
1781 ; X86-AVX2-LABEL: test_reduce_v64i8:
1782 ; X86-AVX2:       ## %bb.0:
1783 ; X86-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1784 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1785 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1786 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1787 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1788 ; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1789 ; X86-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1790 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1791 ; X86-AVX2-NEXT:    vzeroupper
1792 ; X86-AVX2-NEXT:    retl
1794 ; X64-SSE2-LABEL: test_reduce_v64i8:
1795 ; X64-SSE2:       ## %bb.0:
1796 ; X64-SSE2-NEXT:    pminub %xmm3, %xmm1
1797 ; X64-SSE2-NEXT:    pminub %xmm2, %xmm1
1798 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
1799 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1800 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
1801 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1802 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
1803 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
1804 ; X64-SSE2-NEXT:    psrld $16, %xmm0
1805 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
1806 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1807 ; X64-SSE2-NEXT:    psrlw $8, %xmm1
1808 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
1809 ; X64-SSE2-NEXT:    movd %xmm1, %eax
1810 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
1811 ; X64-SSE2-NEXT:    retq
1813 ; X64-SSE42-LABEL: test_reduce_v64i8:
1814 ; X64-SSE42:       ## %bb.0:
1815 ; X64-SSE42-NEXT:    pminub %xmm3, %xmm1
1816 ; X64-SSE42-NEXT:    pminub %xmm2, %xmm1
1817 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
1818 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
1819 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
1820 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
1821 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1822 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
1823 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
1824 ; X64-SSE42-NEXT:    retq
1826 ; X64-AVX1-LABEL: test_reduce_v64i8:
1827 ; X64-AVX1:       ## %bb.0:
1828 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1829 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1830 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
1831 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm1, %xmm1
1832 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1833 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1834 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1835 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1836 ; X64-AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1837 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
1838 ; X64-AVX1-NEXT:    vzeroupper
1839 ; X64-AVX1-NEXT:    retq
1841 ; X64-AVX2-LABEL: test_reduce_v64i8:
1842 ; X64-AVX2:       ## %bb.0:
1843 ; X64-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1844 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1845 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1846 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1847 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1848 ; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1849 ; X64-AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1850 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
1851 ; X64-AVX2-NEXT:    vzeroupper
1852 ; X64-AVX2-NEXT:    retq
1854 ; X64-AVX512-LABEL: test_reduce_v64i8:
1855 ; X64-AVX512:       ## %bb.0:
1856 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1857 ; X64-AVX512-NEXT:    vpminub %ymm1, %ymm0, %ymm0
1858 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1859 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1860 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1861 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1862 ; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1863 ; X64-AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1864 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
1865 ; X64-AVX512-NEXT:    vzeroupper
1866 ; X64-AVX512-NEXT:    retq
1867   %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>
1868   %2  = icmp ult <64 x i8> %a0, %1
1869   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
1870   %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>
1871   %5  = icmp ult <64 x i8> %3, %4
1872   %6  = select <64 x i1> %5, <64 x i8> %3, <64 x i8> %4
1873   %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>
1874   %8  = icmp ult <64 x i8> %6, %7
1875   %9  = select <64 x i1> %8, <64 x i8> %6, <64 x i8> %7
1876   %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>
1877   %11 = icmp ult <64 x i8> %9, %10
1878   %12 = select <64 x i1> %11, <64 x i8> %9, <64 x i8> %10
1879   %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>
1880   %14 = icmp ult <64 x i8> %12, %13
1881   %15 = select <64 x i1> %14, <64 x i8> %12, <64 x i8> %13
1882   %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>
1883   %17 = icmp ult <64 x i8> %15, %16
1884   %18 = select <64 x i1> %17, <64 x i8> %15, <64 x i8> %16
1885   %19 = extractelement <64 x i8> %18, i32 0
1886   ret i8 %19
1890 ; Partial Vector Reductions
1893 define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
1894 ; X86-SSE2-LABEL: test_reduce_v16i16_v8i16:
1895 ; X86-SSE2:       ## %bb.0:
1896 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1897 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1898 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1899 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1900 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1901 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1902 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1903 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1904 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1905 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
1906 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1907 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1908 ; X86-SSE2-NEXT:    psrld $16, %xmm1
1909 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1910 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1911 ; X86-SSE2-NEXT:    movd %xmm1, %eax
1912 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1913 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1914 ; X86-SSE2-NEXT:    retl
1916 ; X86-SSE42-LABEL: test_reduce_v16i16_v8i16:
1917 ; X86-SSE42:       ## %bb.0:
1918 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1919 ; X86-SSE42-NEXT:    movd %xmm0, %eax
1920 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1921 ; X86-SSE42-NEXT:    retl
1923 ; X86-AVX-LABEL: test_reduce_v16i16_v8i16:
1924 ; X86-AVX:       ## %bb.0:
1925 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
1926 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
1927 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
1928 ; X86-AVX-NEXT:    vzeroupper
1929 ; X86-AVX-NEXT:    retl
1931 ; X64-SSE2-LABEL: test_reduce_v16i16_v8i16:
1932 ; X64-SSE2:       ## %bb.0:
1933 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1934 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1935 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
1936 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
1937 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1938 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
1939 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
1940 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1941 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
1942 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
1943 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
1944 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
1945 ; X64-SSE2-NEXT:    psrld $16, %xmm1
1946 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
1947 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
1948 ; X64-SSE2-NEXT:    movd %xmm1, %eax
1949 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
1950 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
1951 ; X64-SSE2-NEXT:    retq
1953 ; X64-SSE42-LABEL: test_reduce_v16i16_v8i16:
1954 ; X64-SSE42:       ## %bb.0:
1955 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
1956 ; X64-SSE42-NEXT:    movd %xmm0, %eax
1957 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
1958 ; X64-SSE42-NEXT:    retq
1960 ; X64-AVX-LABEL: test_reduce_v16i16_v8i16:
1961 ; X64-AVX:       ## %bb.0:
1962 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
1963 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
1964 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
1965 ; X64-AVX-NEXT:    vzeroupper
1966 ; X64-AVX-NEXT:    retq
1967   %1  = shufflevector <16 x i16> %a0, <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>
1968   %2  = icmp ult <16 x i16> %a0, %1
1969   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
1970   %4  = shufflevector <16 x i16> %3, <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>
1971   %5  = icmp ult <16 x i16> %3, %4
1972   %6  = select <16 x i1> %5, <16 x i16> %3, <16 x i16> %4
1973   %7  = shufflevector <16 x i16> %6, <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>
1974   %8  = icmp ult <16 x i16> %6, %7
1975   %9  = select <16 x i1> %8, <16 x i16> %6, <16 x i16> %7
1976   %10 = extractelement <16 x i16> %9, i32 0
1977   ret i16 %10
1980 define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
1981 ; X86-SSE2-LABEL: test_reduce_v32i16_v8i16:
1982 ; X86-SSE2:       ## %bb.0:
1983 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1984 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1985 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1986 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1987 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1988 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
1989 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1990 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1991 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
1992 ; X86-SSE2-NEXT:    pminsw %xmm1, %xmm0
1993 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
1994 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1995 ; X86-SSE2-NEXT:    psrld $16, %xmm1
1996 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
1997 ; X86-SSE2-NEXT:    pminsw %xmm0, %xmm1
1998 ; X86-SSE2-NEXT:    movd %xmm1, %eax
1999 ; X86-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
2000 ; X86-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
2001 ; X86-SSE2-NEXT:    retl
2003 ; X86-SSE42-LABEL: test_reduce_v32i16_v8i16:
2004 ; X86-SSE42:       ## %bb.0:
2005 ; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
2006 ; X86-SSE42-NEXT:    movd %xmm0, %eax
2007 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
2008 ; X86-SSE42-NEXT:    retl
2010 ; X86-AVX-LABEL: test_reduce_v32i16_v8i16:
2011 ; X86-AVX:       ## %bb.0:
2012 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2013 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
2014 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
2015 ; X86-AVX-NEXT:    vzeroupper
2016 ; X86-AVX-NEXT:    retl
2018 ; X64-SSE2-LABEL: test_reduce_v32i16_v8i16:
2019 ; X64-SSE2:       ## %bb.0:
2020 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2021 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2022 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
2023 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
2024 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
2025 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
2026 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
2027 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2028 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
2029 ; X64-SSE2-NEXT:    pminsw %xmm1, %xmm0
2030 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
2031 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
2032 ; X64-SSE2-NEXT:    psrld $16, %xmm1
2033 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
2034 ; X64-SSE2-NEXT:    pminsw %xmm0, %xmm1
2035 ; X64-SSE2-NEXT:    movd %xmm1, %eax
2036 ; X64-SSE2-NEXT:    xorl $32768, %eax ## imm = 0x8000
2037 ; X64-SSE2-NEXT:    ## kill: def $ax killed $ax killed $eax
2038 ; X64-SSE2-NEXT:    retq
2040 ; X64-SSE42-LABEL: test_reduce_v32i16_v8i16:
2041 ; X64-SSE42:       ## %bb.0:
2042 ; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
2043 ; X64-SSE42-NEXT:    movd %xmm0, %eax
2044 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
2045 ; X64-SSE42-NEXT:    retq
2047 ; X64-AVX-LABEL: test_reduce_v32i16_v8i16:
2048 ; X64-AVX:       ## %bb.0:
2049 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2050 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
2051 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
2052 ; X64-AVX-NEXT:    vzeroupper
2053 ; X64-AVX-NEXT:    retq
2054   %1  = shufflevector <32 x i16> %a0, <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>
2055   %2  = icmp ult <32 x i16> %a0, %1
2056   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
2057   %4  = shufflevector <32 x i16> %3, <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>
2058   %5  = icmp ult <32 x i16> %3, %4
2059   %6  = select <32 x i1> %5, <32 x i16> %3, <32 x i16> %4
2060   %7  = shufflevector <32 x i16> %6, <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>
2061   %8  = icmp ult <32 x i16> %6, %7
2062   %9  = select <32 x i1> %8, <32 x i16> %6, <32 x i16> %7
2063   %10 = extractelement <32 x i16> %9, i32 0
2064   ret i16 %10
2067 define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
2068 ; X86-SSE2-LABEL: test_reduce_v32i8_v16i8:
2069 ; X86-SSE2:       ## %bb.0:
2070 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2071 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
2072 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2073 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
2074 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
2075 ; X86-SSE2-NEXT:    psrld $16, %xmm1
2076 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
2077 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
2078 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
2079 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
2080 ; X86-SSE2-NEXT:    movd %xmm0, %eax
2081 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
2082 ; X86-SSE2-NEXT:    retl
2084 ; X86-SSE42-LABEL: test_reduce_v32i8_v16i8:
2085 ; X86-SSE42:       ## %bb.0:
2086 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
2087 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
2088 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
2089 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
2090 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
2091 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
2092 ; X86-SSE42-NEXT:    retl
2094 ; X86-AVX-LABEL: test_reduce_v32i8_v16i8:
2095 ; X86-AVX:       ## %bb.0:
2096 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
2097 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2098 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2099 ; X86-AVX-NEXT:    vpextrb $0, %xmm0, %eax
2100 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
2101 ; X86-AVX-NEXT:    vzeroupper
2102 ; X86-AVX-NEXT:    retl
2104 ; X64-SSE2-LABEL: test_reduce_v32i8_v16i8:
2105 ; X64-SSE2:       ## %bb.0:
2106 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2107 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
2108 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2109 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
2110 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
2111 ; X64-SSE2-NEXT:    psrld $16, %xmm1
2112 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
2113 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
2114 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
2115 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
2116 ; X64-SSE2-NEXT:    movd %xmm0, %eax
2117 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
2118 ; X64-SSE2-NEXT:    retq
2120 ; X64-SSE42-LABEL: test_reduce_v32i8_v16i8:
2121 ; X64-SSE42:       ## %bb.0:
2122 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
2123 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
2124 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
2125 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
2126 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
2127 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
2128 ; X64-SSE42-NEXT:    retq
2130 ; X64-AVX-LABEL: test_reduce_v32i8_v16i8:
2131 ; X64-AVX:       ## %bb.0:
2132 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
2133 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2134 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2135 ; X64-AVX-NEXT:    vpextrb $0, %xmm0, %eax
2136 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
2137 ; X64-AVX-NEXT:    vzeroupper
2138 ; X64-AVX-NEXT:    retq
2139   %1  = shufflevector <32 x i8> %a0, <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>
2140   %2  = icmp ult <32 x i8> %a0, %1
2141   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
2142   %4  = shufflevector <32 x i8> %3, <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>
2143   %5  = icmp ult <32 x i8> %3, %4
2144   %6  = select <32 x i1> %5, <32 x i8> %3, <32 x i8> %4
2145   %7  = shufflevector <32 x i8> %6, <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>
2146   %8  = icmp ult <32 x i8> %6, %7
2147   %9  = select <32 x i1> %8, <32 x i8> %6, <32 x i8> %7
2148   %10 = shufflevector <32 x i8> %9, <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>
2149   %11 = icmp ult <32 x i8> %9, %10
2150   %12 = select <32 x i1> %11, <32 x i8> %9, <32 x i8> %10
2151   %13 = extractelement <32 x i8> %12, i32 0
2152   ret i8 %13
2155 define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
2156 ; X86-SSE2-LABEL: test_reduce_v64i8_v16i8:
2157 ; X86-SSE2:       ## %bb.0:
2158 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2159 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
2160 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2161 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
2162 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
2163 ; X86-SSE2-NEXT:    psrld $16, %xmm1
2164 ; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
2165 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
2166 ; X86-SSE2-NEXT:    psrlw $8, %xmm0
2167 ; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
2168 ; X86-SSE2-NEXT:    movd %xmm0, %eax
2169 ; X86-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
2170 ; X86-SSE2-NEXT:    retl
2172 ; X86-SSE42-LABEL: test_reduce_v64i8_v16i8:
2173 ; X86-SSE42:       ## %bb.0:
2174 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
2175 ; X86-SSE42-NEXT:    psrlw $8, %xmm1
2176 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
2177 ; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
2178 ; X86-SSE42-NEXT:    pextrb $0, %xmm0, %eax
2179 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
2180 ; X86-SSE42-NEXT:    retl
2182 ; X86-AVX-LABEL: test_reduce_v64i8_v16i8:
2183 ; X86-AVX:       ## %bb.0:
2184 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
2185 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2186 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2187 ; X86-AVX-NEXT:    vpextrb $0, %xmm0, %eax
2188 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
2189 ; X86-AVX-NEXT:    vzeroupper
2190 ; X86-AVX-NEXT:    retl
2192 ; X64-SSE2-LABEL: test_reduce_v64i8_v16i8:
2193 ; X64-SSE2:       ## %bb.0:
2194 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2195 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
2196 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2197 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
2198 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
2199 ; X64-SSE2-NEXT:    psrld $16, %xmm1
2200 ; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
2201 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
2202 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
2203 ; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
2204 ; X64-SSE2-NEXT:    movd %xmm0, %eax
2205 ; X64-SSE2-NEXT:    ## kill: def $al killed $al killed $eax
2206 ; X64-SSE2-NEXT:    retq
2208 ; X64-SSE42-LABEL: test_reduce_v64i8_v16i8:
2209 ; X64-SSE42:       ## %bb.0:
2210 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
2211 ; X64-SSE42-NEXT:    psrlw $8, %xmm1
2212 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
2213 ; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
2214 ; X64-SSE42-NEXT:    pextrb $0, %xmm0, %eax
2215 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
2216 ; X64-SSE42-NEXT:    retq
2218 ; X64-AVX-LABEL: test_reduce_v64i8_v16i8:
2219 ; X64-AVX:       ## %bb.0:
2220 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
2221 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2222 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
2223 ; X64-AVX-NEXT:    vpextrb $0, %xmm0, %eax
2224 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
2225 ; X64-AVX-NEXT:    vzeroupper
2226 ; X64-AVX-NEXT:    retq
2227   %1  = shufflevector <64 x i8> %a0, <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>
2228   %2  = icmp ult <64 x i8> %a0, %1
2229   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
2230   %4  = shufflevector <64 x i8> %3, <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>
2231   %5  = icmp ult <64 x i8> %3, %4
2232   %6  = select <64 x i1> %5, <64 x i8> %3, <64 x i8> %4
2233   %7  = shufflevector <64 x i8> %6, <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>
2234   %8  = icmp ult <64 x i8> %6, %7
2235   %9  = select <64 x i1> %8, <64 x i8> %6, <64 x i8> %7
2236   %10 = shufflevector <64 x i8> %9, <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>
2237   %11 = icmp ult <64 x i8> %9, %10
2238   %12 = select <64 x i1> %11, <64 x i8> %9, <64 x i8> %10
2239   %13 = extractelement <64 x i8> %12, i32 0
2240   ret i8 %13