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=+avx512vl | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F --check-prefix=AVX512VL
7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
8
9define <4 x i32> @test_abs_gt_v4i32(<4 x i32> %a) nounwind {
10; SSE2-LABEL: test_abs_gt_v4i32:
11; SSE2:       # BB#0:
12; SSE2-NEXT:    movdqa %xmm0, %xmm1
13; SSE2-NEXT:    psrad $31, %xmm1
14; SSE2-NEXT:    paddd %xmm1, %xmm0
15; SSE2-NEXT:    pxor %xmm1, %xmm0
16; SSE2-NEXT:    retq
17;
18; SSSE3-LABEL: test_abs_gt_v4i32:
19; SSSE3:       # BB#0:
20; SSSE3-NEXT:    pabsd %xmm0, %xmm0
21; SSSE3-NEXT:    retq
22;
23; AVX-LABEL: test_abs_gt_v4i32:
24; AVX:       # BB#0:
25; AVX-NEXT:    vpabsd %xmm0, %xmm0
26; AVX-NEXT:    retq
27  %tmp1neg = sub <4 x i32> zeroinitializer, %a
28  %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
29  %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
30  ret <4 x i32> %abs
31}
32
33define <4 x i32> @test_abs_ge_v4i32(<4 x i32> %a) nounwind {
34; SSE2-LABEL: test_abs_ge_v4i32:
35; SSE2:       # BB#0:
36; SSE2-NEXT:    movdqa %xmm0, %xmm1
37; SSE2-NEXT:    psrad $31, %xmm1
38; SSE2-NEXT:    paddd %xmm1, %xmm0
39; SSE2-NEXT:    pxor %xmm1, %xmm0
40; SSE2-NEXT:    retq
41;
42; SSSE3-LABEL: test_abs_ge_v4i32:
43; SSSE3:       # BB#0:
44; SSSE3-NEXT:    pabsd %xmm0, %xmm0
45; SSSE3-NEXT:    retq
46;
47; AVX-LABEL: test_abs_ge_v4i32:
48; AVX:       # BB#0:
49; AVX-NEXT:    vpabsd %xmm0, %xmm0
50; AVX-NEXT:    retq
51  %tmp1neg = sub <4 x i32> zeroinitializer, %a
52  %b = icmp sge <4 x i32> %a, zeroinitializer
53  %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
54  ret <4 x i32> %abs
55}
56
57define <8 x i16> @test_abs_gt_v8i16(<8 x i16> %a) nounwind {
58; SSE2-LABEL: test_abs_gt_v8i16:
59; SSE2:       # BB#0:
60; SSE2-NEXT:    movdqa %xmm0, %xmm1
61; SSE2-NEXT:    psraw $15, %xmm1
62; SSE2-NEXT:    paddw %xmm1, %xmm0
63; SSE2-NEXT:    pxor %xmm1, %xmm0
64; SSE2-NEXT:    retq
65;
66; SSSE3-LABEL: test_abs_gt_v8i16:
67; SSSE3:       # BB#0:
68; SSSE3-NEXT:    pabsw %xmm0, %xmm0
69; SSSE3-NEXT:    retq
70;
71; AVX-LABEL: test_abs_gt_v8i16:
72; AVX:       # BB#0:
73; AVX-NEXT:    vpabsw %xmm0, %xmm0
74; AVX-NEXT:    retq
75  %tmp1neg = sub <8 x i16> zeroinitializer, %a
76  %b = icmp sgt <8 x i16> %a, zeroinitializer
77  %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
78  ret <8 x i16> %abs
79}
80
81define <16 x i8> @test_abs_lt_v16i8(<16 x i8> %a) nounwind {
82; SSE2-LABEL: test_abs_lt_v16i8:
83; SSE2:       # BB#0:
84; SSE2-NEXT:    pxor %xmm1, %xmm1
85; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
86; SSE2-NEXT:    paddb %xmm1, %xmm0
87; SSE2-NEXT:    pxor %xmm1, %xmm0
88; SSE2-NEXT:    retq
89;
90; SSSE3-LABEL: test_abs_lt_v16i8:
91; SSSE3:       # BB#0:
92; SSSE3-NEXT:    pabsb %xmm0, %xmm0
93; SSSE3-NEXT:    retq
94;
95; AVX-LABEL: test_abs_lt_v16i8:
96; AVX:       # BB#0:
97; AVX-NEXT:    vpabsb %xmm0, %xmm0
98; AVX-NEXT:    retq
99  %tmp1neg = sub <16 x i8> zeroinitializer, %a
100  %b = icmp slt <16 x i8> %a, zeroinitializer
101  %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
102  ret <16 x i8> %abs
103}
104
105define <4 x i32> @test_abs_le_v4i32(<4 x i32> %a) nounwind {
106; SSE2-LABEL: test_abs_le_v4i32:
107; SSE2:       # BB#0:
108; SSE2-NEXT:    movdqa %xmm0, %xmm1
109; SSE2-NEXT:    psrad $31, %xmm1
110; SSE2-NEXT:    paddd %xmm1, %xmm0
111; SSE2-NEXT:    pxor %xmm1, %xmm0
112; SSE2-NEXT:    retq
113;
114; SSSE3-LABEL: test_abs_le_v4i32:
115; SSSE3:       # BB#0:
116; SSSE3-NEXT:    pabsd %xmm0, %xmm0
117; SSSE3-NEXT:    retq
118;
119; AVX-LABEL: test_abs_le_v4i32:
120; AVX:       # BB#0:
121; AVX-NEXT:    vpabsd %xmm0, %xmm0
122; AVX-NEXT:    retq
123  %tmp1neg = sub <4 x i32> zeroinitializer, %a
124  %b = icmp sle <4 x i32> %a, zeroinitializer
125  %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
126  ret <4 x i32> %abs
127}
128
129define <8 x i32> @test_abs_gt_v8i32(<8 x i32> %a) nounwind {
130; SSE2-LABEL: test_abs_gt_v8i32:
131; SSE2:       # BB#0:
132; SSE2-NEXT:    movdqa %xmm0, %xmm2
133; SSE2-NEXT:    psrad $31, %xmm2
134; SSE2-NEXT:    paddd %xmm2, %xmm0
135; SSE2-NEXT:    pxor %xmm2, %xmm0
136; SSE2-NEXT:    movdqa %xmm1, %xmm2
137; SSE2-NEXT:    psrad $31, %xmm2
138; SSE2-NEXT:    paddd %xmm2, %xmm1
139; SSE2-NEXT:    pxor %xmm2, %xmm1
140; SSE2-NEXT:    retq
141;
142; SSSE3-LABEL: test_abs_gt_v8i32:
143; SSSE3:       # BB#0:
144; SSSE3-NEXT:    pabsd %xmm0, %xmm0
145; SSSE3-NEXT:    pabsd %xmm1, %xmm1
146; SSSE3-NEXT:    retq
147;
148; AVX1-LABEL: test_abs_gt_v8i32:
149; AVX1:       # BB#0:
150; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
151; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
152; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
153; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
154; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
155; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
156; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
157; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
158; AVX1-NEXT:    retq
159;
160; AVX2-LABEL: test_abs_gt_v8i32:
161; AVX2:       # BB#0:
162; AVX2-NEXT:    vpabsd %ymm0, %ymm0
163; AVX2-NEXT:    retq
164;
165; AVX512-LABEL: test_abs_gt_v8i32:
166; AVX512:       # BB#0:
167; AVX512-NEXT:    vpabsd %ymm0, %ymm0
168; AVX512-NEXT:    retq
169  %tmp1neg = sub <8 x i32> zeroinitializer, %a
170  %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
171  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
172  ret <8 x i32> %abs
173}
174
175define <8 x i32> @test_abs_ge_v8i32(<8 x i32> %a) nounwind {
176; SSE2-LABEL: test_abs_ge_v8i32:
177; SSE2:       # BB#0:
178; SSE2-NEXT:    movdqa %xmm0, %xmm2
179; SSE2-NEXT:    psrad $31, %xmm2
180; SSE2-NEXT:    paddd %xmm2, %xmm0
181; SSE2-NEXT:    pxor %xmm2, %xmm0
182; SSE2-NEXT:    movdqa %xmm1, %xmm2
183; SSE2-NEXT:    psrad $31, %xmm2
184; SSE2-NEXT:    paddd %xmm2, %xmm1
185; SSE2-NEXT:    pxor %xmm2, %xmm1
186; SSE2-NEXT:    retq
187;
188; SSSE3-LABEL: test_abs_ge_v8i32:
189; SSSE3:       # BB#0:
190; SSSE3-NEXT:    pabsd %xmm0, %xmm0
191; SSSE3-NEXT:    pabsd %xmm1, %xmm1
192; SSSE3-NEXT:    retq
193;
194; AVX1-LABEL: test_abs_ge_v8i32:
195; AVX1:       # BB#0:
196; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
197; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
198; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
199; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
200; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
201; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
202; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
203; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
204; AVX1-NEXT:    retq
205;
206; AVX2-LABEL: test_abs_ge_v8i32:
207; AVX2:       # BB#0:
208; AVX2-NEXT:    vpabsd %ymm0, %ymm0
209; AVX2-NEXT:    retq
210;
211; AVX512-LABEL: test_abs_ge_v8i32:
212; AVX512:       # BB#0:
213; AVX512-NEXT:    vpabsd %ymm0, %ymm0
214; AVX512-NEXT:    retq
215  %tmp1neg = sub <8 x i32> zeroinitializer, %a
216  %b = icmp sge <8 x i32> %a, zeroinitializer
217  %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
218  ret <8 x i32> %abs
219}
220
221define <16 x i16> @test_abs_gt_v16i16(<16 x i16> %a) nounwind {
222; SSE2-LABEL: test_abs_gt_v16i16:
223; SSE2:       # BB#0:
224; SSE2-NEXT:    movdqa %xmm0, %xmm2
225; SSE2-NEXT:    psraw $15, %xmm2
226; SSE2-NEXT:    paddw %xmm2, %xmm0
227; SSE2-NEXT:    pxor %xmm2, %xmm0
228; SSE2-NEXT:    movdqa %xmm1, %xmm2
229; SSE2-NEXT:    psraw $15, %xmm2
230; SSE2-NEXT:    paddw %xmm2, %xmm1
231; SSE2-NEXT:    pxor %xmm2, %xmm1
232; SSE2-NEXT:    retq
233;
234; SSSE3-LABEL: test_abs_gt_v16i16:
235; SSSE3:       # BB#0:
236; SSSE3-NEXT:    pabsw %xmm0, %xmm0
237; SSSE3-NEXT:    pabsw %xmm1, %xmm1
238; SSSE3-NEXT:    retq
239;
240; AVX1-LABEL: test_abs_gt_v16i16:
241; AVX1:       # BB#0:
242; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
243; AVX1-NEXT:    vpsraw $15, %xmm1, %xmm2
244; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
245; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm3
246; AVX1-NEXT:    vpaddw %xmm3, %xmm0, %xmm0
247; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
248; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
249; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
250; AVX1-NEXT:    retq
251;
252; AVX2-LABEL: test_abs_gt_v16i16:
253; AVX2:       # BB#0:
254; AVX2-NEXT:    vpabsw %ymm0, %ymm0
255; AVX2-NEXT:    retq
256;
257; AVX512-LABEL: test_abs_gt_v16i16:
258; AVX512:       # BB#0:
259; AVX512-NEXT:    vpabsw %ymm0, %ymm0
260; AVX512-NEXT:    retq
261  %tmp1neg = sub <16 x i16> zeroinitializer, %a
262  %b = icmp sgt <16 x i16> %a, zeroinitializer
263  %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
264  ret <16 x i16> %abs
265}
266
267define <32 x i8> @test_abs_lt_v32i8(<32 x i8> %a) nounwind {
268; SSE2-LABEL: test_abs_lt_v32i8:
269; SSE2:       # BB#0:
270; SSE2-NEXT:    pxor %xmm2, %xmm2
271; SSE2-NEXT:    pxor %xmm3, %xmm3
272; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
273; SSE2-NEXT:    paddb %xmm3, %xmm0
274; SSE2-NEXT:    pxor %xmm3, %xmm0
275; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
276; SSE2-NEXT:    paddb %xmm2, %xmm1
277; SSE2-NEXT:    pxor %xmm2, %xmm1
278; SSE2-NEXT:    retq
279;
280; SSSE3-LABEL: test_abs_lt_v32i8:
281; SSSE3:       # BB#0:
282; SSSE3-NEXT:    pabsb %xmm0, %xmm0
283; SSSE3-NEXT:    pabsb %xmm1, %xmm1
284; SSSE3-NEXT:    retq
285;
286; AVX1-LABEL: test_abs_lt_v32i8:
287; AVX1:       # BB#0:
288; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
289; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
290; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm3
291; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm2
292; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm4
293; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
294; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
295; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
296; AVX1-NEXT:    vxorps %ymm4, %ymm0, %ymm0
297; AVX1-NEXT:    retq
298;
299; AVX2-LABEL: test_abs_lt_v32i8:
300; AVX2:       # BB#0:
301; AVX2-NEXT:    vpabsb %ymm0, %ymm0
302; AVX2-NEXT:    retq
303;
304; AVX512-LABEL: test_abs_lt_v32i8:
305; AVX512:       # BB#0:
306; AVX512-NEXT:    vpabsb %ymm0, %ymm0
307; AVX512-NEXT:    retq
308  %tmp1neg = sub <32 x i8> zeroinitializer, %a
309  %b = icmp slt <32 x i8> %a, zeroinitializer
310  %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
311  ret <32 x i8> %abs
312}
313
314define <8 x i32> @test_abs_le_v8i32(<8 x i32> %a) nounwind {
315; SSE2-LABEL: test_abs_le_v8i32:
316; SSE2:       # BB#0:
317; SSE2-NEXT:    movdqa %xmm0, %xmm2
318; SSE2-NEXT:    psrad $31, %xmm2
319; SSE2-NEXT:    paddd %xmm2, %xmm0
320; SSE2-NEXT:    pxor %xmm2, %xmm0
321; SSE2-NEXT:    movdqa %xmm1, %xmm2
322; SSE2-NEXT:    psrad $31, %xmm2
323; SSE2-NEXT:    paddd %xmm2, %xmm1
324; SSE2-NEXT:    pxor %xmm2, %xmm1
325; SSE2-NEXT:    retq
326;
327; SSSE3-LABEL: test_abs_le_v8i32:
328; SSSE3:       # BB#0:
329; SSSE3-NEXT:    pabsd %xmm0, %xmm0
330; SSSE3-NEXT:    pabsd %xmm1, %xmm1
331; SSSE3-NEXT:    retq
332;
333; AVX1-LABEL: test_abs_le_v8i32:
334; AVX1:       # BB#0:
335; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
336; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
337; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
338; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
339; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
340; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
341; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
342; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
343; AVX1-NEXT:    retq
344;
345; AVX2-LABEL: test_abs_le_v8i32:
346; AVX2:       # BB#0:
347; AVX2-NEXT:    vpabsd %ymm0, %ymm0
348; AVX2-NEXT:    retq
349;
350; AVX512-LABEL: test_abs_le_v8i32:
351; AVX512:       # BB#0:
352; AVX512-NEXT:    vpabsd %ymm0, %ymm0
353; AVX512-NEXT:    retq
354  %tmp1neg = sub <8 x i32> zeroinitializer, %a
355  %b = icmp sle <8 x i32> %a, zeroinitializer
356  %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
357  ret <8 x i32> %abs
358}
359
360define <16 x i32> @test_abs_le_16i32(<16 x i32> %a) nounwind {
361; SSE2-LABEL: test_abs_le_16i32:
362; SSE2:       # BB#0:
363; SSE2-NEXT:    movdqa %xmm0, %xmm4
364; SSE2-NEXT:    psrad $31, %xmm4
365; SSE2-NEXT:    paddd %xmm4, %xmm0
366; SSE2-NEXT:    pxor %xmm4, %xmm0
367; SSE2-NEXT:    movdqa %xmm1, %xmm4
368; SSE2-NEXT:    psrad $31, %xmm4
369; SSE2-NEXT:    paddd %xmm4, %xmm1
370; SSE2-NEXT:    pxor %xmm4, %xmm1
371; SSE2-NEXT:    movdqa %xmm2, %xmm4
372; SSE2-NEXT:    psrad $31, %xmm4
373; SSE2-NEXT:    paddd %xmm4, %xmm2
374; SSE2-NEXT:    pxor %xmm4, %xmm2
375; SSE2-NEXT:    movdqa %xmm3, %xmm4
376; SSE2-NEXT:    psrad $31, %xmm4
377; SSE2-NEXT:    paddd %xmm4, %xmm3
378; SSE2-NEXT:    pxor %xmm4, %xmm3
379; SSE2-NEXT:    retq
380;
381; SSSE3-LABEL: test_abs_le_16i32:
382; SSSE3:       # BB#0:
383; SSSE3-NEXT:    pabsd %xmm0, %xmm0
384; SSSE3-NEXT:    pabsd %xmm1, %xmm1
385; SSSE3-NEXT:    pabsd %xmm2, %xmm2
386; SSSE3-NEXT:    pabsd %xmm3, %xmm3
387; SSSE3-NEXT:    retq
388;
389; AVX1-LABEL: test_abs_le_16i32:
390; AVX1:       # BB#0:
391; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
392; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
393; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
394; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
395; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm0
396; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
397; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
398; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
399; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
400; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
401; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
402; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
403; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm1
404; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
405; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
406; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
407; AVX1-NEXT:    retq
408;
409; AVX2-LABEL: test_abs_le_16i32:
410; AVX2:       # BB#0:
411; AVX2-NEXT:    vpabsd %ymm0, %ymm0
412; AVX2-NEXT:    vpabsd %ymm1, %ymm1
413; AVX2-NEXT:    retq
414;
415; AVX512-LABEL: test_abs_le_16i32:
416; AVX512:       # BB#0:
417; AVX512-NEXT:    vpabsd %zmm0, %zmm0
418; AVX512-NEXT:    retq
419  %tmp1neg = sub <16 x i32> zeroinitializer, %a
420  %b = icmp sle <16 x i32> %a, zeroinitializer
421  %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a
422  ret <16 x i32> %abs
423}
424
425define <2 x i64> @test_abs_ge_v2i64(<2 x i64> %a) nounwind {
426; SSE-LABEL: test_abs_ge_v2i64:
427; SSE:       # BB#0:
428; SSE-NEXT:    movdqa %xmm0, %xmm1
429; SSE-NEXT:    psrad $31, %xmm1
430; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
431; SSE-NEXT:    paddq %xmm1, %xmm0
432; SSE-NEXT:    pxor %xmm1, %xmm0
433; SSE-NEXT:    retq
434;
435; AVX1-LABEL: test_abs_ge_v2i64:
436; AVX1:       # BB#0:
437; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1
438; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
439; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
440; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
441; AVX1-NEXT:    retq
442;
443; AVX2-LABEL: test_abs_ge_v2i64:
444; AVX2:       # BB#0:
445; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1
446; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
447; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
448; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
449; AVX2-NEXT:    retq
450;
451; AVX512-LABEL: test_abs_ge_v2i64:
452; AVX512:       # BB#0:
453; AVX512-NEXT:    vpsraq $63, %xmm0, %xmm1
454; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
455; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
456; AVX512-NEXT:    retq
457  %tmp1neg = sub <2 x i64> zeroinitializer, %a
458  %b = icmp sge <2 x i64> %a, zeroinitializer
459  %abs = select <2 x i1> %b, <2 x i64> %a, <2 x i64> %tmp1neg
460  ret <2 x i64> %abs
461}
462
463define <4 x i64> @test_abs_gt_v4i64(<4 x i64> %a) nounwind {
464; SSE-LABEL: test_abs_gt_v4i64:
465; SSE:       # BB#0:
466; SSE-NEXT:    movdqa %xmm0, %xmm2
467; SSE-NEXT:    psrad $31, %xmm2
468; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
469; SSE-NEXT:    paddq %xmm2, %xmm0
470; SSE-NEXT:    pxor %xmm2, %xmm0
471; SSE-NEXT:    movdqa %xmm1, %xmm2
472; SSE-NEXT:    psrad $31, %xmm2
473; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
474; SSE-NEXT:    paddq %xmm2, %xmm1
475; SSE-NEXT:    pxor %xmm2, %xmm1
476; SSE-NEXT:    retq
477;
478; AVX1-LABEL: test_abs_gt_v4i64:
479; AVX1:       # BB#0:
480; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
481; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
482; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
483; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm1
484; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
485; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
486; AVX1-NEXT:    vpaddq %xmm3, %xmm0, %xmm0
487; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
488; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
489; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
490; AVX1-NEXT:    retq
491;
492; AVX2-LABEL: test_abs_gt_v4i64:
493; AVX2:       # BB#0:
494; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm1
495; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
496; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
497; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
498; AVX2-NEXT:    retq
499;
500; AVX512-LABEL: test_abs_gt_v4i64:
501; AVX512:       # BB#0:
502; AVX512-NEXT:    vpsraq $63, %ymm0, %ymm1
503; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
504; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
505; AVX512-NEXT:    retq
506  %tmp1neg = sub <4 x i64> zeroinitializer, %a
507  %b = icmp sgt <4 x i64> %a, <i64 -1, i64 -1, i64 -1, i64 -1>
508  %abs = select <4 x i1> %b, <4 x i64> %a, <4 x i64> %tmp1neg
509  ret <4 x i64> %abs
510}
511
512define <8 x i64> @test_abs_le_v8i64(<8 x i64> %a) nounwind {
513; SSE-LABEL: test_abs_le_v8i64:
514; SSE:       # BB#0:
515; SSE-NEXT:    movdqa %xmm0, %xmm4
516; SSE-NEXT:    psrad $31, %xmm4
517; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
518; SSE-NEXT:    paddq %xmm4, %xmm0
519; SSE-NEXT:    pxor %xmm4, %xmm0
520; SSE-NEXT:    movdqa %xmm1, %xmm4
521; SSE-NEXT:    psrad $31, %xmm4
522; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
523; SSE-NEXT:    paddq %xmm4, %xmm1
524; SSE-NEXT:    pxor %xmm4, %xmm1
525; SSE-NEXT:    movdqa %xmm2, %xmm4
526; SSE-NEXT:    psrad $31, %xmm4
527; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
528; SSE-NEXT:    paddq %xmm4, %xmm2
529; SSE-NEXT:    pxor %xmm4, %xmm2
530; SSE-NEXT:    movdqa %xmm3, %xmm4
531; SSE-NEXT:    psrad $31, %xmm4
532; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
533; SSE-NEXT:    paddq %xmm4, %xmm3
534; SSE-NEXT:    pxor %xmm4, %xmm3
535; SSE-NEXT:    retq
536;
537; AVX1-LABEL: test_abs_le_v8i64:
538; AVX1:       # BB#0:
539; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
540; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
541; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
542; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
543; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
544; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
545; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
546; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
547; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
548; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
549; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
550; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
551; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
552; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
553; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
554; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
555; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
556; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
557; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
558; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
559; AVX1-NEXT:    retq
560;
561; AVX2-LABEL: test_abs_le_v8i64:
562; AVX2:       # BB#0:
563; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
564; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
565; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
566; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
567; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
568; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
569; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
570; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
571; AVX2-NEXT:    retq
572;
573; AVX512-LABEL: test_abs_le_v8i64:
574; AVX512:       # BB#0:
575; AVX512-NEXT:    vpabsq %zmm0, %zmm0
576; AVX512-NEXT:    retq
577  %tmp1neg = sub <8 x i64> zeroinitializer, %a
578  %b = icmp sle <8 x i64> %a, zeroinitializer
579  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
580  ret <8 x i64> %abs
581}
582
583define <8 x i64> @test_abs_le_v8i64_fold(<8 x i64>* %a.ptr) nounwind {
584; SSE-LABEL: test_abs_le_v8i64_fold:
585; SSE:       # BB#0:
586; SSE-NEXT:    movdqu (%rdi), %xmm0
587; SSE-NEXT:    movdqu 16(%rdi), %xmm1
588; SSE-NEXT:    movdqu 32(%rdi), %xmm2
589; SSE-NEXT:    movdqu 48(%rdi), %xmm3
590; SSE-NEXT:    movdqa %xmm0, %xmm4
591; SSE-NEXT:    psrad $31, %xmm4
592; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
593; SSE-NEXT:    paddq %xmm4, %xmm0
594; SSE-NEXT:    pxor %xmm4, %xmm0
595; SSE-NEXT:    movdqa %xmm1, %xmm4
596; SSE-NEXT:    psrad $31, %xmm4
597; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
598; SSE-NEXT:    paddq %xmm4, %xmm1
599; SSE-NEXT:    pxor %xmm4, %xmm1
600; SSE-NEXT:    movdqa %xmm2, %xmm4
601; SSE-NEXT:    psrad $31, %xmm4
602; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
603; SSE-NEXT:    paddq %xmm4, %xmm2
604; SSE-NEXT:    pxor %xmm4, %xmm2
605; SSE-NEXT:    movdqa %xmm3, %xmm4
606; SSE-NEXT:    psrad $31, %xmm4
607; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
608; SSE-NEXT:    paddq %xmm4, %xmm3
609; SSE-NEXT:    pxor %xmm4, %xmm3
610; SSE-NEXT:    retq
611;
612; AVX1-LABEL: test_abs_le_v8i64_fold:
613; AVX1:       # BB#0:
614; AVX1-NEXT:    vmovups (%rdi), %ymm0
615; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
616; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
617; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
618; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
619; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
620; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
621; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
622; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
623; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
624; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
625; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
626; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
627; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
628; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
629; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
630; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
631; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
632; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
633; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
634; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
635; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
636; AVX1-NEXT:    retq
637;
638; AVX2-LABEL: test_abs_le_v8i64_fold:
639; AVX2:       # BB#0:
640; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
641; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
642; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
643; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
644; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
645; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
646; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
647; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
648; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
649; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
650; AVX2-NEXT:    retq
651;
652; AVX512-LABEL: test_abs_le_v8i64_fold:
653; AVX512:       # BB#0:
654; AVX512-NEXT:    vpabsq (%rdi), %zmm0
655; AVX512-NEXT:    retq
656  %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8
657  %tmp1neg = sub <8 x i64> zeroinitializer, %a
658  %b = icmp sle <8 x i64> %a, zeroinitializer
659  %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
660  ret <8 x i64> %abs
661}
662
663define <64 x i8> @test_abs_lt_v64i8(<64 x i8> %a) nounwind {
664; SSE2-LABEL: test_abs_lt_v64i8:
665; SSE2:       # BB#0:
666; SSE2-NEXT:    pxor %xmm4, %xmm4
667; SSE2-NEXT:    pxor %xmm5, %xmm5
668; SSE2-NEXT:    pcmpgtb %xmm0, %xmm5
669; SSE2-NEXT:    paddb %xmm5, %xmm0
670; SSE2-NEXT:    pxor %xmm5, %xmm0
671; SSE2-NEXT:    pxor %xmm5, %xmm5
672; SSE2-NEXT:    pcmpgtb %xmm1, %xmm5
673; SSE2-NEXT:    paddb %xmm5, %xmm1
674; SSE2-NEXT:    pxor %xmm5, %xmm1
675; SSE2-NEXT:    pxor %xmm5, %xmm5
676; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5
677; SSE2-NEXT:    paddb %xmm5, %xmm2
678; SSE2-NEXT:    pxor %xmm5, %xmm2
679; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
680; SSE2-NEXT:    paddb %xmm4, %xmm3
681; SSE2-NEXT:    pxor %xmm4, %xmm3
682; SSE2-NEXT:    retq
683;
684; SSSE3-LABEL: test_abs_lt_v64i8:
685; SSSE3:       # BB#0:
686; SSSE3-NEXT:    pabsb %xmm0, %xmm0
687; SSSE3-NEXT:    pabsb %xmm1, %xmm1
688; SSSE3-NEXT:    pabsb %xmm2, %xmm2
689; SSSE3-NEXT:    pabsb %xmm3, %xmm3
690; SSSE3-NEXT:    retq
691;
692; AVX1-LABEL: test_abs_lt_v64i8:
693; AVX1:       # BB#0:
694; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
695; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
696; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm3, %xmm4
697; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm3, %xmm5
698; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm6
699; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2
700; AVX1-NEXT:    vpaddb %xmm5, %xmm0, %xmm0
701; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
702; AVX1-NEXT:    vxorps %ymm6, %ymm0, %ymm0
703; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
704; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm3, %xmm4
705; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm3, %xmm3
706; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm5
707; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2
708; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
709; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
710; AVX1-NEXT:    vxorps %ymm5, %ymm1, %ymm1
711; AVX1-NEXT:    retq
712;
713; AVX2-LABEL: test_abs_lt_v64i8:
714; AVX2:       # BB#0:
715; AVX2-NEXT:    vpabsb %ymm0, %ymm0
716; AVX2-NEXT:    vpabsb %ymm1, %ymm1
717; AVX2-NEXT:    retq
718;
719; AVX512F-LABEL: test_abs_lt_v64i8:
720; AVX512F:       # BB#0:
721; AVX512F-NEXT:    vpabsb %ymm0, %ymm0
722; AVX512F-NEXT:    vpabsb %ymm1, %ymm1
723; AVX512F-NEXT:    retq
724;
725; AVX512BW-LABEL: test_abs_lt_v64i8:
726; AVX512BW:       # BB#0:
727; AVX512BW-NEXT:    vpabsb %zmm0, %zmm0
728; AVX512BW-NEXT:    retq
729  %tmp1neg = sub <64 x i8> zeroinitializer, %a
730  %b = icmp slt <64 x i8> %a, zeroinitializer
731  %abs = select <64 x i1> %b, <64 x i8> %tmp1neg, <64 x i8> %a
732  ret <64 x i8> %abs
733}
734
735define <32 x i16> @test_abs_gt_v32i16(<32 x i16> %a) nounwind {
736; SSE2-LABEL: test_abs_gt_v32i16:
737; SSE2:       # BB#0:
738; SSE2-NEXT:    movdqa %xmm0, %xmm4
739; SSE2-NEXT:    psraw $15, %xmm4
740; SSE2-NEXT:    paddw %xmm4, %xmm0
741; SSE2-NEXT:    pxor %xmm4, %xmm0
742; SSE2-NEXT:    movdqa %xmm1, %xmm4
743; SSE2-NEXT:    psraw $15, %xmm4
744; SSE2-NEXT:    paddw %xmm4, %xmm1
745; SSE2-NEXT:    pxor %xmm4, %xmm1
746; SSE2-NEXT:    movdqa %xmm2, %xmm4
747; SSE2-NEXT:    psraw $15, %xmm4
748; SSE2-NEXT:    paddw %xmm4, %xmm2
749; SSE2-NEXT:    pxor %xmm4, %xmm2
750; SSE2-NEXT:    movdqa %xmm3, %xmm4
751; SSE2-NEXT:    psraw $15, %xmm4
752; SSE2-NEXT:    paddw %xmm4, %xmm3
753; SSE2-NEXT:    pxor %xmm4, %xmm3
754; SSE2-NEXT:    retq
755;
756; SSSE3-LABEL: test_abs_gt_v32i16:
757; SSSE3:       # BB#0:
758; SSSE3-NEXT:    pabsw %xmm0, %xmm0
759; SSSE3-NEXT:    pabsw %xmm1, %xmm1
760; SSSE3-NEXT:    pabsw %xmm2, %xmm2
761; SSSE3-NEXT:    pabsw %xmm3, %xmm3
762; SSSE3-NEXT:    retq
763;
764; AVX1-LABEL: test_abs_gt_v32i16:
765; AVX1:       # BB#0:
766; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
767; AVX1-NEXT:    vpsraw $15, %xmm2, %xmm3
768; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
769; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm4
770; AVX1-NEXT:    vpaddw %xmm4, %xmm0, %xmm0
771; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
772; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
773; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
774; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
775; AVX1-NEXT:    vpsraw $15, %xmm2, %xmm3
776; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
777; AVX1-NEXT:    vpsraw $15, %xmm1, %xmm4
778; AVX1-NEXT:    vpaddw %xmm4, %xmm1, %xmm1
779; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
780; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
781; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
782; AVX1-NEXT:    retq
783;
784; AVX2-LABEL: test_abs_gt_v32i16:
785; AVX2:       # BB#0:
786; AVX2-NEXT:    vpabsw %ymm0, %ymm0
787; AVX2-NEXT:    vpabsw %ymm1, %ymm1
788; AVX2-NEXT:    retq
789;
790; AVX512F-LABEL: test_abs_gt_v32i16:
791; AVX512F:       # BB#0:
792; AVX512F-NEXT:    vpabsw %ymm0, %ymm0
793; AVX512F-NEXT:    vpabsw %ymm1, %ymm1
794; AVX512F-NEXT:    retq
795;
796; AVX512BW-LABEL: test_abs_gt_v32i16:
797; AVX512BW:       # BB#0:
798; AVX512BW-NEXT:    vpabsw %zmm0, %zmm0
799; AVX512BW-NEXT:    retq
800  %tmp1neg = sub <32 x i16> zeroinitializer, %a
801  %b = icmp sgt <32 x i16> %a, zeroinitializer
802  %abs = select <32 x i1> %b, <32 x i16> %a, <32 x i16> %tmp1neg
803  ret <32 x i16> %abs
804}
805