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