[Demangle] Add a few more options to the microsoft demangler
[llvm-complete.git] / test / CodeGen / X86 / vector-reduce-smax.ll
blob8a184cd78e48758cd18829b02cf8a508b131e151
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
10 ; vXi64
13 define i64 @test_v2i64(<2 x i64> %a0) {
14 ; SSE2-LABEL: test_v2i64:
15 ; SSE2:       # %bb.0:
16 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
17 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
18 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
19 ; SSE2-NEXT:    pxor %xmm2, %xmm3
20 ; SSE2-NEXT:    pxor %xmm1, %xmm2
21 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
22 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
23 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
24 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
25 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
26 ; SSE2-NEXT:    pand %xmm5, %xmm2
27 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
28 ; SSE2-NEXT:    por %xmm2, %xmm3
29 ; SSE2-NEXT:    pand %xmm3, %xmm0
30 ; SSE2-NEXT:    pandn %xmm1, %xmm3
31 ; SSE2-NEXT:    por %xmm0, %xmm3
32 ; SSE2-NEXT:    movq %xmm3, %rax
33 ; SSE2-NEXT:    retq
35 ; SSE41-LABEL: test_v2i64:
36 ; SSE41:       # %bb.0:
37 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
38 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
39 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
40 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
41 ; SSE41-NEXT:    pxor %xmm3, %xmm4
42 ; SSE41-NEXT:    pxor %xmm2, %xmm3
43 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
44 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
45 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
46 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
47 ; SSE41-NEXT:    pand %xmm3, %xmm0
48 ; SSE41-NEXT:    por %xmm4, %xmm0
49 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
50 ; SSE41-NEXT:    movq %xmm2, %rax
51 ; SSE41-NEXT:    retq
53 ; AVX-LABEL: test_v2i64:
54 ; AVX:       # %bb.0:
55 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
56 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
57 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
58 ; AVX-NEXT:    vmovq %xmm0, %rax
59 ; AVX-NEXT:    retq
61 ; AVX512BW-LABEL: test_v2i64:
62 ; AVX512BW:       # %bb.0:
63 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
64 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
65 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
66 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
67 ; AVX512BW-NEXT:    vzeroupper
68 ; AVX512BW-NEXT:    retq
70 ; AVX512VL-LABEL: test_v2i64:
71 ; AVX512VL:       # %bb.0:
72 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
73 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
74 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
75 ; AVX512VL-NEXT:    retq
76   %1 = call i64 @llvm.experimental.vector.reduce.smax.v2i64(<2 x i64> %a0)
77   ret i64 %1
80 define i64 @test_v4i64(<4 x i64> %a0) {
81 ; SSE2-LABEL: test_v4i64:
82 ; SSE2:       # %bb.0:
83 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
84 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
85 ; SSE2-NEXT:    pxor %xmm2, %xmm3
86 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
87 ; SSE2-NEXT:    pxor %xmm2, %xmm4
88 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
89 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
91 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
92 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
93 ; SSE2-NEXT:    pand %xmm6, %xmm3
94 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
95 ; SSE2-NEXT:    por %xmm3, %xmm4
96 ; SSE2-NEXT:    pand %xmm4, %xmm0
97 ; SSE2-NEXT:    pandn %xmm1, %xmm4
98 ; SSE2-NEXT:    por %xmm0, %xmm4
99 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
100 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
101 ; SSE2-NEXT:    pxor %xmm2, %xmm1
102 ; SSE2-NEXT:    pxor %xmm0, %xmm2
103 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
104 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
105 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
106 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
107 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
108 ; SSE2-NEXT:    pand %xmm5, %xmm1
109 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
110 ; SSE2-NEXT:    por %xmm1, %xmm2
111 ; SSE2-NEXT:    pand %xmm2, %xmm4
112 ; SSE2-NEXT:    pandn %xmm0, %xmm2
113 ; SSE2-NEXT:    por %xmm4, %xmm2
114 ; SSE2-NEXT:    movq %xmm2, %rax
115 ; SSE2-NEXT:    retq
117 ; SSE41-LABEL: test_v4i64:
118 ; SSE41:       # %bb.0:
119 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
120 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
121 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
122 ; SSE41-NEXT:    pxor %xmm3, %xmm4
123 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
124 ; SSE41-NEXT:    pxor %xmm3, %xmm5
125 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
126 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
127 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
128 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
129 ; SSE41-NEXT:    pand %xmm4, %xmm0
130 ; SSE41-NEXT:    por %xmm5, %xmm0
131 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
132 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
133 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
134 ; SSE41-NEXT:    pxor %xmm3, %xmm4
135 ; SSE41-NEXT:    pxor %xmm2, %xmm3
136 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
137 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
138 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
139 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
140 ; SSE41-NEXT:    pand %xmm5, %xmm0
141 ; SSE41-NEXT:    por %xmm4, %xmm0
142 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
143 ; SSE41-NEXT:    movq %xmm2, %rax
144 ; SSE41-NEXT:    retq
146 ; AVX1-LABEL: test_v4i64:
147 ; AVX1:       # %bb.0:
148 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
149 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
150 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
151 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
152 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
153 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
154 ; AVX1-NEXT:    vmovq %xmm0, %rax
155 ; AVX1-NEXT:    vzeroupper
156 ; AVX1-NEXT:    retq
158 ; AVX2-LABEL: test_v4i64:
159 ; AVX2:       # %bb.0:
160 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
161 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
162 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
163 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
164 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
165 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
166 ; AVX2-NEXT:    vmovq %xmm0, %rax
167 ; AVX2-NEXT:    vzeroupper
168 ; AVX2-NEXT:    retq
170 ; AVX512BW-LABEL: test_v4i64:
171 ; AVX512BW:       # %bb.0:
172 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
173 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
174 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
175 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
176 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
177 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
178 ; AVX512BW-NEXT:    vzeroupper
179 ; AVX512BW-NEXT:    retq
181 ; AVX512VL-LABEL: test_v4i64:
182 ; AVX512VL:       # %bb.0:
183 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
184 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
185 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
186 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
187 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
188 ; AVX512VL-NEXT:    vzeroupper
189 ; AVX512VL-NEXT:    retq
190   %1 = call i64 @llvm.experimental.vector.reduce.smax.v4i64(<4 x i64> %a0)
191   ret i64 %1
194 define i64 @test_v8i64(<8 x i64> %a0) {
195 ; SSE2-LABEL: test_v8i64:
196 ; SSE2:       # %bb.0:
197 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
198 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
199 ; SSE2-NEXT:    pxor %xmm4, %xmm5
200 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
201 ; SSE2-NEXT:    pxor %xmm4, %xmm6
202 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
203 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
204 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
205 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
206 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
207 ; SSE2-NEXT:    pand %xmm8, %xmm6
208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
209 ; SSE2-NEXT:    por %xmm6, %xmm5
210 ; SSE2-NEXT:    pand %xmm5, %xmm0
211 ; SSE2-NEXT:    pandn %xmm2, %xmm5
212 ; SSE2-NEXT:    por %xmm0, %xmm5
213 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
214 ; SSE2-NEXT:    pxor %xmm4, %xmm0
215 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
216 ; SSE2-NEXT:    pxor %xmm4, %xmm2
217 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
218 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
219 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
220 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
221 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
222 ; SSE2-NEXT:    pand %xmm7, %xmm0
223 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
224 ; SSE2-NEXT:    por %xmm0, %xmm2
225 ; SSE2-NEXT:    pand %xmm2, %xmm1
226 ; SSE2-NEXT:    pandn %xmm3, %xmm2
227 ; SSE2-NEXT:    por %xmm1, %xmm2
228 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
229 ; SSE2-NEXT:    pxor %xmm4, %xmm0
230 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
231 ; SSE2-NEXT:    pxor %xmm4, %xmm1
232 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
233 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
234 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
235 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
237 ; SSE2-NEXT:    pand %xmm6, %xmm0
238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
239 ; SSE2-NEXT:    por %xmm0, %xmm1
240 ; SSE2-NEXT:    pand %xmm1, %xmm5
241 ; SSE2-NEXT:    pandn %xmm2, %xmm1
242 ; SSE2-NEXT:    por %xmm5, %xmm1
243 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
244 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
245 ; SSE2-NEXT:    pxor %xmm4, %xmm2
246 ; SSE2-NEXT:    pxor %xmm0, %xmm4
247 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
248 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
249 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
250 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
251 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
252 ; SSE2-NEXT:    pand %xmm5, %xmm2
253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
254 ; SSE2-NEXT:    por %xmm2, %xmm3
255 ; SSE2-NEXT:    pand %xmm3, %xmm1
256 ; SSE2-NEXT:    pandn %xmm0, %xmm3
257 ; SSE2-NEXT:    por %xmm1, %xmm3
258 ; SSE2-NEXT:    movq %xmm3, %rax
259 ; SSE2-NEXT:    retq
261 ; SSE41-LABEL: test_v8i64:
262 ; SSE41:       # %bb.0:
263 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
264 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
265 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
266 ; SSE41-NEXT:    pxor %xmm5, %xmm6
267 ; SSE41-NEXT:    movdqa %xmm0, %xmm7
268 ; SSE41-NEXT:    pxor %xmm5, %xmm7
269 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
270 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
271 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
272 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
273 ; SSE41-NEXT:    pand %xmm6, %xmm0
274 ; SSE41-NEXT:    por %xmm7, %xmm0
275 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
276 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
277 ; SSE41-NEXT:    pxor %xmm5, %xmm0
278 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
279 ; SSE41-NEXT:    pxor %xmm5, %xmm4
280 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
281 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
282 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
283 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
284 ; SSE41-NEXT:    pand %xmm6, %xmm0
285 ; SSE41-NEXT:    por %xmm4, %xmm0
286 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
287 ; SSE41-NEXT:    movapd %xmm3, %xmm0
288 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
289 ; SSE41-NEXT:    movapd %xmm2, %xmm1
290 ; SSE41-NEXT:    xorpd %xmm5, %xmm1
291 ; SSE41-NEXT:    movapd %xmm1, %xmm4
292 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
293 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
294 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
295 ; SSE41-NEXT:    pand %xmm4, %xmm0
296 ; SSE41-NEXT:    por %xmm1, %xmm0
297 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
298 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
299 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
300 ; SSE41-NEXT:    pxor %xmm5, %xmm2
301 ; SSE41-NEXT:    pxor %xmm1, %xmm5
302 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
303 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
304 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
305 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
306 ; SSE41-NEXT:    pand %xmm4, %xmm0
307 ; SSE41-NEXT:    por %xmm2, %xmm0
308 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
309 ; SSE41-NEXT:    movq %xmm1, %rax
310 ; SSE41-NEXT:    retq
312 ; AVX1-LABEL: test_v8i64:
313 ; AVX1:       # %bb.0:
314 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
315 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
316 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
317 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
318 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
319 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
320 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm1
321 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
322 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
323 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
324 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
325 ; AVX1-NEXT:    vmovq %xmm0, %rax
326 ; AVX1-NEXT:    vzeroupper
327 ; AVX1-NEXT:    retq
329 ; AVX2-LABEL: test_v8i64:
330 ; AVX2:       # %bb.0:
331 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
332 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
333 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
334 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
335 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
336 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
337 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
338 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
339 ; AVX2-NEXT:    vmovq %xmm0, %rax
340 ; AVX2-NEXT:    vzeroupper
341 ; AVX2-NEXT:    retq
343 ; AVX512BW-LABEL: test_v8i64:
344 ; AVX512BW:       # %bb.0:
345 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
346 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
347 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
348 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
349 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
350 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
351 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
352 ; AVX512BW-NEXT:    vzeroupper
353 ; AVX512BW-NEXT:    retq
355 ; AVX512VL-LABEL: test_v8i64:
356 ; AVX512VL:       # %bb.0:
357 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
358 ; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
359 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
360 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
361 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
362 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
363 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
364 ; AVX512VL-NEXT:    vzeroupper
365 ; AVX512VL-NEXT:    retq
366   %1 = call i64 @llvm.experimental.vector.reduce.smax.v8i64(<8 x i64> %a0)
367   ret i64 %1
370 define i64 @test_v16i64(<16 x i64> %a0) {
371 ; SSE2-LABEL: test_v16i64:
372 ; SSE2:       # %bb.0:
373 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
374 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
375 ; SSE2-NEXT:    pxor %xmm8, %xmm9
376 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
377 ; SSE2-NEXT:    pxor %xmm8, %xmm10
378 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
379 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
380 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
381 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
382 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
383 ; SSE2-NEXT:    pand %xmm12, %xmm10
384 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
385 ; SSE2-NEXT:    por %xmm10, %xmm9
386 ; SSE2-NEXT:    pand %xmm9, %xmm1
387 ; SSE2-NEXT:    pandn %xmm5, %xmm9
388 ; SSE2-NEXT:    por %xmm1, %xmm9
389 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
390 ; SSE2-NEXT:    pxor %xmm8, %xmm1
391 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
392 ; SSE2-NEXT:    pxor %xmm8, %xmm5
393 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
394 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
396 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
397 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
398 ; SSE2-NEXT:    pand %xmm11, %xmm5
399 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
400 ; SSE2-NEXT:    por %xmm5, %xmm1
401 ; SSE2-NEXT:    pand %xmm1, %xmm3
402 ; SSE2-NEXT:    pandn %xmm7, %xmm1
403 ; SSE2-NEXT:    por %xmm3, %xmm1
404 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
405 ; SSE2-NEXT:    pxor %xmm8, %xmm3
406 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
407 ; SSE2-NEXT:    pxor %xmm8, %xmm5
408 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
409 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
410 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
411 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
412 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
413 ; SSE2-NEXT:    pand %xmm10, %xmm5
414 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
415 ; SSE2-NEXT:    por %xmm5, %xmm3
416 ; SSE2-NEXT:    pand %xmm3, %xmm0
417 ; SSE2-NEXT:    pandn %xmm4, %xmm3
418 ; SSE2-NEXT:    por %xmm0, %xmm3
419 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
420 ; SSE2-NEXT:    pxor %xmm8, %xmm0
421 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
422 ; SSE2-NEXT:    pxor %xmm8, %xmm4
423 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
424 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
425 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
426 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
427 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
428 ; SSE2-NEXT:    pand %xmm7, %xmm0
429 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
430 ; SSE2-NEXT:    por %xmm0, %xmm4
431 ; SSE2-NEXT:    pand %xmm4, %xmm2
432 ; SSE2-NEXT:    pandn %xmm6, %xmm4
433 ; SSE2-NEXT:    por %xmm2, %xmm4
434 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
435 ; SSE2-NEXT:    pxor %xmm8, %xmm0
436 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
437 ; SSE2-NEXT:    pxor %xmm8, %xmm2
438 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
439 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
440 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
441 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
442 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
443 ; SSE2-NEXT:    pand %xmm6, %xmm2
444 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
445 ; SSE2-NEXT:    por %xmm2, %xmm0
446 ; SSE2-NEXT:    pand %xmm0, %xmm3
447 ; SSE2-NEXT:    pandn %xmm4, %xmm0
448 ; SSE2-NEXT:    por %xmm3, %xmm0
449 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
450 ; SSE2-NEXT:    pxor %xmm8, %xmm2
451 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
452 ; SSE2-NEXT:    pxor %xmm8, %xmm3
453 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
454 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
455 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
456 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
457 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
458 ; SSE2-NEXT:    pand %xmm5, %xmm2
459 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
460 ; SSE2-NEXT:    por %xmm2, %xmm3
461 ; SSE2-NEXT:    pand %xmm3, %xmm9
462 ; SSE2-NEXT:    pandn %xmm1, %xmm3
463 ; SSE2-NEXT:    por %xmm9, %xmm3
464 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
465 ; SSE2-NEXT:    pxor %xmm8, %xmm1
466 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
467 ; SSE2-NEXT:    pxor %xmm8, %xmm2
468 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
469 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
470 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
471 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
472 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
473 ; SSE2-NEXT:    pand %xmm5, %xmm1
474 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
475 ; SSE2-NEXT:    por %xmm1, %xmm2
476 ; SSE2-NEXT:    pand %xmm2, %xmm0
477 ; SSE2-NEXT:    pandn %xmm3, %xmm2
478 ; SSE2-NEXT:    por %xmm0, %xmm2
479 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
480 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
481 ; SSE2-NEXT:    pxor %xmm8, %xmm1
482 ; SSE2-NEXT:    pxor %xmm0, %xmm8
483 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
484 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
485 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
486 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm8
487 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
488 ; SSE2-NEXT:    pand %xmm4, %xmm1
489 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
490 ; SSE2-NEXT:    por %xmm1, %xmm3
491 ; SSE2-NEXT:    pand %xmm3, %xmm2
492 ; SSE2-NEXT:    pandn %xmm0, %xmm3
493 ; SSE2-NEXT:    por %xmm2, %xmm3
494 ; SSE2-NEXT:    movq %xmm3, %rax
495 ; SSE2-NEXT:    retq
497 ; SSE41-LABEL: test_v16i64:
498 ; SSE41:       # %bb.0:
499 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
500 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
501 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
502 ; SSE41-NEXT:    pxor %xmm9, %xmm0
503 ; SSE41-NEXT:    movdqa %xmm1, %xmm10
504 ; SSE41-NEXT:    pxor %xmm9, %xmm10
505 ; SSE41-NEXT:    movdqa %xmm10, %xmm11
506 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm11
507 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
508 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
509 ; SSE41-NEXT:    pand %xmm11, %xmm0
510 ; SSE41-NEXT:    por %xmm10, %xmm0
511 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
512 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
513 ; SSE41-NEXT:    pxor %xmm9, %xmm0
514 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
515 ; SSE41-NEXT:    pxor %xmm9, %xmm1
516 ; SSE41-NEXT:    movdqa %xmm1, %xmm10
517 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
518 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
519 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
520 ; SSE41-NEXT:    pand %xmm10, %xmm0
521 ; SSE41-NEXT:    por %xmm1, %xmm0
522 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
523 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
524 ; SSE41-NEXT:    pxor %xmm9, %xmm1
525 ; SSE41-NEXT:    movdqa %xmm8, %xmm3
526 ; SSE41-NEXT:    pxor %xmm9, %xmm3
527 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
528 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
529 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm3
530 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
531 ; SSE41-NEXT:    pand %xmm1, %xmm0
532 ; SSE41-NEXT:    por %xmm3, %xmm0
533 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
534 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
535 ; SSE41-NEXT:    pxor %xmm9, %xmm0
536 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
537 ; SSE41-NEXT:    pxor %xmm9, %xmm1
538 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
539 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
540 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
541 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
542 ; SSE41-NEXT:    pand %xmm3, %xmm0
543 ; SSE41-NEXT:    por %xmm1, %xmm0
544 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
545 ; SSE41-NEXT:    movapd %xmm6, %xmm0
546 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
547 ; SSE41-NEXT:    movapd %xmm4, %xmm1
548 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
549 ; SSE41-NEXT:    movapd %xmm1, %xmm2
550 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
551 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
552 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
553 ; SSE41-NEXT:    pand %xmm2, %xmm0
554 ; SSE41-NEXT:    por %xmm1, %xmm0
555 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
556 ; SSE41-NEXT:    movapd %xmm7, %xmm0
557 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
558 ; SSE41-NEXT:    movapd %xmm5, %xmm1
559 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
560 ; SSE41-NEXT:    movapd %xmm1, %xmm2
561 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
562 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
563 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
564 ; SSE41-NEXT:    pand %xmm2, %xmm0
565 ; SSE41-NEXT:    por %xmm1, %xmm0
566 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
567 ; SSE41-NEXT:    movapd %xmm7, %xmm0
568 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
569 ; SSE41-NEXT:    movapd %xmm6, %xmm1
570 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
571 ; SSE41-NEXT:    movapd %xmm1, %xmm2
572 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
573 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
574 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
575 ; SSE41-NEXT:    pand %xmm2, %xmm0
576 ; SSE41-NEXT:    por %xmm1, %xmm0
577 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
578 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,0,1]
579 ; SSE41-NEXT:    movdqa %xmm7, %xmm2
580 ; SSE41-NEXT:    pxor %xmm9, %xmm2
581 ; SSE41-NEXT:    pxor %xmm1, %xmm9
582 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
583 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm3
584 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
585 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
586 ; SSE41-NEXT:    pand %xmm3, %xmm0
587 ; SSE41-NEXT:    por %xmm2, %xmm0
588 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
589 ; SSE41-NEXT:    movq %xmm1, %rax
590 ; SSE41-NEXT:    retq
592 ; AVX1-LABEL: test_v16i64:
593 ; AVX1:       # %bb.0:
594 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm11
595 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
596 ; AVX1-NEXT:    vpcmpgtq %xmm11, %xmm5, %xmm8
597 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm7
598 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
599 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm9
600 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm10
601 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm4
602 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm1, %xmm3, %xmm1
603 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm2, %xmm0
604 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
605 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm6, %xmm7, %xmm3
606 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm5, %xmm11, %xmm4
607 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
608 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
609 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
610 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm1
611 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
612 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
613 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
614 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
615 ; AVX1-NEXT:    vmovq %xmm0, %rax
616 ; AVX1-NEXT:    vzeroupper
617 ; AVX1-NEXT:    retq
619 ; AVX2-LABEL: test_v16i64:
620 ; AVX2:       # %bb.0:
621 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
622 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
623 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
624 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
625 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
626 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
627 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
628 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
629 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
630 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
631 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
632 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
633 ; AVX2-NEXT:    vmovq %xmm0, %rax
634 ; AVX2-NEXT:    vzeroupper
635 ; AVX2-NEXT:    retq
637 ; AVX512BW-LABEL: test_v16i64:
638 ; AVX512BW:       # %bb.0:
639 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
640 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
641 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
642 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
643 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
644 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
645 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
646 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
647 ; AVX512BW-NEXT:    vzeroupper
648 ; AVX512BW-NEXT:    retq
650 ; AVX512VL-LABEL: test_v16i64:
651 ; AVX512VL:       # %bb.0:
652 ; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
653 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
654 ; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
655 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
656 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
657 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
658 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
659 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
660 ; AVX512VL-NEXT:    vzeroupper
661 ; AVX512VL-NEXT:    retq
662   %1 = call i64 @llvm.experimental.vector.reduce.smax.v16i64(<16 x i64> %a0)
663   ret i64 %1
667 ; vXi32
670 define i32 @test_v2i32(<2 x i32> %a0) {
671 ; SSE2-LABEL: test_v2i32:
672 ; SSE2:       # %bb.0:
673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
674 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
675 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
676 ; SSE2-NEXT:    pand %xmm2, %xmm0
677 ; SSE2-NEXT:    pandn %xmm1, %xmm2
678 ; SSE2-NEXT:    por %xmm0, %xmm2
679 ; SSE2-NEXT:    movd %xmm2, %eax
680 ; SSE2-NEXT:    retq
682 ; SSE41-LABEL: test_v2i32:
683 ; SSE41:       # %bb.0:
684 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
685 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
686 ; SSE41-NEXT:    movd %xmm1, %eax
687 ; SSE41-NEXT:    retq
689 ; AVX-LABEL: test_v2i32:
690 ; AVX:       # %bb.0:
691 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
692 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
693 ; AVX-NEXT:    vmovd %xmm0, %eax
694 ; AVX-NEXT:    retq
696 ; AVX512-LABEL: test_v2i32:
697 ; AVX512:       # %bb.0:
698 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
699 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
700 ; AVX512-NEXT:    vmovd %xmm0, %eax
701 ; AVX512-NEXT:    retq
702   %1 = call i32 @llvm.experimental.vector.reduce.smax.v2i32(<2 x i32> %a0)
703   ret i32 %1
706 define i32 @test_v4i32(<4 x i32> %a0) {
707 ; SSE2-LABEL: test_v4i32:
708 ; SSE2:       # %bb.0:
709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
710 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
711 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
712 ; SSE2-NEXT:    pand %xmm2, %xmm0
713 ; SSE2-NEXT:    pandn %xmm1, %xmm2
714 ; SSE2-NEXT:    por %xmm0, %xmm2
715 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
716 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
717 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
718 ; SSE2-NEXT:    pand %xmm1, %xmm2
719 ; SSE2-NEXT:    pandn %xmm0, %xmm1
720 ; SSE2-NEXT:    por %xmm2, %xmm1
721 ; SSE2-NEXT:    movd %xmm1, %eax
722 ; SSE2-NEXT:    retq
724 ; SSE41-LABEL: test_v4i32:
725 ; SSE41:       # %bb.0:
726 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
727 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
728 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
729 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
730 ; SSE41-NEXT:    movd %xmm0, %eax
731 ; SSE41-NEXT:    retq
733 ; AVX-LABEL: test_v4i32:
734 ; AVX:       # %bb.0:
735 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
736 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
737 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
738 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
739 ; AVX-NEXT:    vmovd %xmm0, %eax
740 ; AVX-NEXT:    retq
742 ; AVX512-LABEL: test_v4i32:
743 ; AVX512:       # %bb.0:
744 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
745 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
746 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
747 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
748 ; AVX512-NEXT:    vmovd %xmm0, %eax
749 ; AVX512-NEXT:    retq
750   %1 = call i32 @llvm.experimental.vector.reduce.smax.v4i32(<4 x i32> %a0)
751   ret i32 %1
754 define i32 @test_v8i32(<8 x i32> %a0) {
755 ; SSE2-LABEL: test_v8i32:
756 ; SSE2:       # %bb.0:
757 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
758 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
759 ; SSE2-NEXT:    pand %xmm2, %xmm0
760 ; SSE2-NEXT:    pandn %xmm1, %xmm2
761 ; SSE2-NEXT:    por %xmm0, %xmm2
762 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
763 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
764 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
765 ; SSE2-NEXT:    pand %xmm1, %xmm2
766 ; SSE2-NEXT:    pandn %xmm0, %xmm1
767 ; SSE2-NEXT:    por %xmm2, %xmm1
768 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
769 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
770 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
771 ; SSE2-NEXT:    pand %xmm2, %xmm1
772 ; SSE2-NEXT:    pandn %xmm0, %xmm2
773 ; SSE2-NEXT:    por %xmm1, %xmm2
774 ; SSE2-NEXT:    movd %xmm2, %eax
775 ; SSE2-NEXT:    retq
777 ; SSE41-LABEL: test_v8i32:
778 ; SSE41:       # %bb.0:
779 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
780 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
781 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
782 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
783 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
784 ; SSE41-NEXT:    movd %xmm0, %eax
785 ; SSE41-NEXT:    retq
787 ; AVX1-LABEL: test_v8i32:
788 ; AVX1:       # %bb.0:
789 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
790 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
791 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
792 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
793 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
794 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
795 ; AVX1-NEXT:    vmovd %xmm0, %eax
796 ; AVX1-NEXT:    vzeroupper
797 ; AVX1-NEXT:    retq
799 ; AVX2-LABEL: test_v8i32:
800 ; AVX2:       # %bb.0:
801 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
802 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
803 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
804 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
805 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
806 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
807 ; AVX2-NEXT:    vmovd %xmm0, %eax
808 ; AVX2-NEXT:    vzeroupper
809 ; AVX2-NEXT:    retq
811 ; AVX512-LABEL: test_v8i32:
812 ; AVX512:       # %bb.0:
813 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
814 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
815 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
816 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
817 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
818 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
819 ; AVX512-NEXT:    vmovd %xmm0, %eax
820 ; AVX512-NEXT:    vzeroupper
821 ; AVX512-NEXT:    retq
822   %1 = call i32 @llvm.experimental.vector.reduce.smax.v8i32(<8 x i32> %a0)
823   ret i32 %1
826 define i32 @test_v16i32(<16 x i32> %a0) {
827 ; SSE2-LABEL: test_v16i32:
828 ; SSE2:       # %bb.0:
829 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
830 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
831 ; SSE2-NEXT:    pand %xmm4, %xmm1
832 ; SSE2-NEXT:    pandn %xmm3, %xmm4
833 ; SSE2-NEXT:    por %xmm1, %xmm4
834 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
835 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
836 ; SSE2-NEXT:    pand %xmm1, %xmm0
837 ; SSE2-NEXT:    pandn %xmm2, %xmm1
838 ; SSE2-NEXT:    por %xmm0, %xmm1
839 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
840 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
841 ; SSE2-NEXT:    pand %xmm0, %xmm1
842 ; SSE2-NEXT:    pandn %xmm4, %xmm0
843 ; SSE2-NEXT:    por %xmm1, %xmm0
844 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
845 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
846 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
847 ; SSE2-NEXT:    pand %xmm2, %xmm0
848 ; SSE2-NEXT:    pandn %xmm1, %xmm2
849 ; SSE2-NEXT:    por %xmm0, %xmm2
850 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
851 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
852 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
853 ; SSE2-NEXT:    pand %xmm1, %xmm2
854 ; SSE2-NEXT:    pandn %xmm0, %xmm1
855 ; SSE2-NEXT:    por %xmm2, %xmm1
856 ; SSE2-NEXT:    movd %xmm1, %eax
857 ; SSE2-NEXT:    retq
859 ; SSE41-LABEL: test_v16i32:
860 ; SSE41:       # %bb.0:
861 ; SSE41-NEXT:    pmaxsd %xmm3, %xmm1
862 ; SSE41-NEXT:    pmaxsd %xmm2, %xmm1
863 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
864 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
865 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
866 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
867 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
868 ; SSE41-NEXT:    movd %xmm1, %eax
869 ; SSE41-NEXT:    retq
871 ; AVX1-LABEL: test_v16i32:
872 ; AVX1:       # %bb.0:
873 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
874 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
875 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
876 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm1, %xmm1
877 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
878 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
879 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
880 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
881 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
882 ; AVX1-NEXT:    vmovd %xmm0, %eax
883 ; AVX1-NEXT:    vzeroupper
884 ; AVX1-NEXT:    retq
886 ; AVX2-LABEL: test_v16i32:
887 ; AVX2:       # %bb.0:
888 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
889 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
890 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
891 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
892 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
893 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
894 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
895 ; AVX2-NEXT:    vmovd %xmm0, %eax
896 ; AVX2-NEXT:    vzeroupper
897 ; AVX2-NEXT:    retq
899 ; AVX512-LABEL: test_v16i32:
900 ; AVX512:       # %bb.0:
901 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
902 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
903 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
904 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
905 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
906 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
907 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
908 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
909 ; AVX512-NEXT:    vmovd %xmm0, %eax
910 ; AVX512-NEXT:    vzeroupper
911 ; AVX512-NEXT:    retq
912   %1 = call i32 @llvm.experimental.vector.reduce.smax.v16i32(<16 x i32> %a0)
913   ret i32 %1
916 define i32 @test_v32i32(<32 x i32> %a0) {
917 ; SSE2-LABEL: test_v32i32:
918 ; SSE2:       # %bb.0:
919 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
920 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
921 ; SSE2-NEXT:    pand %xmm8, %xmm2
922 ; SSE2-NEXT:    pandn %xmm6, %xmm8
923 ; SSE2-NEXT:    por %xmm2, %xmm8
924 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
925 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
926 ; SSE2-NEXT:    pand %xmm2, %xmm0
927 ; SSE2-NEXT:    pandn %xmm4, %xmm2
928 ; SSE2-NEXT:    por %xmm0, %xmm2
929 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
930 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
931 ; SSE2-NEXT:    pand %xmm0, %xmm3
932 ; SSE2-NEXT:    pandn %xmm7, %xmm0
933 ; SSE2-NEXT:    por %xmm3, %xmm0
934 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
935 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
936 ; SSE2-NEXT:    pand %xmm3, %xmm1
937 ; SSE2-NEXT:    pandn %xmm5, %xmm3
938 ; SSE2-NEXT:    por %xmm1, %xmm3
939 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
940 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
941 ; SSE2-NEXT:    pand %xmm1, %xmm3
942 ; SSE2-NEXT:    pandn %xmm0, %xmm1
943 ; SSE2-NEXT:    por %xmm3, %xmm1
944 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
945 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm0
946 ; SSE2-NEXT:    pand %xmm0, %xmm2
947 ; SSE2-NEXT:    pandn %xmm8, %xmm0
948 ; SSE2-NEXT:    por %xmm2, %xmm0
949 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
950 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
951 ; SSE2-NEXT:    pand %xmm2, %xmm0
952 ; SSE2-NEXT:    pandn %xmm1, %xmm2
953 ; SSE2-NEXT:    por %xmm0, %xmm2
954 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
955 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
956 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
957 ; SSE2-NEXT:    pand %xmm1, %xmm2
958 ; SSE2-NEXT:    pandn %xmm0, %xmm1
959 ; SSE2-NEXT:    por %xmm2, %xmm1
960 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
961 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
962 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
963 ; SSE2-NEXT:    pand %xmm2, %xmm1
964 ; SSE2-NEXT:    pandn %xmm0, %xmm2
965 ; SSE2-NEXT:    por %xmm1, %xmm2
966 ; SSE2-NEXT:    movd %xmm2, %eax
967 ; SSE2-NEXT:    retq
969 ; SSE41-LABEL: test_v32i32:
970 ; SSE41:       # %bb.0:
971 ; SSE41-NEXT:    pmaxsd %xmm6, %xmm2
972 ; SSE41-NEXT:    pmaxsd %xmm7, %xmm3
973 ; SSE41-NEXT:    pmaxsd %xmm5, %xmm3
974 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm3
975 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm2
976 ; SSE41-NEXT:    pmaxsd %xmm3, %xmm2
977 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm2
978 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
979 ; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
980 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
981 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
982 ; SSE41-NEXT:    movd %xmm1, %eax
983 ; SSE41-NEXT:    retq
985 ; AVX1-LABEL: test_v32i32:
986 ; AVX1:       # %bb.0:
987 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm4
988 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
989 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
990 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
991 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
992 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
993 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
994 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
995 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm2, %xmm2
996 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm2, %xmm1
997 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
998 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
999 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1000 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1001 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1002 ; AVX1-NEXT:    vmovd %xmm0, %eax
1003 ; AVX1-NEXT:    vzeroupper
1004 ; AVX1-NEXT:    retq
1006 ; AVX2-LABEL: test_v32i32:
1007 ; AVX2:       # %bb.0:
1008 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
1009 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm2, %ymm1
1010 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1011 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1012 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1013 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1014 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1015 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1016 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1017 ; AVX2-NEXT:    vmovd %xmm0, %eax
1018 ; AVX2-NEXT:    vzeroupper
1019 ; AVX2-NEXT:    retq
1021 ; AVX512-LABEL: test_v32i32:
1022 ; AVX512:       # %bb.0:
1023 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
1024 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1025 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
1026 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1027 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1028 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1029 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1030 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1031 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1032 ; AVX512-NEXT:    vmovd %xmm0, %eax
1033 ; AVX512-NEXT:    vzeroupper
1034 ; AVX512-NEXT:    retq
1035   %1 = call i32 @llvm.experimental.vector.reduce.smax.v32i32(<32 x i32> %a0)
1036   ret i32 %1
1040 ; vXi16
1043 define i16 @test_v2i16(<2 x i16> %a0) {
1044 ; SSE-LABEL: test_v2i16:
1045 ; SSE:       # %bb.0:
1046 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1047 ; SSE-NEXT:    psrld $16, %xmm1
1048 ; SSE-NEXT:    pmaxsw %xmm0, %xmm1
1049 ; SSE-NEXT:    movd %xmm1, %eax
1050 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1051 ; SSE-NEXT:    retq
1053 ; AVX-LABEL: test_v2i16:
1054 ; AVX:       # %bb.0:
1055 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1056 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1057 ; AVX-NEXT:    vmovd %xmm0, %eax
1058 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1059 ; AVX-NEXT:    retq
1061 ; AVX512-LABEL: test_v2i16:
1062 ; AVX512:       # %bb.0:
1063 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1064 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1065 ; AVX512-NEXT:    vmovd %xmm0, %eax
1066 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1067 ; AVX512-NEXT:    retq
1068   %1 = call i16 @llvm.experimental.vector.reduce.smax.v2i16(<2 x i16> %a0)
1069   ret i16 %1
1072 define i16 @test_v4i16(<4 x i16> %a0) {
1073 ; SSE-LABEL: test_v4i16:
1074 ; SSE:       # %bb.0:
1075 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1076 ; SSE-NEXT:    pmaxsw %xmm0, %xmm1
1077 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1078 ; SSE-NEXT:    psrld $16, %xmm0
1079 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
1080 ; SSE-NEXT:    movd %xmm0, %eax
1081 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1082 ; SSE-NEXT:    retq
1084 ; AVX-LABEL: test_v4i16:
1085 ; AVX:       # %bb.0:
1086 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1087 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1088 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1089 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1090 ; AVX-NEXT:    vmovd %xmm0, %eax
1091 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1092 ; AVX-NEXT:    retq
1094 ; AVX512-LABEL: test_v4i16:
1095 ; AVX512:       # %bb.0:
1096 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1097 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1098 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1099 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1100 ; AVX512-NEXT:    vmovd %xmm0, %eax
1101 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1102 ; AVX512-NEXT:    retq
1103   %1 = call i16 @llvm.experimental.vector.reduce.smax.v4i16(<4 x i16> %a0)
1104   ret i16 %1
1107 define i16 @test_v8i16(<8 x i16> %a0) {
1108 ; SSE2-LABEL: test_v8i16:
1109 ; SSE2:       # %bb.0:
1110 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1111 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1112 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1113 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1114 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1115 ; SSE2-NEXT:    psrld $16, %xmm1
1116 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1117 ; SSE2-NEXT:    movd %xmm1, %eax
1118 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1119 ; SSE2-NEXT:    retq
1121 ; SSE41-LABEL: test_v8i16:
1122 ; SSE41:       # %bb.0:
1123 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1124 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1125 ; SSE41-NEXT:    movd %xmm0, %eax
1126 ; SSE41-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1127 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1128 ; SSE41-NEXT:    retq
1130 ; AVX-LABEL: test_v8i16:
1131 ; AVX:       # %bb.0:
1132 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1133 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1134 ; AVX-NEXT:    vmovd %xmm0, %eax
1135 ; AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1136 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1137 ; AVX-NEXT:    retq
1139 ; AVX512-LABEL: test_v8i16:
1140 ; AVX512:       # %bb.0:
1141 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1142 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1143 ; AVX512-NEXT:    vmovd %xmm0, %eax
1144 ; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1145 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1146 ; AVX512-NEXT:    retq
1147   %1 = call i16 @llvm.experimental.vector.reduce.smax.v8i16(<8 x i16> %a0)
1148   ret i16 %1
1151 define i16 @test_v16i16(<16 x i16> %a0) {
1152 ; SSE2-LABEL: test_v16i16:
1153 ; SSE2:       # %bb.0:
1154 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1155 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1156 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1157 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1158 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1159 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1160 ; SSE2-NEXT:    psrld $16, %xmm1
1161 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1162 ; SSE2-NEXT:    movd %xmm1, %eax
1163 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1164 ; SSE2-NEXT:    retq
1166 ; SSE41-LABEL: test_v16i16:
1167 ; SSE41:       # %bb.0:
1168 ; SSE41-NEXT:    pmaxsw %xmm1, %xmm0
1169 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1170 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1171 ; SSE41-NEXT:    movd %xmm0, %eax
1172 ; SSE41-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1173 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1174 ; SSE41-NEXT:    retq
1176 ; AVX1-LABEL: test_v16i16:
1177 ; AVX1:       # %bb.0:
1178 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1179 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1180 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1181 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1182 ; AVX1-NEXT:    vmovd %xmm0, %eax
1183 ; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1184 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1185 ; AVX1-NEXT:    vzeroupper
1186 ; AVX1-NEXT:    retq
1188 ; AVX2-LABEL: test_v16i16:
1189 ; AVX2:       # %bb.0:
1190 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1191 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1192 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1193 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1194 ; AVX2-NEXT:    vmovd %xmm0, %eax
1195 ; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1196 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1197 ; AVX2-NEXT:    vzeroupper
1198 ; AVX2-NEXT:    retq
1200 ; AVX512-LABEL: test_v16i16:
1201 ; AVX512:       # %bb.0:
1202 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1203 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1204 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1205 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1206 ; AVX512-NEXT:    vmovd %xmm0, %eax
1207 ; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1208 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1209 ; AVX512-NEXT:    vzeroupper
1210 ; AVX512-NEXT:    retq
1211   %1 = call i16 @llvm.experimental.vector.reduce.smax.v16i16(<16 x i16> %a0)
1212   ret i16 %1
1215 define i16 @test_v32i16(<32 x i16> %a0) {
1216 ; SSE2-LABEL: test_v32i16:
1217 ; SSE2:       # %bb.0:
1218 ; SSE2-NEXT:    pmaxsw %xmm3, %xmm1
1219 ; SSE2-NEXT:    pmaxsw %xmm2, %xmm1
1220 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1221 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1222 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1223 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1224 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1225 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1226 ; SSE2-NEXT:    psrld $16, %xmm0
1227 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1228 ; SSE2-NEXT:    movd %xmm0, %eax
1229 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1230 ; SSE2-NEXT:    retq
1232 ; SSE41-LABEL: test_v32i16:
1233 ; SSE41:       # %bb.0:
1234 ; SSE41-NEXT:    pmaxsw %xmm3, %xmm1
1235 ; SSE41-NEXT:    pmaxsw %xmm2, %xmm1
1236 ; SSE41-NEXT:    pmaxsw %xmm0, %xmm1
1237 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm1
1238 ; SSE41-NEXT:    phminposuw %xmm1, %xmm0
1239 ; SSE41-NEXT:    movd %xmm0, %eax
1240 ; SSE41-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1241 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1242 ; SSE41-NEXT:    retq
1244 ; AVX1-LABEL: test_v32i16:
1245 ; AVX1:       # %bb.0:
1246 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1247 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1248 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1249 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm1, %xmm1
1250 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1251 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1252 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1253 ; AVX1-NEXT:    vmovd %xmm0, %eax
1254 ; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1255 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1256 ; AVX1-NEXT:    vzeroupper
1257 ; AVX1-NEXT:    retq
1259 ; AVX2-LABEL: test_v32i16:
1260 ; AVX2:       # %bb.0:
1261 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1262 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1263 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1264 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1265 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1266 ; AVX2-NEXT:    vmovd %xmm0, %eax
1267 ; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1268 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1269 ; AVX2-NEXT:    vzeroupper
1270 ; AVX2-NEXT:    retq
1272 ; AVX512-LABEL: test_v32i16:
1273 ; AVX512:       # %bb.0:
1274 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1275 ; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1276 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1277 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1278 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1279 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1280 ; AVX512-NEXT:    vmovd %xmm0, %eax
1281 ; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1282 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1283 ; AVX512-NEXT:    vzeroupper
1284 ; AVX512-NEXT:    retq
1285   %1 = call i16 @llvm.experimental.vector.reduce.smax.v32i16(<32 x i16> %a0)
1286   ret i16 %1
1289 define i16 @test_v64i16(<64 x i16> %a0) {
1290 ; SSE2-LABEL: test_v64i16:
1291 ; SSE2:       # %bb.0:
1292 ; SSE2-NEXT:    pmaxsw %xmm6, %xmm2
1293 ; SSE2-NEXT:    pmaxsw %xmm7, %xmm3
1294 ; SSE2-NEXT:    pmaxsw %xmm5, %xmm3
1295 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm3
1296 ; SSE2-NEXT:    pmaxsw %xmm4, %xmm2
1297 ; SSE2-NEXT:    pmaxsw %xmm3, %xmm2
1298 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm2
1299 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1300 ; SSE2-NEXT:    pmaxsw %xmm2, %xmm0
1301 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1302 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1303 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1304 ; SSE2-NEXT:    psrld $16, %xmm0
1305 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1306 ; SSE2-NEXT:    movd %xmm0, %eax
1307 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1308 ; SSE2-NEXT:    retq
1310 ; SSE41-LABEL: test_v64i16:
1311 ; SSE41:       # %bb.0:
1312 ; SSE41-NEXT:    pmaxsw %xmm7, %xmm3
1313 ; SSE41-NEXT:    pmaxsw %xmm5, %xmm3
1314 ; SSE41-NEXT:    pmaxsw %xmm1, %xmm3
1315 ; SSE41-NEXT:    pmaxsw %xmm6, %xmm2
1316 ; SSE41-NEXT:    pmaxsw %xmm4, %xmm2
1317 ; SSE41-NEXT:    pmaxsw %xmm3, %xmm2
1318 ; SSE41-NEXT:    pmaxsw %xmm0, %xmm2
1319 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm2
1320 ; SSE41-NEXT:    phminposuw %xmm2, %xmm0
1321 ; SSE41-NEXT:    movd %xmm0, %eax
1322 ; SSE41-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1323 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1324 ; SSE41-NEXT:    retq
1326 ; AVX1-LABEL: test_v64i16:
1327 ; AVX1:       # %bb.0:
1328 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1329 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1330 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1331 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1332 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1333 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1334 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1335 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
1336 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm2, %xmm1
1337 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm1, %xmm1
1338 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1339 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1340 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1341 ; AVX1-NEXT:    vmovd %xmm0, %eax
1342 ; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1343 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1344 ; AVX1-NEXT:    vzeroupper
1345 ; AVX1-NEXT:    retq
1347 ; AVX2-LABEL: test_v64i16:
1348 ; AVX2:       # %bb.0:
1349 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
1350 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm2, %ymm1
1351 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1352 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1353 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1354 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1355 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1356 ; AVX2-NEXT:    vmovd %xmm0, %eax
1357 ; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1358 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1359 ; AVX2-NEXT:    vzeroupper
1360 ; AVX2-NEXT:    retq
1362 ; AVX512-LABEL: test_v64i16:
1363 ; AVX512:       # %bb.0:
1364 ; AVX512-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
1365 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1366 ; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1367 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1368 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1369 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1370 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1371 ; AVX512-NEXT:    vmovd %xmm0, %eax
1372 ; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1373 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1374 ; AVX512-NEXT:    vzeroupper
1375 ; AVX512-NEXT:    retq
1376   %1 = call i16 @llvm.experimental.vector.reduce.smax.v64i16(<64 x i16> %a0)
1377   ret i16 %1
1381 ; vXi8
1384 define i8 @test_v2i8(<2 x i8> %a0) {
1385 ; SSE2-LABEL: test_v2i8:
1386 ; SSE2:       # %bb.0:
1387 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1388 ; SSE2-NEXT:    psrlw $8, %xmm1
1389 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1390 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1391 ; SSE2-NEXT:    pand %xmm2, %xmm0
1392 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1393 ; SSE2-NEXT:    por %xmm0, %xmm2
1394 ; SSE2-NEXT:    movd %xmm2, %eax
1395 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1396 ; SSE2-NEXT:    retq
1398 ; SSE41-LABEL: test_v2i8:
1399 ; SSE41:       # %bb.0:
1400 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1401 ; SSE41-NEXT:    psrlw $8, %xmm1
1402 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
1403 ; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1404 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1405 ; SSE41-NEXT:    retq
1407 ; AVX-LABEL: test_v2i8:
1408 ; AVX:       # %bb.0:
1409 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1410 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1411 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1412 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1413 ; AVX-NEXT:    retq
1415 ; AVX512-LABEL: test_v2i8:
1416 ; AVX512:       # %bb.0:
1417 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1418 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1419 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1420 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1421 ; AVX512-NEXT:    retq
1422   %1 = call i8 @llvm.experimental.vector.reduce.smax.v2i8(<2 x i8> %a0)
1423   ret i8 %1
1426 define i8 @test_v4i8(<4 x i8> %a0) {
1427 ; SSE2-LABEL: test_v4i8:
1428 ; SSE2:       # %bb.0:
1429 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1430 ; SSE2-NEXT:    psrld $16, %xmm1
1431 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1432 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1433 ; SSE2-NEXT:    pand %xmm2, %xmm0
1434 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1435 ; SSE2-NEXT:    por %xmm0, %xmm2
1436 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1437 ; SSE2-NEXT:    psrlw $8, %xmm0
1438 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1439 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1440 ; SSE2-NEXT:    pand %xmm1, %xmm2
1441 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1442 ; SSE2-NEXT:    por %xmm2, %xmm1
1443 ; SSE2-NEXT:    movd %xmm1, %eax
1444 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1445 ; SSE2-NEXT:    retq
1447 ; SSE41-LABEL: test_v4i8:
1448 ; SSE41:       # %bb.0:
1449 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1450 ; SSE41-NEXT:    psrld $16, %xmm1
1451 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
1452 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1453 ; SSE41-NEXT:    psrlw $8, %xmm0
1454 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
1455 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1456 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1457 ; SSE41-NEXT:    retq
1459 ; AVX-LABEL: test_v4i8:
1460 ; AVX:       # %bb.0:
1461 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1462 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1463 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1464 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1465 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1466 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1467 ; AVX-NEXT:    retq
1469 ; AVX512-LABEL: test_v4i8:
1470 ; AVX512:       # %bb.0:
1471 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1472 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1473 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1474 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1475 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1476 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1477 ; AVX512-NEXT:    retq
1478   %1 = call i8 @llvm.experimental.vector.reduce.smax.v4i8(<4 x i8> %a0)
1479   ret i8 %1
1482 define i8 @test_v8i8(<8 x i8> %a0) {
1483 ; SSE2-LABEL: test_v8i8:
1484 ; SSE2:       # %bb.0:
1485 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1486 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1487 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1488 ; SSE2-NEXT:    pand %xmm2, %xmm0
1489 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1490 ; SSE2-NEXT:    por %xmm0, %xmm2
1491 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1492 ; SSE2-NEXT:    psrld $16, %xmm0
1493 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1494 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1495 ; SSE2-NEXT:    pand %xmm1, %xmm2
1496 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1497 ; SSE2-NEXT:    por %xmm2, %xmm1
1498 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1499 ; SSE2-NEXT:    psrlw $8, %xmm0
1500 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1501 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1502 ; SSE2-NEXT:    pand %xmm2, %xmm1
1503 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1504 ; SSE2-NEXT:    por %xmm1, %xmm2
1505 ; SSE2-NEXT:    movd %xmm2, %eax
1506 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1507 ; SSE2-NEXT:    retq
1509 ; SSE41-LABEL: test_v8i8:
1510 ; SSE41:       # %bb.0:
1511 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1512 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
1513 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1514 ; SSE41-NEXT:    psrld $16, %xmm0
1515 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
1516 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1517 ; SSE41-NEXT:    psrlw $8, %xmm1
1518 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
1519 ; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1520 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1521 ; SSE41-NEXT:    retq
1523 ; AVX-LABEL: test_v8i8:
1524 ; AVX:       # %bb.0:
1525 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1526 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1527 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1528 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1529 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1530 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1531 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1532 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1533 ; AVX-NEXT:    retq
1535 ; AVX512-LABEL: test_v8i8:
1536 ; AVX512:       # %bb.0:
1537 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1538 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1539 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1540 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1541 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1542 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1543 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1544 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1545 ; AVX512-NEXT:    retq
1546   %1 = call i8 @llvm.experimental.vector.reduce.smax.v8i8(<8 x i8> %a0)
1547   ret i8 %1
1550 define i8 @test_v16i8(<16 x i8> %a0) {
1551 ; SSE2-LABEL: test_v16i8:
1552 ; SSE2:       # %bb.0:
1553 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1554 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1555 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1556 ; SSE2-NEXT:    pand %xmm2, %xmm0
1557 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1558 ; SSE2-NEXT:    por %xmm0, %xmm2
1559 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1560 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1561 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1562 ; SSE2-NEXT:    pand %xmm1, %xmm2
1563 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1564 ; SSE2-NEXT:    por %xmm2, %xmm1
1565 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1566 ; SSE2-NEXT:    psrld $16, %xmm0
1567 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1568 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1569 ; SSE2-NEXT:    pand %xmm2, %xmm1
1570 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1571 ; SSE2-NEXT:    por %xmm1, %xmm2
1572 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1573 ; SSE2-NEXT:    psrlw $8, %xmm0
1574 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1575 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1576 ; SSE2-NEXT:    pand %xmm1, %xmm2
1577 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1578 ; SSE2-NEXT:    por %xmm2, %xmm1
1579 ; SSE2-NEXT:    movd %xmm1, %eax
1580 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1581 ; SSE2-NEXT:    retq
1583 ; SSE41-LABEL: test_v16i8:
1584 ; SSE41:       # %bb.0:
1585 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1586 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1587 ; SSE41-NEXT:    psrlw $8, %xmm1
1588 ; SSE41-NEXT:    pminub %xmm0, %xmm1
1589 ; SSE41-NEXT:    phminposuw %xmm1, %xmm0
1590 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1591 ; SSE41-NEXT:    xorb $127, %al
1592 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1593 ; SSE41-NEXT:    retq
1595 ; AVX-LABEL: test_v16i8:
1596 ; AVX:       # %bb.0:
1597 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1598 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1599 ; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1600 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1601 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1602 ; AVX-NEXT:    xorb $127, %al
1603 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
1604 ; AVX-NEXT:    retq
1606 ; AVX512-LABEL: test_v16i8:
1607 ; AVX512:       # %bb.0:
1608 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1609 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1610 ; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1611 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1612 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1613 ; AVX512-NEXT:    xorb $127, %al
1614 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1615 ; AVX512-NEXT:    retq
1616   %1 = call i8 @llvm.experimental.vector.reduce.smax.v16i8(<16 x i8> %a0)
1617   ret i8 %1
1620 define i8 @test_v32i8(<32 x i8> %a0) {
1621 ; SSE2-LABEL: test_v32i8:
1622 ; SSE2:       # %bb.0:
1623 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1624 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1625 ; SSE2-NEXT:    pand %xmm2, %xmm0
1626 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1627 ; SSE2-NEXT:    por %xmm0, %xmm2
1628 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1629 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1630 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1631 ; SSE2-NEXT:    pand %xmm1, %xmm2
1632 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1633 ; SSE2-NEXT:    por %xmm2, %xmm1
1634 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1635 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1636 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1637 ; SSE2-NEXT:    pand %xmm2, %xmm1
1638 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1639 ; SSE2-NEXT:    por %xmm1, %xmm2
1640 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1641 ; SSE2-NEXT:    psrld $16, %xmm0
1642 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1643 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1644 ; SSE2-NEXT:    pand %xmm1, %xmm2
1645 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1646 ; SSE2-NEXT:    por %xmm2, %xmm1
1647 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1648 ; SSE2-NEXT:    psrlw $8, %xmm0
1649 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1650 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1651 ; SSE2-NEXT:    pand %xmm2, %xmm1
1652 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1653 ; SSE2-NEXT:    por %xmm1, %xmm2
1654 ; SSE2-NEXT:    movd %xmm2, %eax
1655 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1656 ; SSE2-NEXT:    retq
1658 ; SSE41-LABEL: test_v32i8:
1659 ; SSE41:       # %bb.0:
1660 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
1661 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1662 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1663 ; SSE41-NEXT:    psrlw $8, %xmm1
1664 ; SSE41-NEXT:    pminub %xmm0, %xmm1
1665 ; SSE41-NEXT:    phminposuw %xmm1, %xmm0
1666 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1667 ; SSE41-NEXT:    xorb $127, %al
1668 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1669 ; SSE41-NEXT:    retq
1671 ; AVX1-LABEL: test_v32i8:
1672 ; AVX1:       # %bb.0:
1673 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1674 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1675 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1676 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1677 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1678 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1679 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1680 ; AVX1-NEXT:    xorb $127, %al
1681 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1682 ; AVX1-NEXT:    vzeroupper
1683 ; AVX1-NEXT:    retq
1685 ; AVX2-LABEL: test_v32i8:
1686 ; AVX2:       # %bb.0:
1687 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1688 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1689 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1690 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1691 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1692 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1693 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1694 ; AVX2-NEXT:    xorb $127, %al
1695 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1696 ; AVX2-NEXT:    vzeroupper
1697 ; AVX2-NEXT:    retq
1699 ; AVX512-LABEL: test_v32i8:
1700 ; AVX512:       # %bb.0:
1701 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1702 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1703 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1704 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1705 ; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1706 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1707 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1708 ; AVX512-NEXT:    xorb $127, %al
1709 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1710 ; AVX512-NEXT:    vzeroupper
1711 ; AVX512-NEXT:    retq
1712   %1 = call i8 @llvm.experimental.vector.reduce.smax.v32i8(<32 x i8> %a0)
1713   ret i8 %1
1716 define i8 @test_v64i8(<64 x i8> %a0) {
1717 ; SSE2-LABEL: test_v64i8:
1718 ; SSE2:       # %bb.0:
1719 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1720 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
1721 ; SSE2-NEXT:    pand %xmm4, %xmm1
1722 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1723 ; SSE2-NEXT:    por %xmm1, %xmm4
1724 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1725 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1726 ; SSE2-NEXT:    pand %xmm1, %xmm0
1727 ; SSE2-NEXT:    pandn %xmm2, %xmm1
1728 ; SSE2-NEXT:    por %xmm0, %xmm1
1729 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1730 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm0
1731 ; SSE2-NEXT:    pand %xmm0, %xmm1
1732 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1733 ; SSE2-NEXT:    por %xmm1, %xmm0
1734 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1735 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1736 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1737 ; SSE2-NEXT:    pand %xmm2, %xmm0
1738 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1739 ; SSE2-NEXT:    por %xmm0, %xmm2
1740 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1741 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1742 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1743 ; SSE2-NEXT:    pand %xmm1, %xmm2
1744 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1745 ; SSE2-NEXT:    por %xmm2, %xmm1
1746 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1747 ; SSE2-NEXT:    psrld $16, %xmm0
1748 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1749 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1750 ; SSE2-NEXT:    pand %xmm2, %xmm1
1751 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1752 ; SSE2-NEXT:    por %xmm1, %xmm2
1753 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1754 ; SSE2-NEXT:    psrlw $8, %xmm0
1755 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1756 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1757 ; SSE2-NEXT:    pand %xmm1, %xmm2
1758 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1759 ; SSE2-NEXT:    por %xmm2, %xmm1
1760 ; SSE2-NEXT:    movd %xmm1, %eax
1761 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1762 ; SSE2-NEXT:    retq
1764 ; SSE41-LABEL: test_v64i8:
1765 ; SSE41:       # %bb.0:
1766 ; SSE41-NEXT:    pmaxsb %xmm3, %xmm1
1767 ; SSE41-NEXT:    pmaxsb %xmm2, %xmm1
1768 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
1769 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm1
1770 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1771 ; SSE41-NEXT:    psrlw $8, %xmm0
1772 ; SSE41-NEXT:    pminub %xmm1, %xmm0
1773 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1774 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1775 ; SSE41-NEXT:    xorb $127, %al
1776 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1777 ; SSE41-NEXT:    retq
1779 ; AVX1-LABEL: test_v64i8:
1780 ; AVX1:       # %bb.0:
1781 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1782 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1783 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
1784 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm1, %xmm1
1785 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1786 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1787 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1788 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1789 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1790 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1791 ; AVX1-NEXT:    xorb $127, %al
1792 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1793 ; AVX1-NEXT:    vzeroupper
1794 ; AVX1-NEXT:    retq
1796 ; AVX2-LABEL: test_v64i8:
1797 ; AVX2:       # %bb.0:
1798 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1799 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1800 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1801 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1802 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1803 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1804 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1805 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1806 ; AVX2-NEXT:    xorb $127, %al
1807 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1808 ; AVX2-NEXT:    vzeroupper
1809 ; AVX2-NEXT:    retq
1811 ; AVX512-LABEL: test_v64i8:
1812 ; AVX512:       # %bb.0:
1813 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1814 ; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1815 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1816 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1817 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1818 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1819 ; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1820 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1821 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1822 ; AVX512-NEXT:    xorb $127, %al
1823 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1824 ; AVX512-NEXT:    vzeroupper
1825 ; AVX512-NEXT:    retq
1826   %1 = call i8 @llvm.experimental.vector.reduce.smax.v64i8(<64 x i8> %a0)
1827   ret i8 %1
1830 define i8 @test_v128i8(<128 x i8> %a0) {
1831 ; SSE2-LABEL: test_v128i8:
1832 ; SSE2:       # %bb.0:
1833 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
1834 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm8
1835 ; SSE2-NEXT:    pand %xmm8, %xmm2
1836 ; SSE2-NEXT:    pandn %xmm6, %xmm8
1837 ; SSE2-NEXT:    por %xmm2, %xmm8
1838 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1839 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
1840 ; SSE2-NEXT:    pand %xmm2, %xmm0
1841 ; SSE2-NEXT:    pandn %xmm4, %xmm2
1842 ; SSE2-NEXT:    por %xmm0, %xmm2
1843 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
1844 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm0
1845 ; SSE2-NEXT:    pand %xmm0, %xmm3
1846 ; SSE2-NEXT:    pandn %xmm7, %xmm0
1847 ; SSE2-NEXT:    por %xmm3, %xmm0
1848 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1849 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm3
1850 ; SSE2-NEXT:    pand %xmm3, %xmm1
1851 ; SSE2-NEXT:    pandn %xmm5, %xmm3
1852 ; SSE2-NEXT:    por %xmm1, %xmm3
1853 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1854 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1855 ; SSE2-NEXT:    pand %xmm1, %xmm3
1856 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1857 ; SSE2-NEXT:    por %xmm3, %xmm1
1858 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1859 ; SSE2-NEXT:    pcmpgtb %xmm8, %xmm0
1860 ; SSE2-NEXT:    pand %xmm0, %xmm2
1861 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1862 ; SSE2-NEXT:    por %xmm2, %xmm0
1863 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1864 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1865 ; SSE2-NEXT:    pand %xmm2, %xmm0
1866 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1867 ; SSE2-NEXT:    por %xmm0, %xmm2
1868 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1869 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1870 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1871 ; SSE2-NEXT:    pand %xmm1, %xmm2
1872 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1873 ; SSE2-NEXT:    por %xmm2, %xmm1
1874 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1875 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1876 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1877 ; SSE2-NEXT:    pand %xmm2, %xmm1
1878 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1879 ; SSE2-NEXT:    por %xmm1, %xmm2
1880 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1881 ; SSE2-NEXT:    psrld $16, %xmm0
1882 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1883 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1884 ; SSE2-NEXT:    pand %xmm1, %xmm2
1885 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1886 ; SSE2-NEXT:    por %xmm2, %xmm1
1887 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1888 ; SSE2-NEXT:    psrlw $8, %xmm0
1889 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1890 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1891 ; SSE2-NEXT:    pand %xmm2, %xmm1
1892 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1893 ; SSE2-NEXT:    por %xmm1, %xmm2
1894 ; SSE2-NEXT:    movd %xmm2, %eax
1895 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1896 ; SSE2-NEXT:    retq
1898 ; SSE41-LABEL: test_v128i8:
1899 ; SSE41:       # %bb.0:
1900 ; SSE41-NEXT:    pmaxsb %xmm7, %xmm3
1901 ; SSE41-NEXT:    pmaxsb %xmm5, %xmm3
1902 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm3
1903 ; SSE41-NEXT:    pmaxsb %xmm6, %xmm2
1904 ; SSE41-NEXT:    pmaxsb %xmm4, %xmm2
1905 ; SSE41-NEXT:    pmaxsb %xmm3, %xmm2
1906 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm2
1907 ; SSE41-NEXT:    pxor {{.*}}(%rip), %xmm2
1908 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1909 ; SSE41-NEXT:    psrlw $8, %xmm0
1910 ; SSE41-NEXT:    pminub %xmm2, %xmm0
1911 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1912 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1913 ; SSE41-NEXT:    xorb $127, %al
1914 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1915 ; SSE41-NEXT:    retq
1917 ; AVX1-LABEL: test_v128i8:
1918 ; AVX1:       # %bb.0:
1919 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1920 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1921 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1922 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1923 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1924 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1925 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1926 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
1927 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm2, %xmm1
1928 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm1, %xmm1
1929 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1930 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1931 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1932 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1933 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1934 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1935 ; AVX1-NEXT:    xorb $127, %al
1936 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1937 ; AVX1-NEXT:    vzeroupper
1938 ; AVX1-NEXT:    retq
1940 ; AVX2-LABEL: test_v128i8:
1941 ; AVX2:       # %bb.0:
1942 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
1943 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm2, %ymm1
1944 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1945 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1946 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1947 ; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1948 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1949 ; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1950 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1951 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1952 ; AVX2-NEXT:    xorb $127, %al
1953 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1954 ; AVX2-NEXT:    vzeroupper
1955 ; AVX2-NEXT:    retq
1957 ; AVX512-LABEL: test_v128i8:
1958 ; AVX512:       # %bb.0:
1959 ; AVX512-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
1960 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1961 ; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1962 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1963 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1964 ; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1965 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1966 ; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1967 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1968 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1969 ; AVX512-NEXT:    xorb $127, %al
1970 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1971 ; AVX512-NEXT:    vzeroupper
1972 ; AVX512-NEXT:    retq
1973   %1 = call i8 @llvm.experimental.vector.reduce.smax.v128i8(<128 x i8> %a0)
1974   ret i8 %1
1977 declare i64 @llvm.experimental.vector.reduce.smax.v2i64(<2 x i64>)
1978 declare i64 @llvm.experimental.vector.reduce.smax.v4i64(<4 x i64>)
1979 declare i64 @llvm.experimental.vector.reduce.smax.v8i64(<8 x i64>)
1980 declare i64 @llvm.experimental.vector.reduce.smax.v16i64(<16 x i64>)
1982 declare i32 @llvm.experimental.vector.reduce.smax.v2i32(<2 x i32>)
1983 declare i32 @llvm.experimental.vector.reduce.smax.v4i32(<4 x i32>)
1984 declare i32 @llvm.experimental.vector.reduce.smax.v8i32(<8 x i32>)
1985 declare i32 @llvm.experimental.vector.reduce.smax.v16i32(<16 x i32>)
1986 declare i32 @llvm.experimental.vector.reduce.smax.v32i32(<32 x i32>)
1988 declare i16 @llvm.experimental.vector.reduce.smax.v2i16(<2 x i16>)
1989 declare i16 @llvm.experimental.vector.reduce.smax.v4i16(<4 x i16>)
1990 declare i16 @llvm.experimental.vector.reduce.smax.v8i16(<8 x i16>)
1991 declare i16 @llvm.experimental.vector.reduce.smax.v16i16(<16 x i16>)
1992 declare i16 @llvm.experimental.vector.reduce.smax.v32i16(<32 x i16>)
1993 declare i16 @llvm.experimental.vector.reduce.smax.v64i16(<64 x i16>)
1995 declare i8 @llvm.experimental.vector.reduce.smax.v2i8(<2 x i8>)
1996 declare i8 @llvm.experimental.vector.reduce.smax.v4i8(<4 x i8>)
1997 declare i8 @llvm.experimental.vector.reduce.smax.v8i8(<8 x i8>)
1998 declare i8 @llvm.experimental.vector.reduce.smax.v16i8(<16 x i8>)
1999 declare i8 @llvm.experimental.vector.reduce.smax.v32i8(<32 x i8>)
2000 declare i8 @llvm.experimental.vector.reduce.smax.v64i8(<64 x i8>)
2001 declare i8 @llvm.experimental.vector.reduce.smax.v128i8(<128 x i8>)