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