blob: fbf40f9e378138bd19a9b993771082d7ce41c1b9 [file] [log] [blame]
Simon Pilgrim5b2fd592017-02-06 18:57:51 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s
3
4; FIXME: Various missed opportunities to simplify integer absolute instructions.
5
6; fold (abs c1) -> c2
7define <4 x i32> @combine_v4i32_abs_constant() {
8; CHECK-LABEL: combine_v4i32_abs_constant:
9; CHECK: # BB#0:
10; CHECK-NEXT: vpabsd {{.*}}(%rip), %xmm0
11; CHECK-NEXT: retq
12 %1 = call <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32> <i32 0, i32 -1, i32 3, i32 -2147483648>)
13 ret <4 x i32> %1
14}
15
16define <16 x i16> @combine_v16i16_abs_constant() {
17; CHECK-LABEL: combine_v16i16_abs_constant:
18; CHECK: # BB#0:
19; CHECK-NEXT: vpabsw {{.*}}(%rip), %ymm0
20; CHECK-NEXT: retq
21 %1 = call <16 x i16> @llvm.x86.avx2.pabs.w(<16 x i16> <i16 0, i16 1, i16 -1, i16 3, i16 -3, i16 7, i16 -7, i16 255, i16 -255, i16 4096, i16 -4096, i16 32767, i16 -32767, i16 -32768, i16 32768, i16 65536>)
22 ret <16 x i16> %1
23}
24
25; fold (abs (abs x)) -> (abs x)
26define <8 x i16> @combine_v8i16_abs_abs(<8 x i16> %a) {
27; CHECK-LABEL: combine_v8i16_abs_abs:
28; CHECK: # BB#0:
29; CHECK-NEXT: vpabsw %xmm0, %xmm0
30; CHECK-NEXT: vpabsw %xmm0, %xmm0
31; CHECK-NEXT: retq
32 %1 = call <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16> %a)
33 %2 = call <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16> %1)
34 ret <8 x i16> %2
35}
36
37define <32 x i8> @combine_v32i8_abs_abs(<32 x i8> %a) {
38; CHECK-LABEL: combine_v32i8_abs_abs:
39; CHECK: # BB#0:
40; CHECK-NEXT: vpabsb %ymm0, %ymm0
41; CHECK-NEXT: vpabsb %ymm0, %ymm0
42; CHECK-NEXT: retq
43 %1 = call <32 x i8> @llvm.x86.avx2.pabs.b(<32 x i8> %a)
44 %2 = call <32 x i8> @llvm.x86.avx2.pabs.b(<32 x i8> %1)
45 ret <32 x i8> %2
46}
47
48; fold (abs x) -> x iff not-negative
49define <16 x i8> @combine_v16i8_abs_constant(<16 x i8> %a) {
50; CHECK-LABEL: combine_v16i8_abs_constant:
51; CHECK: # BB#0:
52; CHECK-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
53; CHECK-NEXT: vpabsb %xmm0, %xmm0
54; CHECK-NEXT: retq
55 %1 = insertelement <16 x i8> undef, i8 15, i32 0
56 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> zeroinitializer
57 %3 = and <16 x i8> %a, %2
58 %4 = call <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8> %3)
59 ret <16 x i8> %4
60}
61
62define <8 x i32> @combine_v8i32_abs_pos(<8 x i32> %a) {
63; CHECK-LABEL: combine_v8i32_abs_pos:
64; CHECK: # BB#0:
65; CHECK-NEXT: vpsrld $1, %ymm0, %ymm0
66; CHECK-NEXT: vpabsd %ymm0, %ymm0
67; CHECK-NEXT: retq
68 %1 = lshr <8 x i32> %a, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
69 %2 = call <8 x i32> @llvm.x86.avx2.pabs.d(<8 x i32> %1)
70 ret <8 x i32> %2
71}
72
73declare <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8>) nounwind readnone
74declare <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32>) nounwind readnone
75declare <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16>) nounwind readnone
76
77declare <32 x i8> @llvm.x86.avx2.pabs.b(<32 x i8>) nounwind readnone
78declare <8 x i32> @llvm.x86.avx2.pabs.d(<8 x i32>) nounwind readnone
79declare <16 x i16> @llvm.x86.avx2.pabs.w(<16 x i16>) nounwind readnone