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
8
9declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
10declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
11declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
12declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
13declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
14declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
15declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
16declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
17
18declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
19declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
20declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
21declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
22declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
23declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
24declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
25
26declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
27declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
28
29declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
30declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
31declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
32declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
33declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
34declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
35declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
36
37declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
38declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>)
39
40; Legal types, depending on architecture.
41
42define <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
47;
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
54}
55
56define <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
62;
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
71;
72; AVX2-LABEL: v32i8:
73; AVX2:       # %bb.0:
74; AVX2-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
75; AVX2-NEXT:    retq
76;
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
83}
84
85define <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
93;
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
107;
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
113;
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
120}
121
122define <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
127;
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
134}
135
136define <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
142;
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
151;
152; AVX2-LABEL: v16i16:
153; AVX2:       # %bb.0:
154; AVX2-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
155; AVX2-NEXT:    retq
156;
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
163}
164
165define <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
173;
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
187;
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
193;
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
200}
201
202; Too narrow vectors, legalized by widening.
203
204define 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
212;
213; AVX1-LABEL: v8i8:
214; AVX1:       # %bb.0:
215; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
218; AVX1-NEXT:    vmovq %xmm0, (%rdx)
219; AVX1-NEXT:    retq
220;
221; AVX2-LABEL: v8i8:
222; AVX2:       # %bb.0:
223; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
224; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
225; AVX2-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
226; AVX2-NEXT:    vmovq %xmm0, (%rdx)
227; AVX2-NEXT:    retq
228;
229; AVX512-LABEL: v8i8:
230; AVX512:       # %bb.0:
231; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
232; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
233; AVX512-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
234; AVX512-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
235; AVX512-NEXT:    vpmovwb %xmm0, (%rdx)
236; AVX512-NEXT:    retq
237  %x = load <8 x i8>, <8 x i8>* %px
238  %y = load <8 x i8>, <8 x i8>* %py
239  %z = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
240  store <8 x i8> %z, <8 x i8>* %pz
241  ret void
242}
243
244define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
245; SSE-LABEL: v4i8:
246; SSE:       # %bb.0:
247; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
248; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
249; SSE-NEXT:    paddusb %xmm0, %xmm1
250; SSE-NEXT:    movd %xmm1, (%rdx)
251; SSE-NEXT:    retq
252;
253; AVX1-LABEL: v4i8:
254; AVX1:       # %bb.0:
255; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
256; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
257; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
258; AVX1-NEXT:    vmovd %xmm0, (%rdx)
259; AVX1-NEXT:    retq
260;
261; AVX2-LABEL: v4i8:
262; AVX2:       # %bb.0:
263; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
264; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
265; AVX2-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
266; AVX2-NEXT:    vmovd %xmm0, (%rdx)
267; AVX2-NEXT:    retq
268;
269; AVX512-LABEL: v4i8:
270; AVX512:       # %bb.0:
271; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
272; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
273; AVX512-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
274; AVX512-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
275; AVX512-NEXT:    vpmovdb %xmm0, (%rdx)
276; AVX512-NEXT:    retq
277  %x = load <4 x i8>, <4 x i8>* %px
278  %y = load <4 x i8>, <4 x i8>* %py
279  %z = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
280  store <4 x i8> %z, <4 x i8>* %pz
281  ret void
282}
283
284define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
285; SSE2-LABEL: v2i8:
286; SSE2:       # %bb.0:
287; SSE2-NEXT:    movzwl (%rdi), %eax
288; SSE2-NEXT:    movd %eax, %xmm0
289; SSE2-NEXT:    movzwl (%rsi), %eax
290; SSE2-NEXT:    movd %eax, %xmm1
291; SSE2-NEXT:    paddusb %xmm0, %xmm1
292; SSE2-NEXT:    movd %xmm1, %eax
293; SSE2-NEXT:    movw %ax, (%rdx)
294; SSE2-NEXT:    retq
295;
296; SSSE3-LABEL: v2i8:
297; SSSE3:       # %bb.0:
298; SSSE3-NEXT:    movzwl (%rdi), %eax
299; SSSE3-NEXT:    movd %eax, %xmm0
300; SSSE3-NEXT:    movzwl (%rsi), %eax
301; SSSE3-NEXT:    movd %eax, %xmm1
302; SSSE3-NEXT:    paddusb %xmm0, %xmm1
303; SSSE3-NEXT:    movd %xmm1, %eax
304; SSSE3-NEXT:    movw %ax, (%rdx)
305; SSSE3-NEXT:    retq
306;
307; SSE41-LABEL: v2i8:
308; SSE41:       # %bb.0:
309; SSE41-NEXT:    movzwl (%rdi), %eax
310; SSE41-NEXT:    movd %eax, %xmm0
311; SSE41-NEXT:    movzwl (%rsi), %eax
312; SSE41-NEXT:    movd %eax, %xmm1
313; SSE41-NEXT:    paddusb %xmm0, %xmm1
314; SSE41-NEXT:    pextrw $0, %xmm1, (%rdx)
315; SSE41-NEXT:    retq
316;
317; AVX1-LABEL: v2i8:
318; AVX1:       # %bb.0:
319; AVX1-NEXT:    movzwl (%rdi), %eax
320; AVX1-NEXT:    vmovd %eax, %xmm0
321; AVX1-NEXT:    movzwl (%rsi), %eax
322; AVX1-NEXT:    vmovd %eax, %xmm1
323; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
324; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdx)
325; AVX1-NEXT:    retq
326;
327; AVX2-LABEL: v2i8:
328; AVX2:       # %bb.0:
329; AVX2-NEXT:    movzwl (%rdi), %eax
330; AVX2-NEXT:    vmovd %eax, %xmm0
331; AVX2-NEXT:    movzwl (%rsi), %eax
332; AVX2-NEXT:    vmovd %eax, %xmm1
333; AVX2-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
334; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdx)
335; AVX2-NEXT:    retq
336;
337; AVX512-LABEL: v2i8:
338; AVX512:       # %bb.0:
339; AVX512-NEXT:    movzwl (%rdi), %eax
340; AVX512-NEXT:    vmovd %eax, %xmm0
341; AVX512-NEXT:    movzwl (%rsi), %eax
342; AVX512-NEXT:    vmovd %eax, %xmm1
343; AVX512-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
344; AVX512-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
345; AVX512-NEXT:    vpmovqb %xmm0, (%rdx)
346; AVX512-NEXT:    retq
347  %x = load <2 x i8>, <2 x i8>* %px
348  %y = load <2 x i8>, <2 x i8>* %py
349  %z = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
350  store <2 x i8> %z, <2 x i8>* %pz
351  ret void
352}
353
354define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
355; SSE-LABEL: v4i16:
356; SSE:       # %bb.0:
357; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
358; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
359; SSE-NEXT:    paddusw %xmm0, %xmm1
360; SSE-NEXT:    movq %xmm1, (%rdx)
361; SSE-NEXT:    retq
362;
363; AVX1-LABEL: v4i16:
364; AVX1:       # %bb.0:
365; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
366; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
367; AVX1-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
368; AVX1-NEXT:    vmovq %xmm0, (%rdx)
369; AVX1-NEXT:    retq
370;
371; AVX2-LABEL: v4i16:
372; AVX2:       # %bb.0:
373; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
374; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
375; AVX2-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
376; AVX2-NEXT:    vmovq %xmm0, (%rdx)
377; AVX2-NEXT:    retq
378;
379; AVX512-LABEL: v4i16:
380; AVX512:       # %bb.0:
381; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
382; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
383; AVX512-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
384; AVX512-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
385; AVX512-NEXT:    vpmovdw %xmm0, (%rdx)
386; AVX512-NEXT:    retq
387  %x = load <4 x i16>, <4 x i16>* %px
388  %y = load <4 x i16>, <4 x i16>* %py
389  %z = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
390  store <4 x i16> %z, <4 x i16>* %pz
391  ret void
392}
393
394define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
395; SSE-LABEL: v2i16:
396; SSE:       # %bb.0:
397; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
398; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
399; SSE-NEXT:    paddusw %xmm0, %xmm1
400; SSE-NEXT:    movd %xmm1, (%rdx)
401; SSE-NEXT:    retq
402;
403; AVX1-LABEL: v2i16:
404; AVX1:       # %bb.0:
405; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
406; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
407; AVX1-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
408; AVX1-NEXT:    vmovd %xmm0, (%rdx)
409; AVX1-NEXT:    retq
410;
411; AVX2-LABEL: v2i16:
412; AVX2:       # %bb.0:
413; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
414; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
415; AVX2-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
416; AVX2-NEXT:    vmovd %xmm0, (%rdx)
417; AVX2-NEXT:    retq
418;
419; AVX512-LABEL: v2i16:
420; AVX512:       # %bb.0:
421; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
422; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
423; AVX512-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0
424; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
425; AVX512-NEXT:    vpmovqw %xmm0, (%rdx)
426; AVX512-NEXT:    retq
427  %x = load <2 x i16>, <2 x i16>* %px
428  %y = load <2 x i16>, <2 x i16>* %py
429  %z = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
430  store <2 x i16> %z, <2 x i16>* %pz
431  ret void
432}
433
434define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
435; SSE-LABEL: v12i8:
436; SSE:       # %bb.0:
437; SSE-NEXT:    paddusb %xmm1, %xmm0
438; SSE-NEXT:    retq
439;
440; AVX-LABEL: v12i8:
441; AVX:       # %bb.0:
442; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
443; AVX-NEXT:    retq
444  %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
445  ret <12 x i8> %z
446}
447
448define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
449; SSE-LABEL: v12i16:
450; SSE:       # %bb.0:
451; SSE-NEXT:    movdqa (%rdi), %xmm0
452; SSE-NEXT:    movdqa 16(%rdi), %xmm1
453; SSE-NEXT:    paddusw (%rsi), %xmm0
454; SSE-NEXT:    paddusw 16(%rsi), %xmm1
455; SSE-NEXT:    movq %xmm1, 16(%rdx)
456; SSE-NEXT:    movdqa %xmm0, (%rdx)
457; SSE-NEXT:    retq
458;
459; AVX1-LABEL: v12i16:
460; AVX1:       # %bb.0:
461; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
462; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
463; AVX1-NEXT:    vpaddusw 16(%rsi), %xmm1, %xmm1
464; AVX1-NEXT:    vpaddusw (%rsi), %xmm0, %xmm0
465; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
466; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
467; AVX1-NEXT:    retq
468;
469; AVX2-LABEL: v12i16:
470; AVX2:       # %bb.0:
471; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
472; AVX2-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
473; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
474; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
475; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
476; AVX2-NEXT:    vzeroupper
477; AVX2-NEXT:    retq
478;
479; AVX512-LABEL: v12i16:
480; AVX512:       # %bb.0:
481; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
482; AVX512-NEXT:    vpaddusw (%rsi), %ymm0, %ymm0
483; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
484; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
485; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
486; AVX512-NEXT:    vzeroupper
487; AVX512-NEXT:    retq
488  %x = load <12 x i16>, <12 x i16>* %px
489  %y = load <12 x i16>, <12 x i16>* %py
490  %z = call <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
491  store <12 x i16> %z, <12 x i16>* %pz
492  ret void
493}
494
495; Scalarization
496
497define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
498; SSE-LABEL: v1i8:
499; SSE:       # %bb.0:
500; SSE-NEXT:    movb (%rdi), %al
501; SSE-NEXT:    addb (%rsi), %al
502; SSE-NEXT:    movzbl %al, %eax
503; SSE-NEXT:    movl $255, %ecx
504; SSE-NEXT:    cmovael %eax, %ecx
505; SSE-NEXT:    movb %cl, (%rdx)
506; SSE-NEXT:    retq
507;
508; AVX-LABEL: v1i8:
509; AVX:       # %bb.0:
510; AVX-NEXT:    movb (%rdi), %al
511; AVX-NEXT:    addb (%rsi), %al
512; AVX-NEXT:    movzbl %al, %eax
513; AVX-NEXT:    movl $255, %ecx
514; AVX-NEXT:    cmovael %eax, %ecx
515; AVX-NEXT:    movb %cl, (%rdx)
516; AVX-NEXT:    retq
517  %x = load <1 x i8>, <1 x i8>* %px
518  %y = load <1 x i8>, <1 x i8>* %py
519  %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
520  store <1 x i8> %z, <1 x i8>* %pz
521  ret void
522}
523
524define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
525; SSE-LABEL: v1i16:
526; SSE:       # %bb.0:
527; SSE-NEXT:    movzwl (%rdi), %eax
528; SSE-NEXT:    addw (%rsi), %ax
529; SSE-NEXT:    movl $65535, %ecx # imm = 0xFFFF
530; SSE-NEXT:    cmovael %eax, %ecx
531; SSE-NEXT:    movw %cx, (%rdx)
532; SSE-NEXT:    retq
533;
534; AVX-LABEL: v1i16:
535; AVX:       # %bb.0:
536; AVX-NEXT:    movzwl (%rdi), %eax
537; AVX-NEXT:    addw (%rsi), %ax
538; AVX-NEXT:    movl $65535, %ecx # imm = 0xFFFF
539; AVX-NEXT:    cmovael %eax, %ecx
540; AVX-NEXT:    movw %cx, (%rdx)
541; AVX-NEXT:    retq
542  %x = load <1 x i16>, <1 x i16>* %px
543  %y = load <1 x i16>, <1 x i16>* %py
544  %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
545  store <1 x i16> %z, <1 x i16>* %pz
546  ret void
547}
548
549; Promotion
550
551define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
552; SSE-LABEL: v16i4:
553; SSE:       # %bb.0:
554; SSE-NEXT:    psllw $4, %xmm1
555; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
556; SSE-NEXT:    pand %xmm2, %xmm1
557; SSE-NEXT:    psllw $4, %xmm0
558; SSE-NEXT:    pand %xmm2, %xmm0
559; SSE-NEXT:    paddusb %xmm1, %xmm0
560; SSE-NEXT:    psrlw $4, %xmm0
561; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
562; SSE-NEXT:    retq
563;
564; AVX-LABEL: v16i4:
565; AVX:       # %bb.0:
566; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
567; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
568; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
569; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
570; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
571; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
572; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
573; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
574; AVX-NEXT:    retq
575  %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
576  ret <16 x i4> %z
577}
578
579define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
580; SSE-LABEL: v16i1:
581; SSE:       # %bb.0:
582; SSE-NEXT:    psllw $7, %xmm1
583; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
584; SSE-NEXT:    pand %xmm2, %xmm1
585; SSE-NEXT:    psllw $7, %xmm0
586; SSE-NEXT:    pand %xmm2, %xmm0
587; SSE-NEXT:    paddusb %xmm1, %xmm0
588; SSE-NEXT:    psrlw $7, %xmm0
589; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
590; SSE-NEXT:    retq
591;
592; AVX1-LABEL: v16i1:
593; AVX1:       # %bb.0:
594; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
595; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
596; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
597; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
598; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
599; AVX1-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
600; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
601; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
602; AVX1-NEXT:    retq
603;
604; AVX2-LABEL: v16i1:
605; AVX2:       # %bb.0:
606; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
607; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
608; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
609; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
610; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
611; AVX2-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0
612; AVX2-NEXT:    vpsrlw $7, %xmm0, %xmm0
613; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
614; AVX2-NEXT:    retq
615;
616; AVX512-LABEL: v16i1:
617; AVX512:       # %bb.0:
618; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm1
619; AVX512-NEXT:    vpmovb2m %xmm1, %k0
620; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
621; AVX512-NEXT:    vpmovb2m %xmm0, %k1
622; AVX512-NEXT:    korw %k0, %k1, %k0
623; AVX512-NEXT:    vpmovm2b %k0, %xmm0
624; AVX512-NEXT:    retq
625  %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
626  ret <16 x i1> %z
627}
628
629; Expanded
630
631define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
632; SSE2-LABEL: v2i32:
633; SSE2:       # %bb.0:
634; SSE2-NEXT:    psllq $32, %xmm0
635; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
636; SSE2-NEXT:    psllq $32, %xmm1
637; SSE2-NEXT:    paddq %xmm0, %xmm1
638; SSE2-NEXT:    pxor %xmm2, %xmm0
639; SSE2-NEXT:    pxor %xmm1, %xmm2
640; SSE2-NEXT:    movdqa %xmm0, %xmm3
641; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
642; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
643; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
644; SSE2-NEXT:    pand %xmm2, %xmm3
645; SSE2-NEXT:    por %xmm1, %xmm0
646; SSE2-NEXT:    por %xmm3, %xmm0
647; SSE2-NEXT:    psrlq $32, %xmm0
648; SSE2-NEXT:    retq
649;
650; SSSE3-LABEL: v2i32:
651; SSSE3:       # %bb.0:
652; SSSE3-NEXT:    psllq $32, %xmm0
653; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
654; SSSE3-NEXT:    psllq $32, %xmm1
655; SSSE3-NEXT:    paddq %xmm0, %xmm1
656; SSSE3-NEXT:    pxor %xmm2, %xmm0
657; SSSE3-NEXT:    pxor %xmm1, %xmm2
658; SSSE3-NEXT:    movdqa %xmm0, %xmm3
659; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
660; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
661; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
662; SSSE3-NEXT:    pand %xmm2, %xmm3
663; SSSE3-NEXT:    por %xmm1, %xmm0
664; SSSE3-NEXT:    por %xmm3, %xmm0
665; SSSE3-NEXT:    psrlq $32, %xmm0
666; SSSE3-NEXT:    retq
667;
668; SSE41-LABEL: v2i32:
669; SSE41:       # %bb.0:
670; SSE41-NEXT:    psllq $32, %xmm0
671; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
672; SSE41-NEXT:    psllq $32, %xmm1
673; SSE41-NEXT:    paddq %xmm0, %xmm1
674; SSE41-NEXT:    movdqa %xmm0, %xmm3
675; SSE41-NEXT:    pxor %xmm2, %xmm3
676; SSE41-NEXT:    pxor %xmm1, %xmm2
677; SSE41-NEXT:    movdqa %xmm3, %xmm0
678; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
679; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
680; SSE41-NEXT:    pcmpeqd %xmm3, %xmm2
681; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
682; SSE41-NEXT:    pand %xmm4, %xmm2
683; SSE41-NEXT:    por %xmm2, %xmm0
684; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
685; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
686; SSE41-NEXT:    psrlq $32, %xmm1
687; SSE41-NEXT:    movdqa %xmm1, %xmm0
688; SSE41-NEXT:    retq
689;
690; AVX1-LABEL: v2i32:
691; AVX1:       # %bb.0:
692; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm0
693; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
694; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
695; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
696; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
697; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm1
698; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
699; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
700; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
701; AVX1-NEXT:    retq
702;
703; AVX2-LABEL: v2i32:
704; AVX2:       # %bb.0:
705; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
706; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
707; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
708; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
709; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
710; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm1
711; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
712; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
713; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
714; AVX2-NEXT:    retq
715;
716; AVX512-LABEL: v2i32:
717; AVX512:       # %bb.0:
718; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
719; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
720; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
721; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
722; AVX512-NEXT:    vpminuq %xmm2, %xmm0, %xmm0
723; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
724; AVX512-NEXT:    vpsrlq $32, %xmm0, %xmm0
725; AVX512-NEXT:    retq
726  %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
727  ret <2 x i32> %z
728}
729
730define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
731; SSE2-LABEL: v4i32:
732; SSE2:       # %bb.0:
733; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
734; SSE2-NEXT:    paddd %xmm0, %xmm1
735; SSE2-NEXT:    pxor %xmm2, %xmm0
736; SSE2-NEXT:    pxor %xmm1, %xmm2
737; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
738; SSE2-NEXT:    por %xmm1, %xmm0
739; SSE2-NEXT:    retq
740;
741; SSSE3-LABEL: v4i32:
742; SSSE3:       # %bb.0:
743; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
744; SSSE3-NEXT:    paddd %xmm0, %xmm1
745; SSSE3-NEXT:    pxor %xmm2, %xmm0
746; SSSE3-NEXT:    pxor %xmm1, %xmm2
747; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
748; SSSE3-NEXT:    por %xmm1, %xmm0
749; SSSE3-NEXT:    retq
750;
751; SSE41-LABEL: v4i32:
752; SSE41:       # %bb.0:
753; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
754; SSE41-NEXT:    pxor %xmm1, %xmm2
755; SSE41-NEXT:    pminud %xmm2, %xmm0
756; SSE41-NEXT:    paddd %xmm1, %xmm0
757; SSE41-NEXT:    retq
758;
759; AVX1-LABEL: v4i32:
760; AVX1:       # %bb.0:
761; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
762; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
763; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
764; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
765; AVX1-NEXT:    retq
766;
767; AVX2-LABEL: v4i32:
768; AVX2:       # %bb.0:
769; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
770; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
771; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0
772; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
773; AVX2-NEXT:    retq
774;
775; AVX512-LABEL: v4i32:
776; AVX512:       # %bb.0:
777; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
778; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
779; AVX512-NEXT:    vpminud %xmm2, %xmm0, %xmm0
780; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
781; AVX512-NEXT:    retq
782  %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
783  ret <4 x i32> %z
784}
785
786define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
787; SSE2-LABEL: v8i32:
788; SSE2:       # %bb.0:
789; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
790; SSE2-NEXT:    paddd %xmm0, %xmm2
791; SSE2-NEXT:    pxor %xmm4, %xmm0
792; SSE2-NEXT:    movdqa %xmm2, %xmm5
793; SSE2-NEXT:    pxor %xmm4, %xmm5
794; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
795; SSE2-NEXT:    por %xmm2, %xmm0
796; SSE2-NEXT:    paddd %xmm1, %xmm3
797; SSE2-NEXT:    pxor %xmm4, %xmm1
798; SSE2-NEXT:    pxor %xmm3, %xmm4
799; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
800; SSE2-NEXT:    por %xmm3, %xmm1
801; SSE2-NEXT:    retq
802;
803; SSSE3-LABEL: v8i32:
804; SSSE3:       # %bb.0:
805; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
806; SSSE3-NEXT:    paddd %xmm0, %xmm2
807; SSSE3-NEXT:    pxor %xmm4, %xmm0
808; SSSE3-NEXT:    movdqa %xmm2, %xmm5
809; SSSE3-NEXT:    pxor %xmm4, %xmm5
810; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
811; SSSE3-NEXT:    por %xmm2, %xmm0
812; SSSE3-NEXT:    paddd %xmm1, %xmm3
813; SSSE3-NEXT:    pxor %xmm4, %xmm1
814; SSSE3-NEXT:    pxor %xmm3, %xmm4
815; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
816; SSSE3-NEXT:    por %xmm3, %xmm1
817; SSSE3-NEXT:    retq
818;
819; SSE41-LABEL: v8i32:
820; SSE41:       # %bb.0:
821; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
822; SSE41-NEXT:    movdqa %xmm2, %xmm5
823; SSE41-NEXT:    pxor %xmm4, %xmm5
824; SSE41-NEXT:    pminud %xmm5, %xmm0
825; SSE41-NEXT:    paddd %xmm2, %xmm0
826; SSE41-NEXT:    pxor %xmm3, %xmm4
827; SSE41-NEXT:    pminud %xmm4, %xmm1
828; SSE41-NEXT:    paddd %xmm3, %xmm1
829; SSE41-NEXT:    retq
830;
831; AVX1-LABEL: v8i32:
832; AVX1:       # %bb.0:
833; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm2
834; AVX1-NEXT:    vcmptrueps %ymm2, %ymm2, %ymm2
835; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm2
836; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
837; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
838; AVX1-NEXT:    vpminud %xmm3, %xmm4, %xmm3
839; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
840; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3
841; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
842; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
843; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
844; AVX1-NEXT:    retq
845;
846; AVX2-LABEL: v8i32:
847; AVX2:       # %bb.0:
848; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
849; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
850; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
851; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
852; AVX2-NEXT:    retq
853;
854; AVX512-LABEL: v8i32:
855; AVX512:       # %bb.0:
856; AVX512-NEXT:    vmovdqa %ymm1, %ymm2
857; AVX512-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
858; AVX512-NEXT:    vpminud %ymm2, %ymm0, %ymm0
859; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
860; AVX512-NEXT:    retq
861  %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
862  ret <8 x i32> %z
863}
864
865define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
866; SSE2-LABEL: v16i32:
867; SSE2:       # %bb.0:
868; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
869; SSE2-NEXT:    paddd %xmm0, %xmm4
870; SSE2-NEXT:    pxor %xmm8, %xmm0
871; SSE2-NEXT:    movdqa %xmm4, %xmm9
872; SSE2-NEXT:    pxor %xmm8, %xmm9
873; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
874; SSE2-NEXT:    por %xmm4, %xmm0
875; SSE2-NEXT:    paddd %xmm1, %xmm5
876; SSE2-NEXT:    pxor %xmm8, %xmm1
877; SSE2-NEXT:    movdqa %xmm5, %xmm4
878; SSE2-NEXT:    pxor %xmm8, %xmm4
879; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
880; SSE2-NEXT:    por %xmm5, %xmm1
881; SSE2-NEXT:    paddd %xmm2, %xmm6
882; SSE2-NEXT:    pxor %xmm8, %xmm2
883; SSE2-NEXT:    movdqa %xmm6, %xmm4
884; SSE2-NEXT:    pxor %xmm8, %xmm4
885; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
886; SSE2-NEXT:    por %xmm6, %xmm2
887; SSE2-NEXT:    paddd %xmm3, %xmm7
888; SSE2-NEXT:    pxor %xmm8, %xmm3
889; SSE2-NEXT:    pxor %xmm7, %xmm8
890; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
891; SSE2-NEXT:    por %xmm7, %xmm3
892; SSE2-NEXT:    retq
893;
894; SSSE3-LABEL: v16i32:
895; SSSE3:       # %bb.0:
896; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
897; SSSE3-NEXT:    paddd %xmm0, %xmm4
898; SSSE3-NEXT:    pxor %xmm8, %xmm0
899; SSSE3-NEXT:    movdqa %xmm4, %xmm9
900; SSSE3-NEXT:    pxor %xmm8, %xmm9
901; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
902; SSSE3-NEXT:    por %xmm4, %xmm0
903; SSSE3-NEXT:    paddd %xmm1, %xmm5
904; SSSE3-NEXT:    pxor %xmm8, %xmm1
905; SSSE3-NEXT:    movdqa %xmm5, %xmm4
906; SSSE3-NEXT:    pxor %xmm8, %xmm4
907; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
908; SSSE3-NEXT:    por %xmm5, %xmm1
909; SSSE3-NEXT:    paddd %xmm2, %xmm6
910; SSSE3-NEXT:    pxor %xmm8, %xmm2
911; SSSE3-NEXT:    movdqa %xmm6, %xmm4
912; SSSE3-NEXT:    pxor %xmm8, %xmm4
913; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
914; SSSE3-NEXT:    por %xmm6, %xmm2
915; SSSE3-NEXT:    paddd %xmm3, %xmm7
916; SSSE3-NEXT:    pxor %xmm8, %xmm3
917; SSSE3-NEXT:    pxor %xmm7, %xmm8
918; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
919; SSSE3-NEXT:    por %xmm7, %xmm3
920; SSSE3-NEXT:    retq
921;
922; SSE41-LABEL: v16i32:
923; SSE41:       # %bb.0:
924; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
925; SSE41-NEXT:    movdqa %xmm4, %xmm9
926; SSE41-NEXT:    pxor %xmm8, %xmm9
927; SSE41-NEXT:    pminud %xmm9, %xmm0
928; SSE41-NEXT:    paddd %xmm4, %xmm0
929; SSE41-NEXT:    movdqa %xmm5, %xmm4
930; SSE41-NEXT:    pxor %xmm8, %xmm4
931; SSE41-NEXT:    pminud %xmm4, %xmm1
932; SSE41-NEXT:    paddd %xmm5, %xmm1
933; SSE41-NEXT:    movdqa %xmm6, %xmm4
934; SSE41-NEXT:    pxor %xmm8, %xmm4
935; SSE41-NEXT:    pminud %xmm4, %xmm2
936; SSE41-NEXT:    paddd %xmm6, %xmm2
937; SSE41-NEXT:    pxor %xmm7, %xmm8
938; SSE41-NEXT:    pminud %xmm8, %xmm3
939; SSE41-NEXT:    paddd %xmm7, %xmm3
940; SSE41-NEXT:    retq
941;
942; AVX1-LABEL: v16i32:
943; AVX1:       # %bb.0:
944; AVX1-NEXT:    vxorps %xmm4, %xmm4, %xmm4
945; AVX1-NEXT:    vcmptrueps %ymm4, %ymm4, %ymm4
946; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm5
947; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm6
948; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
949; AVX1-NEXT:    vpminud %xmm6, %xmm7, %xmm6
950; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
951; AVX1-NEXT:    vpaddd %xmm7, %xmm6, %xmm6
952; AVX1-NEXT:    vpminud %xmm5, %xmm0, %xmm0
953; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
954; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
955; AVX1-NEXT:    vxorps %ymm4, %ymm3, %ymm2
956; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
957; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
958; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
959; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
960; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
961; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
962; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
963; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
964; AVX1-NEXT:    retq
965;
966; AVX2-LABEL: v16i32:
967; AVX2:       # %bb.0:
968; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
969; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
970; AVX2-NEXT:    vpminud %ymm5, %ymm0, %ymm0
971; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
972; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
973; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
974; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
975; AVX2-NEXT:    retq
976;
977; AVX512-LABEL: v16i32:
978; AVX512:       # %bb.0:
979; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
980; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
981; AVX512-NEXT:    vpminud %zmm2, %zmm0, %zmm0
982; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
983; AVX512-NEXT:    retq
984  %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
985  ret <16 x i32> %z
986}
987
988define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
989; SSE2-LABEL: v2i64:
990; SSE2:       # %bb.0:
991; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
992; SSE2-NEXT:    paddq %xmm0, %xmm1
993; SSE2-NEXT:    pxor %xmm2, %xmm0
994; SSE2-NEXT:    pxor %xmm1, %xmm2
995; SSE2-NEXT:    movdqa %xmm0, %xmm3
996; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
997; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
998; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
999; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1000; SSE2-NEXT:    pand %xmm4, %xmm2
1001; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1002; SSE2-NEXT:    por %xmm1, %xmm0
1003; SSE2-NEXT:    por %xmm2, %xmm0
1004; SSE2-NEXT:    retq
1005;
1006; SSSE3-LABEL: v2i64:
1007; SSSE3:       # %bb.0:
1008; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1009; SSSE3-NEXT:    paddq %xmm0, %xmm1
1010; SSSE3-NEXT:    pxor %xmm2, %xmm0
1011; SSSE3-NEXT:    pxor %xmm1, %xmm2
1012; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1013; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1014; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1015; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
1016; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1017; SSSE3-NEXT:    pand %xmm4, %xmm2
1018; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1019; SSSE3-NEXT:    por %xmm1, %xmm0
1020; SSSE3-NEXT:    por %xmm2, %xmm0
1021; SSSE3-NEXT:    retq
1022;
1023; SSE41-LABEL: v2i64:
1024; SSE41:       # %bb.0:
1025; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1026; SSE41-NEXT:    paddq %xmm0, %xmm1
1027; SSE41-NEXT:    movdqa %xmm0, %xmm3
1028; SSE41-NEXT:    pxor %xmm2, %xmm3
1029; SSE41-NEXT:    pxor %xmm1, %xmm2
1030; SSE41-NEXT:    movdqa %xmm3, %xmm0
1031; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
1032; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1033; SSE41-NEXT:    pcmpeqd %xmm3, %xmm2
1034; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1035; SSE41-NEXT:    pand %xmm4, %xmm2
1036; SSE41-NEXT:    por %xmm2, %xmm0
1037; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
1038; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1039; SSE41-NEXT:    movapd %xmm1, %xmm0
1040; SSE41-NEXT:    retq
1041;
1042; AVX1-LABEL: v2i64:
1043; AVX1:       # %bb.0:
1044; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1045; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
1046; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1047; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm1
1048; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1049; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
1050; AVX1-NEXT:    retq
1051;
1052; AVX2-LABEL: v2i64:
1053; AVX2:       # %bb.0:
1054; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1055; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
1056; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1057; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm1
1058; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1059; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
1060; AVX2-NEXT:    retq
1061;
1062; AVX512-LABEL: v2i64:
1063; AVX512:       # %bb.0:
1064; AVX512-NEXT:    vmovdqa %xmm1, %xmm2
1065; AVX512-NEXT:    vpternlogq $15, %xmm1, %xmm1, %xmm2
1066; AVX512-NEXT:    vpminuq %xmm2, %xmm0, %xmm0
1067; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1068; AVX512-NEXT:    retq
1069  %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1070  ret <2 x i64> %z
1071}
1072
1073define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1074; SSE2-LABEL: v4i64:
1075; SSE2:       # %bb.0:
1076; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1077; SSE2-NEXT:    paddq %xmm0, %xmm2
1078; SSE2-NEXT:    pxor %xmm4, %xmm0
1079; SSE2-NEXT:    movdqa %xmm2, %xmm5
1080; SSE2-NEXT:    pxor %xmm4, %xmm5
1081; SSE2-NEXT:    movdqa %xmm0, %xmm6
1082; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1083; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1084; SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
1085; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1086; SSE2-NEXT:    pand %xmm7, %xmm5
1087; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1088; SSE2-NEXT:    por %xmm2, %xmm0
1089; SSE2-NEXT:    por %xmm5, %xmm0
1090; SSE2-NEXT:    paddq %xmm1, %xmm3
1091; SSE2-NEXT:    pxor %xmm4, %xmm1
1092; SSE2-NEXT:    pxor %xmm3, %xmm4
1093; SSE2-NEXT:    movdqa %xmm1, %xmm2
1094; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
1095; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1096; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
1097; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1098; SSE2-NEXT:    pand %xmm5, %xmm4
1099; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1100; SSE2-NEXT:    por %xmm3, %xmm1
1101; SSE2-NEXT:    por %xmm4, %xmm1
1102; SSE2-NEXT:    retq
1103;
1104; SSSE3-LABEL: v4i64:
1105; SSSE3:       # %bb.0:
1106; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1107; SSSE3-NEXT:    paddq %xmm0, %xmm2
1108; SSSE3-NEXT:    pxor %xmm4, %xmm0
1109; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1110; SSSE3-NEXT:    pxor %xmm4, %xmm5
1111; SSSE3-NEXT:    movdqa %xmm0, %xmm6
1112; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
1113; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1114; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm5
1115; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1116; SSSE3-NEXT:    pand %xmm7, %xmm5
1117; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1118; SSSE3-NEXT:    por %xmm2, %xmm0
1119; SSSE3-NEXT:    por %xmm5, %xmm0
1120; SSSE3-NEXT:    paddq %xmm1, %xmm3
1121; SSSE3-NEXT:    pxor %xmm4, %xmm1
1122; SSSE3-NEXT:    pxor %xmm3, %xmm4
1123; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1124; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
1125; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1126; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
1127; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1128; SSSE3-NEXT:    pand %xmm5, %xmm4
1129; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1130; SSSE3-NEXT:    por %xmm3, %xmm1
1131; SSSE3-NEXT:    por %xmm4, %xmm1
1132; SSSE3-NEXT:    retq
1133;
1134; SSE41-LABEL: v4i64:
1135; SSE41:       # %bb.0:
1136; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1137; SSE41-NEXT:    paddq %xmm0, %xmm2
1138; SSE41-NEXT:    movdqa %xmm0, %xmm5
1139; SSE41-NEXT:    pxor %xmm4, %xmm5
1140; SSE41-NEXT:    movdqa %xmm2, %xmm6
1141; SSE41-NEXT:    pxor %xmm4, %xmm6
1142; SSE41-NEXT:    movdqa %xmm5, %xmm0
1143; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
1144; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1145; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1146; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1147; SSE41-NEXT:    pand %xmm7, %xmm5
1148; SSE41-NEXT:    por %xmm5, %xmm0
1149; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1150; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1151; SSE41-NEXT:    paddq %xmm1, %xmm3
1152; SSE41-NEXT:    pxor %xmm4, %xmm1
1153; SSE41-NEXT:    pxor %xmm3, %xmm4
1154; SSE41-NEXT:    movdqa %xmm1, %xmm6
1155; SSE41-NEXT:    pcmpgtd %xmm4, %xmm6
1156; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1157; SSE41-NEXT:    pcmpeqd %xmm1, %xmm4
1158; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1159; SSE41-NEXT:    pand %xmm7, %xmm0
1160; SSE41-NEXT:    por %xmm6, %xmm0
1161; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
1162; SSE41-NEXT:    movapd %xmm2, %xmm0
1163; SSE41-NEXT:    movapd %xmm3, %xmm1
1164; SSE41-NEXT:    retq
1165;
1166; AVX1-LABEL: v4i64:
1167; AVX1:       # %bb.0:
1168; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1169; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1170; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
1171; AVX1-NEXT:    vxorps %xmm4, %xmm4, %xmm4
1172; AVX1-NEXT:    vcmptrueps %ymm4, %ymm4, %ymm4
1173; AVX1-NEXT:    vxorps %ymm4, %ymm1, %ymm4
1174; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
1175; AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm5
1176; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm5, %xmm2
1177; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm5
1178; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm3
1179; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
1180; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1181; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm4, %ymm0
1182; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1183; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1184; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1185; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1186; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1187; AVX1-NEXT:    retq
1188;
1189; AVX2-LABEL: v4i64:
1190; AVX2:       # %bb.0:
1191; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1192; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1193; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1194; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1195; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1196; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
1197; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1198; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm3, %ymm0
1199; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1200; AVX2-NEXT:    retq
1201;
1202; AVX512-LABEL: v4i64:
1203; AVX512:       # %bb.0:
1204; AVX512-NEXT:    vmovdqa %ymm1, %ymm2
1205; AVX512-NEXT:    vpternlogq $15, %ymm1, %ymm1, %ymm2
1206; AVX512-NEXT:    vpminuq %ymm2, %ymm0, %ymm0
1207; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1208; AVX512-NEXT:    retq
1209  %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1210  ret <4 x i64> %z
1211}
1212
1213define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1214; SSE2-LABEL: v8i64:
1215; SSE2:       # %bb.0:
1216; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1217; SSE2-NEXT:    paddq %xmm0, %xmm4
1218; SSE2-NEXT:    pxor %xmm8, %xmm0
1219; SSE2-NEXT:    movdqa %xmm4, %xmm9
1220; SSE2-NEXT:    pxor %xmm8, %xmm9
1221; SSE2-NEXT:    movdqa %xmm0, %xmm10
1222; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
1223; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1224; SSE2-NEXT:    pcmpeqd %xmm0, %xmm9
1225; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1226; SSE2-NEXT:    pand %xmm11, %xmm9
1227; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1228; SSE2-NEXT:    por %xmm4, %xmm0
1229; SSE2-NEXT:    por %xmm9, %xmm0
1230; SSE2-NEXT:    paddq %xmm1, %xmm5
1231; SSE2-NEXT:    pxor %xmm8, %xmm1
1232; SSE2-NEXT:    movdqa %xmm5, %xmm4
1233; SSE2-NEXT:    pxor %xmm8, %xmm4
1234; SSE2-NEXT:    movdqa %xmm1, %xmm9
1235; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
1236; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1237; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
1238; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1239; SSE2-NEXT:    pand %xmm10, %xmm4
1240; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1241; SSE2-NEXT:    por %xmm5, %xmm1
1242; SSE2-NEXT:    por %xmm4, %xmm1
1243; SSE2-NEXT:    paddq %xmm2, %xmm6
1244; SSE2-NEXT:    pxor %xmm8, %xmm2
1245; SSE2-NEXT:    movdqa %xmm6, %xmm4
1246; SSE2-NEXT:    pxor %xmm8, %xmm4
1247; SSE2-NEXT:    movdqa %xmm2, %xmm5
1248; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1249; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1250; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1251; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1252; SSE2-NEXT:    pand %xmm9, %xmm4
1253; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1254; SSE2-NEXT:    por %xmm6, %xmm2
1255; SSE2-NEXT:    por %xmm4, %xmm2
1256; SSE2-NEXT:    paddq %xmm3, %xmm7
1257; SSE2-NEXT:    pxor %xmm8, %xmm3
1258; SSE2-NEXT:    pxor %xmm7, %xmm8
1259; SSE2-NEXT:    movdqa %xmm3, %xmm4
1260; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
1261; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1262; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
1263; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1264; SSE2-NEXT:    pand %xmm5, %xmm6
1265; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1266; SSE2-NEXT:    por %xmm7, %xmm3
1267; SSE2-NEXT:    por %xmm6, %xmm3
1268; SSE2-NEXT:    retq
1269;
1270; SSSE3-LABEL: v8i64:
1271; SSSE3:       # %bb.0:
1272; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1273; SSSE3-NEXT:    paddq %xmm0, %xmm4
1274; SSSE3-NEXT:    pxor %xmm8, %xmm0
1275; SSSE3-NEXT:    movdqa %xmm4, %xmm9
1276; SSSE3-NEXT:    pxor %xmm8, %xmm9
1277; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1278; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm10
1279; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1280; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm9
1281; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1282; SSSE3-NEXT:    pand %xmm11, %xmm9
1283; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1284; SSSE3-NEXT:    por %xmm4, %xmm0
1285; SSSE3-NEXT:    por %xmm9, %xmm0
1286; SSSE3-NEXT:    paddq %xmm1, %xmm5
1287; SSSE3-NEXT:    pxor %xmm8, %xmm1
1288; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1289; SSSE3-NEXT:    pxor %xmm8, %xmm4
1290; SSSE3-NEXT:    movdqa %xmm1, %xmm9
1291; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
1292; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1293; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
1294; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1295; SSSE3-NEXT:    pand %xmm10, %xmm4
1296; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1297; SSSE3-NEXT:    por %xmm5, %xmm1
1298; SSSE3-NEXT:    por %xmm4, %xmm1
1299; SSSE3-NEXT:    paddq %xmm2, %xmm6
1300; SSSE3-NEXT:    pxor %xmm8, %xmm2
1301; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1302; SSSE3-NEXT:    pxor %xmm8, %xmm4
1303; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1304; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1305; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1306; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1307; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1308; SSSE3-NEXT:    pand %xmm9, %xmm4
1309; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1310; SSSE3-NEXT:    por %xmm6, %xmm2
1311; SSSE3-NEXT:    por %xmm4, %xmm2
1312; SSSE3-NEXT:    paddq %xmm3, %xmm7
1313; SSSE3-NEXT:    pxor %xmm8, %xmm3
1314; SSSE3-NEXT:    pxor %xmm7, %xmm8
1315; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1316; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
1317; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1318; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm8
1319; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1320; SSSE3-NEXT:    pand %xmm5, %xmm6
1321; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1322; SSSE3-NEXT:    por %xmm7, %xmm3
1323; SSSE3-NEXT:    por %xmm6, %xmm3
1324; SSSE3-NEXT:    retq
1325;
1326; SSE41-LABEL: v8i64:
1327; SSE41:       # %bb.0:
1328; SSE41-NEXT:    movdqa %xmm7, %xmm8
1329; SSE41-NEXT:    movdqa %xmm6, %xmm10
1330; SSE41-NEXT:    movdqa %xmm5, %xmm11
1331; SSE41-NEXT:    movdqa %xmm4, %xmm12
1332; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1333; SSE41-NEXT:    paddq %xmm0, %xmm12
1334; SSE41-NEXT:    movdqa %xmm0, %xmm6
1335; SSE41-NEXT:    pxor %xmm7, %xmm6
1336; SSE41-NEXT:    movdqa %xmm12, %xmm4
1337; SSE41-NEXT:    pxor %xmm7, %xmm4
1338; SSE41-NEXT:    movdqa %xmm6, %xmm0
1339; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1340; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1341; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1342; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1343; SSE41-NEXT:    pand %xmm5, %xmm4
1344; SSE41-NEXT:    por %xmm4, %xmm0
1345; SSE41-NEXT:    pcmpeqd %xmm9, %xmm9
1346; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm12
1347; SSE41-NEXT:    paddq %xmm1, %xmm11
1348; SSE41-NEXT:    pxor %xmm7, %xmm1
1349; SSE41-NEXT:    movdqa %xmm11, %xmm0
1350; SSE41-NEXT:    pxor %xmm7, %xmm0
1351; SSE41-NEXT:    movdqa %xmm1, %xmm4
1352; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1353; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1354; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
1355; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1356; SSE41-NEXT:    pand %xmm5, %xmm0
1357; SSE41-NEXT:    por %xmm4, %xmm0
1358; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm11
1359; SSE41-NEXT:    paddq %xmm2, %xmm10
1360; SSE41-NEXT:    pxor %xmm7, %xmm2
1361; SSE41-NEXT:    movdqa %xmm10, %xmm0
1362; SSE41-NEXT:    pxor %xmm7, %xmm0
1363; SSE41-NEXT:    movdqa %xmm2, %xmm1
1364; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1365; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1366; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
1367; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1368; SSE41-NEXT:    pand %xmm4, %xmm0
1369; SSE41-NEXT:    por %xmm1, %xmm0
1370; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm10
1371; SSE41-NEXT:    paddq %xmm3, %xmm8
1372; SSE41-NEXT:    pxor %xmm7, %xmm3
1373; SSE41-NEXT:    pxor %xmm8, %xmm7
1374; SSE41-NEXT:    movdqa %xmm3, %xmm1
1375; SSE41-NEXT:    pcmpgtd %xmm7, %xmm1
1376; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1377; SSE41-NEXT:    pcmpeqd %xmm3, %xmm7
1378; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1379; SSE41-NEXT:    pand %xmm2, %xmm0
1380; SSE41-NEXT:    por %xmm1, %xmm0
1381; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm8
1382; SSE41-NEXT:    movapd %xmm12, %xmm0
1383; SSE41-NEXT:    movapd %xmm11, %xmm1
1384; SSE41-NEXT:    movapd %xmm10, %xmm2
1385; SSE41-NEXT:    movapd %xmm8, %xmm3
1386; SSE41-NEXT:    retq
1387;
1388; AVX1-LABEL: v8i64:
1389; AVX1:       # %bb.0:
1390; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1391; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1392; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1393; AVX1-NEXT:    vxorps %xmm6, %xmm6, %xmm6
1394; AVX1-NEXT:    vcmptrueps %ymm6, %ymm6, %ymm8
1395; AVX1-NEXT:    vxorps %ymm8, %ymm2, %ymm7
1396; AVX1-NEXT:    vextractf128 $1, %ymm7, %xmm6
1397; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
1398; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm9
1399; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
1400; AVX1-NEXT:    vxorps %xmm4, %xmm7, %xmm5
1401; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm5
1402; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm5, %ymm5
1403; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm7, %ymm0
1404; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1405; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
1406; AVX1-NEXT:    vpaddq %xmm6, %xmm5, %xmm5
1407; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
1408; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1409; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1410; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1411; AVX1-NEXT:    vxorps %ymm8, %ymm3, %ymm5
1412; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm6
1413; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
1414; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
1415; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm6
1416; AVX1-NEXT:    vxorps %xmm4, %xmm5, %xmm4
1417; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm4, %xmm4
1418; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
1419; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm5, %ymm1
1420; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1421; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1422; AVX1-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1423; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
1424; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1425; AVX1-NEXT:    retq
1426;
1427; AVX2-LABEL: v8i64:
1428; AVX2:       # %bb.0:
1429; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1430; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm5
1431; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1432; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm7
1433; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm7, %ymm5
1434; AVX2-NEXT:    vpcmpeqd %ymm7, %ymm7, %ymm7
1435; AVX2-NEXT:    vpxor %ymm7, %ymm2, %ymm8
1436; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm8, %ymm0
1437; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1438; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm2
1439; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm4
1440; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
1441; AVX2-NEXT:    vpxor %ymm7, %ymm3, %ymm4
1442; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm4, %ymm1
1443; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
1444; AVX2-NEXT:    retq
1445;
1446; AVX512-LABEL: v8i64:
1447; AVX512:       # %bb.0:
1448; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
1449; AVX512-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm2
1450; AVX512-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1451; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1452; AVX512-NEXT:    retq
1453  %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1454  ret <8 x i64> %z
1455}
1456
1457define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1458; SSE-LABEL: v2i128:
1459; SSE:       # %bb.0:
1460; SSE-NEXT:    movq %rdi, %rax
1461; SSE-NEXT:    addq %r9, %rsi
1462; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1463; SSE-NEXT:    movq $-1, %rdi
1464; SSE-NEXT:    cmovbq %rdi, %rsi
1465; SSE-NEXT:    cmovbq %rdi, %rdx
1466; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1467; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1468; SSE-NEXT:    cmovbq %rdi, %r8
1469; SSE-NEXT:    cmovbq %rdi, %rcx
1470; SSE-NEXT:    movq %r8, 24(%rax)
1471; SSE-NEXT:    movq %rcx, 16(%rax)
1472; SSE-NEXT:    movq %rdx, 8(%rax)
1473; SSE-NEXT:    movq %rsi, (%rax)
1474; SSE-NEXT:    retq
1475;
1476; AVX-LABEL: v2i128:
1477; AVX:       # %bb.0:
1478; AVX-NEXT:    movq %rdi, %rax
1479; AVX-NEXT:    addq %r9, %rsi
1480; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1481; AVX-NEXT:    movq $-1, %rdi
1482; AVX-NEXT:    cmovbq %rdi, %rsi
1483; AVX-NEXT:    cmovbq %rdi, %rdx
1484; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1485; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1486; AVX-NEXT:    cmovbq %rdi, %r8
1487; AVX-NEXT:    cmovbq %rdi, %rcx
1488; AVX-NEXT:    movq %r8, 24(%rax)
1489; AVX-NEXT:    movq %rcx, 16(%rax)
1490; AVX-NEXT:    movq %rdx, 8(%rax)
1491; AVX-NEXT:    movq %rsi, (%rax)
1492; AVX-NEXT:    retq
1493  %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1494  ret <2 x i128> %z
1495}
1496