xref: /llvm-project/llvm/test/CodeGen/X86/uadd_sat_vec.ll (revision 2068b1ba031e258a6448bea372005d19692c802a)
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
11
12declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
13declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
14declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
15declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
16declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
17declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
18declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
19declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
20
21declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
22declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
23declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
24declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
25declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
26declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
27declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
28
29declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
30declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
31
32declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
33declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
34declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
35declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
36declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
37declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
38declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
39
40declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
41declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>)
42
43; Legal types, depending on architecture.
44
45define <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
50;
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
57}
58
59define <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
65;
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
74;
75; AVX2-LABEL: v32i8:
76; AVX2:       # %bb.0:
77; AVX2-NEXT:    vpaddusb %ymm1, %ymm0, %ymm0
78; AVX2-NEXT:    retq
79;
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
86}
87
88define <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
96;
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
110;
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
116;
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
125;
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
132}
133
134define <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
139;
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
146}
147
148define <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
154;
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
163;
164; AVX2-LABEL: v16i16:
165; AVX2:       # %bb.0:
166; AVX2-NEXT:    vpaddusw %ymm1, %ymm0, %ymm0
167; AVX2-NEXT:    retq
168;
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
175}
176
177define <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
185;
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
199;
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
205;
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
214;
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
221}
222
223; Too narrow vectors, legalized by widening.
224
225define 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
233;
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
246}
247
248define 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
256;
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
269}
270
271define 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
282;
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
293;
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
303;
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
318}
319
320define 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
328;
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
341}
342
343define 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
351;
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
364}
365
366define <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
371;
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
378}
379
380define 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
390;
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
400;
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
410;
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
425}
426
427; Scalarization
428
429define 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
439;
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
454}
455
456define 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
465;
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
479}
480
481; Promotion
482
483define <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
492;
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
501;
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
510;
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
521}
522
523define <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
528;
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
535}
536
537; Expanded
538
539define <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
550;
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
561;
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
569;
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
577;
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
585;
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 {{.*#+}} zmm2 = ~zmm2
591; AVX512F-NEXT:    vpminud %xmm2, %xmm0, %xmm0
592; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
593; AVX512F-NEXT:    vzeroupper
594; AVX512F-NEXT:    retq
595;
596; AVX512BW-LABEL: v2i32:
597; AVX512BW:       # %bb.0:
598; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
599; AVX512BW-NEXT:    vpternlogq {{.*#+}} xmm2 = ~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
605}
606
607define <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
618;
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
629;
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
637;
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
645;
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
653;
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 {{.*#+}} zmm2 = ~zmm2
659; AVX512F-NEXT:    vpminud %xmm2, %xmm0, %xmm0
660; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
661; AVX512F-NEXT:    vzeroupper
662; AVX512F-NEXT:    retq
663;
664; AVX512BW-LABEL: v4i32:
665; AVX512BW:       # %bb.0:
666; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
667; AVX512BW-NEXT:    vpternlogq {{.*#+}} xmm2 = ~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
673}
674
675define <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
693;
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
711;
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
723;
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
737;
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
745;
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 {{.*#+}} zmm2 = ~zmm2
751; AVX512F-NEXT:    vpminud %ymm2, %ymm0, %ymm0
752; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
753; AVX512F-NEXT:    retq
754;
755; AVX512BW-LABEL: v8i32:
756; AVX512BW:       # %bb.0:
757; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm2
758; AVX512BW-NEXT:    vpternlogq {{.*#+}} ymm2 = ~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
764}
765
766define <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
798;
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
830;
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
850;
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
873;
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
884;
885; AVX512-LABEL: v16i32:
886; AVX512:       # %bb.0:
887; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
888; AVX512-NEXT:    vpternlogq {{.*#+}} zmm2 = ~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
894}
895
896define <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
914;
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
925;
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
935;
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 {{.*#+}} zmm2 = ~zmm2
942; AVX512F-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
943; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
944; AVX512F-NEXT:    vzeroupper
945; AVX512F-NEXT:    retq
946;
947; AVX512BW-LABEL: v2i64:
948; AVX512BW:       # %bb.0:
949; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm2
950; AVX512BW-NEXT:    vpternlogq {{.*#+}} xmm2 = ~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
956}
957
958define <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
990;
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
1009;
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
1019;
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 {{.*#+}} zmm2 = ~zmm2
1026; AVX512F-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1027; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1028; AVX512F-NEXT:    retq
1029;
1030; AVX512BW-LABEL: v4i64:
1031; AVX512BW:       # %bb.0:
1032; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm2
1033; AVX512BW-NEXT:    vpternlogq {{.*#+}} ymm2 = ~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
1039}
1040
1041define <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
1101;
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
1133;
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
1148;
1149; AVX512-LABEL: v8i64:
1150; AVX512:       # %bb.0:
1151; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2
1152; AVX512-NEXT:    vpternlogq {{.*#+}} zmm2 = ~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
1158}
1159
1160define <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 %r9, %rsi
1165; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1166; SSE-NEXT:    movq $-1, %rdi
1167; SSE-NEXT:    cmovbq %rdi, %rsi
1168; SSE-NEXT:    cmovbq %rdi, %rdx
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
1178;
1179; AVX-LABEL: v2i128:
1180; AVX:       # %bb.0:
1181; AVX-NEXT:    movq %rdi, %rax
1182; AVX-NEXT:    addq %r9, %rsi
1183; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1184; AVX-NEXT:    movq $-1, %rdi
1185; AVX-NEXT:    cmovbq %rdi, %rsi
1186; AVX-NEXT:    cmovbq %rdi, %rdx
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
1198}
1199