Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / abds-vector-128.ll
blob3143bf6190657c3de3042345dbff928499441849
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-linux                  | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse4.2   | FileCheck %s --check-prefixes=SSE,SSE42
4 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx2     | FileCheck %s --check-prefixes=AVX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512
9 ; trunc(abs(sub(sext(a),sext(b)))) -> abds(a,b)
12 define <16 x i8> @abd_ext_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
13 ; SSE2-LABEL: abd_ext_v16i8:
14 ; SSE2:       # %bb.0:
15 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
16 ; SSE2-NEXT:    psubb %xmm0, %xmm2
17 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
18 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
19 ; SSE2-NEXT:    psubb %xmm1, %xmm0
20 ; SSE2-NEXT:    pand %xmm3, %xmm0
21 ; SSE2-NEXT:    pandn %xmm2, %xmm3
22 ; SSE2-NEXT:    por %xmm3, %xmm0
23 ; SSE2-NEXT:    retq
25 ; SSE42-LABEL: abd_ext_v16i8:
26 ; SSE42:       # %bb.0:
27 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
28 ; SSE42-NEXT:    pminsb %xmm1, %xmm2
29 ; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
30 ; SSE42-NEXT:    psubb %xmm2, %xmm0
31 ; SSE42-NEXT:    retq
33 ; AVX-LABEL: abd_ext_v16i8:
34 ; AVX:       # %bb.0:
35 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
36 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
37 ; AVX-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
38 ; AVX-NEXT:    retq
39   %aext = sext <16 x i8> %a to <16 x i64>
40   %bext = sext <16 x i8> %b to <16 x i64>
41   %sub = sub <16 x i64> %aext, %bext
42   %abs = call <16 x i64> @llvm.abs.v16i64(<16 x i64> %sub, i1 false)
43   %trunc = trunc <16 x i64> %abs to <16 x i8>
44   ret <16 x i8> %trunc
47 define <16 x i8> @abd_ext_v16i8_undef(<16 x i8> %a, <16 x i8> %b) nounwind {
48 ; SSE2-LABEL: abd_ext_v16i8_undef:
49 ; SSE2:       # %bb.0:
50 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
51 ; SSE2-NEXT:    psubb %xmm0, %xmm2
52 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
53 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
54 ; SSE2-NEXT:    psubb %xmm1, %xmm0
55 ; SSE2-NEXT:    pand %xmm3, %xmm0
56 ; SSE2-NEXT:    pandn %xmm2, %xmm3
57 ; SSE2-NEXT:    por %xmm3, %xmm0
58 ; SSE2-NEXT:    retq
60 ; SSE42-LABEL: abd_ext_v16i8_undef:
61 ; SSE42:       # %bb.0:
62 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
63 ; SSE42-NEXT:    pminsb %xmm1, %xmm2
64 ; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
65 ; SSE42-NEXT:    psubb %xmm2, %xmm0
66 ; SSE42-NEXT:    retq
68 ; AVX-LABEL: abd_ext_v16i8_undef:
69 ; AVX:       # %bb.0:
70 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
71 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
72 ; AVX-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
73 ; AVX-NEXT:    retq
74   %aext = sext <16 x i8> %a to <16 x i64>
75   %bext = sext <16 x i8> %b to <16 x i64>
76   %sub = sub <16 x i64> %aext, %bext
77   %abs = call <16 x i64> @llvm.abs.v16i64(<16 x i64> %sub, i1 true)
78   %trunc = trunc <16 x i64> %abs to <16 x i8>
79   ret <16 x i8> %trunc
82 define <8 x i16> @abd_ext_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
83 ; SSE-LABEL: abd_ext_v8i16:
84 ; SSE:       # %bb.0:
85 ; SSE-NEXT:    movdqa %xmm0, %xmm2
86 ; SSE-NEXT:    pminsw %xmm1, %xmm2
87 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
88 ; SSE-NEXT:    psubw %xmm2, %xmm0
89 ; SSE-NEXT:    retq
91 ; AVX-LABEL: abd_ext_v8i16:
92 ; AVX:       # %bb.0:
93 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
94 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
95 ; AVX-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
96 ; AVX-NEXT:    retq
97   %aext = sext <8 x i16> %a to <8 x i64>
98   %bext = sext <8 x i16> %b to <8 x i64>
99   %sub = sub <8 x i64> %aext, %bext
100   %abs = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %sub, i1 false)
101   %trunc = trunc <8 x i64> %abs to <8 x i16>
102   ret <8 x i16> %trunc
105 define <8 x i16> @abd_ext_v8i16_undef(<8 x i16> %a, <8 x i16> %b) nounwind {
106 ; SSE-LABEL: abd_ext_v8i16_undef:
107 ; SSE:       # %bb.0:
108 ; SSE-NEXT:    movdqa %xmm0, %xmm2
109 ; SSE-NEXT:    pminsw %xmm1, %xmm2
110 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
111 ; SSE-NEXT:    psubw %xmm2, %xmm0
112 ; SSE-NEXT:    retq
114 ; AVX-LABEL: abd_ext_v8i16_undef:
115 ; AVX:       # %bb.0:
116 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
117 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
118 ; AVX-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
119 ; AVX-NEXT:    retq
120   %aext = sext <8 x i16> %a to <8 x i64>
121   %bext = sext <8 x i16> %b to <8 x i64>
122   %sub = sub <8 x i64> %aext, %bext
123   %abs = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %sub, i1 true)
124   %trunc = trunc <8 x i64> %abs to <8 x i16>
125   ret <8 x i16> %trunc
128 define <4 x i32> @abd_ext_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
129 ; SSE2-LABEL: abd_ext_v4i32:
130 ; SSE2:       # %bb.0:
131 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
132 ; SSE2-NEXT:    psubd %xmm0, %xmm2
133 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
134 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
135 ; SSE2-NEXT:    psubd %xmm1, %xmm0
136 ; SSE2-NEXT:    pand %xmm3, %xmm0
137 ; SSE2-NEXT:    pandn %xmm2, %xmm3
138 ; SSE2-NEXT:    por %xmm3, %xmm0
139 ; SSE2-NEXT:    retq
141 ; SSE42-LABEL: abd_ext_v4i32:
142 ; SSE42:       # %bb.0:
143 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
144 ; SSE42-NEXT:    pminsd %xmm1, %xmm2
145 ; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
146 ; SSE42-NEXT:    psubd %xmm2, %xmm0
147 ; SSE42-NEXT:    retq
149 ; AVX-LABEL: abd_ext_v4i32:
150 ; AVX:       # %bb.0:
151 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
152 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
153 ; AVX-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
154 ; AVX-NEXT:    retq
155   %aext = sext <4 x i32> %a to <4 x i64>
156   %bext = sext <4 x i32> %b to <4 x i64>
157   %sub = sub <4 x i64> %aext, %bext
158   %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %sub, i1 false)
159   %trunc = trunc <4 x i64> %abs to <4 x i32>
160   ret <4 x i32> %trunc
163 define <4 x i32> @abd_ext_v4i32_undef(<4 x i32> %a, <4 x i32> %b) nounwind {
164 ; SSE2-LABEL: abd_ext_v4i32_undef:
165 ; SSE2:       # %bb.0:
166 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
167 ; SSE2-NEXT:    psubd %xmm0, %xmm2
168 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
169 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
170 ; SSE2-NEXT:    psubd %xmm1, %xmm0
171 ; SSE2-NEXT:    pand %xmm3, %xmm0
172 ; SSE2-NEXT:    pandn %xmm2, %xmm3
173 ; SSE2-NEXT:    por %xmm3, %xmm0
174 ; SSE2-NEXT:    retq
176 ; SSE42-LABEL: abd_ext_v4i32_undef:
177 ; SSE42:       # %bb.0:
178 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
179 ; SSE42-NEXT:    pminsd %xmm1, %xmm2
180 ; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
181 ; SSE42-NEXT:    psubd %xmm2, %xmm0
182 ; SSE42-NEXT:    retq
184 ; AVX-LABEL: abd_ext_v4i32_undef:
185 ; AVX:       # %bb.0:
186 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
187 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
188 ; AVX-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
189 ; AVX-NEXT:    retq
190   %aext = sext <4 x i32> %a to <4 x i64>
191   %bext = sext <4 x i32> %b to <4 x i64>
192   %sub = sub <4 x i64> %aext, %bext
193   %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %sub, i1 true)
194   %trunc = trunc <4 x i64> %abs to <4 x i32>
195   ret <4 x i32> %trunc
198 define <2 x i64> @abd_ext_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
199 ; SSE2-LABEL: abd_ext_v2i64:
200 ; SSE2:       # %bb.0:
201 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
202 ; SSE2-NEXT:    movq %xmm2, %rax
203 ; SSE2-NEXT:    movq %rax, %rcx
204 ; SSE2-NEXT:    sarq $63, %rcx
205 ; SSE2-NEXT:    movq %xmm0, %rdx
206 ; SSE2-NEXT:    movq %rdx, %rsi
207 ; SSE2-NEXT:    sarq $63, %rsi
208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
209 ; SSE2-NEXT:    movq %xmm0, %rdi
210 ; SSE2-NEXT:    movq %rdi, %r8
211 ; SSE2-NEXT:    sarq $63, %r8
212 ; SSE2-NEXT:    movq %xmm1, %r9
213 ; SSE2-NEXT:    movq %r9, %r10
214 ; SSE2-NEXT:    sarq $63, %r10
215 ; SSE2-NEXT:    subq %r9, %rdx
216 ; SSE2-NEXT:    sbbq %r10, %rsi
217 ; SSE2-NEXT:    subq %rdi, %rax
218 ; SSE2-NEXT:    sbbq %r8, %rcx
219 ; SSE2-NEXT:    sarq $63, %rcx
220 ; SSE2-NEXT:    xorq %rcx, %rax
221 ; SSE2-NEXT:    subq %rcx, %rax
222 ; SSE2-NEXT:    sarq $63, %rsi
223 ; SSE2-NEXT:    xorq %rsi, %rdx
224 ; SSE2-NEXT:    subq %rsi, %rdx
225 ; SSE2-NEXT:    movq %rdx, %xmm0
226 ; SSE2-NEXT:    movq %rax, %xmm1
227 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
228 ; SSE2-NEXT:    retq
230 ; SSE42-LABEL: abd_ext_v2i64:
231 ; SSE42:       # %bb.0:
232 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
233 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2
234 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
235 ; SSE42-NEXT:    psubq %xmm1, %xmm3
236 ; SSE42-NEXT:    psubq %xmm0, %xmm1
237 ; SSE42-NEXT:    movdqa %xmm2, %xmm0
238 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
239 ; SSE42-NEXT:    movapd %xmm1, %xmm0
240 ; SSE42-NEXT:    retq
242 ; AVX1-LABEL: abd_ext_v2i64:
243 ; AVX1:       # %bb.0:
244 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
245 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
246 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
247 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
248 ; AVX1-NEXT:    retq
250 ; AVX2-LABEL: abd_ext_v2i64:
251 ; AVX2:       # %bb.0:
252 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
253 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
254 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
255 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
256 ; AVX2-NEXT:    retq
258 ; AVX512-LABEL: abd_ext_v2i64:
259 ; AVX512:       # %bb.0:
260 ; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
261 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
262 ; AVX512-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
263 ; AVX512-NEXT:    retq
264   %aext = sext <2 x i64> %a to <2 x i128>
265   %bext = sext <2 x i64> %b to <2 x i128>
266   %sub = sub <2 x i128> %aext, %bext
267   %abs = call <2 x i128> @llvm.abs.v2i128(<2 x i128> %sub, i1 false)
268   %trunc = trunc <2 x i128> %abs to <2 x i64>
269   ret <2 x i64> %trunc
272 define <2 x i64> @abd_ext_v2i64_undef(<2 x i64> %a, <2 x i64> %b) nounwind {
273 ; SSE2-LABEL: abd_ext_v2i64_undef:
274 ; SSE2:       # %bb.0:
275 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
276 ; SSE2-NEXT:    movq %xmm2, %rax
277 ; SSE2-NEXT:    movq %rax, %rcx
278 ; SSE2-NEXT:    sarq $63, %rcx
279 ; SSE2-NEXT:    movq %xmm0, %rdx
280 ; SSE2-NEXT:    movq %rdx, %rsi
281 ; SSE2-NEXT:    sarq $63, %rsi
282 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
283 ; SSE2-NEXT:    movq %xmm0, %rdi
284 ; SSE2-NEXT:    movq %rdi, %r8
285 ; SSE2-NEXT:    sarq $63, %r8
286 ; SSE2-NEXT:    movq %xmm1, %r9
287 ; SSE2-NEXT:    movq %r9, %r10
288 ; SSE2-NEXT:    sarq $63, %r10
289 ; SSE2-NEXT:    subq %r9, %rdx
290 ; SSE2-NEXT:    sbbq %r10, %rsi
291 ; SSE2-NEXT:    subq %rdi, %rax
292 ; SSE2-NEXT:    sbbq %r8, %rcx
293 ; SSE2-NEXT:    sarq $63, %rcx
294 ; SSE2-NEXT:    xorq %rcx, %rax
295 ; SSE2-NEXT:    subq %rcx, %rax
296 ; SSE2-NEXT:    sarq $63, %rsi
297 ; SSE2-NEXT:    xorq %rsi, %rdx
298 ; SSE2-NEXT:    subq %rsi, %rdx
299 ; SSE2-NEXT:    movq %rdx, %xmm0
300 ; SSE2-NEXT:    movq %rax, %xmm1
301 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
302 ; SSE2-NEXT:    retq
304 ; SSE42-LABEL: abd_ext_v2i64_undef:
305 ; SSE42:       # %bb.0:
306 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
307 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2
308 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
309 ; SSE42-NEXT:    psubq %xmm1, %xmm3
310 ; SSE42-NEXT:    psubq %xmm0, %xmm1
311 ; SSE42-NEXT:    movdqa %xmm2, %xmm0
312 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
313 ; SSE42-NEXT:    movapd %xmm1, %xmm0
314 ; SSE42-NEXT:    retq
316 ; AVX1-LABEL: abd_ext_v2i64_undef:
317 ; AVX1:       # %bb.0:
318 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
319 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
320 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
321 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
322 ; AVX1-NEXT:    retq
324 ; AVX2-LABEL: abd_ext_v2i64_undef:
325 ; AVX2:       # %bb.0:
326 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
327 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
328 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
329 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
330 ; AVX2-NEXT:    retq
332 ; AVX512-LABEL: abd_ext_v2i64_undef:
333 ; AVX512:       # %bb.0:
334 ; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
335 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
336 ; AVX512-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
337 ; AVX512-NEXT:    retq
338   %aext = sext <2 x i64> %a to <2 x i128>
339   %bext = sext <2 x i64> %b to <2 x i128>
340   %sub = sub <2 x i128> %aext, %bext
341   %abs = call <2 x i128> @llvm.abs.v2i128(<2 x i128> %sub, i1 true)
342   %trunc = trunc <2 x i128> %abs to <2 x i64>
343   ret <2 x i64> %trunc
347 ; sub(smax(a,b),smin(a,b)) -> abds(a,b)
350 define <16 x i8> @abd_minmax_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
351 ; SSE2-LABEL: abd_minmax_v16i8:
352 ; SSE2:       # %bb.0:
353 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
354 ; SSE2-NEXT:    psubb %xmm0, %xmm2
355 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
356 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
357 ; SSE2-NEXT:    psubb %xmm1, %xmm0
358 ; SSE2-NEXT:    pand %xmm3, %xmm0
359 ; SSE2-NEXT:    pandn %xmm2, %xmm3
360 ; SSE2-NEXT:    por %xmm3, %xmm0
361 ; SSE2-NEXT:    retq
363 ; SSE42-LABEL: abd_minmax_v16i8:
364 ; SSE42:       # %bb.0:
365 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
366 ; SSE42-NEXT:    pminsb %xmm1, %xmm2
367 ; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
368 ; SSE42-NEXT:    psubb %xmm2, %xmm0
369 ; SSE42-NEXT:    retq
371 ; AVX-LABEL: abd_minmax_v16i8:
372 ; AVX:       # %bb.0:
373 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
374 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
375 ; AVX-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
376 ; AVX-NEXT:    retq
377   %min = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b)
378   %max = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b)
379   %sub = sub <16 x i8> %max, %min
380   ret <16 x i8> %sub
383 define <8 x i16> @abd_minmax_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
384 ; SSE-LABEL: abd_minmax_v8i16:
385 ; SSE:       # %bb.0:
386 ; SSE-NEXT:    movdqa %xmm0, %xmm2
387 ; SSE-NEXT:    pminsw %xmm1, %xmm2
388 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
389 ; SSE-NEXT:    psubw %xmm2, %xmm0
390 ; SSE-NEXT:    retq
392 ; AVX-LABEL: abd_minmax_v8i16:
393 ; AVX:       # %bb.0:
394 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
395 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
396 ; AVX-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
397 ; AVX-NEXT:    retq
398   %min = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b)
399   %max = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b)
400   %sub = sub <8 x i16> %max, %min
401   ret <8 x i16> %sub
404 define <4 x i32> @abd_minmax_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
405 ; SSE2-LABEL: abd_minmax_v4i32:
406 ; SSE2:       # %bb.0:
407 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
408 ; SSE2-NEXT:    psubd %xmm0, %xmm2
409 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
410 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
411 ; SSE2-NEXT:    psubd %xmm1, %xmm0
412 ; SSE2-NEXT:    pand %xmm3, %xmm0
413 ; SSE2-NEXT:    pandn %xmm2, %xmm3
414 ; SSE2-NEXT:    por %xmm3, %xmm0
415 ; SSE2-NEXT:    retq
417 ; SSE42-LABEL: abd_minmax_v4i32:
418 ; SSE42:       # %bb.0:
419 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
420 ; SSE42-NEXT:    pminsd %xmm1, %xmm2
421 ; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
422 ; SSE42-NEXT:    psubd %xmm2, %xmm0
423 ; SSE42-NEXT:    retq
425 ; AVX-LABEL: abd_minmax_v4i32:
426 ; AVX:       # %bb.0:
427 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
428 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
429 ; AVX-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
430 ; AVX-NEXT:    retq
431   %min = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)
432   %max = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b)
433   %sub = sub <4 x i32> %max, %min
434   ret <4 x i32> %sub
437 define <2 x i64> @abd_minmax_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
438 ; SSE2-LABEL: abd_minmax_v2i64:
439 ; SSE2:       # %bb.0:
440 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
441 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
442 ; SSE2-NEXT:    pxor %xmm2, %xmm3
443 ; SSE2-NEXT:    pxor %xmm0, %xmm2
444 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
445 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
446 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
447 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
448 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
449 ; SSE2-NEXT:    pand %xmm5, %xmm2
450 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
451 ; SSE2-NEXT:    por %xmm2, %xmm3
452 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
453 ; SSE2-NEXT:    pandn %xmm0, %xmm2
454 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
455 ; SSE2-NEXT:    pandn %xmm1, %xmm4
456 ; SSE2-NEXT:    pand %xmm3, %xmm1
457 ; SSE2-NEXT:    por %xmm2, %xmm1
458 ; SSE2-NEXT:    pand %xmm3, %xmm0
459 ; SSE2-NEXT:    por %xmm4, %xmm0
460 ; SSE2-NEXT:    psubq %xmm1, %xmm0
461 ; SSE2-NEXT:    retq
463 ; SSE42-LABEL: abd_minmax_v2i64:
464 ; SSE42:       # %bb.0:
465 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
466 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2
467 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
468 ; SSE42-NEXT:    psubq %xmm1, %xmm3
469 ; SSE42-NEXT:    psubq %xmm0, %xmm1
470 ; SSE42-NEXT:    movdqa %xmm2, %xmm0
471 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
472 ; SSE42-NEXT:    movapd %xmm1, %xmm0
473 ; SSE42-NEXT:    retq
475 ; AVX1-LABEL: abd_minmax_v2i64:
476 ; AVX1:       # %bb.0:
477 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
478 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
479 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
480 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
481 ; AVX1-NEXT:    retq
483 ; AVX2-LABEL: abd_minmax_v2i64:
484 ; AVX2:       # %bb.0:
485 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
486 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
487 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
488 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
489 ; AVX2-NEXT:    retq
491 ; AVX512-LABEL: abd_minmax_v2i64:
492 ; AVX512:       # %bb.0:
493 ; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
494 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
495 ; AVX512-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
496 ; AVX512-NEXT:    retq
497   %min = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b)
498   %max = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b)
499   %sub = sub <2 x i64> %max, %min
500   ret <2 x i64> %sub
504 ; select(icmp(a,b),sub(a,b),sub(b,a)) -> abds(a,b)
507 define <16 x i8> @abd_cmp_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
508 ; SSE2-LABEL: abd_cmp_v16i8:
509 ; SSE2:       # %bb.0:
510 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
511 ; SSE2-NEXT:    psubb %xmm0, %xmm2
512 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
513 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
514 ; SSE2-NEXT:    psubb %xmm1, %xmm0
515 ; SSE2-NEXT:    pand %xmm3, %xmm0
516 ; SSE2-NEXT:    pandn %xmm2, %xmm3
517 ; SSE2-NEXT:    por %xmm3, %xmm0
518 ; SSE2-NEXT:    retq
520 ; SSE42-LABEL: abd_cmp_v16i8:
521 ; SSE42:       # %bb.0:
522 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
523 ; SSE42-NEXT:    pminsb %xmm1, %xmm2
524 ; SSE42-NEXT:    pmaxsb %xmm1, %xmm0
525 ; SSE42-NEXT:    psubb %xmm2, %xmm0
526 ; SSE42-NEXT:    retq
528 ; AVX-LABEL: abd_cmp_v16i8:
529 ; AVX:       # %bb.0:
530 ; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
531 ; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
532 ; AVX-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
533 ; AVX-NEXT:    retq
534   %cmp = icmp sgt <16 x i8> %a, %b
535   %ab = sub <16 x i8> %a, %b
536   %ba = sub <16 x i8> %b, %a
537   %sel = select <16 x i1> %cmp, <16 x i8> %ab, <16 x i8> %ba
538   ret <16 x i8> %sel
541 define <8 x i16> @abd_cmp_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
542 ; SSE-LABEL: abd_cmp_v8i16:
543 ; SSE:       # %bb.0:
544 ; SSE-NEXT:    movdqa %xmm0, %xmm2
545 ; SSE-NEXT:    pminsw %xmm1, %xmm2
546 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
547 ; SSE-NEXT:    psubw %xmm2, %xmm0
548 ; SSE-NEXT:    retq
550 ; AVX-LABEL: abd_cmp_v8i16:
551 ; AVX:       # %bb.0:
552 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
553 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
554 ; AVX-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
555 ; AVX-NEXT:    retq
556   %cmp = icmp sge <8 x i16> %a, %b
557   %ab = sub <8 x i16> %a, %b
558   %ba = sub <8 x i16> %b, %a
559   %sel = select <8 x i1> %cmp, <8 x i16> %ab, <8 x i16> %ba
560   ret <8 x i16> %sel
563 define <4 x i32> @abd_cmp_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
564 ; SSE2-LABEL: abd_cmp_v4i32:
565 ; SSE2:       # %bb.0:
566 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
567 ; SSE2-NEXT:    psubd %xmm0, %xmm2
568 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
569 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
570 ; SSE2-NEXT:    psubd %xmm1, %xmm0
571 ; SSE2-NEXT:    pand %xmm3, %xmm0
572 ; SSE2-NEXT:    pandn %xmm2, %xmm3
573 ; SSE2-NEXT:    por %xmm3, %xmm0
574 ; SSE2-NEXT:    retq
576 ; SSE42-LABEL: abd_cmp_v4i32:
577 ; SSE42:       # %bb.0:
578 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
579 ; SSE42-NEXT:    pminsd %xmm1, %xmm2
580 ; SSE42-NEXT:    pmaxsd %xmm1, %xmm0
581 ; SSE42-NEXT:    psubd %xmm2, %xmm0
582 ; SSE42-NEXT:    retq
584 ; AVX-LABEL: abd_cmp_v4i32:
585 ; AVX:       # %bb.0:
586 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
587 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
588 ; AVX-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
589 ; AVX-NEXT:    retq
590   %cmp = icmp slt <4 x i32> %a, %b
591   %ab = sub <4 x i32> %a, %b
592   %ba = sub <4 x i32> %b, %a
593   %sel = select <4 x i1> %cmp, <4 x i32> %ba, <4 x i32> %ab
594   ret <4 x i32> %sel
597 define <2 x i64> @abd_cmp_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
598 ; SSE2-LABEL: abd_cmp_v2i64:
599 ; SSE2:       # %bb.0:
600 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
601 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
602 ; SSE2-NEXT:    pxor %xmm2, %xmm3
603 ; SSE2-NEXT:    pxor %xmm1, %xmm2
604 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
605 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
606 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
607 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
608 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
609 ; SSE2-NEXT:    pand %xmm5, %xmm3
610 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
611 ; SSE2-NEXT:    por %xmm3, %xmm2
612 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
613 ; SSE2-NEXT:    psubq %xmm1, %xmm3
614 ; SSE2-NEXT:    psubq %xmm0, %xmm1
615 ; SSE2-NEXT:    pand %xmm2, %xmm1
616 ; SSE2-NEXT:    pandn %xmm3, %xmm2
617 ; SSE2-NEXT:    por %xmm1, %xmm2
618 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
619 ; SSE2-NEXT:    retq
621 ; SSE42-LABEL: abd_cmp_v2i64:
622 ; SSE42:       # %bb.0:
623 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
624 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2
625 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
626 ; SSE42-NEXT:    psubq %xmm1, %xmm3
627 ; SSE42-NEXT:    psubq %xmm0, %xmm1
628 ; SSE42-NEXT:    movdqa %xmm2, %xmm0
629 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
630 ; SSE42-NEXT:    movapd %xmm1, %xmm0
631 ; SSE42-NEXT:    retq
633 ; AVX1-LABEL: abd_cmp_v2i64:
634 ; AVX1:       # %bb.0:
635 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
636 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
637 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
638 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
639 ; AVX1-NEXT:    retq
641 ; AVX2-LABEL: abd_cmp_v2i64:
642 ; AVX2:       # %bb.0:
643 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
644 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
645 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm0
646 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm3, %xmm0, %xmm0
647 ; AVX2-NEXT:    retq
649 ; AVX512-LABEL: abd_cmp_v2i64:
650 ; AVX512:       # %bb.0:
651 ; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
652 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
653 ; AVX512-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
654 ; AVX512-NEXT:    retq
655   %cmp = icmp sge <2 x i64> %a, %b
656   %ab = sub <2 x i64> %a, %b
657   %ba = sub <2 x i64> %b, %a
658   %sel = select <2 x i1> %cmp, <2 x i64> %ab, <2 x i64> %ba
659   ret <2 x i64> %sel
663 ; abs(sub_nsw(x, y)) -> abds(a,b)
666 define <16 x i8> @abd_subnsw_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
667 ; SSE2-LABEL: abd_subnsw_v16i8:
668 ; SSE2:       # %bb.0:
669 ; SSE2-NEXT:    psubb %xmm1, %xmm0
670 ; SSE2-NEXT:    pxor %xmm1, %xmm1
671 ; SSE2-NEXT:    psubb %xmm0, %xmm1
672 ; SSE2-NEXT:    pminub %xmm1, %xmm0
673 ; SSE2-NEXT:    retq
675 ; SSE42-LABEL: abd_subnsw_v16i8:
676 ; SSE42:       # %bb.0:
677 ; SSE42-NEXT:    psubb %xmm1, %xmm0
678 ; SSE42-NEXT:    pabsb %xmm0, %xmm0
679 ; SSE42-NEXT:    retq
681 ; AVX-LABEL: abd_subnsw_v16i8:
682 ; AVX:       # %bb.0:
683 ; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
684 ; AVX-NEXT:    vpabsb %xmm0, %xmm0
685 ; AVX-NEXT:    retq
686   %sub = sub nsw <16 x i8> %a, %b
687   %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 false)
688   ret <16 x i8> %abs
691 define <8 x i16> @abd_subnsw_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
692 ; SSE2-LABEL: abd_subnsw_v8i16:
693 ; SSE2:       # %bb.0:
694 ; SSE2-NEXT:    psubw %xmm1, %xmm0
695 ; SSE2-NEXT:    pxor %xmm1, %xmm1
696 ; SSE2-NEXT:    psubw %xmm0, %xmm1
697 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
698 ; SSE2-NEXT:    retq
700 ; SSE42-LABEL: abd_subnsw_v8i16:
701 ; SSE42:       # %bb.0:
702 ; SSE42-NEXT:    psubw %xmm1, %xmm0
703 ; SSE42-NEXT:    pabsw %xmm0, %xmm0
704 ; SSE42-NEXT:    retq
706 ; AVX-LABEL: abd_subnsw_v8i16:
707 ; AVX:       # %bb.0:
708 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
709 ; AVX-NEXT:    vpabsw %xmm0, %xmm0
710 ; AVX-NEXT:    retq
711   %sub = sub nsw <8 x i16> %a, %b
712   %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 false)
713   ret <8 x i16> %abs
716 define <4 x i32> @abd_subnsw_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
717 ; SSE2-LABEL: abd_subnsw_v4i32:
718 ; SSE2:       # %bb.0:
719 ; SSE2-NEXT:    psubd %xmm1, %xmm0
720 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
721 ; SSE2-NEXT:    psrad $31, %xmm1
722 ; SSE2-NEXT:    pxor %xmm1, %xmm0
723 ; SSE2-NEXT:    psubd %xmm1, %xmm0
724 ; SSE2-NEXT:    retq
726 ; SSE42-LABEL: abd_subnsw_v4i32:
727 ; SSE42:       # %bb.0:
728 ; SSE42-NEXT:    psubd %xmm1, %xmm0
729 ; SSE42-NEXT:    pabsd %xmm0, %xmm0
730 ; SSE42-NEXT:    retq
732 ; AVX-LABEL: abd_subnsw_v4i32:
733 ; AVX:       # %bb.0:
734 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
735 ; AVX-NEXT:    vpabsd %xmm0, %xmm0
736 ; AVX-NEXT:    retq
737   %sub = sub nsw <4 x i32> %a, %b
738   %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 false)
739   ret <4 x i32> %abs
742 define <2 x i64> @abd_subnsw_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
743 ; SSE2-LABEL: abd_subnsw_v2i64:
744 ; SSE2:       # %bb.0:
745 ; SSE2-NEXT:    psubq %xmm1, %xmm0
746 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
747 ; SSE2-NEXT:    psrad $31, %xmm1
748 ; SSE2-NEXT:    pxor %xmm1, %xmm0
749 ; SSE2-NEXT:    psubq %xmm1, %xmm0
750 ; SSE2-NEXT:    retq
752 ; SSE42-LABEL: abd_subnsw_v2i64:
753 ; SSE42:       # %bb.0:
754 ; SSE42-NEXT:    psubq %xmm1, %xmm0
755 ; SSE42-NEXT:    pxor %xmm1, %xmm1
756 ; SSE42-NEXT:    psubq %xmm0, %xmm1
757 ; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm0
758 ; SSE42-NEXT:    retq
760 ; AVX1-LABEL: abd_subnsw_v2i64:
761 ; AVX1:       # %bb.0:
762 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
763 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
764 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
765 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
766 ; AVX1-NEXT:    retq
768 ; AVX2-LABEL: abd_subnsw_v2i64:
769 ; AVX2:       # %bb.0:
770 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
771 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
772 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
773 ; AVX2-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm0
774 ; AVX2-NEXT:    retq
776 ; AVX512-LABEL: abd_subnsw_v2i64:
777 ; AVX512:       # %bb.0:
778 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
779 ; AVX512-NEXT:    vpabsq %xmm0, %xmm0
780 ; AVX512-NEXT:    retq
781   %sub = sub nsw <2 x i64> %a, %b
782   %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 false)
783   ret <2 x i64> %abs
787 ; Special cases
790 define <2 x i64> @abd_cmp_v2i64_multiuse_cmp(<2 x i64> %a, <2 x i64> %b) nounwind {
791 ; SSE2-LABEL: abd_cmp_v2i64_multiuse_cmp:
792 ; SSE2:       # %bb.0:
793 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
794 ; SSE2-NEXT:    psubq %xmm1, %xmm2
795 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
796 ; SSE2-NEXT:    psubq %xmm0, %xmm3
797 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
798 ; SSE2-NEXT:    pxor %xmm4, %xmm0
799 ; SSE2-NEXT:    pxor %xmm4, %xmm1
800 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
801 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
802 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
803 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
804 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
805 ; SSE2-NEXT:    pand %xmm5, %xmm0
806 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
807 ; SSE2-NEXT:    por %xmm0, %xmm1
808 ; SSE2-NEXT:    pand %xmm1, %xmm3
809 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
810 ; SSE2-NEXT:    pxor %xmm1, %xmm0
811 ; SSE2-NEXT:    pandn %xmm2, %xmm1
812 ; SSE2-NEXT:    por %xmm3, %xmm1
813 ; SSE2-NEXT:    paddq %xmm1, %xmm0
814 ; SSE2-NEXT:    retq
816 ; SSE42-LABEL: abd_cmp_v2i64_multiuse_cmp:
817 ; SSE42:       # %bb.0:
818 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
819 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
820 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
821 ; SSE42-NEXT:    psubq %xmm1, %xmm3
822 ; SSE42-NEXT:    movdqa %xmm1, %xmm4
823 ; SSE42-NEXT:    psubq %xmm2, %xmm4
824 ; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
825 ; SSE42-NEXT:    pcmpgtq %xmm2, %xmm1
826 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
827 ; SSE42-NEXT:    pxor %xmm1, %xmm0
828 ; SSE42-NEXT:    paddq %xmm4, %xmm0
829 ; SSE42-NEXT:    retq
831 ; AVX1-LABEL: abd_cmp_v2i64_multiuse_cmp:
832 ; AVX1:       # %bb.0:
833 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
834 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
835 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm4
836 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
837 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
838 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
839 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
840 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
841 ; AVX1-NEXT:    retq
843 ; AVX2-LABEL: abd_cmp_v2i64_multiuse_cmp:
844 ; AVX2:       # %bb.0:
845 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
846 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm3
847 ; AVX2-NEXT:    vpsubq %xmm0, %xmm1, %xmm4
848 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
849 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
850 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
851 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
852 ; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
853 ; AVX2-NEXT:    retq
855 ; AVX512-LABEL: abd_cmp_v2i64_multiuse_cmp:
856 ; AVX512:       # %bb.0:
857 ; AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
858 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm3
859 ; AVX512-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
860 ; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
861 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
862 ; AVX512-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
863 ; AVX512-NEXT:    retq
864   %cmp = icmp sge <2 x i64> %a, %b
865   %ab = sub <2 x i64> %a, %b
866   %ba = sub <2 x i64> %b, %a
867   %sel = select <2 x i1> %cmp, <2 x i64> %ab, <2 x i64> %ba
868   %ext = sext <2 x i1> %cmp to <2 x i64>
869   %res = add <2 x i64> %ext, %sel
870   ret <2 x i64> %res
873 define <8 x i16> @abd_cmp_v8i16_multiuse_sub(<8 x i16> %a, <8 x i16> %b) nounwind {
874 ; SSE-LABEL: abd_cmp_v8i16_multiuse_sub:
875 ; SSE:       # %bb.0:
876 ; SSE-NEXT:    movdqa %xmm0, %xmm2
877 ; SSE-NEXT:    psubw %xmm1, %xmm2
878 ; SSE-NEXT:    movdqa %xmm0, %xmm3
879 ; SSE-NEXT:    pminsw %xmm1, %xmm3
880 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
881 ; SSE-NEXT:    psubw %xmm3, %xmm0
882 ; SSE-NEXT:    paddw %xmm2, %xmm0
883 ; SSE-NEXT:    retq
885 ; AVX-LABEL: abd_cmp_v8i16_multiuse_sub:
886 ; AVX:       # %bb.0:
887 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
888 ; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
889 ; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
890 ; AVX-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
891 ; AVX-NEXT:    vpaddw %xmm0, %xmm2, %xmm0
892 ; AVX-NEXT:    retq
893   %cmp = icmp sgt <8 x i16> %a, %b
894   %ab = sub <8 x i16> %a, %b
895   %ba = sub <8 x i16> %b, %a
896   %sel = select <8 x i1> %cmp, <8 x i16> %ab, <8 x i16> %ba
897   %res = add <8 x i16> %ab, %sel
898   ret <8 x i16> %res
901 declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
902 declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)
903 declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
904 declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1)
905 declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)
906 declare <8 x i64> @llvm.abs.v8i64(<8 x i64>, i1)
907 declare <16 x i64> @llvm.abs.v16i64(<16 x i64>, i1)
908 declare <2 x i128> @llvm.abs.v2i128(<2 x i128>, i1)
910 declare <16 x i8> @llvm.smax.v16i8(<16 x i8>, <16 x i8>)
911 declare <8 x i16> @llvm.smax.v8i16(<8 x i16>, <8 x i16>)
912 declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)
913 declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)
915 declare <16 x i8> @llvm.smin.v16i8(<16 x i8>, <16 x i8>)
916 declare <8 x i16> @llvm.smin.v8i16(<8 x i16>, <8 x i16>)
917 declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)
918 declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)