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:
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
25 ; SSE42-LABEL: abd_ext_v16i8:
27 ; SSE42-NEXT: movdqa %xmm0, %xmm2
28 ; SSE42-NEXT: pminsb %xmm1, %xmm2
29 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
30 ; SSE42-NEXT: psubb %xmm2, %xmm0
33 ; AVX-LABEL: abd_ext_v16i8:
35 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm2
36 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
37 ; AVX-NEXT: vpsubb %xmm2, %xmm0, %xmm0
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>
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:
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
60 ; SSE42-LABEL: abd_ext_v16i8_undef:
62 ; SSE42-NEXT: movdqa %xmm0, %xmm2
63 ; SSE42-NEXT: pminsb %xmm1, %xmm2
64 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
65 ; SSE42-NEXT: psubb %xmm2, %xmm0
68 ; AVX-LABEL: abd_ext_v16i8_undef:
70 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm2
71 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
72 ; AVX-NEXT: vpsubb %xmm2, %xmm0, %xmm0
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>
82 define <8 x i16> @abd_ext_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
83 ; SSE-LABEL: abd_ext_v8i16:
85 ; SSE-NEXT: movdqa %xmm0, %xmm2
86 ; SSE-NEXT: pminsw %xmm1, %xmm2
87 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
88 ; SSE-NEXT: psubw %xmm2, %xmm0
91 ; AVX-LABEL: abd_ext_v8i16:
93 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm2
94 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
95 ; AVX-NEXT: vpsubw %xmm2, %xmm0, %xmm0
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>
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:
108 ; SSE-NEXT: movdqa %xmm0, %xmm2
109 ; SSE-NEXT: pminsw %xmm1, %xmm2
110 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
111 ; SSE-NEXT: psubw %xmm2, %xmm0
114 ; AVX-LABEL: abd_ext_v8i16_undef:
116 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm2
117 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
118 ; AVX-NEXT: vpsubw %xmm2, %xmm0, %xmm0
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>
128 define <4 x i32> @abd_ext_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
129 ; SSE2-LABEL: abd_ext_v4i32:
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
141 ; SSE42-LABEL: abd_ext_v4i32:
143 ; SSE42-NEXT: movdqa %xmm0, %xmm2
144 ; SSE42-NEXT: pminsd %xmm1, %xmm2
145 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
146 ; SSE42-NEXT: psubd %xmm2, %xmm0
149 ; AVX-LABEL: abd_ext_v4i32:
151 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm2
152 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
153 ; AVX-NEXT: vpsubd %xmm2, %xmm0, %xmm0
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>
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:
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
176 ; SSE42-LABEL: abd_ext_v4i32_undef:
178 ; SSE42-NEXT: movdqa %xmm0, %xmm2
179 ; SSE42-NEXT: pminsd %xmm1, %xmm2
180 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
181 ; SSE42-NEXT: psubd %xmm2, %xmm0
184 ; AVX-LABEL: abd_ext_v4i32_undef:
186 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm2
187 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
188 ; AVX-NEXT: vpsubd %xmm2, %xmm0, %xmm0
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>
198 define <2 x i64> @abd_ext_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
199 ; SSE2-LABEL: abd_ext_v2i64:
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]
230 ; SSE42-LABEL: abd_ext_v2i64:
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
242 ; AVX1-LABEL: abd_ext_v2i64:
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
250 ; AVX2-LABEL: abd_ext_v2i64:
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
258 ; AVX512-LABEL: abd_ext_v2i64:
260 ; AVX512-NEXT: vpminsq %xmm1, %xmm0, %xmm2
261 ; AVX512-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
262 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
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>
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:
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]
304 ; SSE42-LABEL: abd_ext_v2i64_undef:
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
316 ; AVX1-LABEL: abd_ext_v2i64_undef:
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
324 ; AVX2-LABEL: abd_ext_v2i64_undef:
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
332 ; AVX512-LABEL: abd_ext_v2i64_undef:
334 ; AVX512-NEXT: vpminsq %xmm1, %xmm0, %xmm2
335 ; AVX512-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
336 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
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>
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:
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
363 ; SSE42-LABEL: abd_minmax_v16i8:
365 ; SSE42-NEXT: movdqa %xmm0, %xmm2
366 ; SSE42-NEXT: pminsb %xmm1, %xmm2
367 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
368 ; SSE42-NEXT: psubb %xmm2, %xmm0
371 ; AVX-LABEL: abd_minmax_v16i8:
373 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm2
374 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
375 ; AVX-NEXT: vpsubb %xmm2, %xmm0, %xmm0
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
383 define <8 x i16> @abd_minmax_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
384 ; SSE-LABEL: abd_minmax_v8i16:
386 ; SSE-NEXT: movdqa %xmm0, %xmm2
387 ; SSE-NEXT: pminsw %xmm1, %xmm2
388 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
389 ; SSE-NEXT: psubw %xmm2, %xmm0
392 ; AVX-LABEL: abd_minmax_v8i16:
394 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm2
395 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
396 ; AVX-NEXT: vpsubw %xmm2, %xmm0, %xmm0
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
404 define <4 x i32> @abd_minmax_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
405 ; SSE2-LABEL: abd_minmax_v4i32:
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
417 ; SSE42-LABEL: abd_minmax_v4i32:
419 ; SSE42-NEXT: movdqa %xmm0, %xmm2
420 ; SSE42-NEXT: pminsd %xmm1, %xmm2
421 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
422 ; SSE42-NEXT: psubd %xmm2, %xmm0
425 ; AVX-LABEL: abd_minmax_v4i32:
427 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm2
428 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
429 ; AVX-NEXT: vpsubd %xmm2, %xmm0, %xmm0
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
437 define <2 x i64> @abd_minmax_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
438 ; SSE2-LABEL: abd_minmax_v2i64:
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
463 ; SSE42-LABEL: abd_minmax_v2i64:
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
475 ; AVX1-LABEL: abd_minmax_v2i64:
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
483 ; AVX2-LABEL: abd_minmax_v2i64:
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
491 ; AVX512-LABEL: abd_minmax_v2i64:
493 ; AVX512-NEXT: vpminsq %xmm1, %xmm0, %xmm2
494 ; AVX512-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
495 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
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
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:
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
520 ; SSE42-LABEL: abd_cmp_v16i8:
522 ; SSE42-NEXT: movdqa %xmm0, %xmm2
523 ; SSE42-NEXT: pminsb %xmm1, %xmm2
524 ; SSE42-NEXT: pmaxsb %xmm1, %xmm0
525 ; SSE42-NEXT: psubb %xmm2, %xmm0
528 ; AVX-LABEL: abd_cmp_v16i8:
530 ; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm2
531 ; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
532 ; AVX-NEXT: vpsubb %xmm2, %xmm0, %xmm0
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
541 define <8 x i16> @abd_cmp_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
542 ; SSE-LABEL: abd_cmp_v8i16:
544 ; SSE-NEXT: movdqa %xmm0, %xmm2
545 ; SSE-NEXT: pminsw %xmm1, %xmm2
546 ; SSE-NEXT: pmaxsw %xmm1, %xmm0
547 ; SSE-NEXT: psubw %xmm2, %xmm0
550 ; AVX-LABEL: abd_cmp_v8i16:
552 ; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm2
553 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
554 ; AVX-NEXT: vpsubw %xmm2, %xmm0, %xmm0
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
563 define <4 x i32> @abd_cmp_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
564 ; SSE2-LABEL: abd_cmp_v4i32:
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
576 ; SSE42-LABEL: abd_cmp_v4i32:
578 ; SSE42-NEXT: movdqa %xmm0, %xmm2
579 ; SSE42-NEXT: pminsd %xmm1, %xmm2
580 ; SSE42-NEXT: pmaxsd %xmm1, %xmm0
581 ; SSE42-NEXT: psubd %xmm2, %xmm0
584 ; AVX-LABEL: abd_cmp_v4i32:
586 ; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm2
587 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
588 ; AVX-NEXT: vpsubd %xmm2, %xmm0, %xmm0
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
597 define <2 x i64> @abd_cmp_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
598 ; SSE2-LABEL: abd_cmp_v2i64:
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
621 ; SSE42-LABEL: abd_cmp_v2i64:
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
633 ; AVX1-LABEL: abd_cmp_v2i64:
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
641 ; AVX2-LABEL: abd_cmp_v2i64:
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
649 ; AVX512-LABEL: abd_cmp_v2i64:
651 ; AVX512-NEXT: vpminsq %xmm1, %xmm0, %xmm2
652 ; AVX512-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
653 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
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
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:
669 ; SSE2-NEXT: psubb %xmm1, %xmm0
670 ; SSE2-NEXT: pxor %xmm1, %xmm1
671 ; SSE2-NEXT: psubb %xmm0, %xmm1
672 ; SSE2-NEXT: pminub %xmm1, %xmm0
675 ; SSE42-LABEL: abd_subnsw_v16i8:
677 ; SSE42-NEXT: psubb %xmm1, %xmm0
678 ; SSE42-NEXT: pabsb %xmm0, %xmm0
681 ; AVX-LABEL: abd_subnsw_v16i8:
683 ; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm0
684 ; AVX-NEXT: vpabsb %xmm0, %xmm0
686 %sub = sub nsw <16 x i8> %a, %b
687 %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 false)
691 define <8 x i16> @abd_subnsw_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
692 ; SSE2-LABEL: abd_subnsw_v8i16:
694 ; SSE2-NEXT: psubw %xmm1, %xmm0
695 ; SSE2-NEXT: pxor %xmm1, %xmm1
696 ; SSE2-NEXT: psubw %xmm0, %xmm1
697 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
700 ; SSE42-LABEL: abd_subnsw_v8i16:
702 ; SSE42-NEXT: psubw %xmm1, %xmm0
703 ; SSE42-NEXT: pabsw %xmm0, %xmm0
706 ; AVX-LABEL: abd_subnsw_v8i16:
708 ; AVX-NEXT: vpsubw %xmm1, %xmm0, %xmm0
709 ; AVX-NEXT: vpabsw %xmm0, %xmm0
711 %sub = sub nsw <8 x i16> %a, %b
712 %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 false)
716 define <4 x i32> @abd_subnsw_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
717 ; SSE2-LABEL: abd_subnsw_v4i32:
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
726 ; SSE42-LABEL: abd_subnsw_v4i32:
728 ; SSE42-NEXT: psubd %xmm1, %xmm0
729 ; SSE42-NEXT: pabsd %xmm0, %xmm0
732 ; AVX-LABEL: abd_subnsw_v4i32:
734 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
735 ; AVX-NEXT: vpabsd %xmm0, %xmm0
737 %sub = sub nsw <4 x i32> %a, %b
738 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 false)
742 define <2 x i64> @abd_subnsw_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
743 ; SSE2-LABEL: abd_subnsw_v2i64:
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
752 ; SSE42-LABEL: abd_subnsw_v2i64:
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
760 ; AVX1-LABEL: abd_subnsw_v2i64:
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
768 ; AVX2-LABEL: abd_subnsw_v2i64:
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
776 ; AVX512-LABEL: abd_subnsw_v2i64:
778 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm0
779 ; AVX512-NEXT: vpabsq %xmm0, %xmm0
781 %sub = sub nsw <2 x i64> %a, %b
782 %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 false)
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:
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
816 ; SSE42-LABEL: abd_cmp_v2i64_multiuse_cmp:
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
831 ; AVX1-LABEL: abd_cmp_v2i64_multiuse_cmp:
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
843 ; AVX2-LABEL: abd_cmp_v2i64_multiuse_cmp:
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
855 ; AVX512-LABEL: abd_cmp_v2i64_multiuse_cmp:
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
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
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:
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
885 ; AVX-LABEL: abd_cmp_v8i16_multiuse_sub:
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
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
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>)