1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
13 define i64 @test_v2i64(<2 x i64> %a0) {
14 ; SSE2-LABEL: test_v2i64:
16 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
17 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
18 ; SSE2-NEXT: movdqa %xmm0, %xmm3
19 ; SSE2-NEXT: pxor %xmm2, %xmm3
20 ; SSE2-NEXT: pxor %xmm1, %xmm2
21 ; SSE2-NEXT: movdqa %xmm2, %xmm4
22 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
23 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
24 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
25 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
26 ; SSE2-NEXT: pand %xmm5, %xmm2
27 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
28 ; SSE2-NEXT: por %xmm2, %xmm3
29 ; SSE2-NEXT: pand %xmm3, %xmm0
30 ; SSE2-NEXT: pandn %xmm1, %xmm3
31 ; SSE2-NEXT: por %xmm0, %xmm3
32 ; SSE2-NEXT: movq %xmm3, %rax
35 ; SSE41-LABEL: test_v2i64:
37 ; SSE41-NEXT: movdqa %xmm0, %xmm1
38 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
39 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
40 ; SSE41-NEXT: pxor %xmm3, %xmm0
41 ; SSE41-NEXT: pxor %xmm2, %xmm3
42 ; SSE41-NEXT: movdqa %xmm3, %xmm4
43 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
44 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
45 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
46 ; SSE41-NEXT: pand %xmm4, %xmm0
47 ; SSE41-NEXT: por %xmm3, %xmm0
48 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
49 ; SSE41-NEXT: movq %xmm2, %rax
52 ; AVX-LABEL: test_v2i64:
54 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
55 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
56 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
57 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
58 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
59 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
60 ; AVX-NEXT: vmovq %xmm0, %rax
63 ; AVX512BW-LABEL: test_v2i64:
65 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
66 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
67 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
68 ; AVX512BW-NEXT: vmovq %xmm0, %rax
69 ; AVX512BW-NEXT: vzeroupper
72 ; AVX512VL-LABEL: test_v2i64:
74 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
75 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
76 ; AVX512VL-NEXT: vmovq %xmm0, %rax
78 %1 = call i64 @llvm.experimental.vector.reduce.umin.v2i64(<2 x i64> %a0)
82 define i64 @test_v4i64(<4 x i64> %a0) {
83 ; SSE2-LABEL: test_v4i64:
85 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
86 ; SSE2-NEXT: movdqa %xmm0, %xmm3
87 ; SSE2-NEXT: pxor %xmm2, %xmm3
88 ; SSE2-NEXT: movdqa %xmm1, %xmm4
89 ; SSE2-NEXT: pxor %xmm2, %xmm4
90 ; SSE2-NEXT: movdqa %xmm4, %xmm5
91 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
92 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
93 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
94 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
95 ; SSE2-NEXT: pand %xmm6, %xmm3
96 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
97 ; SSE2-NEXT: por %xmm3, %xmm4
98 ; SSE2-NEXT: pand %xmm4, %xmm0
99 ; SSE2-NEXT: pandn %xmm1, %xmm4
100 ; SSE2-NEXT: por %xmm0, %xmm4
101 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
102 ; SSE2-NEXT: movdqa %xmm4, %xmm1
103 ; SSE2-NEXT: pxor %xmm2, %xmm1
104 ; SSE2-NEXT: pxor %xmm0, %xmm2
105 ; SSE2-NEXT: movdqa %xmm2, %xmm3
106 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
107 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
108 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
109 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
110 ; SSE2-NEXT: pand %xmm5, %xmm1
111 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
112 ; SSE2-NEXT: por %xmm1, %xmm2
113 ; SSE2-NEXT: pand %xmm2, %xmm4
114 ; SSE2-NEXT: pandn %xmm0, %xmm2
115 ; SSE2-NEXT: por %xmm4, %xmm2
116 ; SSE2-NEXT: movq %xmm2, %rax
119 ; SSE41-LABEL: test_v4i64:
121 ; SSE41-NEXT: movdqa %xmm0, %xmm2
122 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
123 ; SSE41-NEXT: pxor %xmm3, %xmm0
124 ; SSE41-NEXT: movdqa %xmm1, %xmm4
125 ; SSE41-NEXT: pxor %xmm3, %xmm4
126 ; SSE41-NEXT: movdqa %xmm4, %xmm5
127 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
128 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
129 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
130 ; SSE41-NEXT: pand %xmm5, %xmm0
131 ; SSE41-NEXT: por %xmm4, %xmm0
132 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
133 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
134 ; SSE41-NEXT: movdqa %xmm1, %xmm0
135 ; SSE41-NEXT: pxor %xmm3, %xmm0
136 ; SSE41-NEXT: pxor %xmm2, %xmm3
137 ; SSE41-NEXT: movdqa %xmm3, %xmm4
138 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
139 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
140 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
141 ; SSE41-NEXT: pand %xmm4, %xmm0
142 ; SSE41-NEXT: por %xmm3, %xmm0
143 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
144 ; SSE41-NEXT: movq %xmm2, %rax
147 ; AVX1-LABEL: test_v4i64:
149 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
150 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
151 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
152 ; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm4
153 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
154 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
155 ; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[2,3,0,1]
156 ; AVX1-NEXT: vxorpd %xmm1, %xmm0, %xmm3
157 ; AVX1-NEXT: vxorpd %xmm1, %xmm2, %xmm1
158 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1
159 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
160 ; AVX1-NEXT: vmovq %xmm0, %rax
161 ; AVX1-NEXT: vzeroupper
164 ; AVX2-LABEL: test_v4i64:
166 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
167 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
168 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
169 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4
170 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
171 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
172 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
173 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
174 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2
175 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
176 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
177 ; AVX2-NEXT: vmovq %xmm0, %rax
178 ; AVX2-NEXT: vzeroupper
181 ; AVX512BW-LABEL: test_v4i64:
183 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
184 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
185 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
186 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
187 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
188 ; AVX512BW-NEXT: vmovq %xmm0, %rax
189 ; AVX512BW-NEXT: vzeroupper
190 ; AVX512BW-NEXT: retq
192 ; AVX512VL-LABEL: test_v4i64:
194 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
195 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
196 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
197 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
198 ; AVX512VL-NEXT: vmovq %xmm0, %rax
199 ; AVX512VL-NEXT: vzeroupper
200 ; AVX512VL-NEXT: retq
201 %1 = call i64 @llvm.experimental.vector.reduce.umin.v4i64(<4 x i64> %a0)
205 define i64 @test_v8i64(<8 x i64> %a0) {
206 ; SSE2-LABEL: test_v8i64:
208 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
209 ; SSE2-NEXT: movdqa %xmm1, %xmm5
210 ; SSE2-NEXT: pxor %xmm4, %xmm5
211 ; SSE2-NEXT: movdqa %xmm3, %xmm6
212 ; SSE2-NEXT: pxor %xmm4, %xmm6
213 ; SSE2-NEXT: movdqa %xmm6, %xmm7
214 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
215 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
216 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
217 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
218 ; SSE2-NEXT: pand %xmm8, %xmm6
219 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
220 ; SSE2-NEXT: por %xmm6, %xmm5
221 ; SSE2-NEXT: pand %xmm5, %xmm1
222 ; SSE2-NEXT: pandn %xmm3, %xmm5
223 ; SSE2-NEXT: por %xmm1, %xmm5
224 ; SSE2-NEXT: movdqa %xmm0, %xmm1
225 ; SSE2-NEXT: pxor %xmm4, %xmm1
226 ; SSE2-NEXT: movdqa %xmm2, %xmm3
227 ; SSE2-NEXT: pxor %xmm4, %xmm3
228 ; SSE2-NEXT: movdqa %xmm3, %xmm6
229 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
230 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
231 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
232 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
233 ; SSE2-NEXT: pand %xmm7, %xmm1
234 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
235 ; SSE2-NEXT: por %xmm1, %xmm3
236 ; SSE2-NEXT: pand %xmm3, %xmm0
237 ; SSE2-NEXT: pandn %xmm2, %xmm3
238 ; SSE2-NEXT: por %xmm0, %xmm3
239 ; SSE2-NEXT: movdqa %xmm3, %xmm0
240 ; SSE2-NEXT: pxor %xmm4, %xmm0
241 ; SSE2-NEXT: movdqa %xmm5, %xmm1
242 ; SSE2-NEXT: pxor %xmm4, %xmm1
243 ; SSE2-NEXT: movdqa %xmm1, %xmm2
244 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
245 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
246 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
247 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
248 ; SSE2-NEXT: pand %xmm6, %xmm0
249 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
250 ; SSE2-NEXT: por %xmm0, %xmm1
251 ; SSE2-NEXT: pand %xmm1, %xmm3
252 ; SSE2-NEXT: pandn %xmm5, %xmm1
253 ; SSE2-NEXT: por %xmm3, %xmm1
254 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
255 ; SSE2-NEXT: movdqa %xmm1, %xmm2
256 ; SSE2-NEXT: pxor %xmm4, %xmm2
257 ; SSE2-NEXT: pxor %xmm0, %xmm4
258 ; SSE2-NEXT: movdqa %xmm4, %xmm3
259 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
260 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
261 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
262 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
263 ; SSE2-NEXT: pand %xmm5, %xmm2
264 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
265 ; SSE2-NEXT: por %xmm2, %xmm3
266 ; SSE2-NEXT: pand %xmm3, %xmm1
267 ; SSE2-NEXT: pandn %xmm0, %xmm3
268 ; SSE2-NEXT: por %xmm1, %xmm3
269 ; SSE2-NEXT: movq %xmm3, %rax
272 ; SSE41-LABEL: test_v8i64:
274 ; SSE41-NEXT: movdqa %xmm0, %xmm4
275 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
276 ; SSE41-NEXT: movdqa %xmm1, %xmm0
277 ; SSE41-NEXT: pxor %xmm5, %xmm0
278 ; SSE41-NEXT: movdqa %xmm3, %xmm6
279 ; SSE41-NEXT: pxor %xmm5, %xmm6
280 ; SSE41-NEXT: movdqa %xmm6, %xmm7
281 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
282 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
283 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
284 ; SSE41-NEXT: pand %xmm7, %xmm0
285 ; SSE41-NEXT: por %xmm6, %xmm0
286 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
287 ; SSE41-NEXT: movdqa %xmm4, %xmm0
288 ; SSE41-NEXT: pxor %xmm5, %xmm0
289 ; SSE41-NEXT: movdqa %xmm2, %xmm1
290 ; SSE41-NEXT: pxor %xmm5, %xmm1
291 ; SSE41-NEXT: movdqa %xmm1, %xmm6
292 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
293 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
294 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
295 ; SSE41-NEXT: pand %xmm6, %xmm0
296 ; SSE41-NEXT: por %xmm1, %xmm0
297 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
298 ; SSE41-NEXT: movapd %xmm2, %xmm0
299 ; SSE41-NEXT: xorpd %xmm5, %xmm0
300 ; SSE41-NEXT: movapd %xmm3, %xmm1
301 ; SSE41-NEXT: xorpd %xmm5, %xmm1
302 ; SSE41-NEXT: movapd %xmm1, %xmm4
303 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
304 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
305 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
306 ; SSE41-NEXT: pand %xmm4, %xmm0
307 ; SSE41-NEXT: por %xmm1, %xmm0
308 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
309 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
310 ; SSE41-NEXT: movdqa %xmm3, %xmm0
311 ; SSE41-NEXT: pxor %xmm5, %xmm0
312 ; SSE41-NEXT: pxor %xmm1, %xmm5
313 ; SSE41-NEXT: movdqa %xmm5, %xmm2
314 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
315 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
316 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
317 ; SSE41-NEXT: pand %xmm2, %xmm0
318 ; SSE41-NEXT: por %xmm5, %xmm0
319 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
320 ; SSE41-NEXT: movq %xmm1, %rax
323 ; AVX1-LABEL: test_v8i64:
325 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
326 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
327 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
328 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
329 ; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm6
330 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
331 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm6
332 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm7
333 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6
334 ; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm1, %xmm0
335 ; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm1
336 ; AVX1-NEXT: vblendvpd %xmm4, %xmm2, %xmm5, %xmm2
337 ; AVX1-NEXT: vxorpd %xmm3, %xmm2, %xmm4
338 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1
339 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
340 ; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
341 ; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2
342 ; AVX1-NEXT: vxorpd %xmm3, %xmm1, %xmm3
343 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
344 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
345 ; AVX1-NEXT: vmovq %xmm0, %rax
346 ; AVX1-NEXT: vzeroupper
349 ; AVX2-LABEL: test_v8i64:
351 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
352 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
353 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm4
354 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3
355 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
356 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
357 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
358 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm4
359 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
360 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
361 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
362 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
363 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2
364 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
365 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
366 ; AVX2-NEXT: vmovq %xmm0, %rax
367 ; AVX2-NEXT: vzeroupper
370 ; AVX512BW-LABEL: test_v8i64:
372 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
373 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
374 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
375 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
376 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
377 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
378 ; AVX512BW-NEXT: vmovq %xmm0, %rax
379 ; AVX512BW-NEXT: vzeroupper
380 ; AVX512BW-NEXT: retq
382 ; AVX512VL-LABEL: test_v8i64:
384 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
385 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
386 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
387 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
388 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
389 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
390 ; AVX512VL-NEXT: vmovq %xmm0, %rax
391 ; AVX512VL-NEXT: vzeroupper
392 ; AVX512VL-NEXT: retq
393 %1 = call i64 @llvm.experimental.vector.reduce.umin.v8i64(<8 x i64> %a0)
397 define i64 @test_v16i64(<16 x i64> %a0) {
398 ; SSE2-LABEL: test_v16i64:
400 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
401 ; SSE2-NEXT: movdqa %xmm2, %xmm9
402 ; SSE2-NEXT: pxor %xmm8, %xmm9
403 ; SSE2-NEXT: movdqa %xmm6, %xmm10
404 ; SSE2-NEXT: pxor %xmm8, %xmm10
405 ; SSE2-NEXT: movdqa %xmm10, %xmm11
406 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm11
407 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
408 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm10
409 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
410 ; SSE2-NEXT: pand %xmm12, %xmm10
411 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
412 ; SSE2-NEXT: por %xmm10, %xmm9
413 ; SSE2-NEXT: pand %xmm9, %xmm2
414 ; SSE2-NEXT: pandn %xmm6, %xmm9
415 ; SSE2-NEXT: por %xmm2, %xmm9
416 ; SSE2-NEXT: movdqa %xmm0, %xmm2
417 ; SSE2-NEXT: pxor %xmm8, %xmm2
418 ; SSE2-NEXT: movdqa %xmm4, %xmm6
419 ; SSE2-NEXT: pxor %xmm8, %xmm6
420 ; SSE2-NEXT: movdqa %xmm6, %xmm10
421 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm10
422 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
423 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm6
424 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
425 ; SSE2-NEXT: pand %xmm11, %xmm6
426 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
427 ; SSE2-NEXT: por %xmm6, %xmm2
428 ; SSE2-NEXT: pand %xmm2, %xmm0
429 ; SSE2-NEXT: pandn %xmm4, %xmm2
430 ; SSE2-NEXT: por %xmm0, %xmm2
431 ; SSE2-NEXT: movdqa %xmm3, %xmm0
432 ; SSE2-NEXT: pxor %xmm8, %xmm0
433 ; SSE2-NEXT: movdqa %xmm7, %xmm4
434 ; SSE2-NEXT: pxor %xmm8, %xmm4
435 ; SSE2-NEXT: movdqa %xmm4, %xmm6
436 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
437 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
438 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4
439 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
440 ; SSE2-NEXT: pand %xmm10, %xmm4
441 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
442 ; SSE2-NEXT: por %xmm4, %xmm0
443 ; SSE2-NEXT: pand %xmm0, %xmm3
444 ; SSE2-NEXT: pandn %xmm7, %xmm0
445 ; SSE2-NEXT: por %xmm3, %xmm0
446 ; SSE2-NEXT: movdqa %xmm1, %xmm3
447 ; SSE2-NEXT: pxor %xmm8, %xmm3
448 ; SSE2-NEXT: movdqa %xmm5, %xmm4
449 ; SSE2-NEXT: pxor %xmm8, %xmm4
450 ; SSE2-NEXT: movdqa %xmm4, %xmm6
451 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
452 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
453 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
454 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
455 ; SSE2-NEXT: pand %xmm7, %xmm3
456 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
457 ; SSE2-NEXT: por %xmm3, %xmm4
458 ; SSE2-NEXT: pand %xmm4, %xmm1
459 ; SSE2-NEXT: pandn %xmm5, %xmm4
460 ; SSE2-NEXT: por %xmm1, %xmm4
461 ; SSE2-NEXT: movdqa %xmm4, %xmm1
462 ; SSE2-NEXT: pxor %xmm8, %xmm1
463 ; SSE2-NEXT: movdqa %xmm0, %xmm3
464 ; SSE2-NEXT: pxor %xmm8, %xmm3
465 ; SSE2-NEXT: movdqa %xmm3, %xmm5
466 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm5
467 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
468 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
469 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
470 ; SSE2-NEXT: pand %xmm6, %xmm3
471 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
472 ; SSE2-NEXT: por %xmm3, %xmm1
473 ; SSE2-NEXT: pand %xmm1, %xmm4
474 ; SSE2-NEXT: pandn %xmm0, %xmm1
475 ; SSE2-NEXT: por %xmm4, %xmm1
476 ; SSE2-NEXT: movdqa %xmm2, %xmm0
477 ; SSE2-NEXT: pxor %xmm8, %xmm0
478 ; SSE2-NEXT: movdqa %xmm9, %xmm3
479 ; SSE2-NEXT: pxor %xmm8, %xmm3
480 ; SSE2-NEXT: movdqa %xmm3, %xmm4
481 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
482 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
483 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm3
484 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
485 ; SSE2-NEXT: pand %xmm5, %xmm0
486 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
487 ; SSE2-NEXT: por %xmm0, %xmm3
488 ; SSE2-NEXT: pand %xmm3, %xmm2
489 ; SSE2-NEXT: pandn %xmm9, %xmm3
490 ; SSE2-NEXT: por %xmm2, %xmm3
491 ; SSE2-NEXT: movdqa %xmm3, %xmm0
492 ; SSE2-NEXT: pxor %xmm8, %xmm0
493 ; SSE2-NEXT: movdqa %xmm1, %xmm2
494 ; SSE2-NEXT: pxor %xmm8, %xmm2
495 ; SSE2-NEXT: movdqa %xmm2, %xmm4
496 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
497 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
498 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
499 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
500 ; SSE2-NEXT: pand %xmm5, %xmm0
501 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
502 ; SSE2-NEXT: por %xmm0, %xmm2
503 ; SSE2-NEXT: pand %xmm2, %xmm3
504 ; SSE2-NEXT: pandn %xmm1, %xmm2
505 ; SSE2-NEXT: por %xmm3, %xmm2
506 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
507 ; SSE2-NEXT: movdqa %xmm2, %xmm1
508 ; SSE2-NEXT: pxor %xmm8, %xmm1
509 ; SSE2-NEXT: pxor %xmm0, %xmm8
510 ; SSE2-NEXT: movdqa %xmm8, %xmm3
511 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
512 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
513 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm8
514 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
515 ; SSE2-NEXT: pand %xmm4, %xmm1
516 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
517 ; SSE2-NEXT: por %xmm1, %xmm3
518 ; SSE2-NEXT: pand %xmm3, %xmm2
519 ; SSE2-NEXT: pandn %xmm0, %xmm3
520 ; SSE2-NEXT: por %xmm2, %xmm3
521 ; SSE2-NEXT: movq %xmm3, %rax
524 ; SSE41-LABEL: test_v16i64:
526 ; SSE41-NEXT: movdqa %xmm0, %xmm8
527 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
528 ; SSE41-NEXT: movdqa %xmm2, %xmm0
529 ; SSE41-NEXT: pxor %xmm9, %xmm0
530 ; SSE41-NEXT: movdqa %xmm6, %xmm10
531 ; SSE41-NEXT: pxor %xmm9, %xmm10
532 ; SSE41-NEXT: movdqa %xmm10, %xmm11
533 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm11
534 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm10
535 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
536 ; SSE41-NEXT: pand %xmm11, %xmm0
537 ; SSE41-NEXT: por %xmm10, %xmm0
538 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6
539 ; SSE41-NEXT: movdqa %xmm8, %xmm0
540 ; SSE41-NEXT: pxor %xmm9, %xmm0
541 ; SSE41-NEXT: movdqa %xmm4, %xmm2
542 ; SSE41-NEXT: pxor %xmm9, %xmm2
543 ; SSE41-NEXT: movdqa %xmm2, %xmm10
544 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm10
545 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
546 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
547 ; SSE41-NEXT: pand %xmm10, %xmm0
548 ; SSE41-NEXT: por %xmm2, %xmm0
549 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
550 ; SSE41-NEXT: movdqa %xmm3, %xmm0
551 ; SSE41-NEXT: pxor %xmm9, %xmm0
552 ; SSE41-NEXT: movdqa %xmm7, %xmm2
553 ; SSE41-NEXT: pxor %xmm9, %xmm2
554 ; SSE41-NEXT: movdqa %xmm2, %xmm8
555 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
556 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
557 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
558 ; SSE41-NEXT: pand %xmm8, %xmm0
559 ; SSE41-NEXT: por %xmm2, %xmm0
560 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7
561 ; SSE41-NEXT: movdqa %xmm1, %xmm0
562 ; SSE41-NEXT: pxor %xmm9, %xmm0
563 ; SSE41-NEXT: movdqa %xmm5, %xmm2
564 ; SSE41-NEXT: pxor %xmm9, %xmm2
565 ; SSE41-NEXT: movdqa %xmm2, %xmm3
566 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
567 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
568 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
569 ; SSE41-NEXT: pand %xmm3, %xmm0
570 ; SSE41-NEXT: por %xmm2, %xmm0
571 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
572 ; SSE41-NEXT: movapd %xmm5, %xmm0
573 ; SSE41-NEXT: xorpd %xmm9, %xmm0
574 ; SSE41-NEXT: movapd %xmm7, %xmm1
575 ; SSE41-NEXT: xorpd %xmm9, %xmm1
576 ; SSE41-NEXT: movapd %xmm1, %xmm2
577 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
578 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
579 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
580 ; SSE41-NEXT: pand %xmm2, %xmm0
581 ; SSE41-NEXT: por %xmm1, %xmm0
582 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7
583 ; SSE41-NEXT: movapd %xmm4, %xmm0
584 ; SSE41-NEXT: xorpd %xmm9, %xmm0
585 ; SSE41-NEXT: movapd %xmm6, %xmm1
586 ; SSE41-NEXT: xorpd %xmm9, %xmm1
587 ; SSE41-NEXT: movapd %xmm1, %xmm2
588 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
589 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
590 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
591 ; SSE41-NEXT: pand %xmm2, %xmm0
592 ; SSE41-NEXT: por %xmm1, %xmm0
593 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
594 ; SSE41-NEXT: movapd %xmm6, %xmm0
595 ; SSE41-NEXT: xorpd %xmm9, %xmm0
596 ; SSE41-NEXT: movapd %xmm7, %xmm1
597 ; SSE41-NEXT: xorpd %xmm9, %xmm1
598 ; SSE41-NEXT: movapd %xmm1, %xmm2
599 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
600 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
601 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
602 ; SSE41-NEXT: pand %xmm2, %xmm0
603 ; SSE41-NEXT: por %xmm1, %xmm0
604 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm7
605 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,0,1]
606 ; SSE41-NEXT: movdqa %xmm7, %xmm0
607 ; SSE41-NEXT: pxor %xmm9, %xmm0
608 ; SSE41-NEXT: pxor %xmm1, %xmm9
609 ; SSE41-NEXT: movdqa %xmm9, %xmm2
610 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
611 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
612 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
613 ; SSE41-NEXT: pand %xmm2, %xmm0
614 ; SSE41-NEXT: por %xmm9, %xmm0
615 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
616 ; SSE41-NEXT: movq %xmm1, %rax
619 ; AVX1-LABEL: test_v16i64:
621 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
622 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm5
623 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm6
624 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm8
625 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
626 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm7
627 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm9
628 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12
629 ; AVX1-NEXT: vpxor %xmm4, %xmm12, %xmm10
630 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm13
631 ; AVX1-NEXT: vpxor %xmm4, %xmm13, %xmm5
632 ; AVX1-NEXT: vpcmpgtq %xmm10, %xmm5, %xmm10
633 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
634 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm11
635 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
636 ; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm6
637 ; AVX1-NEXT: vpcmpgtq %xmm11, %xmm6, %xmm6
638 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm7, %xmm5
639 ; AVX1-NEXT: vxorpd %xmm4, %xmm5, %xmm11
640 ; AVX1-NEXT: vblendvpd %xmm10, %xmm12, %xmm13, %xmm7
641 ; AVX1-NEXT: vxorpd %xmm4, %xmm7, %xmm6
642 ; AVX1-NEXT: vpcmpgtq %xmm11, %xmm6, %xmm6
643 ; AVX1-NEXT: vblendvpd %xmm9, %xmm0, %xmm2, %xmm0
644 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2
645 ; AVX1-NEXT: vblendvpd %xmm8, %xmm1, %xmm3, %xmm1
646 ; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3
647 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
648 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
649 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm1
650 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm7, %xmm2
651 ; AVX1-NEXT: vxorpd %xmm4, %xmm2, %xmm3
652 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
653 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
654 ; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
655 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2
656 ; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3
657 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
658 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
659 ; AVX1-NEXT: vmovq %xmm0, %rax
660 ; AVX1-NEXT: vzeroupper
663 ; AVX2-LABEL: test_v16i64:
665 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
666 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5
667 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm6
668 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5
669 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
670 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm3
671 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
672 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
673 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
674 ; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm2
675 ; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm3
676 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
677 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
678 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
679 ; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm2
680 ; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm3
681 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
682 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
683 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
684 ; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm2
685 ; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm3
686 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
687 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
688 ; AVX2-NEXT: vmovq %xmm0, %rax
689 ; AVX2-NEXT: vzeroupper
692 ; AVX512BW-LABEL: test_v16i64:
694 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
695 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
696 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
697 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
698 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
699 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
700 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
701 ; AVX512BW-NEXT: vmovq %xmm0, %rax
702 ; AVX512BW-NEXT: vzeroupper
703 ; AVX512BW-NEXT: retq
705 ; AVX512VL-LABEL: test_v16i64:
707 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
708 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
709 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
710 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
711 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
712 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
713 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
714 ; AVX512VL-NEXT: vmovq %xmm0, %rax
715 ; AVX512VL-NEXT: vzeroupper
716 ; AVX512VL-NEXT: retq
717 %1 = call i64 @llvm.experimental.vector.reduce.umin.v16i64(<16 x i64> %a0)
725 define i32 @test_v2i32(<2 x i32> %a0) {
726 ; SSE2-LABEL: test_v2i32:
728 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
729 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
730 ; SSE2-NEXT: movdqa %xmm0, %xmm3
731 ; SSE2-NEXT: pxor %xmm2, %xmm3
732 ; SSE2-NEXT: pxor %xmm1, %xmm2
733 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
734 ; SSE2-NEXT: pand %xmm2, %xmm0
735 ; SSE2-NEXT: pandn %xmm1, %xmm2
736 ; SSE2-NEXT: por %xmm0, %xmm2
737 ; SSE2-NEXT: movd %xmm2, %eax
740 ; SSE41-LABEL: test_v2i32:
742 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
743 ; SSE41-NEXT: pminud %xmm0, %xmm1
744 ; SSE41-NEXT: movd %xmm1, %eax
747 ; AVX-LABEL: test_v2i32:
749 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
750 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
751 ; AVX-NEXT: vmovd %xmm0, %eax
754 ; AVX512-LABEL: test_v2i32:
756 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
757 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
758 ; AVX512-NEXT: vmovd %xmm0, %eax
760 %1 = call i32 @llvm.experimental.vector.reduce.umin.v2i32(<2 x i32> %a0)
764 define i32 @test_v4i32(<4 x i32> %a0) {
765 ; SSE2-LABEL: test_v4i32:
767 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
768 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
769 ; SSE2-NEXT: movdqa %xmm0, %xmm3
770 ; SSE2-NEXT: pxor %xmm2, %xmm3
771 ; SSE2-NEXT: movdqa %xmm1, %xmm4
772 ; SSE2-NEXT: pxor %xmm2, %xmm4
773 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
774 ; SSE2-NEXT: pand %xmm4, %xmm0
775 ; SSE2-NEXT: pandn %xmm1, %xmm4
776 ; SSE2-NEXT: por %xmm0, %xmm4
777 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
778 ; SSE2-NEXT: movdqa %xmm4, %xmm1
779 ; SSE2-NEXT: pxor %xmm2, %xmm1
780 ; SSE2-NEXT: pxor %xmm0, %xmm2
781 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
782 ; SSE2-NEXT: pand %xmm2, %xmm4
783 ; SSE2-NEXT: pandn %xmm0, %xmm2
784 ; SSE2-NEXT: por %xmm4, %xmm2
785 ; SSE2-NEXT: movd %xmm2, %eax
788 ; SSE41-LABEL: test_v4i32:
790 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
791 ; SSE41-NEXT: pminud %xmm0, %xmm1
792 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
793 ; SSE41-NEXT: pminud %xmm1, %xmm0
794 ; SSE41-NEXT: movd %xmm0, %eax
797 ; AVX-LABEL: test_v4i32:
799 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
800 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
801 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
802 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
803 ; AVX-NEXT: vmovd %xmm0, %eax
806 ; AVX512-LABEL: test_v4i32:
808 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
809 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
810 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
811 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
812 ; AVX512-NEXT: vmovd %xmm0, %eax
814 %1 = call i32 @llvm.experimental.vector.reduce.umin.v4i32(<4 x i32> %a0)
818 define i32 @test_v8i32(<8 x i32> %a0) {
819 ; SSE2-LABEL: test_v8i32:
821 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
822 ; SSE2-NEXT: movdqa %xmm0, %xmm3
823 ; SSE2-NEXT: pxor %xmm2, %xmm3
824 ; SSE2-NEXT: movdqa %xmm1, %xmm4
825 ; SSE2-NEXT: pxor %xmm2, %xmm4
826 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
827 ; SSE2-NEXT: pand %xmm4, %xmm0
828 ; SSE2-NEXT: pandn %xmm1, %xmm4
829 ; SSE2-NEXT: por %xmm0, %xmm4
830 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
831 ; SSE2-NEXT: movdqa %xmm4, %xmm1
832 ; SSE2-NEXT: pxor %xmm2, %xmm1
833 ; SSE2-NEXT: movdqa %xmm0, %xmm3
834 ; SSE2-NEXT: pxor %xmm2, %xmm3
835 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
836 ; SSE2-NEXT: pand %xmm3, %xmm4
837 ; SSE2-NEXT: pandn %xmm0, %xmm3
838 ; SSE2-NEXT: por %xmm4, %xmm3
839 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
840 ; SSE2-NEXT: movdqa %xmm3, %xmm1
841 ; SSE2-NEXT: pxor %xmm2, %xmm1
842 ; SSE2-NEXT: pxor %xmm0, %xmm2
843 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
844 ; SSE2-NEXT: pand %xmm2, %xmm3
845 ; SSE2-NEXT: pandn %xmm0, %xmm2
846 ; SSE2-NEXT: por %xmm3, %xmm2
847 ; SSE2-NEXT: movd %xmm2, %eax
850 ; SSE41-LABEL: test_v8i32:
852 ; SSE41-NEXT: pminud %xmm1, %xmm0
853 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
854 ; SSE41-NEXT: pminud %xmm0, %xmm1
855 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
856 ; SSE41-NEXT: pminud %xmm1, %xmm0
857 ; SSE41-NEXT: movd %xmm0, %eax
860 ; AVX1-LABEL: test_v8i32:
862 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
863 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
864 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
865 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
866 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
867 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
868 ; AVX1-NEXT: vmovd %xmm0, %eax
869 ; AVX1-NEXT: vzeroupper
872 ; AVX2-LABEL: test_v8i32:
874 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
875 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
876 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
877 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
878 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
879 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
880 ; AVX2-NEXT: vmovd %xmm0, %eax
881 ; AVX2-NEXT: vzeroupper
884 ; AVX512-LABEL: test_v8i32:
886 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
887 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
888 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
889 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
890 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
891 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
892 ; AVX512-NEXT: vmovd %xmm0, %eax
893 ; AVX512-NEXT: vzeroupper
895 %1 = call i32 @llvm.experimental.vector.reduce.umin.v8i32(<8 x i32> %a0)
899 define i32 @test_v16i32(<16 x i32> %a0) {
900 ; SSE2-LABEL: test_v16i32:
902 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
903 ; SSE2-NEXT: movdqa %xmm1, %xmm5
904 ; SSE2-NEXT: pxor %xmm4, %xmm5
905 ; SSE2-NEXT: movdqa %xmm3, %xmm6
906 ; SSE2-NEXT: pxor %xmm4, %xmm6
907 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
908 ; SSE2-NEXT: pand %xmm6, %xmm1
909 ; SSE2-NEXT: pandn %xmm3, %xmm6
910 ; SSE2-NEXT: por %xmm1, %xmm6
911 ; SSE2-NEXT: movdqa %xmm0, %xmm1
912 ; SSE2-NEXT: pxor %xmm4, %xmm1
913 ; SSE2-NEXT: movdqa %xmm2, %xmm3
914 ; SSE2-NEXT: pxor %xmm4, %xmm3
915 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
916 ; SSE2-NEXT: pand %xmm3, %xmm0
917 ; SSE2-NEXT: pandn %xmm2, %xmm3
918 ; SSE2-NEXT: por %xmm0, %xmm3
919 ; SSE2-NEXT: movdqa %xmm3, %xmm0
920 ; SSE2-NEXT: pxor %xmm4, %xmm0
921 ; SSE2-NEXT: movdqa %xmm6, %xmm1
922 ; SSE2-NEXT: pxor %xmm4, %xmm1
923 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
924 ; SSE2-NEXT: pand %xmm1, %xmm3
925 ; SSE2-NEXT: pandn %xmm6, %xmm1
926 ; SSE2-NEXT: por %xmm3, %xmm1
927 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
928 ; SSE2-NEXT: movdqa %xmm1, %xmm2
929 ; SSE2-NEXT: pxor %xmm4, %xmm2
930 ; SSE2-NEXT: movdqa %xmm0, %xmm3
931 ; SSE2-NEXT: pxor %xmm4, %xmm3
932 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
933 ; SSE2-NEXT: pand %xmm3, %xmm1
934 ; SSE2-NEXT: pandn %xmm0, %xmm3
935 ; SSE2-NEXT: por %xmm1, %xmm3
936 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
937 ; SSE2-NEXT: movdqa %xmm3, %xmm1
938 ; SSE2-NEXT: pxor %xmm4, %xmm1
939 ; SSE2-NEXT: pxor %xmm0, %xmm4
940 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
941 ; SSE2-NEXT: pand %xmm4, %xmm3
942 ; SSE2-NEXT: pandn %xmm0, %xmm4
943 ; SSE2-NEXT: por %xmm3, %xmm4
944 ; SSE2-NEXT: movd %xmm4, %eax
947 ; SSE41-LABEL: test_v16i32:
949 ; SSE41-NEXT: pminud %xmm3, %xmm1
950 ; SSE41-NEXT: pminud %xmm2, %xmm1
951 ; SSE41-NEXT: pminud %xmm0, %xmm1
952 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
953 ; SSE41-NEXT: pminud %xmm1, %xmm0
954 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
955 ; SSE41-NEXT: pminud %xmm0, %xmm1
956 ; SSE41-NEXT: movd %xmm1, %eax
959 ; AVX1-LABEL: test_v16i32:
961 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
962 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
963 ; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2
964 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
965 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
966 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
967 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
968 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
969 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
970 ; AVX1-NEXT: vmovd %xmm0, %eax
971 ; AVX1-NEXT: vzeroupper
974 ; AVX2-LABEL: test_v16i32:
976 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
977 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
978 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
979 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
980 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
981 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
982 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
983 ; AVX2-NEXT: vmovd %xmm0, %eax
984 ; AVX2-NEXT: vzeroupper
987 ; AVX512-LABEL: test_v16i32:
989 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
990 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
991 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
992 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
993 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
994 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
995 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
996 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
997 ; AVX512-NEXT: vmovd %xmm0, %eax
998 ; AVX512-NEXT: vzeroupper
1000 %1 = call i32 @llvm.experimental.vector.reduce.umin.v16i32(<16 x i32> %a0)
1004 define i32 @test_v32i32(<32 x i32> %a0) {
1005 ; SSE2-LABEL: test_v32i32:
1007 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
1008 ; SSE2-NEXT: movdqa %xmm2, %xmm10
1009 ; SSE2-NEXT: pxor %xmm8, %xmm10
1010 ; SSE2-NEXT: movdqa %xmm6, %xmm9
1011 ; SSE2-NEXT: pxor %xmm8, %xmm9
1012 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm9
1013 ; SSE2-NEXT: pand %xmm9, %xmm2
1014 ; SSE2-NEXT: pandn %xmm6, %xmm9
1015 ; SSE2-NEXT: por %xmm2, %xmm9
1016 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1017 ; SSE2-NEXT: pxor %xmm8, %xmm6
1018 ; SSE2-NEXT: movdqa %xmm4, %xmm2
1019 ; SSE2-NEXT: pxor %xmm8, %xmm2
1020 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1021 ; SSE2-NEXT: pand %xmm2, %xmm0
1022 ; SSE2-NEXT: pandn %xmm4, %xmm2
1023 ; SSE2-NEXT: por %xmm0, %xmm2
1024 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1025 ; SSE2-NEXT: pxor %xmm8, %xmm0
1026 ; SSE2-NEXT: movdqa %xmm7, %xmm4
1027 ; SSE2-NEXT: pxor %xmm8, %xmm4
1028 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1029 ; SSE2-NEXT: pand %xmm4, %xmm3
1030 ; SSE2-NEXT: pandn %xmm7, %xmm4
1031 ; SSE2-NEXT: por %xmm3, %xmm4
1032 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1033 ; SSE2-NEXT: pxor %xmm8, %xmm0
1034 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1035 ; SSE2-NEXT: pxor %xmm8, %xmm3
1036 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1037 ; SSE2-NEXT: pand %xmm3, %xmm1
1038 ; SSE2-NEXT: pandn %xmm5, %xmm3
1039 ; SSE2-NEXT: por %xmm1, %xmm3
1040 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1041 ; SSE2-NEXT: pxor %xmm8, %xmm0
1042 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1043 ; SSE2-NEXT: pxor %xmm8, %xmm1
1044 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1045 ; SSE2-NEXT: pand %xmm1, %xmm3
1046 ; SSE2-NEXT: pandn %xmm4, %xmm1
1047 ; SSE2-NEXT: por %xmm3, %xmm1
1048 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1049 ; SSE2-NEXT: pxor %xmm8, %xmm0
1050 ; SSE2-NEXT: movdqa %xmm9, %xmm3
1051 ; SSE2-NEXT: pxor %xmm8, %xmm3
1052 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1053 ; SSE2-NEXT: pand %xmm3, %xmm2
1054 ; SSE2-NEXT: pandn %xmm9, %xmm3
1055 ; SSE2-NEXT: por %xmm2, %xmm3
1056 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1057 ; SSE2-NEXT: pxor %xmm8, %xmm0
1058 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1059 ; SSE2-NEXT: pxor %xmm8, %xmm2
1060 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1061 ; SSE2-NEXT: pand %xmm2, %xmm3
1062 ; SSE2-NEXT: pandn %xmm1, %xmm2
1063 ; SSE2-NEXT: por %xmm3, %xmm2
1064 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1065 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1066 ; SSE2-NEXT: pxor %xmm8, %xmm1
1067 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1068 ; SSE2-NEXT: pxor %xmm8, %xmm3
1069 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1070 ; SSE2-NEXT: pand %xmm3, %xmm2
1071 ; SSE2-NEXT: pandn %xmm0, %xmm3
1072 ; SSE2-NEXT: por %xmm2, %xmm3
1073 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1074 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1075 ; SSE2-NEXT: pxor %xmm8, %xmm1
1076 ; SSE2-NEXT: pxor %xmm0, %xmm8
1077 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm8
1078 ; SSE2-NEXT: pand %xmm8, %xmm3
1079 ; SSE2-NEXT: pandn %xmm0, %xmm8
1080 ; SSE2-NEXT: por %xmm3, %xmm8
1081 ; SSE2-NEXT: movd %xmm8, %eax
1084 ; SSE41-LABEL: test_v32i32:
1086 ; SSE41-NEXT: pminud %xmm6, %xmm2
1087 ; SSE41-NEXT: pminud %xmm7, %xmm3
1088 ; SSE41-NEXT: pminud %xmm5, %xmm3
1089 ; SSE41-NEXT: pminud %xmm1, %xmm3
1090 ; SSE41-NEXT: pminud %xmm4, %xmm2
1091 ; SSE41-NEXT: pminud %xmm3, %xmm2
1092 ; SSE41-NEXT: pminud %xmm0, %xmm2
1093 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1094 ; SSE41-NEXT: pminud %xmm2, %xmm0
1095 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1096 ; SSE41-NEXT: pminud %xmm0, %xmm1
1097 ; SSE41-NEXT: movd %xmm1, %eax
1100 ; AVX1-LABEL: test_v32i32:
1102 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm4
1103 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
1104 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1105 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
1106 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
1107 ; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1
1108 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1109 ; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1
1110 ; AVX1-NEXT: vpminud %xmm4, %xmm2, %xmm2
1111 ; AVX1-NEXT: vpminud %xmm1, %xmm2, %xmm1
1112 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1113 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1114 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1115 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1116 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1117 ; AVX1-NEXT: vmovd %xmm0, %eax
1118 ; AVX1-NEXT: vzeroupper
1121 ; AVX2-LABEL: test_v32i32:
1123 ; AVX2-NEXT: vpminud %ymm3, %ymm1, %ymm1
1124 ; AVX2-NEXT: vpminud %ymm1, %ymm2, %ymm1
1125 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1126 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1127 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1128 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1129 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1130 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1131 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1132 ; AVX2-NEXT: vmovd %xmm0, %eax
1133 ; AVX2-NEXT: vzeroupper
1136 ; AVX512-LABEL: test_v32i32:
1138 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
1139 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1140 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
1141 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1142 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1143 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1144 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1145 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1146 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1147 ; AVX512-NEXT: vmovd %xmm0, %eax
1148 ; AVX512-NEXT: vzeroupper
1150 %1 = call i32 @llvm.experimental.vector.reduce.umin.v32i32(<32 x i32> %a0)
1158 define i16 @test_v2i16(<2 x i16> %a0) {
1159 ; SSE2-LABEL: test_v2i16:
1161 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1162 ; SSE2-NEXT: psrld $16, %xmm1
1163 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1164 ; SSE2-NEXT: pxor %xmm2, %xmm0
1165 ; SSE2-NEXT: pxor %xmm2, %xmm1
1166 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1167 ; SSE2-NEXT: movd %xmm1, %eax
1168 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1169 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1172 ; SSE41-LABEL: test_v2i16:
1174 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1175 ; SSE41-NEXT: psrld $16, %xmm1
1176 ; SSE41-NEXT: pminuw %xmm0, %xmm1
1177 ; SSE41-NEXT: movd %xmm1, %eax
1178 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1181 ; AVX-LABEL: test_v2i16:
1183 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1184 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1185 ; AVX-NEXT: vmovd %xmm0, %eax
1186 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1189 ; AVX512-LABEL: test_v2i16:
1191 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1192 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1193 ; AVX512-NEXT: vmovd %xmm0, %eax
1194 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1196 %1 = call i16 @llvm.experimental.vector.reduce.umin.v2i16(<2 x i16> %a0)
1200 define i16 @test_v4i16(<4 x i16> %a0) {
1201 ; SSE2-LABEL: test_v4i16:
1203 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1204 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1205 ; SSE2-NEXT: pxor %xmm2, %xmm0
1206 ; SSE2-NEXT: pxor %xmm2, %xmm1
1207 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1208 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1209 ; SSE2-NEXT: pxor %xmm2, %xmm0
1210 ; SSE2-NEXT: psrld $16, %xmm0
1211 ; SSE2-NEXT: pxor %xmm2, %xmm0
1212 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1213 ; SSE2-NEXT: movd %xmm0, %eax
1214 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1215 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1218 ; SSE41-LABEL: test_v4i16:
1220 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1221 ; SSE41-NEXT: pminuw %xmm0, %xmm1
1222 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1223 ; SSE41-NEXT: psrld $16, %xmm0
1224 ; SSE41-NEXT: pminuw %xmm1, %xmm0
1225 ; SSE41-NEXT: movd %xmm0, %eax
1226 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1229 ; AVX-LABEL: test_v4i16:
1231 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1232 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1233 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1234 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1235 ; AVX-NEXT: vmovd %xmm0, %eax
1236 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1239 ; AVX512-LABEL: test_v4i16:
1241 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1242 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1243 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1244 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1245 ; AVX512-NEXT: vmovd %xmm0, %eax
1246 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1248 %1 = call i16 @llvm.experimental.vector.reduce.umin.v4i16(<4 x i16> %a0)
1252 define i16 @test_v8i16(<8 x i16> %a0) {
1253 ; SSE2-LABEL: test_v8i16:
1255 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1256 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1257 ; SSE2-NEXT: pxor %xmm2, %xmm0
1258 ; SSE2-NEXT: pxor %xmm2, %xmm1
1259 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1260 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1261 ; SSE2-NEXT: pxor %xmm2, %xmm0
1262 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1263 ; SSE2-NEXT: pxor %xmm2, %xmm0
1264 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1265 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1266 ; SSE2-NEXT: pxor %xmm2, %xmm1
1267 ; SSE2-NEXT: psrld $16, %xmm1
1268 ; SSE2-NEXT: pxor %xmm2, %xmm1
1269 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1270 ; SSE2-NEXT: movd %xmm1, %eax
1271 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1272 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1275 ; SSE41-LABEL: test_v8i16:
1277 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1278 ; SSE41-NEXT: movd %xmm0, %eax
1279 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1282 ; AVX-LABEL: test_v8i16:
1284 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1285 ; AVX-NEXT: vmovd %xmm0, %eax
1286 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1289 ; AVX512-LABEL: test_v8i16:
1291 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1292 ; AVX512-NEXT: vmovd %xmm0, %eax
1293 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1295 %1 = call i16 @llvm.experimental.vector.reduce.umin.v8i16(<8 x i16> %a0)
1299 define i16 @test_v16i16(<16 x i16> %a0) {
1300 ; SSE2-LABEL: test_v16i16:
1302 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1303 ; SSE2-NEXT: pxor %xmm2, %xmm1
1304 ; SSE2-NEXT: pxor %xmm2, %xmm0
1305 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1306 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1307 ; SSE2-NEXT: pxor %xmm2, %xmm1
1308 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1309 ; SSE2-NEXT: pxor %xmm2, %xmm1
1310 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1311 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1312 ; SSE2-NEXT: pxor %xmm2, %xmm0
1313 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1314 ; SSE2-NEXT: pxor %xmm2, %xmm0
1315 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1316 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1317 ; SSE2-NEXT: pxor %xmm2, %xmm1
1318 ; SSE2-NEXT: psrld $16, %xmm1
1319 ; SSE2-NEXT: pxor %xmm2, %xmm1
1320 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1321 ; SSE2-NEXT: movd %xmm1, %eax
1322 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1323 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1326 ; SSE41-LABEL: test_v16i16:
1328 ; SSE41-NEXT: pminuw %xmm1, %xmm0
1329 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1330 ; SSE41-NEXT: movd %xmm0, %eax
1331 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1334 ; AVX1-LABEL: test_v16i16:
1336 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1337 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1338 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1339 ; AVX1-NEXT: vmovd %xmm0, %eax
1340 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1341 ; AVX1-NEXT: vzeroupper
1344 ; AVX2-LABEL: test_v16i16:
1346 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1347 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1348 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1349 ; AVX2-NEXT: vmovd %xmm0, %eax
1350 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1351 ; AVX2-NEXT: vzeroupper
1354 ; AVX512-LABEL: test_v16i16:
1356 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1357 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1358 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1359 ; AVX512-NEXT: vmovd %xmm0, %eax
1360 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1361 ; AVX512-NEXT: vzeroupper
1363 %1 = call i16 @llvm.experimental.vector.reduce.umin.v16i16(<16 x i16> %a0)
1367 define i16 @test_v32i16(<32 x i16> %a0) {
1368 ; SSE2-LABEL: test_v32i16:
1370 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1371 ; SSE2-NEXT: pxor %xmm4, %xmm3
1372 ; SSE2-NEXT: pxor %xmm4, %xmm1
1373 ; SSE2-NEXT: pminsw %xmm3, %xmm1
1374 ; SSE2-NEXT: pxor %xmm4, %xmm2
1375 ; SSE2-NEXT: pminsw %xmm1, %xmm2
1376 ; SSE2-NEXT: pxor %xmm4, %xmm0
1377 ; SSE2-NEXT: pminsw %xmm2, %xmm0
1378 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1379 ; SSE2-NEXT: pxor %xmm4, %xmm1
1380 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1381 ; SSE2-NEXT: pxor %xmm4, %xmm1
1382 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1383 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1384 ; SSE2-NEXT: pxor %xmm4, %xmm0
1385 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1386 ; SSE2-NEXT: pxor %xmm4, %xmm0
1387 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1388 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1389 ; SSE2-NEXT: pxor %xmm4, %xmm1
1390 ; SSE2-NEXT: psrld $16, %xmm1
1391 ; SSE2-NEXT: pxor %xmm4, %xmm1
1392 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1393 ; SSE2-NEXT: movd %xmm1, %eax
1394 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1395 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1398 ; SSE41-LABEL: test_v32i16:
1400 ; SSE41-NEXT: pminuw %xmm3, %xmm1
1401 ; SSE41-NEXT: pminuw %xmm2, %xmm1
1402 ; SSE41-NEXT: pminuw %xmm0, %xmm1
1403 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
1404 ; SSE41-NEXT: movd %xmm0, %eax
1405 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1408 ; AVX1-LABEL: test_v32i16:
1410 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1411 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1412 ; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm2
1413 ; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1
1414 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1415 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1416 ; AVX1-NEXT: vmovd %xmm0, %eax
1417 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1418 ; AVX1-NEXT: vzeroupper
1421 ; AVX2-LABEL: test_v32i16:
1423 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1424 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1425 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1426 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1427 ; AVX2-NEXT: vmovd %xmm0, %eax
1428 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1429 ; AVX2-NEXT: vzeroupper
1432 ; AVX512-LABEL: test_v32i16:
1434 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1435 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1436 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1437 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1438 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1439 ; AVX512-NEXT: vmovd %xmm0, %eax
1440 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1441 ; AVX512-NEXT: vzeroupper
1443 %1 = call i16 @llvm.experimental.vector.reduce.umin.v32i16(<32 x i16> %a0)
1447 define i16 @test_v64i16(<64 x i16> %a0) {
1448 ; SSE2-LABEL: test_v64i16:
1450 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32768,32768,32768,32768,32768,32768,32768,32768]
1451 ; SSE2-NEXT: pxor %xmm8, %xmm6
1452 ; SSE2-NEXT: pxor %xmm8, %xmm2
1453 ; SSE2-NEXT: pminsw %xmm6, %xmm2
1454 ; SSE2-NEXT: pxor %xmm8, %xmm4
1455 ; SSE2-NEXT: pminsw %xmm2, %xmm4
1456 ; SSE2-NEXT: pxor %xmm8, %xmm0
1457 ; SSE2-NEXT: pxor %xmm8, %xmm7
1458 ; SSE2-NEXT: pxor %xmm8, %xmm3
1459 ; SSE2-NEXT: pminsw %xmm7, %xmm3
1460 ; SSE2-NEXT: pxor %xmm8, %xmm5
1461 ; SSE2-NEXT: pminsw %xmm3, %xmm5
1462 ; SSE2-NEXT: pxor %xmm8, %xmm1
1463 ; SSE2-NEXT: pminsw %xmm5, %xmm1
1464 ; SSE2-NEXT: pminsw %xmm4, %xmm1
1465 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1466 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1467 ; SSE2-NEXT: pxor %xmm8, %xmm0
1468 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1469 ; SSE2-NEXT: pxor %xmm8, %xmm0
1470 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1471 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1472 ; SSE2-NEXT: pxor %xmm8, %xmm1
1473 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1474 ; SSE2-NEXT: pxor %xmm8, %xmm1
1475 ; SSE2-NEXT: pminsw %xmm0, %xmm1
1476 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1477 ; SSE2-NEXT: pxor %xmm8, %xmm0
1478 ; SSE2-NEXT: psrld $16, %xmm0
1479 ; SSE2-NEXT: pxor %xmm8, %xmm0
1480 ; SSE2-NEXT: pminsw %xmm1, %xmm0
1481 ; SSE2-NEXT: movd %xmm0, %eax
1482 ; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000
1483 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1486 ; SSE41-LABEL: test_v64i16:
1488 ; SSE41-NEXT: pminuw %xmm7, %xmm3
1489 ; SSE41-NEXT: pminuw %xmm5, %xmm3
1490 ; SSE41-NEXT: pminuw %xmm1, %xmm3
1491 ; SSE41-NEXT: pminuw %xmm6, %xmm2
1492 ; SSE41-NEXT: pminuw %xmm4, %xmm2
1493 ; SSE41-NEXT: pminuw %xmm3, %xmm2
1494 ; SSE41-NEXT: pminuw %xmm0, %xmm2
1495 ; SSE41-NEXT: phminposuw %xmm2, %xmm0
1496 ; SSE41-NEXT: movd %xmm0, %eax
1497 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1500 ; AVX1-LABEL: test_v64i16:
1502 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1503 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1504 ; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4
1505 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1506 ; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4
1507 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1508 ; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4
1509 ; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1
1510 ; AVX1-NEXT: vpminuw %xmm1, %xmm2, %xmm1
1511 ; AVX1-NEXT: vpminuw %xmm4, %xmm1, %xmm1
1512 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1513 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1514 ; AVX1-NEXT: vmovd %xmm0, %eax
1515 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1516 ; AVX1-NEXT: vzeroupper
1519 ; AVX2-LABEL: test_v64i16:
1521 ; AVX2-NEXT: vpminuw %ymm3, %ymm1, %ymm1
1522 ; AVX2-NEXT: vpminuw %ymm1, %ymm2, %ymm1
1523 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1524 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1525 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1526 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1527 ; AVX2-NEXT: vmovd %xmm0, %eax
1528 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1529 ; AVX2-NEXT: vzeroupper
1532 ; AVX512-LABEL: test_v64i16:
1534 ; AVX512-NEXT: vpminuw %zmm1, %zmm0, %zmm0
1535 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1536 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1537 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1538 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1539 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1540 ; AVX512-NEXT: vmovd %xmm0, %eax
1541 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1542 ; AVX512-NEXT: vzeroupper
1544 %1 = call i16 @llvm.experimental.vector.reduce.umin.v64i16(<64 x i16> %a0)
1552 define i8 @test_v2i8(<2 x i8> %a0) {
1553 ; SSE2-LABEL: test_v2i8:
1555 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1556 ; SSE2-NEXT: psrlw $8, %xmm1
1557 ; SSE2-NEXT: pminub %xmm0, %xmm1
1558 ; SSE2-NEXT: movd %xmm1, %eax
1559 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1562 ; SSE41-LABEL: test_v2i8:
1564 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1565 ; SSE41-NEXT: psrlw $8, %xmm1
1566 ; SSE41-NEXT: pminub %xmm0, %xmm1
1567 ; SSE41-NEXT: pextrb $0, %xmm1, %eax
1568 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1571 ; AVX-LABEL: test_v2i8:
1573 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1574 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1575 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1576 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1579 ; AVX512-LABEL: test_v2i8:
1581 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1582 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1583 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1584 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1586 %1 = call i8 @llvm.experimental.vector.reduce.umin.v2i8(<2 x i8> %a0)
1590 define i8 @test_v4i8(<4 x i8> %a0) {
1591 ; SSE2-LABEL: test_v4i8:
1593 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1594 ; SSE2-NEXT: psrld $16, %xmm1
1595 ; SSE2-NEXT: pminub %xmm0, %xmm1
1596 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1597 ; SSE2-NEXT: psrlw $8, %xmm0
1598 ; SSE2-NEXT: pminub %xmm1, %xmm0
1599 ; SSE2-NEXT: movd %xmm0, %eax
1600 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1603 ; SSE41-LABEL: test_v4i8:
1605 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1606 ; SSE41-NEXT: psrld $16, %xmm1
1607 ; SSE41-NEXT: pminub %xmm0, %xmm1
1608 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1609 ; SSE41-NEXT: psrlw $8, %xmm0
1610 ; SSE41-NEXT: pminub %xmm1, %xmm0
1611 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1612 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1615 ; AVX-LABEL: test_v4i8:
1617 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1618 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1619 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1620 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1621 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1622 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1625 ; AVX512-LABEL: test_v4i8:
1627 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1628 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1629 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1630 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1631 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1632 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1634 %1 = call i8 @llvm.experimental.vector.reduce.umin.v4i8(<4 x i8> %a0)
1638 define i8 @test_v8i8(<8 x i8> %a0) {
1639 ; SSE2-LABEL: test_v8i8:
1641 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1642 ; SSE2-NEXT: pminub %xmm0, %xmm1
1643 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1644 ; SSE2-NEXT: psrld $16, %xmm0
1645 ; SSE2-NEXT: pminub %xmm1, %xmm0
1646 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1647 ; SSE2-NEXT: psrlw $8, %xmm1
1648 ; SSE2-NEXT: pminub %xmm0, %xmm1
1649 ; SSE2-NEXT: movd %xmm1, %eax
1650 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1653 ; SSE41-LABEL: test_v8i8:
1655 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1656 ; SSE41-NEXT: pminub %xmm0, %xmm1
1657 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1658 ; SSE41-NEXT: psrld $16, %xmm0
1659 ; SSE41-NEXT: pminub %xmm1, %xmm0
1660 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1661 ; SSE41-NEXT: psrlw $8, %xmm1
1662 ; SSE41-NEXT: pminub %xmm0, %xmm1
1663 ; SSE41-NEXT: pextrb $0, %xmm1, %eax
1664 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1667 ; AVX-LABEL: test_v8i8:
1669 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1670 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1671 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1672 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1673 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1674 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1675 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1676 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1679 ; AVX512-LABEL: test_v8i8:
1681 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1682 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1683 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1684 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1685 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1686 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1687 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1688 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1690 %1 = call i8 @llvm.experimental.vector.reduce.umin.v8i8(<8 x i8> %a0)
1694 define i8 @test_v16i8(<16 x i8> %a0) {
1695 ; SSE2-LABEL: test_v16i8:
1697 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1698 ; SSE2-NEXT: pminub %xmm0, %xmm1
1699 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1700 ; SSE2-NEXT: pminub %xmm1, %xmm0
1701 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1702 ; SSE2-NEXT: psrld $16, %xmm1
1703 ; SSE2-NEXT: pminub %xmm0, %xmm1
1704 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1705 ; SSE2-NEXT: psrlw $8, %xmm0
1706 ; SSE2-NEXT: pminub %xmm1, %xmm0
1707 ; SSE2-NEXT: movd %xmm0, %eax
1708 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1711 ; SSE41-LABEL: test_v16i8:
1713 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1714 ; SSE41-NEXT: psrlw $8, %xmm1
1715 ; SSE41-NEXT: pminub %xmm0, %xmm1
1716 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
1717 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1718 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1721 ; AVX-LABEL: test_v16i8:
1723 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1724 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1725 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1726 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1727 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1730 ; AVX512-LABEL: test_v16i8:
1732 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1733 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1734 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1735 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1736 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1738 %1 = call i8 @llvm.experimental.vector.reduce.umin.v16i8(<16 x i8> %a0)
1742 define i8 @test_v32i8(<32 x i8> %a0) {
1743 ; SSE2-LABEL: test_v32i8:
1745 ; SSE2-NEXT: pminub %xmm1, %xmm0
1746 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1747 ; SSE2-NEXT: pminub %xmm0, %xmm1
1748 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1749 ; SSE2-NEXT: pminub %xmm1, %xmm0
1750 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1751 ; SSE2-NEXT: psrld $16, %xmm1
1752 ; SSE2-NEXT: pminub %xmm0, %xmm1
1753 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1754 ; SSE2-NEXT: psrlw $8, %xmm0
1755 ; SSE2-NEXT: pminub %xmm1, %xmm0
1756 ; SSE2-NEXT: movd %xmm0, %eax
1757 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1760 ; SSE41-LABEL: test_v32i8:
1762 ; SSE41-NEXT: pminub %xmm1, %xmm0
1763 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1764 ; SSE41-NEXT: psrlw $8, %xmm1
1765 ; SSE41-NEXT: pminub %xmm0, %xmm1
1766 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
1767 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1768 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1771 ; AVX1-LABEL: test_v32i8:
1773 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1774 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1775 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1776 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1777 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1778 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
1779 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1780 ; AVX1-NEXT: vzeroupper
1783 ; AVX2-LABEL: test_v32i8:
1785 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1786 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1787 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1788 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1789 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1790 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
1791 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1792 ; AVX2-NEXT: vzeroupper
1795 ; AVX512-LABEL: test_v32i8:
1797 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1798 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1799 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1800 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1801 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1802 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1803 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1804 ; AVX512-NEXT: vzeroupper
1806 %1 = call i8 @llvm.experimental.vector.reduce.umin.v32i8(<32 x i8> %a0)
1810 define i8 @test_v64i8(<64 x i8> %a0) {
1811 ; SSE2-LABEL: test_v64i8:
1813 ; SSE2-NEXT: pminub %xmm3, %xmm1
1814 ; SSE2-NEXT: pminub %xmm2, %xmm1
1815 ; SSE2-NEXT: pminub %xmm0, %xmm1
1816 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1817 ; SSE2-NEXT: pminub %xmm1, %xmm0
1818 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1819 ; SSE2-NEXT: pminub %xmm0, %xmm1
1820 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1821 ; SSE2-NEXT: psrld $16, %xmm0
1822 ; SSE2-NEXT: pminub %xmm1, %xmm0
1823 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1824 ; SSE2-NEXT: psrlw $8, %xmm1
1825 ; SSE2-NEXT: pminub %xmm0, %xmm1
1826 ; SSE2-NEXT: movd %xmm1, %eax
1827 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1830 ; SSE41-LABEL: test_v64i8:
1832 ; SSE41-NEXT: pminub %xmm3, %xmm1
1833 ; SSE41-NEXT: pminub %xmm2, %xmm1
1834 ; SSE41-NEXT: pminub %xmm0, %xmm1
1835 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1836 ; SSE41-NEXT: psrlw $8, %xmm0
1837 ; SSE41-NEXT: pminub %xmm1, %xmm0
1838 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1839 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1840 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1843 ; AVX1-LABEL: test_v64i8:
1845 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1846 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1847 ; AVX1-NEXT: vpminub %xmm2, %xmm3, %xmm2
1848 ; AVX1-NEXT: vpminub %xmm2, %xmm1, %xmm1
1849 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1850 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1851 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1852 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1853 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
1854 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1855 ; AVX1-NEXT: vzeroupper
1858 ; AVX2-LABEL: test_v64i8:
1860 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
1861 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1862 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1863 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1864 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1865 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1866 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
1867 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1868 ; AVX2-NEXT: vzeroupper
1871 ; AVX512-LABEL: test_v64i8:
1873 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1874 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
1875 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1876 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1877 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1878 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1879 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1880 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1881 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1882 ; AVX512-NEXT: vzeroupper
1884 %1 = call i8 @llvm.experimental.vector.reduce.umin.v64i8(<64 x i8> %a0)
1888 define i8 @test_v128i8(<128 x i8> %a0) {
1889 ; SSE2-LABEL: test_v128i8:
1891 ; SSE2-NEXT: pminub %xmm6, %xmm2
1892 ; SSE2-NEXT: pminub %xmm7, %xmm3
1893 ; SSE2-NEXT: pminub %xmm5, %xmm3
1894 ; SSE2-NEXT: pminub %xmm1, %xmm3
1895 ; SSE2-NEXT: pminub %xmm4, %xmm2
1896 ; SSE2-NEXT: pminub %xmm3, %xmm2
1897 ; SSE2-NEXT: pminub %xmm0, %xmm2
1898 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1899 ; SSE2-NEXT: pminub %xmm2, %xmm0
1900 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1901 ; SSE2-NEXT: pminub %xmm0, %xmm1
1902 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1903 ; SSE2-NEXT: psrld $16, %xmm0
1904 ; SSE2-NEXT: pminub %xmm1, %xmm0
1905 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1906 ; SSE2-NEXT: psrlw $8, %xmm1
1907 ; SSE2-NEXT: pminub %xmm0, %xmm1
1908 ; SSE2-NEXT: movd %xmm1, %eax
1909 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1912 ; SSE41-LABEL: test_v128i8:
1914 ; SSE41-NEXT: pminub %xmm7, %xmm3
1915 ; SSE41-NEXT: pminub %xmm5, %xmm3
1916 ; SSE41-NEXT: pminub %xmm1, %xmm3
1917 ; SSE41-NEXT: pminub %xmm6, %xmm2
1918 ; SSE41-NEXT: pminub %xmm4, %xmm2
1919 ; SSE41-NEXT: pminub %xmm3, %xmm2
1920 ; SSE41-NEXT: pminub %xmm0, %xmm2
1921 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1922 ; SSE41-NEXT: psrlw $8, %xmm0
1923 ; SSE41-NEXT: pminub %xmm2, %xmm0
1924 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1925 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1926 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1929 ; AVX1-LABEL: test_v128i8:
1931 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1932 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1933 ; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4
1934 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1935 ; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4
1936 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1937 ; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4
1938 ; AVX1-NEXT: vpminub %xmm3, %xmm1, %xmm1
1939 ; AVX1-NEXT: vpminub %xmm1, %xmm2, %xmm1
1940 ; AVX1-NEXT: vpminub %xmm4, %xmm1, %xmm1
1941 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1942 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1943 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1944 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1945 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
1946 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1947 ; AVX1-NEXT: vzeroupper
1950 ; AVX2-LABEL: test_v128i8:
1952 ; AVX2-NEXT: vpminub %ymm3, %ymm1, %ymm1
1953 ; AVX2-NEXT: vpminub %ymm1, %ymm2, %ymm1
1954 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
1955 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1956 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1957 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1958 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1959 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1960 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
1961 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1962 ; AVX2-NEXT: vzeroupper
1965 ; AVX512-LABEL: test_v128i8:
1967 ; AVX512-NEXT: vpminub %zmm1, %zmm0, %zmm0
1968 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1969 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
1970 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1971 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1972 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1973 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1974 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1975 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1976 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1977 ; AVX512-NEXT: vzeroupper
1979 %1 = call i8 @llvm.experimental.vector.reduce.umin.v128i8(<128 x i8> %a0)
1983 declare i64 @llvm.experimental.vector.reduce.umin.v2i64(<2 x i64>)
1984 declare i64 @llvm.experimental.vector.reduce.umin.v4i64(<4 x i64>)
1985 declare i64 @llvm.experimental.vector.reduce.umin.v8i64(<8 x i64>)
1986 declare i64 @llvm.experimental.vector.reduce.umin.v16i64(<16 x i64>)
1988 declare i32 @llvm.experimental.vector.reduce.umin.v2i32(<2 x i32>)
1989 declare i32 @llvm.experimental.vector.reduce.umin.v4i32(<4 x i32>)
1990 declare i32 @llvm.experimental.vector.reduce.umin.v8i32(<8 x i32>)
1991 declare i32 @llvm.experimental.vector.reduce.umin.v16i32(<16 x i32>)
1992 declare i32 @llvm.experimental.vector.reduce.umin.v32i32(<32 x i32>)
1994 declare i16 @llvm.experimental.vector.reduce.umin.v2i16(<2 x i16>)
1995 declare i16 @llvm.experimental.vector.reduce.umin.v4i16(<4 x i16>)
1996 declare i16 @llvm.experimental.vector.reduce.umin.v8i16(<8 x i16>)
1997 declare i16 @llvm.experimental.vector.reduce.umin.v16i16(<16 x i16>)
1998 declare i16 @llvm.experimental.vector.reduce.umin.v32i16(<32 x i16>)
1999 declare i16 @llvm.experimental.vector.reduce.umin.v64i16(<64 x i16>)
2001 declare i8 @llvm.experimental.vector.reduce.umin.v2i8(<2 x i8>)
2002 declare i8 @llvm.experimental.vector.reduce.umin.v4i8(<4 x i8>)
2003 declare i8 @llvm.experimental.vector.reduce.umin.v8i8(<8 x i8>)
2004 declare i8 @llvm.experimental.vector.reduce.umin.v16i8(<16 x i8>)
2005 declare i8 @llvm.experimental.vector.reduce.umin.v32i8(<32 x i8>)
2006 declare i8 @llvm.experimental.vector.reduce.umin.v64i8(<64 x i8>)
2007 declare i8 @llvm.experimental.vector.reduce.umin.v128i8(<128 x i8>)