Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / uadd_sat_vec.ll
blob50c73009314a9db64afbf6c95c971ab248b48326
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=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
12 declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
46 ; SSE-LABEL: v16i8:
47 ; SSE:       # %bb.0:
48 ; SSE-NEXT:    paddusb %xmm1, %xmm0
49 ; SSE-NEXT:    retq
51 ; AVX-LABEL: v16i8:
52 ; AVX:       # %bb.0:
53 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
54 ; AVX-NEXT:    retq
55   %z = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56   ret <16 x i8> %z
59 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
60 ; SSE-LABEL: v32i8:
61 ; SSE:       # %bb.0:
62 ; SSE-NEXT:    paddusb %xmm2, %xmm0
63 ; SSE-NEXT:    paddusb %xmm3, %xmm1
64 ; SSE-NEXT:    retq
66 ; AVX1-LABEL: v32i8:
67 ; AVX1:       # %bb.0:
68 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
73 ; AVX1-NEXT:    retq
75 ; AVX2-LABEL: v32i8:
76 ; AVX2:       # %bb.0:
77 ; AVX2-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
78 ; AVX2-NEXT:    retq
80 ; AVX512-LABEL: v32i8:
81 ; AVX512:       # %bb.0:
82 ; AVX512-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
83 ; AVX512-NEXT:    retq
84   %z = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85   ret <32 x i8> %z
88 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
89 ; SSE-LABEL: v64i8:
90 ; SSE:       # %bb.0:
91 ; SSE-NEXT:    paddusb %xmm4, %xmm0
92 ; SSE-NEXT:    paddusb %xmm5, %xmm1
93 ; SSE-NEXT:    paddusb %xmm6, %xmm2
94 ; SSE-NEXT:    paddusb %xmm7, %xmm3
95 ; SSE-NEXT:    retq
97 ; AVX1-LABEL: v64i8:
98 ; AVX1:       # %bb.0:
99 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT:    vpaddusb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
103 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
104 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
105 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
106 ; AVX1-NEXT:    vpaddusb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
109 ; AVX1-NEXT:    retq
111 ; AVX2-LABEL: v64i8:
112 ; AVX2:       # %bb.0:
113 ; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT:    vpaddusb %ymm3, %ymm1, %ymm1
115 ; AVX2-NEXT:    retq
117 ; AVX512F-LABEL: v64i8:
118 ; AVX512F:       # %bb.0:
119 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT:    vpaddusb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
124 ; AVX512F-NEXT:    retq
126 ; AVX512BW-LABEL: v64i8:
127 ; AVX512BW:       # %bb.0:
128 ; AVX512BW-NEXT:    vpaddusb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT:    retq
130   %z = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
131   ret <64 x i8> %z
134 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
135 ; SSE-LABEL: v8i16:
136 ; SSE:       # %bb.0:
137 ; SSE-NEXT:    paddusw %xmm1, %xmm0
138 ; SSE-NEXT:    retq
140 ; AVX-LABEL: v8i16:
141 ; AVX:       # %bb.0:
142 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
143 ; AVX-NEXT:    retq
144   %z = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
145   ret <8 x i16> %z
148 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
149 ; SSE-LABEL: v16i16:
150 ; SSE:       # %bb.0:
151 ; SSE-NEXT:    paddusw %xmm2, %xmm0
152 ; SSE-NEXT:    paddusw %xmm3, %xmm1
153 ; SSE-NEXT:    retq
155 ; AVX1-LABEL: v16i16:
156 ; AVX1:       # %bb.0:
157 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
162 ; AVX1-NEXT:    retq
164 ; AVX2-LABEL: v16i16:
165 ; AVX2:       # %bb.0:
166 ; AVX2-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT:    retq
169 ; AVX512-LABEL: v16i16:
170 ; AVX512:       # %bb.0:
171 ; AVX512-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
172 ; AVX512-NEXT:    retq
173   %z = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
174   ret <16 x i16> %z
177 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
178 ; SSE-LABEL: v32i16:
179 ; SSE:       # %bb.0:
180 ; SSE-NEXT:    paddusw %xmm4, %xmm0
181 ; SSE-NEXT:    paddusw %xmm5, %xmm1
182 ; SSE-NEXT:    paddusw %xmm6, %xmm2
183 ; SSE-NEXT:    paddusw %xmm7, %xmm3
184 ; SSE-NEXT:    retq
186 ; AVX1-LABEL: v32i16:
187 ; AVX1:       # %bb.0:
188 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT:    vpaddusw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
193 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
194 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
195 ; AVX1-NEXT:    vpaddusw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
198 ; AVX1-NEXT:    retq
200 ; AVX2-LABEL: v32i16:
201 ; AVX2:       # %bb.0:
202 ; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT:    vpaddusw %ymm3, %ymm1, %ymm1
204 ; AVX2-NEXT:    retq
206 ; AVX512F-LABEL: v32i16:
207 ; AVX512F:       # %bb.0:
208 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT:    vpaddusw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
213 ; AVX512F-NEXT:    retq
215 ; AVX512BW-LABEL: v32i16:
216 ; AVX512BW:       # %bb.0:
217 ; AVX512BW-NEXT:    vpaddusw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT:    retq
219   %z = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
220   ret <32 x i16> %z
223 ; Too narrow vectors, legalized by widening.
225 define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind {
226 ; SSE-LABEL: v8i8:
227 ; SSE:       # %bb.0:
228 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
229 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
230 ; SSE-NEXT:    paddusb %xmm0, %xmm1
231 ; SSE-NEXT:    movq %xmm1, (%rdx)
232 ; SSE-NEXT:    retq
234 ; AVX-LABEL: v8i8:
235 ; AVX:       # %bb.0:
236 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
237 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
238 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
239 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
240 ; AVX-NEXT:    retq
241   %x = load <8 x i8>, ptr %px
242   %y = load <8 x i8>, ptr %py
243   %z = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244   store <8 x i8> %z, ptr %pz
245   ret void
248 define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind {
249 ; SSE-LABEL: v4i8:
250 ; SSE:       # %bb.0:
251 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE-NEXT:    paddusb %xmm0, %xmm1
254 ; SSE-NEXT:    movd %xmm1, (%rdx)
255 ; SSE-NEXT:    retq
257 ; AVX-LABEL: v4i8:
258 ; AVX:       # %bb.0:
259 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
262 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
263 ; AVX-NEXT:    retq
264   %x = load <4 x i8>, ptr %px
265   %y = load <4 x i8>, ptr %py
266   %z = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267   store <4 x i8> %z, ptr %pz
268   ret void
271 define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {
272 ; SSE2-LABEL: v2i8:
273 ; SSE2:       # %bb.0:
274 ; SSE2-NEXT:    movzwl (%rdi), %eax
275 ; SSE2-NEXT:    movd %eax, %xmm0
276 ; SSE2-NEXT:    movzwl (%rsi), %eax
277 ; SSE2-NEXT:    movd %eax, %xmm1
278 ; SSE2-NEXT:    paddusb %xmm0, %xmm1
279 ; SSE2-NEXT:    movd %xmm1, %eax
280 ; SSE2-NEXT:    movw %ax, (%rdx)
281 ; SSE2-NEXT:    retq
283 ; SSSE3-LABEL: v2i8:
284 ; SSSE3:       # %bb.0:
285 ; SSSE3-NEXT:    movzwl (%rdi), %eax
286 ; SSSE3-NEXT:    movd %eax, %xmm0
287 ; SSSE3-NEXT:    movzwl (%rsi), %eax
288 ; SSSE3-NEXT:    movd %eax, %xmm1
289 ; SSSE3-NEXT:    paddusb %xmm0, %xmm1
290 ; SSSE3-NEXT:    movd %xmm1, %eax
291 ; SSSE3-NEXT:    movw %ax, (%rdx)
292 ; SSSE3-NEXT:    retq
294 ; SSE41-LABEL: v2i8:
295 ; SSE41:       # %bb.0:
296 ; SSE41-NEXT:    movzwl (%rdi), %eax
297 ; SSE41-NEXT:    movd %eax, %xmm0
298 ; SSE41-NEXT:    movzwl (%rsi), %eax
299 ; SSE41-NEXT:    movd %eax, %xmm1
300 ; SSE41-NEXT:    paddusb %xmm0, %xmm1
301 ; SSE41-NEXT:    pextrw $0, %xmm1, (%rdx)
302 ; SSE41-NEXT:    retq
304 ; AVX-LABEL: v2i8:
305 ; AVX:       # %bb.0:
306 ; AVX-NEXT:    movzwl (%rdi), %eax
307 ; AVX-NEXT:    vmovd %eax, %xmm0
308 ; AVX-NEXT:    movzwl (%rsi), %eax
309 ; AVX-NEXT:    vmovd %eax, %xmm1
310 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
311 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
312 ; AVX-NEXT:    retq
313   %x = load <2 x i8>, ptr %px
314   %y = load <2 x i8>, ptr %py
315   %z = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316   store <2 x i8> %z, ptr %pz
317   ret void
320 define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind {
321 ; SSE-LABEL: v4i16:
322 ; SSE:       # %bb.0:
323 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
324 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
325 ; SSE-NEXT:    paddusw %xmm0, %xmm1
326 ; SSE-NEXT:    movq %xmm1, (%rdx)
327 ; SSE-NEXT:    retq
329 ; AVX-LABEL: v4i16:
330 ; AVX:       # %bb.0:
331 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
332 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
333 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
334 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
335 ; AVX-NEXT:    retq
336   %x = load <4 x i16>, ptr %px
337   %y = load <4 x i16>, ptr %py
338   %z = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339   store <4 x i16> %z, ptr %pz
340   ret void
343 define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind {
344 ; SSE-LABEL: v2i16:
345 ; SSE:       # %bb.0:
346 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348 ; SSE-NEXT:    paddusw %xmm0, %xmm1
349 ; SSE-NEXT:    movd %xmm1, (%rdx)
350 ; SSE-NEXT:    retq
352 ; AVX-LABEL: v2i16:
353 ; AVX:       # %bb.0:
354 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
357 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
358 ; AVX-NEXT:    retq
359   %x = load <2 x i16>, ptr %px
360   %y = load <2 x i16>, ptr %py
361   %z = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362   store <2 x i16> %z, ptr %pz
363   ret void
366 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
367 ; SSE-LABEL: v12i8:
368 ; SSE:       # %bb.0:
369 ; SSE-NEXT:    paddusb %xmm1, %xmm0
370 ; SSE-NEXT:    retq
372 ; AVX-LABEL: v12i8:
373 ; AVX:       # %bb.0:
374 ; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
375 ; AVX-NEXT:    retq
376   %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
377   ret <12 x i8> %z
380 define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {
381 ; SSE-LABEL: v12i16:
382 ; SSE:       # %bb.0:
383 ; SSE-NEXT:    movdqa (%rdi), %xmm0
384 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
385 ; SSE-NEXT:    paddusw 16(%rsi), %xmm1
386 ; SSE-NEXT:    paddusw (%rsi), %xmm0
387 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
388 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
389 ; SSE-NEXT:    retq
391 ; AVX1-LABEL: v12i16:
392 ; AVX1:       # %bb.0:
393 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
394 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
395 ; AVX1-NEXT:    vpaddusw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT:    vpaddusw (%rsi), %xmm0, %xmm0
397 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
398 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
399 ; AVX1-NEXT:    retq
401 ; AVX2-LABEL: v12i16:
402 ; AVX2:       # %bb.0:
403 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
407 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
408 ; AVX2-NEXT:    vzeroupper
409 ; AVX2-NEXT:    retq
411 ; AVX512-LABEL: v12i16:
412 ; AVX512:       # %bb.0:
413 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
414 ; AVX512-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
415 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
416 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
417 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
418 ; AVX512-NEXT:    vzeroupper
419 ; AVX512-NEXT:    retq
420   %x = load <12 x i16>, ptr %px
421   %y = load <12 x i16>, ptr %py
422   %z = call <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423   store <12 x i16> %z, ptr %pz
424   ret void
427 ; Scalarization
429 define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
430 ; SSE-LABEL: v1i8:
431 ; SSE:       # %bb.0:
432 ; SSE-NEXT:    movzbl (%rdi), %eax
433 ; SSE-NEXT:    addb (%rsi), %al
434 ; SSE-NEXT:    movzbl %al, %eax
435 ; SSE-NEXT:    movl $255, %ecx
436 ; SSE-NEXT:    cmovael %eax, %ecx
437 ; SSE-NEXT:    movb %cl, (%rdx)
438 ; SSE-NEXT:    retq
440 ; AVX-LABEL: v1i8:
441 ; AVX:       # %bb.0:
442 ; AVX-NEXT:    movzbl (%rdi), %eax
443 ; AVX-NEXT:    addb (%rsi), %al
444 ; AVX-NEXT:    movzbl %al, %eax
445 ; AVX-NEXT:    movl $255, %ecx
446 ; AVX-NEXT:    cmovael %eax, %ecx
447 ; AVX-NEXT:    movb %cl, (%rdx)
448 ; AVX-NEXT:    retq
449   %x = load <1 x i8>, ptr %px
450   %y = load <1 x i8>, ptr %py
451   %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
452   store <1 x i8> %z, ptr %pz
453   ret void
456 define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {
457 ; SSE-LABEL: v1i16:
458 ; SSE:       # %bb.0:
459 ; SSE-NEXT:    movzwl (%rdi), %eax
460 ; SSE-NEXT:    addw (%rsi), %ax
461 ; SSE-NEXT:    movl $65535, %ecx # imm = 0xFFFF
462 ; SSE-NEXT:    cmovael %eax, %ecx
463 ; SSE-NEXT:    movw %cx, (%rdx)
464 ; SSE-NEXT:    retq
466 ; AVX-LABEL: v1i16:
467 ; AVX:       # %bb.0:
468 ; AVX-NEXT:    movzwl (%rdi), %eax
469 ; AVX-NEXT:    addw (%rsi), %ax
470 ; AVX-NEXT:    movl $65535, %ecx # imm = 0xFFFF
471 ; AVX-NEXT:    cmovael %eax, %ecx
472 ; AVX-NEXT:    movw %cx, (%rdx)
473 ; AVX-NEXT:    retq
474   %x = load <1 x i16>, ptr %px
475   %y = load <1 x i16>, ptr %py
476   %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
477   store <1 x i16> %z, ptr %pz
478   ret void
481 ; Promotion
483 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
484 ; SSE-LABEL: v16i4:
485 ; SSE:       # %bb.0:
486 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
487 ; SSE-NEXT:    pand %xmm2, %xmm1
488 ; SSE-NEXT:    pand %xmm2, %xmm0
489 ; SSE-NEXT:    paddb %xmm1, %xmm0
490 ; SSE-NEXT:    pminub %xmm2, %xmm0
491 ; SSE-NEXT:    retq
493 ; AVX1-LABEL: v16i4:
494 ; AVX1:       # %bb.0:
495 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
496 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
497 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
498 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
499 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
500 ; AVX1-NEXT:    retq
502 ; AVX2-LABEL: v16i4:
503 ; AVX2:       # %bb.0:
504 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
505 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
506 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
507 ; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
508 ; AVX2-NEXT:    vpminub %xmm2, %xmm0, %xmm0
509 ; AVX2-NEXT:    retq
511 ; AVX512-LABEL: v16i4:
512 ; AVX512:       # %bb.0:
513 ; AVX512-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
514 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm1
515 ; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm0
516 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
517 ; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0
518 ; AVX512-NEXT:    retq
519   %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
520   ret <16 x i4> %z
523 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
524 ; SSE-LABEL: v16i1:
525 ; SSE:       # %bb.0:
526 ; SSE-NEXT:    orps %xmm1, %xmm0
527 ; SSE-NEXT:    retq
529 ; AVX-LABEL: v16i1:
530 ; AVX:       # %bb.0:
531 ; AVX-NEXT:    vorps %xmm1, %xmm0, %xmm0
532 ; AVX-NEXT:    retq
533   %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
534   ret <16 x i1> %z
537 ; Expanded
539 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
540 ; SSE2-LABEL: v2i32:
541 ; SSE2:       # %bb.0:
542 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
543 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
544 ; SSE2-NEXT:    pxor %xmm2, %xmm3
545 ; SSE2-NEXT:    paddd %xmm1, %xmm0
546 ; SSE2-NEXT:    pxor %xmm0, %xmm2
547 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
548 ; SSE2-NEXT:    por %xmm3, %xmm0
549 ; SSE2-NEXT:    retq
551 ; SSSE3-LABEL: v2i32:
552 ; SSSE3:       # %bb.0:
553 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
554 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
555 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
556 ; SSSE3-NEXT:    paddd %xmm1, %xmm0
557 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
558 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
559 ; SSSE3-NEXT:    por %xmm3, %xmm0
560 ; SSSE3-NEXT:    retq
562 ; SSE41-LABEL: v2i32:
563 ; SSE41:       # %bb.0:
564 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
565 ; SSE41-NEXT:    pxor %xmm1, %xmm2
566 ; SSE41-NEXT:    pminud %xmm2, %xmm0
567 ; SSE41-NEXT:    paddd %xmm1, %xmm0
568 ; SSE41-NEXT:    retq
570 ; AVX1-LABEL: v2i32:
571 ; AVX1:       # %bb.0:
572 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
573 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
574 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
575 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
576 ; AVX1-NEXT:    retq
578 ; AVX2-LABEL: v2i32:
579 ; AVX2:       # %bb.0:
580 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
581 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
582 ; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0
583 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
584 ; AVX2-NEXT:    retq
586 ; AVX512F-LABEL: v2i32:
587 ; AVX512F:       # %bb.0:
588 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
589 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm2
590 ; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
591 ; AVX512F-NEXT:    vpminud %xmm2, %xmm0, %xmm0
592 ; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
593 ; AVX512F-NEXT:    vzeroupper
594 ; AVX512F-NEXT:    retq
596 ; AVX512BW-LABEL: v2i32:
597 ; AVX512BW:       # %bb.0:
598 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
599 ; AVX512BW-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
600 ; AVX512BW-NEXT:    vpminud %xmm2, %xmm0, %xmm0
601 ; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
602 ; AVX512BW-NEXT:    retq
603   %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
604   ret <2 x i32> %z
607 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
608 ; SSE2-LABEL: v4i32:
609 ; SSE2:       # %bb.0:
610 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
611 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
612 ; SSE2-NEXT:    pxor %xmm2, %xmm3
613 ; SSE2-NEXT:    paddd %xmm1, %xmm0
614 ; SSE2-NEXT:    pxor %xmm0, %xmm2
615 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
616 ; SSE2-NEXT:    por %xmm3, %xmm0
617 ; SSE2-NEXT:    retq
619 ; SSSE3-LABEL: v4i32:
620 ; SSSE3:       # %bb.0:
621 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
622 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
623 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
624 ; SSSE3-NEXT:    paddd %xmm1, %xmm0
625 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
626 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
627 ; SSSE3-NEXT:    por %xmm3, %xmm0
628 ; SSSE3-NEXT:    retq
630 ; SSE41-LABEL: v4i32:
631 ; SSE41:       # %bb.0:
632 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
633 ; SSE41-NEXT:    pxor %xmm1, %xmm2
634 ; SSE41-NEXT:    pminud %xmm2, %xmm0
635 ; SSE41-NEXT:    paddd %xmm1, %xmm0
636 ; SSE41-NEXT:    retq
638 ; AVX1-LABEL: v4i32:
639 ; AVX1:       # %bb.0:
640 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
641 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
642 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
643 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
644 ; AVX1-NEXT:    retq
646 ; AVX2-LABEL: v4i32:
647 ; AVX2:       # %bb.0:
648 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
649 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
650 ; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0
651 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
652 ; AVX2-NEXT:    retq
654 ; AVX512F-LABEL: v4i32:
655 ; AVX512F:       # %bb.0:
656 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
657 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm2
658 ; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
659 ; AVX512F-NEXT:    vpminud %xmm2, %xmm0, %xmm0
660 ; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
661 ; AVX512F-NEXT:    vzeroupper
662 ; AVX512F-NEXT:    retq
664 ; AVX512BW-LABEL: v4i32:
665 ; AVX512BW:       # %bb.0:
666 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
667 ; AVX512BW-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
668 ; AVX512BW-NEXT:    vpminud %xmm2, %xmm0, %xmm0
669 ; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
670 ; AVX512BW-NEXT:    retq
671   %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
672   ret <4 x i32> %z
675 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
676 ; SSE2-LABEL: v8i32:
677 ; SSE2:       # %bb.0:
678 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
679 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
680 ; SSE2-NEXT:    pxor %xmm4, %xmm5
681 ; SSE2-NEXT:    paddd %xmm2, %xmm0
682 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
683 ; SSE2-NEXT:    pxor %xmm4, %xmm2
684 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
685 ; SSE2-NEXT:    por %xmm5, %xmm0
686 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
687 ; SSE2-NEXT:    pxor %xmm4, %xmm2
688 ; SSE2-NEXT:    paddd %xmm3, %xmm1
689 ; SSE2-NEXT:    pxor %xmm1, %xmm4
690 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
691 ; SSE2-NEXT:    por %xmm2, %xmm1
692 ; SSE2-NEXT:    retq
694 ; SSSE3-LABEL: v8i32:
695 ; SSSE3:       # %bb.0:
696 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
697 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
698 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
699 ; SSSE3-NEXT:    paddd %xmm2, %xmm0
700 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
701 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
702 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
703 ; SSSE3-NEXT:    por %xmm5, %xmm0
704 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
705 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
706 ; SSSE3-NEXT:    paddd %xmm3, %xmm1
707 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
708 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
709 ; SSSE3-NEXT:    por %xmm2, %xmm1
710 ; SSSE3-NEXT:    retq
712 ; SSE41-LABEL: v8i32:
713 ; SSE41:       # %bb.0:
714 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
715 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
716 ; SSE41-NEXT:    pxor %xmm4, %xmm5
717 ; SSE41-NEXT:    pminud %xmm5, %xmm0
718 ; SSE41-NEXT:    paddd %xmm2, %xmm0
719 ; SSE41-NEXT:    pxor %xmm3, %xmm4
720 ; SSE41-NEXT:    pminud %xmm4, %xmm1
721 ; SSE41-NEXT:    paddd %xmm3, %xmm1
722 ; SSE41-NEXT:    retq
724 ; AVX1-LABEL: v8i32:
725 ; AVX1:       # %bb.0:
726 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
727 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
728 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
729 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
730 ; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
731 ; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm2
732 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm3
733 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm0
734 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
735 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
736 ; AVX1-NEXT:    retq
738 ; AVX2-LABEL: v8i32:
739 ; AVX2:       # %bb.0:
740 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
741 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
742 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
743 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
744 ; AVX2-NEXT:    retq
746 ; AVX512F-LABEL: v8i32:
747 ; AVX512F:       # %bb.0:
748 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
749 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm2
750 ; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
751 ; AVX512F-NEXT:    vpminud %ymm2, %ymm0, %ymm0
752 ; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
753 ; AVX512F-NEXT:    retq
755 ; AVX512BW-LABEL: v8i32:
756 ; AVX512BW:       # %bb.0:
757 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm2
758 ; AVX512BW-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
759 ; AVX512BW-NEXT:    vpminud %ymm2, %ymm0, %ymm0
760 ; AVX512BW-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
761 ; AVX512BW-NEXT:    retq
762   %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
763   ret <8 x i32> %z
766 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
767 ; SSE2-LABEL: v16i32:
768 ; SSE2:       # %bb.0:
769 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
770 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
771 ; SSE2-NEXT:    pxor %xmm8, %xmm9
772 ; SSE2-NEXT:    paddd %xmm4, %xmm0
773 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
774 ; SSE2-NEXT:    pxor %xmm8, %xmm4
775 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
776 ; SSE2-NEXT:    por %xmm9, %xmm0
777 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
778 ; SSE2-NEXT:    pxor %xmm8, %xmm4
779 ; SSE2-NEXT:    paddd %xmm5, %xmm1
780 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
781 ; SSE2-NEXT:    pxor %xmm8, %xmm5
782 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
783 ; SSE2-NEXT:    por %xmm4, %xmm1
784 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
785 ; SSE2-NEXT:    pxor %xmm8, %xmm4
786 ; SSE2-NEXT:    paddd %xmm6, %xmm2
787 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
788 ; SSE2-NEXT:    pxor %xmm8, %xmm5
789 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
790 ; SSE2-NEXT:    por %xmm4, %xmm2
791 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
792 ; SSE2-NEXT:    pxor %xmm8, %xmm4
793 ; SSE2-NEXT:    paddd %xmm7, %xmm3
794 ; SSE2-NEXT:    pxor %xmm3, %xmm8
795 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
796 ; SSE2-NEXT:    por %xmm4, %xmm3
797 ; SSE2-NEXT:    retq
799 ; SSSE3-LABEL: v16i32:
800 ; SSSE3:       # %bb.0:
801 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
802 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
803 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
804 ; SSSE3-NEXT:    paddd %xmm4, %xmm0
805 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
806 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
807 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
808 ; SSSE3-NEXT:    por %xmm9, %xmm0
809 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
810 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
811 ; SSSE3-NEXT:    paddd %xmm5, %xmm1
812 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
813 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
814 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
815 ; SSSE3-NEXT:    por %xmm4, %xmm1
816 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
817 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
818 ; SSSE3-NEXT:    paddd %xmm6, %xmm2
819 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
820 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
821 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
822 ; SSSE3-NEXT:    por %xmm4, %xmm2
823 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
824 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
825 ; SSSE3-NEXT:    paddd %xmm7, %xmm3
826 ; SSSE3-NEXT:    pxor %xmm3, %xmm8
827 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
828 ; SSSE3-NEXT:    por %xmm4, %xmm3
829 ; SSSE3-NEXT:    retq
831 ; SSE41-LABEL: v16i32:
832 ; SSE41:       # %bb.0:
833 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
834 ; SSE41-NEXT:    movdqa %xmm4, %xmm9
835 ; SSE41-NEXT:    pxor %xmm8, %xmm9
836 ; SSE41-NEXT:    pminud %xmm9, %xmm0
837 ; SSE41-NEXT:    paddd %xmm4, %xmm0
838 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
839 ; SSE41-NEXT:    pxor %xmm8, %xmm4
840 ; SSE41-NEXT:    pminud %xmm4, %xmm1
841 ; SSE41-NEXT:    paddd %xmm5, %xmm1
842 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
843 ; SSE41-NEXT:    pxor %xmm8, %xmm4
844 ; SSE41-NEXT:    pminud %xmm4, %xmm2
845 ; SSE41-NEXT:    paddd %xmm6, %xmm2
846 ; SSE41-NEXT:    pxor %xmm7, %xmm8
847 ; SSE41-NEXT:    pminud %xmm8, %xmm3
848 ; SSE41-NEXT:    paddd %xmm7, %xmm3
849 ; SSE41-NEXT:    retq
851 ; AVX1-LABEL: v16i32:
852 ; AVX1:       # %bb.0:
853 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
854 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
855 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm6
856 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
857 ; AVX1-NEXT:    vpminud %xmm6, %xmm7, %xmm6
858 ; AVX1-NEXT:    vpaddd %xmm4, %xmm6, %xmm4
859 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm6
860 ; AVX1-NEXT:    vpminud %xmm6, %xmm0, %xmm0
861 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
862 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
863 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
864 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm4
865 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
866 ; AVX1-NEXT:    vpminud %xmm4, %xmm6, %xmm4
867 ; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm2
868 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm4
869 ; AVX1-NEXT:    vpminud %xmm4, %xmm1, %xmm1
870 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
871 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
872 ; AVX1-NEXT:    retq
874 ; AVX2-LABEL: v16i32:
875 ; AVX2:       # %bb.0:
876 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
877 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
878 ; AVX2-NEXT:    vpminud %ymm5, %ymm0, %ymm0
879 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
880 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
881 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
882 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
883 ; AVX2-NEXT:    retq
885 ; AVX512-LABEL: v16i32:
886 ; AVX512:       # %bb.0:
887 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
888 ; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
889 ; AVX512-NEXT:    vpminud %zmm2, %zmm0, %zmm0
890 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
891 ; AVX512-NEXT:    retq
892   %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
893   ret <16 x i32> %z
896 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
897 ; SSE-LABEL: v2i64:
898 ; SSE:       # %bb.0:
899 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
900 ; SSE-NEXT:    movdqa %xmm0, %xmm3
901 ; SSE-NEXT:    pxor %xmm2, %xmm3
902 ; SSE-NEXT:    paddq %xmm1, %xmm0
903 ; SSE-NEXT:    pxor %xmm0, %xmm2
904 ; SSE-NEXT:    movdqa %xmm3, %xmm1
905 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
906 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
907 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
908 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
909 ; SSE-NEXT:    pand %xmm4, %xmm2
910 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
911 ; SSE-NEXT:    por %xmm1, %xmm0
912 ; SSE-NEXT:    por %xmm2, %xmm0
913 ; SSE-NEXT:    retq
915 ; AVX1-LABEL: v2i64:
916 ; AVX1:       # %bb.0:
917 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
918 ; AVX1-NEXT:    # xmm2 = mem[0,0]
919 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
920 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
921 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm1
922 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
923 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
924 ; AVX1-NEXT:    retq
926 ; AVX2-LABEL: v2i64:
927 ; AVX2:       # %bb.0:
928 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
929 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
930 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
931 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm1
932 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
933 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
934 ; AVX2-NEXT:    retq
936 ; AVX512F-LABEL: v2i64:
937 ; AVX512F:       # %bb.0:
938 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
939 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
940 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm2
941 ; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
942 ; AVX512F-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
943 ; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
944 ; AVX512F-NEXT:    vzeroupper
945 ; AVX512F-NEXT:    retq
947 ; AVX512BW-LABEL: v2i64:
948 ; AVX512BW:       # %bb.0:
949 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
950 ; AVX512BW-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
951 ; AVX512BW-NEXT:    vpminuq %xmm2, %xmm0, %xmm0
952 ; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
953 ; AVX512BW-NEXT:    retq
954   %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
955   ret <2 x i64> %z
958 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
959 ; SSE-LABEL: v4i64:
960 ; SSE:       # %bb.0:
961 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
962 ; SSE-NEXT:    movdqa %xmm0, %xmm5
963 ; SSE-NEXT:    pxor %xmm4, %xmm5
964 ; SSE-NEXT:    paddq %xmm2, %xmm0
965 ; SSE-NEXT:    movdqa %xmm0, %xmm2
966 ; SSE-NEXT:    pxor %xmm4, %xmm2
967 ; SSE-NEXT:    movdqa %xmm5, %xmm6
968 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm6
969 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
970 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm2
971 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
972 ; SSE-NEXT:    pand %xmm7, %xmm2
973 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
974 ; SSE-NEXT:    por %xmm5, %xmm0
975 ; SSE-NEXT:    por %xmm2, %xmm0
976 ; SSE-NEXT:    movdqa %xmm1, %xmm2
977 ; SSE-NEXT:    pxor %xmm4, %xmm2
978 ; SSE-NEXT:    paddq %xmm3, %xmm1
979 ; SSE-NEXT:    pxor %xmm1, %xmm4
980 ; SSE-NEXT:    movdqa %xmm2, %xmm3
981 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm3
982 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
983 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm4
984 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
985 ; SSE-NEXT:    pand %xmm5, %xmm2
986 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
987 ; SSE-NEXT:    por %xmm3, %xmm1
988 ; SSE-NEXT:    por %xmm2, %xmm1
989 ; SSE-NEXT:    retq
991 ; AVX1-LABEL: v4i64:
992 ; AVX1:       # %bb.0:
993 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
994 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
995 ; AVX1-NEXT:    # xmm3 = mem[0,0]
996 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
997 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
998 ; AVX1-NEXT:    vpaddq %xmm5, %xmm2, %xmm2
999 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm5
1000 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm4
1001 ; AVX1-NEXT:    vpor %xmm4, %xmm2, %xmm2
1002 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm4
1003 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1004 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm1
1005 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
1006 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1007 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1008 ; AVX1-NEXT:    retq
1010 ; AVX2-LABEL: v4i64:
1011 ; AVX2:       # %bb.0:
1012 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1013 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1014 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1015 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm1
1016 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm1
1017 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1018 ; AVX2-NEXT:    retq
1020 ; AVX512F-LABEL: v4i64:
1021 ; AVX512F:       # %bb.0:
1022 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1023 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1024 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm2
1025 ; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
1026 ; AVX512F-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1027 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1028 ; AVX512F-NEXT:    retq
1030 ; AVX512BW-LABEL: v4i64:
1031 ; AVX512BW:       # %bb.0:
1032 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm2
1033 ; AVX512BW-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
1034 ; AVX512BW-NEXT:    vpminuq %ymm2, %ymm0, %ymm0
1035 ; AVX512BW-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1036 ; AVX512BW-NEXT:    retq
1037   %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1038   ret <4 x i64> %z
1041 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1042 ; SSE-LABEL: v8i64:
1043 ; SSE:       # %bb.0:
1044 ; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1045 ; SSE-NEXT:    movdqa %xmm0, %xmm9
1046 ; SSE-NEXT:    pxor %xmm8, %xmm9
1047 ; SSE-NEXT:    paddq %xmm4, %xmm0
1048 ; SSE-NEXT:    movdqa %xmm0, %xmm4
1049 ; SSE-NEXT:    pxor %xmm8, %xmm4
1050 ; SSE-NEXT:    movdqa %xmm9, %xmm10
1051 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm10
1052 ; SSE-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1053 ; SSE-NEXT:    pcmpeqd %xmm9, %xmm4
1054 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1055 ; SSE-NEXT:    pand %xmm11, %xmm4
1056 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1057 ; SSE-NEXT:    por %xmm9, %xmm0
1058 ; SSE-NEXT:    por %xmm4, %xmm0
1059 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1060 ; SSE-NEXT:    pxor %xmm8, %xmm4
1061 ; SSE-NEXT:    paddq %xmm5, %xmm1
1062 ; SSE-NEXT:    movdqa %xmm1, %xmm5
1063 ; SSE-NEXT:    pxor %xmm8, %xmm5
1064 ; SSE-NEXT:    movdqa %xmm4, %xmm9
1065 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm9
1066 ; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1067 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
1068 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1069 ; SSE-NEXT:    pand %xmm10, %xmm4
1070 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1071 ; SSE-NEXT:    por %xmm5, %xmm1
1072 ; SSE-NEXT:    por %xmm4, %xmm1
1073 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1074 ; SSE-NEXT:    pxor %xmm8, %xmm4
1075 ; SSE-NEXT:    paddq %xmm6, %xmm2
1076 ; SSE-NEXT:    movdqa %xmm2, %xmm5
1077 ; SSE-NEXT:    pxor %xmm8, %xmm5
1078 ; SSE-NEXT:    movdqa %xmm4, %xmm6
1079 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
1080 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1081 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
1082 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1083 ; SSE-NEXT:    pand %xmm9, %xmm4
1084 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1085 ; SSE-NEXT:    por %xmm5, %xmm2
1086 ; SSE-NEXT:    por %xmm4, %xmm2
1087 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1088 ; SSE-NEXT:    pxor %xmm8, %xmm4
1089 ; SSE-NEXT:    paddq %xmm7, %xmm3
1090 ; SSE-NEXT:    pxor %xmm3, %xmm8
1091 ; SSE-NEXT:    movdqa %xmm4, %xmm5
1092 ; SSE-NEXT:    pcmpgtd %xmm8, %xmm5
1093 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1094 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm8
1095 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1096 ; SSE-NEXT:    pand %xmm6, %xmm4
1097 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1098 ; SSE-NEXT:    por %xmm5, %xmm3
1099 ; SSE-NEXT:    por %xmm4, %xmm3
1100 ; SSE-NEXT:    retq
1102 ; AVX1-LABEL: v8i64:
1103 ; AVX1:       # %bb.0:
1104 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1105 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1106 ; AVX1-NEXT:    # xmm5 = mem[0,0]
1107 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm6
1108 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
1109 ; AVX1-NEXT:    vpaddq %xmm7, %xmm4, %xmm4
1110 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm7
1111 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
1112 ; AVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1113 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm6
1114 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
1115 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm2
1116 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
1117 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1118 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1119 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1120 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm4
1121 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
1122 ; AVX1-NEXT:    vpaddq %xmm6, %xmm2, %xmm2
1123 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm6
1124 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm4, %xmm4
1125 ; AVX1-NEXT:    vpor %xmm4, %xmm2, %xmm2
1126 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm4
1127 ; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
1128 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm3
1129 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1130 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
1131 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1132 ; AVX1-NEXT:    retq
1134 ; AVX2-LABEL: v8i64:
1135 ; AVX2:       # %bb.0:
1136 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1137 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm5
1138 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1139 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm2
1140 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm5, %ymm2
1141 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
1142 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm2
1143 ; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
1144 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm3
1145 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
1146 ; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
1147 ; AVX2-NEXT:    retq
1149 ; AVX512-LABEL: v8i64:
1150 ; AVX512:       # %bb.0:
1151 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
1152 ; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
1153 ; AVX512-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1154 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1155 ; AVX512-NEXT:    retq
1156   %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1157   ret <8 x i64> %z
1160 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1161 ; SSE-LABEL: v2i128:
1162 ; SSE:       # %bb.0:
1163 ; SSE-NEXT:    movq %rdi, %rax
1164 ; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rsi
1165 ; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1166 ; SSE-NEXT:    movq $-1, %rdi
1167 ; SSE-NEXT:    cmovbq %rdi, %rdx
1168 ; SSE-NEXT:    cmovbq %rdi, %rsi
1169 ; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1170 ; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1171 ; SSE-NEXT:    cmovbq %rdi, %r8
1172 ; SSE-NEXT:    cmovbq %rdi, %rcx
1173 ; SSE-NEXT:    movq %r8, 24(%rax)
1174 ; SSE-NEXT:    movq %rcx, 16(%rax)
1175 ; SSE-NEXT:    movq %rdx, 8(%rax)
1176 ; SSE-NEXT:    movq %rsi, (%rax)
1177 ; SSE-NEXT:    retq
1179 ; AVX-LABEL: v2i128:
1180 ; AVX:       # %bb.0:
1181 ; AVX-NEXT:    movq %rdi, %rax
1182 ; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rsi
1183 ; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1184 ; AVX-NEXT:    movq $-1, %rdi
1185 ; AVX-NEXT:    cmovbq %rdi, %rdx
1186 ; AVX-NEXT:    cmovbq %rdi, %rsi
1187 ; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1188 ; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1189 ; AVX-NEXT:    cmovbq %rdi, %r8
1190 ; AVX-NEXT:    cmovbq %rdi, %rcx
1191 ; AVX-NEXT:    movq %r8, 24(%rax)
1192 ; AVX-NEXT:    movq %rcx, 16(%rax)
1193 ; AVX-NEXT:    movq %rdx, 8(%rax)
1194 ; AVX-NEXT:    movq %rsi, (%rax)
1195 ; AVX-NEXT:    retq
1196   %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1197   ret <2 x i128> %z