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-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE4,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE4,SSE42
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
14 define i64 @test_v2i64(<2 x i64> %a0) {
15 ; SSE2-LABEL: test_v2i64:
17 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
18 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
19 ; SSE2-NEXT: movdqa %xmm0, %xmm3
20 ; SSE2-NEXT: pxor %xmm2, %xmm3
21 ; SSE2-NEXT: pxor %xmm1, %xmm2
22 ; SSE2-NEXT: movdqa %xmm2, %xmm4
23 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
24 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
25 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
26 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
27 ; SSE2-NEXT: pand %xmm5, %xmm2
28 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
29 ; SSE2-NEXT: por %xmm2, %xmm3
30 ; SSE2-NEXT: pand %xmm3, %xmm0
31 ; SSE2-NEXT: pandn %xmm1, %xmm3
32 ; SSE2-NEXT: por %xmm0, %xmm3
33 ; SSE2-NEXT: movq %xmm3, %rax
36 ; SSE41-LABEL: test_v2i64:
38 ; SSE41-NEXT: movdqa %xmm0, %xmm1
39 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
40 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
41 ; SSE41-NEXT: pxor %xmm3, %xmm0
42 ; SSE41-NEXT: pxor %xmm2, %xmm3
43 ; SSE41-NEXT: movdqa %xmm3, %xmm4
44 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
45 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
46 ; SSE41-NEXT: pmovsxdq %xmm3, %xmm0
47 ; SSE41-NEXT: pand %xmm4, %xmm0
48 ; SSE41-NEXT: por %xmm3, %xmm0
49 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
50 ; SSE41-NEXT: movq %xmm2, %rax
53 ; SSE42-LABEL: test_v2i64:
55 ; SSE42-NEXT: movdqa %xmm0, %xmm1
56 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
57 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
58 ; SSE42-NEXT: movdqa %xmm1, %xmm3
59 ; SSE42-NEXT: pxor %xmm0, %xmm3
60 ; SSE42-NEXT: pxor %xmm2, %xmm0
61 ; SSE42-NEXT: pcmpgtq %xmm3, %xmm0
62 ; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm2
63 ; SSE42-NEXT: movq %xmm2, %rax
66 ; AVX1-LABEL: test_v2i64:
68 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
69 ; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
70 ; AVX1-NEXT: # xmm2 = mem[0,0]
71 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
72 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
73 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
74 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
75 ; AVX1-NEXT: vmovq %xmm0, %rax
78 ; AVX2-LABEL: test_v2i64:
80 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
81 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
82 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
83 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
84 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
85 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
86 ; AVX2-NEXT: vmovq %xmm0, %rax
89 ; AVX512BW-LABEL: test_v2i64:
91 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
92 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
93 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
94 ; AVX512BW-NEXT: vmovq %xmm0, %rax
95 ; AVX512BW-NEXT: vzeroupper
98 ; AVX512VL-LABEL: test_v2i64:
100 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
101 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
102 ; AVX512VL-NEXT: vmovq %xmm0, %rax
103 ; AVX512VL-NEXT: retq
104 %1 = call i64 @llvm.vector.reduce.umin.v2i64(<2 x i64> %a0)
108 define i64 @test_v4i64(<4 x i64> %a0) {
109 ; SSE2-LABEL: test_v4i64:
111 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
112 ; SSE2-NEXT: movdqa %xmm0, %xmm3
113 ; SSE2-NEXT: pxor %xmm2, %xmm3
114 ; SSE2-NEXT: movdqa %xmm1, %xmm4
115 ; SSE2-NEXT: pxor %xmm2, %xmm4
116 ; SSE2-NEXT: movdqa %xmm4, %xmm5
117 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
118 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
119 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
120 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
121 ; SSE2-NEXT: pand %xmm6, %xmm3
122 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
123 ; SSE2-NEXT: por %xmm3, %xmm4
124 ; SSE2-NEXT: pand %xmm4, %xmm0
125 ; SSE2-NEXT: pandn %xmm1, %xmm4
126 ; SSE2-NEXT: por %xmm0, %xmm4
127 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
128 ; SSE2-NEXT: movdqa %xmm4, %xmm1
129 ; SSE2-NEXT: pxor %xmm2, %xmm1
130 ; SSE2-NEXT: pxor %xmm0, %xmm2
131 ; SSE2-NEXT: movdqa %xmm2, %xmm3
132 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
133 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
134 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
135 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
136 ; SSE2-NEXT: pand %xmm5, %xmm1
137 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
138 ; SSE2-NEXT: por %xmm1, %xmm2
139 ; SSE2-NEXT: pand %xmm2, %xmm4
140 ; SSE2-NEXT: pandn %xmm0, %xmm2
141 ; SSE2-NEXT: por %xmm4, %xmm2
142 ; SSE2-NEXT: movq %xmm2, %rax
145 ; SSE41-LABEL: test_v4i64:
147 ; SSE41-NEXT: movdqa %xmm0, %xmm2
148 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
149 ; SSE41-NEXT: pxor %xmm3, %xmm0
150 ; SSE41-NEXT: movdqa %xmm1, %xmm4
151 ; SSE41-NEXT: pxor %xmm3, %xmm4
152 ; SSE41-NEXT: movdqa %xmm4, %xmm5
153 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
154 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
155 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
156 ; SSE41-NEXT: pand %xmm5, %xmm0
157 ; SSE41-NEXT: por %xmm4, %xmm0
158 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
159 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
160 ; SSE41-NEXT: movdqa %xmm1, %xmm0
161 ; SSE41-NEXT: pxor %xmm3, %xmm0
162 ; SSE41-NEXT: pxor %xmm2, %xmm3
163 ; SSE41-NEXT: movdqa %xmm3, %xmm4
164 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
165 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
166 ; SSE41-NEXT: pmovsxdq %xmm3, %xmm0
167 ; SSE41-NEXT: pand %xmm4, %xmm0
168 ; SSE41-NEXT: por %xmm3, %xmm0
169 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
170 ; SSE41-NEXT: movq %xmm2, %rax
173 ; SSE42-LABEL: test_v4i64:
175 ; SSE42-NEXT: movdqa %xmm0, %xmm2
176 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
177 ; SSE42-NEXT: movdqa %xmm0, %xmm4
178 ; SSE42-NEXT: pxor %xmm3, %xmm4
179 ; SSE42-NEXT: movdqa %xmm1, %xmm0
180 ; SSE42-NEXT: pxor %xmm3, %xmm0
181 ; SSE42-NEXT: pcmpgtq %xmm4, %xmm0
182 ; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm1
183 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
184 ; SSE42-NEXT: movdqa %xmm1, %xmm0
185 ; SSE42-NEXT: pxor %xmm3, %xmm0
186 ; SSE42-NEXT: pxor %xmm2, %xmm3
187 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm3
188 ; SSE42-NEXT: movdqa %xmm3, %xmm0
189 ; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm2
190 ; SSE42-NEXT: movq %xmm2, %rax
193 ; AVX1-LABEL: test_v4i64:
195 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
196 ; AVX1-NEXT: # xmm1 = mem[0,0]
197 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
198 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
199 ; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm4
200 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
201 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
202 ; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm0[2,3,2,3]
203 ; AVX1-NEXT: vxorpd %xmm1, %xmm0, %xmm3
204 ; AVX1-NEXT: vxorpd %xmm1, %xmm2, %xmm1
205 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1
206 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
207 ; AVX1-NEXT: vmovq %xmm0, %rax
208 ; AVX1-NEXT: vzeroupper
211 ; AVX2-LABEL: test_v4i64:
213 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
214 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
215 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
216 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4
217 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
218 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
219 ; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
220 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
221 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2
222 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
223 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
224 ; AVX2-NEXT: vmovq %xmm0, %rax
225 ; AVX2-NEXT: vzeroupper
228 ; AVX512BW-LABEL: test_v4i64:
230 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
231 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
232 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
233 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
234 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
235 ; AVX512BW-NEXT: vmovq %xmm0, %rax
236 ; AVX512BW-NEXT: vzeroupper
237 ; AVX512BW-NEXT: retq
239 ; AVX512VL-LABEL: test_v4i64:
241 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
242 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
243 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
244 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
245 ; AVX512VL-NEXT: vmovq %xmm0, %rax
246 ; AVX512VL-NEXT: vzeroupper
247 ; AVX512VL-NEXT: retq
248 %1 = call i64 @llvm.vector.reduce.umin.v4i64(<4 x i64> %a0)
252 define i64 @test_v8i64(<8 x i64> %a0) {
253 ; SSE2-LABEL: test_v8i64:
255 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
256 ; SSE2-NEXT: movdqa %xmm1, %xmm5
257 ; SSE2-NEXT: pxor %xmm4, %xmm5
258 ; SSE2-NEXT: movdqa %xmm3, %xmm6
259 ; SSE2-NEXT: pxor %xmm4, %xmm6
260 ; SSE2-NEXT: movdqa %xmm6, %xmm7
261 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
262 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
263 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
264 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
265 ; SSE2-NEXT: pand %xmm8, %xmm6
266 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
267 ; SSE2-NEXT: por %xmm6, %xmm5
268 ; SSE2-NEXT: pand %xmm5, %xmm1
269 ; SSE2-NEXT: pandn %xmm3, %xmm5
270 ; SSE2-NEXT: por %xmm1, %xmm5
271 ; SSE2-NEXT: movdqa %xmm0, %xmm1
272 ; SSE2-NEXT: pxor %xmm4, %xmm1
273 ; SSE2-NEXT: movdqa %xmm2, %xmm3
274 ; SSE2-NEXT: pxor %xmm4, %xmm3
275 ; SSE2-NEXT: movdqa %xmm3, %xmm6
276 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
277 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
278 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
279 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
280 ; SSE2-NEXT: pand %xmm7, %xmm1
281 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
282 ; SSE2-NEXT: por %xmm1, %xmm3
283 ; SSE2-NEXT: pand %xmm3, %xmm0
284 ; SSE2-NEXT: pandn %xmm2, %xmm3
285 ; SSE2-NEXT: por %xmm0, %xmm3
286 ; SSE2-NEXT: movdqa %xmm3, %xmm0
287 ; SSE2-NEXT: pxor %xmm4, %xmm0
288 ; SSE2-NEXT: movdqa %xmm5, %xmm1
289 ; SSE2-NEXT: pxor %xmm4, %xmm1
290 ; SSE2-NEXT: movdqa %xmm1, %xmm2
291 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
292 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
293 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
294 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
295 ; SSE2-NEXT: pand %xmm6, %xmm0
296 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
297 ; SSE2-NEXT: por %xmm0, %xmm1
298 ; SSE2-NEXT: pand %xmm1, %xmm3
299 ; SSE2-NEXT: pandn %xmm5, %xmm1
300 ; SSE2-NEXT: por %xmm3, %xmm1
301 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
302 ; SSE2-NEXT: movdqa %xmm1, %xmm2
303 ; SSE2-NEXT: pxor %xmm4, %xmm2
304 ; SSE2-NEXT: pxor %xmm0, %xmm4
305 ; SSE2-NEXT: movdqa %xmm4, %xmm3
306 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
307 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
308 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
309 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
310 ; SSE2-NEXT: pand %xmm5, %xmm2
311 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
312 ; SSE2-NEXT: por %xmm2, %xmm3
313 ; SSE2-NEXT: pand %xmm3, %xmm1
314 ; SSE2-NEXT: pandn %xmm0, %xmm3
315 ; SSE2-NEXT: por %xmm1, %xmm3
316 ; SSE2-NEXT: movq %xmm3, %rax
319 ; SSE41-LABEL: test_v8i64:
321 ; SSE41-NEXT: movdqa %xmm0, %xmm4
322 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
323 ; SSE41-NEXT: movdqa %xmm1, %xmm0
324 ; SSE41-NEXT: pxor %xmm5, %xmm0
325 ; SSE41-NEXT: movdqa %xmm3, %xmm6
326 ; SSE41-NEXT: pxor %xmm5, %xmm6
327 ; SSE41-NEXT: movdqa %xmm6, %xmm7
328 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
329 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
330 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
331 ; SSE41-NEXT: pand %xmm7, %xmm0
332 ; SSE41-NEXT: por %xmm6, %xmm0
333 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
334 ; SSE41-NEXT: movdqa %xmm4, %xmm0
335 ; SSE41-NEXT: pxor %xmm5, %xmm0
336 ; SSE41-NEXT: movdqa %xmm2, %xmm1
337 ; SSE41-NEXT: pxor %xmm5, %xmm1
338 ; SSE41-NEXT: movdqa %xmm1, %xmm6
339 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
340 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
341 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
342 ; SSE41-NEXT: pand %xmm6, %xmm0
343 ; SSE41-NEXT: por %xmm1, %xmm0
344 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
345 ; SSE41-NEXT: movapd %xmm2, %xmm0
346 ; SSE41-NEXT: xorpd %xmm5, %xmm0
347 ; SSE41-NEXT: movapd %xmm3, %xmm1
348 ; SSE41-NEXT: xorpd %xmm5, %xmm1
349 ; SSE41-NEXT: movapd %xmm1, %xmm4
350 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
351 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
352 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
353 ; SSE41-NEXT: pand %xmm4, %xmm0
354 ; SSE41-NEXT: por %xmm1, %xmm0
355 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
356 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
357 ; SSE41-NEXT: movdqa %xmm3, %xmm0
358 ; SSE41-NEXT: pxor %xmm5, %xmm0
359 ; SSE41-NEXT: pxor %xmm1, %xmm5
360 ; SSE41-NEXT: movdqa %xmm5, %xmm2
361 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
362 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
363 ; SSE41-NEXT: pmovsxdq %xmm5, %xmm0
364 ; SSE41-NEXT: pand %xmm2, %xmm0
365 ; SSE41-NEXT: por %xmm5, %xmm0
366 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
367 ; SSE41-NEXT: movq %xmm1, %rax
370 ; SSE42-LABEL: test_v8i64:
372 ; SSE42-NEXT: movdqa %xmm0, %xmm5
373 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
374 ; SSE42-NEXT: movdqa %xmm1, %xmm6
375 ; SSE42-NEXT: pxor %xmm4, %xmm6
376 ; SSE42-NEXT: movdqa %xmm3, %xmm0
377 ; SSE42-NEXT: pxor %xmm4, %xmm0
378 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm0
379 ; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
380 ; SSE42-NEXT: movdqa %xmm5, %xmm1
381 ; SSE42-NEXT: pxor %xmm4, %xmm1
382 ; SSE42-NEXT: movdqa %xmm2, %xmm0
383 ; SSE42-NEXT: pxor %xmm4, %xmm0
384 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
385 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm2
386 ; SSE42-NEXT: movapd %xmm2, %xmm1
387 ; SSE42-NEXT: xorpd %xmm4, %xmm1
388 ; SSE42-NEXT: movapd %xmm3, %xmm0
389 ; SSE42-NEXT: xorpd %xmm4, %xmm0
390 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
391 ; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3
392 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
393 ; SSE42-NEXT: movdqa %xmm3, %xmm0
394 ; SSE42-NEXT: pxor %xmm4, %xmm0
395 ; SSE42-NEXT: pxor %xmm1, %xmm4
396 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm4
397 ; SSE42-NEXT: movdqa %xmm4, %xmm0
398 ; SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm1
399 ; SSE42-NEXT: movq %xmm1, %rax
402 ; AVX1-LABEL: test_v8i64:
404 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
405 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
406 ; AVX1-NEXT: # xmm3 = mem[0,0]
407 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
408 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
409 ; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm6
410 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
411 ; AVX1-NEXT: vblendvpd %xmm4, %xmm2, %xmm5, %xmm2
412 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm4
413 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm5
414 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
415 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
416 ; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm1
417 ; AVX1-NEXT: vxorpd %xmm3, %xmm2, %xmm4
418 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1
419 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
420 ; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
421 ; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2
422 ; AVX1-NEXT: vxorpd %xmm3, %xmm1, %xmm3
423 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
424 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
425 ; AVX1-NEXT: vmovq %xmm0, %rax
426 ; AVX1-NEXT: vzeroupper
429 ; AVX2-LABEL: test_v8i64:
431 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
432 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
433 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm4
434 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3
435 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
436 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
437 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
438 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm4
439 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
440 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
441 ; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
442 ; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3
443 ; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2
444 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
445 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
446 ; AVX2-NEXT: vmovq %xmm0, %rax
447 ; AVX2-NEXT: vzeroupper
450 ; AVX512BW-LABEL: test_v8i64:
452 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
453 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
454 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
455 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
456 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
457 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
458 ; AVX512BW-NEXT: vmovq %xmm0, %rax
459 ; AVX512BW-NEXT: vzeroupper
460 ; AVX512BW-NEXT: retq
462 ; AVX512VL-LABEL: test_v8i64:
464 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
465 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
466 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
467 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
468 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
469 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
470 ; AVX512VL-NEXT: vmovq %xmm0, %rax
471 ; AVX512VL-NEXT: vzeroupper
472 ; AVX512VL-NEXT: retq
473 %1 = call i64 @llvm.vector.reduce.umin.v8i64(<8 x i64> %a0)
477 define i64 @test_v16i64(<16 x i64> %a0) {
478 ; SSE2-LABEL: test_v16i64:
480 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
481 ; SSE2-NEXT: movdqa %xmm2, %xmm9
482 ; SSE2-NEXT: pxor %xmm8, %xmm9
483 ; SSE2-NEXT: movdqa %xmm6, %xmm10
484 ; SSE2-NEXT: pxor %xmm8, %xmm10
485 ; SSE2-NEXT: movdqa %xmm10, %xmm11
486 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm11
487 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
488 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm10
489 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
490 ; SSE2-NEXT: pand %xmm12, %xmm10
491 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
492 ; SSE2-NEXT: por %xmm10, %xmm9
493 ; SSE2-NEXT: pand %xmm9, %xmm2
494 ; SSE2-NEXT: pandn %xmm6, %xmm9
495 ; SSE2-NEXT: por %xmm2, %xmm9
496 ; SSE2-NEXT: movdqa %xmm0, %xmm2
497 ; SSE2-NEXT: pxor %xmm8, %xmm2
498 ; SSE2-NEXT: movdqa %xmm4, %xmm6
499 ; SSE2-NEXT: pxor %xmm8, %xmm6
500 ; SSE2-NEXT: movdqa %xmm6, %xmm10
501 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm10
502 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
503 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm6
504 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
505 ; SSE2-NEXT: pand %xmm11, %xmm6
506 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
507 ; SSE2-NEXT: por %xmm6, %xmm2
508 ; SSE2-NEXT: pand %xmm2, %xmm0
509 ; SSE2-NEXT: pandn %xmm4, %xmm2
510 ; SSE2-NEXT: por %xmm0, %xmm2
511 ; SSE2-NEXT: movdqa %xmm3, %xmm0
512 ; SSE2-NEXT: pxor %xmm8, %xmm0
513 ; SSE2-NEXT: movdqa %xmm7, %xmm4
514 ; SSE2-NEXT: pxor %xmm8, %xmm4
515 ; SSE2-NEXT: movdqa %xmm4, %xmm6
516 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
517 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
518 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4
519 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
520 ; SSE2-NEXT: pand %xmm10, %xmm4
521 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
522 ; SSE2-NEXT: por %xmm4, %xmm0
523 ; SSE2-NEXT: pand %xmm0, %xmm3
524 ; SSE2-NEXT: pandn %xmm7, %xmm0
525 ; SSE2-NEXT: por %xmm3, %xmm0
526 ; SSE2-NEXT: movdqa %xmm1, %xmm3
527 ; SSE2-NEXT: pxor %xmm8, %xmm3
528 ; SSE2-NEXT: movdqa %xmm5, %xmm4
529 ; SSE2-NEXT: pxor %xmm8, %xmm4
530 ; SSE2-NEXT: movdqa %xmm4, %xmm6
531 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
532 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
533 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
534 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
535 ; SSE2-NEXT: pand %xmm7, %xmm3
536 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
537 ; SSE2-NEXT: por %xmm3, %xmm4
538 ; SSE2-NEXT: pand %xmm4, %xmm1
539 ; SSE2-NEXT: pandn %xmm5, %xmm4
540 ; SSE2-NEXT: por %xmm1, %xmm4
541 ; SSE2-NEXT: movdqa %xmm4, %xmm1
542 ; SSE2-NEXT: pxor %xmm8, %xmm1
543 ; SSE2-NEXT: movdqa %xmm0, %xmm3
544 ; SSE2-NEXT: pxor %xmm8, %xmm3
545 ; SSE2-NEXT: movdqa %xmm3, %xmm5
546 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm5
547 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
548 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
549 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
550 ; SSE2-NEXT: pand %xmm6, %xmm3
551 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
552 ; SSE2-NEXT: por %xmm3, %xmm1
553 ; SSE2-NEXT: pand %xmm1, %xmm4
554 ; SSE2-NEXT: pandn %xmm0, %xmm1
555 ; SSE2-NEXT: por %xmm4, %xmm1
556 ; SSE2-NEXT: movdqa %xmm2, %xmm0
557 ; SSE2-NEXT: pxor %xmm8, %xmm0
558 ; SSE2-NEXT: movdqa %xmm9, %xmm3
559 ; SSE2-NEXT: pxor %xmm8, %xmm3
560 ; SSE2-NEXT: movdqa %xmm3, %xmm4
561 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
562 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
563 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm3
564 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
565 ; SSE2-NEXT: pand %xmm5, %xmm0
566 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
567 ; SSE2-NEXT: por %xmm0, %xmm3
568 ; SSE2-NEXT: pand %xmm3, %xmm2
569 ; SSE2-NEXT: pandn %xmm9, %xmm3
570 ; SSE2-NEXT: por %xmm2, %xmm3
571 ; SSE2-NEXT: movdqa %xmm3, %xmm0
572 ; SSE2-NEXT: pxor %xmm8, %xmm0
573 ; SSE2-NEXT: movdqa %xmm1, %xmm2
574 ; SSE2-NEXT: pxor %xmm8, %xmm2
575 ; SSE2-NEXT: movdqa %xmm2, %xmm4
576 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
577 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
578 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
579 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
580 ; SSE2-NEXT: pand %xmm5, %xmm0
581 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
582 ; SSE2-NEXT: por %xmm0, %xmm2
583 ; SSE2-NEXT: pand %xmm2, %xmm3
584 ; SSE2-NEXT: pandn %xmm1, %xmm2
585 ; SSE2-NEXT: por %xmm3, %xmm2
586 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
587 ; SSE2-NEXT: movdqa %xmm2, %xmm1
588 ; SSE2-NEXT: pxor %xmm8, %xmm1
589 ; SSE2-NEXT: pxor %xmm0, %xmm8
590 ; SSE2-NEXT: movdqa %xmm8, %xmm3
591 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
592 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
593 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm8
594 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
595 ; SSE2-NEXT: pand %xmm4, %xmm1
596 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
597 ; SSE2-NEXT: por %xmm1, %xmm3
598 ; SSE2-NEXT: pand %xmm3, %xmm2
599 ; SSE2-NEXT: pandn %xmm0, %xmm3
600 ; SSE2-NEXT: por %xmm2, %xmm3
601 ; SSE2-NEXT: movq %xmm3, %rax
604 ; SSE41-LABEL: test_v16i64:
606 ; SSE41-NEXT: movdqa %xmm0, %xmm8
607 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
608 ; SSE41-NEXT: movdqa %xmm2, %xmm0
609 ; SSE41-NEXT: pxor %xmm9, %xmm0
610 ; SSE41-NEXT: movdqa %xmm6, %xmm10
611 ; SSE41-NEXT: pxor %xmm9, %xmm10
612 ; SSE41-NEXT: movdqa %xmm10, %xmm11
613 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm11
614 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm10
615 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
616 ; SSE41-NEXT: pand %xmm11, %xmm0
617 ; SSE41-NEXT: por %xmm10, %xmm0
618 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6
619 ; SSE41-NEXT: movdqa %xmm8, %xmm0
620 ; SSE41-NEXT: pxor %xmm9, %xmm0
621 ; SSE41-NEXT: movdqa %xmm4, %xmm2
622 ; SSE41-NEXT: pxor %xmm9, %xmm2
623 ; SSE41-NEXT: movdqa %xmm2, %xmm10
624 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm10
625 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
626 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
627 ; SSE41-NEXT: pand %xmm10, %xmm0
628 ; SSE41-NEXT: por %xmm2, %xmm0
629 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
630 ; SSE41-NEXT: movdqa %xmm3, %xmm0
631 ; SSE41-NEXT: pxor %xmm9, %xmm0
632 ; SSE41-NEXT: movdqa %xmm7, %xmm2
633 ; SSE41-NEXT: pxor %xmm9, %xmm2
634 ; SSE41-NEXT: movdqa %xmm2, %xmm8
635 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
636 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
637 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
638 ; SSE41-NEXT: pand %xmm8, %xmm0
639 ; SSE41-NEXT: por %xmm2, %xmm0
640 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7
641 ; SSE41-NEXT: movdqa %xmm1, %xmm0
642 ; SSE41-NEXT: pxor %xmm9, %xmm0
643 ; SSE41-NEXT: movdqa %xmm5, %xmm2
644 ; SSE41-NEXT: pxor %xmm9, %xmm2
645 ; SSE41-NEXT: movdqa %xmm2, %xmm3
646 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
647 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
648 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
649 ; SSE41-NEXT: pand %xmm3, %xmm0
650 ; SSE41-NEXT: por %xmm2, %xmm0
651 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
652 ; SSE41-NEXT: movapd %xmm5, %xmm0
653 ; SSE41-NEXT: xorpd %xmm9, %xmm0
654 ; SSE41-NEXT: movapd %xmm7, %xmm1
655 ; SSE41-NEXT: xorpd %xmm9, %xmm1
656 ; SSE41-NEXT: movapd %xmm1, %xmm2
657 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
658 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
659 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
660 ; SSE41-NEXT: pand %xmm2, %xmm0
661 ; SSE41-NEXT: por %xmm1, %xmm0
662 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7
663 ; SSE41-NEXT: movapd %xmm4, %xmm0
664 ; SSE41-NEXT: xorpd %xmm9, %xmm0
665 ; SSE41-NEXT: movapd %xmm6, %xmm1
666 ; SSE41-NEXT: xorpd %xmm9, %xmm1
667 ; SSE41-NEXT: movapd %xmm1, %xmm2
668 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
669 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
670 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
671 ; SSE41-NEXT: pand %xmm2, %xmm0
672 ; SSE41-NEXT: por %xmm1, %xmm0
673 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
674 ; SSE41-NEXT: movapd %xmm6, %xmm0
675 ; SSE41-NEXT: xorpd %xmm9, %xmm0
676 ; SSE41-NEXT: movapd %xmm7, %xmm1
677 ; SSE41-NEXT: xorpd %xmm9, %xmm1
678 ; SSE41-NEXT: movapd %xmm1, %xmm2
679 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
680 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
681 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
682 ; SSE41-NEXT: pand %xmm2, %xmm0
683 ; SSE41-NEXT: por %xmm1, %xmm0
684 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm7
685 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
686 ; SSE41-NEXT: movdqa %xmm7, %xmm0
687 ; SSE41-NEXT: pxor %xmm9, %xmm0
688 ; SSE41-NEXT: pxor %xmm1, %xmm9
689 ; SSE41-NEXT: movdqa %xmm9, %xmm2
690 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
691 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
692 ; SSE41-NEXT: pmovsxdq %xmm9, %xmm0
693 ; SSE41-NEXT: pand %xmm2, %xmm0
694 ; SSE41-NEXT: por %xmm9, %xmm0
695 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
696 ; SSE41-NEXT: movq %xmm1, %rax
699 ; SSE42-LABEL: test_v16i64:
701 ; SSE42-NEXT: movdqa %xmm0, %xmm9
702 ; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
703 ; SSE42-NEXT: movdqa %xmm2, %xmm10
704 ; SSE42-NEXT: pxor %xmm8, %xmm10
705 ; SSE42-NEXT: movdqa %xmm6, %xmm0
706 ; SSE42-NEXT: pxor %xmm8, %xmm0
707 ; SSE42-NEXT: pcmpgtq %xmm10, %xmm0
708 ; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm6
709 ; SSE42-NEXT: movdqa %xmm9, %xmm2
710 ; SSE42-NEXT: pxor %xmm8, %xmm2
711 ; SSE42-NEXT: movdqa %xmm4, %xmm0
712 ; SSE42-NEXT: pxor %xmm8, %xmm0
713 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
714 ; SSE42-NEXT: blendvpd %xmm0, %xmm9, %xmm4
715 ; SSE42-NEXT: movdqa %xmm3, %xmm2
716 ; SSE42-NEXT: pxor %xmm8, %xmm2
717 ; SSE42-NEXT: movdqa %xmm7, %xmm0
718 ; SSE42-NEXT: pxor %xmm8, %xmm0
719 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
720 ; SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm7
721 ; SSE42-NEXT: movdqa %xmm1, %xmm2
722 ; SSE42-NEXT: pxor %xmm8, %xmm2
723 ; SSE42-NEXT: movdqa %xmm5, %xmm0
724 ; SSE42-NEXT: pxor %xmm8, %xmm0
725 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
726 ; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm5
727 ; SSE42-NEXT: movapd %xmm5, %xmm1
728 ; SSE42-NEXT: xorpd %xmm8, %xmm1
729 ; SSE42-NEXT: movapd %xmm7, %xmm0
730 ; SSE42-NEXT: xorpd %xmm8, %xmm0
731 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
732 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm7
733 ; SSE42-NEXT: movapd %xmm4, %xmm1
734 ; SSE42-NEXT: xorpd %xmm8, %xmm1
735 ; SSE42-NEXT: movapd %xmm6, %xmm0
736 ; SSE42-NEXT: xorpd %xmm8, %xmm0
737 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
738 ; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm6
739 ; SSE42-NEXT: movapd %xmm6, %xmm1
740 ; SSE42-NEXT: xorpd %xmm8, %xmm1
741 ; SSE42-NEXT: movapd %xmm7, %xmm0
742 ; SSE42-NEXT: xorpd %xmm8, %xmm0
743 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
744 ; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7
745 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
746 ; SSE42-NEXT: movdqa %xmm7, %xmm0
747 ; SSE42-NEXT: pxor %xmm8, %xmm0
748 ; SSE42-NEXT: pxor %xmm1, %xmm8
749 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm8
750 ; SSE42-NEXT: movdqa %xmm8, %xmm0
751 ; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm1
752 ; SSE42-NEXT: movq %xmm1, %rax
755 ; AVX1-LABEL: test_v16i64:
757 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
758 ; AVX1-NEXT: # xmm4 = mem[0,0]
759 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm5
760 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm6
761 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
762 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm3, %xmm5
763 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
764 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm7
765 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6
766 ; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm2, %xmm6
767 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
768 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
769 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
770 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm8
771 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm8, %xmm7
772 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm3, %xmm1
773 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
774 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm3
775 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
776 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm7
777 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm7, %xmm3
778 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
779 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2
780 ; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3
781 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
782 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
783 ; AVX1-NEXT: vxorpd %xmm4, %xmm6, %xmm1
784 ; AVX1-NEXT: vxorpd %xmm4, %xmm5, %xmm2
785 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
786 ; AVX1-NEXT: vblendvpd %xmm1, %xmm6, %xmm5, %xmm1
787 ; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm2
788 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm3
789 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
790 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
791 ; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
792 ; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2
793 ; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3
794 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
795 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
796 ; AVX1-NEXT: vmovq %xmm0, %rax
797 ; AVX1-NEXT: vzeroupper
800 ; AVX2-LABEL: test_v16i64:
802 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
803 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5
804 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm6
805 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5
806 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1
807 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm3
808 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
809 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
810 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
811 ; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm2
812 ; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm3
813 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
814 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
815 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
816 ; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm2
817 ; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm3
818 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
819 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
820 ; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
821 ; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm2
822 ; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm3
823 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
824 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
825 ; AVX2-NEXT: vmovq %xmm0, %rax
826 ; AVX2-NEXT: vzeroupper
829 ; AVX512BW-LABEL: test_v16i64:
831 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
832 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
833 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
834 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
835 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
836 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
837 ; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0
838 ; AVX512BW-NEXT: vmovq %xmm0, %rax
839 ; AVX512BW-NEXT: vzeroupper
840 ; AVX512BW-NEXT: retq
842 ; AVX512VL-LABEL: test_v16i64:
844 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
845 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
846 ; AVX512VL-NEXT: vpminuq %zmm1, %zmm0, %zmm0
847 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
848 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
849 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
850 ; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0
851 ; AVX512VL-NEXT: vmovq %xmm0, %rax
852 ; AVX512VL-NEXT: vzeroupper
853 ; AVX512VL-NEXT: retq
854 %1 = call i64 @llvm.vector.reduce.umin.v16i64(<16 x i64> %a0)
862 define i32 @test_v2i32(<2 x i32> %a0) {
863 ; SSE2-LABEL: test_v2i32:
865 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
866 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
867 ; SSE2-NEXT: movdqa %xmm0, %xmm3
868 ; SSE2-NEXT: pxor %xmm2, %xmm3
869 ; SSE2-NEXT: pxor %xmm1, %xmm2
870 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
871 ; SSE2-NEXT: pand %xmm2, %xmm0
872 ; SSE2-NEXT: pandn %xmm1, %xmm2
873 ; SSE2-NEXT: por %xmm0, %xmm2
874 ; SSE2-NEXT: movd %xmm2, %eax
877 ; SSE4-LABEL: test_v2i32:
879 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
880 ; SSE4-NEXT: pminud %xmm0, %xmm1
881 ; SSE4-NEXT: movd %xmm1, %eax
884 ; AVX-LABEL: test_v2i32:
886 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
887 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
888 ; AVX-NEXT: vmovd %xmm0, %eax
891 ; AVX512-LABEL: test_v2i32:
893 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
894 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
895 ; AVX512-NEXT: vmovd %xmm0, %eax
897 %1 = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %a0)
901 define i32 @test_v4i32(<4 x i32> %a0) {
902 ; SSE2-LABEL: test_v4i32:
904 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
905 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
906 ; SSE2-NEXT: movdqa %xmm0, %xmm3
907 ; SSE2-NEXT: pxor %xmm2, %xmm3
908 ; SSE2-NEXT: movdqa %xmm1, %xmm4
909 ; SSE2-NEXT: pxor %xmm2, %xmm4
910 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
911 ; SSE2-NEXT: pand %xmm4, %xmm0
912 ; SSE2-NEXT: pandn %xmm1, %xmm4
913 ; SSE2-NEXT: por %xmm0, %xmm4
914 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,1,1]
915 ; SSE2-NEXT: movdqa %xmm4, %xmm1
916 ; SSE2-NEXT: pxor %xmm2, %xmm1
917 ; SSE2-NEXT: pxor %xmm0, %xmm2
918 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
919 ; SSE2-NEXT: pand %xmm2, %xmm4
920 ; SSE2-NEXT: pandn %xmm0, %xmm2
921 ; SSE2-NEXT: por %xmm4, %xmm2
922 ; SSE2-NEXT: movd %xmm2, %eax
925 ; SSE4-LABEL: test_v4i32:
927 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
928 ; SSE4-NEXT: pminud %xmm0, %xmm1
929 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
930 ; SSE4-NEXT: pminud %xmm1, %xmm0
931 ; SSE4-NEXT: movd %xmm0, %eax
934 ; AVX-LABEL: test_v4i32:
936 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
937 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
938 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
939 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
940 ; AVX-NEXT: vmovd %xmm0, %eax
943 ; AVX512-LABEL: test_v4i32:
945 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
946 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
947 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
948 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
949 ; AVX512-NEXT: vmovd %xmm0, %eax
951 %1 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %a0)
955 define i32 @test_v8i32(<8 x i32> %a0) {
956 ; SSE2-LABEL: test_v8i32:
958 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
959 ; SSE2-NEXT: movdqa %xmm0, %xmm3
960 ; SSE2-NEXT: pxor %xmm2, %xmm3
961 ; SSE2-NEXT: movdqa %xmm1, %xmm4
962 ; SSE2-NEXT: pxor %xmm2, %xmm4
963 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
964 ; SSE2-NEXT: pand %xmm4, %xmm0
965 ; SSE2-NEXT: pandn %xmm1, %xmm4
966 ; SSE2-NEXT: por %xmm0, %xmm4
967 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
968 ; SSE2-NEXT: movdqa %xmm4, %xmm1
969 ; SSE2-NEXT: pxor %xmm2, %xmm1
970 ; SSE2-NEXT: movdqa %xmm0, %xmm3
971 ; SSE2-NEXT: pxor %xmm2, %xmm3
972 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
973 ; SSE2-NEXT: pand %xmm3, %xmm4
974 ; SSE2-NEXT: pandn %xmm0, %xmm3
975 ; SSE2-NEXT: por %xmm4, %xmm3
976 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
977 ; SSE2-NEXT: movdqa %xmm3, %xmm1
978 ; SSE2-NEXT: pxor %xmm2, %xmm1
979 ; SSE2-NEXT: pxor %xmm0, %xmm2
980 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
981 ; SSE2-NEXT: pand %xmm2, %xmm3
982 ; SSE2-NEXT: pandn %xmm0, %xmm2
983 ; SSE2-NEXT: por %xmm3, %xmm2
984 ; SSE2-NEXT: movd %xmm2, %eax
987 ; SSE4-LABEL: test_v8i32:
989 ; SSE4-NEXT: pminud %xmm1, %xmm0
990 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
991 ; SSE4-NEXT: pminud %xmm0, %xmm1
992 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
993 ; SSE4-NEXT: pminud %xmm1, %xmm0
994 ; SSE4-NEXT: movd %xmm0, %eax
997 ; AVX1-LABEL: test_v8i32:
999 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1000 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1001 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1002 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1003 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1004 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1005 ; AVX1-NEXT: vmovd %xmm0, %eax
1006 ; AVX1-NEXT: vzeroupper
1009 ; AVX2-LABEL: test_v8i32:
1011 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1012 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1013 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1014 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1015 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1016 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1017 ; AVX2-NEXT: vmovd %xmm0, %eax
1018 ; AVX2-NEXT: vzeroupper
1021 ; AVX512-LABEL: test_v8i32:
1023 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1024 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1025 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1026 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1027 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1028 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1029 ; AVX512-NEXT: vmovd %xmm0, %eax
1030 ; AVX512-NEXT: vzeroupper
1032 %1 = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> %a0)
1036 define i32 @test_v16i32(<16 x i32> %a0) {
1037 ; SSE2-LABEL: test_v16i32:
1039 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1040 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1041 ; SSE2-NEXT: pxor %xmm4, %xmm5
1042 ; SSE2-NEXT: movdqa %xmm3, %xmm6
1043 ; SSE2-NEXT: pxor %xmm4, %xmm6
1044 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1045 ; SSE2-NEXT: pand %xmm6, %xmm1
1046 ; SSE2-NEXT: pandn %xmm3, %xmm6
1047 ; SSE2-NEXT: por %xmm1, %xmm6
1048 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1049 ; SSE2-NEXT: pxor %xmm4, %xmm1
1050 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1051 ; SSE2-NEXT: pxor %xmm4, %xmm3
1052 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1053 ; SSE2-NEXT: pand %xmm3, %xmm0
1054 ; SSE2-NEXT: pandn %xmm2, %xmm3
1055 ; SSE2-NEXT: por %xmm0, %xmm3
1056 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1057 ; SSE2-NEXT: pxor %xmm4, %xmm0
1058 ; SSE2-NEXT: movdqa %xmm6, %xmm1
1059 ; SSE2-NEXT: pxor %xmm4, %xmm1
1060 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1061 ; SSE2-NEXT: pand %xmm1, %xmm3
1062 ; SSE2-NEXT: pandn %xmm6, %xmm1
1063 ; SSE2-NEXT: por %xmm3, %xmm1
1064 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1065 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1066 ; SSE2-NEXT: pxor %xmm4, %xmm2
1067 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1068 ; SSE2-NEXT: pxor %xmm4, %xmm3
1069 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
1070 ; SSE2-NEXT: pand %xmm3, %xmm1
1071 ; SSE2-NEXT: pandn %xmm0, %xmm3
1072 ; SSE2-NEXT: por %xmm1, %xmm3
1073 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
1074 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1075 ; SSE2-NEXT: pxor %xmm4, %xmm1
1076 ; SSE2-NEXT: pxor %xmm0, %xmm4
1077 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1078 ; SSE2-NEXT: pand %xmm4, %xmm3
1079 ; SSE2-NEXT: pandn %xmm0, %xmm4
1080 ; SSE2-NEXT: por %xmm3, %xmm4
1081 ; SSE2-NEXT: movd %xmm4, %eax
1084 ; SSE4-LABEL: test_v16i32:
1086 ; SSE4-NEXT: pminud %xmm3, %xmm1
1087 ; SSE4-NEXT: pminud %xmm2, %xmm0
1088 ; SSE4-NEXT: pminud %xmm1, %xmm0
1089 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1090 ; SSE4-NEXT: pminud %xmm0, %xmm1
1091 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1092 ; SSE4-NEXT: pminud %xmm1, %xmm0
1093 ; SSE4-NEXT: movd %xmm0, %eax
1096 ; AVX1-LABEL: test_v16i32:
1098 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1099 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1100 ; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2
1101 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1102 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1103 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1104 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1105 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1106 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1107 ; AVX1-NEXT: vmovd %xmm0, %eax
1108 ; AVX1-NEXT: vzeroupper
1111 ; AVX2-LABEL: test_v16i32:
1113 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1114 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1115 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1116 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1117 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1118 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1119 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1120 ; AVX2-NEXT: vmovd %xmm0, %eax
1121 ; AVX2-NEXT: vzeroupper
1124 ; AVX512-LABEL: test_v16i32:
1126 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1127 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
1128 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1129 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1130 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1131 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1132 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1133 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1134 ; AVX512-NEXT: vmovd %xmm0, %eax
1135 ; AVX512-NEXT: vzeroupper
1137 %1 = call i32 @llvm.vector.reduce.umin.v16i32(<16 x i32> %a0)
1141 define i32 @test_v32i32(<32 x i32> %a0) {
1142 ; SSE2-LABEL: test_v32i32:
1144 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
1145 ; SSE2-NEXT: movdqa %xmm2, %xmm10
1146 ; SSE2-NEXT: pxor %xmm8, %xmm10
1147 ; SSE2-NEXT: movdqa %xmm6, %xmm9
1148 ; SSE2-NEXT: pxor %xmm8, %xmm9
1149 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm9
1150 ; SSE2-NEXT: pand %xmm9, %xmm2
1151 ; SSE2-NEXT: pandn %xmm6, %xmm9
1152 ; SSE2-NEXT: por %xmm2, %xmm9
1153 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1154 ; SSE2-NEXT: pxor %xmm8, %xmm6
1155 ; SSE2-NEXT: movdqa %xmm4, %xmm2
1156 ; SSE2-NEXT: pxor %xmm8, %xmm2
1157 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1158 ; SSE2-NEXT: pand %xmm2, %xmm0
1159 ; SSE2-NEXT: pandn %xmm4, %xmm2
1160 ; SSE2-NEXT: por %xmm0, %xmm2
1161 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1162 ; SSE2-NEXT: pxor %xmm8, %xmm0
1163 ; SSE2-NEXT: movdqa %xmm7, %xmm4
1164 ; SSE2-NEXT: pxor %xmm8, %xmm4
1165 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1166 ; SSE2-NEXT: pand %xmm4, %xmm3
1167 ; SSE2-NEXT: pandn %xmm7, %xmm4
1168 ; SSE2-NEXT: por %xmm3, %xmm4
1169 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1170 ; SSE2-NEXT: pxor %xmm8, %xmm0
1171 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1172 ; SSE2-NEXT: pxor %xmm8, %xmm3
1173 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1174 ; SSE2-NEXT: pand %xmm3, %xmm1
1175 ; SSE2-NEXT: pandn %xmm5, %xmm3
1176 ; SSE2-NEXT: por %xmm1, %xmm3
1177 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1178 ; SSE2-NEXT: pxor %xmm8, %xmm0
1179 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1180 ; SSE2-NEXT: pxor %xmm8, %xmm1
1181 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1182 ; SSE2-NEXT: pand %xmm1, %xmm3
1183 ; SSE2-NEXT: pandn %xmm4, %xmm1
1184 ; SSE2-NEXT: por %xmm3, %xmm1
1185 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1186 ; SSE2-NEXT: pxor %xmm8, %xmm0
1187 ; SSE2-NEXT: movdqa %xmm9, %xmm3
1188 ; SSE2-NEXT: pxor %xmm8, %xmm3
1189 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1190 ; SSE2-NEXT: pand %xmm3, %xmm2
1191 ; SSE2-NEXT: pandn %xmm9, %xmm3
1192 ; SSE2-NEXT: por %xmm2, %xmm3
1193 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1194 ; SSE2-NEXT: pxor %xmm8, %xmm0
1195 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1196 ; SSE2-NEXT: pxor %xmm8, %xmm2
1197 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1198 ; SSE2-NEXT: pand %xmm2, %xmm3
1199 ; SSE2-NEXT: pandn %xmm1, %xmm2
1200 ; SSE2-NEXT: por %xmm3, %xmm2
1201 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1202 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1203 ; SSE2-NEXT: pxor %xmm8, %xmm1
1204 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1205 ; SSE2-NEXT: pxor %xmm8, %xmm3
1206 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1207 ; SSE2-NEXT: pand %xmm3, %xmm2
1208 ; SSE2-NEXT: pandn %xmm0, %xmm3
1209 ; SSE2-NEXT: por %xmm2, %xmm3
1210 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
1211 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1212 ; SSE2-NEXT: pxor %xmm8, %xmm1
1213 ; SSE2-NEXT: pxor %xmm0, %xmm8
1214 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm8
1215 ; SSE2-NEXT: pand %xmm8, %xmm3
1216 ; SSE2-NEXT: pandn %xmm0, %xmm8
1217 ; SSE2-NEXT: por %xmm3, %xmm8
1218 ; SSE2-NEXT: movd %xmm8, %eax
1221 ; SSE4-LABEL: test_v32i32:
1223 ; SSE4-NEXT: pminud %xmm6, %xmm2
1224 ; SSE4-NEXT: pminud %xmm4, %xmm0
1225 ; SSE4-NEXT: pminud %xmm2, %xmm0
1226 ; SSE4-NEXT: pminud %xmm7, %xmm3
1227 ; SSE4-NEXT: pminud %xmm5, %xmm1
1228 ; SSE4-NEXT: pminud %xmm3, %xmm1
1229 ; SSE4-NEXT: pminud %xmm0, %xmm1
1230 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1231 ; SSE4-NEXT: pminud %xmm1, %xmm0
1232 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1233 ; SSE4-NEXT: pminud %xmm0, %xmm1
1234 ; SSE4-NEXT: movd %xmm1, %eax
1237 ; AVX1-LABEL: test_v32i32:
1239 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm4
1240 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm5
1241 ; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4
1242 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
1243 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1244 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
1245 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
1246 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1247 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1248 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1249 ; AVX1-NEXT: vpminud %xmm0, %xmm4, %xmm0
1250 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1251 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1252 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1253 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1254 ; AVX1-NEXT: vmovd %xmm0, %eax
1255 ; AVX1-NEXT: vzeroupper
1258 ; AVX2-LABEL: test_v32i32:
1260 ; AVX2-NEXT: vpminud %ymm3, %ymm1, %ymm1
1261 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
1262 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1263 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1264 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1265 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1266 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1267 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1268 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1269 ; AVX2-NEXT: vmovd %xmm0, %eax
1270 ; AVX2-NEXT: vzeroupper
1273 ; AVX512-LABEL: test_v32i32:
1275 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
1276 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1277 ; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0
1278 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1279 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1280 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1281 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1282 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1283 ; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0
1284 ; AVX512-NEXT: vmovd %xmm0, %eax
1285 ; AVX512-NEXT: vzeroupper
1287 %1 = call i32 @llvm.vector.reduce.umin.v32i32(<32 x i32> %a0)
1295 define i16 @test_v2i16(<2 x i16> %a0) {
1296 ; SSE2-LABEL: test_v2i16:
1298 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1299 ; SSE2-NEXT: psrld $16, %xmm1
1300 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1301 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1302 ; SSE2-NEXT: psubw %xmm2, %xmm0
1303 ; SSE2-NEXT: movd %xmm0, %eax
1304 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1307 ; SSE4-LABEL: test_v2i16:
1309 ; SSE4-NEXT: movdqa %xmm0, %xmm1
1310 ; SSE4-NEXT: psrld $16, %xmm1
1311 ; SSE4-NEXT: pminuw %xmm0, %xmm1
1312 ; SSE4-NEXT: movd %xmm1, %eax
1313 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1316 ; AVX-LABEL: test_v2i16:
1318 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1319 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1320 ; AVX-NEXT: vmovd %xmm0, %eax
1321 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1324 ; AVX512-LABEL: test_v2i16:
1326 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1327 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1328 ; AVX512-NEXT: vmovd %xmm0, %eax
1329 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1331 %1 = call i16 @llvm.vector.reduce.umin.v2i16(<2 x i16> %a0)
1335 define i16 @test_v4i16(<4 x i16> %a0) {
1336 ; SSE2-LABEL: test_v4i16:
1338 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1339 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1340 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1341 ; SSE2-NEXT: psubw %xmm2, %xmm0
1342 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1343 ; SSE2-NEXT: psrld $16, %xmm1
1344 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1345 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1346 ; SSE2-NEXT: psubw %xmm2, %xmm0
1347 ; SSE2-NEXT: movd %xmm0, %eax
1348 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1351 ; SSE4-LABEL: test_v4i16:
1353 ; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1354 ; SSE4-NEXT: pminuw %xmm0, %xmm1
1355 ; SSE4-NEXT: movdqa %xmm1, %xmm0
1356 ; SSE4-NEXT: psrld $16, %xmm0
1357 ; SSE4-NEXT: pminuw %xmm1, %xmm0
1358 ; SSE4-NEXT: movd %xmm0, %eax
1359 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1362 ; AVX-LABEL: test_v4i16:
1364 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1365 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1366 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1367 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1368 ; AVX-NEXT: vmovd %xmm0, %eax
1369 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1372 ; AVX512-LABEL: test_v4i16:
1374 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1375 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1376 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1377 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1378 ; AVX512-NEXT: vmovd %xmm0, %eax
1379 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1381 %1 = call i16 @llvm.vector.reduce.umin.v4i16(<4 x i16> %a0)
1385 define i16 @test_v8i16(<8 x i16> %a0) {
1386 ; SSE2-LABEL: test_v8i16:
1388 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1389 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1390 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1391 ; SSE2-NEXT: psubw %xmm2, %xmm0
1392 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1393 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1394 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1395 ; SSE2-NEXT: psubw %xmm2, %xmm0
1396 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1397 ; SSE2-NEXT: psrld $16, %xmm1
1398 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1399 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1400 ; SSE2-NEXT: psubw %xmm2, %xmm0
1401 ; SSE2-NEXT: movd %xmm0, %eax
1402 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1405 ; SSE4-LABEL: test_v8i16:
1407 ; SSE4-NEXT: phminposuw %xmm0, %xmm0
1408 ; SSE4-NEXT: movd %xmm0, %eax
1409 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1412 ; AVX-LABEL: test_v8i16:
1414 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1415 ; AVX-NEXT: vmovd %xmm0, %eax
1416 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1419 ; AVX512-LABEL: test_v8i16:
1421 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1422 ; AVX512-NEXT: vmovd %xmm0, %eax
1423 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1425 %1 = call i16 @llvm.vector.reduce.umin.v8i16(<8 x i16> %a0)
1429 define i16 @test_v16i16(<16 x i16> %a0) {
1430 ; SSE2-LABEL: test_v16i16:
1432 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1433 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1434 ; SSE2-NEXT: psubw %xmm2, %xmm0
1435 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1436 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1437 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1438 ; SSE2-NEXT: psubw %xmm2, %xmm0
1439 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1440 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1441 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1442 ; SSE2-NEXT: psubw %xmm2, %xmm0
1443 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1444 ; SSE2-NEXT: psrld $16, %xmm1
1445 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1446 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1447 ; SSE2-NEXT: psubw %xmm2, %xmm0
1448 ; SSE2-NEXT: movd %xmm0, %eax
1449 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1452 ; SSE4-LABEL: test_v16i16:
1454 ; SSE4-NEXT: pminuw %xmm1, %xmm0
1455 ; SSE4-NEXT: phminposuw %xmm0, %xmm0
1456 ; SSE4-NEXT: movd %xmm0, %eax
1457 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1460 ; AVX1-LABEL: test_v16i16:
1462 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1463 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1464 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1465 ; AVX1-NEXT: vmovd %xmm0, %eax
1466 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1467 ; AVX1-NEXT: vzeroupper
1470 ; AVX2-LABEL: test_v16i16:
1472 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1473 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1474 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1475 ; AVX2-NEXT: vmovd %xmm0, %eax
1476 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1477 ; AVX2-NEXT: vzeroupper
1480 ; AVX512-LABEL: test_v16i16:
1482 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1483 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1484 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1485 ; AVX512-NEXT: vmovd %xmm0, %eax
1486 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1487 ; AVX512-NEXT: vzeroupper
1489 %1 = call i16 @llvm.vector.reduce.umin.v16i16(<16 x i16> %a0)
1493 define i16 @test_v32i16(<32 x i16> %a0) {
1494 ; SSE2-LABEL: test_v32i16:
1496 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1497 ; SSE2-NEXT: psubusw %xmm3, %xmm4
1498 ; SSE2-NEXT: psubw %xmm4, %xmm1
1499 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1500 ; SSE2-NEXT: psubusw %xmm2, %xmm3
1501 ; SSE2-NEXT: psubw %xmm3, %xmm0
1502 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1503 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1504 ; SSE2-NEXT: psubw %xmm2, %xmm0
1505 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1506 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1507 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1508 ; SSE2-NEXT: psubw %xmm2, %xmm0
1509 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1510 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1511 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1512 ; SSE2-NEXT: psubw %xmm2, %xmm0
1513 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1514 ; SSE2-NEXT: psrld $16, %xmm1
1515 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1516 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1517 ; SSE2-NEXT: psubw %xmm2, %xmm0
1518 ; SSE2-NEXT: movd %xmm0, %eax
1519 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1522 ; SSE4-LABEL: test_v32i16:
1524 ; SSE4-NEXT: pminuw %xmm3, %xmm1
1525 ; SSE4-NEXT: pminuw %xmm2, %xmm0
1526 ; SSE4-NEXT: pminuw %xmm1, %xmm0
1527 ; SSE4-NEXT: phminposuw %xmm0, %xmm0
1528 ; SSE4-NEXT: movd %xmm0, %eax
1529 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1532 ; AVX1-LABEL: test_v32i16:
1534 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1535 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1536 ; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm2
1537 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1538 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
1539 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1540 ; AVX1-NEXT: vmovd %xmm0, %eax
1541 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1542 ; AVX1-NEXT: vzeroupper
1545 ; AVX2-LABEL: test_v32i16:
1547 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1548 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1549 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1550 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1551 ; AVX2-NEXT: vmovd %xmm0, %eax
1552 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1553 ; AVX2-NEXT: vzeroupper
1556 ; AVX512-LABEL: test_v32i16:
1558 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1559 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1560 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1561 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1562 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1563 ; AVX512-NEXT: vmovd %xmm0, %eax
1564 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1565 ; AVX512-NEXT: vzeroupper
1567 %1 = call i16 @llvm.vector.reduce.umin.v32i16(<32 x i16> %a0)
1571 define i16 @test_v64i16(<64 x i16> %a0) {
1572 ; SSE2-LABEL: test_v64i16:
1574 ; SSE2-NEXT: movdqa %xmm2, %xmm8
1575 ; SSE2-NEXT: psubusw %xmm6, %xmm8
1576 ; SSE2-NEXT: psubw %xmm8, %xmm2
1577 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1578 ; SSE2-NEXT: psubusw %xmm4, %xmm6
1579 ; SSE2-NEXT: psubw %xmm6, %xmm0
1580 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1581 ; SSE2-NEXT: psubusw %xmm7, %xmm4
1582 ; SSE2-NEXT: psubw %xmm4, %xmm3
1583 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1584 ; SSE2-NEXT: psubusw %xmm5, %xmm4
1585 ; SSE2-NEXT: psubw %xmm4, %xmm1
1586 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1587 ; SSE2-NEXT: psubusw %xmm3, %xmm4
1588 ; SSE2-NEXT: psubw %xmm4, %xmm1
1589 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1590 ; SSE2-NEXT: psubusw %xmm2, %xmm3
1591 ; SSE2-NEXT: psubw %xmm3, %xmm0
1592 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1593 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1594 ; SSE2-NEXT: psubw %xmm2, %xmm0
1595 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1596 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1597 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1598 ; SSE2-NEXT: psubw %xmm2, %xmm0
1599 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1600 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1601 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1602 ; SSE2-NEXT: psubw %xmm2, %xmm0
1603 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1604 ; SSE2-NEXT: psrld $16, %xmm1
1605 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1606 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1607 ; SSE2-NEXT: psubw %xmm2, %xmm0
1608 ; SSE2-NEXT: movd %xmm0, %eax
1609 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1612 ; SSE4-LABEL: test_v64i16:
1614 ; SSE4-NEXT: pminuw %xmm7, %xmm3
1615 ; SSE4-NEXT: pminuw %xmm5, %xmm1
1616 ; SSE4-NEXT: pminuw %xmm3, %xmm1
1617 ; SSE4-NEXT: pminuw %xmm6, %xmm2
1618 ; SSE4-NEXT: pminuw %xmm4, %xmm0
1619 ; SSE4-NEXT: pminuw %xmm2, %xmm0
1620 ; SSE4-NEXT: pminuw %xmm1, %xmm0
1621 ; SSE4-NEXT: phminposuw %xmm0, %xmm0
1622 ; SSE4-NEXT: movd %xmm0, %eax
1623 ; SSE4-NEXT: # kill: def $ax killed $ax killed $eax
1626 ; AVX1-LABEL: test_v64i16:
1628 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1629 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1630 ; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4
1631 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1632 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
1633 ; AVX1-NEXT: vpminuw %xmm5, %xmm6, %xmm5
1634 ; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4
1635 ; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1
1636 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
1637 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1638 ; AVX1-NEXT: vpminuw %xmm4, %xmm0, %xmm0
1639 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1640 ; AVX1-NEXT: vmovd %xmm0, %eax
1641 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1642 ; AVX1-NEXT: vzeroupper
1645 ; AVX2-LABEL: test_v64i16:
1647 ; AVX2-NEXT: vpminuw %ymm3, %ymm1, %ymm1
1648 ; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0
1649 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1650 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1651 ; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1652 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1653 ; AVX2-NEXT: vmovd %xmm0, %eax
1654 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1655 ; AVX2-NEXT: vzeroupper
1658 ; AVX512-LABEL: test_v64i16:
1660 ; AVX512-NEXT: vpminuw %zmm1, %zmm0, %zmm0
1661 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1662 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1663 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1664 ; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1665 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1666 ; AVX512-NEXT: vmovd %xmm0, %eax
1667 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1668 ; AVX512-NEXT: vzeroupper
1670 %1 = call i16 @llvm.vector.reduce.umin.v64i16(<64 x i16> %a0)
1678 define i8 @test_v2i8(<2 x i8> %a0) {
1679 ; SSE-LABEL: test_v2i8:
1681 ; SSE-NEXT: movdqa %xmm0, %xmm1
1682 ; SSE-NEXT: psrlw $8, %xmm1
1683 ; SSE-NEXT: pminub %xmm0, %xmm1
1684 ; SSE-NEXT: movd %xmm1, %eax
1685 ; SSE-NEXT: # kill: def $al killed $al killed $eax
1688 ; AVX-LABEL: test_v2i8:
1690 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1691 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1692 ; AVX-NEXT: vmovd %xmm0, %eax
1693 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1696 ; AVX512-LABEL: test_v2i8:
1698 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1699 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1700 ; AVX512-NEXT: vmovd %xmm0, %eax
1701 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1703 %1 = call i8 @llvm.vector.reduce.umin.v2i8(<2 x i8> %a0)
1707 define i8 @test_v4i8(<4 x i8> %a0) {
1708 ; SSE-LABEL: test_v4i8:
1710 ; SSE-NEXT: movdqa %xmm0, %xmm1
1711 ; SSE-NEXT: psrld $16, %xmm1
1712 ; SSE-NEXT: pminub %xmm0, %xmm1
1713 ; SSE-NEXT: movdqa %xmm1, %xmm0
1714 ; SSE-NEXT: psrlw $8, %xmm0
1715 ; SSE-NEXT: pminub %xmm1, %xmm0
1716 ; SSE-NEXT: movd %xmm0, %eax
1717 ; SSE-NEXT: # kill: def $al killed $al killed $eax
1720 ; AVX-LABEL: test_v4i8:
1722 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1723 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1724 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1725 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1726 ; AVX-NEXT: vmovd %xmm0, %eax
1727 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1730 ; AVX512-LABEL: test_v4i8:
1732 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1733 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1734 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1735 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1736 ; AVX512-NEXT: vmovd %xmm0, %eax
1737 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1739 %1 = call i8 @llvm.vector.reduce.umin.v4i8(<4 x i8> %a0)
1743 define i8 @test_v8i8(<8 x i8> %a0) {
1744 ; SSE-LABEL: test_v8i8:
1746 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1747 ; SSE-NEXT: pminub %xmm0, %xmm1
1748 ; SSE-NEXT: movdqa %xmm1, %xmm0
1749 ; SSE-NEXT: psrld $16, %xmm0
1750 ; SSE-NEXT: pminub %xmm1, %xmm0
1751 ; SSE-NEXT: movdqa %xmm0, %xmm1
1752 ; SSE-NEXT: psrlw $8, %xmm1
1753 ; SSE-NEXT: pminub %xmm0, %xmm1
1754 ; SSE-NEXT: movd %xmm1, %eax
1755 ; SSE-NEXT: # kill: def $al killed $al killed $eax
1758 ; AVX-LABEL: test_v8i8:
1760 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1761 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1762 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1763 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1764 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1765 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1766 ; AVX-NEXT: vmovd %xmm0, %eax
1767 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1770 ; AVX512-LABEL: test_v8i8:
1772 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1773 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1774 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1775 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1776 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1777 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1778 ; AVX512-NEXT: vmovd %xmm0, %eax
1779 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1781 %1 = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> %a0)
1785 define i8 @test_v16i8(<16 x i8> %a0) {
1786 ; SSE2-LABEL: test_v16i8:
1788 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1789 ; SSE2-NEXT: pminub %xmm0, %xmm1
1790 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1791 ; SSE2-NEXT: pminub %xmm1, %xmm0
1792 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1793 ; SSE2-NEXT: psrld $16, %xmm1
1794 ; SSE2-NEXT: pminub %xmm0, %xmm1
1795 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1796 ; SSE2-NEXT: psrlw $8, %xmm0
1797 ; SSE2-NEXT: pminub %xmm1, %xmm0
1798 ; SSE2-NEXT: movd %xmm0, %eax
1799 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1802 ; SSE4-LABEL: test_v16i8:
1804 ; SSE4-NEXT: movdqa %xmm0, %xmm1
1805 ; SSE4-NEXT: psrlw $8, %xmm1
1806 ; SSE4-NEXT: pminub %xmm0, %xmm1
1807 ; SSE4-NEXT: phminposuw %xmm1, %xmm0
1808 ; SSE4-NEXT: movd %xmm0, %eax
1809 ; SSE4-NEXT: # kill: def $al killed $al killed $eax
1812 ; AVX-LABEL: test_v16i8:
1814 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1815 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1816 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1817 ; AVX-NEXT: vmovd %xmm0, %eax
1818 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1821 ; AVX512-LABEL: test_v16i8:
1823 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1824 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1825 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1826 ; AVX512-NEXT: vmovd %xmm0, %eax
1827 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1829 %1 = call i8 @llvm.vector.reduce.umin.v16i8(<16 x i8> %a0)
1833 define i8 @test_v32i8(<32 x i8> %a0) {
1834 ; SSE2-LABEL: test_v32i8:
1836 ; SSE2-NEXT: pminub %xmm1, %xmm0
1837 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1838 ; SSE2-NEXT: pminub %xmm0, %xmm1
1839 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1840 ; SSE2-NEXT: pminub %xmm1, %xmm0
1841 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1842 ; SSE2-NEXT: psrld $16, %xmm1
1843 ; SSE2-NEXT: pminub %xmm0, %xmm1
1844 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1845 ; SSE2-NEXT: psrlw $8, %xmm0
1846 ; SSE2-NEXT: pminub %xmm1, %xmm0
1847 ; SSE2-NEXT: movd %xmm0, %eax
1848 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1851 ; SSE4-LABEL: test_v32i8:
1853 ; SSE4-NEXT: pminub %xmm1, %xmm0
1854 ; SSE4-NEXT: movdqa %xmm0, %xmm1
1855 ; SSE4-NEXT: psrlw $8, %xmm1
1856 ; SSE4-NEXT: pminub %xmm0, %xmm1
1857 ; SSE4-NEXT: phminposuw %xmm1, %xmm0
1858 ; SSE4-NEXT: movd %xmm0, %eax
1859 ; SSE4-NEXT: # kill: def $al killed $al killed $eax
1862 ; AVX1-LABEL: test_v32i8:
1864 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1865 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1866 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1867 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1868 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1869 ; AVX1-NEXT: vmovd %xmm0, %eax
1870 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1871 ; AVX1-NEXT: vzeroupper
1874 ; AVX2-LABEL: test_v32i8:
1876 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1877 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1878 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1879 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1880 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1881 ; AVX2-NEXT: vmovd %xmm0, %eax
1882 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1883 ; AVX2-NEXT: vzeroupper
1886 ; AVX512-LABEL: test_v32i8:
1888 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1889 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1890 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1891 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1892 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1893 ; AVX512-NEXT: vmovd %xmm0, %eax
1894 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1895 ; AVX512-NEXT: vzeroupper
1897 %1 = call i8 @llvm.vector.reduce.umin.v32i8(<32 x i8> %a0)
1901 define i8 @test_v64i8(<64 x i8> %a0) {
1902 ; SSE2-LABEL: test_v64i8:
1904 ; SSE2-NEXT: pminub %xmm3, %xmm1
1905 ; SSE2-NEXT: pminub %xmm2, %xmm0
1906 ; SSE2-NEXT: pminub %xmm1, %xmm0
1907 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1908 ; SSE2-NEXT: pminub %xmm0, %xmm1
1909 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1910 ; SSE2-NEXT: pminub %xmm1, %xmm0
1911 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1912 ; SSE2-NEXT: psrld $16, %xmm1
1913 ; SSE2-NEXT: pminub %xmm0, %xmm1
1914 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1915 ; SSE2-NEXT: psrlw $8, %xmm0
1916 ; SSE2-NEXT: pminub %xmm1, %xmm0
1917 ; SSE2-NEXT: movd %xmm0, %eax
1918 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1921 ; SSE4-LABEL: test_v64i8:
1923 ; SSE4-NEXT: pminub %xmm3, %xmm1
1924 ; SSE4-NEXT: pminub %xmm2, %xmm0
1925 ; SSE4-NEXT: pminub %xmm1, %xmm0
1926 ; SSE4-NEXT: movdqa %xmm0, %xmm1
1927 ; SSE4-NEXT: psrlw $8, %xmm1
1928 ; SSE4-NEXT: pminub %xmm0, %xmm1
1929 ; SSE4-NEXT: phminposuw %xmm1, %xmm0
1930 ; SSE4-NEXT: movd %xmm0, %eax
1931 ; SSE4-NEXT: # kill: def $al killed $al killed $eax
1934 ; AVX1-LABEL: test_v64i8:
1936 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1937 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1938 ; AVX1-NEXT: vpminub %xmm2, %xmm3, %xmm2
1939 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1940 ; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0
1941 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1942 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1943 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1944 ; AVX1-NEXT: vmovd %xmm0, %eax
1945 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1946 ; AVX1-NEXT: vzeroupper
1949 ; AVX2-LABEL: test_v64i8:
1951 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
1952 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1953 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1954 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1955 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1956 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1957 ; AVX2-NEXT: vmovd %xmm0, %eax
1958 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1959 ; AVX2-NEXT: vzeroupper
1962 ; AVX512-LABEL: test_v64i8:
1964 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1965 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
1966 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1967 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1968 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1969 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1970 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1971 ; AVX512-NEXT: vmovd %xmm0, %eax
1972 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1973 ; AVX512-NEXT: vzeroupper
1975 %1 = call i8 @llvm.vector.reduce.umin.v64i8(<64 x i8> %a0)
1979 define i8 @test_v128i8(<128 x i8> %a0) {
1980 ; SSE2-LABEL: test_v128i8:
1982 ; SSE2-NEXT: pminub %xmm6, %xmm2
1983 ; SSE2-NEXT: pminub %xmm4, %xmm0
1984 ; SSE2-NEXT: pminub %xmm2, %xmm0
1985 ; SSE2-NEXT: pminub %xmm7, %xmm3
1986 ; SSE2-NEXT: pminub %xmm5, %xmm1
1987 ; SSE2-NEXT: pminub %xmm3, %xmm1
1988 ; SSE2-NEXT: pminub %xmm0, %xmm1
1989 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1990 ; SSE2-NEXT: pminub %xmm1, %xmm0
1991 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1992 ; SSE2-NEXT: pminub %xmm0, %xmm1
1993 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1994 ; SSE2-NEXT: psrld $16, %xmm0
1995 ; SSE2-NEXT: pminub %xmm1, %xmm0
1996 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1997 ; SSE2-NEXT: psrlw $8, %xmm1
1998 ; SSE2-NEXT: pminub %xmm0, %xmm1
1999 ; SSE2-NEXT: movd %xmm1, %eax
2000 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
2003 ; SSE4-LABEL: test_v128i8:
2005 ; SSE4-NEXT: pminub %xmm7, %xmm3
2006 ; SSE4-NEXT: pminub %xmm5, %xmm1
2007 ; SSE4-NEXT: pminub %xmm3, %xmm1
2008 ; SSE4-NEXT: pminub %xmm6, %xmm2
2009 ; SSE4-NEXT: pminub %xmm4, %xmm0
2010 ; SSE4-NEXT: pminub %xmm2, %xmm0
2011 ; SSE4-NEXT: pminub %xmm1, %xmm0
2012 ; SSE4-NEXT: movdqa %xmm0, %xmm1
2013 ; SSE4-NEXT: psrlw $8, %xmm1
2014 ; SSE4-NEXT: pminub %xmm0, %xmm1
2015 ; SSE4-NEXT: phminposuw %xmm1, %xmm0
2016 ; SSE4-NEXT: movd %xmm0, %eax
2017 ; SSE4-NEXT: # kill: def $al killed $al killed $eax
2020 ; AVX1-LABEL: test_v128i8:
2022 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
2023 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
2024 ; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4
2025 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
2026 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
2027 ; AVX1-NEXT: vpminub %xmm5, %xmm6, %xmm5
2028 ; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4
2029 ; AVX1-NEXT: vpminub %xmm3, %xmm1, %xmm1
2030 ; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0
2031 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
2032 ; AVX1-NEXT: vpminub %xmm4, %xmm0, %xmm0
2033 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
2034 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
2035 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
2036 ; AVX1-NEXT: vmovd %xmm0, %eax
2037 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
2038 ; AVX1-NEXT: vzeroupper
2041 ; AVX2-LABEL: test_v128i8:
2043 ; AVX2-NEXT: vpminub %ymm3, %ymm1, %ymm1
2044 ; AVX2-NEXT: vpminub %ymm2, %ymm0, %ymm0
2045 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
2046 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2047 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
2048 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
2049 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
2050 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
2051 ; AVX2-NEXT: vmovd %xmm0, %eax
2052 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
2053 ; AVX2-NEXT: vzeroupper
2056 ; AVX512-LABEL: test_v128i8:
2058 ; AVX512-NEXT: vpminub %zmm1, %zmm0, %zmm0
2059 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
2060 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
2061 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
2062 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
2063 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
2064 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
2065 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
2066 ; AVX512-NEXT: vmovd %xmm0, %eax
2067 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
2068 ; AVX512-NEXT: vzeroupper
2070 %1 = call i8 @llvm.vector.reduce.umin.v128i8(<128 x i8> %a0)
2074 declare i64 @llvm.vector.reduce.umin.v2i64(<2 x i64>)
2075 declare i64 @llvm.vector.reduce.umin.v4i64(<4 x i64>)
2076 declare i64 @llvm.vector.reduce.umin.v8i64(<8 x i64>)
2077 declare i64 @llvm.vector.reduce.umin.v16i64(<16 x i64>)
2079 declare i32 @llvm.vector.reduce.umin.v2i32(<2 x i32>)
2080 declare i32 @llvm.vector.reduce.umin.v4i32(<4 x i32>)
2081 declare i32 @llvm.vector.reduce.umin.v8i32(<8 x i32>)
2082 declare i32 @llvm.vector.reduce.umin.v16i32(<16 x i32>)
2083 declare i32 @llvm.vector.reduce.umin.v32i32(<32 x i32>)
2085 declare i16 @llvm.vector.reduce.umin.v2i16(<2 x i16>)
2086 declare i16 @llvm.vector.reduce.umin.v4i16(<4 x i16>)
2087 declare i16 @llvm.vector.reduce.umin.v8i16(<8 x i16>)
2088 declare i16 @llvm.vector.reduce.umin.v16i16(<16 x i16>)
2089 declare i16 @llvm.vector.reduce.umin.v32i16(<32 x i16>)
2090 declare i16 @llvm.vector.reduce.umin.v64i16(<64 x i16>)
2092 declare i8 @llvm.vector.reduce.umin.v2i8(<2 x i8>)
2093 declare i8 @llvm.vector.reduce.umin.v4i8(<4 x i8>)
2094 declare i8 @llvm.vector.reduce.umin.v8i8(<8 x i8>)
2095 declare i8 @llvm.vector.reduce.umin.v16i8(<16 x i8>)
2096 declare i8 @llvm.vector.reduce.umin.v32i8(<32 x i8>)
2097 declare i8 @llvm.vector.reduce.umin.v64i8(<64 x i8>)
2098 declare i8 @llvm.vector.reduce.umin.v128i8(<128 x i8>)