• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3   | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx     | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2    | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
7
8define <4 x i32> @test1(<4 x i32> %a) nounwind {
9; SSE2-LABEL: test1:
10; SSE2:       # BB#0:
11; SSE2-NEXT:    movdqa %xmm0, %xmm1
12; SSE2-NEXT:    psrad $31, %xmm1
13; SSE2-NEXT:    paddd %xmm1, %xmm0
14; SSE2-NEXT:    pxor %xmm1, %xmm0
15; SSE2-NEXT:    retq
16;
17; SSSE3-LABEL: test1:
18; SSSE3:       # BB#0:
19; SSSE3-NEXT:    pabsd %xmm0, %xmm0
20; SSSE3-NEXT:    retq
21;
22; AVX-LABEL: test1:
23; AVX:       # BB#0:
24; AVX-NEXT:    vpabsd %xmm0, %xmm0
25; AVX-NEXT:    retq
26  %tmp1neg = sub <4 x i32> zeroinitializer, %a
27  %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
28  %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
29  ret <4 x i32> %abs
30}
31
32define <4 x i32> @test2(<4 x i32> %a) nounwind {
33; SSE2-LABEL: test2:
34; SSE2:       # BB#0:
35; SSE2-NEXT:    movdqa %xmm0, %xmm1
36; SSE2-NEXT:    psrad $31, %xmm1
37; SSE2-NEXT:    paddd %xmm1, %xmm0
38; SSE2-NEXT:    pxor %xmm1, %xmm0
39; SSE2-NEXT:    retq
40;
41; SSSE3-LABEL: test2:
42; SSSE3:       # BB#0:
43; SSSE3-NEXT:    pabsd %xmm0, %xmm0
44; SSSE3-NEXT:    retq
45;
46; AVX-LABEL: test2:
47; AVX:       # BB#0:
48; AVX-NEXT:    vpabsd %xmm0, %xmm0
49; AVX-NEXT:    retq
50  %tmp1neg = sub <4 x i32> zeroinitializer, %a
51  %b = icmp sge <4 x i32> %a, zeroinitializer
52  %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
53  ret <4 x i32> %abs
54}
55
56define <8 x i16> @test3(<8 x i16> %a) nounwind {
57; SSE2-LABEL: test3:
58; SSE2:       # BB#0:
59; SSE2-NEXT:    movdqa %xmm0, %xmm1
60; SSE2-NEXT:    psraw $15, %xmm1
61; SSE2-NEXT:    paddw %xmm1, %xmm0
62; SSE2-NEXT:    pxor %xmm1, %xmm0
63; SSE2-NEXT:    retq
64;
65; SSSE3-LABEL: test3:
66; SSSE3:       # BB#0:
67; SSSE3-NEXT:    pabsw %xmm0, %xmm0
68; SSSE3-NEXT:    retq
69;
70; AVX-LABEL: test3:
71; AVX:       # BB#0:
72; AVX-NEXT:    vpabsw %xmm0, %xmm0
73; AVX-NEXT:    retq
74  %tmp1neg = sub <8 x i16> zeroinitializer, %a
75  %b = icmp sgt <8 x i16> %a, zeroinitializer
76  %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
77  ret <8 x i16> %abs
78}
79
80define <16 x i8> @test4(<16 x i8> %a) nounwind {
81; SSE2-LABEL: test4:
82; SSE2:       # BB#0:
83; SSE2-NEXT:    pxor %xmm1, %xmm1
84; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
85; SSE2-NEXT:    paddb %xmm1, %xmm0
86; SSE2-NEXT:    pxor %xmm1, %xmm0
87; SSE2-NEXT:    retq
88;
89; SSSE3-LABEL: test4:
90; SSSE3:       # BB#0:
91; SSSE3-NEXT:    pabsb %xmm0, %xmm0
92; SSSE3-NEXT:    retq
93;
94; AVX-LABEL: test4:
95; AVX:       # BB#0:
96; AVX-NEXT:    vpabsb %xmm0, %xmm0
97; AVX-NEXT:    retq
98  %tmp1neg = sub <16 x i8> zeroinitializer, %a
99  %b = icmp slt <16 x i8> %a, zeroinitializer
100  %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
101  ret <16 x i8> %abs
102}
103
104define <4 x i32> @test5(<4 x i32> %a) nounwind {
105; SSE2-LABEL: test5:
106; SSE2:       # BB#0:
107; SSE2-NEXT:    movdqa %xmm0, %xmm1
108; SSE2-NEXT:    psrad $31, %xmm1
109; SSE2-NEXT:    paddd %xmm1, %xmm0
110; SSE2-NEXT:    pxor %xmm1, %xmm0
111; SSE2-NEXT:    retq
112;
113; SSSE3-LABEL: test5:
114; SSSE3:       # BB#0:
115; SSSE3-NEXT:    pabsd %xmm0, %xmm0
116; SSSE3-NEXT:    retq
117;
118; AVX-LABEL: test5:
119; AVX:       # BB#0:
120; AVX-NEXT:    vpabsd %xmm0, %xmm0
121; AVX-NEXT:    retq
122  %tmp1neg = sub <4 x i32> zeroinitializer, %a
123  %b = icmp sle <4 x i32> %a, zeroinitializer
124  %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
125  ret <4 x i32> %abs
126}
127
128define <8 x i32> @test6(<8 x i32> %a) nounwind {
129; SSE2-LABEL: test6:
130; SSE2:       # BB#0:
131; SSE2-NEXT:    movdqa %xmm0, %xmm2
132; SSE2-NEXT:    psrad $31, %xmm2
133; SSE2-NEXT:    paddd %xmm2, %xmm0
134; SSE2-NEXT:    pxor %xmm2, %xmm0
135; SSE2-NEXT:    movdqa %xmm1, %xmm2
136; SSE2-NEXT:    psrad $31, %xmm2
137; SSE2-NEXT:    paddd %xmm2, %xmm1
138; SSE2-NEXT:    pxor %xmm2, %xmm1
139; SSE2-NEXT:    retq
140;
141; SSSE3-LABEL: test6:
142; SSSE3:       # BB#0:
143; SSSE3-NEXT:    pabsd %xmm0, %xmm0
144; SSSE3-NEXT:    pabsd %xmm1, %xmm1
145; SSSE3-NEXT:    retq
146;
147; AVX1-LABEL: test6:
148; AVX1:       # BB#0:
149; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
150; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
151; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
152; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
153; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
154; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
155; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
156; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
157; AVX1-NEXT:    retq
158;
159; AVX2-LABEL: test6:
160; AVX2:       # BB#0:
161; AVX2-NEXT:    vpabsd %ymm0, %ymm0
162; AVX2-NEXT:    retq
163;
164; AVX512-LABEL: test6:
165; AVX512:       # BB#0:
166; AVX512-NEXT:    vpabsd %ymm0, %ymm0
167; AVX512-NEXT:    retq
168  %tmp1neg = sub <8 x i32> zeroinitializer, %a
169  %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
170  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
171  ret <8 x i32> %abs
172}
173
174define <8 x i32> @test7(<8 x i32> %a) nounwind {
175; SSE2-LABEL: test7:
176; SSE2:       # BB#0:
177; SSE2-NEXT:    movdqa %xmm0, %xmm2
178; SSE2-NEXT:    psrad $31, %xmm2
179; SSE2-NEXT:    paddd %xmm2, %xmm0
180; SSE2-NEXT:    pxor %xmm2, %xmm0
181; SSE2-NEXT:    movdqa %xmm1, %xmm2
182; SSE2-NEXT:    psrad $31, %xmm2
183; SSE2-NEXT:    paddd %xmm2, %xmm1
184; SSE2-NEXT:    pxor %xmm2, %xmm1
185; SSE2-NEXT:    retq
186;
187; SSSE3-LABEL: test7:
188; SSSE3:       # BB#0:
189; SSSE3-NEXT:    pabsd %xmm0, %xmm0
190; SSSE3-NEXT:    pabsd %xmm1, %xmm1
191; SSSE3-NEXT:    retq
192;
193; AVX1-LABEL: test7:
194; AVX1:       # BB#0:
195; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
196; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
197; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
198; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
199; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
200; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
201; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
202; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
203; AVX1-NEXT:    retq
204;
205; AVX2-LABEL: test7:
206; AVX2:       # BB#0:
207; AVX2-NEXT:    vpabsd %ymm0, %ymm0
208; AVX2-NEXT:    retq
209;
210; AVX512-LABEL: test7:
211; AVX512:       # BB#0:
212; AVX512-NEXT:    vpabsd %ymm0, %ymm0
213; AVX512-NEXT:    retq
214  %tmp1neg = sub <8 x i32> zeroinitializer, %a
215  %b = icmp sge <8 x i32> %a, zeroinitializer
216  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
217  ret <8 x i32> %abs
218}
219
220define <16 x i16> @test8(<16 x i16> %a) nounwind {
221; SSE2-LABEL: test8:
222; SSE2:       # BB#0:
223; SSE2-NEXT:    movdqa %xmm0, %xmm2
224; SSE2-NEXT:    psraw $15, %xmm2
225; SSE2-NEXT:    paddw %xmm2, %xmm0
226; SSE2-NEXT:    pxor %xmm2, %xmm0
227; SSE2-NEXT:    movdqa %xmm1, %xmm2
228; SSE2-NEXT:    psraw $15, %xmm2
229; SSE2-NEXT:    paddw %xmm2, %xmm1
230; SSE2-NEXT:    pxor %xmm2, %xmm1
231; SSE2-NEXT:    retq
232;
233; SSSE3-LABEL: test8:
234; SSSE3:       # BB#0:
235; SSSE3-NEXT:    pabsw %xmm0, %xmm0
236; SSSE3-NEXT:    pabsw %xmm1, %xmm1
237; SSSE3-NEXT:    retq
238;
239; AVX1-LABEL: test8:
240; AVX1:       # BB#0:
241; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
242; AVX1-NEXT:    vpsraw $15, %xmm1, %xmm2
243; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
244; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm3
245; AVX1-NEXT:    vpaddw %xmm3, %xmm0, %xmm0
246; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
247; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
248; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
249; AVX1-NEXT:    retq
250;
251; AVX2-LABEL: test8:
252; AVX2:       # BB#0:
253; AVX2-NEXT:    vpabsw %ymm0, %ymm0
254; AVX2-NEXT:    retq
255;
256; AVX512-LABEL: test8:
257; AVX512:       # BB#0:
258; AVX512-NEXT:    vpabsw %ymm0, %ymm0
259; AVX512-NEXT:    retq
260  %tmp1neg = sub <16 x i16> zeroinitializer, %a
261  %b = icmp sgt <16 x i16> %a, zeroinitializer
262  %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
263  ret <16 x i16> %abs
264}
265
266define <32 x i8> @test9(<32 x i8> %a) nounwind {
267; SSE2-LABEL: test9:
268; SSE2:       # BB#0:
269; SSE2-NEXT:    pxor %xmm2, %xmm2
270; SSE2-NEXT:    pxor %xmm3, %xmm3
271; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
272; SSE2-NEXT:    paddb %xmm3, %xmm0
273; SSE2-NEXT:    pxor %xmm3, %xmm0
274; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
275; SSE2-NEXT:    paddb %xmm2, %xmm1
276; SSE2-NEXT:    pxor %xmm2, %xmm1
277; SSE2-NEXT:    retq
278;
279; SSSE3-LABEL: test9:
280; SSSE3:       # BB#0:
281; SSSE3-NEXT:    pabsb %xmm0, %xmm0
282; SSSE3-NEXT:    pabsb %xmm1, %xmm1
283; SSSE3-NEXT:    retq
284;
285; AVX1-LABEL: test9:
286; AVX1:       # BB#0:
287; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
288; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
289; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm3
290; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm2
291; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm4
292; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
293; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
294; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
295; AVX1-NEXT:    vxorps %ymm4, %ymm0, %ymm0
296; AVX1-NEXT:    retq
297;
298; AVX2-LABEL: test9:
299; AVX2:       # BB#0:
300; AVX2-NEXT:    vpabsb %ymm0, %ymm0
301; AVX2-NEXT:    retq
302;
303; AVX512-LABEL: test9:
304; AVX512:       # BB#0:
305; AVX512-NEXT:    vpabsb %ymm0, %ymm0
306; AVX512-NEXT:    retq
307  %tmp1neg = sub <32 x i8> zeroinitializer, %a
308  %b = icmp slt <32 x i8> %a, zeroinitializer
309  %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
310  ret <32 x i8> %abs
311}
312
313define <8 x i32> @test10(<8 x i32> %a) nounwind {
314; SSE2-LABEL: test10:
315; SSE2:       # BB#0:
316; SSE2-NEXT:    movdqa %xmm0, %xmm2
317; SSE2-NEXT:    psrad $31, %xmm2
318; SSE2-NEXT:    paddd %xmm2, %xmm0
319; SSE2-NEXT:    pxor %xmm2, %xmm0
320; SSE2-NEXT:    movdqa %xmm1, %xmm2
321; SSE2-NEXT:    psrad $31, %xmm2
322; SSE2-NEXT:    paddd %xmm2, %xmm1
323; SSE2-NEXT:    pxor %xmm2, %xmm1
324; SSE2-NEXT:    retq
325;
326; SSSE3-LABEL: test10:
327; SSSE3:       # BB#0:
328; SSSE3-NEXT:    pabsd %xmm0, %xmm0
329; SSSE3-NEXT:    pabsd %xmm1, %xmm1
330; SSSE3-NEXT:    retq
331;
332; AVX1-LABEL: test10:
333; AVX1:       # BB#0:
334; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
335; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
336; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
337; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
338; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
339; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
340; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
341; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
342; AVX1-NEXT:    retq
343;
344; AVX2-LABEL: test10:
345; AVX2:       # BB#0:
346; AVX2-NEXT:    vpabsd %ymm0, %ymm0
347; AVX2-NEXT:    retq
348;
349; AVX512-LABEL: test10:
350; AVX512:       # BB#0:
351; AVX512-NEXT:    vpabsd %ymm0, %ymm0
352; AVX512-NEXT:    retq
353  %tmp1neg = sub <8 x i32> zeroinitializer, %a
354  %b = icmp sle <8 x i32> %a, zeroinitializer
355  %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
356  ret <8 x i32> %abs
357}
358
359define <16 x i32> @test11(<16 x i32> %a) nounwind {
360; SSE2-LABEL: test11:
361; SSE2:       # BB#0:
362; SSE2-NEXT:    movdqa %xmm0, %xmm4
363; SSE2-NEXT:    psrad $31, %xmm4
364; SSE2-NEXT:    paddd %xmm4, %xmm0
365; SSE2-NEXT:    pxor %xmm4, %xmm0
366; SSE2-NEXT:    movdqa %xmm1, %xmm4
367; SSE2-NEXT:    psrad $31, %xmm4
368; SSE2-NEXT:    paddd %xmm4, %xmm1
369; SSE2-NEXT:    pxor %xmm4, %xmm1
370; SSE2-NEXT:    movdqa %xmm2, %xmm4
371; SSE2-NEXT:    psrad $31, %xmm4
372; SSE2-NEXT:    paddd %xmm4, %xmm2
373; SSE2-NEXT:    pxor %xmm4, %xmm2
374; SSE2-NEXT:    movdqa %xmm3, %xmm4
375; SSE2-NEXT:    psrad $31, %xmm4
376; SSE2-NEXT:    paddd %xmm4, %xmm3
377; SSE2-NEXT:    pxor %xmm4, %xmm3
378; SSE2-NEXT:    retq
379;
380; SSSE3-LABEL: test11:
381; SSSE3:       # BB#0:
382; SSSE3-NEXT:    pabsd %xmm0, %xmm0
383; SSSE3-NEXT:    pabsd %xmm1, %xmm1
384; SSSE3-NEXT:    pabsd %xmm2, %xmm2
385; SSSE3-NEXT:    pabsd %xmm3, %xmm3
386; SSSE3-NEXT:    retq
387;
388; AVX1-LABEL: test11:
389; AVX1:       # BB#0:
390; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
391; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
392; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
393; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
394; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm0
395; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
396; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
397; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
398; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
399; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
400; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
401; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
402; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm1
403; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
404; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
405; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
406; AVX1-NEXT:    retq
407;
408; AVX2-LABEL: test11:
409; AVX2:       # BB#0:
410; AVX2-NEXT:    vpabsd %ymm0, %ymm0
411; AVX2-NEXT:    vpabsd %ymm1, %ymm1
412; AVX2-NEXT:    retq
413;
414; AVX512-LABEL: test11:
415; AVX512:       # BB#0:
416; AVX512-NEXT:    vpabsd %zmm0, %zmm0
417; AVX512-NEXT:    retq
418  %tmp1neg = sub <16 x i32> zeroinitializer, %a
419  %b = icmp sle <16 x i32> %a, zeroinitializer
420  %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a
421  ret <16 x i32> %abs
422}
423
424define <8 x i64> @test12(<8 x i64> %a) nounwind {
425; SSE-LABEL: test12:
426; SSE:       # BB#0:
427; SSE-NEXT:    movdqa %xmm0, %xmm4
428; SSE-NEXT:    psrad $31, %xmm4
429; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
430; SSE-NEXT:    paddq %xmm4, %xmm0
431; SSE-NEXT:    pxor %xmm4, %xmm0
432; SSE-NEXT:    movdqa %xmm1, %xmm4
433; SSE-NEXT:    psrad $31, %xmm4
434; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
435; SSE-NEXT:    paddq %xmm4, %xmm1
436; SSE-NEXT:    pxor %xmm4, %xmm1
437; SSE-NEXT:    movdqa %xmm2, %xmm4
438; SSE-NEXT:    psrad $31, %xmm4
439; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
440; SSE-NEXT:    paddq %xmm4, %xmm2
441; SSE-NEXT:    pxor %xmm4, %xmm2
442; SSE-NEXT:    movdqa %xmm3, %xmm4
443; SSE-NEXT:    psrad $31, %xmm4
444; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
445; SSE-NEXT:    paddq %xmm4, %xmm3
446; SSE-NEXT:    pxor %xmm4, %xmm3
447; SSE-NEXT:    retq
448;
449; AVX1-LABEL: test12:
450; AVX1:       # BB#0:
451; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
452; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
453; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
454; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
455; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
456; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
457; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
458; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
459; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
460; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
461; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
462; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
463; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
464; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
465; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
466; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
467; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
468; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
469; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
470; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
471; AVX1-NEXT:    retq
472;
473; AVX2-LABEL: test12:
474; AVX2:       # BB#0:
475; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
476; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
477; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
478; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
479; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
480; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
481; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
482; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
483; AVX2-NEXT:    retq
484;
485; AVX512-LABEL: test12:
486; AVX512:       # BB#0:
487; AVX512-NEXT:    vpabsq %zmm0, %zmm0
488; AVX512-NEXT:    retq
489  %tmp1neg = sub <8 x i64> zeroinitializer, %a
490  %b = icmp sle <8 x i64> %a, zeroinitializer
491  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
492  ret <8 x i64> %abs
493}
494
495define <8 x i64> @test13(<8 x i64>* %a.ptr) nounwind {
496; SSE-LABEL: test13:
497; SSE:       # BB#0:
498; SSE-NEXT:    movdqu (%rdi), %xmm0
499; SSE-NEXT:    movdqu 16(%rdi), %xmm1
500; SSE-NEXT:    movdqu 32(%rdi), %xmm2
501; SSE-NEXT:    movdqu 48(%rdi), %xmm3
502; SSE-NEXT:    movdqa %xmm0, %xmm4
503; SSE-NEXT:    psrad $31, %xmm4
504; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
505; SSE-NEXT:    paddq %xmm4, %xmm0
506; SSE-NEXT:    pxor %xmm4, %xmm0
507; SSE-NEXT:    movdqa %xmm1, %xmm4
508; SSE-NEXT:    psrad $31, %xmm4
509; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
510; SSE-NEXT:    paddq %xmm4, %xmm1
511; SSE-NEXT:    pxor %xmm4, %xmm1
512; SSE-NEXT:    movdqa %xmm2, %xmm4
513; SSE-NEXT:    psrad $31, %xmm4
514; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
515; SSE-NEXT:    paddq %xmm4, %xmm2
516; SSE-NEXT:    pxor %xmm4, %xmm2
517; SSE-NEXT:    movdqa %xmm3, %xmm4
518; SSE-NEXT:    psrad $31, %xmm4
519; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
520; SSE-NEXT:    paddq %xmm4, %xmm3
521; SSE-NEXT:    pxor %xmm4, %xmm3
522; SSE-NEXT:    retq
523;
524; AVX1-LABEL: test13:
525; AVX1:       # BB#0:
526; AVX1-NEXT:    vmovups (%rdi), %ymm0
527; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
528; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
529; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
530; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
531; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
532; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
533; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
534; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
535; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
536; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
537; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
538; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
539; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
540; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
541; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
542; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
543; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
544; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
545; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
546; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
547; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
548; AVX1-NEXT:    retq
549;
550; AVX2-LABEL: test13:
551; AVX2:       # BB#0:
552; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
553; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
554; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
555; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
556; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
557; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
558; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
559; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
560; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
561; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
562; AVX2-NEXT:    retq
563;
564; AVX512-LABEL: test13:
565; AVX512:       # BB#0:
566; AVX512-NEXT:    vpabsq (%rdi), %zmm0
567; AVX512-NEXT:    retq
568  %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8
569  %tmp1neg = sub <8 x i64> zeroinitializer, %a
570  %b = icmp sle <8 x i64> %a, zeroinitializer
571  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
572  ret <8 x i64> %abs
573}
574