blob: 1f73ef5fa136ba83070df0c44d707ad56f1485c9 [file] [log] [blame]
Benjamin Kramerd56ffc72013-04-26 09:19:19 +00001; RUN: llc < %s -march=x86-64 -mcpu=x86-64 | FileCheck %s -check-prefix=SSE2
Benjamin Krameraec90532013-04-26 12:05:21 +00002; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s -check-prefix=SSSE3
3; RUN: llc < %s -march=x86-64 -mcpu=core-avx2 | FileCheck %s -check-prefix=AVX2
Benjamin Kramerd56ffc72013-04-26 09:19:19 +00004
5define <4 x i32> @test1(<4 x i32> %a) nounwind {
6; SSE2: test1:
7; SSE2: movdqa
8; SSE2-NEXT: psrad $31
9; SSE2-NEXT: padd
10; SSE2-NEXT: pxor
11; SSE2-NEXT: ret
Benjamin Krameraec90532013-04-26 12:05:21 +000012
13; SSSE3: test1:
14; SSSE3: pabsd
15; SSSE3-NEXT: ret
16
17; AVX2: test1:
18; AVX2: vpabsd
19; AVX2-NEXT: ret
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000020 %tmp1neg = sub <4 x i32> zeroinitializer, %a
21 %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
22 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
23 ret <4 x i32> %abs
24}
25
26define <4 x i32> @test2(<4 x i32> %a) nounwind {
27; SSE2: test2:
28; SSE2: movdqa
29; SSE2-NEXT: psrad $31
30; SSE2-NEXT: padd
31; SSE2-NEXT: pxor
32; SSE2-NEXT: ret
Benjamin Krameraec90532013-04-26 12:05:21 +000033
34; SSSE3: test2:
35; SSSE3: pabsd
36; SSSE3-NEXT: ret
37
38; AVX2: test2:
39; AVX2: vpabsd
40; AVX2-NEXT: ret
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000041 %tmp1neg = sub <4 x i32> zeroinitializer, %a
42 %b = icmp sge <4 x i32> %a, zeroinitializer
43 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
44 ret <4 x i32> %abs
45}
46
Benjamin Krameraec90532013-04-26 12:05:21 +000047define <8 x i16> @test3(<8 x i16> %a) nounwind {
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000048; SSE2: test3:
49; SSE2: movdqa
Benjamin Krameraec90532013-04-26 12:05:21 +000050; SSE2-NEXT: psraw $15
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000051; SSE2-NEXT: padd
52; SSE2-NEXT: pxor
53; SSE2-NEXT: ret
Benjamin Krameraec90532013-04-26 12:05:21 +000054
55; SSSE3: test3:
56; SSSE3: pabsw
57; SSSE3-NEXT: ret
58
59; AVX2: test3:
60; AVX2: vpabsw
61; AVX2-NEXT: ret
62 %tmp1neg = sub <8 x i16> zeroinitializer, %a
63 %b = icmp sgt <8 x i16> %a, zeroinitializer
64 %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
65 ret <8 x i16> %abs
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000066}
67
Benjamin Krameraec90532013-04-26 12:05:21 +000068define <16 x i8> @test4(<16 x i8> %a) nounwind {
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000069; SSE2: test4:
Benjamin Krameraec90532013-04-26 12:05:21 +000070; SSE2: pxor
71; SSE2-NEXT: pcmpgtb
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000072; SSE2-NEXT: padd
73; SSE2-NEXT: pxor
74; SSE2-NEXT: ret
Benjamin Krameraec90532013-04-26 12:05:21 +000075
76; SSSE3: test4:
77; SSSE3: pabsb
78; SSSE3-NEXT: ret
79
80; AVX2: test4:
81; AVX2: vpabsb
82; AVX2-NEXT: ret
83 %tmp1neg = sub <16 x i8> zeroinitializer, %a
84 %b = icmp slt <16 x i8> %a, zeroinitializer
85 %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
86 ret <16 x i8> %abs
Benjamin Kramerd56ffc72013-04-26 09:19:19 +000087}
88
89define <4 x i32> @test5(<4 x i32> %a) nounwind {
90; SSE2: test5:
91; SSE2: movdqa
92; SSE2-NEXT: psrad $31
93; SSE2-NEXT: padd
94; SSE2-NEXT: pxor
95; SSE2-NEXT: ret
Benjamin Krameraec90532013-04-26 12:05:21 +000096
97; SSSE3: test5:
98; SSSE3: pabsd
99; SSSE3-NEXT: ret
100
101; AVX2: test5:
102; AVX2: vpabsd
103; AVX2-NEXT: ret
Benjamin Kramerd56ffc72013-04-26 09:19:19 +0000104 %tmp1neg = sub <4 x i32> zeroinitializer, %a
105 %b = icmp sle <4 x i32> %a, zeroinitializer
106 %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
107 ret <4 x i32> %abs
108}
Benjamin Krameraec90532013-04-26 12:05:21 +0000109
110define <8 x i32> @test6(<8 x i32> %a) nounwind {
111; SSSE3: test6:
112; SSSE3: pabsd
113; SSSE3: pabsd
114; SSSE3-NEXT: ret
115
116; AVX2: test6:
117; AVX2: vpabsd %ymm
118; AVX2-NEXT: ret
119 %tmp1neg = sub <8 x i32> zeroinitializer, %a
120 %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
121 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
122 ret <8 x i32> %abs
123}
124
125define <8 x i32> @test7(<8 x i32> %a) nounwind {
126; SSSE3: test7:
127; SSSE3: pabsd
128; SSSE3: pabsd
129; SSSE3-NEXT: ret
130
131; AVX2: test7:
132; AVX2: vpabsd %ymm
133; AVX2-NEXT: ret
134 %tmp1neg = sub <8 x i32> zeroinitializer, %a
135 %b = icmp sge <8 x i32> %a, zeroinitializer
136 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
137 ret <8 x i32> %abs
138}
139
140define <16 x i16> @test8(<16 x i16> %a) nounwind {
141; SSSE3: test8:
142; SSSE3: pabsw
143; SSSE3: pabsw
144; SSSE3-NEXT: ret
145
146; AVX2: test8:
147; AVX2: vpabsw %ymm
148; AVX2-NEXT: ret
149 %tmp1neg = sub <16 x i16> zeroinitializer, %a
150 %b = icmp sgt <16 x i16> %a, zeroinitializer
151 %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
152 ret <16 x i16> %abs
153}
154
155define <32 x i8> @test9(<32 x i8> %a) nounwind {
156; SSSE3: test9:
157; SSSE3: pabsb
158; SSSE3: pabsb
159; SSSE3-NEXT: ret
160
161; AVX2: test9:
162; AVX2: vpabsb %ymm
163; AVX2-NEXT: ret
164 %tmp1neg = sub <32 x i8> zeroinitializer, %a
165 %b = icmp slt <32 x i8> %a, zeroinitializer
166 %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
167 ret <32 x i8> %abs
168}
169
170define <8 x i32> @test10(<8 x i32> %a) nounwind {
171; SSSE3: test10:
172; SSSE3: pabsd
173; SSSE3: pabsd
174; SSSE3-NEXT: ret
175
176; AVX2: test10:
177; AVX2: vpabsd %ymm
178; AVX2-NEXT: ret
179 %tmp1neg = sub <8 x i32> zeroinitializer, %a
180 %b = icmp sle <8 x i32> %a, zeroinitializer
181 %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
182 ret <8 x i32> %abs
183}