[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-umax.ll
blob4799b8e7e5857b49ac69583ac5cb8ab3825dac36
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
11 ; vXi64
14 define i64 @test_v2i64(<2 x i64> %a0) {
15 ; SSE2-LABEL: test_v2i64:
16 ; SSE2:       # %bb.0:
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 %xmm3, %xmm4
23 ; SSE2-NEXT:    pcmpgtd %xmm2, %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
34 ; SSE2-NEXT:    retq
36 ; SSE41-LABEL: test_v2i64:
37 ; SSE41:       # %bb.0:
38 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
39 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
40 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
41 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
42 ; SSE41-NEXT:    pxor %xmm0, %xmm3
43 ; SSE41-NEXT:    pxor %xmm2, %xmm0
44 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
45 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
46 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
47 ; SSE41-NEXT:    pmovsxdq %xmm3, %xmm0
48 ; SSE41-NEXT:    pand %xmm4, %xmm0
49 ; SSE41-NEXT:    por %xmm3, %xmm0
50 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
51 ; SSE41-NEXT:    movq %xmm2, %rax
52 ; SSE41-NEXT:    retq
54 ; SSE42-LABEL: test_v2i64:
55 ; SSE42:       # %bb.0:
56 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
57 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
58 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
59 ; SSE42-NEXT:    pxor %xmm3, %xmm0
60 ; SSE42-NEXT:    pxor %xmm2, %xmm3
61 ; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
62 ; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
63 ; SSE42-NEXT:    movq %xmm2, %rax
64 ; SSE42-NEXT:    retq
66 ; AVX1-LABEL: test_v2i64:
67 ; AVX1:       # %bb.0:
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 %xmm2, %xmm3, %xmm2
74 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
75 ; AVX1-NEXT:    vmovq %xmm0, %rax
76 ; AVX1-NEXT:    retq
78 ; AVX2-LABEL: test_v2i64:
79 ; AVX2:       # %bb.0:
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 %xmm2, %xmm3, %xmm2
85 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
86 ; AVX2-NEXT:    vmovq %xmm0, %rax
87 ; AVX2-NEXT:    retq
89 ; AVX512BW-LABEL: test_v2i64:
90 ; AVX512BW:       # %bb.0:
91 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
92 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
93 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
94 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
95 ; AVX512BW-NEXT:    vzeroupper
96 ; AVX512BW-NEXT:    retq
98 ; AVX512VL-LABEL: test_v2i64:
99 ; AVX512VL:       # %bb.0:
100 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
101 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
102 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
103 ; AVX512VL-NEXT:    retq
104   %1 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %a0)
105   ret i64 %1
108 define i64 @test_v4i64(<4 x i64> %a0) {
109 ; SSE2-LABEL: test_v4i64:
110 ; SSE2:       # %bb.0:
111 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
112 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
113 ; SSE2-NEXT:    pxor %xmm2, %xmm3
114 ; SSE2-NEXT:    movdqa %xmm0, %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 %xmm1, %xmm3
132 ; SSE2-NEXT:    pcmpgtd %xmm2, %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
143 ; SSE2-NEXT:    retq
145 ; SSE41-LABEL: test_v4i64:
146 ; SSE41:       # %bb.0:
147 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
148 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
149 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
150 ; SSE41-NEXT:    pxor %xmm3, %xmm0
151 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
152 ; SSE41-NEXT:    pxor %xmm3, %xmm4
153 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
154 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
155 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
156 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
157 ; SSE41-NEXT:    pand %xmm5, %xmm0
158 ; SSE41-NEXT:    por %xmm4, %xmm0
159 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
160 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
161 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
162 ; SSE41-NEXT:    pxor %xmm3, %xmm4
163 ; SSE41-NEXT:    pxor %xmm2, %xmm3
164 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
165 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
166 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
167 ; SSE41-NEXT:    pmovsxdq %xmm4, %xmm0
168 ; SSE41-NEXT:    pand %xmm5, %xmm0
169 ; SSE41-NEXT:    por %xmm4, %xmm0
170 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
171 ; SSE41-NEXT:    movq %xmm2, %rax
172 ; SSE41-NEXT:    retq
174 ; SSE42-LABEL: test_v4i64:
175 ; SSE42:       # %bb.0:
176 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
177 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
178 ; SSE42-NEXT:    movdqa %xmm1, %xmm4
179 ; SSE42-NEXT:    pxor %xmm3, %xmm4
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 %xmm3, %xmm0
188 ; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
189 ; SSE42-NEXT:    movq %xmm2, %rax
190 ; SSE42-NEXT:    retq
192 ; AVX1-LABEL: test_v4i64:
193 ; AVX1:       # %bb.0:
194 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
195 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
196 ; AVX1-NEXT:    # xmm2 = mem[0,0]
197 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
198 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
199 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
200 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
201 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
202 ; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
203 ; AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
204 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
205 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
206 ; AVX1-NEXT:    vmovq %xmm0, %rax
207 ; AVX1-NEXT:    vzeroupper
208 ; AVX1-NEXT:    retq
210 ; AVX2-LABEL: test_v4i64:
211 ; AVX2:       # %bb.0:
212 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
213 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
214 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
215 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm4
216 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
217 ; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
218 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
219 ; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
220 ; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
221 ; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
222 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
223 ; AVX2-NEXT:    vmovq %xmm0, %rax
224 ; AVX2-NEXT:    vzeroupper
225 ; AVX2-NEXT:    retq
227 ; AVX512BW-LABEL: test_v4i64:
228 ; AVX512BW:       # %bb.0:
229 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
230 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
231 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
232 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
233 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
234 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
235 ; AVX512BW-NEXT:    vzeroupper
236 ; AVX512BW-NEXT:    retq
238 ; AVX512VL-LABEL: test_v4i64:
239 ; AVX512VL:       # %bb.0:
240 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
241 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
242 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
243 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
244 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
245 ; AVX512VL-NEXT:    vzeroupper
246 ; AVX512VL-NEXT:    retq
247   %1 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> %a0)
248   ret i64 %1
251 define i64 @test_v8i64(<8 x i64> %a0) {
252 ; SSE2-LABEL: test_v8i64:
253 ; SSE2:       # %bb.0:
254 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
255 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
256 ; SSE2-NEXT:    pxor %xmm4, %xmm5
257 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
258 ; SSE2-NEXT:    pxor %xmm4, %xmm6
259 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
260 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
261 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
262 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
263 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
264 ; SSE2-NEXT:    pand %xmm8, %xmm6
265 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
266 ; SSE2-NEXT:    por %xmm6, %xmm5
267 ; SSE2-NEXT:    pand %xmm5, %xmm0
268 ; SSE2-NEXT:    pandn %xmm2, %xmm5
269 ; SSE2-NEXT:    por %xmm0, %xmm5
270 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
271 ; SSE2-NEXT:    pxor %xmm4, %xmm0
272 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
273 ; SSE2-NEXT:    pxor %xmm4, %xmm2
274 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
275 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
276 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
277 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
278 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
279 ; SSE2-NEXT:    pand %xmm7, %xmm0
280 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
281 ; SSE2-NEXT:    por %xmm0, %xmm2
282 ; SSE2-NEXT:    pand %xmm2, %xmm1
283 ; SSE2-NEXT:    pandn %xmm3, %xmm2
284 ; SSE2-NEXT:    por %xmm1, %xmm2
285 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
286 ; SSE2-NEXT:    pxor %xmm4, %xmm0
287 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
288 ; SSE2-NEXT:    pxor %xmm4, %xmm1
289 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
290 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
291 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
292 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
293 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
294 ; SSE2-NEXT:    pand %xmm6, %xmm0
295 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
296 ; SSE2-NEXT:    por %xmm0, %xmm1
297 ; SSE2-NEXT:    pand %xmm1, %xmm5
298 ; SSE2-NEXT:    pandn %xmm2, %xmm1
299 ; SSE2-NEXT:    por %xmm5, %xmm1
300 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
301 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
302 ; SSE2-NEXT:    pxor %xmm4, %xmm2
303 ; SSE2-NEXT:    pxor %xmm0, %xmm4
304 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
305 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
306 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
307 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
308 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
309 ; SSE2-NEXT:    pand %xmm5, %xmm2
310 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
311 ; SSE2-NEXT:    por %xmm2, %xmm3
312 ; SSE2-NEXT:    pand %xmm3, %xmm1
313 ; SSE2-NEXT:    pandn %xmm0, %xmm3
314 ; SSE2-NEXT:    por %xmm1, %xmm3
315 ; SSE2-NEXT:    movq %xmm3, %rax
316 ; SSE2-NEXT:    retq
318 ; SSE41-LABEL: test_v8i64:
319 ; SSE41:       # %bb.0:
320 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
321 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
322 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
323 ; SSE41-NEXT:    pxor %xmm5, %xmm0
324 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
325 ; SSE41-NEXT:    pxor %xmm5, %xmm6
326 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
327 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
328 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
329 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
330 ; SSE41-NEXT:    pand %xmm7, %xmm0
331 ; SSE41-NEXT:    por %xmm6, %xmm0
332 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
333 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
334 ; SSE41-NEXT:    pxor %xmm5, %xmm0
335 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
336 ; SSE41-NEXT:    pxor %xmm5, %xmm4
337 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
338 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
339 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
340 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
341 ; SSE41-NEXT:    pand %xmm6, %xmm0
342 ; SSE41-NEXT:    por %xmm4, %xmm0
343 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
344 ; SSE41-NEXT:    movapd %xmm3, %xmm0
345 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
346 ; SSE41-NEXT:    movapd %xmm2, %xmm1
347 ; SSE41-NEXT:    xorpd %xmm5, %xmm1
348 ; SSE41-NEXT:    movapd %xmm1, %xmm4
349 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
350 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
351 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
352 ; SSE41-NEXT:    pand %xmm4, %xmm0
353 ; SSE41-NEXT:    por %xmm1, %xmm0
354 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
355 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
356 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
357 ; SSE41-NEXT:    pxor %xmm5, %xmm2
358 ; SSE41-NEXT:    pxor %xmm1, %xmm5
359 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
360 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
361 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
362 ; SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
363 ; SSE41-NEXT:    pand %xmm4, %xmm0
364 ; SSE41-NEXT:    por %xmm2, %xmm0
365 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
366 ; SSE41-NEXT:    movq %xmm1, %rax
367 ; SSE41-NEXT:    retq
369 ; SSE42-LABEL: test_v8i64:
370 ; SSE42:       # %bb.0:
371 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
372 ; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
373 ; SSE42-NEXT:    movdqa %xmm2, %xmm6
374 ; SSE42-NEXT:    pxor %xmm5, %xmm6
375 ; SSE42-NEXT:    pxor %xmm5, %xmm0
376 ; SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
377 ; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
378 ; SSE42-NEXT:    movdqa %xmm3, %xmm4
379 ; SSE42-NEXT:    pxor %xmm5, %xmm4
380 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
381 ; SSE42-NEXT:    pxor %xmm5, %xmm0
382 ; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
383 ; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
384 ; SSE42-NEXT:    movapd %xmm3, %xmm1
385 ; SSE42-NEXT:    xorpd %xmm5, %xmm1
386 ; SSE42-NEXT:    movapd %xmm2, %xmm0
387 ; SSE42-NEXT:    xorpd %xmm5, %xmm0
388 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
389 ; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
390 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
391 ; SSE42-NEXT:    movdqa %xmm3, %xmm0
392 ; SSE42-NEXT:    pxor %xmm5, %xmm0
393 ; SSE42-NEXT:    pxor %xmm1, %xmm5
394 ; SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
395 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
396 ; SSE42-NEXT:    movq %xmm1, %rax
397 ; SSE42-NEXT:    retq
399 ; AVX1-LABEL: test_v8i64:
400 ; AVX1:       # %bb.0:
401 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
402 ; AVX1-NEXT:    # xmm2 = mem[0,0]
403 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
404 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
405 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
406 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
407 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
408 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
409 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
410 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm5
411 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
412 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
413 ; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
414 ; AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
415 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
416 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
417 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
418 ; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
419 ; AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
420 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
421 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
422 ; AVX1-NEXT:    vmovq %xmm0, %rax
423 ; AVX1-NEXT:    vzeroupper
424 ; AVX1-NEXT:    retq
426 ; AVX2-LABEL: test_v8i64:
427 ; AVX2:       # %bb.0:
428 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
429 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
430 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm4
431 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
432 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
433 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
434 ; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm3
435 ; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm4
436 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
437 ; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
438 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
439 ; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
440 ; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
441 ; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
442 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
443 ; AVX2-NEXT:    vmovq %xmm0, %rax
444 ; AVX2-NEXT:    vzeroupper
445 ; AVX2-NEXT:    retq
447 ; AVX512BW-LABEL: test_v8i64:
448 ; AVX512BW:       # %bb.0:
449 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
450 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
451 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
452 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
453 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
454 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
455 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
456 ; AVX512BW-NEXT:    vzeroupper
457 ; AVX512BW-NEXT:    retq
459 ; AVX512VL-LABEL: test_v8i64:
460 ; AVX512VL:       # %bb.0:
461 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
462 ; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
463 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
464 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
465 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
466 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
467 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
468 ; AVX512VL-NEXT:    vzeroupper
469 ; AVX512VL-NEXT:    retq
470   %1 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %a0)
471   ret i64 %1
474 define i64 @test_v16i64(<16 x i64> %a0) {
475 ; SSE2-LABEL: test_v16i64:
476 ; SSE2:       # %bb.0:
477 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
478 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
479 ; SSE2-NEXT:    pxor %xmm8, %xmm9
480 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
481 ; SSE2-NEXT:    pxor %xmm8, %xmm10
482 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
483 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
485 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
486 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
487 ; SSE2-NEXT:    pand %xmm12, %xmm10
488 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
489 ; SSE2-NEXT:    por %xmm10, %xmm9
490 ; SSE2-NEXT:    pand %xmm9, %xmm1
491 ; SSE2-NEXT:    pandn %xmm5, %xmm9
492 ; SSE2-NEXT:    por %xmm1, %xmm9
493 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
494 ; SSE2-NEXT:    pxor %xmm8, %xmm1
495 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
496 ; SSE2-NEXT:    pxor %xmm8, %xmm5
497 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
498 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
499 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
500 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
501 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
502 ; SSE2-NEXT:    pand %xmm11, %xmm5
503 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
504 ; SSE2-NEXT:    por %xmm5, %xmm1
505 ; SSE2-NEXT:    pand %xmm1, %xmm3
506 ; SSE2-NEXT:    pandn %xmm7, %xmm1
507 ; SSE2-NEXT:    por %xmm3, %xmm1
508 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
509 ; SSE2-NEXT:    pxor %xmm8, %xmm3
510 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
511 ; SSE2-NEXT:    pxor %xmm8, %xmm5
512 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
513 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
514 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
515 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
516 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
517 ; SSE2-NEXT:    pand %xmm10, %xmm5
518 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
519 ; SSE2-NEXT:    por %xmm5, %xmm3
520 ; SSE2-NEXT:    pand %xmm3, %xmm0
521 ; SSE2-NEXT:    pandn %xmm4, %xmm3
522 ; SSE2-NEXT:    por %xmm0, %xmm3
523 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
524 ; SSE2-NEXT:    pxor %xmm8, %xmm0
525 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
526 ; SSE2-NEXT:    pxor %xmm8, %xmm4
527 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
528 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
529 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
530 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
531 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
532 ; SSE2-NEXT:    pand %xmm7, %xmm0
533 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
534 ; SSE2-NEXT:    por %xmm0, %xmm4
535 ; SSE2-NEXT:    pand %xmm4, %xmm2
536 ; SSE2-NEXT:    pandn %xmm6, %xmm4
537 ; SSE2-NEXT:    por %xmm2, %xmm4
538 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
539 ; SSE2-NEXT:    pxor %xmm8, %xmm0
540 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
541 ; SSE2-NEXT:    pxor %xmm8, %xmm2
542 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
543 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
544 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
545 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
546 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
547 ; SSE2-NEXT:    pand %xmm6, %xmm2
548 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
549 ; SSE2-NEXT:    por %xmm2, %xmm0
550 ; SSE2-NEXT:    pand %xmm0, %xmm3
551 ; SSE2-NEXT:    pandn %xmm4, %xmm0
552 ; SSE2-NEXT:    por %xmm3, %xmm0
553 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
554 ; SSE2-NEXT:    pxor %xmm8, %xmm2
555 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
556 ; SSE2-NEXT:    pxor %xmm8, %xmm3
557 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
558 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
559 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
560 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
561 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
562 ; SSE2-NEXT:    pand %xmm5, %xmm2
563 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
564 ; SSE2-NEXT:    por %xmm2, %xmm3
565 ; SSE2-NEXT:    pand %xmm3, %xmm9
566 ; SSE2-NEXT:    pandn %xmm1, %xmm3
567 ; SSE2-NEXT:    por %xmm9, %xmm3
568 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
569 ; SSE2-NEXT:    pxor %xmm8, %xmm1
570 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
571 ; SSE2-NEXT:    pxor %xmm8, %xmm2
572 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
573 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
574 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
575 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
576 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
577 ; SSE2-NEXT:    pand %xmm5, %xmm1
578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
579 ; SSE2-NEXT:    por %xmm1, %xmm2
580 ; SSE2-NEXT:    pand %xmm2, %xmm0
581 ; SSE2-NEXT:    pandn %xmm3, %xmm2
582 ; SSE2-NEXT:    por %xmm0, %xmm2
583 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
584 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
585 ; SSE2-NEXT:    pxor %xmm8, %xmm1
586 ; SSE2-NEXT:    pxor %xmm0, %xmm8
587 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
588 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
589 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
590 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm8
591 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
592 ; SSE2-NEXT:    pand %xmm4, %xmm1
593 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
594 ; SSE2-NEXT:    por %xmm1, %xmm3
595 ; SSE2-NEXT:    pand %xmm3, %xmm2
596 ; SSE2-NEXT:    pandn %xmm0, %xmm3
597 ; SSE2-NEXT:    por %xmm2, %xmm3
598 ; SSE2-NEXT:    movq %xmm3, %rax
599 ; SSE2-NEXT:    retq
601 ; SSE41-LABEL: test_v16i64:
602 ; SSE41:       # %bb.0:
603 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
604 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
605 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
606 ; SSE41-NEXT:    pxor %xmm9, %xmm0
607 ; SSE41-NEXT:    movdqa %xmm1, %xmm10
608 ; SSE41-NEXT:    pxor %xmm9, %xmm10
609 ; SSE41-NEXT:    movdqa %xmm10, %xmm11
610 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm11
611 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
612 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
613 ; SSE41-NEXT:    pand %xmm11, %xmm0
614 ; SSE41-NEXT:    por %xmm10, %xmm0
615 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
616 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
617 ; SSE41-NEXT:    pxor %xmm9, %xmm0
618 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
619 ; SSE41-NEXT:    pxor %xmm9, %xmm1
620 ; SSE41-NEXT:    movdqa %xmm1, %xmm10
621 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
622 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
623 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
624 ; SSE41-NEXT:    pand %xmm10, %xmm0
625 ; SSE41-NEXT:    por %xmm1, %xmm0
626 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
627 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
628 ; SSE41-NEXT:    pxor %xmm9, %xmm0
629 ; SSE41-NEXT:    movdqa %xmm8, %xmm1
630 ; SSE41-NEXT:    pxor %xmm9, %xmm1
631 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
632 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
633 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
634 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
635 ; SSE41-NEXT:    pand %xmm3, %xmm0
636 ; SSE41-NEXT:    por %xmm1, %xmm0
637 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
638 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
639 ; SSE41-NEXT:    pxor %xmm9, %xmm0
640 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
641 ; SSE41-NEXT:    pxor %xmm9, %xmm1
642 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
643 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
644 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
645 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
646 ; SSE41-NEXT:    pand %xmm3, %xmm0
647 ; SSE41-NEXT:    por %xmm1, %xmm0
648 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
649 ; SSE41-NEXT:    movapd %xmm6, %xmm0
650 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
651 ; SSE41-NEXT:    movapd %xmm4, %xmm1
652 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
653 ; SSE41-NEXT:    movapd %xmm1, %xmm2
654 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
655 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
656 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
657 ; SSE41-NEXT:    pand %xmm2, %xmm0
658 ; SSE41-NEXT:    por %xmm1, %xmm0
659 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
660 ; SSE41-NEXT:    movapd %xmm7, %xmm0
661 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
662 ; SSE41-NEXT:    movapd %xmm5, %xmm1
663 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
664 ; SSE41-NEXT:    movapd %xmm1, %xmm2
665 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
666 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
667 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
668 ; SSE41-NEXT:    pand %xmm2, %xmm0
669 ; SSE41-NEXT:    por %xmm1, %xmm0
670 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
671 ; SSE41-NEXT:    movapd %xmm7, %xmm0
672 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
673 ; SSE41-NEXT:    movapd %xmm6, %xmm1
674 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
675 ; SSE41-NEXT:    movapd %xmm1, %xmm2
676 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
677 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
678 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
679 ; SSE41-NEXT:    pand %xmm2, %xmm0
680 ; SSE41-NEXT:    por %xmm1, %xmm0
681 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
682 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
683 ; SSE41-NEXT:    movdqa %xmm7, %xmm2
684 ; SSE41-NEXT:    pxor %xmm9, %xmm2
685 ; SSE41-NEXT:    pxor %xmm1, %xmm9
686 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
687 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm3
688 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
689 ; SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
690 ; SSE41-NEXT:    pand %xmm3, %xmm0
691 ; SSE41-NEXT:    por %xmm2, %xmm0
692 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
693 ; SSE41-NEXT:    movq %xmm1, %rax
694 ; SSE41-NEXT:    retq
696 ; SSE42-LABEL: test_v16i64:
697 ; SSE42:       # %bb.0:
698 ; SSE42-NEXT:    movdqa %xmm0, %xmm8
699 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
700 ; SSE42-NEXT:    movdqa %xmm5, %xmm10
701 ; SSE42-NEXT:    pxor %xmm9, %xmm10
702 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
703 ; SSE42-NEXT:    pxor %xmm9, %xmm0
704 ; SSE42-NEXT:    pcmpgtq %xmm10, %xmm0
705 ; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
706 ; SSE42-NEXT:    movdqa %xmm7, %xmm1
707 ; SSE42-NEXT:    pxor %xmm9, %xmm1
708 ; SSE42-NEXT:    movdqa %xmm3, %xmm0
709 ; SSE42-NEXT:    pxor %xmm9, %xmm0
710 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
711 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
712 ; SSE42-NEXT:    movdqa %xmm4, %xmm1
713 ; SSE42-NEXT:    pxor %xmm9, %xmm1
714 ; SSE42-NEXT:    movdqa %xmm8, %xmm0
715 ; SSE42-NEXT:    pxor %xmm9, %xmm0
716 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
717 ; SSE42-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
718 ; SSE42-NEXT:    movdqa %xmm6, %xmm1
719 ; SSE42-NEXT:    pxor %xmm9, %xmm1
720 ; SSE42-NEXT:    movdqa %xmm2, %xmm0
721 ; SSE42-NEXT:    pxor %xmm9, %xmm0
722 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
723 ; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
724 ; SSE42-NEXT:    movapd %xmm6, %xmm1
725 ; SSE42-NEXT:    xorpd %xmm9, %xmm1
726 ; SSE42-NEXT:    movapd %xmm4, %xmm0
727 ; SSE42-NEXT:    xorpd %xmm9, %xmm0
728 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
729 ; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
730 ; SSE42-NEXT:    movapd %xmm7, %xmm1
731 ; SSE42-NEXT:    xorpd %xmm9, %xmm1
732 ; SSE42-NEXT:    movapd %xmm5, %xmm0
733 ; SSE42-NEXT:    xorpd %xmm9, %xmm0
734 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
735 ; SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
736 ; SSE42-NEXT:    movapd %xmm7, %xmm1
737 ; SSE42-NEXT:    xorpd %xmm9, %xmm1
738 ; SSE42-NEXT:    movapd %xmm6, %xmm0
739 ; SSE42-NEXT:    xorpd %xmm9, %xmm0
740 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
741 ; SSE42-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
742 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
743 ; SSE42-NEXT:    movdqa %xmm7, %xmm0
744 ; SSE42-NEXT:    pxor %xmm9, %xmm0
745 ; SSE42-NEXT:    pxor %xmm1, %xmm9
746 ; SSE42-NEXT:    pcmpgtq %xmm9, %xmm0
747 ; SSE42-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
748 ; SSE42-NEXT:    movq %xmm1, %rax
749 ; SSE42-NEXT:    retq
751 ; AVX1-LABEL: test_v16i64:
752 ; AVX1:       # %bb.0:
753 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
754 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
755 ; AVX1-NEXT:    # xmm4 = mem[0,0]
756 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm6
757 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
758 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
759 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm8, %xmm6
760 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm7, %xmm5, %xmm5
761 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
762 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm7
763 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm8
764 ; AVX1-NEXT:    vpxor %xmm4, %xmm8, %xmm9
765 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm9, %xmm7
766 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm8, %xmm6, %xmm6
767 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm7
768 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm8
769 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm8, %xmm7
770 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm2, %xmm0
771 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm2
772 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
773 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
774 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm3, %xmm1
775 ; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
776 ; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
777 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
778 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
779 ; AVX1-NEXT:    vxorpd %xmm4, %xmm6, %xmm1
780 ; AVX1-NEXT:    vxorpd %xmm4, %xmm5, %xmm2
781 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
782 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm5, %xmm6, %xmm1
783 ; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
784 ; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
785 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
786 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
787 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
788 ; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm2
789 ; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm3
790 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
791 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
792 ; AVX1-NEXT:    vmovq %xmm0, %rax
793 ; AVX1-NEXT:    vzeroupper
794 ; AVX1-NEXT:    retq
796 ; AVX2-LABEL: test_v16i64:
797 ; AVX2:       # %bb.0:
798 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
799 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
800 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
801 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
802 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
803 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
804 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
805 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm5, %ymm2
806 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
807 ; AVX2-NEXT:    vxorpd %ymm4, %ymm1, %ymm2
808 ; AVX2-NEXT:    vxorpd %ymm4, %ymm0, %ymm3
809 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
810 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
811 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
812 ; AVX2-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
813 ; AVX2-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
814 ; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
815 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
816 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
817 ; AVX2-NEXT:    vxorpd %xmm4, %xmm0, %xmm2
818 ; AVX2-NEXT:    vxorpd %xmm4, %xmm1, %xmm3
819 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
820 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
821 ; AVX2-NEXT:    vmovq %xmm0, %rax
822 ; AVX2-NEXT:    vzeroupper
823 ; AVX2-NEXT:    retq
825 ; AVX512BW-LABEL: test_v16i64:
826 ; AVX512BW:       # %bb.0:
827 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
828 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
829 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
830 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
831 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
832 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
833 ; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
834 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
835 ; AVX512BW-NEXT:    vzeroupper
836 ; AVX512BW-NEXT:    retq
838 ; AVX512VL-LABEL: test_v16i64:
839 ; AVX512VL:       # %bb.0:
840 ; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
841 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
842 ; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
843 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
844 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
845 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
846 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
847 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
848 ; AVX512VL-NEXT:    vzeroupper
849 ; AVX512VL-NEXT:    retq
850   %1 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> %a0)
851   ret i64 %1
855 ; vXi32
858 define i32 @test_v2i32(<2 x i32> %a0) {
859 ; SSE2-LABEL: test_v2i32:
860 ; SSE2:       # %bb.0:
861 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
862 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
863 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
864 ; SSE2-NEXT:    pxor %xmm2, %xmm3
865 ; SSE2-NEXT:    pxor %xmm1, %xmm2
866 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
867 ; SSE2-NEXT:    pand %xmm3, %xmm0
868 ; SSE2-NEXT:    pandn %xmm1, %xmm3
869 ; SSE2-NEXT:    por %xmm0, %xmm3
870 ; SSE2-NEXT:    movd %xmm3, %eax
871 ; SSE2-NEXT:    retq
873 ; SSE4-LABEL: test_v2i32:
874 ; SSE4:       # %bb.0:
875 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
876 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
877 ; SSE4-NEXT:    movd %xmm1, %eax
878 ; SSE4-NEXT:    retq
880 ; AVX-LABEL: test_v2i32:
881 ; AVX:       # %bb.0:
882 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
883 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
884 ; AVX-NEXT:    vmovd %xmm0, %eax
885 ; AVX-NEXT:    retq
887 ; AVX512-LABEL: test_v2i32:
888 ; AVX512:       # %bb.0:
889 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
890 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
891 ; AVX512-NEXT:    vmovd %xmm0, %eax
892 ; AVX512-NEXT:    retq
893   %1 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %a0)
894   ret i32 %1
897 define i32 @test_v4i32(<4 x i32> %a0) {
898 ; SSE2-LABEL: test_v4i32:
899 ; SSE2:       # %bb.0:
900 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
901 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
902 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
903 ; SSE2-NEXT:    pxor %xmm2, %xmm3
904 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
905 ; SSE2-NEXT:    pxor %xmm2, %xmm4
906 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
907 ; SSE2-NEXT:    pand %xmm3, %xmm0
908 ; SSE2-NEXT:    pandn %xmm1, %xmm3
909 ; SSE2-NEXT:    por %xmm0, %xmm3
910 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
911 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
912 ; SSE2-NEXT:    pxor %xmm2, %xmm1
913 ; SSE2-NEXT:    pxor %xmm0, %xmm2
914 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
915 ; SSE2-NEXT:    pand %xmm1, %xmm3
916 ; SSE2-NEXT:    pandn %xmm0, %xmm1
917 ; SSE2-NEXT:    por %xmm3, %xmm1
918 ; SSE2-NEXT:    movd %xmm1, %eax
919 ; SSE2-NEXT:    retq
921 ; SSE4-LABEL: test_v4i32:
922 ; SSE4:       # %bb.0:
923 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
924 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
925 ; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
926 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
927 ; SSE4-NEXT:    movd %xmm0, %eax
928 ; SSE4-NEXT:    retq
930 ; AVX-LABEL: test_v4i32:
931 ; AVX:       # %bb.0:
932 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
933 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
934 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
935 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
936 ; AVX-NEXT:    vmovd %xmm0, %eax
937 ; AVX-NEXT:    retq
939 ; AVX512-LABEL: test_v4i32:
940 ; AVX512:       # %bb.0:
941 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
942 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
943 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
944 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
945 ; AVX512-NEXT:    vmovd %xmm0, %eax
946 ; AVX512-NEXT:    retq
947   %1 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %a0)
948   ret i32 %1
951 define i32 @test_v8i32(<8 x i32> %a0) {
952 ; SSE2-LABEL: test_v8i32:
953 ; SSE2:       # %bb.0:
954 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
955 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
956 ; SSE2-NEXT:    pxor %xmm2, %xmm3
957 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
958 ; SSE2-NEXT:    pxor %xmm2, %xmm4
959 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
960 ; SSE2-NEXT:    pand %xmm4, %xmm0
961 ; SSE2-NEXT:    pandn %xmm1, %xmm4
962 ; SSE2-NEXT:    por %xmm0, %xmm4
963 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
964 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
965 ; SSE2-NEXT:    pxor %xmm2, %xmm1
966 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
967 ; SSE2-NEXT:    pxor %xmm2, %xmm3
968 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
969 ; SSE2-NEXT:    pand %xmm1, %xmm4
970 ; SSE2-NEXT:    pandn %xmm0, %xmm1
971 ; SSE2-NEXT:    por %xmm4, %xmm1
972 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
973 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
974 ; SSE2-NEXT:    pxor %xmm2, %xmm3
975 ; SSE2-NEXT:    pxor %xmm0, %xmm2
976 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
977 ; SSE2-NEXT:    pand %xmm3, %xmm1
978 ; SSE2-NEXT:    pandn %xmm0, %xmm3
979 ; SSE2-NEXT:    por %xmm1, %xmm3
980 ; SSE2-NEXT:    movd %xmm3, %eax
981 ; SSE2-NEXT:    retq
983 ; SSE4-LABEL: test_v8i32:
984 ; SSE4:       # %bb.0:
985 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
986 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
987 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
988 ; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
989 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
990 ; SSE4-NEXT:    movd %xmm0, %eax
991 ; SSE4-NEXT:    retq
993 ; AVX1-LABEL: test_v8i32:
994 ; AVX1:       # %bb.0:
995 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
996 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
997 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
998 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
999 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1000 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1001 ; AVX1-NEXT:    vmovd %xmm0, %eax
1002 ; AVX1-NEXT:    vzeroupper
1003 ; AVX1-NEXT:    retq
1005 ; AVX2-LABEL: test_v8i32:
1006 ; AVX2:       # %bb.0:
1007 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1008 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1009 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1010 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1011 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1012 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1013 ; AVX2-NEXT:    vmovd %xmm0, %eax
1014 ; AVX2-NEXT:    vzeroupper
1015 ; AVX2-NEXT:    retq
1017 ; AVX512-LABEL: test_v8i32:
1018 ; AVX512:       # %bb.0:
1019 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1020 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1021 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1022 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1023 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1024 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1025 ; AVX512-NEXT:    vmovd %xmm0, %eax
1026 ; AVX512-NEXT:    vzeroupper
1027 ; AVX512-NEXT:    retq
1028   %1 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> %a0)
1029   ret i32 %1
1032 define i32 @test_v16i32(<16 x i32> %a0) {
1033 ; SSE2-LABEL: test_v16i32:
1034 ; SSE2:       # %bb.0:
1035 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1036 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1037 ; SSE2-NEXT:    pxor %xmm4, %xmm6
1038 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1039 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1040 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1041 ; SSE2-NEXT:    pand %xmm5, %xmm0
1042 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1043 ; SSE2-NEXT:    por %xmm0, %xmm5
1044 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
1045 ; SSE2-NEXT:    pxor %xmm4, %xmm0
1046 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1047 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1048 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1049 ; SSE2-NEXT:    pand %xmm2, %xmm1
1050 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1051 ; SSE2-NEXT:    por %xmm1, %xmm2
1052 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1053 ; SSE2-NEXT:    pxor %xmm4, %xmm0
1054 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1055 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1056 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1057 ; SSE2-NEXT:    pand %xmm1, %xmm5
1058 ; SSE2-NEXT:    pandn %xmm2, %xmm1
1059 ; SSE2-NEXT:    por %xmm5, %xmm1
1060 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1061 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1062 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1063 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1064 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1065 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1066 ; SSE2-NEXT:    pand %xmm2, %xmm1
1067 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1068 ; SSE2-NEXT:    por %xmm1, %xmm2
1069 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
1070 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1071 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1072 ; SSE2-NEXT:    pxor %xmm0, %xmm4
1073 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
1074 ; SSE2-NEXT:    pand %xmm1, %xmm2
1075 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1076 ; SSE2-NEXT:    por %xmm2, %xmm1
1077 ; SSE2-NEXT:    movd %xmm1, %eax
1078 ; SSE2-NEXT:    retq
1080 ; SSE4-LABEL: test_v16i32:
1081 ; SSE4:       # %bb.0:
1082 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1083 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1084 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1085 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1086 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1087 ; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1088 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1089 ; SSE4-NEXT:    movd %xmm0, %eax
1090 ; SSE4-NEXT:    retq
1092 ; AVX1-LABEL: test_v16i32:
1093 ; AVX1:       # %bb.0:
1094 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1095 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1096 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
1097 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1098 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
1099 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1100 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1101 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1102 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1103 ; AVX1-NEXT:    vmovd %xmm0, %eax
1104 ; AVX1-NEXT:    vzeroupper
1105 ; AVX1-NEXT:    retq
1107 ; AVX2-LABEL: test_v16i32:
1108 ; AVX2:       # %bb.0:
1109 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1110 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1111 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1112 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1113 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1114 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1115 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1116 ; AVX2-NEXT:    vmovd %xmm0, %eax
1117 ; AVX2-NEXT:    vzeroupper
1118 ; AVX2-NEXT:    retq
1120 ; AVX512-LABEL: test_v16i32:
1121 ; AVX512:       # %bb.0:
1122 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1123 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1124 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1125 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1126 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1127 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1128 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1129 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1130 ; AVX512-NEXT:    vmovd %xmm0, %eax
1131 ; AVX512-NEXT:    vzeroupper
1132 ; AVX512-NEXT:    retq
1133   %1 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %a0)
1134   ret i32 %1
1137 define i32 @test_v32i32(<32 x i32> %a0) {
1138 ; SSE2-LABEL: test_v32i32:
1139 ; SSE2:       # %bb.0:
1140 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
1141 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
1142 ; SSE2-NEXT:    pxor %xmm8, %xmm10
1143 ; SSE2-NEXT:    movdqa %xmm1, %xmm9
1144 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1145 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
1146 ; SSE2-NEXT:    pand %xmm9, %xmm1
1147 ; SSE2-NEXT:    pandn %xmm5, %xmm9
1148 ; SSE2-NEXT:    por %xmm1, %xmm9
1149 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
1150 ; SSE2-NEXT:    pxor %xmm8, %xmm5
1151 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1152 ; SSE2-NEXT:    pxor %xmm8, %xmm1
1153 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1154 ; SSE2-NEXT:    pand %xmm1, %xmm3
1155 ; SSE2-NEXT:    pandn %xmm7, %xmm1
1156 ; SSE2-NEXT:    por %xmm3, %xmm1
1157 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1158 ; SSE2-NEXT:    pxor %xmm8, %xmm5
1159 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1160 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1161 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
1162 ; SSE2-NEXT:    pand %xmm3, %xmm0
1163 ; SSE2-NEXT:    pandn %xmm4, %xmm3
1164 ; SSE2-NEXT:    por %xmm0, %xmm3
1165 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
1166 ; SSE2-NEXT:    pxor %xmm8, %xmm0
1167 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1168 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1169 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1170 ; SSE2-NEXT:    pand %xmm4, %xmm2
1171 ; SSE2-NEXT:    pandn %xmm6, %xmm4
1172 ; SSE2-NEXT:    por %xmm2, %xmm4
1173 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1174 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1175 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
1176 ; SSE2-NEXT:    pxor %xmm8, %xmm0
1177 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
1178 ; SSE2-NEXT:    pand %xmm0, %xmm3
1179 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1180 ; SSE2-NEXT:    por %xmm3, %xmm0
1181 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1182 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1183 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
1184 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1185 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1186 ; SSE2-NEXT:    pand %xmm3, %xmm9
1187 ; SSE2-NEXT:    pandn %xmm1, %xmm3
1188 ; SSE2-NEXT:    por %xmm9, %xmm3
1189 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1190 ; SSE2-NEXT:    pxor %xmm8, %xmm1
1191 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1192 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1193 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1194 ; SSE2-NEXT:    pand %xmm2, %xmm0
1195 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1196 ; SSE2-NEXT:    por %xmm0, %xmm2
1197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1198 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1199 ; SSE2-NEXT:    pxor %xmm8, %xmm1
1200 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1201 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1202 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1203 ; SSE2-NEXT:    pand %xmm1, %xmm2
1204 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1205 ; SSE2-NEXT:    por %xmm2, %xmm1
1206 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1207 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1208 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1209 ; SSE2-NEXT:    pxor %xmm0, %xmm8
1210 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm2
1211 ; SSE2-NEXT:    pand %xmm2, %xmm1
1212 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1213 ; SSE2-NEXT:    por %xmm1, %xmm2
1214 ; SSE2-NEXT:    movd %xmm2, %eax
1215 ; SSE2-NEXT:    retq
1217 ; SSE4-LABEL: test_v32i32:
1218 ; SSE4:       # %bb.0:
1219 ; SSE4-NEXT:    pmaxud %xmm6, %xmm2
1220 ; SSE4-NEXT:    pmaxud %xmm4, %xmm0
1221 ; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1222 ; SSE4-NEXT:    pmaxud %xmm7, %xmm3
1223 ; SSE4-NEXT:    pmaxud %xmm5, %xmm1
1224 ; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1225 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1226 ; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1227 ; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1228 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1229 ; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1230 ; SSE4-NEXT:    movd %xmm1, %eax
1231 ; SSE4-NEXT:    retq
1233 ; AVX1-LABEL: test_v32i32:
1234 ; AVX1:       # %bb.0:
1235 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm4
1236 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm5
1237 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
1238 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1239 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1240 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
1241 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1242 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1243 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
1244 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1245 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm4, %xmm0
1246 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1247 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1248 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1249 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1250 ; AVX1-NEXT:    vmovd %xmm0, %eax
1251 ; AVX1-NEXT:    vzeroupper
1252 ; AVX1-NEXT:    retq
1254 ; AVX2-LABEL: test_v32i32:
1255 ; AVX2:       # %bb.0:
1256 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
1257 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
1258 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1259 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1260 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1261 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1262 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1263 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1264 ; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1265 ; AVX2-NEXT:    vmovd %xmm0, %eax
1266 ; AVX2-NEXT:    vzeroupper
1267 ; AVX2-NEXT:    retq
1269 ; AVX512-LABEL: test_v32i32:
1270 ; AVX512:       # %bb.0:
1271 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1272 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1273 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1274 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1275 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1276 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1277 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1278 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1279 ; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1280 ; AVX512-NEXT:    vmovd %xmm0, %eax
1281 ; AVX512-NEXT:    vzeroupper
1282 ; AVX512-NEXT:    retq
1283   %1 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> %a0)
1284   ret i32 %1
1288 ; vXi16
1291 define i16 @test_v2i16(<2 x i16> %a0) {
1292 ; SSE2-LABEL: test_v2i16:
1293 ; SSE2:       # %bb.0:
1294 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1295 ; SSE2-NEXT:    psrld $16, %xmm1
1296 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1297 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1298 ; SSE2-NEXT:    movd %xmm1, %eax
1299 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1300 ; SSE2-NEXT:    retq
1302 ; SSE4-LABEL: test_v2i16:
1303 ; SSE4:       # %bb.0:
1304 ; SSE4-NEXT:    movdqa %xmm0, %xmm1
1305 ; SSE4-NEXT:    psrld $16, %xmm1
1306 ; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
1307 ; SSE4-NEXT:    movd %xmm1, %eax
1308 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1309 ; SSE4-NEXT:    retq
1311 ; AVX-LABEL: test_v2i16:
1312 ; AVX:       # %bb.0:
1313 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1314 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1315 ; AVX-NEXT:    vmovd %xmm0, %eax
1316 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1317 ; AVX-NEXT:    retq
1319 ; AVX512-LABEL: test_v2i16:
1320 ; AVX512:       # %bb.0:
1321 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1322 ; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1323 ; AVX512-NEXT:    vmovd %xmm0, %eax
1324 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1325 ; AVX512-NEXT:    retq
1326   %1 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> %a0)
1327   ret i16 %1
1330 define i16 @test_v4i16(<4 x i16> %a0) {
1331 ; SSE2-LABEL: test_v4i16:
1332 ; SSE2:       # %bb.0:
1333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1334 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1335 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1336 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1337 ; SSE2-NEXT:    psrld $16, %xmm0
1338 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1339 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1340 ; SSE2-NEXT:    movd %xmm0, %eax
1341 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1342 ; SSE2-NEXT:    retq
1344 ; SSE4-LABEL: test_v4i16:
1345 ; SSE4:       # %bb.0:
1346 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1347 ; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
1348 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
1349 ; SSE4-NEXT:    psrld $16, %xmm0
1350 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1351 ; SSE4-NEXT:    movd %xmm0, %eax
1352 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1353 ; SSE4-NEXT:    retq
1355 ; AVX-LABEL: test_v4i16:
1356 ; AVX:       # %bb.0:
1357 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1358 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1359 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1360 ; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1361 ; AVX-NEXT:    vmovd %xmm0, %eax
1362 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1363 ; AVX-NEXT:    retq
1365 ; AVX512-LABEL: test_v4i16:
1366 ; AVX512:       # %bb.0:
1367 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1368 ; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1369 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1370 ; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1371 ; AVX512-NEXT:    vmovd %xmm0, %eax
1372 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1373 ; AVX512-NEXT:    retq
1374   %1 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> %a0)
1375   ret i16 %1
1378 define i16 @test_v8i16(<8 x i16> %a0) {
1379 ; SSE2-LABEL: test_v8i16:
1380 ; SSE2:       # %bb.0:
1381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1382 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1383 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1384 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1385 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1386 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1387 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1388 ; SSE2-NEXT:    psrld $16, %xmm1
1389 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1390 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1391 ; SSE2-NEXT:    movd %xmm1, %eax
1392 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1393 ; SSE2-NEXT:    retq
1395 ; SSE4-LABEL: test_v8i16:
1396 ; SSE4:       # %bb.0:
1397 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1398 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1399 ; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1400 ; SSE4-NEXT:    movd %xmm0, %eax
1401 ; SSE4-NEXT:    notl %eax
1402 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1403 ; SSE4-NEXT:    retq
1405 ; AVX-LABEL: test_v8i16:
1406 ; AVX:       # %bb.0:
1407 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1408 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1409 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1410 ; AVX-NEXT:    vmovd %xmm0, %eax
1411 ; AVX-NEXT:    notl %eax
1412 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1413 ; AVX-NEXT:    retq
1415 ; AVX512BW-LABEL: test_v8i16:
1416 ; AVX512BW:       # %bb.0:
1417 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1418 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1419 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1420 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1421 ; AVX512BW-NEXT:    notl %eax
1422 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1423 ; AVX512BW-NEXT:    vzeroupper
1424 ; AVX512BW-NEXT:    retq
1426 ; AVX512VL-LABEL: test_v8i16:
1427 ; AVX512VL:       # %bb.0:
1428 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1429 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1430 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
1431 ; AVX512VL-NEXT:    notl %eax
1432 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1433 ; AVX512VL-NEXT:    retq
1434   %1 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> %a0)
1435   ret i16 %1
1438 define i16 @test_v16i16(<16 x i16> %a0) {
1439 ; SSE2-LABEL: test_v16i16:
1440 ; SSE2:       # %bb.0:
1441 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1442 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1443 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1444 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1445 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1446 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1447 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1448 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1449 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1450 ; SSE2-NEXT:    psrld $16, %xmm0
1451 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1452 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1453 ; SSE2-NEXT:    movd %xmm0, %eax
1454 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1455 ; SSE2-NEXT:    retq
1457 ; SSE4-LABEL: test_v16i16:
1458 ; SSE4:       # %bb.0:
1459 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1460 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1461 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1462 ; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1463 ; SSE4-NEXT:    movd %xmm0, %eax
1464 ; SSE4-NEXT:    notl %eax
1465 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1466 ; SSE4-NEXT:    retq
1468 ; AVX1-LABEL: test_v16i16:
1469 ; AVX1:       # %bb.0:
1470 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1471 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1472 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1473 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1474 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1475 ; AVX1-NEXT:    vmovd %xmm0, %eax
1476 ; AVX1-NEXT:    notl %eax
1477 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1478 ; AVX1-NEXT:    vzeroupper
1479 ; AVX1-NEXT:    retq
1481 ; AVX2-LABEL: test_v16i16:
1482 ; AVX2:       # %bb.0:
1483 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1484 ; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1485 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1486 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1487 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1488 ; AVX2-NEXT:    vmovd %xmm0, %eax
1489 ; AVX2-NEXT:    notl %eax
1490 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1491 ; AVX2-NEXT:    vzeroupper
1492 ; AVX2-NEXT:    retq
1494 ; AVX512BW-LABEL: test_v16i16:
1495 ; AVX512BW:       # %bb.0:
1496 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1497 ; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1498 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1499 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1500 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1501 ; AVX512BW-NEXT:    notl %eax
1502 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1503 ; AVX512BW-NEXT:    vzeroupper
1504 ; AVX512BW-NEXT:    retq
1506 ; AVX512VL-LABEL: test_v16i16:
1507 ; AVX512VL:       # %bb.0:
1508 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1509 ; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1510 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1511 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1512 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
1513 ; AVX512VL-NEXT:    notl %eax
1514 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1515 ; AVX512VL-NEXT:    vzeroupper
1516 ; AVX512VL-NEXT:    retq
1517   %1 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> %a0)
1518   ret i16 %1
1521 define i16 @test_v32i16(<32 x i16> %a0) {
1522 ; SSE2-LABEL: test_v32i16:
1523 ; SSE2:       # %bb.0:
1524 ; SSE2-NEXT:    psubusw %xmm0, %xmm2
1525 ; SSE2-NEXT:    paddw %xmm0, %xmm2
1526 ; SSE2-NEXT:    psubusw %xmm1, %xmm3
1527 ; SSE2-NEXT:    paddw %xmm1, %xmm3
1528 ; SSE2-NEXT:    psubusw %xmm2, %xmm3
1529 ; SSE2-NEXT:    paddw %xmm2, %xmm3
1530 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
1531 ; SSE2-NEXT:    psubusw %xmm3, %xmm0
1532 ; SSE2-NEXT:    paddw %xmm3, %xmm0
1533 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1534 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1535 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1536 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1537 ; SSE2-NEXT:    psrld $16, %xmm0
1538 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1539 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1540 ; SSE2-NEXT:    movd %xmm0, %eax
1541 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1542 ; SSE2-NEXT:    retq
1544 ; SSE4-LABEL: test_v32i16:
1545 ; SSE4:       # %bb.0:
1546 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1547 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1548 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1549 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1550 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1551 ; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1552 ; SSE4-NEXT:    movd %xmm0, %eax
1553 ; SSE4-NEXT:    notl %eax
1554 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1555 ; SSE4-NEXT:    retq
1557 ; AVX1-LABEL: test_v32i16:
1558 ; AVX1:       # %bb.0:
1559 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1560 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1561 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1562 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1563 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
1564 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1565 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1566 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1567 ; AVX1-NEXT:    vmovd %xmm0, %eax
1568 ; AVX1-NEXT:    notl %eax
1569 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1570 ; AVX1-NEXT:    vzeroupper
1571 ; AVX1-NEXT:    retq
1573 ; AVX2-LABEL: test_v32i16:
1574 ; AVX2:       # %bb.0:
1575 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1576 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1577 ; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1578 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1579 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1580 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1581 ; AVX2-NEXT:    vmovd %xmm0, %eax
1582 ; AVX2-NEXT:    notl %eax
1583 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1584 ; AVX2-NEXT:    vzeroupper
1585 ; AVX2-NEXT:    retq
1587 ; AVX512BW-LABEL: test_v32i16:
1588 ; AVX512BW:       # %bb.0:
1589 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1590 ; AVX512BW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1591 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1592 ; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1593 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1594 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1595 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1596 ; AVX512BW-NEXT:    notl %eax
1597 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1598 ; AVX512BW-NEXT:    vzeroupper
1599 ; AVX512BW-NEXT:    retq
1601 ; AVX512VL-LABEL: test_v32i16:
1602 ; AVX512VL:       # %bb.0:
1603 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1604 ; AVX512VL-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1605 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1606 ; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1607 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1608 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1609 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
1610 ; AVX512VL-NEXT:    notl %eax
1611 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1612 ; AVX512VL-NEXT:    vzeroupper
1613 ; AVX512VL-NEXT:    retq
1614   %1 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> %a0)
1615   ret i16 %1
1618 define i16 @test_v64i16(<64 x i16> %a0) {
1619 ; SSE2-LABEL: test_v64i16:
1620 ; SSE2:       # %bb.0:
1621 ; SSE2-NEXT:    psubusw %xmm1, %xmm5
1622 ; SSE2-NEXT:    paddw %xmm1, %xmm5
1623 ; SSE2-NEXT:    psubusw %xmm3, %xmm7
1624 ; SSE2-NEXT:    paddw %xmm3, %xmm7
1625 ; SSE2-NEXT:    psubusw %xmm0, %xmm4
1626 ; SSE2-NEXT:    paddw %xmm0, %xmm4
1627 ; SSE2-NEXT:    psubusw %xmm2, %xmm6
1628 ; SSE2-NEXT:    paddw %xmm2, %xmm6
1629 ; SSE2-NEXT:    psubusw %xmm4, %xmm6
1630 ; SSE2-NEXT:    paddw %xmm4, %xmm6
1631 ; SSE2-NEXT:    psubusw %xmm5, %xmm7
1632 ; SSE2-NEXT:    paddw %xmm5, %xmm7
1633 ; SSE2-NEXT:    psubusw %xmm6, %xmm7
1634 ; SSE2-NEXT:    paddw %xmm6, %xmm7
1635 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
1636 ; SSE2-NEXT:    psubusw %xmm7, %xmm0
1637 ; SSE2-NEXT:    paddw %xmm7, %xmm0
1638 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1639 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
1640 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1641 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1642 ; SSE2-NEXT:    psrld $16, %xmm0
1643 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1644 ; SSE2-NEXT:    paddw %xmm1, %xmm0
1645 ; SSE2-NEXT:    movd %xmm0, %eax
1646 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1647 ; SSE2-NEXT:    retq
1649 ; SSE4-LABEL: test_v64i16:
1650 ; SSE4:       # %bb.0:
1651 ; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
1652 ; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
1653 ; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1654 ; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
1655 ; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
1656 ; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1657 ; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1658 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1659 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1660 ; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1661 ; SSE4-NEXT:    movd %xmm0, %eax
1662 ; SSE4-NEXT:    notl %eax
1663 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1664 ; SSE4-NEXT:    retq
1666 ; AVX1-LABEL: test_v64i16:
1667 ; AVX1:       # %bb.0:
1668 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1669 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1670 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
1671 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1672 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1673 ; AVX1-NEXT:    vpmaxuw %xmm5, %xmm6, %xmm5
1674 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
1675 ; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
1676 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
1677 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1678 ; AVX1-NEXT:    vpmaxuw %xmm4, %xmm0, %xmm0
1679 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1680 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1681 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1682 ; AVX1-NEXT:    vmovd %xmm0, %eax
1683 ; AVX1-NEXT:    notl %eax
1684 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1685 ; AVX1-NEXT:    vzeroupper
1686 ; AVX1-NEXT:    retq
1688 ; AVX2-LABEL: test_v64i16:
1689 ; AVX2:       # %bb.0:
1690 ; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
1691 ; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
1692 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1693 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1694 ; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1695 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1696 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1697 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1698 ; AVX2-NEXT:    vmovd %xmm0, %eax
1699 ; AVX2-NEXT:    notl %eax
1700 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1701 ; AVX2-NEXT:    vzeroupper
1702 ; AVX2-NEXT:    retq
1704 ; AVX512BW-LABEL: test_v64i16:
1705 ; AVX512BW:       # %bb.0:
1706 ; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
1707 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1708 ; AVX512BW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1709 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1710 ; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1711 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1712 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1713 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1714 ; AVX512BW-NEXT:    notl %eax
1715 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1716 ; AVX512BW-NEXT:    vzeroupper
1717 ; AVX512BW-NEXT:    retq
1719 ; AVX512VL-LABEL: test_v64i16:
1720 ; AVX512VL:       # %bb.0:
1721 ; AVX512VL-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
1722 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1723 ; AVX512VL-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1724 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1725 ; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1726 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1727 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1728 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
1729 ; AVX512VL-NEXT:    notl %eax
1730 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1731 ; AVX512VL-NEXT:    vzeroupper
1732 ; AVX512VL-NEXT:    retq
1733   %1 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> %a0)
1734   ret i16 %1
1738 ; vXi8
1741 define i8 @test_v2i8(<2 x i8> %a0) {
1742 ; SSE-LABEL: test_v2i8:
1743 ; SSE:       # %bb.0:
1744 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1745 ; SSE-NEXT:    psrlw $8, %xmm1
1746 ; SSE-NEXT:    pmaxub %xmm0, %xmm1
1747 ; SSE-NEXT:    movd %xmm1, %eax
1748 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
1749 ; SSE-NEXT:    retq
1751 ; AVX-LABEL: test_v2i8:
1752 ; AVX:       # %bb.0:
1753 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1754 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1755 ; AVX-NEXT:    vmovd %xmm0, %eax
1756 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1757 ; AVX-NEXT:    retq
1759 ; AVX512-LABEL: test_v2i8:
1760 ; AVX512:       # %bb.0:
1761 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1762 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1763 ; AVX512-NEXT:    vmovd %xmm0, %eax
1764 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1765 ; AVX512-NEXT:    retq
1766   %1 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> %a0)
1767   ret i8 %1
1770 define i8 @test_v4i8(<4 x i8> %a0) {
1771 ; SSE-LABEL: test_v4i8:
1772 ; SSE:       # %bb.0:
1773 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1774 ; SSE-NEXT:    psrld $16, %xmm1
1775 ; SSE-NEXT:    pmaxub %xmm0, %xmm1
1776 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1777 ; SSE-NEXT:    psrlw $8, %xmm0
1778 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
1779 ; SSE-NEXT:    movd %xmm0, %eax
1780 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
1781 ; SSE-NEXT:    retq
1783 ; AVX-LABEL: test_v4i8:
1784 ; AVX:       # %bb.0:
1785 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1786 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1787 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1788 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1789 ; AVX-NEXT:    vmovd %xmm0, %eax
1790 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1791 ; AVX-NEXT:    retq
1793 ; AVX512-LABEL: test_v4i8:
1794 ; AVX512:       # %bb.0:
1795 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1796 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1797 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1798 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1799 ; AVX512-NEXT:    vmovd %xmm0, %eax
1800 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1801 ; AVX512-NEXT:    retq
1802   %1 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> %a0)
1803   ret i8 %1
1806 define i8 @test_v8i8(<8 x i8> %a0) {
1807 ; SSE-LABEL: test_v8i8:
1808 ; SSE:       # %bb.0:
1809 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1810 ; SSE-NEXT:    pmaxub %xmm0, %xmm1
1811 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1812 ; SSE-NEXT:    psrld $16, %xmm0
1813 ; SSE-NEXT:    pmaxub %xmm1, %xmm0
1814 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1815 ; SSE-NEXT:    psrlw $8, %xmm1
1816 ; SSE-NEXT:    pmaxub %xmm0, %xmm1
1817 ; SSE-NEXT:    movd %xmm1, %eax
1818 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
1819 ; SSE-NEXT:    retq
1821 ; AVX-LABEL: test_v8i8:
1822 ; AVX:       # %bb.0:
1823 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1824 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1825 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1826 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1827 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1828 ; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1829 ; AVX-NEXT:    vmovd %xmm0, %eax
1830 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1831 ; AVX-NEXT:    retq
1833 ; AVX512-LABEL: test_v8i8:
1834 ; AVX512:       # %bb.0:
1835 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1836 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1837 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1838 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1839 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1840 ; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1841 ; AVX512-NEXT:    vmovd %xmm0, %eax
1842 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1843 ; AVX512-NEXT:    retq
1844   %1 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %a0)
1845   ret i8 %1
1848 define i8 @test_v16i8(<16 x i8> %a0) {
1849 ; SSE2-LABEL: test_v16i8:
1850 ; SSE2:       # %bb.0:
1851 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1852 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1853 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1854 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1855 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1856 ; SSE2-NEXT:    psrld $16, %xmm1
1857 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1858 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1859 ; SSE2-NEXT:    psrlw $8, %xmm0
1860 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1861 ; SSE2-NEXT:    movd %xmm0, %eax
1862 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1863 ; SSE2-NEXT:    retq
1865 ; SSE4-LABEL: test_v16i8:
1866 ; SSE4:       # %bb.0:
1867 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1868 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1869 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
1870 ; SSE4-NEXT:    psrlw $8, %xmm0
1871 ; SSE4-NEXT:    pminub %xmm1, %xmm0
1872 ; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1873 ; SSE4-NEXT:    movd %xmm0, %eax
1874 ; SSE4-NEXT:    notb %al
1875 ; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1876 ; SSE4-NEXT:    retq
1878 ; AVX-LABEL: test_v16i8:
1879 ; AVX:       # %bb.0:
1880 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1881 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1882 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1883 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1884 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1885 ; AVX-NEXT:    vmovd %xmm0, %eax
1886 ; AVX-NEXT:    notb %al
1887 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1888 ; AVX-NEXT:    retq
1890 ; AVX512BW-LABEL: test_v16i8:
1891 ; AVX512BW:       # %bb.0:
1892 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1893 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1894 ; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
1895 ; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1896 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1897 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1898 ; AVX512BW-NEXT:    notb %al
1899 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1900 ; AVX512BW-NEXT:    vzeroupper
1901 ; AVX512BW-NEXT:    retq
1903 ; AVX512VL-LABEL: test_v16i8:
1904 ; AVX512VL:       # %bb.0:
1905 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1906 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
1907 ; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1908 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1909 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
1910 ; AVX512VL-NEXT:    notb %al
1911 ; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
1912 ; AVX512VL-NEXT:    retq
1913   %1 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %a0)
1914   ret i8 %1
1917 define i8 @test_v32i8(<32 x i8> %a0) {
1918 ; SSE2-LABEL: test_v32i8:
1919 ; SSE2:       # %bb.0:
1920 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1921 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1922 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1923 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1924 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1925 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1926 ; SSE2-NEXT:    psrld $16, %xmm1
1927 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1928 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1929 ; SSE2-NEXT:    psrlw $8, %xmm0
1930 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1931 ; SSE2-NEXT:    movd %xmm0, %eax
1932 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1933 ; SSE2-NEXT:    retq
1935 ; SSE4-LABEL: test_v32i8:
1936 ; SSE4:       # %bb.0:
1937 ; SSE4-NEXT:    pmaxub %xmm1, %xmm0
1938 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1939 ; SSE4-NEXT:    pxor %xmm0, %xmm1
1940 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
1941 ; SSE4-NEXT:    psrlw $8, %xmm0
1942 ; SSE4-NEXT:    pminub %xmm1, %xmm0
1943 ; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1944 ; SSE4-NEXT:    movd %xmm0, %eax
1945 ; SSE4-NEXT:    notb %al
1946 ; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1947 ; SSE4-NEXT:    retq
1949 ; AVX1-LABEL: test_v32i8:
1950 ; AVX1:       # %bb.0:
1951 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1952 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1953 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1954 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1955 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1956 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1957 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1958 ; AVX1-NEXT:    vmovd %xmm0, %eax
1959 ; AVX1-NEXT:    notb %al
1960 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1961 ; AVX1-NEXT:    vzeroupper
1962 ; AVX1-NEXT:    retq
1964 ; AVX2-LABEL: test_v32i8:
1965 ; AVX2:       # %bb.0:
1966 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1967 ; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1968 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1969 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1970 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1971 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1972 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1973 ; AVX2-NEXT:    vmovd %xmm0, %eax
1974 ; AVX2-NEXT:    notb %al
1975 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1976 ; AVX2-NEXT:    vzeroupper
1977 ; AVX2-NEXT:    retq
1979 ; AVX512BW-LABEL: test_v32i8:
1980 ; AVX512BW:       # %bb.0:
1981 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1982 ; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1983 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1984 ; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
1985 ; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1986 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1987 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
1988 ; AVX512BW-NEXT:    notb %al
1989 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1990 ; AVX512BW-NEXT:    vzeroupper
1991 ; AVX512BW-NEXT:    retq
1993 ; AVX512VL-LABEL: test_v32i8:
1994 ; AVX512VL:       # %bb.0:
1995 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1996 ; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1997 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1998 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
1999 ; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2000 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2001 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
2002 ; AVX512VL-NEXT:    notb %al
2003 ; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2004 ; AVX512VL-NEXT:    vzeroupper
2005 ; AVX512VL-NEXT:    retq
2006   %1 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> %a0)
2007   ret i8 %1
2010 define i8 @test_v64i8(<64 x i8> %a0) {
2011 ; SSE2-LABEL: test_v64i8:
2012 ; SSE2:       # %bb.0:
2013 ; SSE2-NEXT:    pmaxub %xmm3, %xmm1
2014 ; SSE2-NEXT:    pmaxub %xmm2, %xmm0
2015 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2016 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2017 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2018 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
2019 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2020 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2021 ; SSE2-NEXT:    psrld $16, %xmm1
2022 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2023 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2024 ; SSE2-NEXT:    psrlw $8, %xmm0
2025 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2026 ; SSE2-NEXT:    movd %xmm0, %eax
2027 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2028 ; SSE2-NEXT:    retq
2030 ; SSE4-LABEL: test_v64i8:
2031 ; SSE4:       # %bb.0:
2032 ; SSE4-NEXT:    pmaxub %xmm3, %xmm1
2033 ; SSE4-NEXT:    pmaxub %xmm2, %xmm0
2034 ; SSE4-NEXT:    pmaxub %xmm1, %xmm0
2035 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
2036 ; SSE4-NEXT:    pxor %xmm0, %xmm1
2037 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
2038 ; SSE4-NEXT:    psrlw $8, %xmm0
2039 ; SSE4-NEXT:    pminub %xmm1, %xmm0
2040 ; SSE4-NEXT:    phminposuw %xmm0, %xmm0
2041 ; SSE4-NEXT:    movd %xmm0, %eax
2042 ; SSE4-NEXT:    notb %al
2043 ; SSE4-NEXT:    # kill: def $al killed $al killed $eax
2044 ; SSE4-NEXT:    retq
2046 ; AVX1-LABEL: test_v64i8:
2047 ; AVX1:       # %bb.0:
2048 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2049 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2050 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2051 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2052 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
2053 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2054 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2055 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2056 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2057 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2058 ; AVX1-NEXT:    vmovd %xmm0, %eax
2059 ; AVX1-NEXT:    notb %al
2060 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2061 ; AVX1-NEXT:    vzeroupper
2062 ; AVX1-NEXT:    retq
2064 ; AVX2-LABEL: test_v64i8:
2065 ; AVX2:       # %bb.0:
2066 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2067 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2068 ; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2069 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2070 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2071 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2072 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2073 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2074 ; AVX2-NEXT:    vmovd %xmm0, %eax
2075 ; AVX2-NEXT:    notb %al
2076 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2077 ; AVX2-NEXT:    vzeroupper
2078 ; AVX2-NEXT:    retq
2080 ; AVX512BW-LABEL: test_v64i8:
2081 ; AVX512BW:       # %bb.0:
2082 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2083 ; AVX512BW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2084 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2085 ; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2086 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
2087 ; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2088 ; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2089 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
2090 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
2091 ; AVX512BW-NEXT:    notb %al
2092 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2093 ; AVX512BW-NEXT:    vzeroupper
2094 ; AVX512BW-NEXT:    retq
2096 ; AVX512VL-LABEL: test_v64i8:
2097 ; AVX512VL:       # %bb.0:
2098 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2099 ; AVX512VL-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2100 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2101 ; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2102 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
2103 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2104 ; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2105 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2106 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
2107 ; AVX512VL-NEXT:    notb %al
2108 ; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2109 ; AVX512VL-NEXT:    vzeroupper
2110 ; AVX512VL-NEXT:    retq
2111   %1 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> %a0)
2112   ret i8 %1
2115 define i8 @test_v128i8(<128 x i8> %a0) {
2116 ; SSE2-LABEL: test_v128i8:
2117 ; SSE2:       # %bb.0:
2118 ; SSE2-NEXT:    pmaxub %xmm6, %xmm2
2119 ; SSE2-NEXT:    pmaxub %xmm4, %xmm0
2120 ; SSE2-NEXT:    pmaxub %xmm2, %xmm0
2121 ; SSE2-NEXT:    pmaxub %xmm7, %xmm3
2122 ; SSE2-NEXT:    pmaxub %xmm5, %xmm1
2123 ; SSE2-NEXT:    pmaxub %xmm3, %xmm1
2124 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2125 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
2126 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2127 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2128 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2129 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2130 ; SSE2-NEXT:    psrld $16, %xmm0
2131 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2132 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2133 ; SSE2-NEXT:    psrlw $8, %xmm1
2134 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2135 ; SSE2-NEXT:    movd %xmm1, %eax
2136 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2137 ; SSE2-NEXT:    retq
2139 ; SSE4-LABEL: test_v128i8:
2140 ; SSE4:       # %bb.0:
2141 ; SSE4-NEXT:    pmaxub %xmm7, %xmm3
2142 ; SSE4-NEXT:    pmaxub %xmm5, %xmm1
2143 ; SSE4-NEXT:    pmaxub %xmm3, %xmm1
2144 ; SSE4-NEXT:    pmaxub %xmm6, %xmm2
2145 ; SSE4-NEXT:    pmaxub %xmm4, %xmm0
2146 ; SSE4-NEXT:    pmaxub %xmm2, %xmm0
2147 ; SSE4-NEXT:    pmaxub %xmm1, %xmm0
2148 ; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
2149 ; SSE4-NEXT:    pxor %xmm0, %xmm1
2150 ; SSE4-NEXT:    movdqa %xmm1, %xmm0
2151 ; SSE4-NEXT:    psrlw $8, %xmm0
2152 ; SSE4-NEXT:    pminub %xmm1, %xmm0
2153 ; SSE4-NEXT:    phminposuw %xmm0, %xmm0
2154 ; SSE4-NEXT:    movd %xmm0, %eax
2155 ; SSE4-NEXT:    notb %al
2156 ; SSE4-NEXT:    # kill: def $al killed $al killed $eax
2157 ; SSE4-NEXT:    retq
2159 ; AVX1-LABEL: test_v128i8:
2160 ; AVX1:       # %bb.0:
2161 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2162 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2163 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
2164 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2165 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2166 ; AVX1-NEXT:    vpmaxub %xmm5, %xmm6, %xmm5
2167 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
2168 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
2169 ; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
2170 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2171 ; AVX1-NEXT:    vpmaxub %xmm4, %xmm0, %xmm0
2172 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2173 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2174 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2175 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2176 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2177 ; AVX1-NEXT:    vmovd %xmm0, %eax
2178 ; AVX1-NEXT:    notb %al
2179 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2180 ; AVX1-NEXT:    vzeroupper
2181 ; AVX1-NEXT:    retq
2183 ; AVX2-LABEL: test_v128i8:
2184 ; AVX2:       # %bb.0:
2185 ; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
2186 ; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
2187 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2188 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2189 ; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2190 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2191 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2192 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2193 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2194 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2195 ; AVX2-NEXT:    vmovd %xmm0, %eax
2196 ; AVX2-NEXT:    notb %al
2197 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2198 ; AVX2-NEXT:    vzeroupper
2199 ; AVX2-NEXT:    retq
2201 ; AVX512BW-LABEL: test_v128i8:
2202 ; AVX512BW:       # %bb.0:
2203 ; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
2204 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2205 ; AVX512BW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2206 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2207 ; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2208 ; AVX512BW-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
2209 ; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2210 ; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2211 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
2212 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
2213 ; AVX512BW-NEXT:    notb %al
2214 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2215 ; AVX512BW-NEXT:    vzeroupper
2216 ; AVX512BW-NEXT:    retq
2218 ; AVX512VL-LABEL: test_v128i8:
2219 ; AVX512VL:       # %bb.0:
2220 ; AVX512VL-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
2221 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2222 ; AVX512VL-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2223 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2224 ; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2225 ; AVX512VL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
2226 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2227 ; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2228 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2229 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
2230 ; AVX512VL-NEXT:    notb %al
2231 ; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2232 ; AVX512VL-NEXT:    vzeroupper
2233 ; AVX512VL-NEXT:    retq
2234   %1 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> %a0)
2235   ret i8 %1
2238 declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>)
2239 declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>)
2240 declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>)
2241 declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>)
2243 declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>)
2244 declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>)
2245 declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>)
2246 declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>)
2247 declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>)
2249 declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>)
2250 declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>)
2251 declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>)
2252 declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>)
2253 declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>)
2254 declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>)
2256 declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>)
2257 declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>)
2258 declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>)
2259 declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>)
2260 declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)
2261 declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>)
2262 declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>)