llvm.org GIT mirror llvm / d85f3b3
[X86][SSE] Tests for SMAX/SMIN/UMAX/UMIN vector instructions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244944 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 4 years ago
2 changed file(s) with 3333 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
7
8 ;
9 ; Signed Maximum (GT)
10 ;
11
12 define <2 x i64> @max_gt_v2i64(<2 x i64> %a, <2 x i64> %b) {
13 ; SSE2-LABEL: max_gt_v2i64:
14 ; SSE2: # BB#0:
15 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
16 ; SSE2-NEXT: movdqa %xmm1, %xmm3
17 ; SSE2-NEXT: pxor %xmm2, %xmm3
18 ; SSE2-NEXT: pxor %xmm0, %xmm2
19 ; SSE2-NEXT: movdqa %xmm2, %xmm4
20 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
21 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
22 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
23 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
24 ; SSE2-NEXT: pand %xmm5, %xmm2
25 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
26 ; SSE2-NEXT: por %xmm2, %xmm3
27 ; SSE2-NEXT: pand %xmm3, %xmm0
28 ; SSE2-NEXT: pandn %xmm1, %xmm3
29 ; SSE2-NEXT: por %xmm3, %xmm0
30 ; SSE2-NEXT: retq
31 ;
32 ; SSE41-LABEL: max_gt_v2i64:
33 ; SSE41: # BB#0:
34 ; SSE41-NEXT: movdqa %xmm0, %xmm2
35 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
36 ; SSE41-NEXT: movdqa %xmm1, %xmm3
37 ; SSE41-NEXT: pxor %xmm0, %xmm3
38 ; SSE41-NEXT: pxor %xmm2, %xmm0
39 ; SSE41-NEXT: movdqa %xmm0, %xmm4
40 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
41 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
42 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
43 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
44 ; SSE41-NEXT: pand %xmm5, %xmm3
45 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
46 ; SSE41-NEXT: por %xmm3, %xmm0
47 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
48 ; SSE41-NEXT: movapd %xmm1, %xmm0
49 ; SSE41-NEXT: retq
50 ;
51 ; SSE42-LABEL: max_gt_v2i64:
52 ; SSE42: # BB#0:
53 ; SSE42-NEXT: movdqa %xmm0, %xmm2
54 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
55 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
56 ; SSE42-NEXT: movapd %xmm1, %xmm0
57 ; SSE42-NEXT: retq
58 ;
59 ; AVX-LABEL: max_gt_v2i64:
60 ; AVX: # BB#0:
61 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
62 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
63 ; AVX-NEXT: retq
64 %1 = icmp sgt <2 x i64> %a, %b
65 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
66 ret <2 x i64> %2
67 }
68
69 define <4 x i64> @max_gt_v4i64(<4 x i64> %a, <4 x i64> %b) {
70 ; SSE2-LABEL: max_gt_v4i64:
71 ; SSE2: # BB#0:
72 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
73 ; SSE2-NEXT: movdqa %xmm3, %xmm5
74 ; SSE2-NEXT: pxor %xmm4, %xmm5
75 ; SSE2-NEXT: movdqa %xmm1, %xmm6
76 ; SSE2-NEXT: pxor %xmm4, %xmm6
77 ; SSE2-NEXT: movdqa %xmm6, %xmm7
78 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
79 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
80 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
81 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
82 ; SSE2-NEXT: pand %xmm8, %xmm5
83 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
84 ; SSE2-NEXT: por %xmm5, %xmm6
85 ; SSE2-NEXT: movdqa %xmm2, %xmm5
86 ; SSE2-NEXT: pxor %xmm4, %xmm5
87 ; SSE2-NEXT: pxor %xmm0, %xmm4
88 ; SSE2-NEXT: movdqa %xmm4, %xmm7
89 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
90 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
91 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
92 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
93 ; SSE2-NEXT: pand %xmm8, %xmm4
94 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
95 ; SSE2-NEXT: por %xmm4, %xmm5
96 ; SSE2-NEXT: pand %xmm5, %xmm0
97 ; SSE2-NEXT: pandn %xmm2, %xmm5
98 ; SSE2-NEXT: por %xmm5, %xmm0
99 ; SSE2-NEXT: pand %xmm6, %xmm1
100 ; SSE2-NEXT: pandn %xmm3, %xmm6
101 ; SSE2-NEXT: por %xmm6, %xmm1
102 ; SSE2-NEXT: retq
103 ;
104 ; SSE41-LABEL: max_gt_v4i64:
105 ; SSE41: # BB#0:
106 ; SSE41-NEXT: movdqa %xmm0, %xmm8
107 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
108 ; SSE41-NEXT: movdqa %xmm3, %xmm5
109 ; SSE41-NEXT: pxor %xmm0, %xmm5
110 ; SSE41-NEXT: movdqa %xmm1, %xmm6
111 ; SSE41-NEXT: pxor %xmm0, %xmm6
112 ; SSE41-NEXT: movdqa %xmm6, %xmm7
113 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
114 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
115 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
116 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
117 ; SSE41-NEXT: pand %xmm4, %xmm6
118 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
119 ; SSE41-NEXT: por %xmm6, %xmm5
120 ; SSE41-NEXT: movdqa %xmm2, %xmm4
121 ; SSE41-NEXT: pxor %xmm0, %xmm4
122 ; SSE41-NEXT: pxor %xmm8, %xmm0
123 ; SSE41-NEXT: movdqa %xmm0, %xmm6
124 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm6
125 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
126 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
127 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
128 ; SSE41-NEXT: pand %xmm7, %xmm4
129 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
130 ; SSE41-NEXT: por %xmm4, %xmm0
131 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
132 ; SSE41-NEXT: movdqa %xmm5, %xmm0
133 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
134 ; SSE41-NEXT: movapd %xmm2, %xmm0
135 ; SSE41-NEXT: movapd %xmm3, %xmm1
136 ; SSE41-NEXT: retq
137 ;
138 ; SSE42-LABEL: max_gt_v4i64:
139 ; SSE42: # BB#0:
140 ; SSE42-NEXT: movdqa %xmm0, %xmm4
141 ; SSE42-NEXT: movdqa %xmm1, %xmm5
142 ; SSE42-NEXT: pcmpgtq %xmm3, %xmm5
143 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
144 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
145 ; SSE42-NEXT: movdqa %xmm5, %xmm0
146 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
147 ; SSE42-NEXT: movapd %xmm2, %xmm0
148 ; SSE42-NEXT: movapd %xmm3, %xmm1
149 ; SSE42-NEXT: retq
150 ;
151 ; AVX1-LABEL: max_gt_v4i64:
152 ; AVX1: # BB#0:
153 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
154 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
155 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
156 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
157 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
158 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
159 ; AVX1-NEXT: retq
160 ;
161 ; AVX2-LABEL: max_gt_v4i64:
162 ; AVX2: # BB#0:
163 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
164 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
165 ; AVX2-NEXT: retq
166 ;
167 ; AVX512-LABEL: max_gt_v4i64:
168 ; AVX512: # BB#0:
169 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
170 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
171 ; AVX512-NEXT: retq
172 %1 = icmp sgt <4 x i64> %a, %b
173 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
174 ret <4 x i64> %2
175 }
176
177 define <4 x i32> @max_gt_v4i32(<4 x i32> %a, <4 x i32> %b) {
178 ; SSE2-LABEL: max_gt_v4i32:
179 ; SSE2: # BB#0:
180 ; SSE2-NEXT: movdqa %xmm0, %xmm2
181 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
182 ; SSE2-NEXT: pand %xmm2, %xmm0
183 ; SSE2-NEXT: pandn %xmm1, %xmm2
184 ; SSE2-NEXT: por %xmm0, %xmm2
185 ; SSE2-NEXT: movdqa %xmm2, %xmm0
186 ; SSE2-NEXT: retq
187 ;
188 ; SSE41-LABEL: max_gt_v4i32:
189 ; SSE41: # BB#0:
190 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
191 ; SSE41-NEXT: retq
192 ;
193 ; SSE42-LABEL: max_gt_v4i32:
194 ; SSE42: # BB#0:
195 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
196 ; SSE42-NEXT: retq
197 ;
198 ; AVX-LABEL: max_gt_v4i32:
199 ; AVX: # BB#0:
200 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
201 ; AVX-NEXT: retq
202 %1 = icmp sgt <4 x i32> %a, %b
203 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
204 ret <4 x i32> %2
205 }
206
207 define <8 x i32> @max_gt_v8i32(<8 x i32> %a, <8 x i32> %b) {
208 ; SSE2-LABEL: max_gt_v8i32:
209 ; SSE2: # BB#0:
210 ; SSE2-NEXT: movdqa %xmm1, %xmm4
211 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
212 ; SSE2-NEXT: movdqa %xmm0, %xmm5
213 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
214 ; SSE2-NEXT: pand %xmm5, %xmm0
215 ; SSE2-NEXT: pandn %xmm2, %xmm5
216 ; SSE2-NEXT: por %xmm0, %xmm5
217 ; SSE2-NEXT: pand %xmm4, %xmm1
218 ; SSE2-NEXT: pandn %xmm3, %xmm4
219 ; SSE2-NEXT: por %xmm1, %xmm4
220 ; SSE2-NEXT: movdqa %xmm5, %xmm0
221 ; SSE2-NEXT: movdqa %xmm4, %xmm1
222 ; SSE2-NEXT: retq
223 ;
224 ; SSE41-LABEL: max_gt_v8i32:
225 ; SSE41: # BB#0:
226 ; SSE41-NEXT: pmaxsd %xmm2, %xmm0
227 ; SSE41-NEXT: pmaxsd %xmm3, %xmm1
228 ; SSE41-NEXT: retq
229 ;
230 ; SSE42-LABEL: max_gt_v8i32:
231 ; SSE42: # BB#0:
232 ; SSE42-NEXT: pmaxsd %xmm2, %xmm0
233 ; SSE42-NEXT: pmaxsd %xmm3, %xmm1
234 ; SSE42-NEXT: retq
235 ;
236 ; AVX1-LABEL: max_gt_v8i32:
237 ; AVX1: # BB#0:
238 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
239 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
240 ; AVX1-NEXT: vpmaxsd %xmm2, %xmm3, %xmm2
241 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
242 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
243 ; AVX1-NEXT: retq
244 ;
245 ; AVX2-LABEL: max_gt_v8i32:
246 ; AVX2: # BB#0:
247 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
248 ; AVX2-NEXT: retq
249 ;
250 ; AVX512-LABEL: max_gt_v8i32:
251 ; AVX512: # BB#0:
252 ; AVX512-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
253 ; AVX512-NEXT: retq
254 %1 = icmp sgt <8 x i32> %a, %b
255 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
256 ret <8 x i32> %2
257 }
258
259 define <8 x i16> @max_gt_v8i16(<8 x i16> %a, <8 x i16> %b) {
260 ; SSE-LABEL: max_gt_v8i16:
261 ; SSE: # BB#0:
262 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
263 ; SSE-NEXT: retq
264 ;
265 ; AVX-LABEL: max_gt_v8i16:
266 ; AVX: # BB#0:
267 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
268 ; AVX-NEXT: retq
269 %1 = icmp sgt <8 x i16> %a, %b
270 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
271 ret <8 x i16> %2
272 }
273
274 define <16 x i16> @max_gt_v16i16(<16 x i16> %a, <16 x i16> %b) {
275 ; SSE-LABEL: max_gt_v16i16:
276 ; SSE: # BB#0:
277 ; SSE-NEXT: pmaxsw %xmm2, %xmm0
278 ; SSE-NEXT: pmaxsw %xmm3, %xmm1
279 ; SSE-NEXT: retq
280 ;
281 ; AVX1-LABEL: max_gt_v16i16:
282 ; AVX1: # BB#0:
283 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
284 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
285 ; AVX1-NEXT: vpmaxsw %xmm2, %xmm3, %xmm2
286 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
287 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
288 ; AVX1-NEXT: retq
289 ;
290 ; AVX2-LABEL: max_gt_v16i16:
291 ; AVX2: # BB#0:
292 ; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
293 ; AVX2-NEXT: retq
294 ;
295 ; AVX512-LABEL: max_gt_v16i16:
296 ; AVX512: # BB#0:
297 ; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
298 ; AVX512-NEXT: retq
299 %1 = icmp sgt <16 x i16> %a, %b
300 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
301 ret <16 x i16> %2
302 }
303
304 define <16 x i8> @max_gt_v16i8(<16 x i8> %a, <16 x i8> %b) {
305 ; SSE2-LABEL: max_gt_v16i8:
306 ; SSE2: # BB#0:
307 ; SSE2-NEXT: movdqa %xmm0, %xmm2
308 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
309 ; SSE2-NEXT: pand %xmm2, %xmm0
310 ; SSE2-NEXT: pandn %xmm1, %xmm2
311 ; SSE2-NEXT: por %xmm0, %xmm2
312 ; SSE2-NEXT: movdqa %xmm2, %xmm0
313 ; SSE2-NEXT: retq
314 ;
315 ; SSE41-LABEL: max_gt_v16i8:
316 ; SSE41: # BB#0:
317 ; SSE41-NEXT: pmaxsb %xmm1, %xmm0
318 ; SSE41-NEXT: retq
319 ;
320 ; SSE42-LABEL: max_gt_v16i8:
321 ; SSE42: # BB#0:
322 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
323 ; SSE42-NEXT: retq
324 ;
325 ; AVX-LABEL: max_gt_v16i8:
326 ; AVX: # BB#0:
327 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
328 ; AVX-NEXT: retq
329 %1 = icmp sgt <16 x i8> %a, %b
330 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
331 ret <16 x i8> %2
332 }
333
334 define <32 x i8> @max_gt_v32i8(<32 x i8> %a, <32 x i8> %b) {
335 ; SSE2-LABEL: max_gt_v32i8:
336 ; SSE2: # BB#0:
337 ; SSE2-NEXT: movdqa %xmm1, %xmm4
338 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm4
339 ; SSE2-NEXT: movdqa %xmm0, %xmm5
340 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
341 ; SSE2-NEXT: pand %xmm5, %xmm0
342 ; SSE2-NEXT: pandn %xmm2, %xmm5
343 ; SSE2-NEXT: por %xmm0, %xmm5
344 ; SSE2-NEXT: pand %xmm4, %xmm1
345 ; SSE2-NEXT: pandn %xmm3, %xmm4
346 ; SSE2-NEXT: por %xmm1, %xmm4
347 ; SSE2-NEXT: movdqa %xmm5, %xmm0
348 ; SSE2-NEXT: movdqa %xmm4, %xmm1
349 ; SSE2-NEXT: retq
350 ;
351 ; SSE41-LABEL: max_gt_v32i8:
352 ; SSE41: # BB#0:
353 ; SSE41-NEXT: pmaxsb %xmm2, %xmm0
354 ; SSE41-NEXT: pmaxsb %xmm3, %xmm1
355 ; SSE41-NEXT: retq
356 ;
357 ; SSE42-LABEL: max_gt_v32i8:
358 ; SSE42: # BB#0:
359 ; SSE42-NEXT: pmaxsb %xmm2, %xmm0
360 ; SSE42-NEXT: pmaxsb %xmm3, %xmm1
361 ; SSE42-NEXT: retq
362 ;
363 ; AVX1-LABEL: max_gt_v32i8:
364 ; AVX1: # BB#0:
365 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
366 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
367 ; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm2
368 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
369 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
370 ; AVX1-NEXT: retq
371 ;
372 ; AVX2-LABEL: max_gt_v32i8:
373 ; AVX2: # BB#0:
374 ; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
375 ; AVX2-NEXT: retq
376 ;
377 ; AVX512-LABEL: max_gt_v32i8:
378 ; AVX512: # BB#0:
379 ; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
380 ; AVX512-NEXT: retq
381 %1 = icmp sgt <32 x i8> %a, %b
382 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
383 ret <32 x i8> %2
384 }
385
386 ;
387 ; Signed Maximum (GE)
388 ;
389
390 define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
391 ; SSE2-LABEL: max_ge_v2i64:
392 ; SSE2: # BB#0:
393 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
394 ; SSE2-NEXT: movdqa %xmm0, %xmm3
395 ; SSE2-NEXT: pxor %xmm2, %xmm3
396 ; SSE2-NEXT: pxor %xmm1, %xmm2
397 ; SSE2-NEXT: movdqa %xmm2, %xmm4
398 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
399 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
400 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
401 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
402 ; SSE2-NEXT: pand %xmm5, %xmm2
403 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
404 ; SSE2-NEXT: por %xmm2, %xmm3
405 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
406 ; SSE2-NEXT: pxor %xmm3, %xmm2
407 ; SSE2-NEXT: pandn %xmm0, %xmm3
408 ; SSE2-NEXT: pandn %xmm1, %xmm2
409 ; SSE2-NEXT: por %xmm3, %xmm2
410 ; SSE2-NEXT: movdqa %xmm2, %xmm0
411 ; SSE2-NEXT: retq
412 ;
413 ; SSE41-LABEL: max_ge_v2i64:
414 ; SSE41: # BB#0:
415 ; SSE41-NEXT: movdqa %xmm0, %xmm2
416 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
417 ; SSE41-NEXT: movdqa %xmm2, %xmm3
418 ; SSE41-NEXT: pxor %xmm0, %xmm3
419 ; SSE41-NEXT: pxor %xmm1, %xmm0
420 ; SSE41-NEXT: movdqa %xmm0, %xmm4
421 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
422 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
423 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
424 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
425 ; SSE41-NEXT: pand %xmm5, %xmm0
426 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
427 ; SSE41-NEXT: por %xmm0, %xmm3
428 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
429 ; SSE41-NEXT: pxor %xmm3, %xmm0
430 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
431 ; SSE41-NEXT: movapd %xmm1, %xmm0
432 ; SSE41-NEXT: retq
433 ;
434 ; SSE42-LABEL: max_ge_v2i64:
435 ; SSE42: # BB#0:
436 ; SSE42-NEXT: movdqa %xmm0, %xmm2
437 ; SSE42-NEXT: movdqa %xmm1, %xmm3
438 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm3
439 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
440 ; SSE42-NEXT: pxor %xmm3, %xmm0
441 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
442 ; SSE42-NEXT: movapd %xmm1, %xmm0
443 ; SSE42-NEXT: retq
444 ;
445 ; AVX-LABEL: max_ge_v2i64:
446 ; AVX: # BB#0:
447 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
448 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
449 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
450 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
451 ; AVX-NEXT: retq
452 %1 = icmp sge <2 x i64> %a, %b
453 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
454 ret <2 x i64> %2
455 }
456
457 define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
458 ; SSE2-LABEL: max_ge_v4i64:
459 ; SSE2: # BB#0:
460 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
461 ; SSE2-NEXT: movdqa %xmm1, %xmm4
462 ; SSE2-NEXT: pxor %xmm7, %xmm4
463 ; SSE2-NEXT: movdqa %xmm3, %xmm5
464 ; SSE2-NEXT: pxor %xmm7, %xmm5
465 ; SSE2-NEXT: movdqa %xmm5, %xmm6
466 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
467 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
468 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
469 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
470 ; SSE2-NEXT: pand %xmm8, %xmm4
471 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
472 ; SSE2-NEXT: por %xmm4, %xmm8
473 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
474 ; SSE2-NEXT: movdqa %xmm8, %xmm9
475 ; SSE2-NEXT: pxor %xmm4, %xmm9
476 ; SSE2-NEXT: movdqa %xmm0, %xmm6
477 ; SSE2-NEXT: pxor %xmm7, %xmm6
478 ; SSE2-NEXT: pxor %xmm2, %xmm7
479 ; SSE2-NEXT: movdqa %xmm7, %xmm5
480 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
481 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
482 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm7
483 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
484 ; SSE2-NEXT: pand %xmm10, %xmm6
485 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
486 ; SSE2-NEXT: por %xmm6, %xmm5
487 ; SSE2-NEXT: pxor %xmm5, %xmm4
488 ; SSE2-NEXT: pandn %xmm0, %xmm5
489 ; SSE2-NEXT: pandn %xmm2, %xmm4
490 ; SSE2-NEXT: por %xmm5, %xmm4
491 ; SSE2-NEXT: pandn %xmm1, %xmm8
492 ; SSE2-NEXT: pandn %xmm3, %xmm9
493 ; SSE2-NEXT: por %xmm8, %xmm9
494 ; SSE2-NEXT: movdqa %xmm4, %xmm0
495 ; SSE2-NEXT: movdqa %xmm9, %xmm1
496 ; SSE2-NEXT: retq
497 ;
498 ; SSE41-LABEL: max_ge_v4i64:
499 ; SSE41: # BB#0:
500 ; SSE41-NEXT: movdqa %xmm0, %xmm8
501 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
502 ; SSE41-NEXT: movdqa %xmm1, %xmm5
503 ; SSE41-NEXT: pxor %xmm0, %xmm5
504 ; SSE41-NEXT: movdqa %xmm3, %xmm6
505 ; SSE41-NEXT: pxor %xmm0, %xmm6
506 ; SSE41-NEXT: movdqa %xmm6, %xmm7
507 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
508 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
509 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
510 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
511 ; SSE41-NEXT: pand %xmm4, %xmm6
512 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
513 ; SSE41-NEXT: por %xmm6, %xmm5
514 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
515 ; SSE41-NEXT: pxor %xmm9, %xmm5
516 ; SSE41-NEXT: movdqa %xmm8, %xmm6
517 ; SSE41-NEXT: pxor %xmm0, %xmm6
518 ; SSE41-NEXT: pxor %xmm2, %xmm0
519 ; SSE41-NEXT: movdqa %xmm0, %xmm7
520 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
521 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
522 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
523 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
524 ; SSE41-NEXT: pand %xmm4, %xmm6
525 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
526 ; SSE41-NEXT: por %xmm6, %xmm0
527 ; SSE41-NEXT: pxor %xmm9, %xmm0
528 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
529 ; SSE41-NEXT: movdqa %xmm5, %xmm0
530 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
531 ; SSE41-NEXT: movapd %xmm2, %xmm0
532 ; SSE41-NEXT: movapd %xmm3, %xmm1
533 ; SSE41-NEXT: retq
534 ;
535 ; SSE42-LABEL: max_ge_v4i64:
536 ; SSE42: # BB#0:
537 ; SSE42-NEXT: movdqa %xmm0, %xmm4
538 ; SSE42-NEXT: movdqa %xmm3, %xmm5
539 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm5
540 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
541 ; SSE42-NEXT: pxor %xmm0, %xmm5
542 ; SSE42-NEXT: movdqa %xmm2, %xmm6
543 ; SSE42-NEXT: pcmpgtq %xmm4, %xmm6
544 ; SSE42-NEXT: pxor %xmm6, %xmm0
545 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
546 ; SSE42-NEXT: movdqa %xmm5, %xmm0
547 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
548 ; SSE42-NEXT: movapd %xmm2, %xmm0
549 ; SSE42-NEXT: movapd %xmm3, %xmm1
550 ; SSE42-NEXT: retq
551 ;
552 ; AVX1-LABEL: max_ge_v4i64:
553 ; AVX1: # BB#0:
554 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
555 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
556 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
557 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
558 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
559 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm4
560 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm3
561 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
562 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
563 ; AVX1-NEXT: retq
564 ;
565 ; AVX2-LABEL: max_ge_v4i64:
566 ; AVX2: # BB#0:
567 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
568 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
569 ; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
570 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
571 ; AVX2-NEXT: retq
572 ;
573 ; AVX512-LABEL: max_ge_v4i64:
574 ; AVX512: # BB#0:
575 ; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
576 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
577 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
578 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
579 ; AVX512-NEXT: retq
580 %1 = icmp sge <4 x i64> %a, %b
581 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
582 ret <4 x i64> %2
583 }
584
585 define <4 x i32> @max_ge_v4i32(<4 x i32> %a, <4 x i32> %b) {
586 ; SSE2-LABEL: max_ge_v4i32:
587 ; SSE2: # BB#0:
588 ; SSE2-NEXT: movdqa %xmm1, %xmm3
589 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
590 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
591 ; SSE2-NEXT: pxor %xmm3, %xmm2
592 ; SSE2-NEXT: pandn %xmm0, %xmm3
593 ; SSE2-NEXT: pandn %xmm1, %xmm2
594 ; SSE2-NEXT: por %xmm3, %xmm2
595 ; SSE2-NEXT: movdqa %xmm2, %xmm0
596 ; SSE2-NEXT: retq
597 ;
598 ; SSE41-LABEL: max_ge_v4i32:
599 ; SSE41: # BB#0:
600 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
601 ; SSE41-NEXT: retq
602 ;
603 ; SSE42-LABEL: max_ge_v4i32:
604 ; SSE42: # BB#0:
605 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
606 ; SSE42-NEXT: retq
607 ;
608 ; AVX-LABEL: max_ge_v4i32:
609 ; AVX: # BB#0:
610 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
611 ; AVX-NEXT: retq
612 %1 = icmp sge <4 x i32> %a, %b
613 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
614 ret <4 x i32> %2
615 }
616
617 define <8 x i32> @max_ge_v8i32(<8 x i32> %a, <8 x i32> %b) {
618 ; SSE2-LABEL: max_ge_v8i32:
619 ; SSE2: # BB#0:
620 ; SSE2-NEXT: movdqa %xmm3, %xmm6
621 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
622 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
623 ; SSE2-NEXT: movdqa %xmm6, %xmm5
624 ; SSE2-NEXT: pxor %xmm4, %xmm5
625 ; SSE2-NEXT: movdqa %xmm2, %xmm7
626 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm7
627 ; SSE2-NEXT: pxor %xmm7, %xmm4
628 ; SSE2-NEXT: pandn %xmm0, %xmm7
629 ; SSE2-NEXT: pandn %xmm2, %xmm4
630 ; SSE2-NEXT: por %xmm7, %xmm4
631 ; SSE2-NEXT: pandn %xmm1, %xmm6
632 ; SSE2-NEXT: pandn %xmm3, %xmm5
633 ; SSE2-NEXT: por %xmm6, %xmm5
634 ; SSE2-NEXT: movdqa %xmm4, %xmm0
635 ; SSE2-NEXT: movdqa %xmm5, %xmm1
636 ; SSE2-NEXT: retq
637 ;
638 ; SSE41-LABEL: max_ge_v8i32:
639 ; SSE41: # BB#0:
640 ; SSE41-NEXT: pmaxsd %xmm2, %xmm0
641 ; SSE41-NEXT: pmaxsd %xmm3, %xmm1
642 ; SSE41-NEXT: retq
643 ;
644 ; SSE42-LABEL: max_ge_v8i32:
645 ; SSE42: # BB#0:
646 ; SSE42-NEXT: pmaxsd %xmm2, %xmm0
647 ; SSE42-NEXT: pmaxsd %xmm3, %xmm1
648 ; SSE42-NEXT: retq
649 ;
650 ; AVX1-LABEL: max_ge_v8i32:
651 ; AVX1: # BB#0:
652 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
653 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
654 ; AVX1-NEXT: vpmaxsd %xmm2, %xmm3, %xmm2
655 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
656 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
657 ; AVX1-NEXT: retq
658 ;
659 ; AVX2-LABEL: max_ge_v8i32:
660 ; AVX2: # BB#0:
661 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
662 ; AVX2-NEXT: retq
663 ;
664 ; AVX512-LABEL: max_ge_v8i32:
665 ; AVX512: # BB#0:
666 ; AVX512-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
667 ; AVX512-NEXT: retq
668 %1 = icmp sge <8 x i32> %a, %b
669 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
670 ret <8 x i32> %2
671 }
672
673 define <8 x i16> @max_ge_v8i16(<8 x i16> %a, <8 x i16> %b) {
674 ; SSE-LABEL: max_ge_v8i16:
675 ; SSE: # BB#0:
676 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
677 ; SSE-NEXT: retq
678 ;
679 ; AVX-LABEL: max_ge_v8i16:
680 ; AVX: # BB#0:
681 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
682 ; AVX-NEXT: retq
683 %1 = icmp sge <8 x i16> %a, %b
684 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
685 ret <8 x i16> %2
686 }
687
688 define <16 x i16> @max_ge_v16i16(<16 x i16> %a, <16 x i16> %b) {
689 ; SSE-LABEL: max_ge_v16i16:
690 ; SSE: # BB#0:
691 ; SSE-NEXT: pmaxsw %xmm2, %xmm0
692 ; SSE-NEXT: pmaxsw %xmm3, %xmm1
693 ; SSE-NEXT: retq
694 ;
695 ; AVX1-LABEL: max_ge_v16i16:
696 ; AVX1: # BB#0:
697 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
698 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
699 ; AVX1-NEXT: vpmaxsw %xmm2, %xmm3, %xmm2
700 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
701 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
702 ; AVX1-NEXT: retq
703 ;
704 ; AVX2-LABEL: max_ge_v16i16:
705 ; AVX2: # BB#0:
706 ; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
707 ; AVX2-NEXT: retq
708 ;
709 ; AVX512-LABEL: max_ge_v16i16:
710 ; AVX512: # BB#0:
711 ; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
712 ; AVX512-NEXT: retq
713 %1 = icmp sge <16 x i16> %a, %b
714 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
715 ret <16 x i16> %2
716 }
717
718 define <16 x i8> @max_ge_v16i8(<16 x i8> %a, <16 x i8> %b) {
719 ; SSE2-LABEL: max_ge_v16i8:
720 ; SSE2: # BB#0:
721 ; SSE2-NEXT: movdqa %xmm1, %xmm3
722 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm3
723 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
724 ; SSE2-NEXT: pxor %xmm3, %xmm2
725 ; SSE2-NEXT: pandn %xmm0, %xmm3
726 ; SSE2-NEXT: pandn %xmm1, %xmm2
727 ; SSE2-NEXT: por %xmm3, %xmm2
728 ; SSE2-NEXT: movdqa %xmm2, %xmm0
729 ; SSE2-NEXT: retq
730 ;
731 ; SSE41-LABEL: max_ge_v16i8:
732 ; SSE41: # BB#0:
733 ; SSE41-NEXT: pmaxsb %xmm1, %xmm0
734 ; SSE41-NEXT: retq
735 ;
736 ; SSE42-LABEL: max_ge_v16i8:
737 ; SSE42: # BB#0:
738 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
739 ; SSE42-NEXT: retq
740 ;
741 ; AVX-LABEL: max_ge_v16i8:
742 ; AVX: # BB#0:
743 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
744 ; AVX-NEXT: retq
745 %1 = icmp sge <16 x i8> %a, %b
746 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
747 ret <16 x i8> %2
748 }
749
750 define <32 x i8> @max_ge_v32i8(<32 x i8> %a, <32 x i8> %b) {
751 ; SSE2-LABEL: max_ge_v32i8:
752 ; SSE2: # BB#0:
753 ; SSE2-NEXT: movdqa %xmm3, %xmm6
754 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm6
755 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
756 ; SSE2-NEXT: movdqa %xmm6, %xmm5
757 ; SSE2-NEXT: pxor %xmm4, %xmm5
758 ; SSE2-NEXT: movdqa %xmm2, %xmm7
759 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm7
760 ; SSE2-NEXT: pxor %xmm7, %xmm4
761 ; SSE2-NEXT: pandn %xmm0, %xmm7
762 ; SSE2-NEXT: pandn %xmm2, %xmm4
763 ; SSE2-NEXT: por %xmm7, %xmm4
764 ; SSE2-NEXT: pandn %xmm1, %xmm6
765 ; SSE2-NEXT: pandn %xmm3, %xmm5
766 ; SSE2-NEXT: por %xmm6, %xmm5
767 ; SSE2-NEXT: movdqa %xmm4, %xmm0
768 ; SSE2-NEXT: movdqa %xmm5, %xmm1
769 ; SSE2-NEXT: retq
770 ;
771 ; SSE41-LABEL: max_ge_v32i8:
772 ; SSE41: # BB#0:
773 ; SSE41-NEXT: pmaxsb %xmm2, %xmm0
774 ; SSE41-NEXT: pmaxsb %xmm3, %xmm1
775 ; SSE41-NEXT: retq
776 ;
777 ; SSE42-LABEL: max_ge_v32i8:
778 ; SSE42: # BB#0:
779 ; SSE42-NEXT: pmaxsb %xmm2, %xmm0
780 ; SSE42-NEXT: pmaxsb %xmm3, %xmm1
781 ; SSE42-NEXT: retq
782 ;
783 ; AVX1-LABEL: max_ge_v32i8:
784 ; AVX1: # BB#0:
785 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
786 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
787 ; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm2
788 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
789 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
790 ; AVX1-NEXT: retq
791 ;
792 ; AVX2-LABEL: max_ge_v32i8:
793 ; AVX2: # BB#0:
794 ; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
795 ; AVX2-NEXT: retq
796 ;
797 ; AVX512-LABEL: max_ge_v32i8:
798 ; AVX512: # BB#0:
799 ; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
800 ; AVX512-NEXT: retq
801 %1 = icmp sge <32 x i8> %a, %b
802 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
803 ret <32 x i8> %2
804 }
805
806 ;
807 ; Signed Minimum (LT)
808 ;
809
810 define <2 x i64> @max_lt_v2i64(<2 x i64> %a, <2 x i64> %b) {
811 ; SSE2-LABEL: max_lt_v2i64:
812 ; SSE2: # BB#0:
813 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
814 ; SSE2-NEXT: movdqa %xmm0, %xmm3
815 ; SSE2-NEXT: pxor %xmm2, %xmm3
816 ; SSE2-NEXT: pxor %xmm1, %xmm2
817 ; SSE2-NEXT: movdqa %xmm2, %xmm4
818 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
819 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
820 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
821 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
822 ; SSE2-NEXT: pand %xmm5, %xmm2
823 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
824 ; SSE2-NEXT: por %xmm2, %xmm3
825 ; SSE2-NEXT: pand %xmm3, %xmm0
826 ; SSE2-NEXT: pandn %xmm1, %xmm3
827 ; SSE2-NEXT: por %xmm3, %xmm0
828 ; SSE2-NEXT: retq
829 ;
830 ; SSE41-LABEL: max_lt_v2i64:
831 ; SSE41: # BB#0:
832 ; SSE41-NEXT: movdqa %xmm0, %xmm2
833 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
834 ; SSE41-NEXT: movdqa %xmm2, %xmm3
835 ; SSE41-NEXT: pxor %xmm0, %xmm3
836 ; SSE41-NEXT: pxor %xmm1, %xmm0
837 ; SSE41-NEXT: movdqa %xmm0, %xmm4
838 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
839 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
840 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
841 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
842 ; SSE41-NEXT: pand %xmm5, %xmm3
843 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
844 ; SSE41-NEXT: por %xmm3, %xmm0
845 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
846 ; SSE41-NEXT: movapd %xmm1, %xmm0
847 ; SSE41-NEXT: retq
848 ;
849 ; SSE42-LABEL: max_lt_v2i64:
850 ; SSE42: # BB#0:
851 ; SSE42-NEXT: movdqa %xmm0, %xmm2
852 ; SSE42-NEXT: movdqa %xmm1, %xmm0
853 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
854 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
855 ; SSE42-NEXT: movapd %xmm1, %xmm0
856 ; SSE42-NEXT: retq
857 ;
858 ; AVX-LABEL: max_lt_v2i64:
859 ; AVX: # BB#0:
860 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
861 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
862 ; AVX-NEXT: retq
863 %1 = icmp slt <2 x i64> %a, %b
864 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
865 ret <2 x i64> %2
866 }
867
868 define <4 x i64> @max_lt_v4i64(<4 x i64> %a, <4 x i64> %b) {
869 ; SSE2-LABEL: max_lt_v4i64:
870 ; SSE2: # BB#0:
871 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
872 ; SSE2-NEXT: movdqa %xmm1, %xmm5
873 ; SSE2-NEXT: pxor %xmm4, %xmm5
874 ; SSE2-NEXT: movdqa %xmm3, %xmm6
875 ; SSE2-NEXT: pxor %xmm4, %xmm6
876 ; SSE2-NEXT: movdqa %xmm6, %xmm7
877 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
878 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
879 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
880 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
881 ; SSE2-NEXT: pand %xmm8, %xmm5
882 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
883 ; SSE2-NEXT: por %xmm5, %xmm6
884 ; SSE2-NEXT: movdqa %xmm0, %xmm5
885 ; SSE2-NEXT: pxor %xmm4, %xmm5
886 ; SSE2-NEXT: pxor %xmm2, %xmm4
887 ; SSE2-NEXT: movdqa %xmm4, %xmm7
888 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
889 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
890 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
891 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
892 ; SSE2-NEXT: pand %xmm8, %xmm4
893 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
894 ; SSE2-NEXT: por %xmm4, %xmm5
895 ; SSE2-NEXT: pand %xmm5, %xmm0
896 ; SSE2-NEXT: pandn %xmm2, %xmm5
897 ; SSE2-NEXT: por %xmm5, %xmm0
898 ; SSE2-NEXT: pand %xmm6, %xmm1
899 ; SSE2-NEXT: pandn %xmm3, %xmm6
900 ; SSE2-NEXT: por %xmm6, %xmm1
901 ; SSE2-NEXT: retq
902 ;
903 ; SSE41-LABEL: max_lt_v4i64:
904 ; SSE41: # BB#0:
905 ; SSE41-NEXT: movdqa %xmm0, %xmm8
906 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
907 ; SSE41-NEXT: movdqa %xmm1, %xmm5
908 ; SSE41-NEXT: pxor %xmm0, %xmm5
909 ; SSE41-NEXT: movdqa %xmm3, %xmm6
910 ; SSE41-NEXT: pxor %xmm0, %xmm6
911 ; SSE41-NEXT: movdqa %xmm6, %xmm7
912 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
913 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
914 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
915 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
916 ; SSE41-NEXT: pand %xmm4, %xmm6
917 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
918 ; SSE41-NEXT: por %xmm6, %xmm5
919 ; SSE41-NEXT: movdqa %xmm8, %xmm4
920 ; SSE41-NEXT: pxor %xmm0, %xmm4
921 ; SSE41-NEXT: pxor %xmm2, %xmm0
922 ; SSE41-NEXT: movdqa %xmm0, %xmm6
923 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm6
924 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
925 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
926 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
927 ; SSE41-NEXT: pand %xmm7, %xmm4
928 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
929 ; SSE41-NEXT: por %xmm4, %xmm0
930 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
931 ; SSE41-NEXT: movdqa %xmm5, %xmm0
932 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
933 ; SSE41-NEXT: movapd %xmm2, %xmm0
934 ; SSE41-NEXT: movapd %xmm3, %xmm1
935 ; SSE41-NEXT: retq
936 ;
937 ; SSE42-LABEL: max_lt_v4i64:
938 ; SSE42: # BB#0:
939 ; SSE42-NEXT: movdqa %xmm0, %xmm4
940 ; SSE42-NEXT: movdqa %xmm3, %xmm5
941 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm5
942 ; SSE42-NEXT: movdqa %xmm2, %xmm0
943 ; SSE42-NEXT: pcmpgtq %xmm4, %xmm0
944 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
945 ; SSE42-NEXT: movdqa %xmm5, %xmm0
946 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
947 ; SSE42-NEXT: movapd %xmm2, %xmm0
948 ; SSE42-NEXT: movapd %xmm3, %xmm1
949 ; SSE42-NEXT: retq
950 ;
951 ; AVX1-LABEL: max_lt_v4i64:
952 ; AVX1: # BB#0:
953 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
954 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
955 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
956 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
957 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
958 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
959 ; AVX1-NEXT: retq
960 ;
961 ; AVX2-LABEL: max_lt_v4i64:
962 ; AVX2: # BB#0:
963 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
964 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
965 ; AVX2-NEXT: retq
966 ;
967 ; AVX512-LABEL: max_lt_v4i64:
968 ; AVX512: # BB#0:
969 ; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
970 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
971 ; AVX512-NEXT: retq
972 %1 = icmp slt <4 x i64> %a, %b
973 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
974 ret <4 x i64> %2
975 }
976
977 define <4 x i32> @max_lt_v4i32(<4 x i32> %a, <4 x i32> %b) {
978 ; SSE2-LABEL: max_lt_v4i32:
979 ; SSE2: # BB#0:
980 ; SSE2-NEXT: movdqa %xmm1, %xmm2
981 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
982 ; SSE2-NEXT: pand %xmm2, %xmm0
983 ; SSE2-NEXT: pandn %xmm1, %xmm2
984 ; SSE2-NEXT: por %xmm2, %xmm0
985 ; SSE2-NEXT: retq
986 ;
987 ; SSE41-LABEL: max_lt_v4i32:
988 ; SSE41: # BB#0:
989 ; SSE41-NEXT: pminsd %xmm1, %xmm0
990 ; SSE41-NEXT: retq
991 ;
992 ; SSE42-LABEL: max_lt_v4i32:
993 ; SSE42: # BB#0:
994 ; SSE42-NEXT: pminsd %xmm1, %xmm0
995 ; SSE42-NEXT: retq
996 ;
997 ; AVX-LABEL: max_lt_v4i32:
998 ; AVX: # BB#0:
999 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0
1000 ; AVX-NEXT: retq
1001 %1 = icmp slt <4 x i32> %a, %b
1002 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
1003 ret <4 x i32> %2
1004 }
1005
1006 define <8 x i32> @max_lt_v8i32(<8 x i32> %a, <8 x i32> %b) {
1007 ; SSE2-LABEL: max_lt_v8i32:
1008 ; SSE2: # BB#0:
1009 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1010 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1011 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1012 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
1013 ; SSE2-NEXT: pand %xmm5, %xmm0
1014 ; SSE2-NEXT: pandn %xmm2, %xmm5
1015 ; SSE2-NEXT: por %xmm5, %xmm0
1016 ; SSE2-NEXT: pand %xmm4, %xmm1
1017 ; SSE2-NEXT: pandn %xmm3, %xmm4
1018 ; SSE2-NEXT: por %xmm4, %xmm1
1019 ; SSE2-NEXT: retq
1020 ;
1021 ; SSE41-LABEL: max_lt_v8i32:
1022 ; SSE41: # BB#0:
1023 ; SSE41-NEXT: pminsd %xmm2, %xmm0
1024 ; SSE41-NEXT: pminsd %xmm3, %xmm1
1025 ; SSE41-NEXT: retq
1026 ;
1027 ; SSE42-LABEL: max_lt_v8i32:
1028 ; SSE42: # BB#0:
1029 ; SSE42-NEXT: pminsd %xmm2, %xmm0
1030 ; SSE42-NEXT: pminsd %xmm3, %xmm1
1031 ; SSE42-NEXT: retq
1032 ;
1033 ; AVX1-LABEL: max_lt_v8i32:
1034 ; AVX1: # BB#0:
1035 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1036 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1037 ; AVX1-NEXT: vpminsd %xmm2, %xmm3, %xmm2
1038 ; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm0
1039 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1040 ; AVX1-NEXT: retq
1041 ;
1042 ; AVX2-LABEL: max_lt_v8i32:
1043 ; AVX2: # BB#0:
1044 ; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm0
1045 ; AVX2-NEXT: retq
1046 ;
1047 ; AVX512-LABEL: max_lt_v8i32:
1048 ; AVX512: # BB#0:
1049 ; AVX512-NEXT: vpminsd %ymm1, %ymm0, %ymm0
1050 ; AVX512-NEXT: retq
1051 %1 = icmp slt <8 x i32> %a, %b
1052 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1053 ret <8 x i32> %2
1054 }
1055
1056 define <8 x i16> @max_lt_v8i16(<8 x i16> %a, <8 x i16> %b) {
1057 ; SSE-LABEL: max_lt_v8i16:
1058 ; SSE: # BB#0:
1059 ; SSE-NEXT: pminsw %xmm1, %xmm0
1060 ; SSE-NEXT: retq
1061 ;
1062 ; AVX-LABEL: max_lt_v8i16:
1063 ; AVX: # BB#0:
1064 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm0
1065 ; AVX-NEXT: retq
1066 %1 = icmp slt <8 x i16> %a, %b
1067 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1068 ret <8 x i16> %2
1069 }
1070
1071 define <16 x i16> @max_lt_v16i16(<16 x i16> %a, <16 x i16> %b) {
1072 ; SSE-LABEL: max_lt_v16i16:
1073 ; SSE: # BB#0:
1074 ; SSE-NEXT: pminsw %xmm2, %xmm0
1075 ; SSE-NEXT: pminsw %xmm3, %xmm1
1076 ; SSE-NEXT: retq
1077 ;
1078 ; AVX1-LABEL: max_lt_v16i16:
1079 ; AVX1: # BB#0:
1080 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1081 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1082 ; AVX1-NEXT: vpminsw %xmm2, %xmm3, %xmm2
1083 ; AVX1-NEXT: vpminsw %xmm1, %xmm0, %xmm0
1084 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1085 ; AVX1-NEXT: retq
1086 ;
1087 ; AVX2-LABEL: max_lt_v16i16:
1088 ; AVX2: # BB#0:
1089 ; AVX2-NEXT: vpminsw %ymm1, %ymm0, %ymm0
1090 ; AVX2-NEXT: retq
1091 ;
1092 ; AVX512-LABEL: max_lt_v16i16:
1093 ; AVX512: # BB#0:
1094 ; AVX512-NEXT: vpminsw %ymm1, %ymm0, %ymm0
1095 ; AVX512-NEXT: retq
1096 %1 = icmp slt <16 x i16> %a, %b
1097 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1098 ret <16 x i16> %2
1099 }
1100
1101 define <16 x i8> @max_lt_v16i8(<16 x i8> %a, <16 x i8> %b) {
1102 ; SSE2-LABEL: max_lt_v16i8:
1103 ; SSE2: # BB#0:
1104 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1105 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1106 ; SSE2-NEXT: pand %xmm2, %xmm0
1107 ; SSE2-NEXT: pandn %xmm1, %xmm2
1108 ; SSE2-NEXT: por %xmm2, %xmm0
1109 ; SSE2-NEXT: retq
1110 ;
1111 ; SSE41-LABEL: max_lt_v16i8:
1112 ; SSE41: # BB#0:
1113 ; SSE41-NEXT: pminsb %xmm1, %xmm0
1114 ; SSE41-NEXT: retq
1115 ;
1116 ; SSE42-LABEL: max_lt_v16i8:
1117 ; SSE42: # BB#0:
1118 ; SSE42-NEXT: pminsb %xmm1, %xmm0
1119 ; SSE42-NEXT: retq
1120 ;
1121 ; AVX-LABEL: max_lt_v16i8:
1122 ; AVX: # BB#0:
1123 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm0
1124 ; AVX-NEXT: retq
1125 %1 = icmp slt <16 x i8> %a, %b
1126 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1127 ret <16 x i8> %2
1128 }
1129
1130 define <32 x i8> @max_lt_v32i8(<32 x i8> %a, <32 x i8> %b) {
1131 ; SSE2-LABEL: max_lt_v32i8:
1132 ; SSE2: # BB#0:
1133 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1134 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm4
1135 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1136 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm5
1137 ; SSE2-NEXT: pand %xmm5, %xmm0
1138 ; SSE2-NEXT: pandn %xmm2, %xmm5
1139 ; SSE2-NEXT: por %xmm5, %xmm0
1140 ; SSE2-NEXT: pand %xmm4, %xmm1
1141 ; SSE2-NEXT: pandn %xmm3, %xmm4
1142 ; SSE2-NEXT: por %xmm4, %xmm1
1143 ; SSE2-NEXT: retq
1144 ;
1145 ; SSE41-LABEL: max_lt_v32i8:
1146 ; SSE41: # BB#0:
1147 ; SSE41-NEXT: pminsb %xmm2, %xmm0
1148 ; SSE41-NEXT: pminsb %xmm3, %xmm1
1149 ; SSE41-NEXT: retq
1150 ;
1151 ; SSE42-LABEL: max_lt_v32i8:
1152 ; SSE42: # BB#0:
1153 ; SSE42-NEXT: pminsb %xmm2, %xmm0
1154 ; SSE42-NEXT: pminsb %xmm3, %xmm1
1155 ; SSE42-NEXT: retq
1156 ;
1157 ; AVX1-LABEL: max_lt_v32i8:
1158 ; AVX1: # BB#0:
1159 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1160 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1161 ; AVX1-NEXT: vpminsb %xmm2, %xmm3, %xmm2
1162 ; AVX1-NEXT: vpminsb %xmm1, %xmm0, %xmm0
1163 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1164 ; AVX1-NEXT: retq
1165 ;
1166 ; AVX2-LABEL: max_lt_v32i8:
1167 ; AVX2: # BB#0:
1168 ; AVX2-NEXT: vpminsb %ymm1, %ymm0, %ymm0
1169 ; AVX2-NEXT: retq
1170 ;
1171 ; AVX512-LABEL: max_lt_v32i8:
1172 ; AVX512: # BB#0:
1173 ; AVX512-NEXT: vpminsb %ymm1, %ymm0, %ymm0
1174 ; AVX512-NEXT: retq
1175 %1 = icmp slt <32 x i8> %a, %b
1176 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1177 ret <32 x i8> %2
1178 }
1179
1180 ;
1181 ; Signed Minimum (LE)
1182 ;
1183
1184 define <2 x i64> @max_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
1185 ; SSE2-LABEL: max_le_v2i64:
1186 ; SSE2: # BB#0:
1187 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
1188 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1189 ; SSE2-NEXT: pxor %xmm2, %xmm3
1190 ; SSE2-NEXT: pxor %xmm0, %xmm2
1191 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1192 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
1193 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1194 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1195 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1196 ; SSE2-NEXT: pand %xmm5, %xmm2
1197 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1198 ; SSE2-NEXT: por %xmm2, %xmm3
1199 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1200 ; SSE2-NEXT: pxor %xmm3, %xmm2
1201 ; SSE2-NEXT: pandn %xmm0, %xmm3
1202 ; SSE2-NEXT: pandn %xmm1, %xmm2
1203 ; SSE2-NEXT: por %xmm3, %xmm2
1204 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1205 ; SSE2-NEXT: retq
1206 ;
1207 ; SSE41-LABEL: max_le_v2i64:
1208 ; SSE41: # BB#0:
1209 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1210 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
1211 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1212 ; SSE41-NEXT: pxor %xmm0, %xmm3
1213 ; SSE41-NEXT: pxor %xmm2, %xmm0
1214 ; SSE41-NEXT: movdqa %xmm0, %xmm4
1215 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
1216 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1217 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
1218 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1219 ; SSE41-NEXT: pand %xmm5, %xmm0
1220 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1221 ; SSE41-NEXT: por %xmm0, %xmm3
1222 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
1223 ; SSE41-NEXT: pxor %xmm3, %xmm0
1224 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
1225 ; SSE41-NEXT: movapd %xmm1, %xmm0
1226 ; SSE41-NEXT: retq
1227 ;
1228 ; SSE42-LABEL: max_le_v2i64:
1229 ; SSE42: # BB#0:
1230 ; SSE42-NEXT: movdqa %xmm0, %xmm2
1231 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
1232 ; SSE42-NEXT: pcmpeqd %xmm3, %xmm3
1233 ; SSE42-NEXT: pxor %xmm3, %xmm0
1234 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
1235 ; SSE42-NEXT: movapd %xmm1, %xmm0
1236 ; SSE42-NEXT: retq
1237 ;
1238 ; AVX-LABEL: max_le_v2i64:
1239 ; AVX: # BB#0:
1240 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1241 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1242 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
1243 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1244 ; AVX-NEXT: retq
1245 %1 = icmp sle <2 x i64> %a, %b
1246 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
1247 ret <2 x i64> %2
1248 }
1249
1250 define <4 x i64> @max_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
1251 ; SSE2-LABEL: max_le_v4i64:
1252 ; SSE2: # BB#0:
1253 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,0,2147483648,0]
1254 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1255 ; SSE2-NEXT: pxor %xmm7, %xmm4
1256 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1257 ; SSE2-NEXT: pxor %xmm7, %xmm5
1258 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1259 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1260 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1261 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
1262 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1263 ; SSE2-NEXT: pand %xmm8, %xmm4
1264 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
1265 ; SSE2-NEXT: por %xmm4, %xmm8
1266 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
1267 ; SSE2-NEXT: movdqa %xmm8, %xmm9
1268 ; SSE2-NEXT: pxor %xmm4, %xmm9
1269 ; SSE2-NEXT: movdqa %xmm2, %xmm6
1270 ; SSE2-NEXT: pxor %xmm7, %xmm6
1271 ; SSE2-NEXT: pxor %xmm0, %xmm7
1272 ; SSE2-NEXT: movdqa %xmm7, %xmm5
1273 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
1274 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
1275 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm7
1276 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1277 ; SSE2-NEXT: pand %xmm10, %xmm6
1278 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1279 ; SSE2-NEXT: por %xmm6, %xmm5
1280 ; SSE2-NEXT: pxor %xmm5, %xmm4
1281 ; SSE2-NEXT: pandn %xmm0, %xmm5
1282 ; SSE2-NEXT: pandn %xmm2, %xmm4
1283 ; SSE2-NEXT: por %xmm5, %xmm4
1284 ; SSE2-NEXT: pandn %xmm1, %xmm8
1285 ; SSE2-NEXT: pandn %xmm3, %xmm9
1286 ; SSE2-NEXT: por %xmm8, %xmm9
1287 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1288 ; SSE2-NEXT: movdqa %xmm9, %xmm1
1289 ; SSE2-NEXT: retq
1290 ;
1291 ; SSE41-LABEL: max_le_v4i64:
1292 ; SSE41: # BB#0:
1293 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1294 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
1295 ; SSE41-NEXT: movdqa %xmm3, %xmm5
1296 ; SSE41-NEXT: pxor %xmm0, %xmm5
1297 ; SSE41-NEXT: movdqa %xmm1, %xmm6
1298 ; SSE41-NEXT: pxor %xmm0, %xmm6
1299 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1300 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
1301 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1302 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1303 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1304 ; SSE41-NEXT: pand %xmm4, %xmm6
1305 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1306 ; SSE41-NEXT: por %xmm6, %xmm5
1307 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
1308 ; SSE41-NEXT: pxor %xmm9, %xmm5
1309 ; SSE41-NEXT: movdqa %xmm2, %xmm6
1310 ; SSE41-NEXT: pxor %xmm0, %xmm6
1311 ; SSE41-NEXT: pxor %xmm8, %xmm0
1312 ; SSE41-NEXT: movdqa %xmm0, %xmm7
1313 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
1314 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1315 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
1316 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1317 ; SSE41-NEXT: pand %xmm4, %xmm6
1318 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1319 ; SSE41-NEXT: por %xmm6, %xmm0
1320 ; SSE41-NEXT: pxor %xmm9, %xmm0
1321 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
1322 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1323 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
1324 ; SSE41-NEXT: movapd %xmm2, %xmm0
1325 ; SSE41-NEXT: movapd %xmm3, %xmm1
1326 ; SSE41-NEXT: retq
1327 ;
1328 ; SSE42-LABEL: max_le_v4i64:
1329 ; SSE42: # BB#0:
1330 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1331 ; SSE42-NEXT: movdqa %xmm1, %xmm5
1332 ; SSE42-NEXT: pcmpgtq %xmm3, %xmm5
1333 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
1334 ; SSE42-NEXT: pxor %xmm6, %xmm5
1335 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
1336 ; SSE42-NEXT: pxor %xmm6, %xmm0
1337 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
1338 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1339 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
1340 ; SSE42-NEXT: movapd %xmm2, %xmm0
1341 ; SSE42-NEXT: movapd %xmm3, %xmm1
1342 ; SSE42-NEXT: retq
1343 ;
1344 ; AVX1-LABEL: max_le_v4i64:
1345 ; AVX1: # BB#0:
1346 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1347 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1348 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
1349 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1350 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1351 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm4
1352 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm3
1353 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1354 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1355 ; AVX1-NEXT: retq
1356 ;
1357 ; AVX2-LABEL: max_le_v4i64:
1358 ; AVX2: # BB#0:
1359 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
1360 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1361 ; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
1362 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1363 ; AVX2-NEXT: retq
1364 ;
1365 ; AVX512-LABEL: max_le_v4i64:
1366 ; AVX512: # BB#0:
1367 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
1368 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1369 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
1370 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1371 ; AVX512-NEXT: retq
1372 %1 = icmp sle <4 x i64> %a, %b
1373 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
1374 ret <4 x i64> %2
1375 }
1376
1377 define <4 x i32> @max_le_v4i32(<4 x i32> %a, <4 x i32> %b) {
1378 ; SSE2-LABEL: max_le_v4i32:
1379 ; SSE2: # BB#0:
1380 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1381 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1382 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
1383 ; SSE2-NEXT: pxor %xmm2, %xmm3
1384 ; SSE2-NEXT: pandn %xmm0, %xmm2
1385 ; SSE2-NEXT: pandn %xmm1, %xmm3
1386 ; SSE2-NEXT: por %xmm3, %xmm2
1387 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1388 ; SSE2-NEXT: retq
1389 ;
1390 ; SSE41-LABEL: max_le_v4i32:
1391 ; SSE41: # BB#0:
1392 ; SSE41-NEXT: pminsd %xmm1, %xmm0
1393 ; SSE41-NEXT: retq
1394 ;
1395 ; SSE42-LABEL: max_le_v4i32:
1396 ; SSE42: # BB#0:
1397 ; SSE42-NEXT: pminsd %xmm1, %xmm0
1398 ; SSE42-NEXT: retq
1399 ;
1400 ; AVX-LABEL: max_le_v4i32:
1401 ; AVX: # BB#0:
1402 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0
1403 ; AVX-NEXT: retq
1404 %1 = icmp sle <4 x i32> %a, %b
1405 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
1406 ret <4 x i32> %2
1407 }
1408
1409 define <8 x i32> @max_le_v8i32(<8 x i32> %a, <8 x i32> %b) {
1410 ; SSE2-LABEL: max_le_v8i32:
1411 ; SSE2: # BB#0:
1412 ; SSE2-NEXT: movdqa %xmm1, %xmm6
1413 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
1414 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
1415 ; SSE2-NEXT: movdqa %xmm6, %xmm4
1416 ; SSE2-NEXT: pxor %xmm7, %xmm4
1417 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1418 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
1419 ; SSE2-NEXT: pxor %xmm5, %xmm7
1420 ; SSE2-NEXT: pandn %xmm0, %xmm5
1421 ; SSE2-NEXT: pandn %xmm2, %xmm7
1422 ; SSE2-NEXT: por %xmm7, %xmm5
1423 ; SSE2-NEXT: pandn %xmm1, %xmm6
1424 ; SSE2-NEXT: pandn %xmm3, %xmm4
1425 ; SSE2-NEXT: por %xmm6, %xmm4
1426 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1427 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1428 ; SSE2-NEXT: retq
1429 ;
1430 ; SSE41-LABEL: max_le_v8i32:
1431 ; SSE41: # BB#0:
1432 ; SSE41-NEXT: pminsd %xmm2, %xmm0
1433 ; SSE41-NEXT: pminsd %xmm3, %xmm1
1434 ; SSE41-NEXT: retq
1435 ;
1436 ; SSE42-LABEL: max_le_v8i32:
1437 ; SSE42: # BB#0:
1438 ; SSE42-NEXT: pminsd %xmm2, %xmm0
1439 ; SSE42-NEXT: pminsd %xmm3, %xmm1
1440 ; SSE42-NEXT: retq
1441 ;
1442 ; AVX1-LABEL: max_le_v8i32:
1443 ; AVX1: # BB#0:
1444 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1445 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1446 ; AVX1-NEXT: vpminsd %xmm2, %xmm3, %xmm2
1447 ; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm0
1448 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1449 ; AVX1-NEXT: retq
1450 ;
1451 ; AVX2-LABEL: max_le_v8i32:
1452 ; AVX2: # BB#0:
1453 ; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm0
1454 ; AVX2-NEXT: retq
1455 ;
1456 ; AVX512-LABEL: max_le_v8i32:
1457 ; AVX512: # BB#0:
1458 ; AVX512-NEXT: vpminsd %ymm1, %ymm0, %ymm0
1459 ; AVX512-NEXT: retq
1460 %1 = icmp sle <8 x i32> %a, %b
1461 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1462 ret <8 x i32> %2
1463 }
1464
1465 define <8 x i16> @max_le_v8i16(<8 x i16> %a, <8 x i16> %b) {
1466 ; SSE-LABEL: max_le_v8i16:
1467 ; SSE: # BB#0:
1468 ; SSE-NEXT: pminsw %xmm1, %xmm0
1469 ; SSE-NEXT: retq
1470 ;
1471 ; AVX-LABEL: max_le_v8i16:
1472 ; AVX: # BB#0:
1473 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm0
1474 ; AVX-NEXT: retq
1475 %1 = icmp sle <8 x i16> %a, %b
1476 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1477 ret <8 x i16> %2
1478 }
1479
1480 define <16 x i16> @max_le_v16i16(<16 x i16> %a, <16 x i16> %b) {
1481 ; SSE-LABEL: max_le_v16i16:
1482 ; SSE: # BB#0:
1483 ; SSE-NEXT: pminsw %xmm2, %xmm0
1484 ; SSE-NEXT: pminsw %xmm3, %xmm1
1485 ; SSE-NEXT: retq
1486 ;
1487 ; AVX1-LABEL: max_le_v16i16:
1488 ; AVX1: # BB#0:
1489 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1490 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1491 ; AVX1-NEXT: vpminsw %xmm2, %xmm3, %xmm2
1492 ; AVX1-NEXT: vpminsw %xmm1, %xmm0, %xmm0
1493 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1494 ; AVX1-NEXT: retq
1495 ;
1496 ; AVX2-LABEL: max_le_v16i16:
1497 ; AVX2: # BB#0:
1498 ; AVX2-NEXT: vpminsw %ymm1, %ymm0, %ymm0
1499 ; AVX2-NEXT: retq
1500 ;
1501 ; AVX512-LABEL: max_le_v16i16:
1502 ; AVX512: # BB#0:
1503 ; AVX512-NEXT: vpminsw %ymm1, %ymm0, %ymm0
1504 ; AVX512-NEXT: retq
1505 %1 = icmp sle <16 x i16> %a, %b
1506 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1507 ret <16 x i16> %2
1508 }
1509
1510 define <16 x i8> @max_le_v16i8(<16 x i8> %a, <16 x i8> %b) {
1511 ; SSE2-LABEL: max_le_v16i8:
1512 ; SSE2: # BB#0:
1513 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1514 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
1515 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
1516 ; SSE2-NEXT: pxor %xmm2, %xmm3
1517 ; SSE2-NEXT: pandn %xmm0, %xmm2
1518 ; SSE2-NEXT: pandn %xmm1, %xmm3
1519 ; SSE2-NEXT: por %xmm3, %xmm2
1520 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1521 ; SSE2-NEXT: retq
1522 ;
1523 ; SSE41-LABEL: max_le_v16i8:
1524 ; SSE41: # BB#0:
1525 ; SSE41-NEXT: pminsb %xmm1, %xmm0
1526 ; SSE41-NEXT: retq
1527 ;
1528 ; SSE42-LABEL: max_le_v16i8:
1529 ; SSE42: # BB#0:
1530 ; SSE42-NEXT: pminsb %xmm1, %xmm0
1531 ; SSE42-NEXT: retq
1532 ;
1533 ; AVX-LABEL: max_le_v16i8:
1534 ; AVX: # BB#0:
1535 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm0
1536 ; AVX-NEXT: retq
1537 %1 = icmp sle <16 x i8> %a, %b
1538 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1539 ret <16 x i8> %2
1540 }
1541
1542 define <32 x i8> @max_le_v32i8(<32 x i8> %a, <32 x i8> %b) {
1543 ; SSE2-LABEL: max_le_v32i8:
1544 ; SSE2: # BB#0:
1545 ; SSE2-NEXT: movdqa %xmm1, %xmm6
1546 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm6
1547 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
1548 ; SSE2-NEXT: movdqa %xmm6, %xmm4
1549 ; SSE2-NEXT: pxor %xmm7, %xmm4
1550 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1551 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1552 ; SSE2-NEXT: pxor %xmm5, %xmm7
1553 ; SSE2-NEXT: pandn %xmm0, %xmm5
1554 ; SSE2-NEXT: pandn %xmm2, %xmm7
1555 ; SSE2-NEXT: por %xmm7, %xmm5
1556 ; SSE2-NEXT: pandn %xmm1, %xmm6
1557 ; SSE2-NEXT: pandn %xmm3, %xmm4
1558 ; SSE2-NEXT: por %xmm6, %xmm4
1559 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1560 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1561 ; SSE2-NEXT: retq
1562 ;
1563 ; SSE41-LABEL: max_le_v32i8:
1564 ; SSE41: # BB#0:
1565 ; SSE41-NEXT: pminsb %xmm2, %xmm0
1566 ; SSE41-NEXT: pminsb %xmm3, %xmm1
1567 ; SSE41-NEXT: retq
1568 ;
1569 ; SSE42-LABEL: max_le_v32i8:
1570 ; SSE42: # BB#0:
1571 ; SSE42-NEXT: pminsb %xmm2, %xmm0
1572 ; SSE42-NEXT: pminsb %xmm3, %xmm1
1573 ; SSE42-NEXT: retq
1574 ;
1575 ; AVX1-LABEL: max_le_v32i8:
1576 ; AVX1: # BB#0:
1577 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1578 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1579 ; AVX1-NEXT: vpminsb %xmm2, %xmm3, %xmm2
1580 ; AVX1-NEXT: vpminsb %xmm1, %xmm0, %xmm0
1581 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1582 ; AVX1-NEXT: retq
1583 ;
1584 ; AVX2-LABEL: max_le_v32i8:
1585 ; AVX2: # BB#0:
1586 ; AVX2-NEXT: vpminsb %ymm1, %ymm0, %ymm0
1587 ; AVX2-NEXT: retq
1588 ;
1589 ; AVX512-LABEL: max_le_v32i8:
1590 ; AVX512: # BB#0:
1591 ; AVX512-NEXT: vpminsb %ymm1, %ymm0, %ymm0
1592 ; AVX512-NEXT: retq
1593 %1 = icmp sle <32 x i8> %a, %b
1594 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1595 ret <32 x i8> %2
1596 }
0 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
7
8 ;
9 ; Unsigned Maximum (GT)
10 ;
11
12 define <2 x i64> @max_gt_v2i64(<2 x i64> %a, <2 x i64> %b) {
13 ; SSE2-LABEL: max_gt_v2i64:
14 ; SSE2: # BB#0:
15 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
16 ; SSE2-NEXT: movdqa %xmm1, %xmm3
17 ; SSE2-NEXT: pxor %xmm2, %xmm3
18 ; SSE2-NEXT: pxor %xmm0, %xmm2
19 ; SSE2-NEXT: movdqa %xmm2, %xmm4
20 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
21 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
22 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
23 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
24 ; SSE2-NEXT: pand %xmm5, %xmm2
25 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
26 ; SSE2-NEXT: por %xmm2, %xmm3
27 ; SSE2-NEXT: pand %xmm3, %xmm0
28 ; SSE2-NEXT: pandn %xmm1, %xmm3
29 ; SSE2-NEXT: por %xmm3, %xmm0
30 ; SSE2-NEXT: retq
31 ;
32 ; SSE41-LABEL: max_gt_v2i64:
33 ; SSE41: # BB#0:
34 ; SSE41-NEXT: movdqa %xmm0, %xmm2
35 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
36 ; SSE41-NEXT: movdqa %xmm1, %xmm3
37 ; SSE41-NEXT: pxor %xmm0, %xmm3
38 ; SSE41-NEXT: pxor %xmm2, %xmm0
39 ; SSE41-NEXT: movdqa %xmm0, %xmm4
40 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
41 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
42 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
43 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
44 ; SSE41-NEXT: pand %xmm5, %xmm3
45 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
46 ; SSE41-NEXT: por %xmm3, %xmm0
47 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
48 ; SSE41-NEXT: movapd %xmm1, %xmm0
49 ; SSE41-NEXT: retq
50 ;
51 ; SSE42-LABEL: max_gt_v2i64:
52 ; SSE42: # BB#0:
53 ; SSE42-NEXT: movdqa %xmm0, %xmm2
54 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
55 ; SSE42-NEXT: movdqa %xmm1, %xmm3
56 ; SSE42-NEXT: pxor %xmm0, %xmm3
57 ; SSE42-NEXT: pxor %xmm2, %xmm0
58 ; SSE42-NEXT: pcmpgtq %xmm3, %xmm0
59 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
60 ; SSE42-NEXT: movapd %xmm1, %xmm0
61 ; SSE42-NEXT: retq
62 ;
63 ; AVX-LABEL: max_gt_v2i64:
64 ; AVX: # BB#0:
65 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
66 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm3
67 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm2
68 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
69 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
70 ; AVX-NEXT: retq
71 %1 = icmp ugt <2 x i64> %a, %b
72 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
73 ret <2 x i64> %2
74 }
75
76 define <4 x i64> @max_gt_v4i64(<4 x i64> %a, <4 x i64> %b) {
77 ; SSE2-LABEL: max_gt_v4i64:
78 ; SSE2: # BB#0:
79 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
80 ; SSE2-NEXT: movdqa %xmm3, %xmm5
81 ; SSE2-NEXT: pxor %xmm4, %xmm5
82 ; SSE2-NEXT: movdqa %xmm1, %xmm6
83 ; SSE2-NEXT: pxor %xmm4, %xmm6
84 ; SSE2-NEXT: movdqa %xmm6, %xmm7
85 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
86 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
87 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
88 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
89 ; SSE2-NEXT: pand %xmm8, %xmm5
90 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
91 ; SSE2-NEXT: por %xmm5, %xmm6
92 ; SSE2-NEXT: movdqa %xmm2, %xmm5
93 ; SSE2-NEXT: pxor %xmm4, %xmm5
94 ; SSE2-NEXT: pxor %xmm0, %xmm4
95 ; SSE2-NEXT: movdqa %xmm4, %xmm7
96 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
97 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
98 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
99 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
100 ; SSE2-NEXT: pand %xmm8, %xmm4
101 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
102 ; SSE2-NEXT: por %xmm4, %xmm5
103 ; SSE2-NEXT: pand %xmm5, %xmm0
104 ; SSE2-NEXT: pandn %xmm2, %xmm5
105 ; SSE2-NEXT: por %xmm5, %xmm0
106 ; SSE2-NEXT: pand %xmm6, %xmm1
107 ; SSE2-NEXT: pandn %xmm3, %xmm6
108 ; SSE2-NEXT: por %xmm6, %xmm1
109 ; SSE2-NEXT: retq
110 ;
111 ; SSE41-LABEL: max_gt_v4i64:
112 ; SSE41: # BB#0:
113 ; SSE41-NEXT: movdqa %xmm0, %xmm8
114 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
115 ; SSE41-NEXT: movdqa %xmm3, %xmm5
116 ; SSE41-NEXT: pxor %xmm0, %xmm5
117 ; SSE41-NEXT: movdqa %xmm1, %xmm6
118 ; SSE41-NEXT: pxor %xmm0, %xmm6
119 ; SSE41-NEXT: movdqa %xmm6, %xmm7
120 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
121 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
122 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
123 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
124 ; SSE41-NEXT: pand %xmm4, %xmm6
125 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
126 ; SSE41-NEXT: por %xmm6, %xmm5
127 ; SSE41-NEXT: movdqa %xmm2, %xmm4
128 ; SSE41-NEXT: pxor %xmm0, %xmm4
129 ; SSE41-NEXT: pxor %xmm8, %xmm0
130 ; SSE41-NEXT: movdqa %xmm0, %xmm6
131 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm6
132 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
133 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
134 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
135 ; SSE41-NEXT: pand %xmm7, %xmm4
136 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
137 ; SSE41-NEXT: por %xmm4, %xmm0
138 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
139 ; SSE41-NEXT: movdqa %xmm5, %xmm0
140 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
141 ; SSE41-NEXT: movapd %xmm2, %xmm0
142 ; SSE41-NEXT: movapd %xmm3, %xmm1
143 ; SSE41-NEXT: retq
144 ;
145 ; SSE42-LABEL: max_gt_v4i64:
146 ; SSE42: # BB#0:
147 ; SSE42-NEXT: movdqa %xmm0, %xmm4
148 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
149 ; SSE42-NEXT: movdqa %xmm3, %xmm6
150 ; SSE42-NEXT: pxor %xmm0, %xmm6
151 ; SSE42-NEXT: movdqa %xmm1, %xmm5
152 ; SSE42-NEXT: pxor %xmm0, %xmm5
153 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
154 ; SSE42-NEXT: movdqa %xmm2, %xmm6
155 ; SSE42-NEXT: pxor %xmm0, %xmm6
156 ; SSE42-NEXT: pxor %xmm4, %xmm0
157 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm0
158 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
159 ; SSE42-NEXT: movdqa %xmm5, %xmm0
160 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
161 ; SSE42-NEXT: movapd %xmm2, %xmm0
162 ; SSE42-NEXT: movapd %xmm3, %xmm1
163 ; SSE42-NEXT: retq
164 ;
165 ; AVX1-LABEL: max_gt_v4i64:
166 ; AVX1: # BB#0:
167 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
168 ; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
169 ; AVX1-NEXT: vxorps %xmm3, %xmm2, %xmm2
170 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
171 ; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm4
172 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
173 ; AVX1-NEXT: vxorps %xmm3, %xmm1, %xmm4
174 ; AVX1-NEXT: vxorps %xmm3, %xmm0, %xmm3
175 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3
176 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
177 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
178 ; AVX1-NEXT: retq
179 ;
180 ; AVX2-LABEL: max_gt_v4i64:
181 ; AVX2: # BB#0:
182 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
183 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
184 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
185 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
186 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
187 ; AVX2-NEXT: retq
188 ;
189 ; AVX512-LABEL: max_gt_v4i64:
190 ; AVX512: # BB#0:
191 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
192 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm3
193 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm2
194 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
195 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
196 ; AVX512-NEXT: retq
197 %1 = icmp ugt <4 x i64> %a, %b
198 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
199 ret <4 x i64> %2
200 }
201
202 define <4 x i32> @max_gt_v4i32(<4 x i32> %a, <4 x i32> %b) {
203 ; SSE2-LABEL: max_gt_v4i32:
204 ; SSE2: # BB#0:
205 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
206 ; SSE2-NEXT: movdqa %xmm1, %xmm3
207 ; SSE2-NEXT: pxor %xmm2, %xmm3
208 ; SSE2-NEXT: pxor %xmm0, %xmm2
209 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
210 ; SSE2-NEXT: pand %xmm2, %xmm0
211 ; SSE2-NEXT: pandn %xmm1, %xmm2
212 ; SSE2-NEXT: por %xmm2, %xmm0
213 ; SSE2-NEXT: retq
214 ;
215 ; SSE41-LABEL: max_gt_v4i32:
216 ; SSE41: # BB#0:
217 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
218 ; SSE41-NEXT: retq
219 ;
220 ; SSE42-LABEL: max_gt_v4i32:
221 ; SSE42: # BB#0:
222 ; SSE42-NEXT: pmaxud %xmm1, %xmm0
223 ; SSE42-NEXT: retq
224 ;
225 ; AVX-LABEL: max_gt_v4i32:
226 ; AVX: # BB#0:
227 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
228 ; AVX-NEXT: retq
229 %1 = icmp ugt <4 x i32> %a, %b
230 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
231 ret <4 x i32> %2
232 }
233
234 define <8 x i32> @max_gt_v8i32(<8 x i32> %a, <8 x i32> %b) {
235 ; SSE2-LABEL: max_gt_v8i32:
236 ; SSE2: # BB#0:
237 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
238 ; SSE2-NEXT: movdqa %xmm3, %xmm6
239 ; SSE2-NEXT: pxor %xmm5, %xmm6
240 ; SSE2-NEXT: movdqa %xmm1, %xmm4
241 ; SSE2-NEXT: pxor %xmm5, %xmm4
242 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
243 ; SSE2-NEXT: movdqa %xmm2, %xmm6
244 ; SSE2-NEXT: pxor %xmm5, %xmm6
245 ; SSE2-NEXT: pxor %xmm0, %xmm5
246 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
247 ; SSE2-NEXT: pand %xmm5, %xmm0
248 ; SSE2-NEXT: pandn %xmm2, %xmm5
249 ; SSE2-NEXT: por %xmm5, %xmm0
250 ; SSE2-NEXT: pand %xmm4, %xmm1
251 ; SSE2-NEXT: pandn %xmm3, %xmm4
252 ; SSE2-NEXT: por %xmm1, %xmm4
253 ; SSE2-NEXT: movdqa %xmm4, %xmm1
254 ; SSE2-NEXT: retq
255 ;
256 ; SSE41-LABEL: max_gt_v8i32:
257 ; SSE41: # BB#0:
258 ; SSE41-NEXT: pmaxud %xmm2, %xmm0
259 ; SSE41-NEXT: pmaxud %xmm3, %xmm1
260 ; SSE41-NEXT: retq
261 ;
262 ; SSE42-LABEL: max_gt_v8i32:
263 ; SSE42: # BB#0:
264 ; SSE42-NEXT: pmaxud %xmm2, %xmm0
265 ; SSE42-NEXT: pmaxud %xmm3, %xmm1
266 ; SSE42-NEXT: retq
267 ;
268 ; AVX1-LABEL: max_gt_v8i32:
269 ; AVX1: # BB#0:
270 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
271 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
272 ; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm2
273 ; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
274 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
275 ; AVX1-NEXT: retq
276 ;
277 ; AVX2-LABEL: max_gt_v8i32:
278 ; AVX2: # BB#0:
279 ; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
280 ; AVX2-NEXT: retq
281 ;
282 ; AVX512-LABEL: max_gt_v8i32:
283 ; AVX512: # BB#0:
284 ; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
285 ; AVX512-NEXT: retq
286 %1 = icmp ugt <8 x i32> %a, %b
287 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
288 ret <8 x i32> %2
289 }
290
291 define <8 x i16> @max_gt_v8i16(<8 x i16> %a, <8 x i16> %b) {
292 ; SSE2-LABEL: max_gt_v8i16:
293 ; SSE2: # BB#0:
294 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
295 ; SSE2-NEXT: movdqa %xmm1, %xmm3
296 ; SSE2-NEXT: pxor %xmm2, %xmm3
297 ; SSE2-NEXT: pxor %xmm0, %xmm2
298 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
299 ; SSE2-NEXT: pand %xmm2, %xmm0
300 ; SSE2-NEXT: pandn %xmm1, %xmm2
301 ; SSE2-NEXT: por %xmm2, %xmm0
302 ; SSE2-NEXT: retq
303 ;
304 ; SSE41-LABEL: max_gt_v8i16:
305 ; SSE41: # BB#0:
306 ; SSE41-NEXT: pmaxuw %xmm1, %xmm0
307 ; SSE41-NEXT: retq
308 ;
309 ; SSE42-LABEL: max_gt_v8i16:
310 ; SSE42: # BB#0:
311 ; SSE42-NEXT: pmaxuw %xmm1, %xmm0
312 ; SSE42-NEXT: retq
313 ;
314 ; AVX-LABEL: max_gt_v8i16:
315 ; AVX: # BB#0:
316 ; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
317 ; AVX-NEXT: retq
318 %1 = icmp ugt <8 x i16> %a, %b
319 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
320 ret <8 x i16> %2
321 }
322
323 define <16 x i16> @max_gt_v16i16(<16 x i16> %a, <16 x i16> %b) {
324 ; SSE2-LABEL: max_gt_v16i16:
325 ; SSE2: # BB#0:
326 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768]
327 ; SSE2-NEXT: movdqa %xmm3, %xmm6
328 ; SSE2-NEXT: pxor %xmm5, %xmm6
329 ; SSE2-NEXT: movdqa %xmm1, %xmm4
330 ; SSE2-NEXT: pxor %xmm5, %xmm4
331 ; SSE2-NEXT: pcmpgtw %xmm6, %xmm4
332 ; SSE2-NEXT: movdqa %xmm2, %xmm6
333 ; SSE2-NEXT: pxor %xmm5, %xmm6
334 ; SSE2-NEXT: pxor %xmm0, %xmm5
335 ; SSE2-NEXT: pcmpgtw %xmm6, %xmm5
336 ; SSE2-NEXT: pand %xmm5, %xmm0
337 ; SSE2-NEXT: pandn %xmm2, %xmm5
338 ; SSE2-NEXT: por %xmm5, %xmm0
339 ; SSE2-NEXT: pand %xmm4, %xmm1
340 ; SSE2-NEXT: pandn %xmm3, %xmm4
341 ; SSE2-NEXT: por %xmm1, %xmm4
342 ; SSE2-NEXT: movdqa %xmm4, %xmm1
343 ; SSE2-NEXT: retq
344 ;
345 ; SSE41-LABEL: max_gt_v16i16:
346 ; SSE41: # BB#0:
347 ; SSE41-NEXT: pmaxuw %xmm2, %xmm0
348 ; SSE41-NEXT: pmaxuw %xmm3, %xmm1
349 ; SSE41-NEXT: retq
350 ;
351 ; SSE42-LABEL: max_gt_v16i16:
352 ; SSE42: # BB#0:
353 ; SSE42-NEXT: pmaxuw %xmm2, %xmm0
354 ; SSE42-NEXT: pmaxuw %xmm3, %xmm1
355 ; SSE42-NEXT: retq
356 ;
357 ; AVX1-LABEL: max_gt_v16i16:
358 ; AVX1: # BB#0:
359 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
360 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
361 ; AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm2
362 ; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
363 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
364 ; AVX1-NEXT: retq
365 ;
366 ; AVX2-LABEL: max_gt_v16i16:
367 ; AVX2: # BB#0:
368 ; AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
369 ; AVX2-NEXT: retq
370 ;
371 ; AVX512-LABEL: max_gt_v16i16:
372 ; AVX512: # BB#0:
373 ; AVX512-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
374 ; AVX512-NEXT: retq
375 %1 = icmp ugt <16 x i16> %a, %b
376 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
377 ret <16 x i16> %2
378 }
379
380 define <16 x i8> @max_gt_v16i8(<16 x i8> %a, <16 x i8> %b) {
381 ; SSE-LABEL: max_gt_v16i8:
382 ; SSE: # BB#0:
383 ; SSE-NEXT: pmaxub %xmm1, %xmm0
384 ; SSE-NEXT: retq
385 ;
386 ; AVX-LABEL: max_gt_v16i8:
387 ; AVX: # BB#0:
388 ; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
389 ; AVX-NEXT: retq
390 %1 = icmp ugt <16 x i8> %a, %b
391 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
392 ret <16 x i8> %2
393 }
394
395 define <32 x i8> @max_gt_v32i8(<32 x i8> %a, <32 x i8> %b) {
396 ; SSE-LABEL: max_gt_v32i8:
397 ; SSE: # BB#0:
398 ; SSE-NEXT: pmaxub %xmm2, %xmm0
399 ; SSE-NEXT: pmaxub %xmm3, %xmm1
400 ; SSE-NEXT: retq
401 ;
402 ; AVX1-LABEL: max_gt_v32i8:
403 ; AVX1: # BB#0:
404 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
405 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
406 ; AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm2
407 ; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
408 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
409 ; AVX1-NEXT: retq
410 ;
411 ; AVX2-LABEL: max_gt_v32i8:
412 ; AVX2: # BB#0:
413 ; AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
414 ; AVX2-NEXT: retq
415 ;
416 ; AVX512-LABEL: max_gt_v32i8:
417 ; AVX512: # BB#0:
418 ; AVX512-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
419 ; AVX512-NEXT: retq
420 %1 = icmp ugt <32 x i8> %a, %b
421 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
422 ret <32 x i8> %2
423 }
424
425 ;
426 ; Unsigned Maximum (GE)
427 ;
428
429 define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
430 ; SSE2-LABEL: max_ge_v2i64:
431 ; SSE2: # BB#0:
432 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
433 ; SSE2-NEXT: movdqa %xmm0, %xmm3
434 ; SSE2-NEXT: pxor %xmm2, %xmm3
435 ; SSE2-NEXT: pxor %xmm1, %xmm2
436 ; SSE2-NEXT: movdqa %xmm2, %xmm4
437 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
438 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
439 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
440 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
441 ; SSE2-NEXT: pand %xmm5, %xmm2
442 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
443 ; SSE2-NEXT: por %xmm2, %xmm3
444 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
445 ; SSE2-NEXT: pxor %xmm3, %xmm2
446 ; SSE2-NEXT: pandn %xmm0, %xmm3
447 ; SSE2-NEXT: pandn %xmm1, %xmm2
448 ; SSE2-NEXT: por %xmm3, %xmm2
449 ; SSE2-NEXT: movdqa %xmm2, %xmm0
450 ; SSE2-NEXT: retq
451 ;
452 ; SSE41-LABEL: max_ge_v2i64:
453 ; SSE41: # BB#0:
454 ; SSE41-NEXT: movdqa %xmm0, %xmm2
455 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
456 ; SSE41-NEXT: movdqa %xmm2, %xmm3
457 ; SSE41-NEXT: pxor %xmm0, %xmm3
458 ; SSE41-NEXT: pxor %xmm1, %xmm0
459 ; SSE41-NEXT: movdqa %xmm0, %xmm4
460 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
461 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
462 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
463 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
464 ; SSE41-NEXT: pand %xmm5, %xmm0
465 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
466 ; SSE41-NEXT: por %xmm0, %xmm3
467 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
468 ; SSE41-NEXT: pxor %xmm3, %xmm0
469 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
470 ; SSE41-NEXT: movapd %xmm1, %xmm0
471 ; SSE41-NEXT: retq
472 ;
473 ; SSE42-LABEL: max_ge_v2i64:
474 ; SSE42: # BB#0:
475 ; SSE42-NEXT: movdqa %xmm0, %xmm2
476 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
477 ; SSE42-NEXT: pxor %xmm3, %xmm0
478 ; SSE42-NEXT: pxor %xmm1, %xmm3
479 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm3
480 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
481 ; SSE42-NEXT: pxor %xmm3, %xmm0
482 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
483 ; SSE42-NEXT: movapd %xmm1, %xmm0
484 ; SSE42-NEXT: retq
485 ;
486 ; AVX-LABEL: max_ge_v2i64:
487 ; AVX: # BB#0:
488 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
489 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
490 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
491 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
492 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
493 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
494 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
495 ; AVX-NEXT: retq
496 %1 = icmp uge <2 x i64> %a, %b
497 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
498 ret <2 x i64> %2
499 }
500
501 define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
502 ; SSE2-LABEL: max_ge_v4i64:
503 ; SSE2: # BB#0:
504 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
505 ; SSE2-NEXT: movdqa %xmm1, %xmm4
506 ; SSE2-NEXT: pxor %xmm7, %xmm4
507 ; SSE2-NEXT: movdqa %xmm3, %xmm5
508 ; SSE2-NEXT: pxor %xmm7, %xmm5
509 ; SSE2-NEXT: movdqa %xmm5, %xmm6
510 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
511 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
512 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
513 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
514 ; SSE2-NEXT: pand %xmm8, %xmm4
515 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
516 ; SSE2-NEXT: por %xmm4, %xmm8
517 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
518 ; SSE2-NEXT: movdqa %xmm8, %xmm9
519 ; SSE2-NEXT: pxor %xmm4, %xmm9
520 ; SSE2-NEXT: movdqa %xmm0, %xmm6
521 ; SSE2-NEXT: pxor %xmm7, %xmm6
522 ; SSE2-NEXT: pxor %xmm2, %xmm7
523 ; SSE2-NEXT: movdqa %xmm7, %xmm5
524 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
525 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
526 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm7
527 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
528 ; SSE2-NEXT: pand %xmm10, %xmm6
529 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
530 ; SSE2-NEXT: por %xmm6, %xmm5
531 ; SSE2-NEXT: pxor %xmm5, %xmm4
532 ; SSE2-NEXT: pandn %xmm0, %xmm5
533 ; SSE2-NEXT: pandn %xmm2, %xmm4
534 ; SSE2-NEXT: por %xmm5, %xmm4
535 ; SSE2-NEXT: pandn %xmm1, %xmm8
536 ; SSE2-NEXT: pandn %xmm3, %xmm9
537 ; SSE2-NEXT: por %xmm8, %xmm9
538 ; SSE2-NEXT: movdqa %xmm4, %xmm0
539 ; SSE2-NEXT: movdqa %xmm9, %xmm1
540 ; SSE2-NEXT: retq
541 ;
542 ; SSE41-LABEL: max_ge_v4i64:
543 ; SSE41: # BB#0:
544 ; SSE41-NEXT: movdqa %xmm0, %xmm8
545 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
546 ; SSE41-NEXT: movdqa %xmm1, %xmm5
547 ; SSE41-NEXT: pxor %xmm0, %xmm5
548 ; SSE41-NEXT: movdqa %xmm3, %xmm6
549 ; SSE41-NEXT: pxor %xmm0, %xmm6
550 ; SSE41-NEXT: movdqa %xmm6, %xmm7
551 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
552 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
553 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
554 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
555 ; SSE41-NEXT: pand %xmm4, %xmm6
556 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
557 ; SSE41-NEXT: por %xmm6, %xmm5
558 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
559 ; SSE41-NEXT: pxor %xmm9, %xmm5
560 ; SSE41-NEXT: movdqa %xmm8, %xmm6
561 ; SSE41-NEXT: pxor %xmm0, %xmm6
562 ; SSE41-NEXT: pxor %xmm2, %xmm0
563 ; SSE41-NEXT: movdqa %xmm0, %xmm7
564 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
565 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
566 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
567 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
568 ; SSE41-NEXT: pand %xmm4, %xmm6
569 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
570 ; SSE41-NEXT: por %xmm6, %xmm0
571 ; SSE41-NEXT: pxor %xmm9, %xmm0
572 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
573 ; SSE41-NEXT: movdqa %xmm5, %xmm0
574 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
575 ; SSE41-NEXT: movapd %xmm2, %xmm0
576 ; SSE41-NEXT: movapd %xmm3, %xmm1
577 ; SSE41-NEXT: retq
578 ;
579 ; SSE42-LABEL: max_ge_v4i64:
580 ; SSE42: # BB#0:
581 ; SSE42-NEXT: movdqa %xmm0, %xmm4
582 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
583 ; SSE42-NEXT: movdqa %xmm1, %xmm6
584 ; SSE42-NEXT: pxor %xmm0, %xmm6
585 ; SSE42-NEXT: movdqa %xmm3, %xmm5
586 ; SSE42-NEXT: pxor %xmm0, %xmm5
587 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
588 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
589 ; SSE42-NEXT: pxor %xmm6, %xmm5
590 ; SSE42-NEXT: movdqa %xmm4, %xmm7
591 ; SSE42-NEXT: pxor %xmm0, %xmm7
592 ; SSE42-NEXT: pxor %xmm2, %xmm0
593 ; SSE42-NEXT: pcmpgtq %xmm7, %xmm0
594 ; SSE42-NEXT: pxor %xmm6, %xmm0
595 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
596 ; SSE42-NEXT: movdqa %xmm5, %xmm0
597 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
598 ; SSE42-NEXT: movapd %xmm2, %xmm0
599 ; SSE42-NEXT: movapd %xmm3, %xmm1
600 ; SSE42-NEXT: retq
601 ;
602 ; AVX1-LABEL: max_ge_v4i64:
603 ; AVX1: # BB#0:
604 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
605 ; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
606 ; AVX1-NEXT: vxorps %xmm3, %xmm2, %xmm2
607 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
608 ; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm4
609 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
610 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
611 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
612 ; AVX1-NEXT: vxorps %xmm3, %xmm0, %xmm5
613 ; AVX1-NEXT: vxorps %xmm3, %xmm1, %xmm3
614 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm3
615 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
616 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
617 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
618 ; AVX1-NEXT: retq
619 ;
620 ; AVX2-LABEL: max_ge_v4i64:
621 ; AVX2: # BB#0:
622 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
623 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
624 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
625 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
626 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
627 ; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
628 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
629 ; AVX2-NEXT: retq
630 ;
631 ; AVX512-LABEL: max_ge_v4i64:
632 ; AVX512: # BB#0:
633 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
634 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm3
635 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm2
636 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
637 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
638 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
639 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
640 ; AVX512-NEXT: retq
641 %1 = icmp uge <4 x i64> %a, %b
642 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
643 ret <4 x i64> %2
644 }
645
646 define <4 x i32> @max_ge_v4i32(<4 x i32> %a, <4 x i32> %b) {
647 ; SSE2-LABEL: max_ge_v4i32:
648 ; SSE2: # BB#0:
649 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
650 ; SSE2-NEXT: movdqa %xmm0, %xmm2
651 ; SSE2-NEXT: pxor %xmm3, %xmm2
652 ; SSE2-NEXT: pxor %xmm1, %xmm3
653 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
654 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
655 ; SSE2-NEXT: pxor %xmm3, %xmm2
656 ; SSE2-NEXT: pandn %xmm0, %xmm3
657 ; SSE2-NEXT: pandn %xmm1, %xmm2
658 ; SSE2-NEXT: por %xmm3, %xmm2
659 ; SSE2-NEXT: movdqa %xmm2, %xmm0
660 ; SSE2-NEXT: retq
661 ;
662 ; SSE41-LABEL: max_ge_v4i32:
663 ; SSE41: # BB#0:
664 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
665 ; SSE41-NEXT: retq
666 ;
667 ; SSE42-LABEL: max_ge_v4i32:
668 ; SSE42: # BB#0:
669 ; SSE42-NEXT: pmaxud %xmm1, %xmm0
670 ; SSE42-NEXT: retq
671 ;
672 ; AVX-LABEL: max_ge_v4i32:
673 ; AVX: # BB#0:
674 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
675 ; AVX-NEXT: retq
676 %1 = icmp uge <4 x i32> %a, %b
677 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
678 ret <4 x i32> %2
679 }
680
681 define <8 x i32> @max_ge_v8i32(<8 x i32> %a, <8 x i32> %b) {
682 ; SSE2-LABEL: max_ge_v8i32:
683 ; SSE2: # BB#0:
684 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
685 ; SSE2-NEXT: movdqa %xmm1, %xmm4
686 ; SSE2-NEXT: pxor %xmm6, %xmm4
687 ; SSE2-NEXT: movdqa %xmm3, %xmm7
688 ; SSE2-NEXT: pxor %xmm6, %xmm7
689 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm7
690 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
691 ; SSE2-NEXT: movdqa %xmm7, %xmm5
692 ; SSE2-NEXT: pxor %xmm4, %xmm5
693 ; SSE2-NEXT: movdqa %xmm0, %xmm8
694 ; SSE2-NEXT: pxor %xmm6, %xmm8
695 ; SSE2-NEXT: pxor %xmm2, %xmm6
696 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm6
697 ; SSE2-NEXT: pxor %xmm6, %xmm4
698 ; SSE2-NEXT: pandn %xmm0, %xmm6
699 ; SSE2-NEXT: pandn %xmm2, %xmm4
700 ; SSE2-NEXT: por %xmm6, %xmm4
701 ; SSE2-NEXT: pandn %xmm1, %xmm7
702 ; SSE2-NEXT: pandn %xmm3, %xmm5
703 ; SSE2-NEXT: por %xmm7, %xmm5
704 ; SSE2-NEXT: movdqa %xmm4, %xmm0
705 ; SSE2-NEXT: movdqa %xmm5, %xmm1
706 ; SSE2-NEXT: retq
707 ;
708 ; SSE41-LABEL: max_ge_v8i32:
709 ; SSE41: # BB#0:
710 ; SSE41-NEXT: pmaxud %xmm2, %xmm0
711 ; SSE41-NEXT: pmaxud %xmm3, %xmm1
712 ; SSE41-NEXT: retq
713 ;
714 ; SSE42-LABEL: max_ge_v8i32:
715 ; SSE42: # BB#0:
716 ; SSE42-NEXT: pmaxud %xmm2, %xmm0
717 ; SSE42-NEXT: pmaxud %xmm3, %xmm1
718 ; SSE42-NEXT: retq
719 ;
720 ; AVX1-LABEL: max_ge_v8i32:
721 ; AVX1: # BB#0:
722 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
723 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
724 ; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm2
725 ; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
726 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
727 ; AVX1-NEXT: retq
728 ;
729 ; AVX2-LABEL: max_ge_v8i32:
730 ; AVX2: # BB#0:
731 ; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
732 ; AVX2-NEXT: retq
733 ;
734 ; AVX512-LABEL: max_ge_v8i32:
735 ; AVX512: # BB#0:
736 ; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
737 ; AVX512-NEXT: retq
738 %1 = icmp uge <8 x i32> %a, %b
739 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
740 ret <8 x i32> %2
741 }
742
743 define <8 x i16> @max_ge_v8i16(<8 x i16> %a, <8 x i16> %b) {
744 ; SSE2-LABEL: max_ge_v8i16:
745 ; SSE2: # BB#0:
746 ; SSE2-NEXT: movdqa %xmm1, %xmm2
747 ; SSE2-NEXT: psubusw %xmm0, %xmm2
748 ; SSE2-NEXT: pxor %xmm3, %xmm3
749 ; SSE2-NEXT: pcmpeqw %xmm2, %xmm3
750 ; SSE2-NEXT: pand %xmm3, %xmm0
751 ; SSE2-NEXT: pandn %xmm1, %xmm3
752 ; SSE2-NEXT: por %xmm3, %xmm0
753 ; SSE2-NEXT: retq
754 ;
755 ; SSE41-LABEL: max_ge_v8i16:
756 ; SSE41: # BB#0:
757 ; SSE41-NEXT: pmaxuw %xmm1, %xmm0
758 ; SSE41-NEXT: retq
759 ;
760 ; SSE42-LABEL: max_ge_v8i16:
761 ; SSE42: # BB#0:
762 ; SSE42-NEXT: pmaxuw %xmm1, %xmm0
763 ; SSE42-NEXT: retq
764 ;
765 ; AVX-LABEL: max_ge_v8i16:
766 ; AVX: # BB#0:
767 ; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
768 ; AVX-NEXT: retq
769 %1 = icmp uge <8 x i16> %a, %b
770 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
771 ret <8 x i16> %2
772 }
773
774 define <16 x i16> @max_ge_v16i16(<16 x i16> %a, <16 x i16> %b) {
775 ; SSE2-LABEL: max_ge_v16i16:
776 ; SSE2: # BB#0:
777 ; SSE2-NEXT: movdqa %xmm3, %xmm4
778 ; SSE2-NEXT: psubusw %xmm1, %xmm4
779 ; SSE2-NEXT: pxor %xmm5, %xmm5
780 ; SSE2-NEXT: pcmpeqw %xmm5, %xmm4
781 ; SSE2-NEXT: movdqa %xmm2, %xmm6
782 ; SSE2-NEXT: psubusw %xmm0, %xmm6
783 ; SSE2-NEXT: pcmpeqw %xmm5, %xmm6
784 ; SSE2-NEXT: pand %xmm6, %xmm0
785 ; SSE2-NEXT: pandn %xmm2, %xmm6
786 ; SSE2-NEXT: por %xmm6, %xmm0
787 ; SSE2-NEXT: pand %xmm4, %xmm1
788 ; SSE2-NEXT: pandn %xmm3, %xmm4
789 ; SSE2-NEXT: por %xmm4, %xmm1
790 ; SSE2-NEXT: retq
791 ;
792 ; SSE41-LABEL: max_ge_v16i16:
793 ; SSE41: # BB#0:
794 ; SSE41-NEXT: pmaxuw %xmm2, %xmm0
795 ; SSE41-NEXT: pmaxuw %xmm3, %xmm1
796 ; SSE41-NEXT: retq
797 ;
798 ; SSE42-LABEL: max_ge_v16i16:
799 ; SSE42: # BB#0:
800 ; SSE42-NEXT: pmaxuw %xmm2, %xmm0
801 ; SSE42-NEXT: pmaxuw %xmm3, %xmm1
802 ; SSE42-NEXT: retq
803 ;
804 ; AVX1-LABEL: max_ge_v16i16:
805 ; AVX1: # BB#0:
806 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
807 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
808 ; AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm2
809 ; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
810 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
811 ; AVX1-NEXT: retq
812 ;
813 ; AVX2-LABEL: max_ge_v16i16:
814 ; AVX2: # BB#0:
815 ; AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
816 ; AVX2-NEXT: retq
817 ;
818 ; AVX512-LABEL: max_ge_v16i16:
819 ; AVX512: # BB#0:
820 ; AVX512-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
821 ; AVX512-NEXT: retq
822 %1 = icmp uge <16 x i16> %a, %b
823 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
824 ret <16 x i16> %2
825 }
826
827 define <16 x i8> @max_ge_v16i8(<16 x i8> %a, <16 x i8> %b) {
828 ; SSE-LABEL: max_ge_v16i8:
829 ; SSE: # BB#0:
830 ; SSE-NEXT: pmaxub %xmm1, %xmm0
831 ; SSE-NEXT: retq
832 ;
833 ; AVX-LABEL: max_ge_v16i8:
834 ; AVX: # BB#0:
835 ; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
836 ; AVX-NEXT: retq
837 %1 = icmp uge <16 x i8> %a, %b
838 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
839 ret <16 x i8> %2
840 }
841
842 define <32 x i8> @max_ge_v32i8(<32 x i8> %a, <32 x i8> %b) {
843 ; SSE-LABEL: max_ge_v32i8:
844 ; SSE: # BB#0:
845 ; SSE-NEXT: pmaxub %xmm2, %xmm0
846 ; SSE-NEXT: pmaxub %xmm3, %xmm1
847 ; SSE-NEXT: retq
848 ;
849 ; AVX1-LABEL: max_ge_v32i8:
850 ; AVX1: # BB#0:
851 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
852 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
853 ; AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm2
854 ; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
855 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
856 ; AVX1-NEXT: retq
857 ;
858 ; AVX2-LABEL: max_ge_v32i8:
859 ; AVX2: # BB#0:
860 ; AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
861 ; AVX2-NEXT: retq
862 ;
863 ; AVX512-LABEL: max_ge_v32i8:
864 ; AVX512: # BB#0:
865 ; AVX512-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
866 ; AVX512-NEXT: retq
867 %1 = icmp uge <32 x i8> %a, %b
868 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
869 ret <32 x i8> %2
870 }
871
872 ;
873 ; Unsigned Minimum (LT)
874 ;
875
876 define <2 x i64> @max_lt_v2i64(<2 x i64> %a, <2 x i64> %b) {
877 ; SSE2-LABEL: max_lt_v2i64:
878 ; SSE2: # BB#0:
879 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
880 ; SSE2-NEXT: movdqa %xmm0, %xmm3
881 ; SSE2-NEXT: pxor %xmm2, %xmm3
882 ; SSE2-NEXT: pxor %xmm1, %xmm2
883 ; SSE2-NEXT: movdqa %xmm2, %xmm4
884 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
885 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
886 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
887 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
888 ; SSE2-NEXT: pand %xmm5, %xmm2
889 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
890 ; SSE2-NEXT: por %xmm2, %xmm3
891 ; SSE2-NEXT: pand %xmm3, %xmm0
892 ; SSE2-NEXT: pandn %xmm1, %xmm3
893 ; SSE2-NEXT: por %xmm3, %xmm0
894 ; SSE2-NEXT: retq
895 ;
896 ; SSE41-LABEL: max_lt_v2i64:
897 ; SSE41: # BB#0:
898 ; SSE41-NEXT: movdqa %xmm0, %xmm2
899 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
900 ; SSE41-NEXT: movdqa %xmm2, %xmm3
901 ; SSE41-NEXT: pxor %xmm0, %xmm3
902 ; SSE41-NEXT: pxor %xmm1, %xmm0
903 ; SSE41-NEXT: movdqa %xmm0, %xmm4
904 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
905 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
906 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
907 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
908 ; SSE41-NEXT: pand %xmm5, %xmm3
909 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
910 ; SSE41-NEXT: por %xmm3, %xmm0
911 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
912 ; SSE41-NEXT: movapd %xmm1, %xmm0
913 ; SSE41-NEXT: retq
914 ;
915 ; SSE42-LABEL: max_lt_v2i64:
916 ; SSE42: # BB#0:
917 ; SSE42-NEXT: movdqa %xmm0, %xmm2
918 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
919 ; SSE42-NEXT: movdqa %xmm2, %xmm3
920 ; SSE42-NEXT: pxor %xmm0, %xmm3
921 ; SSE42-NEXT: pxor %xmm1, %xmm0
922 ; SSE42-NEXT: pcmpgtq %xmm3, %xmm0
923 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
924 ; SSE42-NEXT: movapd %xmm1, %xmm0
925 ; SSE42-NEXT: retq
926 ;
927 ; AVX-LABEL: max_lt_v2i64:
928 ; AVX: # BB#0:
929 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
930 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
931 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
932 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
933 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
934 ; AVX-NEXT: retq
935 %1 = icmp ult <2 x i64> %a, %b
936 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
937 ret <2 x i64> %2
938 }
939
940 define <4 x i64> @max_lt_v4i64(<4 x i64> %a, <4 x i64> %b) {
941 ; SSE2-LABEL: max_lt_v4i64:
942 ; SSE2: # BB#0:
943 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
944 ; SSE2-NEXT: movdqa %xmm1, %xmm5
945 ; SSE2-NEXT: pxor %xmm4, %xmm5
946 ; SSE2-NEXT: movdqa %xmm3, %xmm6
947 ; SSE2-NEXT: pxor %xmm4, %xmm6
948 ; SSE2-NEXT: movdqa %xmm6, %xmm7
949 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
950 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
951 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
952 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
953 ; SSE2-NEXT: pand %xmm8, %xmm5
954 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
955 ; SSE2-NEXT: por %xmm5, %xmm6
956 ; SSE2-NEXT: movdqa %xmm0, %xmm5
957 ; SSE2-NEXT: pxor %xmm4, %xmm5
958 ; SSE2-NEXT: pxor %xmm2, %xmm4
959 ; SSE2-NEXT: movdqa %xmm4, %xmm7
960 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
961 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
962 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
963 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
964 ; SSE2-NEXT: pand %xmm8, %xmm4
965 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
966 ; SSE2-NEXT: por %xmm4, %xmm5
967 ; SSE2-NEXT: pand %xmm5, %xmm0
968 ; SSE2-NEXT: pandn %xmm2, %xmm5
969 ; SSE2-NEXT: por %xmm5, %xmm0
970 ; SSE2-NEXT: pand %xmm6, %xmm1
971 ; SSE2-NEXT: pandn %xmm3, %xmm6
972 ; SSE2-NEXT: por %xmm6, %xmm1
973 ; SSE2-NEXT: retq
974 ;
975 ; SSE41-LABEL: max_lt_v4i64:
976 ; SSE41: # BB#0:
977 ; SSE41-NEXT: movdqa %xmm0, %xmm8
978 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
979 ; SSE41-NEXT: movdqa %xmm1, %xmm5
980 ; SSE41-NEXT: pxor %xmm0, %xmm5
981 ; SSE41-NEXT: movdqa %xmm3, %xmm6
982 ; SSE41-NEXT: pxor %xmm0, %xmm6
983 ; SSE41-NEXT: movdqa %xmm6, %xmm7
984 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
985 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
986 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
987 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
988 ; SSE41-NEXT: pand %xmm4, %xmm6
989 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
990 ; SSE41-NEXT: por %xmm6, %xmm5
991 ; SSE41-NEXT: movdqa %xmm8, %xmm4
992 ; SSE41-NEXT: pxor %xmm0, %xmm4
993 ; SSE41-NEXT: pxor %xmm2, %xmm0
994 ; SSE41-NEXT: movdqa %xmm0, %xmm6
995 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm6
996 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
997 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
998 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
999 ; SSE41-NEXT: pand %xmm7, %xmm4
1000 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1001 ; SSE41-NEXT: por %xmm4, %xmm0
1002 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
1003 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1004 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
1005 ; SSE41-NEXT: movapd %xmm2, %xmm0
1006 ; SSE41-NEXT: movapd %xmm3, %xmm1
1007 ; SSE41-NEXT: retq
1008 ;
1009 ; SSE42-LABEL: max_lt_v4i64:
1010 ; SSE42: # BB#0:
1011 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1012 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1013 ; SSE42-NEXT: movdqa %xmm1, %xmm6
1014 ; SSE42-NEXT: pxor %xmm0, %xmm6
1015 ; SSE42-NEXT: movdqa %xmm3, %xmm5
1016 ; SSE42-NEXT: pxor %xmm0, %xmm5
1017 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
1018 ; SSE42-NEXT: movdqa %xmm4, %xmm6
1019 ; SSE42-NEXT: pxor %xmm0, %xmm6
1020 ; SSE42-NEXT: pxor %xmm2, %xmm0
1021 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm0
1022 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
1023 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1024 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
1025 ; SSE42-NEXT: movapd %xmm2, %xmm0
1026 ; SSE42-NEXT: movapd %xmm3, %xmm1
1027 ; SSE42-NEXT: retq
1028 ;
1029 ; AVX1-LABEL: max_lt_v4i64:
1030 ; AVX1: # BB#0:
1031 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1032 ; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1033 ; AVX1-NEXT: vxorps %xmm3, %xmm2, %xmm2
1034 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1035 ; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm4
1036 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1037 ; AVX1-NEXT: vxorps %xmm3, %xmm0, %xmm4
1038 ; AVX1-NEXT: vxorps %xmm3, %xmm1, %xmm3
1039 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3
1040 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1041 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1042 ; AVX1-NEXT: retq
1043 ;
1044 ; AVX2-LABEL: max_lt_v4i64:
1045 ; AVX2: # BB#0:
1046 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1047 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
1048 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
1049 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1050 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1051 ; AVX2-NEXT: retq
1052 ;
1053 ; AVX512-LABEL: max_lt_v4i64:
1054 ; AVX512: # BB#0:
1055 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1056 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm3
1057 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm2
1058 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1059 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1060 ; AVX512-NEXT: retq
1061 %1 = icmp ult <4 x i64> %a, %b
1062 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
1063 ret <4 x i64> %2
1064 }
1065
1066 define <4 x i32> @max_lt_v4i32(<4 x i32> %a, <4 x i32> %b) {
1067 ; SSE2-LABEL: max_lt_v4i32:
1068 ; SSE2: # BB#0:
1069 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1070 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1071 ; SSE2-NEXT: pxor %xmm2, %xmm3
1072 ; SSE2-NEXT: pxor %xmm1, %xmm2
1073 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
1074 ; SSE2-NEXT: pand %xmm2, %xmm0
1075 ; SSE2-NEXT: pandn %xmm1, %xmm2
1076 ; SSE2-NEXT: por %xmm2, %xmm0
1077 ; SSE2-NEXT: retq
1078 ;
1079 ; SSE41-LABEL: max_lt_v4i32:
1080 ; SSE41: # BB#0:
1081 ; SSE41-NEXT: pminud %xmm1, %xmm0
1082 ; SSE41-NEXT: retq
1083 ;
1084 ; SSE42-LABEL: max_lt_v4i32:
1085 ; SSE42: # BB#0:
1086 ; SSE42-NEXT: pminud %xmm1, %xmm0
1087 ; SSE42-NEXT: retq
1088 ;
1089 ; AVX-LABEL: max_lt_v4i32:
1090 ; AVX: # BB#0:
1091 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
1092 ; AVX-NEXT: retq
1093 %1 = icmp ult <4 x i32> %a, %b
1094 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
1095 ret <4 x i32> %2
1096 }
1097
1098 define <8 x i32> @max_lt_v8i32(<8 x i32> %a, <8 x i32> %b) {
1099 ; SSE2-LABEL: max_lt_v8i32:
1100 ; SSE2: # BB#0:
1101 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1102 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1103 ; SSE2-NEXT: pxor %xmm4, %xmm5
1104 ; SSE2-NEXT: movdqa %xmm3, %xmm6
1105 ; SSE2-NEXT: pxor %xmm4, %xmm6
1106 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1107 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1108 ; SSE2-NEXT: pxor %xmm4, %xmm5
1109 ; SSE2-NEXT: pxor %xmm2, %xmm4
1110 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
1111 ; SSE2-NEXT: pand %xmm4, %xmm0
1112 ; SSE2-NEXT: pandn %xmm2, %xmm4
1113 ; SSE2-NEXT: por %xmm4, %xmm0
1114 ; SSE2-NEXT: pand %xmm6, %xmm1
1115 ; SSE2-NEXT: pandn %xmm3, %xmm6
1116 ; SSE2-NEXT: por %xmm6, %xmm1
1117 ; SSE2-NEXT: retq
1118 ;
1119 ; SSE41-LABEL: max_lt_v8i32:
1120 ; SSE41: # BB#0:
1121 ; SSE41-NEXT: pminud %xmm2, %xmm0
1122 ; SSE41-NEXT: pminud %xmm3, %xmm1
1123 ; SSE41-NEXT: retq
1124 ;
1125 ; SSE42-LABEL: max_lt_v8i32:
1126 ; SSE42: # BB#0:
1127 ; SSE42-NEXT: pminud %xmm2, %xmm0
1128 ; SSE42-NEXT: pminud %xmm3, %xmm1
1129 ; SSE42-NEXT: retq
1130 ;
1131 ; AVX1-LABEL: max_lt_v8i32:
1132 ; AVX1: # BB#0:
1133 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1134 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1135 ; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2
1136 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1137 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1138 ; AVX1-NEXT: retq
1139 ;
1140 ; AVX2-LABEL: max_lt_v8i32:
1141 ; AVX2: # BB#0:
1142 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1143 ; AVX2-NEXT: retq
1144 ;
1145 ; AVX512-LABEL: max_lt_v8i32:
1146 ; AVX512: # BB#0:
1147 ; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm0
1148 ; AVX512-NEXT: retq
1149 %1 = icmp ult <8 x i32> %a, %b
1150 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1151 ret <8 x i32> %2
1152 }
1153
1154 define <8 x i16> @max_lt_v8i16(<8 x i16> %a, <8 x i16> %b) {
1155 ; SSE2-LABEL: max_lt_v8i16:
1156 ; SSE2: # BB#0:
1157 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1158 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1159 ; SSE2-NEXT: pxor %xmm2, %xmm3
1160 ; SSE2-NEXT: pxor %xmm1, %xmm2
1161 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
1162 ; SSE2-NEXT: pand %xmm2, %xmm0
1163 ; SSE2-NEXT: pandn %xmm1, %xmm2
1164 ; SSE2-NEXT: por %xmm2, %xmm0
1165 ; SSE2-NEXT: retq
1166 ;
1167 ; SSE41-LABEL: max_lt_v8i16:
1168 ; SSE41: # BB#0:
1169 ; SSE41-NEXT: pminuw %xmm1, %xmm0
1170 ; SSE41-NEXT: retq
1171 ;
1172 ; SSE42-LABEL: max_lt_v8i16:
1173 ; SSE42: # BB#0:
1174 ; SSE42-NEXT: pminuw %xmm1, %xmm0
1175 ; SSE42-NEXT: retq
1176 ;
1177 ; AVX-LABEL: max_lt_v8i16:
1178 ; AVX: # BB#0:
1179 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1180 ; AVX-NEXT: retq
1181 %1 = icmp ult <8 x i16> %a, %b
1182 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1183 ret <8 x i16> %2
1184 }
1185
1186 define <16 x i16> @max_lt_v16i16(<16 x i16> %a, <16 x i16> %b) {
1187 ; SSE2-LABEL: max_lt_v16i16:
1188 ; SSE2: # BB#0:
1189 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1190 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1191 ; SSE2-NEXT: pxor %xmm4, %xmm5
1192 ; SSE2-NEXT: movdqa %xmm3, %xmm6
1193 ; SSE2-NEXT: pxor %xmm4, %xmm6
1194 ; SSE2-NEXT: pcmpgtw %xmm5, %xmm6
1195 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1196 ; SSE2-NEXT: pxor %xmm4, %xmm5
1197 ; SSE2-NEXT: pxor %xmm2, %xmm4
1198 ; SSE2-NEXT: pcmpgtw %xmm5, %xmm4
1199 ; SSE2-NEXT: pand %xmm4, %xmm0
1200 ; SSE2-NEXT: pandn %xmm2, %xmm4
1201 ; SSE2-NEXT: por %xmm4, %xmm0
1202 ; SSE2-NEXT: pand %xmm6, %xmm1
1203 ; SSE2-NEXT: pandn %xmm3, %xmm6
1204 ; SSE2-NEXT: por %xmm6, %xmm1
1205 ; SSE2-NEXT: retq
1206 ;
1207 ; SSE41-LABEL: max_lt_v16i16:
1208 ; SSE41: # BB#0:
1209 ; SSE41-NEXT: pminuw %xmm2, %xmm0
1210 ; SSE41-NEXT: pminuw %xmm3, %xmm1
1211 ; SSE41-NEXT: retq
1212 ;
1213 ; SSE42-LABEL: max_lt_v16i16:
1214 ; SSE42: # BB#0:
1215 ; SSE42-NEXT: pminuw %xmm2, %xmm0
1216 ; SSE42-NEXT: pminuw %xmm3, %xmm1
1217 ; SSE42-NEXT: retq
1218 ;
1219 ; AVX1-LABEL: max_lt_v16i16:
1220 ; AVX1: # BB#0:
1221 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1222 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1223 ; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm2
1224 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1225 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1226 ; AVX1-NEXT: retq
1227 ;
1228 ; AVX2-LABEL: max_lt_v16i16:
1229 ; AVX2: # BB#0:
1230 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1231 ; AVX2-NEXT: retq
1232 ;
1233 ; AVX512-LABEL: max_lt_v16i16:
1234 ; AVX512: # BB#0:
1235 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1236 ; AVX512-NEXT: retq
1237 %1 = icmp ult <16 x i16> %a, %b
1238 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1239 ret <16 x i16> %2
1240 }
1241
1242 define <16 x i8> @max_lt_v16i8(<16 x i8> %a, <16 x i8> %b) {
1243 ; SSE-LABEL: max_lt_v16i8:
1244 ; SSE: # BB#0:
1245 ; SSE-NEXT: pminub %xmm1, %xmm0
1246 ; SSE-NEXT: retq
1247 ;
1248 ; AVX-LABEL: max_lt_v16i8:
1249 ; AVX: # BB#0:
1250 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1251 ; AVX-NEXT: retq
1252 %1 = icmp ult <16 x i8> %a, %b
1253 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1254 ret <16 x i8> %2
1255 }
1256
1257 define <32 x i8> @max_lt_v32i8(<32 x i8> %a, <32 x i8> %b) {
1258 ; SSE-LABEL: max_lt_v32i8:
1259 ; SSE: # BB#0:
1260 ; SSE-NEXT: pminub %xmm2, %xmm0
1261 ; SSE-NEXT: pminub %xmm3, %xmm1
1262 ; SSE-NEXT: retq
1263 ;
1264 ; AVX1-LABEL: max_lt_v32i8:
1265 ; AVX1: # BB#0:
1266 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1267 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1268 ; AVX1-NEXT: vpminub %xmm2, %xmm3, %xmm2
1269 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1270 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1271 ; AVX1-NEXT: retq
1272 ;
1273 ; AVX2-LABEL: max_lt_v32i8:
1274 ; AVX2: # BB#0:
1275 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
1276 ; AVX2-NEXT: retq
1277 ;
1278 ; AVX512-LABEL: max_lt_v32i8:
1279 ; AVX512: # BB#0:
1280 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
1281 ; AVX512-NEXT: retq
1282 %1 = icmp ult <32 x i8> %a, %b
1283 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1284 ret <32 x i8> %2
1285 }
1286
1287 ;
1288 ; Unsigned Minimum (LE)
1289 ;
1290
1291 define <2 x i64> @max_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
1292 ; SSE2-LABEL: max_le_v2i64:
1293 ; SSE2: # BB#0:
1294 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1295 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1296 ; SSE2-NEXT: pxor %xmm2, %xmm3
1297 ; SSE2-NEXT: pxor %xmm0, %xmm2
1298 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1299 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
1300 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1301 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1302 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1303 ; SSE2-NEXT: pand %xmm5, %xmm2
1304 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1305 ; SSE2-NEXT: por %xmm2, %xmm3
1306 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1307 ; SSE2-NEXT: pxor %xmm3, %xmm2
1308 ; SSE2-NEXT: pandn %xmm0, %xmm3
1309 ; SSE2-NEXT: pandn %xmm1, %xmm2
1310 ; SSE2-NEXT: por %xmm3, %xmm2
1311 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1312 ; SSE2-NEXT: retq
1313 ;
1314 ; SSE41-LABEL: max_le_v2i64:
1315 ; SSE41: # BB#0:
1316 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1317 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
1318 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1319 ; SSE41-NEXT: pxor %xmm0, %xmm3
1320 ; SSE41-NEXT: pxor %xmm2, %xmm0
1321 ; SSE41-NEXT: movdqa %xmm0, %xmm4
1322 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
1323 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1324 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
1325 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1326 ; SSE41-NEXT: pand %xmm5, %xmm0
1327 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1328 ; SSE41-NEXT: por %xmm0, %xmm3
1329 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
1330 ; SSE41-NEXT: pxor %xmm3, %xmm0
1331 ; SSE41-NEXT: blendvpd %xmm2, %xmm1
1332 ; SSE41-NEXT: movapd %xmm1, %xmm0
1333 ; SSE41-NEXT: retq
1334 ;
1335 ; SSE42-LABEL: max_le_v2i64:
1336 ; SSE42: # BB#0:
1337 ; SSE42-NEXT: movdqa %xmm0, %xmm2
1338 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1339 ; SSE42-NEXT: movdqa %xmm1, %xmm0
1340 ; SSE42-NEXT: pxor %xmm3, %xmm0
1341 ; SSE42-NEXT: pxor %xmm2, %xmm3
1342 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm3
1343 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
1344 ; SSE42-NEXT: pxor %xmm3, %xmm0
1345 ; SSE42-NEXT: blendvpd %xmm2, %xmm1
1346 ; SSE42-NEXT: movapd %xmm1, %xmm0
1347 ; SSE42-NEXT: retq
1348 ;
1349 ; AVX-LABEL: max_le_v2i64:
1350 ; AVX: # BB#0:
1351 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1352 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm3
1353 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm2
1354 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1355 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1356 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
1357 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1358 ; AVX-NEXT: retq
1359 %1 = icmp ule <2 x i64> %a, %b
1360 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
1361 ret <2 x i64> %2
1362 }
1363
1364 define <4 x i64> @max_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
1365 ; SSE2-LABEL: max_le_v4i64:
1366 ; SSE2: # BB#0:
1367 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1368 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1369 ; SSE2-NEXT: pxor %xmm7, %xmm4
1370 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1371 ; SSE2-NEXT: pxor %xmm7, %xmm5
1372 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1373 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1374 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1375 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
1376 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1377 ; SSE2-NEXT: pand %xmm8, %xmm4
1378 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
1379 ; SSE2-NEXT: por %xmm4, %xmm8
1380 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
1381 ; SSE2-NEXT: movdqa %xmm8, %xmm9
1382 ; SSE2-NEXT: pxor %xmm4, %xmm9
1383 ; SSE2-NEXT: movdqa %xmm2, %xmm6
1384 ; SSE2-NEXT: pxor %xmm7, %xmm6
1385 ; SSE2-NEXT: pxor %xmm0, %xmm7
1386 ; SSE2-NEXT: movdqa %xmm7, %xmm5
1387 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
1388 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
1389 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm7
1390 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1391 ; SSE2-NEXT: pand %xmm10, %xmm6
1392 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1393 ; SSE2-NEXT: por %xmm6, %xmm5
1394 ; SSE2-NEXT: pxor %xmm5, %xmm4
1395 ; SSE2-NEXT: pandn %xmm0, %xmm5
1396 ; SSE2-NEXT: pandn %xmm2, %xmm4
1397 ; SSE2-NEXT: por %xmm5, %xmm4
1398 ; SSE2-NEXT: pandn %xmm1, %xmm8
1399 ; SSE2-NEXT: pandn %xmm3, %xmm9
1400 ; SSE2-NEXT: por %xmm8, %xmm9
1401 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1402 ; SSE2-NEXT: movdqa %xmm9, %xmm1
1403 ; SSE2-NEXT: retq
1404 ;
1405 ; SSE41-LABEL: max_le_v4i64:
1406 ; SSE41: # BB#0:
1407 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1408 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
1409 ; SSE41-NEXT: movdqa %xmm3, %xmm5
1410 ; SSE41-NEXT: pxor %xmm0, %xmm5
1411 ; SSE41-NEXT: movdqa %xmm1, %xmm6
1412 ; SSE41-NEXT: pxor %xmm0, %xmm6
1413 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1414 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
1415 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1416 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1417 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1418 ; SSE41-NEXT: pand %xmm4, %xmm6
1419 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1420 ; SSE41-NEXT: por %xmm6, %xmm5
1421 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
1422 ; SSE41-NEXT: pxor %xmm9, %xmm5
1423 ; SSE41-NEXT: movdqa %xmm2, %xmm6
1424 ; SSE41-NEXT: pxor %xmm0, %xmm6
1425 ; SSE41-NEXT: pxor %xmm8, %xmm0
1426 ; SSE41-NEXT: movdqa %xmm0, %xmm7
1427 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
1428 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1429 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
1430 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1431 ; SSE41-NEXT: pand %xmm4, %xmm6
1432 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1433 ; SSE41-NEXT: por %xmm6, %xmm0
1434 ; SSE41-NEXT: pxor %xmm9, %xmm0
1435 ; SSE41-NEXT: blendvpd %xmm8, %xmm2
1436 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1437 ; SSE41-NEXT: blendvpd %xmm1, %xmm3
1438 ; SSE41-NEXT: movapd %xmm2, %xmm0
1439 ; SSE41-NEXT: movapd %xmm3, %xmm1
1440 ; SSE41-NEXT: retq
1441 ;
1442 ; SSE42-LABEL: max_le_v4i64:
1443 ; SSE42: # BB#0:
1444 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1445 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1446 ; SSE42-NEXT: movdqa %xmm3, %xmm6
1447 ; SSE42-NEXT: pxor %xmm0, %xmm6
1448 ; SSE42-NEXT: movdqa %xmm1, %xmm5
1449 ; SSE42-NEXT: pxor %xmm0, %xmm5
1450 ; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
1451 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
1452 ; SSE42-NEXT: pxor %xmm6, %xmm5
1453 ; SSE42-NEXT: movdqa %xmm2, %xmm7
1454 ; SSE42-NEXT: pxor %xmm0, %xmm7
1455 ; SSE42-NEXT: pxor %xmm4, %xmm0
1456 ; SSE42-NEXT: pcmpgtq %xmm7, %xmm0
1457 ; SSE42-NEXT: pxor %xmm6, %xmm0
1458 ; SSE42-NEXT: blendvpd %xmm4, %xmm2
1459 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1460 ; SSE42-NEXT: blendvpd %xmm1, %xmm3
1461 ; SSE42-NEXT: movapd %xmm2, %xmm0
1462 ; SSE42-NEXT: movapd %xmm3, %xmm1
1463 ; SSE42-NEXT: retq
1464 ;
1465 ; AVX1-LABEL: max_le_v4i64:
1466 ; AVX1: # BB#0:
1467 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1468 ; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1469 ; AVX1-NEXT: vxorps %xmm3, %xmm2, %xmm2
1470 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1471 ; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm4
1472 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1473 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1474 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
1475 ; AVX1-NEXT: vxorps %xmm3, %xmm1, %xmm5
1476 ; AVX1-NEXT: vxorps %xmm3, %xmm0, %xmm3
1477 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm3
1478 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1479 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1480 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1481 ; AVX1-NEXT: retq
1482 ;
1483 ; AVX2-LABEL: max_le_v4i64:
1484 ; AVX2: # BB#0:
1485 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1486 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
1487 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1488 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1489 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1490 ; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
1491 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1492 ; AVX2-NEXT: retq
1493 ;
1494 ; AVX512-LABEL: max_le_v4i64:
1495 ; AVX512: # BB#0:
1496 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1497 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm3
1498 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm2
1499 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1500 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1501 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
1502 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1503 ; AVX512-NEXT: retq
1504 %1 = icmp ule <4 x i64> %a, %b
1505 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
1506 ret <4 x i64> %2
1507 }
1508
1509 define <4 x i32> @max_le_v4i32(<4 x i32> %a, <4 x i32> %b) {
1510 ; SSE2-LABEL: max_le_v4i32:
1511 ; SSE2: # BB#0:
1512 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1513 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1514 ; SSE2-NEXT: pxor %xmm3, %xmm2
1515 ; SSE2-NEXT: pxor %xmm0, %xmm3
1516 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
1517 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1518 ; SSE2-NEXT: pxor %xmm3, %xmm2
1519 ; SSE2-NEXT: pandn %xmm0, %xmm3
1520 ; SSE2-NEXT: pandn %xmm1, %xmm2
1521 ; SSE2-NEXT: por %xmm3, %xmm2
1522 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1523 ; SSE2-NEXT: retq
1524 ;
1525 ; SSE41-LABEL: max_le_v4i32:
1526 ; SSE41: # BB#0:
1527 ; SSE41-NEXT: pminud %xmm1, %xmm0
1528 ; SSE41-NEXT: retq
1529 ;
1530 ; SSE42-LABEL: max_le_v4i32:
1531 ; SSE42: # BB#0:
1532 ; SSE42-NEXT: pminud %xmm1, %xmm0
1533 ; SSE42-NEXT: retq
1534 ;
1535 ; AVX-LABEL: max_le_v4i32:
1536 ; AVX: # BB#0:
1537 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0
1538 ; AVX-NEXT: retq
1539 %1 = icmp ule <4 x i32> %a, %b
1540 %2 = select <4 x i1> %1, <4 x i32> %a, <4 x i32> %b
1541 ret <4 x i32> %2
1542 }
1543
1544 define <8 x i32> @max_le_v8i32(<8 x i32> %a, <8 x i32> %b) {
1545 ; SSE2-LABEL: max_le_v8i32:
1546 ; SSE2: # BB#0:
1547 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1548 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1549 ; SSE2-NEXT: pxor %xmm6, %xmm4
1550 ; SSE2-NEXT: movdqa %xmm1, %xmm7
1551 ; SSE2-NEXT: pxor %xmm6, %xmm7
1552 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm7
1553 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
1554 ; SSE2-NEXT: movdqa %xmm7, %xmm5
1555 ; SSE2-NEXT: pxor %xmm4, %xmm5
1556 ; SSE2-NEXT: movdqa %xmm2, %xmm8
1557 ; SSE2-NEXT: pxor %xmm6, %xmm8
1558 ; SSE2-NEXT: pxor %xmm0, %xmm6
1559 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm6
1560 ; SSE2-NEXT: pxor %xmm6, %xmm4
1561 ; SSE2-NEXT: pandn %xmm0, %xmm6
1562 ; SSE2-NEXT: pandn %xmm2, %xmm4
1563 ; SSE2-NEXT: por %xmm6, %xmm4
1564 ; SSE2-NEXT: pandn %xmm1, %xmm7
1565 ; SSE2-NEXT: pandn %xmm3, %xmm5
1566 ; SSE2-NEXT: por %xmm7, %xmm5
1567 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1568 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1569 ; SSE2-NEXT: retq
1570 ;
1571 ; SSE41-LABEL: max_le_v8i32:
1572 ; SSE41: # BB#0:
1573 ; SSE41-NEXT: pminud %xmm2, %xmm0
1574 ; SSE41-NEXT: pminud %xmm3, %xmm1
1575 ; SSE41-NEXT: retq
1576 ;
1577 ; SSE42-LABEL: max_le_v8i32:
1578 ; SSE42: # BB#0:
1579 ; SSE42-NEXT: pminud %xmm2, %xmm0
1580 ; SSE42-NEXT: pminud %xmm3, %xmm1
1581 ; SSE42-NEXT: retq
1582 ;
1583 ; AVX1-LABEL: max_le_v8i32:
1584 ; AVX1: # BB#0:
1585 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1586 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1587 ; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2
1588 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0
1589 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1590 ; AVX1-NEXT: retq
1591 ;
1592 ; AVX2-LABEL: max_le_v8i32:
1593 ; AVX2: # BB#0:
1594 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1595 ; AVX2-NEXT: retq
1596 ;
1597 ; AVX512-LABEL: max_le_v8i32:
1598 ; AVX512: # BB#0:
1599 ; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm0
1600 ; AVX512-NEXT: retq
1601 %1 = icmp ule <8 x i32> %a, %b
1602 %2 = select <8 x i1> %1, <8 x i32> %a, <8 x i32> %b
1603 ret <8 x i32> %2
1604 }
1605
1606 define <8 x i16> @max_le_v8i16(<8 x i16> %a, <8 x i16> %b) {
1607 ; SSE2-LABEL: max_le_v8i16:
1608 ; SSE2: # BB#0:
1609 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1610 ; SSE2-NEXT: psubusw %xmm1, %xmm2
1611 ; SSE2-NEXT: pxor %xmm3, %xmm3
1612 ; SSE2-NEXT: pcmpeqw %xmm2, %xmm3
1613 ; SSE2-NEXT: pand %xmm3, %xmm0
1614 ; SSE2-NEXT: pandn %xmm1, %xmm3
1615 ; SSE2-NEXT: por %xmm3, %xmm0
1616 ; SSE2-NEXT: retq
1617 ;
1618 ; SSE41-LABEL: max_le_v8i16:
1619 ; SSE41: # BB#0:
1620 ; SSE41-NEXT: pminuw %xmm1, %xmm0
1621 ; SSE41-NEXT: retq
1622 ;
1623 ; SSE42-LABEL: max_le_v8i16:
1624 ; SSE42: # BB#0:
1625 ; SSE42-NEXT: pminuw %xmm1, %xmm0
1626 ; SSE42-NEXT: retq
1627 ;
1628 ; AVX-LABEL: max_le_v8i16:
1629 ; AVX: # BB#0:
1630 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1631 ; AVX-NEXT: retq
1632 %1 = icmp ule <8 x i16> %a, %b
1633 %2 = select <8 x i1> %1, <8 x i16> %a, <8 x i16> %b
1634 ret <8 x i16> %2
1635 }
1636
1637 define <16 x i16> @max_le_v16i16(<16 x i16> %a, <16 x i16> %b) {
1638 ; SSE2-LABEL: max_le_v16i16:
1639 ; SSE2: # BB#0:
1640 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1641 ; SSE2-NEXT: psubusw %xmm3, %xmm4
1642 ; SSE2-NEXT: pxor %xmm6, %xmm6
1643 ; SSE2-NEXT: pcmpeqw %xmm6, %xmm4
1644 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1645 ; SSE2-NEXT: psubusw %xmm2, %xmm5
1646 ; SSE2-NEXT: pcmpeqw %xmm6, %xmm5
1647 ; SSE2-NEXT: pand %xmm5, %xmm0
1648 ; SSE2-NEXT: pandn %xmm2, %xmm5
1649 ; SSE2-NEXT: por %xmm0, %xmm5
1650 ; SSE2-NEXT: pand %xmm4, %xmm1
1651 ; SSE2-NEXT: pandn %xmm3, %xmm4
1652 ; SSE2-NEXT: por %xmm1, %xmm4
1653 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1654 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1655 ; SSE2-NEXT: retq
1656 ;
1657 ; SSE41-LABEL: max_le_v16i16:
1658 ; SSE41: # BB#0:
1659 ; SSE41-NEXT: pminuw %xmm2, %xmm0
1660 ; SSE41-NEXT: pminuw %xmm3, %xmm1
1661 ; SSE41-NEXT: retq
1662 ;
1663 ; SSE42-LABEL: max_le_v16i16:
1664 ; SSE42: # BB#0:
1665 ; SSE42-NEXT: pminuw %xmm2, %xmm0
1666 ; SSE42-NEXT: pminuw %xmm3, %xmm1
1667 ; SSE42-NEXT: retq
1668 ;
1669 ; AVX1-LABEL: max_le_v16i16:
1670 ; AVX1: # BB#0:
1671 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1672 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1673 ; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm2
1674 ; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0
1675 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1676 ; AVX1-NEXT: retq
1677 ;
1678 ; AVX2-LABEL: max_le_v16i16:
1679 ; AVX2: # BB#0:
1680 ; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1681 ; AVX2-NEXT: retq
1682 ;
1683 ; AVX512-LABEL: max_le_v16i16:
1684 ; AVX512: # BB#0:
1685 ; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0
1686 ; AVX512-NEXT: retq
1687 %1 = icmp ule <16 x i16> %a, %b
1688 %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
1689 ret <16 x i16> %2
1690 }
1691
1692 define <16 x i8> @max_le_v16i8(<16 x i8> %a, <16 x i8> %b) {
1693 ; SSE-LABEL: max_le_v16i8:
1694 ; SSE: # BB#0:
1695 ; SSE-NEXT: pminub %xmm1, %xmm0
1696 ; SSE-NEXT: retq
1697 ;
1698 ; AVX-LABEL: max_le_v16i8:
1699 ; AVX: # BB#0:
1700 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1701 ; AVX-NEXT: retq
1702 %1 = icmp ule <16 x i8> %a, %b
1703 %2 = select <16 x i1> %1, <16 x i8> %a, <16 x i8> %b
1704 ret <16 x i8> %2
1705 }
1706
1707 define <32 x i8> @max_le_v32i8(<32 x i8> %a, <32 x i8> %b) {
1708 ; SSE-LABEL: max_le_v32i8:
1709 ; SSE: # BB#0:
1710 ; SSE-NEXT: pminub %xmm2, %xmm0
1711 ; SSE-NEXT: pminub %xmm3, %xmm1
1712 ; SSE-NEXT: retq
1713 ;
1714 ; AVX1-LABEL: max_le_v32i8:
1715 ; AVX1: # BB#0:
1716 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1717 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1718 ; AVX1-NEXT: vpminub %xmm2, %xmm3, %xmm2
1719 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1720 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1721 ; AVX1-NEXT: retq
1722 ;
1723 ; AVX2-LABEL: max_le_v32i8:
1724 ; AVX2: # BB#0:
1725 ; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0
1726 ; AVX2-NEXT: retq
1727 ;
1728 ; AVX512-LABEL: max_le_v32i8:
1729 ; AVX512: # BB#0:
1730 ; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0
1731 ; AVX512-NEXT: retq
1732 %1 = icmp ule <32 x i8> %a, %b
1733 %2 = select <32 x i1> %1, <32 x i8> %a, <32 x i8> %b
1734 ret <32 x i8> %2
1735 }