1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl --show-mc-encoding | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F,AVX512VL
8 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl,+avx512bw --show-mc-encoding | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 define <4 x i32> @test_abs_gt_v4i32(<4 x i32> %a) nounwind {
11 ; SSE2-LABEL: test_abs_gt_v4i32:
13 ; SSE2-NEXT: movdqa %xmm0, %xmm1
14 ; SSE2-NEXT: psrad $31, %xmm1
15 ; SSE2-NEXT: paddd %xmm1, %xmm0
16 ; SSE2-NEXT: pxor %xmm1, %xmm0
19 ; SSSE3-LABEL: test_abs_gt_v4i32:
21 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
24 ; SSE41-LABEL: test_abs_gt_v4i32:
26 ; SSE41-NEXT: pabsd %xmm0, %xmm0
29 ; AVX1-LABEL: test_abs_gt_v4i32:
31 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
34 ; AVX2-LABEL: test_abs_gt_v4i32:
36 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
39 ; AVX512-LABEL: test_abs_gt_v4i32:
41 ; AVX512-NEXT: vpabsd %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1e,0xc0]
42 ; AVX512-NEXT: retq # encoding: [0xc3]
43 %tmp1neg = sub <4 x i32> zeroinitializer, %a
44 %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
45 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
49 define <4 x i32> @test_abs_ge_v4i32(<4 x i32> %a) nounwind {
50 ; SSE2-LABEL: test_abs_ge_v4i32:
52 ; SSE2-NEXT: movdqa %xmm0, %xmm1
53 ; SSE2-NEXT: psrad $31, %xmm1
54 ; SSE2-NEXT: paddd %xmm1, %xmm0
55 ; SSE2-NEXT: pxor %xmm1, %xmm0
58 ; SSSE3-LABEL: test_abs_ge_v4i32:
60 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
63 ; SSE41-LABEL: test_abs_ge_v4i32:
65 ; SSE41-NEXT: pabsd %xmm0, %xmm0
68 ; AVX1-LABEL: test_abs_ge_v4i32:
70 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
73 ; AVX2-LABEL: test_abs_ge_v4i32:
75 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
78 ; AVX512-LABEL: test_abs_ge_v4i32:
80 ; AVX512-NEXT: vpabsd %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1e,0xc0]
81 ; AVX512-NEXT: retq # encoding: [0xc3]
82 %tmp1neg = sub <4 x i32> zeroinitializer, %a
83 %b = icmp sge <4 x i32> %a, zeroinitializer
84 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
88 define <8 x i16> @test_abs_gt_v8i16(<8 x i16> %a) nounwind {
89 ; SSE2-LABEL: test_abs_gt_v8i16:
91 ; SSE2-NEXT: movdqa %xmm0, %xmm1
92 ; SSE2-NEXT: psraw $15, %xmm1
93 ; SSE2-NEXT: paddw %xmm1, %xmm0
94 ; SSE2-NEXT: pxor %xmm1, %xmm0
97 ; SSSE3-LABEL: test_abs_gt_v8i16:
99 ; SSSE3-NEXT: pabsw %xmm0, %xmm0
102 ; SSE41-LABEL: test_abs_gt_v8i16:
104 ; SSE41-NEXT: pabsw %xmm0, %xmm0
107 ; AVX1-LABEL: test_abs_gt_v8i16:
109 ; AVX1-NEXT: vpabsw %xmm0, %xmm0
112 ; AVX2-LABEL: test_abs_gt_v8i16:
114 ; AVX2-NEXT: vpabsw %xmm0, %xmm0
117 ; AVX512F-LABEL: test_abs_gt_v8i16:
119 ; AVX512F-NEXT: vpabsw %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0x1d,0xc0]
120 ; AVX512F-NEXT: retq # encoding: [0xc3]
122 ; AVX512BW-LABEL: test_abs_gt_v8i16:
124 ; AVX512BW-NEXT: vpabsw %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1d,0xc0]
125 ; AVX512BW-NEXT: retq # encoding: [0xc3]
126 %tmp1neg = sub <8 x i16> zeroinitializer, %a
127 %b = icmp sgt <8 x i16> %a, zeroinitializer
128 %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
132 define <16 x i8> @test_abs_lt_v16i8(<16 x i8> %a) nounwind {
133 ; SSE2-LABEL: test_abs_lt_v16i8:
135 ; SSE2-NEXT: pxor %xmm1, %xmm1
136 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
137 ; SSE2-NEXT: paddb %xmm1, %xmm0
138 ; SSE2-NEXT: pxor %xmm1, %xmm0
141 ; SSSE3-LABEL: test_abs_lt_v16i8:
143 ; SSSE3-NEXT: pabsb %xmm0, %xmm0
146 ; SSE41-LABEL: test_abs_lt_v16i8:
148 ; SSE41-NEXT: pabsb %xmm0, %xmm0
151 ; AVX1-LABEL: test_abs_lt_v16i8:
153 ; AVX1-NEXT: vpabsb %xmm0, %xmm0
156 ; AVX2-LABEL: test_abs_lt_v16i8:
158 ; AVX2-NEXT: vpabsb %xmm0, %xmm0
161 ; AVX512F-LABEL: test_abs_lt_v16i8:
163 ; AVX512F-NEXT: vpabsb %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0x1c,0xc0]
164 ; AVX512F-NEXT: retq # encoding: [0xc3]
166 ; AVX512BW-LABEL: test_abs_lt_v16i8:
168 ; AVX512BW-NEXT: vpabsb %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1c,0xc0]
169 ; AVX512BW-NEXT: retq # encoding: [0xc3]
170 %tmp1neg = sub <16 x i8> zeroinitializer, %a
171 %b = icmp slt <16 x i8> %a, zeroinitializer
172 %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
176 define <4 x i32> @test_abs_le_v4i32(<4 x i32> %a) nounwind {
177 ; SSE2-LABEL: test_abs_le_v4i32:
179 ; SSE2-NEXT: movdqa %xmm0, %xmm1
180 ; SSE2-NEXT: psrad $31, %xmm1
181 ; SSE2-NEXT: paddd %xmm1, %xmm0
182 ; SSE2-NEXT: pxor %xmm1, %xmm0
185 ; SSSE3-LABEL: test_abs_le_v4i32:
187 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
190 ; SSE41-LABEL: test_abs_le_v4i32:
192 ; SSE41-NEXT: pabsd %xmm0, %xmm0
195 ; AVX1-LABEL: test_abs_le_v4i32:
197 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
200 ; AVX2-LABEL: test_abs_le_v4i32:
202 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
205 ; AVX512-LABEL: test_abs_le_v4i32:
207 ; AVX512-NEXT: vpabsd %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1e,0xc0]
208 ; AVX512-NEXT: retq # encoding: [0xc3]
209 %tmp1neg = sub <4 x i32> zeroinitializer, %a
210 %b = icmp sle <4 x i32> %a, zeroinitializer
211 %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
215 define <8 x i32> @test_abs_gt_v8i32(<8 x i32> %a) nounwind {
216 ; SSE2-LABEL: test_abs_gt_v8i32:
218 ; SSE2-NEXT: movdqa %xmm0, %xmm2
219 ; SSE2-NEXT: psrad $31, %xmm2
220 ; SSE2-NEXT: paddd %xmm2, %xmm0
221 ; SSE2-NEXT: pxor %xmm2, %xmm0
222 ; SSE2-NEXT: movdqa %xmm1, %xmm2
223 ; SSE2-NEXT: psrad $31, %xmm2
224 ; SSE2-NEXT: paddd %xmm2, %xmm1
225 ; SSE2-NEXT: pxor %xmm2, %xmm1
228 ; SSSE3-LABEL: test_abs_gt_v8i32:
230 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
231 ; SSSE3-NEXT: pabsd %xmm1, %xmm1
234 ; SSE41-LABEL: test_abs_gt_v8i32:
236 ; SSE41-NEXT: pabsd %xmm0, %xmm0
237 ; SSE41-NEXT: pabsd %xmm1, %xmm1
240 ; AVX1-LABEL: test_abs_gt_v8i32:
242 ; AVX1-NEXT: vpabsd %xmm0, %xmm1
243 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
244 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
245 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
248 ; AVX2-LABEL: test_abs_gt_v8i32:
250 ; AVX2-NEXT: vpabsd %ymm0, %ymm0
253 ; AVX512-LABEL: test_abs_gt_v8i32:
255 ; AVX512-NEXT: vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
256 ; AVX512-NEXT: retq # encoding: [0xc3]
257 %tmp1neg = sub <8 x i32> zeroinitializer, %a
258 %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
259 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
263 define <8 x i32> @test_abs_ge_v8i32(<8 x i32> %a) nounwind {
264 ; SSE2-LABEL: test_abs_ge_v8i32:
266 ; SSE2-NEXT: movdqa %xmm0, %xmm2
267 ; SSE2-NEXT: psrad $31, %xmm2
268 ; SSE2-NEXT: paddd %xmm2, %xmm0
269 ; SSE2-NEXT: pxor %xmm2, %xmm0
270 ; SSE2-NEXT: movdqa %xmm1, %xmm2
271 ; SSE2-NEXT: psrad $31, %xmm2
272 ; SSE2-NEXT: paddd %xmm2, %xmm1
273 ; SSE2-NEXT: pxor %xmm2, %xmm1
276 ; SSSE3-LABEL: test_abs_ge_v8i32:
278 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
279 ; SSSE3-NEXT: pabsd %xmm1, %xmm1
282 ; SSE41-LABEL: test_abs_ge_v8i32:
284 ; SSE41-NEXT: pabsd %xmm0, %xmm0
285 ; SSE41-NEXT: pabsd %xmm1, %xmm1
288 ; AVX1-LABEL: test_abs_ge_v8i32:
290 ; AVX1-NEXT: vpabsd %xmm0, %xmm1
291 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
292 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
293 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
296 ; AVX2-LABEL: test_abs_ge_v8i32:
298 ; AVX2-NEXT: vpabsd %ymm0, %ymm0
301 ; AVX512-LABEL: test_abs_ge_v8i32:
303 ; AVX512-NEXT: vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
304 ; AVX512-NEXT: retq # encoding: [0xc3]
305 %tmp1neg = sub <8 x i32> zeroinitializer, %a
306 %b = icmp sge <8 x i32> %a, zeroinitializer
307 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
311 define <16 x i16> @test_abs_gt_v16i16(<16 x i16> %a) nounwind {
312 ; SSE2-LABEL: test_abs_gt_v16i16:
314 ; SSE2-NEXT: movdqa %xmm0, %xmm2
315 ; SSE2-NEXT: psraw $15, %xmm2
316 ; SSE2-NEXT: paddw %xmm2, %xmm0
317 ; SSE2-NEXT: pxor %xmm2, %xmm0
318 ; SSE2-NEXT: movdqa %xmm1, %xmm2
319 ; SSE2-NEXT: psraw $15, %xmm2
320 ; SSE2-NEXT: paddw %xmm2, %xmm1
321 ; SSE2-NEXT: pxor %xmm2, %xmm1
324 ; SSSE3-LABEL: test_abs_gt_v16i16:
326 ; SSSE3-NEXT: pabsw %xmm0, %xmm0
327 ; SSSE3-NEXT: pabsw %xmm1, %xmm1
330 ; SSE41-LABEL: test_abs_gt_v16i16:
332 ; SSE41-NEXT: pabsw %xmm0, %xmm0
333 ; SSE41-NEXT: pabsw %xmm1, %xmm1
336 ; AVX1-LABEL: test_abs_gt_v16i16:
338 ; AVX1-NEXT: vpabsw %xmm0, %xmm1
339 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
340 ; AVX1-NEXT: vpabsw %xmm0, %xmm0
341 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
344 ; AVX2-LABEL: test_abs_gt_v16i16:
346 ; AVX2-NEXT: vpabsw %ymm0, %ymm0
349 ; AVX512F-LABEL: test_abs_gt_v16i16:
351 ; AVX512F-NEXT: vpabsw %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
352 ; AVX512F-NEXT: retq # encoding: [0xc3]
354 ; AVX512BW-LABEL: test_abs_gt_v16i16:
356 ; AVX512BW-NEXT: vpabsw %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
357 ; AVX512BW-NEXT: retq # encoding: [0xc3]
358 %tmp1neg = sub <16 x i16> zeroinitializer, %a
359 %b = icmp sgt <16 x i16> %a, zeroinitializer
360 %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
364 define <32 x i8> @test_abs_lt_v32i8(<32 x i8> %a) nounwind {
365 ; SSE2-LABEL: test_abs_lt_v32i8:
367 ; SSE2-NEXT: pxor %xmm2, %xmm2
368 ; SSE2-NEXT: pxor %xmm3, %xmm3
369 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm3
370 ; SSE2-NEXT: paddb %xmm3, %xmm0
371 ; SSE2-NEXT: pxor %xmm3, %xmm0
372 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
373 ; SSE2-NEXT: paddb %xmm2, %xmm1
374 ; SSE2-NEXT: pxor %xmm2, %xmm1
377 ; SSSE3-LABEL: test_abs_lt_v32i8:
379 ; SSSE3-NEXT: pabsb %xmm0, %xmm0
380 ; SSSE3-NEXT: pabsb %xmm1, %xmm1
383 ; SSE41-LABEL: test_abs_lt_v32i8:
385 ; SSE41-NEXT: pabsb %xmm0, %xmm0
386 ; SSE41-NEXT: pabsb %xmm1, %xmm1
389 ; AVX1-LABEL: test_abs_lt_v32i8:
391 ; AVX1-NEXT: vpabsb %xmm0, %xmm1
392 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
393 ; AVX1-NEXT: vpabsb %xmm0, %xmm0
394 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
397 ; AVX2-LABEL: test_abs_lt_v32i8:
399 ; AVX2-NEXT: vpabsb %ymm0, %ymm0
402 ; AVX512F-LABEL: test_abs_lt_v32i8:
404 ; AVX512F-NEXT: vpabsb %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
405 ; AVX512F-NEXT: retq # encoding: [0xc3]
407 ; AVX512BW-LABEL: test_abs_lt_v32i8:
409 ; AVX512BW-NEXT: vpabsb %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
410 ; AVX512BW-NEXT: retq # encoding: [0xc3]
411 %tmp1neg = sub <32 x i8> zeroinitializer, %a
412 %b = icmp slt <32 x i8> %a, zeroinitializer
413 %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
417 define <8 x i32> @test_abs_le_v8i32(<8 x i32> %a) nounwind {
418 ; SSE2-LABEL: test_abs_le_v8i32:
420 ; SSE2-NEXT: movdqa %xmm0, %xmm2
421 ; SSE2-NEXT: psrad $31, %xmm2
422 ; SSE2-NEXT: paddd %xmm2, %xmm0
423 ; SSE2-NEXT: pxor %xmm2, %xmm0
424 ; SSE2-NEXT: movdqa %xmm1, %xmm2
425 ; SSE2-NEXT: psrad $31, %xmm2
426 ; SSE2-NEXT: paddd %xmm2, %xmm1
427 ; SSE2-NEXT: pxor %xmm2, %xmm1
430 ; SSSE3-LABEL: test_abs_le_v8i32:
432 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
433 ; SSSE3-NEXT: pabsd %xmm1, %xmm1
436 ; SSE41-LABEL: test_abs_le_v8i32:
438 ; SSE41-NEXT: pabsd %xmm0, %xmm0
439 ; SSE41-NEXT: pabsd %xmm1, %xmm1
442 ; AVX1-LABEL: test_abs_le_v8i32:
444 ; AVX1-NEXT: vpabsd %xmm0, %xmm1
445 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
446 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
447 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
450 ; AVX2-LABEL: test_abs_le_v8i32:
452 ; AVX2-NEXT: vpabsd %ymm0, %ymm0
455 ; AVX512-LABEL: test_abs_le_v8i32:
457 ; AVX512-NEXT: vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
458 ; AVX512-NEXT: retq # encoding: [0xc3]
459 %tmp1neg = sub <8 x i32> zeroinitializer, %a
460 %b = icmp sle <8 x i32> %a, zeroinitializer
461 %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
465 define <16 x i32> @test_abs_le_16i32(<16 x i32> %a) nounwind {
466 ; SSE2-LABEL: test_abs_le_16i32:
468 ; SSE2-NEXT: movdqa %xmm0, %xmm4
469 ; SSE2-NEXT: psrad $31, %xmm4
470 ; SSE2-NEXT: paddd %xmm4, %xmm0
471 ; SSE2-NEXT: pxor %xmm4, %xmm0
472 ; SSE2-NEXT: movdqa %xmm1, %xmm4
473 ; SSE2-NEXT: psrad $31, %xmm4
474 ; SSE2-NEXT: paddd %xmm4, %xmm1
475 ; SSE2-NEXT: pxor %xmm4, %xmm1
476 ; SSE2-NEXT: movdqa %xmm2, %xmm4
477 ; SSE2-NEXT: psrad $31, %xmm4
478 ; SSE2-NEXT: paddd %xmm4, %xmm2
479 ; SSE2-NEXT: pxor %xmm4, %xmm2
480 ; SSE2-NEXT: movdqa %xmm3, %xmm4
481 ; SSE2-NEXT: psrad $31, %xmm4
482 ; SSE2-NEXT: paddd %xmm4, %xmm3
483 ; SSE2-NEXT: pxor %xmm4, %xmm3
486 ; SSSE3-LABEL: test_abs_le_16i32:
488 ; SSSE3-NEXT: pabsd %xmm0, %xmm0
489 ; SSSE3-NEXT: pabsd %xmm1, %xmm1
490 ; SSSE3-NEXT: pabsd %xmm2, %xmm2
491 ; SSSE3-NEXT: pabsd %xmm3, %xmm3
494 ; SSE41-LABEL: test_abs_le_16i32:
496 ; SSE41-NEXT: pabsd %xmm0, %xmm0
497 ; SSE41-NEXT: pabsd %xmm1, %xmm1
498 ; SSE41-NEXT: pabsd %xmm2, %xmm2
499 ; SSE41-NEXT: pabsd %xmm3, %xmm3
502 ; AVX1-LABEL: test_abs_le_16i32:
504 ; AVX1-NEXT: vpabsd %xmm0, %xmm2
505 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
506 ; AVX1-NEXT: vpabsd %xmm0, %xmm0
507 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
508 ; AVX1-NEXT: vpabsd %xmm1, %xmm2
509 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
510 ; AVX1-NEXT: vpabsd %xmm1, %xmm1
511 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
514 ; AVX2-LABEL: test_abs_le_16i32:
516 ; AVX2-NEXT: vpabsd %ymm0, %ymm0
517 ; AVX2-NEXT: vpabsd %ymm1, %ymm1
520 ; AVX512-LABEL: test_abs_le_16i32:
522 ; AVX512-NEXT: vpabsd %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1e,0xc0]
523 ; AVX512-NEXT: retq # encoding: [0xc3]
524 %tmp1neg = sub <16 x i32> zeroinitializer, %a
525 %b = icmp sle <16 x i32> %a, zeroinitializer
526 %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a
530 define <2 x i64> @test_abs_ge_v2i64(<2 x i64> %a) nounwind {
531 ; SSE2-LABEL: test_abs_ge_v2i64:
533 ; SSE2-NEXT: movdqa %xmm0, %xmm1
534 ; SSE2-NEXT: psrad $31, %xmm1
535 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
536 ; SSE2-NEXT: paddq %xmm1, %xmm0
537 ; SSE2-NEXT: pxor %xmm1, %xmm0
540 ; SSSE3-LABEL: test_abs_ge_v2i64:
542 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
543 ; SSSE3-NEXT: psrad $31, %xmm1
544 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
545 ; SSSE3-NEXT: paddq %xmm1, %xmm0
546 ; SSSE3-NEXT: pxor %xmm1, %xmm0
549 ; SSE41-LABEL: test_abs_ge_v2i64:
551 ; SSE41-NEXT: pxor %xmm1, %xmm1
552 ; SSE41-NEXT: psubq %xmm0, %xmm1
553 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm0
556 ; AVX1-LABEL: test_abs_ge_v2i64:
558 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
559 ; AVX1-NEXT: vpsubq %xmm0, %xmm1, %xmm1
560 ; AVX1-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
563 ; AVX2-LABEL: test_abs_ge_v2i64:
565 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
566 ; AVX2-NEXT: vpsubq %xmm0, %xmm1, %xmm1
567 ; AVX2-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
570 ; AVX512-LABEL: test_abs_ge_v2i64:
572 ; AVX512-NEXT: vpabsq %xmm0, %xmm0 # encoding: [0x62,0xf2,0xfd,0x08,0x1f,0xc0]
573 ; AVX512-NEXT: retq # encoding: [0xc3]
574 %tmp1neg = sub <2 x i64> zeroinitializer, %a
575 %b = icmp sge <2 x i64> %a, zeroinitializer
576 %abs = select <2 x i1> %b, <2 x i64> %a, <2 x i64> %tmp1neg
580 define <4 x i64> @test_abs_gt_v4i64(<4 x i64> %a) nounwind {
581 ; SSE2-LABEL: test_abs_gt_v4i64:
583 ; SSE2-NEXT: movdqa %xmm0, %xmm2
584 ; SSE2-NEXT: psrad $31, %xmm2
585 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
586 ; SSE2-NEXT: paddq %xmm2, %xmm0
587 ; SSE2-NEXT: pxor %xmm2, %xmm0
588 ; SSE2-NEXT: movdqa %xmm1, %xmm2
589 ; SSE2-NEXT: psrad $31, %xmm2
590 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
591 ; SSE2-NEXT: paddq %xmm2, %xmm1
592 ; SSE2-NEXT: pxor %xmm2, %xmm1
595 ; SSSE3-LABEL: test_abs_gt_v4i64:
597 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
598 ; SSSE3-NEXT: psrad $31, %xmm2
599 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
600 ; SSSE3-NEXT: paddq %xmm2, %xmm0
601 ; SSSE3-NEXT: pxor %xmm2, %xmm0
602 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
603 ; SSSE3-NEXT: psrad $31, %xmm2
604 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
605 ; SSSE3-NEXT: paddq %xmm2, %xmm1
606 ; SSSE3-NEXT: pxor %xmm2, %xmm1
609 ; SSE41-LABEL: test_abs_gt_v4i64:
611 ; SSE41-NEXT: movdqa %xmm0, %xmm2
612 ; SSE41-NEXT: pxor %xmm3, %xmm3
613 ; SSE41-NEXT: pxor %xmm4, %xmm4
614 ; SSE41-NEXT: psubq %xmm0, %xmm4
615 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
616 ; SSE41-NEXT: psubq %xmm1, %xmm3
617 ; SSE41-NEXT: movdqa %xmm1, %xmm0
618 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
619 ; SSE41-NEXT: movapd %xmm2, %xmm0
622 ; AVX1-LABEL: test_abs_gt_v4i64:
624 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
625 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
626 ; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
627 ; AVX1-NEXT: vpsubq %xmm0, %xmm2, %xmm2
628 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
629 ; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
632 ; AVX2-LABEL: test_abs_gt_v4i64:
634 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
635 ; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm1
636 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
639 ; AVX512-LABEL: test_abs_gt_v4i64:
641 ; AVX512-NEXT: vpabsq %ymm0, %ymm0 # encoding: [0x62,0xf2,0xfd,0x28,0x1f,0xc0]
642 ; AVX512-NEXT: retq # encoding: [0xc3]
643 %tmp1neg = sub <4 x i64> zeroinitializer, %a
644 %b = icmp sgt <4 x i64> %a, <i64 -1, i64 -1, i64 -1, i64 -1>
645 %abs = select <4 x i1> %b, <4 x i64> %a, <4 x i64> %tmp1neg
649 define <8 x i64> @test_abs_le_v8i64(<8 x i64> %a) nounwind {
650 ; SSE2-LABEL: test_abs_le_v8i64:
652 ; SSE2-NEXT: movdqa %xmm0, %xmm4
653 ; SSE2-NEXT: psrad $31, %xmm4
654 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
655 ; SSE2-NEXT: paddq %xmm4, %xmm0
656 ; SSE2-NEXT: pxor %xmm4, %xmm0
657 ; SSE2-NEXT: movdqa %xmm1, %xmm4
658 ; SSE2-NEXT: psrad $31, %xmm4
659 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
660 ; SSE2-NEXT: paddq %xmm4, %xmm1
661 ; SSE2-NEXT: pxor %xmm4, %xmm1
662 ; SSE2-NEXT: movdqa %xmm2, %xmm4
663 ; SSE2-NEXT: psrad $31, %xmm4
664 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
665 ; SSE2-NEXT: paddq %xmm4, %xmm2
666 ; SSE2-NEXT: pxor %xmm4, %xmm2
667 ; SSE2-NEXT: movdqa %xmm3, %xmm4
668 ; SSE2-NEXT: psrad $31, %xmm4
669 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
670 ; SSE2-NEXT: paddq %xmm4, %xmm3
671 ; SSE2-NEXT: pxor %xmm4, %xmm3
674 ; SSSE3-LABEL: test_abs_le_v8i64:
676 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
677 ; SSSE3-NEXT: psrad $31, %xmm4
678 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
679 ; SSSE3-NEXT: paddq %xmm4, %xmm0
680 ; SSSE3-NEXT: pxor %xmm4, %xmm0
681 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
682 ; SSSE3-NEXT: psrad $31, %xmm4
683 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
684 ; SSSE3-NEXT: paddq %xmm4, %xmm1
685 ; SSSE3-NEXT: pxor %xmm4, %xmm1
686 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
687 ; SSSE3-NEXT: psrad $31, %xmm4
688 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
689 ; SSSE3-NEXT: paddq %xmm4, %xmm2
690 ; SSSE3-NEXT: pxor %xmm4, %xmm2
691 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
692 ; SSSE3-NEXT: psrad $31, %xmm4
693 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
694 ; SSSE3-NEXT: paddq %xmm4, %xmm3
695 ; SSSE3-NEXT: pxor %xmm4, %xmm3
698 ; SSE41-LABEL: test_abs_le_v8i64:
700 ; SSE41-NEXT: movdqa %xmm0, %xmm4
701 ; SSE41-NEXT: pxor %xmm5, %xmm5
702 ; SSE41-NEXT: pxor %xmm6, %xmm6
703 ; SSE41-NEXT: psubq %xmm0, %xmm6
704 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm4
705 ; SSE41-NEXT: pxor %xmm6, %xmm6
706 ; SSE41-NEXT: psubq %xmm1, %xmm6
707 ; SSE41-NEXT: movdqa %xmm1, %xmm0
708 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm1
709 ; SSE41-NEXT: pxor %xmm6, %xmm6
710 ; SSE41-NEXT: psubq %xmm2, %xmm6
711 ; SSE41-NEXT: movdqa %xmm2, %xmm0
712 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm2
713 ; SSE41-NEXT: psubq %xmm3, %xmm5
714 ; SSE41-NEXT: movdqa %xmm3, %xmm0
715 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm3
716 ; SSE41-NEXT: movapd %xmm4, %xmm0
719 ; AVX1-LABEL: test_abs_le_v8i64:
721 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
722 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
723 ; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2
724 ; AVX1-NEXT: vpsubq %xmm0, %xmm3, %xmm4
725 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
726 ; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm0, %ymm0
727 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
728 ; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2
729 ; AVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm3
730 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
731 ; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
734 ; AVX2-LABEL: test_abs_le_v8i64:
736 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
737 ; AVX2-NEXT: vpsubq %ymm0, %ymm2, %ymm3
738 ; AVX2-NEXT: vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
739 ; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm2
740 ; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
743 ; AVX512-LABEL: test_abs_le_v8i64:
745 ; AVX512-NEXT: vpabsq %zmm0, %zmm0 # encoding: [0x62,0xf2,0xfd,0x48,0x1f,0xc0]
746 ; AVX512-NEXT: retq # encoding: [0xc3]
747 %tmp1neg = sub <8 x i64> zeroinitializer, %a
748 %b = icmp sle <8 x i64> %a, zeroinitializer
749 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
753 define <8 x i64> @test_abs_le_v8i64_fold(<8 x i64>* %a.ptr) nounwind {
754 ; SSE2-LABEL: test_abs_le_v8i64_fold:
756 ; SSE2-NEXT: movdqu (%rdi), %xmm0
757 ; SSE2-NEXT: movdqu 16(%rdi), %xmm1
758 ; SSE2-NEXT: movdqu 32(%rdi), %xmm2
759 ; SSE2-NEXT: movdqu 48(%rdi), %xmm3
760 ; SSE2-NEXT: movdqa %xmm0, %xmm4
761 ; SSE2-NEXT: psrad $31, %xmm4
762 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
763 ; SSE2-NEXT: paddq %xmm4, %xmm0
764 ; SSE2-NEXT: pxor %xmm4, %xmm0
765 ; SSE2-NEXT: movdqa %xmm1, %xmm4
766 ; SSE2-NEXT: psrad $31, %xmm4
767 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
768 ; SSE2-NEXT: paddq %xmm4, %xmm1
769 ; SSE2-NEXT: pxor %xmm4, %xmm1
770 ; SSE2-NEXT: movdqa %xmm2, %xmm4
771 ; SSE2-NEXT: psrad $31, %xmm4
772 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
773 ; SSE2-NEXT: paddq %xmm4, %xmm2
774 ; SSE2-NEXT: pxor %xmm4, %xmm2
775 ; SSE2-NEXT: movdqa %xmm3, %xmm4
776 ; SSE2-NEXT: psrad $31, %xmm4
777 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
778 ; SSE2-NEXT: paddq %xmm4, %xmm3
779 ; SSE2-NEXT: pxor %xmm4, %xmm3
782 ; SSSE3-LABEL: test_abs_le_v8i64_fold:
784 ; SSSE3-NEXT: movdqu (%rdi), %xmm0
785 ; SSSE3-NEXT: movdqu 16(%rdi), %xmm1
786 ; SSSE3-NEXT: movdqu 32(%rdi), %xmm2
787 ; SSSE3-NEXT: movdqu 48(%rdi), %xmm3
788 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
789 ; SSSE3-NEXT: psrad $31, %xmm4
790 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
791 ; SSSE3-NEXT: paddq %xmm4, %xmm0
792 ; SSSE3-NEXT: pxor %xmm4, %xmm0
793 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
794 ; SSSE3-NEXT: psrad $31, %xmm4
795 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
796 ; SSSE3-NEXT: paddq %xmm4, %xmm1
797 ; SSSE3-NEXT: pxor %xmm4, %xmm1
798 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
799 ; SSSE3-NEXT: psrad $31, %xmm4
800 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
801 ; SSSE3-NEXT: paddq %xmm4, %xmm2
802 ; SSSE3-NEXT: pxor %xmm4, %xmm2
803 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
804 ; SSSE3-NEXT: psrad $31, %xmm4
805 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
806 ; SSSE3-NEXT: paddq %xmm4, %xmm3
807 ; SSSE3-NEXT: pxor %xmm4, %xmm3
810 ; SSE41-LABEL: test_abs_le_v8i64_fold:
812 ; SSE41-NEXT: movdqu (%rdi), %xmm1
813 ; SSE41-NEXT: movdqu 16(%rdi), %xmm2
814 ; SSE41-NEXT: movdqu 32(%rdi), %xmm3
815 ; SSE41-NEXT: movdqu 48(%rdi), %xmm4
816 ; SSE41-NEXT: pxor %xmm5, %xmm5
817 ; SSE41-NEXT: pxor %xmm6, %xmm6
818 ; SSE41-NEXT: psubq %xmm1, %xmm6
819 ; SSE41-NEXT: movdqa %xmm1, %xmm0
820 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm1
821 ; SSE41-NEXT: pxor %xmm6, %xmm6
822 ; SSE41-NEXT: psubq %xmm2, %xmm6
823 ; SSE41-NEXT: movdqa %xmm2, %xmm0
824 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm2
825 ; SSE41-NEXT: pxor %xmm6, %xmm6
826 ; SSE41-NEXT: psubq %xmm3, %xmm6
827 ; SSE41-NEXT: movdqa %xmm3, %xmm0
828 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm3
829 ; SSE41-NEXT: psubq %xmm4, %xmm5
830 ; SSE41-NEXT: movdqa %xmm4, %xmm0
831 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4
832 ; SSE41-NEXT: movapd %xmm1, %xmm0
833 ; SSE41-NEXT: movapd %xmm2, %xmm1
834 ; SSE41-NEXT: movapd %xmm3, %xmm2
835 ; SSE41-NEXT: movapd %xmm4, %xmm3
838 ; AVX1-LABEL: test_abs_le_v8i64_fold:
840 ; AVX1-NEXT: vmovupd (%rdi), %ymm0
841 ; AVX1-NEXT: vmovupd 32(%rdi), %ymm1
842 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
843 ; AVX1-NEXT: vpsubq 16(%rdi), %xmm2, %xmm3
844 ; AVX1-NEXT: vpsubq (%rdi), %xmm2, %xmm4
845 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
846 ; AVX1-NEXT: vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
847 ; AVX1-NEXT: vpsubq 48(%rdi), %xmm2, %xmm3
848 ; AVX1-NEXT: vpsubq 32(%rdi), %xmm2, %xmm2
849 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2
850 ; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
853 ; AVX2-LABEL: test_abs_le_v8i64_fold:
855 ; AVX2-NEXT: vmovdqu (%rdi), %ymm0
856 ; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
857 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
858 ; AVX2-NEXT: vpsubq %ymm0, %ymm2, %ymm3
859 ; AVX2-NEXT: vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
860 ; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm2
861 ; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
864 ; AVX512-LABEL: test_abs_le_v8i64_fold:
866 ; AVX512-NEXT: vpabsq (%rdi), %zmm0 # encoding: [0x62,0xf2,0xfd,0x48,0x1f,0x07]
867 ; AVX512-NEXT: retq # encoding: [0xc3]
868 %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8
869 %tmp1neg = sub <8 x i64> zeroinitializer, %a
870 %b = icmp sle <8 x i64> %a, zeroinitializer
871 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
875 define <64 x i8> @test_abs_lt_v64i8(<64 x i8> %a) nounwind {
876 ; SSE2-LABEL: test_abs_lt_v64i8:
878 ; SSE2-NEXT: pxor %xmm4, %xmm4
879 ; SSE2-NEXT: pxor %xmm5, %xmm5
880 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm5
881 ; SSE2-NEXT: paddb %xmm5, %xmm0
882 ; SSE2-NEXT: pxor %xmm5, %xmm0
883 ; SSE2-NEXT: pxor %xmm5, %xmm5
884 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm5
885 ; SSE2-NEXT: paddb %xmm5, %xmm1
886 ; SSE2-NEXT: pxor %xmm5, %xmm1
887 ; SSE2-NEXT: pxor %xmm5, %xmm5
888 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
889 ; SSE2-NEXT: paddb %xmm5, %xmm2
890 ; SSE2-NEXT: pxor %xmm5, %xmm2
891 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm4
892 ; SSE2-NEXT: paddb %xmm4, %xmm3
893 ; SSE2-NEXT: pxor %xmm4, %xmm3
896 ; SSSE3-LABEL: test_abs_lt_v64i8:
898 ; SSSE3-NEXT: pabsb %xmm0, %xmm0
899 ; SSSE3-NEXT: pabsb %xmm1, %xmm1
900 ; SSSE3-NEXT: pabsb %xmm2, %xmm2
901 ; SSSE3-NEXT: pabsb %xmm3, %xmm3
904 ; SSE41-LABEL: test_abs_lt_v64i8:
906 ; SSE41-NEXT: pabsb %xmm0, %xmm0
907 ; SSE41-NEXT: pabsb %xmm1, %xmm1
908 ; SSE41-NEXT: pabsb %xmm2, %xmm2
909 ; SSE41-NEXT: pabsb %xmm3, %xmm3
912 ; AVX1-LABEL: test_abs_lt_v64i8:
914 ; AVX1-NEXT: vpabsb %xmm0, %xmm2
915 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
916 ; AVX1-NEXT: vpabsb %xmm0, %xmm0
917 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
918 ; AVX1-NEXT: vpabsb %xmm1, %xmm2
919 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
920 ; AVX1-NEXT: vpabsb %xmm1, %xmm1
921 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
924 ; AVX2-LABEL: test_abs_lt_v64i8:
926 ; AVX2-NEXT: vpabsb %ymm0, %ymm0
927 ; AVX2-NEXT: vpabsb %ymm1, %ymm1
930 ; AVX512F-LABEL: test_abs_lt_v64i8:
932 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 # encoding: [0x62,0xf3,0xfd,0x48,0x3b,0xc1,0x01]
933 ; AVX512F-NEXT: vpabsb %ymm1, %ymm1 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc9]
934 ; AVX512F-NEXT: vpabsb %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
935 ; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 # encoding: [0x62,0xf3,0xfd,0x48,0x3a,0xc1,0x01]
936 ; AVX512F-NEXT: retq # encoding: [0xc3]
938 ; AVX512BW-LABEL: test_abs_lt_v64i8:
940 ; AVX512BW-NEXT: vpabsb %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1c,0xc0]
941 ; AVX512BW-NEXT: retq # encoding: [0xc3]
942 %tmp1neg = sub <64 x i8> zeroinitializer, %a
943 %b = icmp slt <64 x i8> %a, zeroinitializer
944 %abs = select <64 x i1> %b, <64 x i8> %tmp1neg, <64 x i8> %a
948 define <32 x i16> @test_abs_gt_v32i16(<32 x i16> %a) nounwind {
949 ; SSE2-LABEL: test_abs_gt_v32i16:
951 ; SSE2-NEXT: movdqa %xmm0, %xmm4
952 ; SSE2-NEXT: psraw $15, %xmm4
953 ; SSE2-NEXT: paddw %xmm4, %xmm0
954 ; SSE2-NEXT: pxor %xmm4, %xmm0
955 ; SSE2-NEXT: movdqa %xmm1, %xmm4
956 ; SSE2-NEXT: psraw $15, %xmm4
957 ; SSE2-NEXT: paddw %xmm4, %xmm1
958 ; SSE2-NEXT: pxor %xmm4, %xmm1
959 ; SSE2-NEXT: movdqa %xmm2, %xmm4
960 ; SSE2-NEXT: psraw $15, %xmm4
961 ; SSE2-NEXT: paddw %xmm4, %xmm2
962 ; SSE2-NEXT: pxor %xmm4, %xmm2
963 ; SSE2-NEXT: movdqa %xmm3, %xmm4
964 ; SSE2-NEXT: psraw $15, %xmm4
965 ; SSE2-NEXT: paddw %xmm4, %xmm3
966 ; SSE2-NEXT: pxor %xmm4, %xmm3
969 ; SSSE3-LABEL: test_abs_gt_v32i16:
971 ; SSSE3-NEXT: pabsw %xmm0, %xmm0
972 ; SSSE3-NEXT: pabsw %xmm1, %xmm1
973 ; SSSE3-NEXT: pabsw %xmm2, %xmm2
974 ; SSSE3-NEXT: pabsw %xmm3, %xmm3
977 ; SSE41-LABEL: test_abs_gt_v32i16:
979 ; SSE41-NEXT: pabsw %xmm0, %xmm0
980 ; SSE41-NEXT: pabsw %xmm1, %xmm1
981 ; SSE41-NEXT: pabsw %xmm2, %xmm2
982 ; SSE41-NEXT: pabsw %xmm3, %xmm3
985 ; AVX1-LABEL: test_abs_gt_v32i16:
987 ; AVX1-NEXT: vpabsw %xmm0, %xmm2
988 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
989 ; AVX1-NEXT: vpabsw %xmm0, %xmm0
990 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
991 ; AVX1-NEXT: vpabsw %xmm1, %xmm2
992 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
993 ; AVX1-NEXT: vpabsw %xmm1, %xmm1
994 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
997 ; AVX2-LABEL: test_abs_gt_v32i16:
999 ; AVX2-NEXT: vpabsw %ymm0, %ymm0
1000 ; AVX2-NEXT: vpabsw %ymm1, %ymm1
1003 ; AVX512F-LABEL: test_abs_gt_v32i16:
1005 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 # encoding: [0x62,0xf3,0xfd,0x48,0x3b,0xc1,0x01]
1006 ; AVX512F-NEXT: vpabsw %ymm1, %ymm1 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc9]
1007 ; AVX512F-NEXT: vpabsw %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
1008 ; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 # encoding: [0x62,0xf3,0xfd,0x48,0x3a,0xc1,0x01]
1009 ; AVX512F-NEXT: retq # encoding: [0xc3]
1011 ; AVX512BW-LABEL: test_abs_gt_v32i16:
1012 ; AVX512BW: # %bb.0:
1013 ; AVX512BW-NEXT: vpabsw %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1d,0xc0]
1014 ; AVX512BW-NEXT: retq # encoding: [0xc3]
1015 %tmp1neg = sub <32 x i16> zeroinitializer, %a
1016 %b = icmp sgt <32 x i16> %a, zeroinitializer
1017 %abs = select <32 x i1> %b, <32 x i16> %a, <32 x i16> %tmp1neg