[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / uadd_sat_vec.ll
blob1a20e53003fb05835ba84a5df1533486acdda977
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9 declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
10 declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
11 declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
12 declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
13 declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
14 declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
15 declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
16 declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
18 declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
19 declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
20 declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
21 declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
22 declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
23 declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
24 declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
26 declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
27 declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
29 declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
30 declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
31 declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
32 declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
33 declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
34 declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
35 declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
37 declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
38 declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>)
40 ; Legal types, depending on architecture.
42 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
43 ; SSE-LABEL: v16i8:
44 ; SSE:       # %bb.0:
45 ; SSE-NEXT:    paddusb %xmm1, %xmm0
46 ; SSE-NEXT:    retq
48 ; AVX-LABEL: v16i8:
49 ; AVX:       # %bb.0:
50 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
51 ; AVX-NEXT:    retq
52   %z = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
53   ret <16 x i8> %z
56 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
57 ; SSE-LABEL: v32i8:
58 ; SSE:       # %bb.0:
59 ; SSE-NEXT:    paddusb %xmm2, %xmm0
60 ; SSE-NEXT:    paddusb %xmm3, %xmm1
61 ; SSE-NEXT:    retq
63 ; AVX1-LABEL: v32i8:
64 ; AVX1:       # %bb.0:
65 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
66 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
67 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm3, %xmm2
68 ; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
70 ; AVX1-NEXT:    retq
72 ; AVX2-LABEL: v32i8:
73 ; AVX2:       # %bb.0:
74 ; AVX2-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
77 ; AVX512-LABEL: v32i8:
78 ; AVX512:       # %bb.0:
79 ; AVX512-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
80 ; AVX512-NEXT:    retq
81   %z = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
82   ret <32 x i8> %z
85 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
86 ; SSE-LABEL: v64i8:
87 ; SSE:       # %bb.0:
88 ; SSE-NEXT:    paddusb %xmm4, %xmm0
89 ; SSE-NEXT:    paddusb %xmm5, %xmm1
90 ; SSE-NEXT:    paddusb %xmm6, %xmm2
91 ; SSE-NEXT:    paddusb %xmm7, %xmm3
92 ; SSE-NEXT:    retq
94 ; AVX1-LABEL: v64i8:
95 ; AVX1:       # %bb.0:
96 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
97 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
98 ; AVX1-NEXT:    vpaddusb %xmm4, %xmm5, %xmm4
99 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
100 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
101 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
102 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
103 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm4, %xmm2
104 ; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
105 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
106 ; AVX1-NEXT:    retq
108 ; AVX2-LABEL: v64i8:
109 ; AVX2:       # %bb.0:
110 ; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT:    vpaddusb %ymm3, %ymm1, %ymm1
112 ; AVX2-NEXT:    retq
114 ; AVX512-LABEL: v64i8:
115 ; AVX512:       # %bb.0:
116 ; AVX512-NEXT:    vpaddusb %zmm1, %zmm0, %zmm0
117 ; AVX512-NEXT:    retq
118   %z = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
119   ret <64 x i8> %z
122 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
123 ; SSE-LABEL: v8i16:
124 ; SSE:       # %bb.0:
125 ; SSE-NEXT:    paddusw %xmm1, %xmm0
126 ; SSE-NEXT:    retq
128 ; AVX-LABEL: v8i16:
129 ; AVX:       # %bb.0:
130 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
131 ; AVX-NEXT:    retq
132   %z = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
133   ret <8 x i16> %z
136 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
137 ; SSE-LABEL: v16i16:
138 ; SSE:       # %bb.0:
139 ; SSE-NEXT:    paddusw %xmm2, %xmm0
140 ; SSE-NEXT:    paddusw %xmm3, %xmm1
141 ; SSE-NEXT:    retq
143 ; AVX1-LABEL: v16i16:
144 ; AVX1:       # %bb.0:
145 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
146 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
147 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm3, %xmm2
148 ; AVX1-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
150 ; AVX1-NEXT:    retq
152 ; AVX2-LABEL: v16i16:
153 ; AVX2:       # %bb.0:
154 ; AVX2-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
155 ; AVX2-NEXT:    retq
157 ; AVX512-LABEL: v16i16:
158 ; AVX512:       # %bb.0:
159 ; AVX512-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
160 ; AVX512-NEXT:    retq
161   %z = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
162   ret <16 x i16> %z
165 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
166 ; SSE-LABEL: v32i16:
167 ; SSE:       # %bb.0:
168 ; SSE-NEXT:    paddusw %xmm4, %xmm0
169 ; SSE-NEXT:    paddusw %xmm5, %xmm1
170 ; SSE-NEXT:    paddusw %xmm6, %xmm2
171 ; SSE-NEXT:    paddusw %xmm7, %xmm3
172 ; SSE-NEXT:    retq
174 ; AVX1-LABEL: v32i16:
175 ; AVX1:       # %bb.0:
176 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
177 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
178 ; AVX1-NEXT:    vpaddusw %xmm4, %xmm5, %xmm4
179 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
180 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
181 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
182 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
183 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm4, %xmm2
184 ; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
185 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
186 ; AVX1-NEXT:    retq
188 ; AVX2-LABEL: v32i16:
189 ; AVX2:       # %bb.0:
190 ; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT:    vpaddusw %ymm3, %ymm1, %ymm1
192 ; AVX2-NEXT:    retq
194 ; AVX512-LABEL: v32i16:
195 ; AVX512:       # %bb.0:
196 ; AVX512-NEXT:    vpaddusw %zmm1, %zmm0, %zmm0
197 ; AVX512-NEXT:    retq
198   %z = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
199   ret <32 x i16> %z
202 ; Too narrow vectors, legalized by widening.
204 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
205 ; SSE-LABEL: v8i8:
206 ; SSE:       # %bb.0:
207 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
208 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
209 ; SSE-NEXT:    paddusb %xmm0, %xmm1
210 ; SSE-NEXT:    movq %xmm1, (%rdx)
211 ; SSE-NEXT:    retq
213 ; AVX-LABEL: v8i8:
214 ; AVX:       # %bb.0:
215 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
218 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
219 ; AVX-NEXT:    retq
220   %x = load <8 x i8>, <8 x i8>* %px
221   %y = load <8 x i8>, <8 x i8>* %py
222   %z = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
223   store <8 x i8> %z, <8 x i8>* %pz
224   ret void
227 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
228 ; SSE-LABEL: v4i8:
229 ; SSE:       # %bb.0:
230 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
231 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
232 ; SSE-NEXT:    paddusb %xmm0, %xmm1
233 ; SSE-NEXT:    movd %xmm1, (%rdx)
234 ; SSE-NEXT:    retq
236 ; AVX-LABEL: v4i8:
237 ; AVX:       # %bb.0:
238 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
239 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
240 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
241 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
242 ; AVX-NEXT:    retq
243   %x = load <4 x i8>, <4 x i8>* %px
244   %y = load <4 x i8>, <4 x i8>* %py
245   %z = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
246   store <4 x i8> %z, <4 x i8>* %pz
247   ret void
250 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
251 ; SSE2-LABEL: v2i8:
252 ; SSE2:       # %bb.0:
253 ; SSE2-NEXT:    movzwl (%rdi), %eax
254 ; SSE2-NEXT:    movd %eax, %xmm0
255 ; SSE2-NEXT:    movzwl (%rsi), %eax
256 ; SSE2-NEXT:    movd %eax, %xmm1
257 ; SSE2-NEXT:    paddusb %xmm0, %xmm1
258 ; SSE2-NEXT:    movd %xmm1, %eax
259 ; SSE2-NEXT:    movw %ax, (%rdx)
260 ; SSE2-NEXT:    retq
262 ; SSSE3-LABEL: v2i8:
263 ; SSSE3:       # %bb.0:
264 ; SSSE3-NEXT:    movzwl (%rdi), %eax
265 ; SSSE3-NEXT:    movd %eax, %xmm0
266 ; SSSE3-NEXT:    movzwl (%rsi), %eax
267 ; SSSE3-NEXT:    movd %eax, %xmm1
268 ; SSSE3-NEXT:    paddusb %xmm0, %xmm1
269 ; SSSE3-NEXT:    movd %xmm1, %eax
270 ; SSSE3-NEXT:    movw %ax, (%rdx)
271 ; SSSE3-NEXT:    retq
273 ; SSE41-LABEL: v2i8:
274 ; SSE41:       # %bb.0:
275 ; SSE41-NEXT:    movzwl (%rdi), %eax
276 ; SSE41-NEXT:    movd %eax, %xmm0
277 ; SSE41-NEXT:    movzwl (%rsi), %eax
278 ; SSE41-NEXT:    movd %eax, %xmm1
279 ; SSE41-NEXT:    paddusb %xmm0, %xmm1
280 ; SSE41-NEXT:    pextrw $0, %xmm1, (%rdx)
281 ; SSE41-NEXT:    retq
283 ; AVX-LABEL: v2i8:
284 ; AVX:       # %bb.0:
285 ; AVX-NEXT:    movzwl (%rdi), %eax
286 ; AVX-NEXT:    vmovd %eax, %xmm0
287 ; AVX-NEXT:    movzwl (%rsi), %eax
288 ; AVX-NEXT:    vmovd %eax, %xmm1
289 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
290 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
291 ; AVX-NEXT:    retq
292   %x = load <2 x i8>, <2 x i8>* %px
293   %y = load <2 x i8>, <2 x i8>* %py
294   %z = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
295   store <2 x i8> %z, <2 x i8>* %pz
296   ret void
299 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
300 ; SSE-LABEL: v4i16:
301 ; SSE:       # %bb.0:
302 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
303 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
304 ; SSE-NEXT:    paddusw %xmm0, %xmm1
305 ; SSE-NEXT:    movq %xmm1, (%rdx)
306 ; SSE-NEXT:    retq
308 ; AVX-LABEL: v4i16:
309 ; AVX:       # %bb.0:
310 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
311 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
312 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
313 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
314 ; AVX-NEXT:    retq
315   %x = load <4 x i16>, <4 x i16>* %px
316   %y = load <4 x i16>, <4 x i16>* %py
317   %z = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
318   store <4 x i16> %z, <4 x i16>* %pz
319   ret void
322 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
323 ; SSE-LABEL: v2i16:
324 ; SSE:       # %bb.0:
325 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
326 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
327 ; SSE-NEXT:    paddusw %xmm0, %xmm1
328 ; SSE-NEXT:    movd %xmm1, (%rdx)
329 ; SSE-NEXT:    retq
331 ; AVX-LABEL: v2i16:
332 ; AVX:       # %bb.0:
333 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
334 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
335 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
336 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
337 ; AVX-NEXT:    retq
338   %x = load <2 x i16>, <2 x i16>* %px
339   %y = load <2 x i16>, <2 x i16>* %py
340   %z = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
341   store <2 x i16> %z, <2 x i16>* %pz
342   ret void
345 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
346 ; SSE-LABEL: v12i8:
347 ; SSE:       # %bb.0:
348 ; SSE-NEXT:    paddusb %xmm1, %xmm0
349 ; SSE-NEXT:    retq
351 ; AVX-LABEL: v12i8:
352 ; AVX:       # %bb.0:
353 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
354 ; AVX-NEXT:    retq
355   %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
356   ret <12 x i8> %z
359 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
360 ; SSE-LABEL: v12i16:
361 ; SSE:       # %bb.0:
362 ; SSE-NEXT:    movdqa (%rdi), %xmm0
363 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
364 ; SSE-NEXT:    paddusw (%rsi), %xmm0
365 ; SSE-NEXT:    paddusw 16(%rsi), %xmm1
366 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
367 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
368 ; SSE-NEXT:    retq
370 ; AVX1-LABEL: v12i16:
371 ; AVX1:       # %bb.0:
372 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
373 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
374 ; AVX1-NEXT:    vpaddusw 16(%rsi), %xmm1, %xmm1
375 ; AVX1-NEXT:    vpaddusw (%rsi), %xmm0, %xmm0
376 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
377 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
378 ; AVX1-NEXT:    retq
380 ; AVX2-LABEL: v12i16:
381 ; AVX2:       # %bb.0:
382 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
383 ; AVX2-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
384 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
385 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
386 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
387 ; AVX2-NEXT:    vzeroupper
388 ; AVX2-NEXT:    retq
390 ; AVX512-LABEL: v12i16:
391 ; AVX512:       # %bb.0:
392 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
393 ; AVX512-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
394 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
395 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
396 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
397 ; AVX512-NEXT:    vzeroupper
398 ; AVX512-NEXT:    retq
399   %x = load <12 x i16>, <12 x i16>* %px
400   %y = load <12 x i16>, <12 x i16>* %py
401   %z = call <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
402   store <12 x i16> %z, <12 x i16>* %pz
403   ret void
406 ; Scalarization
408 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
409 ; SSE-LABEL: v1i8:
410 ; SSE:       # %bb.0:
411 ; SSE-NEXT:    movb (%rdi), %al
412 ; SSE-NEXT:    addb (%rsi), %al
413 ; SSE-NEXT:    movzbl %al, %eax
414 ; SSE-NEXT:    movl $255, %ecx
415 ; SSE-NEXT:    cmovael %eax, %ecx
416 ; SSE-NEXT:    movb %cl, (%rdx)
417 ; SSE-NEXT:    retq
419 ; AVX-LABEL: v1i8:
420 ; AVX:       # %bb.0:
421 ; AVX-NEXT:    movb (%rdi), %al
422 ; AVX-NEXT:    addb (%rsi), %al
423 ; AVX-NEXT:    movzbl %al, %eax
424 ; AVX-NEXT:    movl $255, %ecx
425 ; AVX-NEXT:    cmovael %eax, %ecx
426 ; AVX-NEXT:    movb %cl, (%rdx)
427 ; AVX-NEXT:    retq
428   %x = load <1 x i8>, <1 x i8>* %px
429   %y = load <1 x i8>, <1 x i8>* %py
430   %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
431   store <1 x i8> %z, <1 x i8>* %pz
432   ret void
435 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
436 ; SSE-LABEL: v1i16:
437 ; SSE:       # %bb.0:
438 ; SSE-NEXT:    movzwl (%rdi), %eax
439 ; SSE-NEXT:    addw (%rsi), %ax
440 ; SSE-NEXT:    movl $65535, %ecx # imm = 0xFFFF
441 ; SSE-NEXT:    cmovael %eax, %ecx
442 ; SSE-NEXT:    movw %cx, (%rdx)
443 ; SSE-NEXT:    retq
445 ; AVX-LABEL: v1i16:
446 ; AVX:       # %bb.0:
447 ; AVX-NEXT:    movzwl (%rdi), %eax
448 ; AVX-NEXT:    addw (%rsi), %ax
449 ; AVX-NEXT:    movl $65535, %ecx # imm = 0xFFFF
450 ; AVX-NEXT:    cmovael %eax, %ecx
451 ; AVX-NEXT:    movw %cx, (%rdx)
452 ; AVX-NEXT:    retq
453   %x = load <1 x i16>, <1 x i16>* %px
454   %y = load <1 x i16>, <1 x i16>* %py
455   %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
456   store <1 x i16> %z, <1 x i16>* %pz
457   ret void
460 ; Promotion
462 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
463 ; SSE-LABEL: v16i4:
464 ; SSE:       # %bb.0:
465 ; SSE-NEXT:    psllw $4, %xmm1
466 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
467 ; SSE-NEXT:    pand %xmm2, %xmm1
468 ; SSE-NEXT:    psllw $4, %xmm0
469 ; SSE-NEXT:    pand %xmm2, %xmm0
470 ; SSE-NEXT:    paddusb %xmm1, %xmm0
471 ; SSE-NEXT:    psrlw $4, %xmm0
472 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
473 ; SSE-NEXT:    retq
475 ; AVX-LABEL: v16i4:
476 ; AVX:       # %bb.0:
477 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
478 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
479 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
480 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
481 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
482 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
483 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
484 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
485 ; AVX-NEXT:    retq
486   %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
487   ret <16 x i4> %z
490 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
491 ; SSE-LABEL: v16i1:
492 ; SSE:       # %bb.0:
493 ; SSE-NEXT:    psllw $7, %xmm1
494 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
495 ; SSE-NEXT:    pand %xmm2, %xmm1
496 ; SSE-NEXT:    psllw $7, %xmm0
497 ; SSE-NEXT:    pand %xmm2, %xmm0
498 ; SSE-NEXT:    paddusb %xmm1, %xmm0
499 ; SSE-NEXT:    psrlw $7, %xmm0
500 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
501 ; SSE-NEXT:    retq
503 ; AVX1-LABEL: v16i1:
504 ; AVX1:       # %bb.0:
505 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
506 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
507 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
508 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
509 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
510 ; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
511 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
512 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
513 ; AVX1-NEXT:    retq
515 ; AVX2-LABEL: v16i1:
516 ; AVX2:       # %bb.0:
517 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
518 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
519 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
520 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
521 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
522 ; AVX2-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
523 ; AVX2-NEXT:    vpsrlw $7, %xmm0, %xmm0
524 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
525 ; AVX2-NEXT:    retq
527 ; AVX512-LABEL: v16i1:
528 ; AVX512:       # %bb.0:
529 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm1
530 ; AVX512-NEXT:    vpmovb2m %xmm1, %k0
531 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
532 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
533 ; AVX512-NEXT:    korw %k0, %k1, %k0
534 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
535 ; AVX512-NEXT:    retq
536   %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
537   ret <16 x i1> %z
540 ; Expanded
542 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
543 ; SSE2-LABEL: v2i32:
544 ; SSE2:       # %bb.0:
545 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
546 ; SSE2-NEXT:    paddd %xmm0, %xmm1
547 ; SSE2-NEXT:    pxor %xmm2, %xmm0
548 ; SSE2-NEXT:    pxor %xmm1, %xmm2
549 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
550 ; SSE2-NEXT:    por %xmm1, %xmm0
551 ; SSE2-NEXT:    retq
553 ; SSSE3-LABEL: v2i32:
554 ; SSSE3:       # %bb.0:
555 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
556 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
557 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
558 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
559 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
560 ; SSSE3-NEXT:    por %xmm1, %xmm0
561 ; SSSE3-NEXT:    retq
563 ; SSE41-LABEL: v2i32:
564 ; SSE41:       # %bb.0:
565 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
566 ; SSE41-NEXT:    pxor %xmm1, %xmm2
567 ; SSE41-NEXT:    pminud %xmm2, %xmm0
568 ; SSE41-NEXT:    paddd %xmm1, %xmm0
569 ; SSE41-NEXT:    retq
571 ; AVX1-LABEL: v2i32:
572 ; AVX1:       # %bb.0:
573 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
574 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
575 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
576 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
577 ; AVX1-NEXT:    retq
579 ; AVX2-LABEL: v2i32:
580 ; AVX2:       # %bb.0:
581 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
582 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
583 ; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0
584 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
585 ; AVX2-NEXT:    retq
587 ; AVX512-LABEL: v2i32:
588 ; AVX512:       # %bb.0:
589 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
590 ; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
591 ; AVX512-NEXT:    vpminud %xmm2, %xmm0, %xmm0
592 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
593 ; AVX512-NEXT:    retq
594   %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
595   ret <2 x i32> %z
598 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
599 ; SSE2-LABEL: v4i32:
600 ; SSE2:       # %bb.0:
601 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
602 ; SSE2-NEXT:    paddd %xmm0, %xmm1
603 ; SSE2-NEXT:    pxor %xmm2, %xmm0
604 ; SSE2-NEXT:    pxor %xmm1, %xmm2
605 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
606 ; SSE2-NEXT:    por %xmm1, %xmm0
607 ; SSE2-NEXT:    retq
609 ; SSSE3-LABEL: v4i32:
610 ; SSSE3:       # %bb.0:
611 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
612 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
613 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
614 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
615 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
616 ; SSSE3-NEXT:    por %xmm1, %xmm0
617 ; SSSE3-NEXT:    retq
619 ; SSE41-LABEL: v4i32:
620 ; SSE41:       # %bb.0:
621 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
622 ; SSE41-NEXT:    pxor %xmm1, %xmm2
623 ; SSE41-NEXT:    pminud %xmm2, %xmm0
624 ; SSE41-NEXT:    paddd %xmm1, %xmm0
625 ; SSE41-NEXT:    retq
627 ; AVX1-LABEL: v4i32:
628 ; AVX1:       # %bb.0:
629 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
630 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
631 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
632 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
633 ; AVX1-NEXT:    retq
635 ; AVX2-LABEL: v4i32:
636 ; AVX2:       # %bb.0:
637 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
638 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
639 ; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0
640 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
641 ; AVX2-NEXT:    retq
643 ; AVX512-LABEL: v4i32:
644 ; AVX512:       # %bb.0:
645 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
646 ; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
647 ; AVX512-NEXT:    vpminud %xmm2, %xmm0, %xmm0
648 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
649 ; AVX512-NEXT:    retq
650   %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
651   ret <4 x i32> %z
654 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
655 ; SSE2-LABEL: v8i32:
656 ; SSE2:       # %bb.0:
657 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
658 ; SSE2-NEXT:    paddd %xmm0, %xmm2
659 ; SSE2-NEXT:    pxor %xmm4, %xmm0
660 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
661 ; SSE2-NEXT:    pxor %xmm4, %xmm5
662 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
663 ; SSE2-NEXT:    por %xmm2, %xmm0
664 ; SSE2-NEXT:    paddd %xmm1, %xmm3
665 ; SSE2-NEXT:    pxor %xmm4, %xmm1
666 ; SSE2-NEXT:    pxor %xmm3, %xmm4
667 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
668 ; SSE2-NEXT:    por %xmm3, %xmm1
669 ; SSE2-NEXT:    retq
671 ; SSSE3-LABEL: v8i32:
672 ; SSSE3:       # %bb.0:
673 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
674 ; SSSE3-NEXT:    paddd %xmm0, %xmm2
675 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
676 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
677 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
678 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
679 ; SSSE3-NEXT:    por %xmm2, %xmm0
680 ; SSSE3-NEXT:    paddd %xmm1, %xmm3
681 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
682 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
683 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
684 ; SSSE3-NEXT:    por %xmm3, %xmm1
685 ; SSSE3-NEXT:    retq
687 ; SSE41-LABEL: v8i32:
688 ; SSE41:       # %bb.0:
689 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
690 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
691 ; SSE41-NEXT:    pxor %xmm4, %xmm5
692 ; SSE41-NEXT:    pminud %xmm5, %xmm0
693 ; SSE41-NEXT:    paddd %xmm2, %xmm0
694 ; SSE41-NEXT:    pxor %xmm3, %xmm4
695 ; SSE41-NEXT:    pminud %xmm4, %xmm1
696 ; SSE41-NEXT:    paddd %xmm3, %xmm1
697 ; SSE41-NEXT:    retq
699 ; AVX1-LABEL: v8i32:
700 ; AVX1:       # %bb.0:
701 ; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm2
702 ; AVX1-NEXT:    vcmptrueps %ymm2, %ymm2, %ymm2
703 ; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm2
704 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
705 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
706 ; AVX1-NEXT:    vpminud %xmm3, %xmm4, %xmm3
707 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
708 ; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3
709 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
710 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
711 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
712 ; AVX1-NEXT:    retq
714 ; AVX2-LABEL: v8i32:
715 ; AVX2:       # %bb.0:
716 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
717 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
718 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
719 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
720 ; AVX2-NEXT:    retq
722 ; AVX512-LABEL: v8i32:
723 ; AVX512:       # %bb.0:
724 ; AVX512-NEXT:    vmovdqa %ymm1, %ymm2
725 ; AVX512-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
726 ; AVX512-NEXT:    vpminud %ymm2, %ymm0, %ymm0
727 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
728 ; AVX512-NEXT:    retq
729   %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
730   ret <8 x i32> %z
733 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
734 ; SSE2-LABEL: v16i32:
735 ; SSE2:       # %bb.0:
736 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
737 ; SSE2-NEXT:    paddd %xmm0, %xmm4
738 ; SSE2-NEXT:    pxor %xmm8, %xmm0
739 ; SSE2-NEXT:    movdqa %xmm4, %xmm9
740 ; SSE2-NEXT:    pxor %xmm8, %xmm9
741 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
742 ; SSE2-NEXT:    por %xmm4, %xmm0
743 ; SSE2-NEXT:    paddd %xmm1, %xmm5
744 ; SSE2-NEXT:    pxor %xmm8, %xmm1
745 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
746 ; SSE2-NEXT:    pxor %xmm8, %xmm4
747 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
748 ; SSE2-NEXT:    por %xmm5, %xmm1
749 ; SSE2-NEXT:    paddd %xmm2, %xmm6
750 ; SSE2-NEXT:    pxor %xmm8, %xmm2
751 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
752 ; SSE2-NEXT:    pxor %xmm8, %xmm4
753 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
754 ; SSE2-NEXT:    por %xmm6, %xmm2
755 ; SSE2-NEXT:    paddd %xmm3, %xmm7
756 ; SSE2-NEXT:    pxor %xmm8, %xmm3
757 ; SSE2-NEXT:    pxor %xmm7, %xmm8
758 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
759 ; SSE2-NEXT:    por %xmm7, %xmm3
760 ; SSE2-NEXT:    retq
762 ; SSSE3-LABEL: v16i32:
763 ; SSSE3:       # %bb.0:
764 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
765 ; SSSE3-NEXT:    paddd %xmm0, %xmm4
766 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
767 ; SSSE3-NEXT:    movdqa %xmm4, %xmm9
768 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
769 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
770 ; SSSE3-NEXT:    por %xmm4, %xmm0
771 ; SSSE3-NEXT:    paddd %xmm1, %xmm5
772 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
773 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
774 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
775 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
776 ; SSSE3-NEXT:    por %xmm5, %xmm1
777 ; SSSE3-NEXT:    paddd %xmm2, %xmm6
778 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
779 ; SSSE3-NEXT:    movdqa %xmm6, %xmm4
780 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
781 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
782 ; SSSE3-NEXT:    por %xmm6, %xmm2
783 ; SSSE3-NEXT:    paddd %xmm3, %xmm7
784 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
785 ; SSSE3-NEXT:    pxor %xmm7, %xmm8
786 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
787 ; SSSE3-NEXT:    por %xmm7, %xmm3
788 ; SSSE3-NEXT:    retq
790 ; SSE41-LABEL: v16i32:
791 ; SSE41:       # %bb.0:
792 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
793 ; SSE41-NEXT:    movdqa %xmm4, %xmm9
794 ; SSE41-NEXT:    pxor %xmm8, %xmm9
795 ; SSE41-NEXT:    pminud %xmm9, %xmm0
796 ; SSE41-NEXT:    paddd %xmm4, %xmm0
797 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
798 ; SSE41-NEXT:    pxor %xmm8, %xmm4
799 ; SSE41-NEXT:    pminud %xmm4, %xmm1
800 ; SSE41-NEXT:    paddd %xmm5, %xmm1
801 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
802 ; SSE41-NEXT:    pxor %xmm8, %xmm4
803 ; SSE41-NEXT:    pminud %xmm4, %xmm2
804 ; SSE41-NEXT:    paddd %xmm6, %xmm2
805 ; SSE41-NEXT:    pxor %xmm7, %xmm8
806 ; SSE41-NEXT:    pminud %xmm8, %xmm3
807 ; SSE41-NEXT:    paddd %xmm7, %xmm3
808 ; SSE41-NEXT:    retq
810 ; AVX1-LABEL: v16i32:
811 ; AVX1:       # %bb.0:
812 ; AVX1-NEXT:    vxorps %xmm4, %xmm4, %xmm4
813 ; AVX1-NEXT:    vcmptrueps %ymm4, %ymm4, %ymm4
814 ; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm5
815 ; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm6
816 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
817 ; AVX1-NEXT:    vpminud %xmm6, %xmm7, %xmm6
818 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
819 ; AVX1-NEXT:    vpaddd %xmm7, %xmm6, %xmm6
820 ; AVX1-NEXT:    vpminud %xmm5, %xmm0, %xmm0
821 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
822 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
823 ; AVX1-NEXT:    vxorps %ymm4, %ymm3, %ymm2
824 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
825 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
826 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
827 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
828 ; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
829 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
830 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
831 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
832 ; AVX1-NEXT:    retq
834 ; AVX2-LABEL: v16i32:
835 ; AVX2:       # %bb.0:
836 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
837 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
838 ; AVX2-NEXT:    vpminud %ymm5, %ymm0, %ymm0
839 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
840 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
841 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
842 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
843 ; AVX2-NEXT:    retq
845 ; AVX512-LABEL: v16i32:
846 ; AVX512:       # %bb.0:
847 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
848 ; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
849 ; AVX512-NEXT:    vpminud %zmm2, %zmm0, %zmm0
850 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
851 ; AVX512-NEXT:    retq
852   %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
853   ret <16 x i32> %z
856 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
857 ; SSE2-LABEL: v2i64:
858 ; SSE2:       # %bb.0:
859 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
860 ; SSE2-NEXT:    paddq %xmm0, %xmm1
861 ; SSE2-NEXT:    pxor %xmm2, %xmm0
862 ; SSE2-NEXT:    pxor %xmm1, %xmm2
863 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
864 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
865 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
866 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
867 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
868 ; SSE2-NEXT:    pand %xmm4, %xmm2
869 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
870 ; SSE2-NEXT:    por %xmm1, %xmm0
871 ; SSE2-NEXT:    por %xmm2, %xmm0
872 ; SSE2-NEXT:    retq
874 ; SSSE3-LABEL: v2i64:
875 ; SSSE3:       # %bb.0:
876 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
877 ; SSSE3-NEXT:    paddq %xmm0, %xmm1
878 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
879 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
880 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
881 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
882 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
883 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
884 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
885 ; SSSE3-NEXT:    pand %xmm4, %xmm2
886 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
887 ; SSSE3-NEXT:    por %xmm1, %xmm0
888 ; SSSE3-NEXT:    por %xmm2, %xmm0
889 ; SSSE3-NEXT:    retq
891 ; SSE41-LABEL: v2i64:
892 ; SSE41:       # %bb.0:
893 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
894 ; SSE41-NEXT:    paddq %xmm0, %xmm1
895 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
896 ; SSE41-NEXT:    pxor %xmm2, %xmm3
897 ; SSE41-NEXT:    pxor %xmm1, %xmm2
898 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
899 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
900 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm3
901 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
902 ; SSE41-NEXT:    pand %xmm2, %xmm0
903 ; SSE41-NEXT:    por %xmm3, %xmm0
904 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
905 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
906 ; SSE41-NEXT:    movapd %xmm1, %xmm0
907 ; SSE41-NEXT:    retq
909 ; AVX1-LABEL: v2i64:
910 ; AVX1:       # %bb.0:
911 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
912 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
913 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
914 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm1
915 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
916 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
917 ; AVX1-NEXT:    retq
919 ; AVX2-LABEL: v2i64:
920 ; AVX2:       # %bb.0:
921 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
922 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
923 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
924 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm1
925 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
926 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
927 ; AVX2-NEXT:    retq
929 ; AVX512-LABEL: v2i64:
930 ; AVX512:       # %bb.0:
931 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
932 ; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
933 ; AVX512-NEXT:    vpminuq %xmm2, %xmm0, %xmm0
934 ; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
935 ; AVX512-NEXT:    retq
936   %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
937   ret <2 x i64> %z
940 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
941 ; SSE2-LABEL: v4i64:
942 ; SSE2:       # %bb.0:
943 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
944 ; SSE2-NEXT:    paddq %xmm0, %xmm2
945 ; SSE2-NEXT:    pxor %xmm4, %xmm0
946 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
947 ; SSE2-NEXT:    pxor %xmm4, %xmm5
948 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
949 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
950 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
951 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
952 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
953 ; SSE2-NEXT:    pand %xmm7, %xmm5
954 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
955 ; SSE2-NEXT:    por %xmm2, %xmm0
956 ; SSE2-NEXT:    por %xmm5, %xmm0
957 ; SSE2-NEXT:    paddq %xmm1, %xmm3
958 ; SSE2-NEXT:    pxor %xmm4, %xmm1
959 ; SSE2-NEXT:    pxor %xmm3, %xmm4
960 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
961 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
962 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
963 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
964 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
965 ; SSE2-NEXT:    pand %xmm5, %xmm4
966 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
967 ; SSE2-NEXT:    por %xmm3, %xmm1
968 ; SSE2-NEXT:    por %xmm4, %xmm1
969 ; SSE2-NEXT:    retq
971 ; SSSE3-LABEL: v4i64:
972 ; SSSE3:       # %bb.0:
973 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
974 ; SSSE3-NEXT:    paddq %xmm0, %xmm2
975 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
976 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
977 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
978 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
979 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
980 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
981 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm5
982 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
983 ; SSSE3-NEXT:    pand %xmm7, %xmm5
984 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
985 ; SSSE3-NEXT:    por %xmm2, %xmm0
986 ; SSSE3-NEXT:    por %xmm5, %xmm0
987 ; SSSE3-NEXT:    paddq %xmm1, %xmm3
988 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
989 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
990 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
991 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
992 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
993 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
994 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
995 ; SSSE3-NEXT:    pand %xmm5, %xmm4
996 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
997 ; SSSE3-NEXT:    por %xmm3, %xmm1
998 ; SSSE3-NEXT:    por %xmm4, %xmm1
999 ; SSSE3-NEXT:    retq
1001 ; SSE41-LABEL: v4i64:
1002 ; SSE41:       # %bb.0:
1003 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1004 ; SSE41-NEXT:    paddq %xmm0, %xmm2
1005 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1006 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1007 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
1008 ; SSE41-NEXT:    pxor %xmm4, %xmm6
1009 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1010 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1011 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm5
1012 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1013 ; SSE41-NEXT:    pand %xmm6, %xmm0
1014 ; SSE41-NEXT:    por %xmm5, %xmm0
1015 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1016 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1017 ; SSE41-NEXT:    paddq %xmm1, %xmm3
1018 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1019 ; SSE41-NEXT:    pxor %xmm3, %xmm4
1020 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
1021 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm6
1022 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm1
1023 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
1024 ; SSE41-NEXT:    pand %xmm6, %xmm0
1025 ; SSE41-NEXT:    por %xmm1, %xmm0
1026 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
1027 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1028 ; SSE41-NEXT:    movapd %xmm3, %xmm1
1029 ; SSE41-NEXT:    retq
1031 ; AVX1-LABEL: v4i64:
1032 ; AVX1:       # %bb.0:
1033 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1034 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1035 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
1036 ; AVX1-NEXT:    vxorps %xmm5, %xmm5, %xmm5
1037 ; AVX1-NEXT:    vcmptrueps %ymm5, %ymm5, %ymm5
1038 ; AVX1-NEXT:    vxorps %ymm5, %ymm1, %ymm5
1039 ; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm6
1040 ; AVX1-NEXT:    vpxor %xmm3, %xmm6, %xmm7
1041 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1042 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm2, %xmm6, %xmm2
1043 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1044 ; AVX1-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1045 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm4
1046 ; AVX1-NEXT:    vxorps %xmm3, %xmm5, %xmm3
1047 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
1048 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm5, %xmm0
1049 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1050 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1051 ; AVX1-NEXT:    retq
1053 ; AVX2-LABEL: v4i64:
1054 ; AVX2:       # %bb.0:
1055 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1056 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1057 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1058 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1059 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1060 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
1061 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1062 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm3, %ymm0
1063 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1064 ; AVX2-NEXT:    retq
1066 ; AVX512-LABEL: v4i64:
1067 ; AVX512:       # %bb.0:
1068 ; AVX512-NEXT:    vmovdqa %ymm1, %ymm2
1069 ; AVX512-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
1070 ; AVX512-NEXT:    vpminuq %ymm2, %ymm0, %ymm0
1071 ; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1072 ; AVX512-NEXT:    retq
1073   %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1074   ret <4 x i64> %z
1077 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1078 ; SSE2-LABEL: v8i64:
1079 ; SSE2:       # %bb.0:
1080 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1081 ; SSE2-NEXT:    paddq %xmm0, %xmm4
1082 ; SSE2-NEXT:    pxor %xmm8, %xmm0
1083 ; SSE2-NEXT:    movdqa %xmm4, %xmm9
1084 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1085 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
1086 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
1087 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1088 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm9
1089 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1090 ; SSE2-NEXT:    pand %xmm11, %xmm9
1091 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1092 ; SSE2-NEXT:    por %xmm4, %xmm0
1093 ; SSE2-NEXT:    por %xmm9, %xmm0
1094 ; SSE2-NEXT:    paddq %xmm1, %xmm5
1095 ; SSE2-NEXT:    pxor %xmm8, %xmm1
1096 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1097 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1098 ; SSE2-NEXT:    movdqa %xmm1, %xmm9
1099 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
1100 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1101 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
1102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1103 ; SSE2-NEXT:    pand %xmm10, %xmm4
1104 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1105 ; SSE2-NEXT:    por %xmm5, %xmm1
1106 ; SSE2-NEXT:    por %xmm4, %xmm1
1107 ; SSE2-NEXT:    paddq %xmm2, %xmm6
1108 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1109 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1110 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1111 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1112 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1113 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1114 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1115 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1116 ; SSE2-NEXT:    pand %xmm9, %xmm4
1117 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1118 ; SSE2-NEXT:    por %xmm6, %xmm2
1119 ; SSE2-NEXT:    por %xmm4, %xmm2
1120 ; SSE2-NEXT:    paddq %xmm3, %xmm7
1121 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1122 ; SSE2-NEXT:    pxor %xmm7, %xmm8
1123 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1124 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
1125 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1126 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
1127 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1128 ; SSE2-NEXT:    pand %xmm5, %xmm6
1129 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1130 ; SSE2-NEXT:    por %xmm7, %xmm3
1131 ; SSE2-NEXT:    por %xmm6, %xmm3
1132 ; SSE2-NEXT:    retq
1134 ; SSSE3-LABEL: v8i64:
1135 ; SSSE3:       # %bb.0:
1136 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1137 ; SSSE3-NEXT:    paddq %xmm0, %xmm4
1138 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
1139 ; SSSE3-NEXT:    movdqa %xmm4, %xmm9
1140 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
1141 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1142 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm10
1143 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1144 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm9
1145 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1146 ; SSSE3-NEXT:    pand %xmm11, %xmm9
1147 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1148 ; SSSE3-NEXT:    por %xmm4, %xmm0
1149 ; SSSE3-NEXT:    por %xmm9, %xmm0
1150 ; SSSE3-NEXT:    paddq %xmm1, %xmm5
1151 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
1152 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1153 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1154 ; SSSE3-NEXT:    movdqa %xmm1, %xmm9
1155 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
1156 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1157 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
1158 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1159 ; SSSE3-NEXT:    pand %xmm10, %xmm4
1160 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1161 ; SSSE3-NEXT:    por %xmm5, %xmm1
1162 ; SSSE3-NEXT:    por %xmm4, %xmm1
1163 ; SSSE3-NEXT:    paddq %xmm2, %xmm6
1164 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1165 ; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1166 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1167 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1168 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1169 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1170 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1171 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1172 ; SSSE3-NEXT:    pand %xmm9, %xmm4
1173 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1174 ; SSSE3-NEXT:    por %xmm6, %xmm2
1175 ; SSSE3-NEXT:    por %xmm4, %xmm2
1176 ; SSSE3-NEXT:    paddq %xmm3, %xmm7
1177 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
1178 ; SSSE3-NEXT:    pxor %xmm7, %xmm8
1179 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1180 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
1181 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1182 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm8
1183 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1184 ; SSSE3-NEXT:    pand %xmm5, %xmm6
1185 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1186 ; SSSE3-NEXT:    por %xmm7, %xmm3
1187 ; SSSE3-NEXT:    por %xmm6, %xmm3
1188 ; SSSE3-NEXT:    retq
1190 ; SSE41-LABEL: v8i64:
1191 ; SSE41:       # %bb.0:
1192 ; SSE41-NEXT:    movdqa %xmm7, %xmm8
1193 ; SSE41-NEXT:    movdqa %xmm6, %xmm10
1194 ; SSE41-NEXT:    movdqa %xmm5, %xmm11
1195 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
1196 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1197 ; SSE41-NEXT:    paddq %xmm0, %xmm5
1198 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1199 ; SSE41-NEXT:    pxor %xmm7, %xmm6
1200 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
1201 ; SSE41-NEXT:    pxor %xmm7, %xmm4
1202 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
1203 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
1204 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm6
1205 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1206 ; SSE41-NEXT:    pand %xmm4, %xmm0
1207 ; SSE41-NEXT:    por %xmm6, %xmm0
1208 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm9
1209 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm5
1210 ; SSE41-NEXT:    paddq %xmm1, %xmm11
1211 ; SSE41-NEXT:    pxor %xmm7, %xmm1
1212 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
1213 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1214 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1215 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1216 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1217 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
1218 ; SSE41-NEXT:    pand %xmm4, %xmm0
1219 ; SSE41-NEXT:    por %xmm1, %xmm0
1220 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm11
1221 ; SSE41-NEXT:    paddq %xmm2, %xmm10
1222 ; SSE41-NEXT:    pxor %xmm7, %xmm2
1223 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
1224 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1225 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
1226 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1227 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1228 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1229 ; SSE41-NEXT:    pand %xmm1, %xmm0
1230 ; SSE41-NEXT:    por %xmm2, %xmm0
1231 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm10
1232 ; SSE41-NEXT:    paddq %xmm3, %xmm8
1233 ; SSE41-NEXT:    pxor %xmm7, %xmm3
1234 ; SSE41-NEXT:    pxor %xmm8, %xmm7
1235 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
1236 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm1
1237 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm3
1238 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1239 ; SSE41-NEXT:    pand %xmm1, %xmm0
1240 ; SSE41-NEXT:    por %xmm3, %xmm0
1241 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm8
1242 ; SSE41-NEXT:    movapd %xmm5, %xmm0
1243 ; SSE41-NEXT:    movapd %xmm11, %xmm1
1244 ; SSE41-NEXT:    movapd %xmm10, %xmm2
1245 ; SSE41-NEXT:    movapd %xmm8, %xmm3
1246 ; SSE41-NEXT:    retq
1248 ; AVX1-LABEL: v8i64:
1249 ; AVX1:       # %bb.0:
1250 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1251 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1252 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm9
1253 ; AVX1-NEXT:    vxorps %xmm7, %xmm7, %xmm7
1254 ; AVX1-NEXT:    vcmptrueps %ymm7, %ymm7, %ymm10
1255 ; AVX1-NEXT:    vxorps %ymm10, %ymm2, %ymm8
1256 ; AVX1-NEXT:    vextractf128 $1, %ymm8, %xmm6
1257 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm7
1258 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm7, %xmm7
1259 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm5, %xmm6, %xmm5
1260 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
1261 ; AVX1-NEXT:    vpaddq %xmm6, %xmm5, %xmm5
1262 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
1263 ; AVX1-NEXT:    vxorps %xmm4, %xmm8, %xmm7
1264 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
1265 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm8, %xmm0
1266 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
1267 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1268 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1269 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm8
1270 ; AVX1-NEXT:    vxorps %ymm10, %ymm3, %ymm6
1271 ; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm7
1272 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm5
1273 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm5, %xmm5
1274 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm7, %xmm2
1275 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
1276 ; AVX1-NEXT:    vpaddq %xmm5, %xmm2, %xmm2
1277 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm5
1278 ; AVX1-NEXT:    vxorps %xmm4, %xmm6, %xmm4
1279 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm4
1280 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm1, %xmm6, %xmm1
1281 ; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
1282 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1283 ; AVX1-NEXT:    retq
1285 ; AVX2-LABEL: v8i64:
1286 ; AVX2:       # %bb.0:
1287 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1288 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm5
1289 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1290 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm7
1291 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm7, %ymm5
1292 ; AVX2-NEXT:    vpcmpeqd %ymm7, %ymm7, %ymm7
1293 ; AVX2-NEXT:    vpxor %ymm7, %ymm2, %ymm8
1294 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm8, %ymm0
1295 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1296 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm2
1297 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm4
1298 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
1299 ; AVX2-NEXT:    vpxor %ymm7, %ymm3, %ymm4
1300 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm4, %ymm1
1301 ; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
1302 ; AVX2-NEXT:    retq
1304 ; AVX512-LABEL: v8i64:
1305 ; AVX512:       # %bb.0:
1306 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
1307 ; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
1308 ; AVX512-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1309 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1310 ; AVX512-NEXT:    retq
1311   %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1312   ret <8 x i64> %z
1315 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1316 ; SSE-LABEL: v2i128:
1317 ; SSE:       # %bb.0:
1318 ; SSE-NEXT:    movq %rdi, %rax
1319 ; SSE-NEXT:    addq %r9, %rsi
1320 ; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1321 ; SSE-NEXT:    movq $-1, %rdi
1322 ; SSE-NEXT:    cmovbq %rdi, %rsi
1323 ; SSE-NEXT:    cmovbq %rdi, %rdx
1324 ; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1325 ; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1326 ; SSE-NEXT:    cmovbq %rdi, %r8
1327 ; SSE-NEXT:    cmovbq %rdi, %rcx
1328 ; SSE-NEXT:    movq %r8, 24(%rax)
1329 ; SSE-NEXT:    movq %rcx, 16(%rax)
1330 ; SSE-NEXT:    movq %rdx, 8(%rax)
1331 ; SSE-NEXT:    movq %rsi, (%rax)
1332 ; SSE-NEXT:    retq
1334 ; AVX-LABEL: v2i128:
1335 ; AVX:       # %bb.0:
1336 ; AVX-NEXT:    movq %rdi, %rax
1337 ; AVX-NEXT:    addq %r9, %rsi
1338 ; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1339 ; AVX-NEXT:    movq $-1, %rdi
1340 ; AVX-NEXT:    cmovbq %rdi, %rsi
1341 ; AVX-NEXT:    cmovbq %rdi, %rdx
1342 ; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1343 ; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1344 ; AVX-NEXT:    cmovbq %rdi, %r8
1345 ; AVX-NEXT:    cmovbq %rdi, %rcx
1346 ; AVX-NEXT:    movq %r8, 24(%rax)
1347 ; AVX-NEXT:    movq %rcx, 16(%rax)
1348 ; AVX-NEXT:    movq %rdx, 8(%rax)
1349 ; AVX-NEXT:    movq %rsi, (%rax)
1350 ; AVX-NEXT:    retq
1351   %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1352   ret <2 x i128> %z