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.sadd.sat.v1i8(<1 x i8>, <1 x i8>)
11declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
12declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
13declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>)
14declare <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8>, <12 x i8>)
15declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>)
16declare <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8>, <32 x i8>)
17declare <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8>, <64 x i8>)
18
19declare <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16>, <1 x i16>)
20declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>)
21declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>)
22declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>)
23declare <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16>, <12 x i16>)
24declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>)
25declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>)
26
27declare <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1>, <16 x i1>)
28declare <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4>, <16 x i4>)
29
30declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>)
31declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)
32declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>)
33declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>)
34declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>)
35declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>)
36declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>)
37
38declare <4 x i24> @llvm.sadd.sat.v4i24(<4 x i24>, <4 x i24>)
39declare <2 x i128> @llvm.sadd.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:    paddsb %xmm1, %xmm0
47; SSE-NEXT:    retq
48;
49; AVX-LABEL: v16i8:
50; AVX:       # %bb.0:
51; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
52; AVX-NEXT:    retq
53  %z = call <16 x i8> @llvm.sadd.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:    paddsb %xmm2, %xmm0
61; SSE-NEXT:    paddsb %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:    vpaddsb %xmm2, %xmm3, %xmm2
69; AVX1-NEXT:    vpaddsb %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:    vpaddsb %ymm1, %ymm0, %ymm0
76; AVX2-NEXT:    retq
77;
78; AVX512-LABEL: v32i8:
79; AVX512:       # %bb.0:
80; AVX512-NEXT:    vpaddsb %ymm1, %ymm0, %ymm0
81; AVX512-NEXT:    retq
82  %z = call <32 x i8> @llvm.sadd.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:    paddsb %xmm4, %xmm0
90; SSE-NEXT:    paddsb %xmm5, %xmm1
91; SSE-NEXT:    paddsb %xmm6, %xmm2
92; SSE-NEXT:    paddsb %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:    vpaddsb %xmm4, %xmm5, %xmm4
100; AVX1-NEXT:    vpaddsb %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:    vpaddsb %xmm2, %xmm4, %xmm2
105; AVX1-NEXT:    vpaddsb %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:    vpaddsb %ymm2, %ymm0, %ymm0
112; AVX2-NEXT:    vpaddsb %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:    vpaddsb %ymm2, %ymm3, %ymm2
120; AVX512F-NEXT:    vpaddsb %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:    vpaddsb %zmm1, %zmm0, %zmm0
127; AVX512BW-NEXT:    retq
128  %z = call <64 x i8> @llvm.sadd.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:    paddsw %xmm1, %xmm0
136; SSE-NEXT:    retq
137;
138; AVX-LABEL: v8i16:
139; AVX:       # %bb.0:
140; AVX-NEXT:    vpaddsw %xmm1, %xmm0, %xmm0
141; AVX-NEXT:    retq
142  %z = call <8 x i16> @llvm.sadd.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:    paddsw %xmm2, %xmm0
150; SSE-NEXT:    paddsw %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:    vpaddsw %xmm2, %xmm3, %xmm2
158; AVX1-NEXT:    vpaddsw %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:    vpaddsw %ymm1, %ymm0, %ymm0
165; AVX2-NEXT:    retq
166;
167; AVX512-LABEL: v16i16:
168; AVX512:       # %bb.0:
169; AVX512-NEXT:    vpaddsw %ymm1, %ymm0, %ymm0
170; AVX512-NEXT:    retq
171  %z = call <16 x i16> @llvm.sadd.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:    paddsw %xmm4, %xmm0
179; SSE-NEXT:    paddsw %xmm5, %xmm1
180; SSE-NEXT:    paddsw %xmm6, %xmm2
181; SSE-NEXT:    paddsw %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:    vpaddsw %xmm4, %xmm5, %xmm4
189; AVX1-NEXT:    vpaddsw %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:    vpaddsw %xmm2, %xmm4, %xmm2
194; AVX1-NEXT:    vpaddsw %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:    vpaddsw %ymm2, %ymm0, %ymm0
201; AVX2-NEXT:    vpaddsw %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:    vpaddsw %ymm2, %ymm3, %ymm2
209; AVX512F-NEXT:    vpaddsw %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:    vpaddsw %zmm1, %zmm0, %zmm0
216; AVX512BW-NEXT:    retq
217  %z = call <32 x i16> @llvm.sadd.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:    paddsb %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:    vpaddsb %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.sadd.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:    paddsb %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:    vpaddsb %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.sadd.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:    paddsb %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:    paddsb %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:    paddsb %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:    vpaddsb %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.sadd.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:    paddsw %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:    vpaddsw %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.sadd.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:    paddsw %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:    vpaddsw %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.sadd.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:    paddsb %xmm1, %xmm0
368; SSE-NEXT:    retq
369;
370; AVX-LABEL: v12i8:
371; AVX:       # %bb.0:
372; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
373; AVX-NEXT:    retq
374  %z = call <12 x i8> @llvm.sadd.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:    paddsw 16(%rsi), %xmm1
384; SSE-NEXT:    paddsw (%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:    vpaddsw 16(%rsi), %xmm1, %xmm1
394; AVX1-NEXT:    vpaddsw (%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:    vpaddsw (%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:    vpaddsw (%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.sadd.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), %cl
431; SSE-NEXT:    movb (%rsi), %dil
432; SSE-NEXT:    xorl %esi, %esi
433; SSE-NEXT:    movl %ecx, %eax
434; SSE-NEXT:    addb %dil, %al
435; SSE-NEXT:    setns %sil
436; SSE-NEXT:    addl $127, %esi
437; SSE-NEXT:    addb %dil, %cl
438; SSE-NEXT:    movzbl %cl, %eax
439; SSE-NEXT:    cmovol %esi, %eax
440; SSE-NEXT:    movb %al, (%rdx)
441; SSE-NEXT:    retq
442;
443; AVX-LABEL: v1i8:
444; AVX:       # %bb.0:
445; AVX-NEXT:    movb (%rdi), %cl
446; AVX-NEXT:    movb (%rsi), %dil
447; AVX-NEXT:    xorl %esi, %esi
448; AVX-NEXT:    movl %ecx, %eax
449; AVX-NEXT:    addb %dil, %al
450; AVX-NEXT:    setns %sil
451; AVX-NEXT:    addl $127, %esi
452; AVX-NEXT:    addb %dil, %cl
453; AVX-NEXT:    movzbl %cl, %eax
454; AVX-NEXT:    cmovol %esi, %eax
455; AVX-NEXT:    movb %al, (%rdx)
456; AVX-NEXT:    retq
457  %x = load <1 x i8>, <1 x i8>* %px
458  %y = load <1 x i8>, <1 x i8>* %py
459  %z = call <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
460  store <1 x i8> %z, <1 x i8>* %pz
461  ret void
462}
463
464define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
465; SSE-LABEL: v1i16:
466; SSE:       # %bb.0:
467; SSE-NEXT:    movzwl (%rdi), %eax
468; SSE-NEXT:    movzwl (%rsi), %ecx
469; SSE-NEXT:    xorl %esi, %esi
470; SSE-NEXT:    movl %eax, %edi
471; SSE-NEXT:    addw %cx, %di
472; SSE-NEXT:    setns %sil
473; SSE-NEXT:    addl $32767, %esi # imm = 0x7FFF
474; SSE-NEXT:    addw %cx, %ax
475; SSE-NEXT:    cmovol %esi, %eax
476; SSE-NEXT:    movw %ax, (%rdx)
477; SSE-NEXT:    retq
478;
479; AVX-LABEL: v1i16:
480; AVX:       # %bb.0:
481; AVX-NEXT:    movzwl (%rdi), %eax
482; AVX-NEXT:    movzwl (%rsi), %ecx
483; AVX-NEXT:    xorl %esi, %esi
484; AVX-NEXT:    movl %eax, %edi
485; AVX-NEXT:    addw %cx, %di
486; AVX-NEXT:    setns %sil
487; AVX-NEXT:    addl $32767, %esi # imm = 0x7FFF
488; AVX-NEXT:    addw %cx, %ax
489; AVX-NEXT:    cmovol %esi, %eax
490; AVX-NEXT:    movw %ax, (%rdx)
491; AVX-NEXT:    retq
492  %x = load <1 x i16>, <1 x i16>* %px
493  %y = load <1 x i16>, <1 x i16>* %py
494  %z = call <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
495  store <1 x i16> %z, <1 x i16>* %pz
496  ret void
497}
498
499; Promotion
500
501define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
502; SSE-LABEL: v16i4:
503; SSE:       # %bb.0:
504; SSE-NEXT:    psllw $4, %xmm1
505; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
506; SSE-NEXT:    pand %xmm2, %xmm1
507; SSE-NEXT:    psllw $4, %xmm0
508; SSE-NEXT:    pand %xmm2, %xmm0
509; SSE-NEXT:    paddsb %xmm1, %xmm0
510; SSE-NEXT:    psrlw $4, %xmm0
511; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
512; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
513; SSE-NEXT:    pxor %xmm1, %xmm0
514; SSE-NEXT:    psubb %xmm1, %xmm0
515; SSE-NEXT:    retq
516;
517; AVX1-LABEL: v16i4:
518; AVX1:       # %bb.0:
519; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
520; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
521; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
522; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
523; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
524; AVX1-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
525; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
526; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
527; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
528; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
529; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
530; AVX1-NEXT:    retq
531;
532; AVX2-LABEL: v16i4:
533; AVX2:       # %bb.0:
534; AVX2-NEXT:    vpsllw $4, %xmm1, %xmm1
535; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
536; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
537; AVX2-NEXT:    vpsllw $4, %xmm0, %xmm0
538; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
539; AVX2-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
540; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
541; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
542; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
543; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
544; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
545; AVX2-NEXT:    retq
546;
547; AVX512F-LABEL: v16i4:
548; AVX512F:       # %bb.0:
549; AVX512F-NEXT:    vpsllw $4, %xmm1, %xmm1
550; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
551; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
552; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm0
553; AVX512F-NEXT:    vpand %xmm2, %xmm0, %xmm0
554; AVX512F-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
555; AVX512F-NEXT:    vpsrlw $4, %xmm0, %xmm0
556; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
557; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
558; AVX512F-NEXT:    vpxor %xmm1, %xmm0, %xmm0
559; AVX512F-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
560; AVX512F-NEXT:    retq
561;
562; AVX512BW-LABEL: v16i4:
563; AVX512BW:       # %bb.0:
564; AVX512BW-NEXT:    vpsllw $4, %xmm1, %xmm1
565; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
566; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
567; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm0
568; AVX512BW-NEXT:    vpand %xmm2, %xmm0, %xmm0
569; AVX512BW-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
570; AVX512BW-NEXT:    vpsrlw $4, %xmm0, %xmm0
571; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
572; AVX512BW-NEXT:    vpternlogq $108, {{.*}}(%rip), %xmm1, %xmm0
573; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
574; AVX512BW-NEXT:    retq
575  %z = call <16 x i4> @llvm.sadd.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:    orps %xmm1, %xmm0
583; SSE-NEXT:    retq
584;
585; AVX-LABEL: v16i1:
586; AVX:       # %bb.0:
587; AVX-NEXT:    vorps %xmm1, %xmm0, %xmm0
588; AVX-NEXT:    retq
589  %z = call <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
590  ret <16 x i1> %z
591}
592
593; Expanded
594
595define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
596; SSE2-LABEL: v2i32:
597; SSE2:       # %bb.0:
598; SSE2-NEXT:    pxor %xmm2, %xmm2
599; SSE2-NEXT:    pxor %xmm3, %xmm3
600; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
601; SSE2-NEXT:    paddd %xmm0, %xmm1
602; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
603; SSE2-NEXT:    pxor %xmm3, %xmm0
604; SSE2-NEXT:    movdqa %xmm1, %xmm3
605; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
606; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
607; SSE2-NEXT:    psrld $1, %xmm2
608; SSE2-NEXT:    por %xmm3, %xmm2
609; SSE2-NEXT:    pand %xmm0, %xmm2
610; SSE2-NEXT:    pandn %xmm1, %xmm0
611; SSE2-NEXT:    por %xmm2, %xmm0
612; SSE2-NEXT:    retq
613;
614; SSSE3-LABEL: v2i32:
615; SSSE3:       # %bb.0:
616; SSSE3-NEXT:    pxor %xmm2, %xmm2
617; SSSE3-NEXT:    pxor %xmm3, %xmm3
618; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
619; SSSE3-NEXT:    paddd %xmm0, %xmm1
620; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
621; SSSE3-NEXT:    pxor %xmm3, %xmm0
622; SSSE3-NEXT:    movdqa %xmm1, %xmm3
623; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
624; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
625; SSSE3-NEXT:    psrld $1, %xmm2
626; SSSE3-NEXT:    por %xmm3, %xmm2
627; SSSE3-NEXT:    pand %xmm0, %xmm2
628; SSSE3-NEXT:    pandn %xmm1, %xmm0
629; SSSE3-NEXT:    por %xmm2, %xmm0
630; SSSE3-NEXT:    retq
631;
632; SSE41-LABEL: v2i32:
633; SSE41:       # %bb.0:
634; SSE41-NEXT:    movdqa %xmm0, %xmm2
635; SSE41-NEXT:    movdqa %xmm0, %xmm3
636; SSE41-NEXT:    paddd %xmm1, %xmm3
637; SSE41-NEXT:    movaps {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
638; SSE41-NEXT:    movdqa %xmm3, %xmm0
639; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm4
640; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
641; SSE41-NEXT:    pxor %xmm1, %xmm2
642; SSE41-NEXT:    movdqa %xmm2, %xmm0
643; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm3
644; SSE41-NEXT:    movaps %xmm3, %xmm0
645; SSE41-NEXT:    retq
646;
647; AVX1-LABEL: v2i32:
648; AVX1:       # %bb.0:
649; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
650; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
651; AVX1-NEXT:    vblendvps %xmm2, {{.*}}(%rip), %xmm3, %xmm3
652; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
653; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
654; AVX1-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
655; AVX1-NEXT:    retq
656;
657; AVX2-LABEL: v2i32:
658; AVX2:       # %bb.0:
659; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
660; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
661; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
662; AVX2-NEXT:    vblendvps %xmm2, %xmm3, %xmm4, %xmm3
663; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
664; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
665; AVX2-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
666; AVX2-NEXT:    retq
667;
668; AVX512F-LABEL: v2i32:
669; AVX512F:       # %bb.0:
670; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
671; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
672; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
673; AVX512F-NEXT:    vblendvps %xmm2, %xmm3, %xmm4, %xmm3
674; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
675; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
676; AVX512F-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
677; AVX512F-NEXT:    retq
678;
679; AVX512BW-LABEL: v2i32:
680; AVX512BW:       # %bb.0:
681; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
682; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k0
683; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
684; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
685; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
686; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k2
687; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
688; AVX512BW-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
689; AVX512BW-NEXT:    vmovdqa32 %xmm0, %xmm1 {%k1}
690; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
691; AVX512BW-NEXT:    retq
692  %z = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
693  ret <2 x i32> %z
694}
695
696define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
697; SSE2-LABEL: v4i32:
698; SSE2:       # %bb.0:
699; SSE2-NEXT:    pxor %xmm2, %xmm2
700; SSE2-NEXT:    pxor %xmm3, %xmm3
701; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
702; SSE2-NEXT:    paddd %xmm0, %xmm1
703; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
704; SSE2-NEXT:    pxor %xmm3, %xmm0
705; SSE2-NEXT:    movdqa %xmm1, %xmm3
706; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
707; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
708; SSE2-NEXT:    psrld $1, %xmm2
709; SSE2-NEXT:    por %xmm3, %xmm2
710; SSE2-NEXT:    pand %xmm0, %xmm2
711; SSE2-NEXT:    pandn %xmm1, %xmm0
712; SSE2-NEXT:    por %xmm2, %xmm0
713; SSE2-NEXT:    retq
714;
715; SSSE3-LABEL: v4i32:
716; SSSE3:       # %bb.0:
717; SSSE3-NEXT:    pxor %xmm2, %xmm2
718; SSSE3-NEXT:    pxor %xmm3, %xmm3
719; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
720; SSSE3-NEXT:    paddd %xmm0, %xmm1
721; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
722; SSSE3-NEXT:    pxor %xmm3, %xmm0
723; SSSE3-NEXT:    movdqa %xmm1, %xmm3
724; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
725; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
726; SSSE3-NEXT:    psrld $1, %xmm2
727; SSSE3-NEXT:    por %xmm3, %xmm2
728; SSSE3-NEXT:    pand %xmm0, %xmm2
729; SSSE3-NEXT:    pandn %xmm1, %xmm0
730; SSSE3-NEXT:    por %xmm2, %xmm0
731; SSSE3-NEXT:    retq
732;
733; SSE41-LABEL: v4i32:
734; SSE41:       # %bb.0:
735; SSE41-NEXT:    movdqa %xmm0, %xmm2
736; SSE41-NEXT:    movdqa %xmm0, %xmm3
737; SSE41-NEXT:    paddd %xmm1, %xmm3
738; SSE41-NEXT:    movaps {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
739; SSE41-NEXT:    movdqa %xmm3, %xmm0
740; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm4
741; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
742; SSE41-NEXT:    pxor %xmm1, %xmm2
743; SSE41-NEXT:    movdqa %xmm2, %xmm0
744; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm3
745; SSE41-NEXT:    movaps %xmm3, %xmm0
746; SSE41-NEXT:    retq
747;
748; AVX1-LABEL: v4i32:
749; AVX1:       # %bb.0:
750; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
751; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
752; AVX1-NEXT:    vblendvps %xmm2, {{.*}}(%rip), %xmm3, %xmm3
753; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
754; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
755; AVX1-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
756; AVX1-NEXT:    retq
757;
758; AVX2-LABEL: v4i32:
759; AVX2:       # %bb.0:
760; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
761; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
762; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
763; AVX2-NEXT:    vblendvps %xmm2, %xmm3, %xmm4, %xmm3
764; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
765; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
766; AVX2-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
767; AVX2-NEXT:    retq
768;
769; AVX512F-LABEL: v4i32:
770; AVX512F:       # %bb.0:
771; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
772; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
773; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
774; AVX512F-NEXT:    vblendvps %xmm2, %xmm3, %xmm4, %xmm3
775; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
776; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
777; AVX512F-NEXT:    vblendvps %xmm0, %xmm3, %xmm2, %xmm0
778; AVX512F-NEXT:    retq
779;
780; AVX512BW-LABEL: v4i32:
781; AVX512BW:       # %bb.0:
782; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
783; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k0
784; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
785; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
786; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
787; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k2
788; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
789; AVX512BW-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
790; AVX512BW-NEXT:    vmovdqa32 %xmm0, %xmm1 {%k1}
791; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
792; AVX512BW-NEXT:    retq
793  %z = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
794  ret <4 x i32> %z
795}
796
797define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
798; SSE2-LABEL: v8i32:
799; SSE2:       # %bb.0:
800; SSE2-NEXT:    pxor %xmm4, %xmm4
801; SSE2-NEXT:    pxor %xmm5, %xmm5
802; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
803; SSE2-NEXT:    paddd %xmm0, %xmm2
804; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
805; SSE2-NEXT:    pxor %xmm5, %xmm0
806; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
807; SSE2-NEXT:    movdqa %xmm2, %xmm6
808; SSE2-NEXT:    pandn %xmm5, %xmm6
809; SSE2-NEXT:    pxor %xmm7, %xmm7
810; SSE2-NEXT:    pcmpgtd %xmm2, %xmm7
811; SSE2-NEXT:    psrld $1, %xmm7
812; SSE2-NEXT:    por %xmm6, %xmm7
813; SSE2-NEXT:    pand %xmm0, %xmm7
814; SSE2-NEXT:    pandn %xmm2, %xmm0
815; SSE2-NEXT:    por %xmm7, %xmm0
816; SSE2-NEXT:    pxor %xmm2, %xmm2
817; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
818; SSE2-NEXT:    paddd %xmm1, %xmm3
819; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
820; SSE2-NEXT:    pxor %xmm2, %xmm1
821; SSE2-NEXT:    movdqa %xmm3, %xmm2
822; SSE2-NEXT:    pandn %xmm5, %xmm2
823; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
824; SSE2-NEXT:    psrld $1, %xmm4
825; SSE2-NEXT:    por %xmm2, %xmm4
826; SSE2-NEXT:    pand %xmm1, %xmm4
827; SSE2-NEXT:    pandn %xmm3, %xmm1
828; SSE2-NEXT:    por %xmm4, %xmm1
829; SSE2-NEXT:    retq
830;
831; SSSE3-LABEL: v8i32:
832; SSSE3:       # %bb.0:
833; SSSE3-NEXT:    pxor %xmm4, %xmm4
834; SSSE3-NEXT:    pxor %xmm5, %xmm5
835; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
836; SSSE3-NEXT:    paddd %xmm0, %xmm2
837; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
838; SSSE3-NEXT:    pxor %xmm5, %xmm0
839; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
840; SSSE3-NEXT:    movdqa %xmm2, %xmm6
841; SSSE3-NEXT:    pandn %xmm5, %xmm6
842; SSSE3-NEXT:    pxor %xmm7, %xmm7
843; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm7
844; SSSE3-NEXT:    psrld $1, %xmm7
845; SSSE3-NEXT:    por %xmm6, %xmm7
846; SSSE3-NEXT:    pand %xmm0, %xmm7
847; SSSE3-NEXT:    pandn %xmm2, %xmm0
848; SSSE3-NEXT:    por %xmm7, %xmm0
849; SSSE3-NEXT:    pxor %xmm2, %xmm2
850; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
851; SSSE3-NEXT:    paddd %xmm1, %xmm3
852; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
853; SSSE3-NEXT:    pxor %xmm2, %xmm1
854; SSSE3-NEXT:    movdqa %xmm3, %xmm2
855; SSSE3-NEXT:    pandn %xmm5, %xmm2
856; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
857; SSSE3-NEXT:    psrld $1, %xmm4
858; SSSE3-NEXT:    por %xmm2, %xmm4
859; SSSE3-NEXT:    pand %xmm1, %xmm4
860; SSSE3-NEXT:    pandn %xmm3, %xmm1
861; SSSE3-NEXT:    por %xmm4, %xmm1
862; SSSE3-NEXT:    retq
863;
864; SSE41-LABEL: v8i32:
865; SSE41:       # %bb.0:
866; SSE41-NEXT:    movdqa %xmm0, %xmm4
867; SSE41-NEXT:    movdqa %xmm0, %xmm5
868; SSE41-NEXT:    paddd %xmm2, %xmm5
869; SSE41-NEXT:    movaps {{.*#+}} xmm8 = [2147483647,2147483647,2147483647,2147483647]
870; SSE41-NEXT:    movaps {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
871; SSE41-NEXT:    movaps %xmm6, %xmm7
872; SSE41-NEXT:    movdqa %xmm5, %xmm0
873; SSE41-NEXT:    blendvps %xmm0, %xmm8, %xmm7
874; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
875; SSE41-NEXT:    pxor %xmm2, %xmm4
876; SSE41-NEXT:    movdqa %xmm4, %xmm0
877; SSE41-NEXT:    blendvps %xmm0, %xmm7, %xmm5
878; SSE41-NEXT:    movdqa %xmm1, %xmm2
879; SSE41-NEXT:    paddd %xmm3, %xmm2
880; SSE41-NEXT:    movdqa %xmm2, %xmm0
881; SSE41-NEXT:    blendvps %xmm0, %xmm8, %xmm6
882; SSE41-NEXT:    pcmpgtd %xmm2, %xmm1
883; SSE41-NEXT:    pxor %xmm3, %xmm1
884; SSE41-NEXT:    movdqa %xmm1, %xmm0
885; SSE41-NEXT:    blendvps %xmm0, %xmm6, %xmm2
886; SSE41-NEXT:    movaps %xmm5, %xmm0
887; SSE41-NEXT:    movaps %xmm2, %xmm1
888; SSE41-NEXT:    retq
889;
890; AVX1-LABEL: v8i32:
891; AVX1:       # %bb.0:
892; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
893; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
894; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
895; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm4
896; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm5
897; AVX1-NEXT:    vmovaps {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
898; AVX1-NEXT:    vblendvps %ymm5, {{.*}}(%rip), %ymm6, %ymm6
899; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm2
900; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm0, %xmm0
901; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
902; AVX1-NEXT:    vxorps %ymm0, %ymm1, %ymm0
903; AVX1-NEXT:    vblendvps %ymm0, %ymm6, %ymm5, %ymm0
904; AVX1-NEXT:    retq
905;
906; AVX2-LABEL: v8i32:
907; AVX2:       # %bb.0:
908; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm2
909; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
910; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
911; AVX2-NEXT:    vblendvps %ymm2, %ymm3, %ymm4, %ymm3
912; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
913; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
914; AVX2-NEXT:    vblendvps %ymm0, %ymm3, %ymm2, %ymm0
915; AVX2-NEXT:    retq
916;
917; AVX512F-LABEL: v8i32:
918; AVX512F:       # %bb.0:
919; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm2
920; AVX512F-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
921; AVX512F-NEXT:    vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
922; AVX512F-NEXT:    vblendvps %ymm2, %ymm3, %ymm4, %ymm3
923; AVX512F-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
924; AVX512F-NEXT:    vpxor %ymm0, %ymm1, %ymm0
925; AVX512F-NEXT:    vblendvps %ymm0, %ymm3, %ymm2, %ymm0
926; AVX512F-NEXT:    retq
927;
928; AVX512BW-LABEL: v8i32:
929; AVX512BW:       # %bb.0:
930; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
931; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm2, %k0
932; AVX512BW-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
933; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm0, %k1
934; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
935; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm2, %k2
936; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
937; AVX512BW-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k2}
938; AVX512BW-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
939; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
940; AVX512BW-NEXT:    retq
941  %z = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
942  ret <8 x i32> %z
943}
944
945define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
946; SSE2-LABEL: v16i32:
947; SSE2:       # %bb.0:
948; SSE2-NEXT:    pxor %xmm8, %xmm8
949; SSE2-NEXT:    pxor %xmm9, %xmm9
950; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
951; SSE2-NEXT:    paddd %xmm0, %xmm4
952; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
953; SSE2-NEXT:    pxor %xmm9, %xmm0
954; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
955; SSE2-NEXT:    movdqa %xmm4, %xmm10
956; SSE2-NEXT:    pandn %xmm9, %xmm10
957; SSE2-NEXT:    pxor %xmm11, %xmm11
958; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
959; SSE2-NEXT:    psrld $1, %xmm11
960; SSE2-NEXT:    por %xmm10, %xmm11
961; SSE2-NEXT:    pand %xmm0, %xmm11
962; SSE2-NEXT:    pandn %xmm4, %xmm0
963; SSE2-NEXT:    por %xmm11, %xmm0
964; SSE2-NEXT:    pxor %xmm4, %xmm4
965; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
966; SSE2-NEXT:    paddd %xmm1, %xmm5
967; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
968; SSE2-NEXT:    pxor %xmm4, %xmm1
969; SSE2-NEXT:    movdqa %xmm5, %xmm10
970; SSE2-NEXT:    pandn %xmm9, %xmm10
971; SSE2-NEXT:    pxor %xmm4, %xmm4
972; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
973; SSE2-NEXT:    psrld $1, %xmm4
974; SSE2-NEXT:    por %xmm10, %xmm4
975; SSE2-NEXT:    pand %xmm1, %xmm4
976; SSE2-NEXT:    pandn %xmm5, %xmm1
977; SSE2-NEXT:    por %xmm4, %xmm1
978; SSE2-NEXT:    pxor %xmm4, %xmm4
979; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
980; SSE2-NEXT:    paddd %xmm2, %xmm6
981; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
982; SSE2-NEXT:    pxor %xmm4, %xmm2
983; SSE2-NEXT:    movdqa %xmm6, %xmm4
984; SSE2-NEXT:    pandn %xmm9, %xmm4
985; SSE2-NEXT:    pxor %xmm5, %xmm5
986; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
987; SSE2-NEXT:    psrld $1, %xmm5
988; SSE2-NEXT:    por %xmm4, %xmm5
989; SSE2-NEXT:    pand %xmm2, %xmm5
990; SSE2-NEXT:    pandn %xmm6, %xmm2
991; SSE2-NEXT:    por %xmm5, %xmm2
992; SSE2-NEXT:    pxor %xmm4, %xmm4
993; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
994; SSE2-NEXT:    paddd %xmm3, %xmm7
995; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
996; SSE2-NEXT:    pxor %xmm4, %xmm3
997; SSE2-NEXT:    movdqa %xmm7, %xmm4
998; SSE2-NEXT:    pandn %xmm9, %xmm4
999; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
1000; SSE2-NEXT:    psrld $1, %xmm8
1001; SSE2-NEXT:    por %xmm4, %xmm8
1002; SSE2-NEXT:    pand %xmm3, %xmm8
1003; SSE2-NEXT:    pandn %xmm7, %xmm3
1004; SSE2-NEXT:    por %xmm8, %xmm3
1005; SSE2-NEXT:    retq
1006;
1007; SSSE3-LABEL: v16i32:
1008; SSSE3:       # %bb.0:
1009; SSSE3-NEXT:    pxor %xmm8, %xmm8
1010; SSSE3-NEXT:    pxor %xmm9, %xmm9
1011; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
1012; SSSE3-NEXT:    paddd %xmm0, %xmm4
1013; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
1014; SSSE3-NEXT:    pxor %xmm9, %xmm0
1015; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
1016; SSSE3-NEXT:    movdqa %xmm4, %xmm10
1017; SSSE3-NEXT:    pandn %xmm9, %xmm10
1018; SSSE3-NEXT:    pxor %xmm11, %xmm11
1019; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm11
1020; SSSE3-NEXT:    psrld $1, %xmm11
1021; SSSE3-NEXT:    por %xmm10, %xmm11
1022; SSSE3-NEXT:    pand %xmm0, %xmm11
1023; SSSE3-NEXT:    pandn %xmm4, %xmm0
1024; SSSE3-NEXT:    por %xmm11, %xmm0
1025; SSSE3-NEXT:    pxor %xmm4, %xmm4
1026; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1027; SSSE3-NEXT:    paddd %xmm1, %xmm5
1028; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
1029; SSSE3-NEXT:    pxor %xmm4, %xmm1
1030; SSSE3-NEXT:    movdqa %xmm5, %xmm10
1031; SSSE3-NEXT:    pandn %xmm9, %xmm10
1032; SSSE3-NEXT:    pxor %xmm4, %xmm4
1033; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1034; SSSE3-NEXT:    psrld $1, %xmm4
1035; SSSE3-NEXT:    por %xmm10, %xmm4
1036; SSSE3-NEXT:    pand %xmm1, %xmm4
1037; SSSE3-NEXT:    pandn %xmm5, %xmm1
1038; SSSE3-NEXT:    por %xmm4, %xmm1
1039; SSSE3-NEXT:    pxor %xmm4, %xmm4
1040; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
1041; SSSE3-NEXT:    paddd %xmm2, %xmm6
1042; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1043; SSSE3-NEXT:    pxor %xmm4, %xmm2
1044; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1045; SSSE3-NEXT:    pandn %xmm9, %xmm4
1046; SSSE3-NEXT:    pxor %xmm5, %xmm5
1047; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
1048; SSSE3-NEXT:    psrld $1, %xmm5
1049; SSSE3-NEXT:    por %xmm4, %xmm5
1050; SSSE3-NEXT:    pand %xmm2, %xmm5
1051; SSSE3-NEXT:    pandn %xmm6, %xmm2
1052; SSSE3-NEXT:    por %xmm5, %xmm2
1053; SSSE3-NEXT:    pxor %xmm4, %xmm4
1054; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
1055; SSSE3-NEXT:    paddd %xmm3, %xmm7
1056; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
1057; SSSE3-NEXT:    pxor %xmm4, %xmm3
1058; SSSE3-NEXT:    movdqa %xmm7, %xmm4
1059; SSSE3-NEXT:    pandn %xmm9, %xmm4
1060; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm8
1061; SSSE3-NEXT:    psrld $1, %xmm8
1062; SSSE3-NEXT:    por %xmm4, %xmm8
1063; SSSE3-NEXT:    pand %xmm3, %xmm8
1064; SSSE3-NEXT:    pandn %xmm7, %xmm3
1065; SSSE3-NEXT:    por %xmm8, %xmm3
1066; SSSE3-NEXT:    retq
1067;
1068; SSE41-LABEL: v16i32:
1069; SSE41:       # %bb.0:
1070; SSE41-NEXT:    movdqa %xmm3, %xmm8
1071; SSE41-NEXT:    movdqa %xmm2, %xmm12
1072; SSE41-NEXT:    movdqa %xmm0, %xmm3
1073; SSE41-NEXT:    movdqa %xmm0, %xmm9
1074; SSE41-NEXT:    paddd %xmm4, %xmm9
1075; SSE41-NEXT:    movaps {{.*#+}} xmm11 = [2147483647,2147483647,2147483647,2147483647]
1076; SSE41-NEXT:    movaps {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
1077; SSE41-NEXT:    movaps %xmm10, %xmm2
1078; SSE41-NEXT:    movdqa %xmm9, %xmm0
1079; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm2
1080; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
1081; SSE41-NEXT:    pxor %xmm4, %xmm3
1082; SSE41-NEXT:    movdqa %xmm3, %xmm0
1083; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm9
1084; SSE41-NEXT:    movdqa %xmm1, %xmm4
1085; SSE41-NEXT:    paddd %xmm5, %xmm4
1086; SSE41-NEXT:    movaps %xmm10, %xmm2
1087; SSE41-NEXT:    movdqa %xmm4, %xmm0
1088; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm2
1089; SSE41-NEXT:    pcmpgtd %xmm4, %xmm1
1090; SSE41-NEXT:    pxor %xmm5, %xmm1
1091; SSE41-NEXT:    movdqa %xmm1, %xmm0
1092; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm4
1093; SSE41-NEXT:    movdqa %xmm12, %xmm3
1094; SSE41-NEXT:    paddd %xmm6, %xmm3
1095; SSE41-NEXT:    movaps %xmm10, %xmm1
1096; SSE41-NEXT:    movdqa %xmm3, %xmm0
1097; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm1
1098; SSE41-NEXT:    pcmpgtd %xmm3, %xmm12
1099; SSE41-NEXT:    pxor %xmm6, %xmm12
1100; SSE41-NEXT:    movdqa %xmm12, %xmm0
1101; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
1102; SSE41-NEXT:    movdqa %xmm8, %xmm5
1103; SSE41-NEXT:    paddd %xmm7, %xmm5
1104; SSE41-NEXT:    movdqa %xmm5, %xmm0
1105; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm10
1106; SSE41-NEXT:    pcmpgtd %xmm5, %xmm8
1107; SSE41-NEXT:    pxor %xmm7, %xmm8
1108; SSE41-NEXT:    movdqa %xmm8, %xmm0
1109; SSE41-NEXT:    blendvps %xmm0, %xmm10, %xmm5
1110; SSE41-NEXT:    movaps %xmm9, %xmm0
1111; SSE41-NEXT:    movaps %xmm4, %xmm1
1112; SSE41-NEXT:    movaps %xmm3, %xmm2
1113; SSE41-NEXT:    movaps %xmm5, %xmm3
1114; SSE41-NEXT:    retq
1115;
1116; AVX1-LABEL: v16i32:
1117; AVX1:       # %bb.0:
1118; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1119; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1120; AVX1-NEXT:    vpaddd %xmm4, %xmm5, %xmm4
1121; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm6
1122; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm7
1123; AVX1-NEXT:    vmovaps {{.*#+}} ymm8 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1124; AVX1-NEXT:    vmovaps {{.*#+}} ymm9 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1125; AVX1-NEXT:    vblendvps %ymm7, %ymm8, %ymm9, %ymm10
1126; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm5, %xmm4
1127; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm0, %xmm0
1128; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1129; AVX1-NEXT:    vxorps %ymm0, %ymm2, %ymm0
1130; AVX1-NEXT:    vblendvps %ymm0, %ymm10, %ymm7, %ymm0
1131; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1132; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1133; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm2
1134; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm5
1135; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm5, %ymm6
1136; AVX1-NEXT:    vblendvps %ymm6, %ymm8, %ymm9, %ymm7
1137; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm4, %xmm2
1138; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm1, %xmm1
1139; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1140; AVX1-NEXT:    vxorps %ymm1, %ymm3, %ymm1
1141; AVX1-NEXT:    vblendvps %ymm1, %ymm7, %ymm6, %ymm1
1142; AVX1-NEXT:    retq
1143;
1144; AVX2-LABEL: v16i32:
1145; AVX2:       # %bb.0:
1146; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm4
1147; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1148; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1149; AVX2-NEXT:    vblendvps %ymm4, %ymm5, %ymm6, %ymm7
1150; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm0, %ymm0
1151; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1152; AVX2-NEXT:    vblendvps %ymm0, %ymm7, %ymm4, %ymm0
1153; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm2
1154; AVX2-NEXT:    vblendvps %ymm2, %ymm5, %ymm6, %ymm4
1155; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm1, %ymm1
1156; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1157; AVX2-NEXT:    vblendvps %ymm1, %ymm4, %ymm2, %ymm1
1158; AVX2-NEXT:    retq
1159;
1160; AVX512-LABEL: v16i32:
1161; AVX512:       # %bb.0:
1162; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1163; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm2, %k0
1164; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
1165; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
1166; AVX512-NEXT:    kxorw %k1, %k0, %k1
1167; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm2, %k2
1168; AVX512-NEXT:    vpbroadcastd {{.*#+}} zmm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1169; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k2}
1170; AVX512-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1171; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1172; AVX512-NEXT:    retq
1173  %z = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1174  ret <16 x i32> %z
1175}
1176
1177define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1178; SSE2-LABEL: v2i64:
1179; SSE2:       # %bb.0:
1180; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1181; SSE2-NEXT:    movdqa %xmm0, %xmm3
1182; SSE2-NEXT:    pxor %xmm2, %xmm3
1183; SSE2-NEXT:    paddq %xmm1, %xmm0
1184; SSE2-NEXT:    pxor %xmm0, %xmm2
1185; SSE2-NEXT:    movdqa %xmm3, %xmm4
1186; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1187; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1188; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1189; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1190; SSE2-NEXT:    pand %xmm5, %xmm2
1191; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1192; SSE2-NEXT:    por %xmm2, %xmm3
1193; SSE2-NEXT:    pxor %xmm2, %xmm2
1194; SSE2-NEXT:    pxor %xmm4, %xmm4
1195; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1196; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1197; SSE2-NEXT:    pxor %xmm3, %xmm1
1198; SSE2-NEXT:    movdqa %xmm1, %xmm3
1199; SSE2-NEXT:    pandn %xmm0, %xmm3
1200; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1201; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm0
1202; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1203; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1204; SSE2-NEXT:    por %xmm2, %xmm0
1205; SSE2-NEXT:    pand %xmm1, %xmm0
1206; SSE2-NEXT:    por %xmm3, %xmm0
1207; SSE2-NEXT:    retq
1208;
1209; SSSE3-LABEL: v2i64:
1210; SSSE3:       # %bb.0:
1211; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1212; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1213; SSSE3-NEXT:    pxor %xmm2, %xmm3
1214; SSSE3-NEXT:    paddq %xmm1, %xmm0
1215; SSSE3-NEXT:    pxor %xmm0, %xmm2
1216; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1217; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1218; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1219; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
1220; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1221; SSSE3-NEXT:    pand %xmm5, %xmm2
1222; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1223; SSSE3-NEXT:    por %xmm2, %xmm3
1224; SSSE3-NEXT:    pxor %xmm2, %xmm2
1225; SSSE3-NEXT:    pxor %xmm4, %xmm4
1226; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1227; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1228; SSSE3-NEXT:    pxor %xmm3, %xmm1
1229; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1230; SSSE3-NEXT:    pandn %xmm0, %xmm3
1231; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
1232; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm0
1233; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1234; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm2
1235; SSSE3-NEXT:    por %xmm2, %xmm0
1236; SSSE3-NEXT:    pand %xmm1, %xmm0
1237; SSSE3-NEXT:    por %xmm3, %xmm0
1238; SSSE3-NEXT:    retq
1239;
1240; SSE41-LABEL: v2i64:
1241; SSE41:       # %bb.0:
1242; SSE41-NEXT:    movdqa %xmm0, %xmm2
1243; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1244; SSE41-NEXT:    movdqa %xmm2, %xmm4
1245; SSE41-NEXT:    pxor %xmm0, %xmm4
1246; SSE41-NEXT:    paddq %xmm1, %xmm2
1247; SSE41-NEXT:    pxor %xmm2, %xmm0
1248; SSE41-NEXT:    movdqa %xmm4, %xmm5
1249; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1250; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1251; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
1252; SSE41-NEXT:    pand %xmm5, %xmm3
1253; SSE41-NEXT:    por %xmm4, %xmm3
1254; SSE41-NEXT:    pxor %xmm1, %xmm3
1255; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1256; SSE41-NEXT:    movdqa %xmm2, %xmm0
1257; SSE41-NEXT:    blendvpd %xmm0, {{.*}}(%rip), %xmm1
1258; SSE41-NEXT:    movdqa %xmm3, %xmm0
1259; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1260; SSE41-NEXT:    movapd %xmm2, %xmm0
1261; SSE41-NEXT:    retq
1262;
1263; AVX1-LABEL: v2i64:
1264; AVX1:       # %bb.0:
1265; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1266; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1267; AVX1-NEXT:    vblendvpd %xmm2, {{.*}}(%rip), %xmm3, %xmm3
1268; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1269; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1270; AVX1-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1271; AVX1-NEXT:    retq
1272;
1273; AVX2-LABEL: v2i64:
1274; AVX2:       # %bb.0:
1275; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1276; AVX2-NEXT:    vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1277; AVX2-NEXT:    vblendvpd %xmm2, {{.*}}(%rip), %xmm3, %xmm3
1278; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1279; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1280; AVX2-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1281; AVX2-NEXT:    retq
1282;
1283; AVX512F-LABEL: v2i64:
1284; AVX512F:       # %bb.0:
1285; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1286; AVX512F-NEXT:    vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1287; AVX512F-NEXT:    vblendvpd %xmm2, {{.*}}(%rip), %xmm3, %xmm3
1288; AVX512F-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1289; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1290; AVX512F-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1291; AVX512F-NEXT:    retq
1292;
1293; AVX512BW-LABEL: v2i64:
1294; AVX512BW:       # %bb.0:
1295; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1296; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm2, %k0
1297; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
1298; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1299; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1300; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm2, %k2
1301; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1302; AVX512BW-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k2}
1303; AVX512BW-NEXT:    vmovdqa64 %xmm0, %xmm1 {%k1}
1304; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
1305; AVX512BW-NEXT:    retq
1306  %z = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1307  ret <2 x i64> %z
1308}
1309
1310define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1311; SSE2-LABEL: v4i64:
1312; SSE2:       # %bb.0:
1313; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1314; SSE2-NEXT:    movdqa %xmm0, %xmm5
1315; SSE2-NEXT:    pxor %xmm4, %xmm5
1316; SSE2-NEXT:    paddq %xmm2, %xmm0
1317; SSE2-NEXT:    movdqa %xmm0, %xmm6
1318; SSE2-NEXT:    pxor %xmm4, %xmm6
1319; SSE2-NEXT:    movdqa %xmm5, %xmm7
1320; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1321; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1322; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1323; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1324; SSE2-NEXT:    pand %xmm8, %xmm5
1325; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1326; SSE2-NEXT:    por %xmm5, %xmm6
1327; SSE2-NEXT:    pxor %xmm5, %xmm5
1328; SSE2-NEXT:    pxor %xmm7, %xmm7
1329; SSE2-NEXT:    pcmpgtd %xmm2, %xmm7
1330; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1331; SSE2-NEXT:    pxor %xmm6, %xmm7
1332; SSE2-NEXT:    movdqa %xmm7, %xmm2
1333; SSE2-NEXT:    pandn %xmm0, %xmm2
1334; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1335; SSE2-NEXT:    pxor %xmm6, %xmm6
1336; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
1337; SSE2-NEXT:    pandn %xmm8, %xmm0
1338; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1339; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775807,9223372036854775807]
1340; SSE2-NEXT:    pand %xmm9, %xmm6
1341; SSE2-NEXT:    por %xmm6, %xmm0
1342; SSE2-NEXT:    pand %xmm7, %xmm0
1343; SSE2-NEXT:    por %xmm2, %xmm0
1344; SSE2-NEXT:    movdqa %xmm1, %xmm2
1345; SSE2-NEXT:    pxor %xmm4, %xmm2
1346; SSE2-NEXT:    paddq %xmm3, %xmm1
1347; SSE2-NEXT:    pxor %xmm1, %xmm4
1348; SSE2-NEXT:    movdqa %xmm2, %xmm6
1349; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1350; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1351; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1352; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1353; SSE2-NEXT:    pand %xmm7, %xmm2
1354; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1355; SSE2-NEXT:    por %xmm2, %xmm4
1356; SSE2-NEXT:    pxor %xmm2, %xmm2
1357; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1358; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1359; SSE2-NEXT:    pxor %xmm4, %xmm2
1360; SSE2-NEXT:    movdqa %xmm2, %xmm3
1361; SSE2-NEXT:    pandn %xmm1, %xmm3
1362; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1363; SSE2-NEXT:    pandn %xmm8, %xmm1
1364; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1365; SSE2-NEXT:    pand %xmm9, %xmm4
1366; SSE2-NEXT:    por %xmm4, %xmm1
1367; SSE2-NEXT:    pand %xmm2, %xmm1
1368; SSE2-NEXT:    por %xmm3, %xmm1
1369; SSE2-NEXT:    retq
1370;
1371; SSSE3-LABEL: v4i64:
1372; SSSE3:       # %bb.0:
1373; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1374; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1375; SSSE3-NEXT:    pxor %xmm4, %xmm5
1376; SSSE3-NEXT:    paddq %xmm2, %xmm0
1377; SSSE3-NEXT:    movdqa %xmm0, %xmm6
1378; SSSE3-NEXT:    pxor %xmm4, %xmm6
1379; SSSE3-NEXT:    movdqa %xmm5, %xmm7
1380; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1381; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1382; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
1383; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1384; SSSE3-NEXT:    pand %xmm8, %xmm5
1385; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1386; SSSE3-NEXT:    por %xmm5, %xmm6
1387; SSSE3-NEXT:    pxor %xmm5, %xmm5
1388; SSSE3-NEXT:    pxor %xmm7, %xmm7
1389; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm7
1390; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1391; SSSE3-NEXT:    pxor %xmm6, %xmm7
1392; SSSE3-NEXT:    movdqa %xmm7, %xmm2
1393; SSSE3-NEXT:    pandn %xmm0, %xmm2
1394; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1395; SSSE3-NEXT:    pxor %xmm6, %xmm6
1396; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm6
1397; SSSE3-NEXT:    pandn %xmm8, %xmm0
1398; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1399; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775807,9223372036854775807]
1400; SSSE3-NEXT:    pand %xmm9, %xmm6
1401; SSSE3-NEXT:    por %xmm6, %xmm0
1402; SSSE3-NEXT:    pand %xmm7, %xmm0
1403; SSSE3-NEXT:    por %xmm2, %xmm0
1404; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1405; SSSE3-NEXT:    pxor %xmm4, %xmm2
1406; SSSE3-NEXT:    paddq %xmm3, %xmm1
1407; SSSE3-NEXT:    pxor %xmm1, %xmm4
1408; SSSE3-NEXT:    movdqa %xmm2, %xmm6
1409; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1410; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1411; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1412; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1413; SSSE3-NEXT:    pand %xmm7, %xmm2
1414; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1415; SSSE3-NEXT:    por %xmm2, %xmm4
1416; SSSE3-NEXT:    pxor %xmm2, %xmm2
1417; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
1418; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1419; SSSE3-NEXT:    pxor %xmm4, %xmm2
1420; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1421; SSSE3-NEXT:    pandn %xmm1, %xmm3
1422; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1423; SSSE3-NEXT:    pandn %xmm8, %xmm1
1424; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1425; SSSE3-NEXT:    pand %xmm9, %xmm4
1426; SSSE3-NEXT:    por %xmm4, %xmm1
1427; SSSE3-NEXT:    pand %xmm2, %xmm1
1428; SSSE3-NEXT:    por %xmm3, %xmm1
1429; SSSE3-NEXT:    retq
1430;
1431; SSE41-LABEL: v4i64:
1432; SSE41:       # %bb.0:
1433; SSE41-NEXT:    movdqa %xmm0, %xmm4
1434; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1435; SSE41-NEXT:    pxor %xmm6, %xmm0
1436; SSE41-NEXT:    paddq %xmm2, %xmm4
1437; SSE41-NEXT:    movdqa %xmm4, %xmm5
1438; SSE41-NEXT:    pxor %xmm6, %xmm5
1439; SSE41-NEXT:    movdqa %xmm0, %xmm7
1440; SSE41-NEXT:    pcmpeqd %xmm5, %xmm7
1441; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1442; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1443; SSE41-NEXT:    pand %xmm7, %xmm5
1444; SSE41-NEXT:    por %xmm0, %xmm5
1445; SSE41-NEXT:    pxor %xmm2, %xmm5
1446; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807]
1447; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1448; SSE41-NEXT:    movapd %xmm7, %xmm2
1449; SSE41-NEXT:    movdqa %xmm4, %xmm0
1450; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
1451; SSE41-NEXT:    movdqa %xmm5, %xmm0
1452; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1453; SSE41-NEXT:    movdqa %xmm1, %xmm0
1454; SSE41-NEXT:    pxor %xmm6, %xmm0
1455; SSE41-NEXT:    paddq %xmm3, %xmm1
1456; SSE41-NEXT:    pxor %xmm1, %xmm6
1457; SSE41-NEXT:    movdqa %xmm0, %xmm5
1458; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
1459; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
1460; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
1461; SSE41-NEXT:    pand %xmm5, %xmm2
1462; SSE41-NEXT:    por %xmm0, %xmm2
1463; SSE41-NEXT:    pxor %xmm3, %xmm2
1464; SSE41-NEXT:    movdqa %xmm1, %xmm0
1465; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
1466; SSE41-NEXT:    movdqa %xmm2, %xmm0
1467; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1468; SSE41-NEXT:    movapd %xmm4, %xmm0
1469; SSE41-NEXT:    retq
1470;
1471; AVX1-LABEL: v4i64:
1472; AVX1:       # %bb.0:
1473; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1474; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1475; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
1476; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm4
1477; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm5
1478; AVX1-NEXT:    vmovapd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1479; AVX1-NEXT:    vblendvpd %ymm5, {{.*}}(%rip), %ymm6, %ymm6
1480; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1481; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm0
1482; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1483; AVX1-NEXT:    vxorpd %ymm0, %ymm1, %ymm0
1484; AVX1-NEXT:    vblendvpd %ymm0, %ymm6, %ymm5, %ymm0
1485; AVX1-NEXT:    retq
1486;
1487; AVX2-LABEL: v4i64:
1488; AVX2:       # %bb.0:
1489; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm2
1490; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1491; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1492; AVX2-NEXT:    vblendvpd %ymm2, %ymm3, %ymm4, %ymm3
1493; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
1494; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
1495; AVX2-NEXT:    vblendvpd %ymm0, %ymm3, %ymm2, %ymm0
1496; AVX2-NEXT:    retq
1497;
1498; AVX512F-LABEL: v4i64:
1499; AVX512F:       # %bb.0:
1500; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm2
1501; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1502; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1503; AVX512F-NEXT:    vblendvpd %ymm2, %ymm3, %ymm4, %ymm3
1504; AVX512F-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
1505; AVX512F-NEXT:    vpxor %ymm0, %ymm1, %ymm0
1506; AVX512F-NEXT:    vblendvpd %ymm0, %ymm3, %ymm2, %ymm0
1507; AVX512F-NEXT:    retq
1508;
1509; AVX512BW-LABEL: v4i64:
1510; AVX512BW:       # %bb.0:
1511; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1512; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm2, %k0
1513; AVX512BW-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
1514; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1515; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1516; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm2, %k2
1517; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1518; AVX512BW-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm0 {%k2}
1519; AVX512BW-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
1520; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1521; AVX512BW-NEXT:    retq
1522  %z = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1523  ret <4 x i64> %z
1524}
1525
1526define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1527; SSE2-LABEL: v8i64:
1528; SSE2:       # %bb.0:
1529; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1530; SSE2-NEXT:    movdqa %xmm0, %xmm9
1531; SSE2-NEXT:    pxor %xmm8, %xmm9
1532; SSE2-NEXT:    paddq %xmm4, %xmm0
1533; SSE2-NEXT:    movdqa %xmm0, %xmm10
1534; SSE2-NEXT:    pxor %xmm8, %xmm10
1535; SSE2-NEXT:    movdqa %xmm9, %xmm11
1536; SSE2-NEXT:    pcmpgtd %xmm10, %xmm11
1537; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1538; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
1539; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1540; SSE2-NEXT:    pand %xmm12, %xmm9
1541; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1542; SSE2-NEXT:    por %xmm9, %xmm10
1543; SSE2-NEXT:    pxor %xmm9, %xmm9
1544; SSE2-NEXT:    pxor %xmm11, %xmm11
1545; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
1546; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]
1547; SSE2-NEXT:    pxor %xmm10, %xmm13
1548; SSE2-NEXT:    movdqa %xmm13, %xmm12
1549; SSE2-NEXT:    pandn %xmm0, %xmm12
1550; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1551; SSE2-NEXT:    pxor %xmm4, %xmm4
1552; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1553; SSE2-NEXT:    pandn %xmm10, %xmm0
1554; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1555; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1556; SSE2-NEXT:    pand %xmm11, %xmm4
1557; SSE2-NEXT:    por %xmm4, %xmm0
1558; SSE2-NEXT:    pand %xmm13, %xmm0
1559; SSE2-NEXT:    por %xmm12, %xmm0
1560; SSE2-NEXT:    movdqa %xmm1, %xmm12
1561; SSE2-NEXT:    pxor %xmm8, %xmm12
1562; SSE2-NEXT:    paddq %xmm5, %xmm1
1563; SSE2-NEXT:    movdqa %xmm1, %xmm4
1564; SSE2-NEXT:    pxor %xmm8, %xmm4
1565; SSE2-NEXT:    movdqa %xmm12, %xmm13
1566; SSE2-NEXT:    pcmpgtd %xmm4, %xmm13
1567; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
1568; SSE2-NEXT:    pcmpeqd %xmm12, %xmm4
1569; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1570; SSE2-NEXT:    pand %xmm14, %xmm4
1571; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
1572; SSE2-NEXT:    por %xmm4, %xmm12
1573; SSE2-NEXT:    pxor %xmm4, %xmm4
1574; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
1575; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1576; SSE2-NEXT:    pxor %xmm12, %xmm4
1577; SSE2-NEXT:    movdqa %xmm4, %xmm12
1578; SSE2-NEXT:    pandn %xmm1, %xmm12
1579; SSE2-NEXT:    pxor %xmm5, %xmm5
1580; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1581; SSE2-NEXT:    pandn %xmm10, %xmm1
1582; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1583; SSE2-NEXT:    pand %xmm11, %xmm5
1584; SSE2-NEXT:    por %xmm5, %xmm1
1585; SSE2-NEXT:    pand %xmm4, %xmm1
1586; SSE2-NEXT:    por %xmm12, %xmm1
1587; SSE2-NEXT:    movdqa %xmm2, %xmm12
1588; SSE2-NEXT:    pxor %xmm8, %xmm12
1589; SSE2-NEXT:    paddq %xmm6, %xmm2
1590; SSE2-NEXT:    movdqa %xmm2, %xmm5
1591; SSE2-NEXT:    pxor %xmm8, %xmm5
1592; SSE2-NEXT:    movdqa %xmm12, %xmm4
1593; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
1594; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
1595; SSE2-NEXT:    pcmpeqd %xmm12, %xmm5
1596; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1597; SSE2-NEXT:    pand %xmm13, %xmm5
1598; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1599; SSE2-NEXT:    por %xmm5, %xmm4
1600; SSE2-NEXT:    pxor %xmm5, %xmm5
1601; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1602; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1603; SSE2-NEXT:    pxor %xmm4, %xmm5
1604; SSE2-NEXT:    movdqa %xmm5, %xmm4
1605; SSE2-NEXT:    pandn %xmm2, %xmm4
1606; SSE2-NEXT:    pxor %xmm6, %xmm6
1607; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1608; SSE2-NEXT:    pandn %xmm10, %xmm2
1609; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1610; SSE2-NEXT:    pand %xmm11, %xmm6
1611; SSE2-NEXT:    por %xmm6, %xmm2
1612; SSE2-NEXT:    pand %xmm5, %xmm2
1613; SSE2-NEXT:    por %xmm4, %xmm2
1614; SSE2-NEXT:    movdqa %xmm3, %xmm4
1615; SSE2-NEXT:    pxor %xmm8, %xmm4
1616; SSE2-NEXT:    paddq %xmm7, %xmm3
1617; SSE2-NEXT:    pxor %xmm3, %xmm8
1618; SSE2-NEXT:    movdqa %xmm4, %xmm5
1619; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
1620; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1621; SSE2-NEXT:    pcmpeqd %xmm4, %xmm8
1622; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1623; SSE2-NEXT:    pand %xmm6, %xmm4
1624; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1625; SSE2-NEXT:    por %xmm4, %xmm5
1626; SSE2-NEXT:    pxor %xmm4, %xmm4
1627; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
1628; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1629; SSE2-NEXT:    pxor %xmm5, %xmm4
1630; SSE2-NEXT:    movdqa %xmm4, %xmm5
1631; SSE2-NEXT:    pandn %xmm3, %xmm5
1632; SSE2-NEXT:    pcmpgtd %xmm3, %xmm9
1633; SSE2-NEXT:    pandn %xmm10, %xmm3
1634; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm9[1,1,3,3]
1635; SSE2-NEXT:    pand %xmm11, %xmm6
1636; SSE2-NEXT:    por %xmm6, %xmm3
1637; SSE2-NEXT:    pand %xmm4, %xmm3
1638; SSE2-NEXT:    por %xmm5, %xmm3
1639; SSE2-NEXT:    retq
1640;
1641; SSSE3-LABEL: v8i64:
1642; SSSE3:       # %bb.0:
1643; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1644; SSSE3-NEXT:    movdqa %xmm0, %xmm9
1645; SSSE3-NEXT:    pxor %xmm8, %xmm9
1646; SSSE3-NEXT:    paddq %xmm4, %xmm0
1647; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1648; SSSE3-NEXT:    pxor %xmm8, %xmm10
1649; SSSE3-NEXT:    movdqa %xmm9, %xmm11
1650; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm11
1651; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1652; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm10
1653; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1654; SSSE3-NEXT:    pand %xmm12, %xmm9
1655; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1656; SSSE3-NEXT:    por %xmm9, %xmm10
1657; SSSE3-NEXT:    pxor %xmm9, %xmm9
1658; SSSE3-NEXT:    pxor %xmm11, %xmm11
1659; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm11
1660; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]
1661; SSSE3-NEXT:    pxor %xmm10, %xmm13
1662; SSSE3-NEXT:    movdqa %xmm13, %xmm12
1663; SSSE3-NEXT:    pandn %xmm0, %xmm12
1664; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1665; SSSE3-NEXT:    pxor %xmm4, %xmm4
1666; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
1667; SSSE3-NEXT:    pandn %xmm10, %xmm0
1668; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1669; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1670; SSSE3-NEXT:    pand %xmm11, %xmm4
1671; SSSE3-NEXT:    por %xmm4, %xmm0
1672; SSSE3-NEXT:    pand %xmm13, %xmm0
1673; SSSE3-NEXT:    por %xmm12, %xmm0
1674; SSSE3-NEXT:    movdqa %xmm1, %xmm12
1675; SSSE3-NEXT:    pxor %xmm8, %xmm12
1676; SSSE3-NEXT:    paddq %xmm5, %xmm1
1677; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1678; SSSE3-NEXT:    pxor %xmm8, %xmm4
1679; SSSE3-NEXT:    movdqa %xmm12, %xmm13
1680; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm13
1681; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
1682; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm4
1683; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1684; SSSE3-NEXT:    pand %xmm14, %xmm4
1685; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm13[1,1,3,3]
1686; SSSE3-NEXT:    por %xmm4, %xmm12
1687; SSSE3-NEXT:    pxor %xmm4, %xmm4
1688; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1689; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1690; SSSE3-NEXT:    pxor %xmm12, %xmm4
1691; SSSE3-NEXT:    movdqa %xmm4, %xmm12
1692; SSSE3-NEXT:    pandn %xmm1, %xmm12
1693; SSSE3-NEXT:    pxor %xmm5, %xmm5
1694; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1695; SSSE3-NEXT:    pandn %xmm10, %xmm1
1696; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1697; SSSE3-NEXT:    pand %xmm11, %xmm5
1698; SSSE3-NEXT:    por %xmm5, %xmm1
1699; SSSE3-NEXT:    pand %xmm4, %xmm1
1700; SSSE3-NEXT:    por %xmm12, %xmm1
1701; SSSE3-NEXT:    movdqa %xmm2, %xmm12
1702; SSSE3-NEXT:    pxor %xmm8, %xmm12
1703; SSSE3-NEXT:    paddq %xmm6, %xmm2
1704; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1705; SSSE3-NEXT:    pxor %xmm8, %xmm5
1706; SSSE3-NEXT:    movdqa %xmm12, %xmm4
1707; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1708; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
1709; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm5
1710; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1711; SSSE3-NEXT:    pand %xmm13, %xmm5
1712; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1713; SSSE3-NEXT:    por %xmm5, %xmm4
1714; SSSE3-NEXT:    pxor %xmm5, %xmm5
1715; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
1716; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1717; SSSE3-NEXT:    pxor %xmm4, %xmm5
1718; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1719; SSSE3-NEXT:    pandn %xmm2, %xmm4
1720; SSSE3-NEXT:    pxor %xmm6, %xmm6
1721; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1722; SSSE3-NEXT:    pandn %xmm10, %xmm2
1723; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1724; SSSE3-NEXT:    pand %xmm11, %xmm6
1725; SSSE3-NEXT:    por %xmm6, %xmm2
1726; SSSE3-NEXT:    pand %xmm5, %xmm2
1727; SSSE3-NEXT:    por %xmm4, %xmm2
1728; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1729; SSSE3-NEXT:    pxor %xmm8, %xmm4
1730; SSSE3-NEXT:    paddq %xmm7, %xmm3
1731; SSSE3-NEXT:    pxor %xmm3, %xmm8
1732; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1733; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm5
1734; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1735; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm8
1736; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1737; SSSE3-NEXT:    pand %xmm6, %xmm4
1738; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1739; SSSE3-NEXT:    por %xmm4, %xmm5
1740; SSSE3-NEXT:    pxor %xmm4, %xmm4
1741; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
1742; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1743; SSSE3-NEXT:    pxor %xmm5, %xmm4
1744; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1745; SSSE3-NEXT:    pandn %xmm3, %xmm5
1746; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm9
1747; SSSE3-NEXT:    pandn %xmm10, %xmm3
1748; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm9[1,1,3,3]
1749; SSSE3-NEXT:    pand %xmm11, %xmm6
1750; SSSE3-NEXT:    por %xmm6, %xmm3
1751; SSSE3-NEXT:    pand %xmm4, %xmm3
1752; SSSE3-NEXT:    por %xmm5, %xmm3
1753; SSSE3-NEXT:    retq
1754;
1755; SSE41-LABEL: v8i64:
1756; SSE41:       # %bb.0:
1757; SSE41-NEXT:    movdqa %xmm0, %xmm8
1758; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1759; SSE41-NEXT:    pxor %xmm10, %xmm0
1760; SSE41-NEXT:    paddq %xmm4, %xmm8
1761; SSE41-NEXT:    movdqa %xmm8, %xmm9
1762; SSE41-NEXT:    pxor %xmm10, %xmm9
1763; SSE41-NEXT:    movdqa %xmm0, %xmm11
1764; SSE41-NEXT:    pcmpeqd %xmm9, %xmm11
1765; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1766; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1767; SSE41-NEXT:    pand %xmm11, %xmm9
1768; SSE41-NEXT:    por %xmm0, %xmm9
1769; SSE41-NEXT:    pxor %xmm4, %xmm9
1770; SSE41-NEXT:    movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
1771; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1772; SSE41-NEXT:    movapd %xmm11, %xmm4
1773; SSE41-NEXT:    movdqa %xmm8, %xmm0
1774; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm4
1775; SSE41-NEXT:    movdqa %xmm9, %xmm0
1776; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
1777; SSE41-NEXT:    movdqa %xmm1, %xmm0
1778; SSE41-NEXT:    pxor %xmm10, %xmm0
1779; SSE41-NEXT:    paddq %xmm5, %xmm1
1780; SSE41-NEXT:    movdqa %xmm1, %xmm4
1781; SSE41-NEXT:    pxor %xmm10, %xmm4
1782; SSE41-NEXT:    movdqa %xmm0, %xmm9
1783; SSE41-NEXT:    pcmpeqd %xmm4, %xmm9
1784; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1785; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1786; SSE41-NEXT:    pand %xmm9, %xmm4
1787; SSE41-NEXT:    por %xmm0, %xmm4
1788; SSE41-NEXT:    pxor %xmm5, %xmm4
1789; SSE41-NEXT:    movapd %xmm11, %xmm5
1790; SSE41-NEXT:    movdqa %xmm1, %xmm0
1791; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1792; SSE41-NEXT:    movdqa %xmm4, %xmm0
1793; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1794; SSE41-NEXT:    movdqa %xmm2, %xmm0
1795; SSE41-NEXT:    pxor %xmm10, %xmm0
1796; SSE41-NEXT:    paddq %xmm6, %xmm2
1797; SSE41-NEXT:    movdqa %xmm2, %xmm4
1798; SSE41-NEXT:    pxor %xmm10, %xmm4
1799; SSE41-NEXT:    movdqa %xmm0, %xmm5
1800; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1801; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1802; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1803; SSE41-NEXT:    pand %xmm5, %xmm4
1804; SSE41-NEXT:    por %xmm0, %xmm4
1805; SSE41-NEXT:    pxor %xmm6, %xmm4
1806; SSE41-NEXT:    movapd %xmm11, %xmm5
1807; SSE41-NEXT:    movdqa %xmm2, %xmm0
1808; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1809; SSE41-NEXT:    movdqa %xmm4, %xmm0
1810; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1811; SSE41-NEXT:    movdqa %xmm3, %xmm0
1812; SSE41-NEXT:    pxor %xmm10, %xmm0
1813; SSE41-NEXT:    paddq %xmm7, %xmm3
1814; SSE41-NEXT:    pxor %xmm3, %xmm10
1815; SSE41-NEXT:    movdqa %xmm0, %xmm5
1816; SSE41-NEXT:    pcmpeqd %xmm10, %xmm5
1817; SSE41-NEXT:    pcmpgtd %xmm10, %xmm0
1818; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1819; SSE41-NEXT:    pand %xmm5, %xmm4
1820; SSE41-NEXT:    por %xmm0, %xmm4
1821; SSE41-NEXT:    pxor %xmm7, %xmm4
1822; SSE41-NEXT:    movdqa %xmm3, %xmm0
1823; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm11
1824; SSE41-NEXT:    movdqa %xmm4, %xmm0
1825; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
1826; SSE41-NEXT:    movapd %xmm8, %xmm0
1827; SSE41-NEXT:    retq
1828;
1829; AVX1-LABEL: v8i64:
1830; AVX1:       # %bb.0:
1831; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1832; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1833; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4
1834; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm6
1835; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm7
1836; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1837; AVX1-NEXT:    vmovapd {{.*#+}} ymm9 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1838; AVX1-NEXT:    vblendvpd %ymm7, %ymm8, %ymm9, %ymm10
1839; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1840; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm0
1841; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1842; AVX1-NEXT:    vxorpd %ymm0, %ymm2, %ymm0
1843; AVX1-NEXT:    vblendvpd %ymm0, %ymm10, %ymm7, %ymm0
1844; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1845; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1846; AVX1-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1847; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm5
1848; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm5, %ymm6
1849; AVX1-NEXT:    vblendvpd %ymm6, %ymm8, %ymm9, %ymm7
1850; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1851; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm1
1852; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1853; AVX1-NEXT:    vxorpd %ymm1, %ymm3, %ymm1
1854; AVX1-NEXT:    vblendvpd %ymm1, %ymm7, %ymm6, %ymm1
1855; AVX1-NEXT:    retq
1856;
1857; AVX2-LABEL: v8i64:
1858; AVX2:       # %bb.0:
1859; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm4
1860; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1861; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1862; AVX2-NEXT:    vblendvpd %ymm4, %ymm5, %ymm6, %ymm7
1863; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm0
1864; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1865; AVX2-NEXT:    vblendvpd %ymm0, %ymm7, %ymm4, %ymm0
1866; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm2
1867; AVX2-NEXT:    vblendvpd %ymm2, %ymm5, %ymm6, %ymm4
1868; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm1
1869; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1870; AVX2-NEXT:    vblendvpd %ymm1, %ymm4, %ymm2, %ymm1
1871; AVX2-NEXT:    retq
1872;
1873; AVX512-LABEL: v8i64:
1874; AVX512:       # %bb.0:
1875; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1876; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm2, %k0
1877; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
1878; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1879; AVX512-NEXT:    kxorw %k1, %k0, %k1
1880; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm2, %k2
1881; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1882; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k2}
1883; AVX512-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
1884; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1885; AVX512-NEXT:    retq
1886  %z = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1887  ret <8 x i64> %z
1888}
1889
1890define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1891; SSE-LABEL: v2i128:
1892; SSE:       # %bb.0:
1893; SSE-NEXT:    pushq %rbx
1894; SSE-NEXT:    movq %rdi, %rax
1895; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1896; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1897; SSE-NEXT:    seto %r10b
1898; SSE-NEXT:    movq %r8, %rbx
1899; SSE-NEXT:    sarq $63, %rbx
1900; SSE-NEXT:    testb %r10b, %r10b
1901; SSE-NEXT:    cmoveq %rcx, %rbx
1902; SSE-NEXT:    xorl %ecx, %ecx
1903; SSE-NEXT:    testq %r8, %r8
1904; SSE-NEXT:    setns %cl
1905; SSE-NEXT:    movabsq $9223372036854775807, %r11 # imm = 0x7FFFFFFFFFFFFFFF
1906; SSE-NEXT:    addq %r11, %rcx
1907; SSE-NEXT:    testb %r10b, %r10b
1908; SSE-NEXT:    cmoveq %r8, %rcx
1909; SSE-NEXT:    addq %r9, %rsi
1910; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1911; SSE-NEXT:    seto %r8b
1912; SSE-NEXT:    movq %rdx, %rdi
1913; SSE-NEXT:    sarq $63, %rdi
1914; SSE-NEXT:    testb %r8b, %r8b
1915; SSE-NEXT:    cmoveq %rsi, %rdi
1916; SSE-NEXT:    xorl %esi, %esi
1917; SSE-NEXT:    testq %rdx, %rdx
1918; SSE-NEXT:    setns %sil
1919; SSE-NEXT:    addq %r11, %rsi
1920; SSE-NEXT:    testb %r8b, %r8b
1921; SSE-NEXT:    cmoveq %rdx, %rsi
1922; SSE-NEXT:    movq %rbx, 16(%rax)
1923; SSE-NEXT:    movq %rdi, (%rax)
1924; SSE-NEXT:    movq %rcx, 24(%rax)
1925; SSE-NEXT:    movq %rsi, 8(%rax)
1926; SSE-NEXT:    popq %rbx
1927; SSE-NEXT:    retq
1928;
1929; AVX-LABEL: v2i128:
1930; AVX:       # %bb.0:
1931; AVX-NEXT:    pushq %rbx
1932; AVX-NEXT:    movq %rdi, %rax
1933; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1934; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1935; AVX-NEXT:    seto %r10b
1936; AVX-NEXT:    movq %r8, %rbx
1937; AVX-NEXT:    sarq $63, %rbx
1938; AVX-NEXT:    testb %r10b, %r10b
1939; AVX-NEXT:    cmoveq %rcx, %rbx
1940; AVX-NEXT:    xorl %ecx, %ecx
1941; AVX-NEXT:    testq %r8, %r8
1942; AVX-NEXT:    setns %cl
1943; AVX-NEXT:    movabsq $9223372036854775807, %r11 # imm = 0x7FFFFFFFFFFFFFFF
1944; AVX-NEXT:    addq %r11, %rcx
1945; AVX-NEXT:    testb %r10b, %r10b
1946; AVX-NEXT:    cmoveq %r8, %rcx
1947; AVX-NEXT:    addq %r9, %rsi
1948; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1949; AVX-NEXT:    seto %r8b
1950; AVX-NEXT:    movq %rdx, %rdi
1951; AVX-NEXT:    sarq $63, %rdi
1952; AVX-NEXT:    testb %r8b, %r8b
1953; AVX-NEXT:    cmoveq %rsi, %rdi
1954; AVX-NEXT:    xorl %esi, %esi
1955; AVX-NEXT:    testq %rdx, %rdx
1956; AVX-NEXT:    setns %sil
1957; AVX-NEXT:    addq %r11, %rsi
1958; AVX-NEXT:    testb %r8b, %r8b
1959; AVX-NEXT:    cmoveq %rdx, %rsi
1960; AVX-NEXT:    movq %rbx, 16(%rax)
1961; AVX-NEXT:    movq %rdi, (%rax)
1962; AVX-NEXT:    movq %rcx, 24(%rax)
1963; AVX-NEXT:    movq %rsi, 8(%rax)
1964; AVX-NEXT:    popq %rbx
1965; AVX-NEXT:    retq
1966  %z = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1967  ret <2 x i128> %z
1968}
1969