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=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3    | FileCheck %s --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1   | FileCheck %s --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx      | FileCheck %s --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2     | FileCheck %s --check-prefix=AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl --show-mc-encoding | FileCheck %s --check-prefixes=AVX512,AVX512F
8; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl,+avx512bw --show-mc-encoding | FileCheck %s --check-prefixes=AVX512,AVX512BW
9
10define <4 x i32> @test_abs_gt_v4i32(<4 x i32> %a) nounwind {
11; SSE2-LABEL: test_abs_gt_v4i32:
12; SSE2:       # %bb.0:
13; SSE2-NEXT:    movdqa %xmm0, %xmm1
14; SSE2-NEXT:    psrad $31, %xmm1
15; SSE2-NEXT:    paddd %xmm1, %xmm0
16; SSE2-NEXT:    pxor %xmm1, %xmm0
17; SSE2-NEXT:    retq
18;
19; SSSE3-LABEL: test_abs_gt_v4i32:
20; SSSE3:       # %bb.0:
21; SSSE3-NEXT:    pabsd %xmm0, %xmm0
22; SSSE3-NEXT:    retq
23;
24; SSE41-LABEL: test_abs_gt_v4i32:
25; SSE41:       # %bb.0:
26; SSE41-NEXT:    pabsd %xmm0, %xmm0
27; SSE41-NEXT:    retq
28;
29; AVX1-LABEL: test_abs_gt_v4i32:
30; AVX1:       # %bb.0:
31; AVX1-NEXT:    vpabsd %xmm0, %xmm0
32; AVX1-NEXT:    retq
33;
34; AVX2-LABEL: test_abs_gt_v4i32:
35; AVX2:       # %bb.0:
36; AVX2-NEXT:    vpabsd %xmm0, %xmm0
37; AVX2-NEXT:    retq
38;
39; AVX512-LABEL: test_abs_gt_v4i32:
40; AVX512:       # %bb.0:
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
46  ret <4 x i32> %abs
47}
48
49define <4 x i32> @test_abs_ge_v4i32(<4 x i32> %a) nounwind {
50; SSE2-LABEL: test_abs_ge_v4i32:
51; SSE2:       # %bb.0:
52; SSE2-NEXT:    movdqa %xmm0, %xmm1
53; SSE2-NEXT:    psrad $31, %xmm1
54; SSE2-NEXT:    paddd %xmm1, %xmm0
55; SSE2-NEXT:    pxor %xmm1, %xmm0
56; SSE2-NEXT:    retq
57;
58; SSSE3-LABEL: test_abs_ge_v4i32:
59; SSSE3:       # %bb.0:
60; SSSE3-NEXT:    pabsd %xmm0, %xmm0
61; SSSE3-NEXT:    retq
62;
63; SSE41-LABEL: test_abs_ge_v4i32:
64; SSE41:       # %bb.0:
65; SSE41-NEXT:    pabsd %xmm0, %xmm0
66; SSE41-NEXT:    retq
67;
68; AVX1-LABEL: test_abs_ge_v4i32:
69; AVX1:       # %bb.0:
70; AVX1-NEXT:    vpabsd %xmm0, %xmm0
71; AVX1-NEXT:    retq
72;
73; AVX2-LABEL: test_abs_ge_v4i32:
74; AVX2:       # %bb.0:
75; AVX2-NEXT:    vpabsd %xmm0, %xmm0
76; AVX2-NEXT:    retq
77;
78; AVX512-LABEL: test_abs_ge_v4i32:
79; AVX512:       # %bb.0:
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
85  ret <4 x i32> %abs
86}
87
88define <8 x i16> @test_abs_gt_v8i16(<8 x i16> %a) nounwind {
89; SSE2-LABEL: test_abs_gt_v8i16:
90; SSE2:       # %bb.0:
91; SSE2-NEXT:    pxor %xmm1, %xmm1
92; SSE2-NEXT:    psubw %xmm0, %xmm1
93; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
94; SSE2-NEXT:    retq
95;
96; SSSE3-LABEL: test_abs_gt_v8i16:
97; SSSE3:       # %bb.0:
98; SSSE3-NEXT:    pabsw %xmm0, %xmm0
99; SSSE3-NEXT:    retq
100;
101; SSE41-LABEL: test_abs_gt_v8i16:
102; SSE41:       # %bb.0:
103; SSE41-NEXT:    pabsw %xmm0, %xmm0
104; SSE41-NEXT:    retq
105;
106; AVX1-LABEL: test_abs_gt_v8i16:
107; AVX1:       # %bb.0:
108; AVX1-NEXT:    vpabsw %xmm0, %xmm0
109; AVX1-NEXT:    retq
110;
111; AVX2-LABEL: test_abs_gt_v8i16:
112; AVX2:       # %bb.0:
113; AVX2-NEXT:    vpabsw %xmm0, %xmm0
114; AVX2-NEXT:    retq
115;
116; AVX512F-LABEL: test_abs_gt_v8i16:
117; AVX512F:       # %bb.0:
118; AVX512F-NEXT:    vpabsw %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0x1d,0xc0]
119; AVX512F-NEXT:    retq # encoding: [0xc3]
120;
121; AVX512BW-LABEL: test_abs_gt_v8i16:
122; AVX512BW:       # %bb.0:
123; AVX512BW-NEXT:    vpabsw %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1d,0xc0]
124; AVX512BW-NEXT:    retq # encoding: [0xc3]
125  %tmp1neg = sub <8 x i16> zeroinitializer, %a
126  %b = icmp sgt <8 x i16> %a, zeroinitializer
127  %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
128  ret <8 x i16> %abs
129}
130
131define <16 x i8> @test_abs_lt_v16i8(<16 x i8> %a) nounwind {
132; SSE2-LABEL: test_abs_lt_v16i8:
133; SSE2:       # %bb.0:
134; SSE2-NEXT:    pxor %xmm1, %xmm1
135; SSE2-NEXT:    psubb %xmm0, %xmm1
136; SSE2-NEXT:    pminub %xmm1, %xmm0
137; SSE2-NEXT:    retq
138;
139; SSSE3-LABEL: test_abs_lt_v16i8:
140; SSSE3:       # %bb.0:
141; SSSE3-NEXT:    pabsb %xmm0, %xmm0
142; SSSE3-NEXT:    retq
143;
144; SSE41-LABEL: test_abs_lt_v16i8:
145; SSE41:       # %bb.0:
146; SSE41-NEXT:    pabsb %xmm0, %xmm0
147; SSE41-NEXT:    retq
148;
149; AVX1-LABEL: test_abs_lt_v16i8:
150; AVX1:       # %bb.0:
151; AVX1-NEXT:    vpabsb %xmm0, %xmm0
152; AVX1-NEXT:    retq
153;
154; AVX2-LABEL: test_abs_lt_v16i8:
155; AVX2:       # %bb.0:
156; AVX2-NEXT:    vpabsb %xmm0, %xmm0
157; AVX2-NEXT:    retq
158;
159; AVX512F-LABEL: test_abs_lt_v16i8:
160; AVX512F:       # %bb.0:
161; AVX512F-NEXT:    vpabsb %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0x1c,0xc0]
162; AVX512F-NEXT:    retq # encoding: [0xc3]
163;
164; AVX512BW-LABEL: test_abs_lt_v16i8:
165; AVX512BW:       # %bb.0:
166; AVX512BW-NEXT:    vpabsb %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1c,0xc0]
167; AVX512BW-NEXT:    retq # encoding: [0xc3]
168  %tmp1neg = sub <16 x i8> zeroinitializer, %a
169  %b = icmp slt <16 x i8> %a, zeroinitializer
170  %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
171  ret <16 x i8> %abs
172}
173
174define <4 x i32> @test_abs_le_v4i32(<4 x i32> %a) nounwind {
175; SSE2-LABEL: test_abs_le_v4i32:
176; SSE2:       # %bb.0:
177; SSE2-NEXT:    movdqa %xmm0, %xmm1
178; SSE2-NEXT:    psrad $31, %xmm1
179; SSE2-NEXT:    paddd %xmm1, %xmm0
180; SSE2-NEXT:    pxor %xmm1, %xmm0
181; SSE2-NEXT:    retq
182;
183; SSSE3-LABEL: test_abs_le_v4i32:
184; SSSE3:       # %bb.0:
185; SSSE3-NEXT:    pabsd %xmm0, %xmm0
186; SSSE3-NEXT:    retq
187;
188; SSE41-LABEL: test_abs_le_v4i32:
189; SSE41:       # %bb.0:
190; SSE41-NEXT:    pabsd %xmm0, %xmm0
191; SSE41-NEXT:    retq
192;
193; AVX1-LABEL: test_abs_le_v4i32:
194; AVX1:       # %bb.0:
195; AVX1-NEXT:    vpabsd %xmm0, %xmm0
196; AVX1-NEXT:    retq
197;
198; AVX2-LABEL: test_abs_le_v4i32:
199; AVX2:       # %bb.0:
200; AVX2-NEXT:    vpabsd %xmm0, %xmm0
201; AVX2-NEXT:    retq
202;
203; AVX512-LABEL: test_abs_le_v4i32:
204; AVX512:       # %bb.0:
205; AVX512-NEXT:    vpabsd %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x1e,0xc0]
206; AVX512-NEXT:    retq # encoding: [0xc3]
207  %tmp1neg = sub <4 x i32> zeroinitializer, %a
208  %b = icmp sle <4 x i32> %a, zeroinitializer
209  %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
210  ret <4 x i32> %abs
211}
212
213define <8 x i32> @test_abs_gt_v8i32(<8 x i32> %a) nounwind {
214; SSE2-LABEL: test_abs_gt_v8i32:
215; SSE2:       # %bb.0:
216; SSE2-NEXT:    movdqa %xmm0, %xmm2
217; SSE2-NEXT:    psrad $31, %xmm2
218; SSE2-NEXT:    paddd %xmm2, %xmm0
219; SSE2-NEXT:    pxor %xmm2, %xmm0
220; SSE2-NEXT:    movdqa %xmm1, %xmm2
221; SSE2-NEXT:    psrad $31, %xmm2
222; SSE2-NEXT:    paddd %xmm2, %xmm1
223; SSE2-NEXT:    pxor %xmm2, %xmm1
224; SSE2-NEXT:    retq
225;
226; SSSE3-LABEL: test_abs_gt_v8i32:
227; SSSE3:       # %bb.0:
228; SSSE3-NEXT:    pabsd %xmm0, %xmm0
229; SSSE3-NEXT:    pabsd %xmm1, %xmm1
230; SSSE3-NEXT:    retq
231;
232; SSE41-LABEL: test_abs_gt_v8i32:
233; SSE41:       # %bb.0:
234; SSE41-NEXT:    pabsd %xmm0, %xmm0
235; SSE41-NEXT:    pabsd %xmm1, %xmm1
236; SSE41-NEXT:    retq
237;
238; AVX1-LABEL: test_abs_gt_v8i32:
239; AVX1:       # %bb.0:
240; AVX1-NEXT:    vpabsd %xmm0, %xmm1
241; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
242; AVX1-NEXT:    vpabsd %xmm0, %xmm0
243; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
244; AVX1-NEXT:    retq
245;
246; AVX2-LABEL: test_abs_gt_v8i32:
247; AVX2:       # %bb.0:
248; AVX2-NEXT:    vpabsd %ymm0, %ymm0
249; AVX2-NEXT:    retq
250;
251; AVX512-LABEL: test_abs_gt_v8i32:
252; AVX512:       # %bb.0:
253; AVX512-NEXT:    vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
254; AVX512-NEXT:    retq # encoding: [0xc3]
255  %tmp1neg = sub <8 x i32> zeroinitializer, %a
256  %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
257  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
258  ret <8 x i32> %abs
259}
260
261define <8 x i32> @test_abs_ge_v8i32(<8 x i32> %a) nounwind {
262; SSE2-LABEL: test_abs_ge_v8i32:
263; SSE2:       # %bb.0:
264; SSE2-NEXT:    movdqa %xmm0, %xmm2
265; SSE2-NEXT:    psrad $31, %xmm2
266; SSE2-NEXT:    paddd %xmm2, %xmm0
267; SSE2-NEXT:    pxor %xmm2, %xmm0
268; SSE2-NEXT:    movdqa %xmm1, %xmm2
269; SSE2-NEXT:    psrad $31, %xmm2
270; SSE2-NEXT:    paddd %xmm2, %xmm1
271; SSE2-NEXT:    pxor %xmm2, %xmm1
272; SSE2-NEXT:    retq
273;
274; SSSE3-LABEL: test_abs_ge_v8i32:
275; SSSE3:       # %bb.0:
276; SSSE3-NEXT:    pabsd %xmm0, %xmm0
277; SSSE3-NEXT:    pabsd %xmm1, %xmm1
278; SSSE3-NEXT:    retq
279;
280; SSE41-LABEL: test_abs_ge_v8i32:
281; SSE41:       # %bb.0:
282; SSE41-NEXT:    pabsd %xmm0, %xmm0
283; SSE41-NEXT:    pabsd %xmm1, %xmm1
284; SSE41-NEXT:    retq
285;
286; AVX1-LABEL: test_abs_ge_v8i32:
287; AVX1:       # %bb.0:
288; AVX1-NEXT:    vpabsd %xmm0, %xmm1
289; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
290; AVX1-NEXT:    vpabsd %xmm0, %xmm0
291; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
292; AVX1-NEXT:    retq
293;
294; AVX2-LABEL: test_abs_ge_v8i32:
295; AVX2:       # %bb.0:
296; AVX2-NEXT:    vpabsd %ymm0, %ymm0
297; AVX2-NEXT:    retq
298;
299; AVX512-LABEL: test_abs_ge_v8i32:
300; AVX512:       # %bb.0:
301; AVX512-NEXT:    vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
302; AVX512-NEXT:    retq # encoding: [0xc3]
303  %tmp1neg = sub <8 x i32> zeroinitializer, %a
304  %b = icmp sge <8 x i32> %a, zeroinitializer
305  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
306  ret <8 x i32> %abs
307}
308
309define <16 x i16> @test_abs_gt_v16i16(<16 x i16> %a) nounwind {
310; SSE2-LABEL: test_abs_gt_v16i16:
311; SSE2:       # %bb.0:
312; SSE2-NEXT:    pxor %xmm2, %xmm2
313; SSE2-NEXT:    pxor %xmm3, %xmm3
314; SSE2-NEXT:    psubw %xmm0, %xmm3
315; SSE2-NEXT:    pmaxsw %xmm3, %xmm0
316; SSE2-NEXT:    psubw %xmm1, %xmm2
317; SSE2-NEXT:    pmaxsw %xmm2, %xmm1
318; SSE2-NEXT:    retq
319;
320; SSSE3-LABEL: test_abs_gt_v16i16:
321; SSSE3:       # %bb.0:
322; SSSE3-NEXT:    pabsw %xmm0, %xmm0
323; SSSE3-NEXT:    pabsw %xmm1, %xmm1
324; SSSE3-NEXT:    retq
325;
326; SSE41-LABEL: test_abs_gt_v16i16:
327; SSE41:       # %bb.0:
328; SSE41-NEXT:    pabsw %xmm0, %xmm0
329; SSE41-NEXT:    pabsw %xmm1, %xmm1
330; SSE41-NEXT:    retq
331;
332; AVX1-LABEL: test_abs_gt_v16i16:
333; AVX1:       # %bb.0:
334; AVX1-NEXT:    vpabsw %xmm0, %xmm1
335; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
336; AVX1-NEXT:    vpabsw %xmm0, %xmm0
337; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
338; AVX1-NEXT:    retq
339;
340; AVX2-LABEL: test_abs_gt_v16i16:
341; AVX2:       # %bb.0:
342; AVX2-NEXT:    vpabsw %ymm0, %ymm0
343; AVX2-NEXT:    retq
344;
345; AVX512F-LABEL: test_abs_gt_v16i16:
346; AVX512F:       # %bb.0:
347; AVX512F-NEXT:    vpabsw %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
348; AVX512F-NEXT:    retq # encoding: [0xc3]
349;
350; AVX512BW-LABEL: test_abs_gt_v16i16:
351; AVX512BW:       # %bb.0:
352; AVX512BW-NEXT:    vpabsw %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
353; AVX512BW-NEXT:    retq # encoding: [0xc3]
354  %tmp1neg = sub <16 x i16> zeroinitializer, %a
355  %b = icmp sgt <16 x i16> %a, zeroinitializer
356  %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
357  ret <16 x i16> %abs
358}
359
360define <32 x i8> @test_abs_lt_v32i8(<32 x i8> %a) nounwind {
361; SSE2-LABEL: test_abs_lt_v32i8:
362; SSE2:       # %bb.0:
363; SSE2-NEXT:    pxor %xmm2, %xmm2
364; SSE2-NEXT:    pxor %xmm3, %xmm3
365; SSE2-NEXT:    psubb %xmm0, %xmm3
366; SSE2-NEXT:    pminub %xmm3, %xmm0
367; SSE2-NEXT:    psubb %xmm1, %xmm2
368; SSE2-NEXT:    pminub %xmm2, %xmm1
369; SSE2-NEXT:    retq
370;
371; SSSE3-LABEL: test_abs_lt_v32i8:
372; SSSE3:       # %bb.0:
373; SSSE3-NEXT:    pabsb %xmm0, %xmm0
374; SSSE3-NEXT:    pabsb %xmm1, %xmm1
375; SSSE3-NEXT:    retq
376;
377; SSE41-LABEL: test_abs_lt_v32i8:
378; SSE41:       # %bb.0:
379; SSE41-NEXT:    pabsb %xmm0, %xmm0
380; SSE41-NEXT:    pabsb %xmm1, %xmm1
381; SSE41-NEXT:    retq
382;
383; AVX1-LABEL: test_abs_lt_v32i8:
384; AVX1:       # %bb.0:
385; AVX1-NEXT:    vpabsb %xmm0, %xmm1
386; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
387; AVX1-NEXT:    vpabsb %xmm0, %xmm0
388; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
389; AVX1-NEXT:    retq
390;
391; AVX2-LABEL: test_abs_lt_v32i8:
392; AVX2:       # %bb.0:
393; AVX2-NEXT:    vpabsb %ymm0, %ymm0
394; AVX2-NEXT:    retq
395;
396; AVX512F-LABEL: test_abs_lt_v32i8:
397; AVX512F:       # %bb.0:
398; AVX512F-NEXT:    vpabsb %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
399; AVX512F-NEXT:    retq # encoding: [0xc3]
400;
401; AVX512BW-LABEL: test_abs_lt_v32i8:
402; AVX512BW:       # %bb.0:
403; AVX512BW-NEXT:    vpabsb %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
404; AVX512BW-NEXT:    retq # encoding: [0xc3]
405  %tmp1neg = sub <32 x i8> zeroinitializer, %a
406  %b = icmp slt <32 x i8> %a, zeroinitializer
407  %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
408  ret <32 x i8> %abs
409}
410
411define <8 x i32> @test_abs_le_v8i32(<8 x i32> %a) nounwind {
412; SSE2-LABEL: test_abs_le_v8i32:
413; SSE2:       # %bb.0:
414; SSE2-NEXT:    movdqa %xmm0, %xmm2
415; SSE2-NEXT:    psrad $31, %xmm2
416; SSE2-NEXT:    paddd %xmm2, %xmm0
417; SSE2-NEXT:    pxor %xmm2, %xmm0
418; SSE2-NEXT:    movdqa %xmm1, %xmm2
419; SSE2-NEXT:    psrad $31, %xmm2
420; SSE2-NEXT:    paddd %xmm2, %xmm1
421; SSE2-NEXT:    pxor %xmm2, %xmm1
422; SSE2-NEXT:    retq
423;
424; SSSE3-LABEL: test_abs_le_v8i32:
425; SSSE3:       # %bb.0:
426; SSSE3-NEXT:    pabsd %xmm0, %xmm0
427; SSSE3-NEXT:    pabsd %xmm1, %xmm1
428; SSSE3-NEXT:    retq
429;
430; SSE41-LABEL: test_abs_le_v8i32:
431; SSE41:       # %bb.0:
432; SSE41-NEXT:    pabsd %xmm0, %xmm0
433; SSE41-NEXT:    pabsd %xmm1, %xmm1
434; SSE41-NEXT:    retq
435;
436; AVX1-LABEL: test_abs_le_v8i32:
437; AVX1:       # %bb.0:
438; AVX1-NEXT:    vpabsd %xmm0, %xmm1
439; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
440; AVX1-NEXT:    vpabsd %xmm0, %xmm0
441; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
442; AVX1-NEXT:    retq
443;
444; AVX2-LABEL: test_abs_le_v8i32:
445; AVX2:       # %bb.0:
446; AVX2-NEXT:    vpabsd %ymm0, %ymm0
447; AVX2-NEXT:    retq
448;
449; AVX512-LABEL: test_abs_le_v8i32:
450; AVX512:       # %bb.0:
451; AVX512-NEXT:    vpabsd %ymm0, %ymm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x1e,0xc0]
452; AVX512-NEXT:    retq # encoding: [0xc3]
453  %tmp1neg = sub <8 x i32> zeroinitializer, %a
454  %b = icmp sle <8 x i32> %a, zeroinitializer
455  %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
456  ret <8 x i32> %abs
457}
458
459define <16 x i32> @test_abs_le_16i32(<16 x i32> %a) nounwind {
460; SSE2-LABEL: test_abs_le_16i32:
461; SSE2:       # %bb.0:
462; SSE2-NEXT:    movdqa %xmm0, %xmm4
463; SSE2-NEXT:    psrad $31, %xmm4
464; SSE2-NEXT:    paddd %xmm4, %xmm0
465; SSE2-NEXT:    pxor %xmm4, %xmm0
466; SSE2-NEXT:    movdqa %xmm1, %xmm4
467; SSE2-NEXT:    psrad $31, %xmm4
468; SSE2-NEXT:    paddd %xmm4, %xmm1
469; SSE2-NEXT:    pxor %xmm4, %xmm1
470; SSE2-NEXT:    movdqa %xmm2, %xmm4
471; SSE2-NEXT:    psrad $31, %xmm4
472; SSE2-NEXT:    paddd %xmm4, %xmm2
473; SSE2-NEXT:    pxor %xmm4, %xmm2
474; SSE2-NEXT:    movdqa %xmm3, %xmm4
475; SSE2-NEXT:    psrad $31, %xmm4
476; SSE2-NEXT:    paddd %xmm4, %xmm3
477; SSE2-NEXT:    pxor %xmm4, %xmm3
478; SSE2-NEXT:    retq
479;
480; SSSE3-LABEL: test_abs_le_16i32:
481; SSSE3:       # %bb.0:
482; SSSE3-NEXT:    pabsd %xmm0, %xmm0
483; SSSE3-NEXT:    pabsd %xmm1, %xmm1
484; SSSE3-NEXT:    pabsd %xmm2, %xmm2
485; SSSE3-NEXT:    pabsd %xmm3, %xmm3
486; SSSE3-NEXT:    retq
487;
488; SSE41-LABEL: test_abs_le_16i32:
489; SSE41:       # %bb.0:
490; SSE41-NEXT:    pabsd %xmm0, %xmm0
491; SSE41-NEXT:    pabsd %xmm1, %xmm1
492; SSE41-NEXT:    pabsd %xmm2, %xmm2
493; SSE41-NEXT:    pabsd %xmm3, %xmm3
494; SSE41-NEXT:    retq
495;
496; AVX1-LABEL: test_abs_le_16i32:
497; AVX1:       # %bb.0:
498; AVX1-NEXT:    vpabsd %xmm0, %xmm2
499; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
500; AVX1-NEXT:    vpabsd %xmm0, %xmm0
501; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
502; AVX1-NEXT:    vpabsd %xmm1, %xmm2
503; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
504; AVX1-NEXT:    vpabsd %xmm1, %xmm1
505; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
506; AVX1-NEXT:    retq
507;
508; AVX2-LABEL: test_abs_le_16i32:
509; AVX2:       # %bb.0:
510; AVX2-NEXT:    vpabsd %ymm0, %ymm0
511; AVX2-NEXT:    vpabsd %ymm1, %ymm1
512; AVX2-NEXT:    retq
513;
514; AVX512-LABEL: test_abs_le_16i32:
515; AVX512:       # %bb.0:
516; AVX512-NEXT:    vpabsd %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1e,0xc0]
517; AVX512-NEXT:    retq # encoding: [0xc3]
518  %tmp1neg = sub <16 x i32> zeroinitializer, %a
519  %b = icmp sle <16 x i32> %a, zeroinitializer
520  %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a
521  ret <16 x i32> %abs
522}
523
524define <2 x i64> @test_abs_ge_v2i64(<2 x i64> %a) nounwind {
525; SSE2-LABEL: test_abs_ge_v2i64:
526; SSE2:       # %bb.0:
527; SSE2-NEXT:    movdqa %xmm0, %xmm1
528; SSE2-NEXT:    psrad $31, %xmm1
529; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
530; SSE2-NEXT:    paddq %xmm1, %xmm0
531; SSE2-NEXT:    pxor %xmm1, %xmm0
532; SSE2-NEXT:    retq
533;
534; SSSE3-LABEL: test_abs_ge_v2i64:
535; SSSE3:       # %bb.0:
536; SSSE3-NEXT:    movdqa %xmm0, %xmm1
537; SSSE3-NEXT:    psrad $31, %xmm1
538; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
539; SSSE3-NEXT:    paddq %xmm1, %xmm0
540; SSSE3-NEXT:    pxor %xmm1, %xmm0
541; SSSE3-NEXT:    retq
542;
543; SSE41-LABEL: test_abs_ge_v2i64:
544; SSE41:       # %bb.0:
545; SSE41-NEXT:    pxor %xmm1, %xmm1
546; SSE41-NEXT:    psubq %xmm0, %xmm1
547; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm0
548; SSE41-NEXT:    retq
549;
550; AVX1-LABEL: test_abs_ge_v2i64:
551; AVX1:       # %bb.0:
552; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
553; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
554; AVX1-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
555; AVX1-NEXT:    retq
556;
557; AVX2-LABEL: test_abs_ge_v2i64:
558; AVX2:       # %bb.0:
559; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
560; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
561; AVX2-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
562; AVX2-NEXT:    retq
563;
564; AVX512-LABEL: test_abs_ge_v2i64:
565; AVX512:       # %bb.0:
566; AVX512-NEXT:    vpabsq %xmm0, %xmm0 # encoding: [0x62,0xf2,0xfd,0x08,0x1f,0xc0]
567; AVX512-NEXT:    retq # encoding: [0xc3]
568  %tmp1neg = sub <2 x i64> zeroinitializer, %a
569  %b = icmp sge <2 x i64> %a, zeroinitializer
570  %abs = select <2 x i1> %b, <2 x i64> %a, <2 x i64> %tmp1neg
571  ret <2 x i64> %abs
572}
573
574define <4 x i64> @test_abs_gt_v4i64(<4 x i64> %a) nounwind {
575; SSE2-LABEL: test_abs_gt_v4i64:
576; SSE2:       # %bb.0:
577; SSE2-NEXT:    movdqa %xmm0, %xmm2
578; SSE2-NEXT:    psrad $31, %xmm2
579; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
580; SSE2-NEXT:    paddq %xmm2, %xmm0
581; SSE2-NEXT:    pxor %xmm2, %xmm0
582; SSE2-NEXT:    movdqa %xmm1, %xmm2
583; SSE2-NEXT:    psrad $31, %xmm2
584; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
585; SSE2-NEXT:    paddq %xmm2, %xmm1
586; SSE2-NEXT:    pxor %xmm2, %xmm1
587; SSE2-NEXT:    retq
588;
589; SSSE3-LABEL: test_abs_gt_v4i64:
590; SSSE3:       # %bb.0:
591; SSSE3-NEXT:    movdqa %xmm0, %xmm2
592; SSSE3-NEXT:    psrad $31, %xmm2
593; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
594; SSSE3-NEXT:    paddq %xmm2, %xmm0
595; SSSE3-NEXT:    pxor %xmm2, %xmm0
596; SSSE3-NEXT:    movdqa %xmm1, %xmm2
597; SSSE3-NEXT:    psrad $31, %xmm2
598; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
599; SSSE3-NEXT:    paddq %xmm2, %xmm1
600; SSSE3-NEXT:    pxor %xmm2, %xmm1
601; SSSE3-NEXT:    retq
602;
603; SSE41-LABEL: test_abs_gt_v4i64:
604; SSE41:       # %bb.0:
605; SSE41-NEXT:    movdqa %xmm0, %xmm2
606; SSE41-NEXT:    pxor %xmm3, %xmm3
607; SSE41-NEXT:    pxor %xmm4, %xmm4
608; SSE41-NEXT:    psubq %xmm0, %xmm4
609; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
610; SSE41-NEXT:    psubq %xmm1, %xmm3
611; SSE41-NEXT:    movdqa %xmm1, %xmm0
612; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
613; SSE41-NEXT:    movapd %xmm2, %xmm0
614; SSE41-NEXT:    retq
615;
616; AVX1-LABEL: test_abs_gt_v4i64:
617; AVX1:       # %bb.0:
618; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
619; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
620; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
621; AVX1-NEXT:    vpsubq %xmm0, %xmm2, %xmm2
622; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
623; AVX1-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
624; AVX1-NEXT:    retq
625;
626; AVX2-LABEL: test_abs_gt_v4i64:
627; AVX2:       # %bb.0:
628; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
629; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
630; AVX2-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
631; AVX2-NEXT:    retq
632;
633; AVX512-LABEL: test_abs_gt_v4i64:
634; AVX512:       # %bb.0:
635; AVX512-NEXT:    vpabsq %ymm0, %ymm0 # encoding: [0x62,0xf2,0xfd,0x28,0x1f,0xc0]
636; AVX512-NEXT:    retq # encoding: [0xc3]
637  %tmp1neg = sub <4 x i64> zeroinitializer, %a
638  %b = icmp sgt <4 x i64> %a, <i64 -1, i64 -1, i64 -1, i64 -1>
639  %abs = select <4 x i1> %b, <4 x i64> %a, <4 x i64> %tmp1neg
640  ret <4 x i64> %abs
641}
642
643define <8 x i64> @test_abs_le_v8i64(<8 x i64> %a) nounwind {
644; SSE2-LABEL: test_abs_le_v8i64:
645; SSE2:       # %bb.0:
646; SSE2-NEXT:    movdqa %xmm0, %xmm4
647; SSE2-NEXT:    psrad $31, %xmm4
648; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
649; SSE2-NEXT:    paddq %xmm4, %xmm0
650; SSE2-NEXT:    pxor %xmm4, %xmm0
651; SSE2-NEXT:    movdqa %xmm1, %xmm4
652; SSE2-NEXT:    psrad $31, %xmm4
653; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
654; SSE2-NEXT:    paddq %xmm4, %xmm1
655; SSE2-NEXT:    pxor %xmm4, %xmm1
656; SSE2-NEXT:    movdqa %xmm2, %xmm4
657; SSE2-NEXT:    psrad $31, %xmm4
658; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
659; SSE2-NEXT:    paddq %xmm4, %xmm2
660; SSE2-NEXT:    pxor %xmm4, %xmm2
661; SSE2-NEXT:    movdqa %xmm3, %xmm4
662; SSE2-NEXT:    psrad $31, %xmm4
663; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
664; SSE2-NEXT:    paddq %xmm4, %xmm3
665; SSE2-NEXT:    pxor %xmm4, %xmm3
666; SSE2-NEXT:    retq
667;
668; SSSE3-LABEL: test_abs_le_v8i64:
669; SSSE3:       # %bb.0:
670; SSSE3-NEXT:    movdqa %xmm0, %xmm4
671; SSSE3-NEXT:    psrad $31, %xmm4
672; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
673; SSSE3-NEXT:    paddq %xmm4, %xmm0
674; SSSE3-NEXT:    pxor %xmm4, %xmm0
675; SSSE3-NEXT:    movdqa %xmm1, %xmm4
676; SSSE3-NEXT:    psrad $31, %xmm4
677; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
678; SSSE3-NEXT:    paddq %xmm4, %xmm1
679; SSSE3-NEXT:    pxor %xmm4, %xmm1
680; SSSE3-NEXT:    movdqa %xmm2, %xmm4
681; SSSE3-NEXT:    psrad $31, %xmm4
682; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
683; SSSE3-NEXT:    paddq %xmm4, %xmm2
684; SSSE3-NEXT:    pxor %xmm4, %xmm2
685; SSSE3-NEXT:    movdqa %xmm3, %xmm4
686; SSSE3-NEXT:    psrad $31, %xmm4
687; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
688; SSSE3-NEXT:    paddq %xmm4, %xmm3
689; SSSE3-NEXT:    pxor %xmm4, %xmm3
690; SSSE3-NEXT:    retq
691;
692; SSE41-LABEL: test_abs_le_v8i64:
693; SSE41:       # %bb.0:
694; SSE41-NEXT:    movdqa %xmm0, %xmm4
695; SSE41-NEXT:    pxor %xmm5, %xmm5
696; SSE41-NEXT:    pxor %xmm6, %xmm6
697; SSE41-NEXT:    psubq %xmm0, %xmm6
698; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm4
699; SSE41-NEXT:    pxor %xmm6, %xmm6
700; SSE41-NEXT:    psubq %xmm1, %xmm6
701; SSE41-NEXT:    movdqa %xmm1, %xmm0
702; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
703; SSE41-NEXT:    pxor %xmm6, %xmm6
704; SSE41-NEXT:    psubq %xmm2, %xmm6
705; SSE41-NEXT:    movdqa %xmm2, %xmm0
706; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm2
707; SSE41-NEXT:    psubq %xmm3, %xmm5
708; SSE41-NEXT:    movdqa %xmm3, %xmm0
709; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
710; SSE41-NEXT:    movapd %xmm4, %xmm0
711; SSE41-NEXT:    retq
712;
713; AVX1-LABEL: test_abs_le_v8i64:
714; AVX1:       # %bb.0:
715; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
716; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
717; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
718; AVX1-NEXT:    vpsubq %xmm0, %xmm3, %xmm4
719; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
720; AVX1-NEXT:    vblendvpd %ymm0, %ymm2, %ymm0, %ymm0
721; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
722; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
723; AVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm3
724; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
725; AVX1-NEXT:    vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
726; AVX1-NEXT:    retq
727;
728; AVX2-LABEL: test_abs_le_v8i64:
729; AVX2:       # %bb.0:
730; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
731; AVX2-NEXT:    vpsubq %ymm0, %ymm2, %ymm3
732; AVX2-NEXT:    vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
733; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm2
734; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
735; AVX2-NEXT:    retq
736;
737; AVX512-LABEL: test_abs_le_v8i64:
738; AVX512:       # %bb.0:
739; AVX512-NEXT:    vpabsq %zmm0, %zmm0 # encoding: [0x62,0xf2,0xfd,0x48,0x1f,0xc0]
740; AVX512-NEXT:    retq # encoding: [0xc3]
741  %tmp1neg = sub <8 x i64> zeroinitializer, %a
742  %b = icmp sle <8 x i64> %a, zeroinitializer
743  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
744  ret <8 x i64> %abs
745}
746
747define <8 x i64> @test_abs_le_v8i64_fold(<8 x i64>* %a.ptr) nounwind {
748; SSE2-LABEL: test_abs_le_v8i64_fold:
749; SSE2:       # %bb.0:
750; SSE2-NEXT:    movdqu (%rdi), %xmm0
751; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
752; SSE2-NEXT:    movdqu 32(%rdi), %xmm2
753; SSE2-NEXT:    movdqu 48(%rdi), %xmm3
754; SSE2-NEXT:    movdqa %xmm0, %xmm4
755; SSE2-NEXT:    psrad $31, %xmm4
756; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
757; SSE2-NEXT:    paddq %xmm4, %xmm0
758; SSE2-NEXT:    pxor %xmm4, %xmm0
759; SSE2-NEXT:    movdqa %xmm1, %xmm4
760; SSE2-NEXT:    psrad $31, %xmm4
761; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
762; SSE2-NEXT:    paddq %xmm4, %xmm1
763; SSE2-NEXT:    pxor %xmm4, %xmm1
764; SSE2-NEXT:    movdqa %xmm2, %xmm4
765; SSE2-NEXT:    psrad $31, %xmm4
766; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
767; SSE2-NEXT:    paddq %xmm4, %xmm2
768; SSE2-NEXT:    pxor %xmm4, %xmm2
769; SSE2-NEXT:    movdqa %xmm3, %xmm4
770; SSE2-NEXT:    psrad $31, %xmm4
771; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
772; SSE2-NEXT:    paddq %xmm4, %xmm3
773; SSE2-NEXT:    pxor %xmm4, %xmm3
774; SSE2-NEXT:    retq
775;
776; SSSE3-LABEL: test_abs_le_v8i64_fold:
777; SSSE3:       # %bb.0:
778; SSSE3-NEXT:    movdqu (%rdi), %xmm0
779; SSSE3-NEXT:    movdqu 16(%rdi), %xmm1
780; SSSE3-NEXT:    movdqu 32(%rdi), %xmm2
781; SSSE3-NEXT:    movdqu 48(%rdi), %xmm3
782; SSSE3-NEXT:    movdqa %xmm0, %xmm4
783; SSSE3-NEXT:    psrad $31, %xmm4
784; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
785; SSSE3-NEXT:    paddq %xmm4, %xmm0
786; SSSE3-NEXT:    pxor %xmm4, %xmm0
787; SSSE3-NEXT:    movdqa %xmm1, %xmm4
788; SSSE3-NEXT:    psrad $31, %xmm4
789; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
790; SSSE3-NEXT:    paddq %xmm4, %xmm1
791; SSSE3-NEXT:    pxor %xmm4, %xmm1
792; SSSE3-NEXT:    movdqa %xmm2, %xmm4
793; SSSE3-NEXT:    psrad $31, %xmm4
794; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
795; SSSE3-NEXT:    paddq %xmm4, %xmm2
796; SSSE3-NEXT:    pxor %xmm4, %xmm2
797; SSSE3-NEXT:    movdqa %xmm3, %xmm4
798; SSSE3-NEXT:    psrad $31, %xmm4
799; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
800; SSSE3-NEXT:    paddq %xmm4, %xmm3
801; SSSE3-NEXT:    pxor %xmm4, %xmm3
802; SSSE3-NEXT:    retq
803;
804; SSE41-LABEL: test_abs_le_v8i64_fold:
805; SSE41:       # %bb.0:
806; SSE41-NEXT:    movdqu (%rdi), %xmm1
807; SSE41-NEXT:    movdqu 16(%rdi), %xmm2
808; SSE41-NEXT:    movdqu 32(%rdi), %xmm3
809; SSE41-NEXT:    movdqu 48(%rdi), %xmm4
810; SSE41-NEXT:    pxor %xmm5, %xmm5
811; SSE41-NEXT:    pxor %xmm6, %xmm6
812; SSE41-NEXT:    psubq %xmm1, %xmm6
813; SSE41-NEXT:    movdqa %xmm1, %xmm0
814; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
815; SSE41-NEXT:    pxor %xmm6, %xmm6
816; SSE41-NEXT:    psubq %xmm2, %xmm6
817; SSE41-NEXT:    movdqa %xmm2, %xmm0
818; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm2
819; SSE41-NEXT:    pxor %xmm6, %xmm6
820; SSE41-NEXT:    psubq %xmm3, %xmm6
821; SSE41-NEXT:    movdqa %xmm3, %xmm0
822; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
823; SSE41-NEXT:    psubq %xmm4, %xmm5
824; SSE41-NEXT:    movdqa %xmm4, %xmm0
825; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
826; SSE41-NEXT:    movapd %xmm1, %xmm0
827; SSE41-NEXT:    movapd %xmm2, %xmm1
828; SSE41-NEXT:    movapd %xmm3, %xmm2
829; SSE41-NEXT:    movapd %xmm4, %xmm3
830; SSE41-NEXT:    retq
831;
832; AVX1-LABEL: test_abs_le_v8i64_fold:
833; AVX1:       # %bb.0:
834; AVX1-NEXT:    vmovupd (%rdi), %ymm0
835; AVX1-NEXT:    vmovupd 32(%rdi), %ymm1
836; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
837; AVX1-NEXT:    vpsubq 16(%rdi), %xmm2, %xmm3
838; AVX1-NEXT:    vpsubq (%rdi), %xmm2, %xmm4
839; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
840; AVX1-NEXT:    vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
841; AVX1-NEXT:    vpsubq 48(%rdi), %xmm2, %xmm3
842; AVX1-NEXT:    vpsubq 32(%rdi), %xmm2, %xmm2
843; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
844; AVX1-NEXT:    vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
845; AVX1-NEXT:    retq
846;
847; AVX2-LABEL: test_abs_le_v8i64_fold:
848; AVX2:       # %bb.0:
849; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
850; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
851; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
852; AVX2-NEXT:    vpsubq %ymm0, %ymm2, %ymm3
853; AVX2-NEXT:    vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
854; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm2
855; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm1, %ymm1
856; AVX2-NEXT:    retq
857;
858; AVX512-LABEL: test_abs_le_v8i64_fold:
859; AVX512:       # %bb.0:
860; AVX512-NEXT:    vpabsq (%rdi), %zmm0 # encoding: [0x62,0xf2,0xfd,0x48,0x1f,0x07]
861; AVX512-NEXT:    retq # encoding: [0xc3]
862  %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8
863  %tmp1neg = sub <8 x i64> zeroinitializer, %a
864  %b = icmp sle <8 x i64> %a, zeroinitializer
865  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
866  ret <8 x i64> %abs
867}
868
869define <64 x i8> @test_abs_lt_v64i8(<64 x i8> %a) nounwind {
870; SSE2-LABEL: test_abs_lt_v64i8:
871; SSE2:       # %bb.0:
872; SSE2-NEXT:    pxor %xmm4, %xmm4
873; SSE2-NEXT:    pxor %xmm5, %xmm5
874; SSE2-NEXT:    psubb %xmm0, %xmm5
875; SSE2-NEXT:    pminub %xmm5, %xmm0
876; SSE2-NEXT:    pxor %xmm5, %xmm5
877; SSE2-NEXT:    psubb %xmm1, %xmm5
878; SSE2-NEXT:    pminub %xmm5, %xmm1
879; SSE2-NEXT:    pxor %xmm5, %xmm5
880; SSE2-NEXT:    psubb %xmm2, %xmm5
881; SSE2-NEXT:    pminub %xmm5, %xmm2
882; SSE2-NEXT:    psubb %xmm3, %xmm4
883; SSE2-NEXT:    pminub %xmm4, %xmm3
884; SSE2-NEXT:    retq
885;
886; SSSE3-LABEL: test_abs_lt_v64i8:
887; SSSE3:       # %bb.0:
888; SSSE3-NEXT:    pabsb %xmm0, %xmm0
889; SSSE3-NEXT:    pabsb %xmm1, %xmm1
890; SSSE3-NEXT:    pabsb %xmm2, %xmm2
891; SSSE3-NEXT:    pabsb %xmm3, %xmm3
892; SSSE3-NEXT:    retq
893;
894; SSE41-LABEL: test_abs_lt_v64i8:
895; SSE41:       # %bb.0:
896; SSE41-NEXT:    pabsb %xmm0, %xmm0
897; SSE41-NEXT:    pabsb %xmm1, %xmm1
898; SSE41-NEXT:    pabsb %xmm2, %xmm2
899; SSE41-NEXT:    pabsb %xmm3, %xmm3
900; SSE41-NEXT:    retq
901;
902; AVX1-LABEL: test_abs_lt_v64i8:
903; AVX1:       # %bb.0:
904; AVX1-NEXT:    vpabsb %xmm0, %xmm2
905; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
906; AVX1-NEXT:    vpabsb %xmm0, %xmm0
907; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
908; AVX1-NEXT:    vpabsb %xmm1, %xmm2
909; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
910; AVX1-NEXT:    vpabsb %xmm1, %xmm1
911; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
912; AVX1-NEXT:    retq
913;
914; AVX2-LABEL: test_abs_lt_v64i8:
915; AVX2:       # %bb.0:
916; AVX2-NEXT:    vpabsb %ymm0, %ymm0
917; AVX2-NEXT:    vpabsb %ymm1, %ymm1
918; AVX2-NEXT:    retq
919;
920; AVX512F-LABEL: test_abs_lt_v64i8:
921; AVX512F:       # %bb.0:
922; AVX512F-NEXT:    vpabsb %ymm0, %ymm1 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc8]
923; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 # encoding: [0x62,0xf3,0xfd,0x48,0x3b,0xc0,0x01]
924; AVX512F-NEXT:    vpabsb %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1c,0xc0]
925; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0 # encoding: [0x62,0xf3,0xf5,0x48,0x3a,0xc0,0x01]
926; AVX512F-NEXT:    retq # encoding: [0xc3]
927;
928; AVX512BW-LABEL: test_abs_lt_v64i8:
929; AVX512BW:       # %bb.0:
930; AVX512BW-NEXT:    vpabsb %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1c,0xc0]
931; AVX512BW-NEXT:    retq # encoding: [0xc3]
932  %tmp1neg = sub <64 x i8> zeroinitializer, %a
933  %b = icmp slt <64 x i8> %a, zeroinitializer
934  %abs = select <64 x i1> %b, <64 x i8> %tmp1neg, <64 x i8> %a
935  ret <64 x i8> %abs
936}
937
938define <32 x i16> @test_abs_gt_v32i16(<32 x i16> %a) nounwind {
939; SSE2-LABEL: test_abs_gt_v32i16:
940; SSE2:       # %bb.0:
941; SSE2-NEXT:    pxor %xmm4, %xmm4
942; SSE2-NEXT:    pxor %xmm5, %xmm5
943; SSE2-NEXT:    psubw %xmm0, %xmm5
944; SSE2-NEXT:    pmaxsw %xmm5, %xmm0
945; SSE2-NEXT:    pxor %xmm5, %xmm5
946; SSE2-NEXT:    psubw %xmm1, %xmm5
947; SSE2-NEXT:    pmaxsw %xmm5, %xmm1
948; SSE2-NEXT:    pxor %xmm5, %xmm5
949; SSE2-NEXT:    psubw %xmm2, %xmm5
950; SSE2-NEXT:    pmaxsw %xmm5, %xmm2
951; SSE2-NEXT:    psubw %xmm3, %xmm4
952; SSE2-NEXT:    pmaxsw %xmm4, %xmm3
953; SSE2-NEXT:    retq
954;
955; SSSE3-LABEL: test_abs_gt_v32i16:
956; SSSE3:       # %bb.0:
957; SSSE3-NEXT:    pabsw %xmm0, %xmm0
958; SSSE3-NEXT:    pabsw %xmm1, %xmm1
959; SSSE3-NEXT:    pabsw %xmm2, %xmm2
960; SSSE3-NEXT:    pabsw %xmm3, %xmm3
961; SSSE3-NEXT:    retq
962;
963; SSE41-LABEL: test_abs_gt_v32i16:
964; SSE41:       # %bb.0:
965; SSE41-NEXT:    pabsw %xmm0, %xmm0
966; SSE41-NEXT:    pabsw %xmm1, %xmm1
967; SSE41-NEXT:    pabsw %xmm2, %xmm2
968; SSE41-NEXT:    pabsw %xmm3, %xmm3
969; SSE41-NEXT:    retq
970;
971; AVX1-LABEL: test_abs_gt_v32i16:
972; AVX1:       # %bb.0:
973; AVX1-NEXT:    vpabsw %xmm0, %xmm2
974; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
975; AVX1-NEXT:    vpabsw %xmm0, %xmm0
976; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
977; AVX1-NEXT:    vpabsw %xmm1, %xmm2
978; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
979; AVX1-NEXT:    vpabsw %xmm1, %xmm1
980; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
981; AVX1-NEXT:    retq
982;
983; AVX2-LABEL: test_abs_gt_v32i16:
984; AVX2:       # %bb.0:
985; AVX2-NEXT:    vpabsw %ymm0, %ymm0
986; AVX2-NEXT:    vpabsw %ymm1, %ymm1
987; AVX2-NEXT:    retq
988;
989; AVX512F-LABEL: test_abs_gt_v32i16:
990; AVX512F:       # %bb.0:
991; AVX512F-NEXT:    vpabsw %ymm0, %ymm1 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc8]
992; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 # encoding: [0x62,0xf3,0xfd,0x48,0x3b,0xc0,0x01]
993; AVX512F-NEXT:    vpabsw %ymm0, %ymm0 # encoding: [0xc4,0xe2,0x7d,0x1d,0xc0]
994; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0 # encoding: [0x62,0xf3,0xf5,0x48,0x3a,0xc0,0x01]
995; AVX512F-NEXT:    retq # encoding: [0xc3]
996;
997; AVX512BW-LABEL: test_abs_gt_v32i16:
998; AVX512BW:       # %bb.0:
999; AVX512BW-NEXT:    vpabsw %zmm0, %zmm0 # encoding: [0x62,0xf2,0x7d,0x48,0x1d,0xc0]
1000; AVX512BW-NEXT:    retq # encoding: [0xc3]
1001  %tmp1neg = sub <32 x i16> zeroinitializer, %a
1002  %b = icmp sgt <32 x i16> %a, zeroinitializer
1003  %abs = select <32 x i1> %b, <32 x i16> %a, <32 x i16> %tmp1neg
1004  ret <32 x i16> %abs
1005}
1006