xref: /llvm-project/llvm/test/CodeGen/X86/sadd_sat_vec.ll (revision 2068b1ba031e258a6448bea372005d19692c802a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
11
12declare <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8>, <1 x i8>)
13declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
14declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
15declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>)
16declare <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8>, <12 x i8>)
17declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>)
18declare <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8>, <32 x i8>)
19declare <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8>, <64 x i8>)
20
21declare <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16>, <1 x i16>)
22declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>)
23declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>)
24declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>)
25declare <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16>, <12 x i16>)
26declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>)
27declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>)
28
29declare <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1>, <16 x i1>)
30declare <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4>, <16 x i4>)
31
32declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>)
33declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)
34declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>)
35declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>)
36declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>)
37declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>)
38declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>)
39
40declare <4 x i24> @llvm.sadd.sat.v4i24(<4 x i24>, <4 x i24>)
41declare <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128>, <2 x i128>)
42
43; Legal types, depending on architecture.
44
45define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
46; SSE-LABEL: v16i8:
47; SSE:       # %bb.0:
48; SSE-NEXT:    paddsb %xmm1, %xmm0
49; SSE-NEXT:    retq
50;
51; AVX-LABEL: v16i8:
52; AVX:       # %bb.0:
53; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
54; AVX-NEXT:    retq
55  %z = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56  ret <16 x i8> %z
57}
58
59define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
60; SSE-LABEL: v32i8:
61; SSE:       # %bb.0:
62; SSE-NEXT:    paddsb %xmm2, %xmm0
63; SSE-NEXT:    paddsb %xmm3, %xmm1
64; SSE-NEXT:    retq
65;
66; AVX1-LABEL: v32i8:
67; AVX1:       # %bb.0:
68; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
69; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
70; AVX1-NEXT:    vpaddsb %xmm2, %xmm3, %xmm2
71; AVX1-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
72; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
73; AVX1-NEXT:    retq
74;
75; AVX2-LABEL: v32i8:
76; AVX2:       # %bb.0:
77; AVX2-NEXT:    vpaddsb %ymm1, %ymm0, %ymm0
78; AVX2-NEXT:    retq
79;
80; AVX512-LABEL: v32i8:
81; AVX512:       # %bb.0:
82; AVX512-NEXT:    vpaddsb %ymm1, %ymm0, %ymm0
83; AVX512-NEXT:    retq
84  %z = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85  ret <32 x i8> %z
86}
87
88define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
89; SSE-LABEL: v64i8:
90; SSE:       # %bb.0:
91; SSE-NEXT:    paddsb %xmm4, %xmm0
92; SSE-NEXT:    paddsb %xmm5, %xmm1
93; SSE-NEXT:    paddsb %xmm6, %xmm2
94; SSE-NEXT:    paddsb %xmm7, %xmm3
95; SSE-NEXT:    retq
96;
97; AVX1-LABEL: v64i8:
98; AVX1:       # %bb.0:
99; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
100; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
101; AVX1-NEXT:    vpaddsb %xmm4, %xmm5, %xmm4
102; AVX1-NEXT:    vpaddsb %xmm2, %xmm0, %xmm0
103; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
104; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
105; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
106; AVX1-NEXT:    vpaddsb %xmm2, %xmm4, %xmm2
107; AVX1-NEXT:    vpaddsb %xmm3, %xmm1, %xmm1
108; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
109; AVX1-NEXT:    retq
110;
111; AVX2-LABEL: v64i8:
112; AVX2:       # %bb.0:
113; AVX2-NEXT:    vpaddsb %ymm2, %ymm0, %ymm0
114; AVX2-NEXT:    vpaddsb %ymm3, %ymm1, %ymm1
115; AVX2-NEXT:    retq
116;
117; AVX512F-LABEL: v64i8:
118; AVX512F:       # %bb.0:
119; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
120; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
121; AVX512F-NEXT:    vpaddsb %ymm2, %ymm3, %ymm2
122; AVX512F-NEXT:    vpaddsb %ymm1, %ymm0, %ymm0
123; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
124; AVX512F-NEXT:    retq
125;
126; AVX512BW-LABEL: v64i8:
127; AVX512BW:       # %bb.0:
128; AVX512BW-NEXT:    vpaddsb %zmm1, %zmm0, %zmm0
129; AVX512BW-NEXT:    retq
130  %z = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
131  ret <64 x i8> %z
132}
133
134define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
135; SSE-LABEL: v8i16:
136; SSE:       # %bb.0:
137; SSE-NEXT:    paddsw %xmm1, %xmm0
138; SSE-NEXT:    retq
139;
140; AVX-LABEL: v8i16:
141; AVX:       # %bb.0:
142; AVX-NEXT:    vpaddsw %xmm1, %xmm0, %xmm0
143; AVX-NEXT:    retq
144  %z = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
145  ret <8 x i16> %z
146}
147
148define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
149; SSE-LABEL: v16i16:
150; SSE:       # %bb.0:
151; SSE-NEXT:    paddsw %xmm2, %xmm0
152; SSE-NEXT:    paddsw %xmm3, %xmm1
153; SSE-NEXT:    retq
154;
155; AVX1-LABEL: v16i16:
156; AVX1:       # %bb.0:
157; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
158; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
159; AVX1-NEXT:    vpaddsw %xmm2, %xmm3, %xmm2
160; AVX1-NEXT:    vpaddsw %xmm1, %xmm0, %xmm0
161; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
162; AVX1-NEXT:    retq
163;
164; AVX2-LABEL: v16i16:
165; AVX2:       # %bb.0:
166; AVX2-NEXT:    vpaddsw %ymm1, %ymm0, %ymm0
167; AVX2-NEXT:    retq
168;
169; AVX512-LABEL: v16i16:
170; AVX512:       # %bb.0:
171; AVX512-NEXT:    vpaddsw %ymm1, %ymm0, %ymm0
172; AVX512-NEXT:    retq
173  %z = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
174  ret <16 x i16> %z
175}
176
177define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
178; SSE-LABEL: v32i16:
179; SSE:       # %bb.0:
180; SSE-NEXT:    paddsw %xmm4, %xmm0
181; SSE-NEXT:    paddsw %xmm5, %xmm1
182; SSE-NEXT:    paddsw %xmm6, %xmm2
183; SSE-NEXT:    paddsw %xmm7, %xmm3
184; SSE-NEXT:    retq
185;
186; AVX1-LABEL: v32i16:
187; AVX1:       # %bb.0:
188; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
189; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
190; AVX1-NEXT:    vpaddsw %xmm4, %xmm5, %xmm4
191; AVX1-NEXT:    vpaddsw %xmm2, %xmm0, %xmm0
192; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
193; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
194; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
195; AVX1-NEXT:    vpaddsw %xmm2, %xmm4, %xmm2
196; AVX1-NEXT:    vpaddsw %xmm3, %xmm1, %xmm1
197; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
198; AVX1-NEXT:    retq
199;
200; AVX2-LABEL: v32i16:
201; AVX2:       # %bb.0:
202; AVX2-NEXT:    vpaddsw %ymm2, %ymm0, %ymm0
203; AVX2-NEXT:    vpaddsw %ymm3, %ymm1, %ymm1
204; AVX2-NEXT:    retq
205;
206; AVX512F-LABEL: v32i16:
207; AVX512F:       # %bb.0:
208; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
209; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
210; AVX512F-NEXT:    vpaddsw %ymm2, %ymm3, %ymm2
211; AVX512F-NEXT:    vpaddsw %ymm1, %ymm0, %ymm0
212; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
213; AVX512F-NEXT:    retq
214;
215; AVX512BW-LABEL: v32i16:
216; AVX512BW:       # %bb.0:
217; AVX512BW-NEXT:    vpaddsw %zmm1, %zmm0, %zmm0
218; AVX512BW-NEXT:    retq
219  %z = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
220  ret <32 x i16> %z
221}
222
223; Too narrow vectors, legalized by widening.
224
225define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind {
226; SSE-LABEL: v8i8:
227; SSE:       # %bb.0:
228; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
229; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
230; SSE-NEXT:    paddsb %xmm0, %xmm1
231; SSE-NEXT:    movq %xmm1, (%rdx)
232; SSE-NEXT:    retq
233;
234; AVX-LABEL: v8i8:
235; AVX:       # %bb.0:
236; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
237; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
238; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
239; AVX-NEXT:    vmovq %xmm0, (%rdx)
240; AVX-NEXT:    retq
241  %x = load <8 x i8>, ptr %px
242  %y = load <8 x i8>, ptr %py
243  %z = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244  store <8 x i8> %z, ptr %pz
245  ret void
246}
247
248define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind {
249; SSE-LABEL: v4i8:
250; SSE:       # %bb.0:
251; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253; SSE-NEXT:    paddsb %xmm0, %xmm1
254; SSE-NEXT:    movd %xmm1, (%rdx)
255; SSE-NEXT:    retq
256;
257; AVX-LABEL: v4i8:
258; AVX:       # %bb.0:
259; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
262; AVX-NEXT:    vmovd %xmm0, (%rdx)
263; AVX-NEXT:    retq
264  %x = load <4 x i8>, ptr %px
265  %y = load <4 x i8>, ptr %py
266  %z = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267  store <4 x i8> %z, ptr %pz
268  ret void
269}
270
271define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {
272; SSE2-LABEL: v2i8:
273; SSE2:       # %bb.0:
274; SSE2-NEXT:    movzwl (%rdi), %eax
275; SSE2-NEXT:    movd %eax, %xmm0
276; SSE2-NEXT:    movzwl (%rsi), %eax
277; SSE2-NEXT:    movd %eax, %xmm1
278; SSE2-NEXT:    paddsb %xmm0, %xmm1
279; SSE2-NEXT:    movd %xmm1, %eax
280; SSE2-NEXT:    movw %ax, (%rdx)
281; SSE2-NEXT:    retq
282;
283; SSSE3-LABEL: v2i8:
284; SSSE3:       # %bb.0:
285; SSSE3-NEXT:    movzwl (%rdi), %eax
286; SSSE3-NEXT:    movd %eax, %xmm0
287; SSSE3-NEXT:    movzwl (%rsi), %eax
288; SSSE3-NEXT:    movd %eax, %xmm1
289; SSSE3-NEXT:    paddsb %xmm0, %xmm1
290; SSSE3-NEXT:    movd %xmm1, %eax
291; SSSE3-NEXT:    movw %ax, (%rdx)
292; SSSE3-NEXT:    retq
293;
294; SSE41-LABEL: v2i8:
295; SSE41:       # %bb.0:
296; SSE41-NEXT:    movzwl (%rdi), %eax
297; SSE41-NEXT:    movd %eax, %xmm0
298; SSE41-NEXT:    movzwl (%rsi), %eax
299; SSE41-NEXT:    movd %eax, %xmm1
300; SSE41-NEXT:    paddsb %xmm0, %xmm1
301; SSE41-NEXT:    pextrw $0, %xmm1, (%rdx)
302; SSE41-NEXT:    retq
303;
304; AVX-LABEL: v2i8:
305; AVX:       # %bb.0:
306; AVX-NEXT:    movzwl (%rdi), %eax
307; AVX-NEXT:    vmovd %eax, %xmm0
308; AVX-NEXT:    movzwl (%rsi), %eax
309; AVX-NEXT:    vmovd %eax, %xmm1
310; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
311; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
312; AVX-NEXT:    retq
313  %x = load <2 x i8>, ptr %px
314  %y = load <2 x i8>, ptr %py
315  %z = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316  store <2 x i8> %z, ptr %pz
317  ret void
318}
319
320define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind {
321; SSE-LABEL: v4i16:
322; SSE:       # %bb.0:
323; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
324; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
325; SSE-NEXT:    paddsw %xmm0, %xmm1
326; SSE-NEXT:    movq %xmm1, (%rdx)
327; SSE-NEXT:    retq
328;
329; AVX-LABEL: v4i16:
330; AVX:       # %bb.0:
331; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
332; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
333; AVX-NEXT:    vpaddsw %xmm1, %xmm0, %xmm0
334; AVX-NEXT:    vmovq %xmm0, (%rdx)
335; AVX-NEXT:    retq
336  %x = load <4 x i16>, ptr %px
337  %y = load <4 x i16>, ptr %py
338  %z = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339  store <4 x i16> %z, ptr %pz
340  ret void
341}
342
343define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind {
344; SSE-LABEL: v2i16:
345; SSE:       # %bb.0:
346; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348; SSE-NEXT:    paddsw %xmm0, %xmm1
349; SSE-NEXT:    movd %xmm1, (%rdx)
350; SSE-NEXT:    retq
351;
352; AVX-LABEL: v2i16:
353; AVX:       # %bb.0:
354; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356; AVX-NEXT:    vpaddsw %xmm1, %xmm0, %xmm0
357; AVX-NEXT:    vmovd %xmm0, (%rdx)
358; AVX-NEXT:    retq
359  %x = load <2 x i16>, ptr %px
360  %y = load <2 x i16>, ptr %py
361  %z = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362  store <2 x i16> %z, ptr %pz
363  ret void
364}
365
366define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
367; SSE-LABEL: v12i8:
368; SSE:       # %bb.0:
369; SSE-NEXT:    paddsb %xmm1, %xmm0
370; SSE-NEXT:    retq
371;
372; AVX-LABEL: v12i8:
373; AVX:       # %bb.0:
374; AVX-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
375; AVX-NEXT:    retq
376  %z = call <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
377  ret <12 x i8> %z
378}
379
380define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {
381; SSE-LABEL: v12i16:
382; SSE:       # %bb.0:
383; SSE-NEXT:    movdqa (%rdi), %xmm0
384; SSE-NEXT:    movdqa 16(%rdi), %xmm1
385; SSE-NEXT:    paddsw 16(%rsi), %xmm1
386; SSE-NEXT:    paddsw (%rsi), %xmm0
387; SSE-NEXT:    movdqa %xmm0, (%rdx)
388; SSE-NEXT:    movq %xmm1, 16(%rdx)
389; SSE-NEXT:    retq
390;
391; AVX1-LABEL: v12i16:
392; AVX1:       # %bb.0:
393; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
394; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
395; AVX1-NEXT:    vpaddsw 16(%rsi), %xmm1, %xmm1
396; AVX1-NEXT:    vpaddsw (%rsi), %xmm0, %xmm0
397; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
398; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
399; AVX1-NEXT:    retq
400;
401; AVX2-LABEL: v12i16:
402; AVX2:       # %bb.0:
403; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
404; AVX2-NEXT:    vpaddsw (%rsi), %ymm0, %ymm0
405; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
406; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
407; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
408; AVX2-NEXT:    vzeroupper
409; AVX2-NEXT:    retq
410;
411; AVX512-LABEL: v12i16:
412; AVX512:       # %bb.0:
413; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
414; AVX512-NEXT:    vpaddsw (%rsi), %ymm0, %ymm0
415; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
416; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
417; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
418; AVX512-NEXT:    vzeroupper
419; AVX512-NEXT:    retq
420  %x = load <12 x i16>, ptr %px
421  %y = load <12 x i16>, ptr %py
422  %z = call <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423  store <12 x i16> %z, ptr %pz
424  ret void
425}
426
427; Scalarization
428
429define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
430; SSE-LABEL: v1i8:
431; SSE:       # %bb.0:
432; SSE-NEXT:    movzbl (%rdi), %eax
433; SSE-NEXT:    movzbl (%rsi), %ecx
434; SSE-NEXT:    leal (%rax,%rcx), %esi
435; SSE-NEXT:    sarb $7, %sil
436; SSE-NEXT:    addb $-128, %sil
437; SSE-NEXT:    addb %cl, %al
438; SSE-NEXT:    movzbl %al, %eax
439; SSE-NEXT:    movzbl %sil, %ecx
440; SSE-NEXT:    cmovnol %eax, %ecx
441; SSE-NEXT:    movb %cl, (%rdx)
442; SSE-NEXT:    retq
443;
444; AVX-LABEL: v1i8:
445; AVX:       # %bb.0:
446; AVX-NEXT:    movzbl (%rdi), %eax
447; AVX-NEXT:    movzbl (%rsi), %ecx
448; AVX-NEXT:    leal (%rax,%rcx), %esi
449; AVX-NEXT:    sarb $7, %sil
450; AVX-NEXT:    addb $-128, %sil
451; AVX-NEXT:    addb %cl, %al
452; AVX-NEXT:    movzbl %al, %eax
453; AVX-NEXT:    movzbl %sil, %ecx
454; AVX-NEXT:    cmovnol %eax, %ecx
455; AVX-NEXT:    movb %cl, (%rdx)
456; AVX-NEXT:    retq
457  %x = load <1 x i8>, ptr %px
458  %y = load <1 x i8>, ptr %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, ptr %pz
461  ret void
462}
463
464define void @v1i16(ptr %px, ptr %py, ptr %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:    leal (%rax,%rcx), %esi
470; SSE-NEXT:    movswl %si, %esi
471; SSE-NEXT:    sarl $15, %esi
472; SSE-NEXT:    xorl $-32768, %esi # imm = 0x8000
473; SSE-NEXT:    addw %cx, %ax
474; SSE-NEXT:    cmovol %esi, %eax
475; SSE-NEXT:    movw %ax, (%rdx)
476; SSE-NEXT:    retq
477;
478; AVX-LABEL: v1i16:
479; AVX:       # %bb.0:
480; AVX-NEXT:    movzwl (%rdi), %eax
481; AVX-NEXT:    movzwl (%rsi), %ecx
482; AVX-NEXT:    leal (%rax,%rcx), %esi
483; AVX-NEXT:    movswl %si, %esi
484; AVX-NEXT:    sarl $15, %esi
485; AVX-NEXT:    xorl $-32768, %esi # imm = 0x8000
486; AVX-NEXT:    addw %cx, %ax
487; AVX-NEXT:    cmovol %esi, %eax
488; AVX-NEXT:    movw %ax, (%rdx)
489; AVX-NEXT:    retq
490  %x = load <1 x i16>, ptr %px
491  %y = load <1 x i16>, ptr %py
492  %z = call <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
493  store <1 x i16> %z, ptr %pz
494  ret void
495}
496
497; Promotion
498
499define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
500; SSE-LABEL: v16i4:
501; SSE:       # %bb.0:
502; SSE-NEXT:    psllw $4, %xmm1
503; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
504; SSE-NEXT:    pand %xmm2, %xmm1
505; SSE-NEXT:    psllw $4, %xmm0
506; SSE-NEXT:    pand %xmm2, %xmm0
507; SSE-NEXT:    paddsb %xmm1, %xmm0
508; SSE-NEXT:    psrlw $4, %xmm0
509; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
510; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
511; SSE-NEXT:    pxor %xmm1, %xmm0
512; SSE-NEXT:    psubb %xmm1, %xmm0
513; SSE-NEXT:    retq
514;
515; AVX1-LABEL: v16i4:
516; AVX1:       # %bb.0:
517; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
518; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
519; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
520; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
521; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
522; AVX1-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
523; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
524; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
525; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
526; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
527; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
528; AVX1-NEXT:    retq
529;
530; AVX2-LABEL: v16i4:
531; AVX2:       # %bb.0:
532; AVX2-NEXT:    vpsllw $4, %xmm1, %xmm1
533; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
534; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
535; AVX2-NEXT:    vpsllw $4, %xmm0, %xmm0
536; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
537; AVX2-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
538; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
539; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
540; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
541; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
542; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
543; AVX2-NEXT:    retq
544;
545; AVX512F-LABEL: v16i4:
546; AVX512F:       # %bb.0:
547; AVX512F-NEXT:    vpsllw $4, %xmm1, %xmm1
548; AVX512F-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
549; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
550; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm0
551; AVX512F-NEXT:    vpand %xmm2, %xmm0, %xmm0
552; AVX512F-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
553; AVX512F-NEXT:    vpsrlw $4, %xmm0, %xmm0
554; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
555; AVX512F-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
556; AVX512F-NEXT:    vpxor %xmm1, %xmm0, %xmm0
557; AVX512F-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
558; AVX512F-NEXT:    retq
559;
560; AVX512BW-LABEL: v16i4:
561; AVX512BW:       # %bb.0:
562; AVX512BW-NEXT:    vpsllw $4, %xmm1, %xmm1
563; AVX512BW-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
564; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
565; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm0
566; AVX512BW-NEXT:    vpand %xmm2, %xmm0, %xmm0
567; AVX512BW-NEXT:    vpaddsb %xmm1, %xmm0, %xmm0
568; AVX512BW-NEXT:    vpsrlw $4, %xmm0, %xmm0
569; AVX512BW-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
570; AVX512BW-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem)
571; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
572; AVX512BW-NEXT:    retq
573  %z = call <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
574  ret <16 x i4> %z
575}
576
577define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
578; SSE-LABEL: v16i1:
579; SSE:       # %bb.0:
580; SSE-NEXT:    orps %xmm1, %xmm0
581; SSE-NEXT:    retq
582;
583; AVX-LABEL: v16i1:
584; AVX:       # %bb.0:
585; AVX-NEXT:    vorps %xmm1, %xmm0, %xmm0
586; AVX-NEXT:    retq
587  %z = call <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
588  ret <16 x i1> %z
589}
590
591; Expanded
592
593define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
594; SSE2-LABEL: v2i32:
595; SSE2:       # %bb.0:
596; SSE2-NEXT:    pxor %xmm2, %xmm2
597; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
598; SSE2-NEXT:    paddd %xmm0, %xmm1
599; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
600; SSE2-NEXT:    pxor %xmm2, %xmm0
601; SSE2-NEXT:    movdqa %xmm0, %xmm2
602; SSE2-NEXT:    pandn %xmm1, %xmm2
603; SSE2-NEXT:    psrad $31, %xmm1
604; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
605; SSE2-NEXT:    pand %xmm1, %xmm0
606; SSE2-NEXT:    por %xmm2, %xmm0
607; SSE2-NEXT:    retq
608;
609; SSSE3-LABEL: v2i32:
610; SSSE3:       # %bb.0:
611; SSSE3-NEXT:    pxor %xmm2, %xmm2
612; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
613; SSSE3-NEXT:    paddd %xmm0, %xmm1
614; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
615; SSSE3-NEXT:    pxor %xmm2, %xmm0
616; SSSE3-NEXT:    movdqa %xmm0, %xmm2
617; SSSE3-NEXT:    pandn %xmm1, %xmm2
618; SSSE3-NEXT:    psrad $31, %xmm1
619; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
620; SSSE3-NEXT:    pand %xmm1, %xmm0
621; SSSE3-NEXT:    por %xmm2, %xmm0
622; SSSE3-NEXT:    retq
623;
624; SSE41-LABEL: v2i32:
625; SSE41:       # %bb.0:
626; SSE41-NEXT:    movdqa %xmm0, %xmm2
627; SSE41-NEXT:    paddd %xmm1, %xmm2
628; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
629; SSE41-NEXT:    pxor %xmm1, %xmm0
630; SSE41-NEXT:    movdqa %xmm2, %xmm1
631; SSE41-NEXT:    psrad $31, %xmm1
632; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
633; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
634; SSE41-NEXT:    movaps %xmm2, %xmm0
635; SSE41-NEXT:    retq
636;
637; AVX1-LABEL: v2i32:
638; AVX1:       # %bb.0:
639; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
640; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
641; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
642; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm1
643; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
644; AVX1-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
645; AVX1-NEXT:    retq
646;
647; AVX2-LABEL: v2i32:
648; AVX2:       # %bb.0:
649; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
650; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
651; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
652; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm1
653; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
654; AVX2-NEXT:    vpxor %xmm3, %xmm1, %xmm1
655; AVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
656; AVX2-NEXT:    retq
657;
658; AVX512F-LABEL: v2i32:
659; AVX512F:       # %bb.0:
660; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
661; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
662; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
663; AVX512F-NEXT:    vpsrad $31, %xmm2, %xmm1
664; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
665; AVX512F-NEXT:    vpxor %xmm3, %xmm1, %xmm1
666; AVX512F-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
667; AVX512F-NEXT:    retq
668;
669; AVX512BW-LABEL: v2i32:
670; AVX512BW:       # %bb.0:
671; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
672; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k0
673; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
674; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
675; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
676; AVX512BW-NEXT:    vpsrad $31, %xmm1, %xmm0
677; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
678; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
679; AVX512BW-NEXT:    retq
680  %z = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
681  ret <2 x i32> %z
682}
683
684define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
685; SSE2-LABEL: v4i32:
686; SSE2:       # %bb.0:
687; SSE2-NEXT:    pxor %xmm2, %xmm2
688; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
689; SSE2-NEXT:    paddd %xmm0, %xmm1
690; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
691; SSE2-NEXT:    pxor %xmm2, %xmm0
692; SSE2-NEXT:    movdqa %xmm0, %xmm2
693; SSE2-NEXT:    pandn %xmm1, %xmm2
694; SSE2-NEXT:    psrad $31, %xmm1
695; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
696; SSE2-NEXT:    pand %xmm1, %xmm0
697; SSE2-NEXT:    por %xmm2, %xmm0
698; SSE2-NEXT:    retq
699;
700; SSSE3-LABEL: v4i32:
701; SSSE3:       # %bb.0:
702; SSSE3-NEXT:    pxor %xmm2, %xmm2
703; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
704; SSSE3-NEXT:    paddd %xmm0, %xmm1
705; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
706; SSSE3-NEXT:    pxor %xmm2, %xmm0
707; SSSE3-NEXT:    movdqa %xmm0, %xmm2
708; SSSE3-NEXT:    pandn %xmm1, %xmm2
709; SSSE3-NEXT:    psrad $31, %xmm1
710; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
711; SSSE3-NEXT:    pand %xmm1, %xmm0
712; SSSE3-NEXT:    por %xmm2, %xmm0
713; SSSE3-NEXT:    retq
714;
715; SSE41-LABEL: v4i32:
716; SSE41:       # %bb.0:
717; SSE41-NEXT:    movdqa %xmm0, %xmm2
718; SSE41-NEXT:    paddd %xmm1, %xmm2
719; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
720; SSE41-NEXT:    pxor %xmm1, %xmm0
721; SSE41-NEXT:    movdqa %xmm2, %xmm1
722; SSE41-NEXT:    psrad $31, %xmm1
723; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
724; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
725; SSE41-NEXT:    movaps %xmm2, %xmm0
726; SSE41-NEXT:    retq
727;
728; AVX1-LABEL: v4i32:
729; AVX1:       # %bb.0:
730; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
731; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
732; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
733; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm1
734; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
735; AVX1-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
736; AVX1-NEXT:    retq
737;
738; AVX2-LABEL: v4i32:
739; AVX2:       # %bb.0:
740; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
741; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
742; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
743; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm1
744; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
745; AVX2-NEXT:    vpxor %xmm3, %xmm1, %xmm1
746; AVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
747; AVX2-NEXT:    retq
748;
749; AVX512F-LABEL: v4i32:
750; AVX512F:       # %bb.0:
751; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
752; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
753; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
754; AVX512F-NEXT:    vpsrad $31, %xmm2, %xmm1
755; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
756; AVX512F-NEXT:    vpxor %xmm3, %xmm1, %xmm1
757; AVX512F-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
758; AVX512F-NEXT:    retq
759;
760; AVX512BW-LABEL: v4i32:
761; AVX512BW:       # %bb.0:
762; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
763; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm2, %k0
764; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
765; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
766; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
767; AVX512BW-NEXT:    vpsrad $31, %xmm1, %xmm0
768; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
769; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
770; AVX512BW-NEXT:    retq
771  %z = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
772  ret <4 x i32> %z
773}
774
775define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
776; SSE2-LABEL: v8i32:
777; SSE2:       # %bb.0:
778; SSE2-NEXT:    pxor %xmm4, %xmm4
779; SSE2-NEXT:    pxor %xmm5, %xmm5
780; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
781; SSE2-NEXT:    paddd %xmm0, %xmm2
782; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
783; SSE2-NEXT:    pxor %xmm5, %xmm0
784; SSE2-NEXT:    movdqa %xmm0, %xmm5
785; SSE2-NEXT:    pandn %xmm2, %xmm5
786; SSE2-NEXT:    psrad $31, %xmm2
787; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
788; SSE2-NEXT:    pxor %xmm6, %xmm2
789; SSE2-NEXT:    pand %xmm2, %xmm0
790; SSE2-NEXT:    por %xmm5, %xmm0
791; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
792; SSE2-NEXT:    paddd %xmm1, %xmm3
793; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
794; SSE2-NEXT:    pxor %xmm4, %xmm1
795; SSE2-NEXT:    movdqa %xmm1, %xmm2
796; SSE2-NEXT:    pandn %xmm3, %xmm2
797; SSE2-NEXT:    psrad $31, %xmm3
798; SSE2-NEXT:    pxor %xmm3, %xmm6
799; SSE2-NEXT:    pand %xmm6, %xmm1
800; SSE2-NEXT:    por %xmm2, %xmm1
801; SSE2-NEXT:    retq
802;
803; SSSE3-LABEL: v8i32:
804; SSSE3:       # %bb.0:
805; SSSE3-NEXT:    pxor %xmm4, %xmm4
806; SSSE3-NEXT:    pxor %xmm5, %xmm5
807; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
808; SSSE3-NEXT:    paddd %xmm0, %xmm2
809; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
810; SSSE3-NEXT:    pxor %xmm5, %xmm0
811; SSSE3-NEXT:    movdqa %xmm0, %xmm5
812; SSSE3-NEXT:    pandn %xmm2, %xmm5
813; SSSE3-NEXT:    psrad $31, %xmm2
814; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
815; SSSE3-NEXT:    pxor %xmm6, %xmm2
816; SSSE3-NEXT:    pand %xmm2, %xmm0
817; SSSE3-NEXT:    por %xmm5, %xmm0
818; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
819; SSSE3-NEXT:    paddd %xmm1, %xmm3
820; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
821; SSSE3-NEXT:    pxor %xmm4, %xmm1
822; SSSE3-NEXT:    movdqa %xmm1, %xmm2
823; SSSE3-NEXT:    pandn %xmm3, %xmm2
824; SSSE3-NEXT:    psrad $31, %xmm3
825; SSSE3-NEXT:    pxor %xmm3, %xmm6
826; SSSE3-NEXT:    pand %xmm6, %xmm1
827; SSSE3-NEXT:    por %xmm2, %xmm1
828; SSSE3-NEXT:    retq
829;
830; SSE41-LABEL: v8i32:
831; SSE41:       # %bb.0:
832; SSE41-NEXT:    movdqa %xmm1, %xmm5
833; SSE41-NEXT:    movdqa %xmm0, %xmm4
834; SSE41-NEXT:    paddd %xmm2, %xmm4
835; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
836; SSE41-NEXT:    pxor %xmm2, %xmm0
837; SSE41-NEXT:    movdqa %xmm4, %xmm1
838; SSE41-NEXT:    psrad $31, %xmm1
839; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
840; SSE41-NEXT:    pxor %xmm2, %xmm1
841; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm4
842; SSE41-NEXT:    movdqa %xmm5, %xmm1
843; SSE41-NEXT:    paddd %xmm3, %xmm1
844; SSE41-NEXT:    pcmpgtd %xmm1, %xmm5
845; SSE41-NEXT:    pxor %xmm3, %xmm5
846; SSE41-NEXT:    movdqa %xmm1, %xmm3
847; SSE41-NEXT:    psrad $31, %xmm3
848; SSE41-NEXT:    pxor %xmm2, %xmm3
849; SSE41-NEXT:    movdqa %xmm5, %xmm0
850; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm1
851; SSE41-NEXT:    movaps %xmm4, %xmm0
852; SSE41-NEXT:    retq
853;
854; AVX1-LABEL: v8i32:
855; AVX1:       # %bb.0:
856; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
857; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
858; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
859; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm4
860; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm5
861; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm3
862; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm0, %xmm0
863; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
864; AVX1-NEXT:    vxorps %ymm0, %ymm1, %ymm0
865; AVX1-NEXT:    vpsrad $31, %xmm4, %xmm1
866; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
867; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
868; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
869; AVX1-NEXT:    vblendvps %ymm0, %ymm1, %ymm5, %ymm0
870; AVX1-NEXT:    retq
871;
872; AVX2-LABEL: v8i32:
873; AVX2:       # %bb.0:
874; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm2
875; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
876; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
877; AVX2-NEXT:    vpsrad $31, %ymm2, %ymm1
878; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
879; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
880; AVX2-NEXT:    vblendvps %ymm0, %ymm1, %ymm2, %ymm0
881; AVX2-NEXT:    retq
882;
883; AVX512F-LABEL: v8i32:
884; AVX512F:       # %bb.0:
885; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm2
886; AVX512F-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
887; AVX512F-NEXT:    vpxor %ymm0, %ymm1, %ymm0
888; AVX512F-NEXT:    vpsrad $31, %ymm2, %ymm1
889; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
890; AVX512F-NEXT:    vpxor %ymm3, %ymm1, %ymm1
891; AVX512F-NEXT:    vblendvps %ymm0, %ymm1, %ymm2, %ymm0
892; AVX512F-NEXT:    retq
893;
894; AVX512BW-LABEL: v8i32:
895; AVX512BW:       # %bb.0:
896; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
897; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm2, %k0
898; AVX512BW-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
899; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm0, %k1
900; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
901; AVX512BW-NEXT:    vpsrad $31, %ymm1, %ymm0
902; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1}
903; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
904; AVX512BW-NEXT:    retq
905  %z = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
906  ret <8 x i32> %z
907}
908
909define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
910; SSE2-LABEL: v16i32:
911; SSE2:       # %bb.0:
912; SSE2-NEXT:    pxor %xmm8, %xmm8
913; SSE2-NEXT:    pxor %xmm9, %xmm9
914; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
915; SSE2-NEXT:    paddd %xmm0, %xmm4
916; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
917; SSE2-NEXT:    pxor %xmm9, %xmm0
918; SSE2-NEXT:    movdqa %xmm0, %xmm10
919; SSE2-NEXT:    pandn %xmm4, %xmm10
920; SSE2-NEXT:    psrad $31, %xmm4
921; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
922; SSE2-NEXT:    pxor %xmm9, %xmm4
923; SSE2-NEXT:    pand %xmm4, %xmm0
924; SSE2-NEXT:    por %xmm10, %xmm0
925; SSE2-NEXT:    pxor %xmm4, %xmm4
926; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
927; SSE2-NEXT:    paddd %xmm1, %xmm5
928; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
929; SSE2-NEXT:    pxor %xmm4, %xmm1
930; SSE2-NEXT:    movdqa %xmm1, %xmm4
931; SSE2-NEXT:    pandn %xmm5, %xmm4
932; SSE2-NEXT:    psrad $31, %xmm5
933; SSE2-NEXT:    pxor %xmm9, %xmm5
934; SSE2-NEXT:    pand %xmm5, %xmm1
935; SSE2-NEXT:    por %xmm4, %xmm1
936; SSE2-NEXT:    pxor %xmm4, %xmm4
937; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
938; SSE2-NEXT:    paddd %xmm2, %xmm6
939; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
940; SSE2-NEXT:    pxor %xmm4, %xmm2
941; SSE2-NEXT:    movdqa %xmm2, %xmm4
942; SSE2-NEXT:    pandn %xmm6, %xmm4
943; SSE2-NEXT:    psrad $31, %xmm6
944; SSE2-NEXT:    pxor %xmm9, %xmm6
945; SSE2-NEXT:    pand %xmm6, %xmm2
946; SSE2-NEXT:    por %xmm4, %xmm2
947; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
948; SSE2-NEXT:    paddd %xmm3, %xmm7
949; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
950; SSE2-NEXT:    pxor %xmm8, %xmm3
951; SSE2-NEXT:    movdqa %xmm3, %xmm4
952; SSE2-NEXT:    pandn %xmm7, %xmm4
953; SSE2-NEXT:    psrad $31, %xmm7
954; SSE2-NEXT:    pxor %xmm7, %xmm9
955; SSE2-NEXT:    pand %xmm9, %xmm3
956; SSE2-NEXT:    por %xmm4, %xmm3
957; SSE2-NEXT:    retq
958;
959; SSSE3-LABEL: v16i32:
960; SSSE3:       # %bb.0:
961; SSSE3-NEXT:    pxor %xmm8, %xmm8
962; SSSE3-NEXT:    pxor %xmm9, %xmm9
963; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
964; SSSE3-NEXT:    paddd %xmm0, %xmm4
965; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
966; SSSE3-NEXT:    pxor %xmm9, %xmm0
967; SSSE3-NEXT:    movdqa %xmm0, %xmm10
968; SSSE3-NEXT:    pandn %xmm4, %xmm10
969; SSSE3-NEXT:    psrad $31, %xmm4
970; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
971; SSSE3-NEXT:    pxor %xmm9, %xmm4
972; SSSE3-NEXT:    pand %xmm4, %xmm0
973; SSSE3-NEXT:    por %xmm10, %xmm0
974; SSSE3-NEXT:    pxor %xmm4, %xmm4
975; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
976; SSSE3-NEXT:    paddd %xmm1, %xmm5
977; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
978; SSSE3-NEXT:    pxor %xmm4, %xmm1
979; SSSE3-NEXT:    movdqa %xmm1, %xmm4
980; SSSE3-NEXT:    pandn %xmm5, %xmm4
981; SSSE3-NEXT:    psrad $31, %xmm5
982; SSSE3-NEXT:    pxor %xmm9, %xmm5
983; SSSE3-NEXT:    pand %xmm5, %xmm1
984; SSSE3-NEXT:    por %xmm4, %xmm1
985; SSSE3-NEXT:    pxor %xmm4, %xmm4
986; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
987; SSSE3-NEXT:    paddd %xmm2, %xmm6
988; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
989; SSSE3-NEXT:    pxor %xmm4, %xmm2
990; SSSE3-NEXT:    movdqa %xmm2, %xmm4
991; SSSE3-NEXT:    pandn %xmm6, %xmm4
992; SSSE3-NEXT:    psrad $31, %xmm6
993; SSSE3-NEXT:    pxor %xmm9, %xmm6
994; SSSE3-NEXT:    pand %xmm6, %xmm2
995; SSSE3-NEXT:    por %xmm4, %xmm2
996; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm8
997; SSSE3-NEXT:    paddd %xmm3, %xmm7
998; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
999; SSSE3-NEXT:    pxor %xmm8, %xmm3
1000; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1001; SSSE3-NEXT:    pandn %xmm7, %xmm4
1002; SSSE3-NEXT:    psrad $31, %xmm7
1003; SSSE3-NEXT:    pxor %xmm7, %xmm9
1004; SSSE3-NEXT:    pand %xmm9, %xmm3
1005; SSSE3-NEXT:    por %xmm4, %xmm3
1006; SSSE3-NEXT:    retq
1007;
1008; SSE41-LABEL: v16i32:
1009; SSE41:       # %bb.0:
1010; SSE41-NEXT:    movdqa %xmm3, %xmm11
1011; SSE41-NEXT:    movdqa %xmm2, %xmm8
1012; SSE41-NEXT:    movdqa %xmm1, %xmm9
1013; SSE41-NEXT:    movdqa %xmm0, %xmm10
1014; SSE41-NEXT:    paddd %xmm4, %xmm10
1015; SSE41-NEXT:    pcmpgtd %xmm10, %xmm0
1016; SSE41-NEXT:    pxor %xmm4, %xmm0
1017; SSE41-NEXT:    movdqa %xmm10, %xmm1
1018; SSE41-NEXT:    psrad $31, %xmm1
1019; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1020; SSE41-NEXT:    pxor %xmm4, %xmm1
1021; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm10
1022; SSE41-NEXT:    movdqa %xmm9, %xmm1
1023; SSE41-NEXT:    paddd %xmm5, %xmm1
1024; SSE41-NEXT:    pcmpgtd %xmm1, %xmm9
1025; SSE41-NEXT:    pxor %xmm5, %xmm9
1026; SSE41-NEXT:    movdqa %xmm1, %xmm2
1027; SSE41-NEXT:    psrad $31, %xmm2
1028; SSE41-NEXT:    pxor %xmm4, %xmm2
1029; SSE41-NEXT:    movdqa %xmm9, %xmm0
1030; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
1031; SSE41-NEXT:    movdqa %xmm8, %xmm2
1032; SSE41-NEXT:    paddd %xmm6, %xmm2
1033; SSE41-NEXT:    pcmpgtd %xmm2, %xmm8
1034; SSE41-NEXT:    pxor %xmm6, %xmm8
1035; SSE41-NEXT:    movdqa %xmm2, %xmm3
1036; SSE41-NEXT:    psrad $31, %xmm3
1037; SSE41-NEXT:    pxor %xmm4, %xmm3
1038; SSE41-NEXT:    movdqa %xmm8, %xmm0
1039; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm2
1040; SSE41-NEXT:    movdqa %xmm11, %xmm3
1041; SSE41-NEXT:    paddd %xmm7, %xmm3
1042; SSE41-NEXT:    pcmpgtd %xmm3, %xmm11
1043; SSE41-NEXT:    pxor %xmm7, %xmm11
1044; SSE41-NEXT:    movdqa %xmm3, %xmm5
1045; SSE41-NEXT:    psrad $31, %xmm5
1046; SSE41-NEXT:    pxor %xmm4, %xmm5
1047; SSE41-NEXT:    movdqa %xmm11, %xmm0
1048; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm3
1049; SSE41-NEXT:    movaps %xmm10, %xmm0
1050; SSE41-NEXT:    retq
1051;
1052; AVX1-LABEL: v16i32:
1053; AVX1:       # %bb.0:
1054; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1055; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1056; AVX1-NEXT:    vpaddd %xmm4, %xmm5, %xmm4
1057; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm6
1058; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm7
1059; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm5, %xmm5
1060; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm0, %xmm0
1061; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1062; AVX1-NEXT:    vxorps %ymm0, %ymm2, %ymm0
1063; AVX1-NEXT:    vpsrad $31, %xmm6, %xmm2
1064; AVX1-NEXT:    vpsrad $31, %xmm4, %xmm4
1065; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1066; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1067; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm2
1068; AVX1-NEXT:    vblendvps %ymm0, %ymm2, %ymm7, %ymm0
1069; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1070; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1071; AVX1-NEXT:    vpaddd %xmm2, %xmm5, %xmm2
1072; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm6
1073; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm6, %ymm7
1074; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm5, %xmm5
1075; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm1, %xmm1
1076; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
1077; AVX1-NEXT:    vxorps %ymm1, %ymm3, %ymm1
1078; AVX1-NEXT:    vpsrad $31, %xmm6, %xmm3
1079; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
1080; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1081; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm2
1082; AVX1-NEXT:    vblendvps %ymm1, %ymm2, %ymm7, %ymm1
1083; AVX1-NEXT:    retq
1084;
1085; AVX2-LABEL: v16i32:
1086; AVX2:       # %bb.0:
1087; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm4
1088; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm0, %ymm0
1089; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1090; AVX2-NEXT:    vpsrad $31, %ymm4, %ymm2
1091; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm5 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1092; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm2
1093; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm4, %ymm0
1094; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm2
1095; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm1, %ymm1
1096; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1097; AVX2-NEXT:    vpsrad $31, %ymm2, %ymm3
1098; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm3
1099; AVX2-NEXT:    vblendvps %ymm1, %ymm3, %ymm2, %ymm1
1100; AVX2-NEXT:    retq
1101;
1102; AVX512-LABEL: v16i32:
1103; AVX512:       # %bb.0:
1104; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1105; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm2, %k0
1106; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
1107; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
1108; AVX512-NEXT:    kxorw %k1, %k0, %k1
1109; AVX512-NEXT:    vpsrad $31, %zmm1, %zmm0
1110; AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1}
1111; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1112; AVX512-NEXT:    retq
1113  %z = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1114  ret <16 x i32> %z
1115}
1116
1117define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1118; SSE2-LABEL: v2i64:
1119; SSE2:       # %bb.0:
1120; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1121; SSE2-NEXT:    movdqa %xmm0, %xmm3
1122; SSE2-NEXT:    pxor %xmm2, %xmm3
1123; SSE2-NEXT:    paddq %xmm1, %xmm0
1124; SSE2-NEXT:    pxor %xmm0, %xmm2
1125; SSE2-NEXT:    movdqa %xmm3, %xmm4
1126; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1127; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1128; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1129; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1130; SSE2-NEXT:    pand %xmm5, %xmm2
1131; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1132; SSE2-NEXT:    por %xmm2, %xmm3
1133; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1134; SSE2-NEXT:    pxor %xmm2, %xmm2
1135; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1136; SSE2-NEXT:    pxor %xmm3, %xmm2
1137; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1138; SSE2-NEXT:    psrad $31, %xmm1
1139; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1140; SSE2-NEXT:    pand %xmm2, %xmm1
1141; SSE2-NEXT:    pandn %xmm0, %xmm2
1142; SSE2-NEXT:    por %xmm2, %xmm1
1143; SSE2-NEXT:    movdqa %xmm1, %xmm0
1144; SSE2-NEXT:    retq
1145;
1146; SSSE3-LABEL: v2i64:
1147; SSSE3:       # %bb.0:
1148; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1149; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1150; SSSE3-NEXT:    pxor %xmm2, %xmm3
1151; SSSE3-NEXT:    paddq %xmm1, %xmm0
1152; SSSE3-NEXT:    pxor %xmm0, %xmm2
1153; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1154; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1155; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1156; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
1157; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1158; SSSE3-NEXT:    pand %xmm5, %xmm2
1159; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1160; SSSE3-NEXT:    por %xmm2, %xmm3
1161; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1162; SSSE3-NEXT:    pxor %xmm2, %xmm2
1163; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1164; SSSE3-NEXT:    pxor %xmm3, %xmm2
1165; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1166; SSSE3-NEXT:    psrad $31, %xmm1
1167; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1168; SSSE3-NEXT:    pand %xmm2, %xmm1
1169; SSSE3-NEXT:    pandn %xmm0, %xmm2
1170; SSSE3-NEXT:    por %xmm2, %xmm1
1171; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1172; SSSE3-NEXT:    retq
1173;
1174; SSE41-LABEL: v2i64:
1175; SSE41:       # %bb.0:
1176; SSE41-NEXT:    movdqa %xmm0, %xmm2
1177; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
1178; SSE41-NEXT:    movdqa %xmm2, %xmm4
1179; SSE41-NEXT:    pxor %xmm0, %xmm4
1180; SSE41-NEXT:    paddq %xmm1, %xmm2
1181; SSE41-NEXT:    pxor %xmm2, %xmm0
1182; SSE41-NEXT:    movdqa %xmm4, %xmm5
1183; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1184; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1185; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
1186; SSE41-NEXT:    pand %xmm5, %xmm3
1187; SSE41-NEXT:    por %xmm4, %xmm3
1188; SSE41-NEXT:    pxor %xmm1, %xmm3
1189; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1190; SSE41-NEXT:    movdqa %xmm2, %xmm0
1191; SSE41-NEXT:    blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1192; SSE41-NEXT:    movdqa %xmm3, %xmm0
1193; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1194; SSE41-NEXT:    movapd %xmm2, %xmm0
1195; SSE41-NEXT:    retq
1196;
1197; AVX1-LABEL: v2i64:
1198; AVX1:       # %bb.0:
1199; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1200; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1201; AVX1-NEXT:    # xmm3 = mem[0,0]
1202; AVX1-NEXT:    vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1203; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1204; AVX1-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1205; AVX1-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1206; AVX1-NEXT:    retq
1207;
1208; AVX2-LABEL: v2i64:
1209; AVX2:       # %bb.0:
1210; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1211; AVX2-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1212; AVX2-NEXT:    # xmm3 = mem[0,0]
1213; AVX2-NEXT:    vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1214; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1215; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1216; AVX2-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1217; AVX2-NEXT:    retq
1218;
1219; AVX512F-LABEL: v2i64:
1220; AVX512F:       # %bb.0:
1221; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
1222; AVX512F-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1223; AVX512F-NEXT:    # xmm3 = mem[0,0]
1224; AVX512F-NEXT:    vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1225; AVX512F-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1226; AVX512F-NEXT:    vpxor %xmm0, %xmm1, %xmm0
1227; AVX512F-NEXT:    vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1228; AVX512F-NEXT:    retq
1229;
1230; AVX512BW-LABEL: v2i64:
1231; AVX512BW:       # %bb.0:
1232; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1233; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm2, %k0
1234; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
1235; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1236; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1237; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm2, %k2
1238; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1239; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm0 {%k2} = [9223372036854775807,9223372036854775807]
1240; AVX512BW-NEXT:    vmovdqa64 %xmm0, %xmm1 {%k1}
1241; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
1242; AVX512BW-NEXT:    retq
1243  %z = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1244  ret <2 x i64> %z
1245}
1246
1247define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1248; SSE2-LABEL: v4i64:
1249; SSE2:       # %bb.0:
1250; SSE2-NEXT:    movdqa %xmm0, %xmm4
1251; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1252; SSE2-NEXT:    pxor %xmm6, %xmm0
1253; SSE2-NEXT:    paddq %xmm2, %xmm4
1254; SSE2-NEXT:    movdqa %xmm4, %xmm5
1255; SSE2-NEXT:    pxor %xmm6, %xmm5
1256; SSE2-NEXT:    movdqa %xmm0, %xmm7
1257; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1258; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1259; SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
1260; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1261; SSE2-NEXT:    pand %xmm8, %xmm0
1262; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1263; SSE2-NEXT:    por %xmm0, %xmm7
1264; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
1265; SSE2-NEXT:    pxor %xmm5, %xmm5
1266; SSE2-NEXT:    pxor %xmm2, %xmm2
1267; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1268; SSE2-NEXT:    pxor %xmm7, %xmm2
1269; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1270; SSE2-NEXT:    psrad $31, %xmm0
1271; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1272; SSE2-NEXT:    pxor %xmm7, %xmm0
1273; SSE2-NEXT:    pand %xmm2, %xmm0
1274; SSE2-NEXT:    pandn %xmm4, %xmm2
1275; SSE2-NEXT:    por %xmm2, %xmm0
1276; SSE2-NEXT:    movdqa %xmm1, %xmm2
1277; SSE2-NEXT:    pxor %xmm6, %xmm2
1278; SSE2-NEXT:    paddq %xmm3, %xmm1
1279; SSE2-NEXT:    pxor %xmm1, %xmm6
1280; SSE2-NEXT:    movdqa %xmm2, %xmm4
1281; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
1282; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1283; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
1284; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1285; SSE2-NEXT:    pand %xmm8, %xmm2
1286; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1287; SSE2-NEXT:    por %xmm2, %xmm4
1288; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1289; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1290; SSE2-NEXT:    pxor %xmm4, %xmm5
1291; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1292; SSE2-NEXT:    psrad $31, %xmm2
1293; SSE2-NEXT:    pxor %xmm7, %xmm2
1294; SSE2-NEXT:    pand %xmm5, %xmm2
1295; SSE2-NEXT:    pandn %xmm1, %xmm5
1296; SSE2-NEXT:    por %xmm5, %xmm2
1297; SSE2-NEXT:    movdqa %xmm2, %xmm1
1298; SSE2-NEXT:    retq
1299;
1300; SSSE3-LABEL: v4i64:
1301; SSSE3:       # %bb.0:
1302; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1303; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1304; SSSE3-NEXT:    pxor %xmm6, %xmm0
1305; SSSE3-NEXT:    paddq %xmm2, %xmm4
1306; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1307; SSSE3-NEXT:    pxor %xmm6, %xmm5
1308; SSSE3-NEXT:    movdqa %xmm0, %xmm7
1309; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1310; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1311; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm5
1312; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1313; SSSE3-NEXT:    pand %xmm8, %xmm0
1314; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1315; SSSE3-NEXT:    por %xmm0, %xmm7
1316; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
1317; SSSE3-NEXT:    pxor %xmm5, %xmm5
1318; SSSE3-NEXT:    pxor %xmm2, %xmm2
1319; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
1320; SSSE3-NEXT:    pxor %xmm7, %xmm2
1321; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1322; SSSE3-NEXT:    psrad $31, %xmm0
1323; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1324; SSSE3-NEXT:    pxor %xmm7, %xmm0
1325; SSSE3-NEXT:    pand %xmm2, %xmm0
1326; SSSE3-NEXT:    pandn %xmm4, %xmm2
1327; SSSE3-NEXT:    por %xmm2, %xmm0
1328; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1329; SSSE3-NEXT:    pxor %xmm6, %xmm2
1330; SSSE3-NEXT:    paddq %xmm3, %xmm1
1331; SSSE3-NEXT:    pxor %xmm1, %xmm6
1332; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1333; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
1334; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1335; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm6
1336; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1337; SSSE3-NEXT:    pand %xmm8, %xmm2
1338; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1339; SSSE3-NEXT:    por %xmm2, %xmm4
1340; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1341; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1342; SSSE3-NEXT:    pxor %xmm4, %xmm5
1343; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1344; SSSE3-NEXT:    psrad $31, %xmm2
1345; SSSE3-NEXT:    pxor %xmm7, %xmm2
1346; SSSE3-NEXT:    pand %xmm5, %xmm2
1347; SSSE3-NEXT:    pandn %xmm1, %xmm5
1348; SSSE3-NEXT:    por %xmm5, %xmm2
1349; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1350; SSSE3-NEXT:    retq
1351;
1352; SSE41-LABEL: v4i64:
1353; SSE41:       # %bb.0:
1354; SSE41-NEXT:    movdqa %xmm0, %xmm4
1355; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648]
1356; SSE41-NEXT:    pxor %xmm6, %xmm0
1357; SSE41-NEXT:    paddq %xmm2, %xmm4
1358; SSE41-NEXT:    movdqa %xmm4, %xmm5
1359; SSE41-NEXT:    pxor %xmm6, %xmm5
1360; SSE41-NEXT:    movdqa %xmm0, %xmm7
1361; SSE41-NEXT:    pcmpeqd %xmm5, %xmm7
1362; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1363; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1364; SSE41-NEXT:    pand %xmm7, %xmm5
1365; SSE41-NEXT:    por %xmm0, %xmm5
1366; SSE41-NEXT:    pxor %xmm2, %xmm5
1367; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1368; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1369; SSE41-NEXT:    movapd %xmm8, %xmm2
1370; SSE41-NEXT:    movdqa %xmm4, %xmm0
1371; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm2
1372; SSE41-NEXT:    movdqa %xmm5, %xmm0
1373; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1374; SSE41-NEXT:    movdqa %xmm1, %xmm0
1375; SSE41-NEXT:    pxor %xmm6, %xmm0
1376; SSE41-NEXT:    paddq %xmm3, %xmm1
1377; SSE41-NEXT:    pxor %xmm1, %xmm6
1378; SSE41-NEXT:    movdqa %xmm0, %xmm5
1379; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
1380; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
1381; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
1382; SSE41-NEXT:    pand %xmm5, %xmm2
1383; SSE41-NEXT:    por %xmm0, %xmm2
1384; SSE41-NEXT:    pxor %xmm3, %xmm2
1385; SSE41-NEXT:    movdqa %xmm1, %xmm0
1386; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm8
1387; SSE41-NEXT:    movdqa %xmm2, %xmm0
1388; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
1389; SSE41-NEXT:    movapd %xmm4, %xmm0
1390; SSE41-NEXT:    retq
1391;
1392; AVX1-LABEL: v4i64:
1393; AVX1:       # %bb.0:
1394; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1395; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1396; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
1397; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm4
1398; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm5
1399; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm3
1400; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm0
1401; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1402; AVX1-NEXT:    vxorpd %ymm0, %ymm1, %ymm0
1403; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1404; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1405; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
1406; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1407; AVX1-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1408; AVX1-NEXT:    vblendvpd %ymm0, %ymm1, %ymm5, %ymm0
1409; AVX1-NEXT:    retq
1410;
1411; AVX2-LABEL: v4i64:
1412; AVX2:       # %bb.0:
1413; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm2
1414; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
1415; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
1416; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1417; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm1
1418; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1419; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1420; AVX2-NEXT:    vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
1421; AVX2-NEXT:    retq
1422;
1423; AVX512F-LABEL: v4i64:
1424; AVX512F:       # %bb.0:
1425; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm2
1426; AVX512F-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
1427; AVX512F-NEXT:    vpxor %ymm0, %ymm1, %ymm0
1428; AVX512F-NEXT:    vpsraq $63, %zmm2, %zmm1
1429; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1430; AVX512F-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1431; AVX512F-NEXT:    vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
1432; AVX512F-NEXT:    retq
1433;
1434; AVX512BW-LABEL: v4i64:
1435; AVX512BW:       # %bb.0:
1436; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1437; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm2, %k0
1438; AVX512BW-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
1439; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1440; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1441; AVX512BW-NEXT:    vpsraq $63, %ymm1, %ymm0
1442; AVX512BW-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1}
1443; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1444; AVX512BW-NEXT:    retq
1445  %z = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1446  ret <4 x i64> %z
1447}
1448
1449define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1450; SSE2-LABEL: v8i64:
1451; SSE2:       # %bb.0:
1452; SSE2-NEXT:    movdqa %xmm1, %xmm8
1453; SSE2-NEXT:    movdqa %xmm0, %xmm1
1454; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1455; SSE2-NEXT:    pxor %xmm10, %xmm0
1456; SSE2-NEXT:    paddq %xmm4, %xmm1
1457; SSE2-NEXT:    movdqa %xmm1, %xmm9
1458; SSE2-NEXT:    pxor %xmm10, %xmm9
1459; SSE2-NEXT:    movdqa %xmm0, %xmm11
1460; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
1461; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1462; SSE2-NEXT:    pcmpeqd %xmm0, %xmm9
1463; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
1464; SSE2-NEXT:    pand %xmm12, %xmm0
1465; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1466; SSE2-NEXT:    por %xmm0, %xmm11
1467; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1468; SSE2-NEXT:    pxor %xmm9, %xmm9
1469; SSE2-NEXT:    pxor %xmm4, %xmm4
1470; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1471; SSE2-NEXT:    pxor %xmm11, %xmm4
1472; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1473; SSE2-NEXT:    psrad $31, %xmm0
1474; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1475; SSE2-NEXT:    pxor %xmm11, %xmm0
1476; SSE2-NEXT:    pand %xmm4, %xmm0
1477; SSE2-NEXT:    pandn %xmm1, %xmm4
1478; SSE2-NEXT:    por %xmm4, %xmm0
1479; SSE2-NEXT:    movdqa %xmm8, %xmm1
1480; SSE2-NEXT:    pxor %xmm10, %xmm1
1481; SSE2-NEXT:    paddq %xmm5, %xmm8
1482; SSE2-NEXT:    movdqa %xmm8, %xmm4
1483; SSE2-NEXT:    pxor %xmm10, %xmm4
1484; SSE2-NEXT:    movdqa %xmm1, %xmm12
1485; SSE2-NEXT:    pcmpgtd %xmm4, %xmm12
1486; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1487; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
1488; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1489; SSE2-NEXT:    pand %xmm13, %xmm1
1490; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3]
1491; SSE2-NEXT:    por %xmm1, %xmm4
1492; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
1493; SSE2-NEXT:    pxor %xmm5, %xmm5
1494; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1495; SSE2-NEXT:    pxor %xmm4, %xmm5
1496; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1497; SSE2-NEXT:    psrad $31, %xmm1
1498; SSE2-NEXT:    pxor %xmm11, %xmm1
1499; SSE2-NEXT:    pand %xmm5, %xmm1
1500; SSE2-NEXT:    pandn %xmm8, %xmm5
1501; SSE2-NEXT:    por %xmm5, %xmm1
1502; SSE2-NEXT:    movdqa %xmm2, %xmm4
1503; SSE2-NEXT:    pxor %xmm10, %xmm4
1504; SSE2-NEXT:    paddq %xmm6, %xmm2
1505; SSE2-NEXT:    movdqa %xmm2, %xmm5
1506; SSE2-NEXT:    pxor %xmm10, %xmm5
1507; SSE2-NEXT:    movdqa %xmm4, %xmm8
1508; SSE2-NEXT:    pcmpgtd %xmm5, %xmm8
1509; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1510; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
1511; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1512; SSE2-NEXT:    pand %xmm12, %xmm4
1513; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1514; SSE2-NEXT:    por %xmm4, %xmm5
1515; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1516; SSE2-NEXT:    pxor %xmm6, %xmm6
1517; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1518; SSE2-NEXT:    pxor %xmm5, %xmm6
1519; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1520; SSE2-NEXT:    psrad $31, %xmm4
1521; SSE2-NEXT:    pxor %xmm11, %xmm4
1522; SSE2-NEXT:    pand %xmm6, %xmm4
1523; SSE2-NEXT:    pandn %xmm2, %xmm6
1524; SSE2-NEXT:    por %xmm6, %xmm4
1525; SSE2-NEXT:    movdqa %xmm3, %xmm2
1526; SSE2-NEXT:    pxor %xmm10, %xmm2
1527; SSE2-NEXT:    paddq %xmm7, %xmm3
1528; SSE2-NEXT:    pxor %xmm3, %xmm10
1529; SSE2-NEXT:    movdqa %xmm2, %xmm5
1530; SSE2-NEXT:    pcmpgtd %xmm10, %xmm5
1531; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1532; SSE2-NEXT:    pcmpeqd %xmm2, %xmm10
1533; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1534; SSE2-NEXT:    pand %xmm6, %xmm2
1535; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1536; SSE2-NEXT:    por %xmm2, %xmm5
1537; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1538; SSE2-NEXT:    pcmpgtd %xmm2, %xmm9
1539; SSE2-NEXT:    pxor %xmm5, %xmm9
1540; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1541; SSE2-NEXT:    psrad $31, %xmm5
1542; SSE2-NEXT:    pxor %xmm11, %xmm5
1543; SSE2-NEXT:    pand %xmm9, %xmm5
1544; SSE2-NEXT:    pandn %xmm3, %xmm9
1545; SSE2-NEXT:    por %xmm9, %xmm5
1546; SSE2-NEXT:    movdqa %xmm4, %xmm2
1547; SSE2-NEXT:    movdqa %xmm5, %xmm3
1548; SSE2-NEXT:    retq
1549;
1550; SSSE3-LABEL: v8i64:
1551; SSSE3:       # %bb.0:
1552; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1553; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1554; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1555; SSSE3-NEXT:    pxor %xmm10, %xmm0
1556; SSSE3-NEXT:    paddq %xmm4, %xmm1
1557; SSSE3-NEXT:    movdqa %xmm1, %xmm9
1558; SSSE3-NEXT:    pxor %xmm10, %xmm9
1559; SSSE3-NEXT:    movdqa %xmm0, %xmm11
1560; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm11
1561; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1562; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm9
1563; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
1564; SSSE3-NEXT:    pand %xmm12, %xmm0
1565; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1566; SSSE3-NEXT:    por %xmm0, %xmm11
1567; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1568; SSSE3-NEXT:    pxor %xmm9, %xmm9
1569; SSSE3-NEXT:    pxor %xmm4, %xmm4
1570; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
1571; SSSE3-NEXT:    pxor %xmm11, %xmm4
1572; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1573; SSSE3-NEXT:    psrad $31, %xmm0
1574; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1575; SSSE3-NEXT:    pxor %xmm11, %xmm0
1576; SSSE3-NEXT:    pand %xmm4, %xmm0
1577; SSSE3-NEXT:    pandn %xmm1, %xmm4
1578; SSSE3-NEXT:    por %xmm4, %xmm0
1579; SSSE3-NEXT:    movdqa %xmm8, %xmm1
1580; SSSE3-NEXT:    pxor %xmm10, %xmm1
1581; SSSE3-NEXT:    paddq %xmm5, %xmm8
1582; SSSE3-NEXT:    movdqa %xmm8, %xmm4
1583; SSSE3-NEXT:    pxor %xmm10, %xmm4
1584; SSSE3-NEXT:    movdqa %xmm1, %xmm12
1585; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm12
1586; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1587; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
1588; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1589; SSSE3-NEXT:    pand %xmm13, %xmm1
1590; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3]
1591; SSSE3-NEXT:    por %xmm1, %xmm4
1592; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
1593; SSSE3-NEXT:    pxor %xmm5, %xmm5
1594; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1595; SSSE3-NEXT:    pxor %xmm4, %xmm5
1596; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1597; SSSE3-NEXT:    psrad $31, %xmm1
1598; SSSE3-NEXT:    pxor %xmm11, %xmm1
1599; SSSE3-NEXT:    pand %xmm5, %xmm1
1600; SSSE3-NEXT:    pandn %xmm8, %xmm5
1601; SSSE3-NEXT:    por %xmm5, %xmm1
1602; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1603; SSSE3-NEXT:    pxor %xmm10, %xmm4
1604; SSSE3-NEXT:    paddq %xmm6, %xmm2
1605; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1606; SSSE3-NEXT:    pxor %xmm10, %xmm5
1607; SSSE3-NEXT:    movdqa %xmm4, %xmm8
1608; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm8
1609; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1610; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm5
1611; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1612; SSSE3-NEXT:    pand %xmm12, %xmm4
1613; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1614; SSSE3-NEXT:    por %xmm4, %xmm5
1615; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1616; SSSE3-NEXT:    pxor %xmm6, %xmm6
1617; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1618; SSSE3-NEXT:    pxor %xmm5, %xmm6
1619; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1620; SSSE3-NEXT:    psrad $31, %xmm4
1621; SSSE3-NEXT:    pxor %xmm11, %xmm4
1622; SSSE3-NEXT:    pand %xmm6, %xmm4
1623; SSSE3-NEXT:    pandn %xmm2, %xmm6
1624; SSSE3-NEXT:    por %xmm6, %xmm4
1625; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1626; SSSE3-NEXT:    pxor %xmm10, %xmm2
1627; SSSE3-NEXT:    paddq %xmm7, %xmm3
1628; SSSE3-NEXT:    pxor %xmm3, %xmm10
1629; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1630; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm5
1631; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1632; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm10
1633; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1634; SSSE3-NEXT:    pand %xmm6, %xmm2
1635; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1636; SSSE3-NEXT:    por %xmm2, %xmm5
1637; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1638; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm9
1639; SSSE3-NEXT:    pxor %xmm5, %xmm9
1640; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1641; SSSE3-NEXT:    psrad $31, %xmm5
1642; SSSE3-NEXT:    pxor %xmm11, %xmm5
1643; SSSE3-NEXT:    pand %xmm9, %xmm5
1644; SSSE3-NEXT:    pandn %xmm3, %xmm9
1645; SSSE3-NEXT:    por %xmm9, %xmm5
1646; SSSE3-NEXT:    movdqa %xmm4, %xmm2
1647; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1648; SSSE3-NEXT:    retq
1649;
1650; SSE41-LABEL: v8i64:
1651; SSE41:       # %bb.0:
1652; SSE41-NEXT:    movdqa %xmm0, %xmm8
1653; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648]
1654; SSE41-NEXT:    pxor %xmm10, %xmm0
1655; SSE41-NEXT:    paddq %xmm4, %xmm8
1656; SSE41-NEXT:    movdqa %xmm8, %xmm9
1657; SSE41-NEXT:    pxor %xmm10, %xmm9
1658; SSE41-NEXT:    movdqa %xmm0, %xmm11
1659; SSE41-NEXT:    pcmpeqd %xmm9, %xmm11
1660; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1661; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1662; SSE41-NEXT:    pand %xmm11, %xmm9
1663; SSE41-NEXT:    por %xmm0, %xmm9
1664; SSE41-NEXT:    pxor %xmm4, %xmm9
1665; SSE41-NEXT:    movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
1666; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1667; SSE41-NEXT:    movapd %xmm11, %xmm4
1668; SSE41-NEXT:    movdqa %xmm8, %xmm0
1669; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm4
1670; SSE41-NEXT:    movdqa %xmm9, %xmm0
1671; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
1672; SSE41-NEXT:    movdqa %xmm1, %xmm0
1673; SSE41-NEXT:    pxor %xmm10, %xmm0
1674; SSE41-NEXT:    paddq %xmm5, %xmm1
1675; SSE41-NEXT:    movdqa %xmm1, %xmm4
1676; SSE41-NEXT:    pxor %xmm10, %xmm4
1677; SSE41-NEXT:    movdqa %xmm0, %xmm9
1678; SSE41-NEXT:    pcmpeqd %xmm4, %xmm9
1679; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1680; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1681; SSE41-NEXT:    pand %xmm9, %xmm4
1682; SSE41-NEXT:    por %xmm0, %xmm4
1683; SSE41-NEXT:    pxor %xmm5, %xmm4
1684; SSE41-NEXT:    movapd %xmm11, %xmm5
1685; SSE41-NEXT:    movdqa %xmm1, %xmm0
1686; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1687; SSE41-NEXT:    movdqa %xmm4, %xmm0
1688; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1689; SSE41-NEXT:    movdqa %xmm2, %xmm0
1690; SSE41-NEXT:    pxor %xmm10, %xmm0
1691; SSE41-NEXT:    paddq %xmm6, %xmm2
1692; SSE41-NEXT:    movdqa %xmm2, %xmm4
1693; SSE41-NEXT:    pxor %xmm10, %xmm4
1694; SSE41-NEXT:    movdqa %xmm0, %xmm5
1695; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1696; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1697; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1698; SSE41-NEXT:    pand %xmm5, %xmm4
1699; SSE41-NEXT:    por %xmm0, %xmm4
1700; SSE41-NEXT:    pxor %xmm6, %xmm4
1701; SSE41-NEXT:    movapd %xmm11, %xmm5
1702; SSE41-NEXT:    movdqa %xmm2, %xmm0
1703; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1704; SSE41-NEXT:    movdqa %xmm4, %xmm0
1705; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1706; SSE41-NEXT:    movdqa %xmm3, %xmm0
1707; SSE41-NEXT:    pxor %xmm10, %xmm0
1708; SSE41-NEXT:    paddq %xmm7, %xmm3
1709; SSE41-NEXT:    pxor %xmm3, %xmm10
1710; SSE41-NEXT:    movdqa %xmm0, %xmm5
1711; SSE41-NEXT:    pcmpeqd %xmm10, %xmm5
1712; SSE41-NEXT:    pcmpgtd %xmm10, %xmm0
1713; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1714; SSE41-NEXT:    pand %xmm5, %xmm4
1715; SSE41-NEXT:    por %xmm0, %xmm4
1716; SSE41-NEXT:    pxor %xmm7, %xmm4
1717; SSE41-NEXT:    movdqa %xmm3, %xmm0
1718; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm11
1719; SSE41-NEXT:    movdqa %xmm4, %xmm0
1720; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
1721; SSE41-NEXT:    movapd %xmm8, %xmm0
1722; SSE41-NEXT:    retq
1723;
1724; AVX1-LABEL: v8i64:
1725; AVX1:       # %bb.0:
1726; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1727; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1728; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4
1729; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm6
1730; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm6, %ymm7
1731; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm5
1732; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm0
1733; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1734; AVX1-NEXT:    vxorpd %ymm0, %ymm2, %ymm0
1735; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1736; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm4
1737; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm2, %xmm5
1738; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1739; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1740; AVX1-NEXT:    vxorpd %ymm5, %ymm4, %ymm4
1741; AVX1-NEXT:    vblendvpd %ymm0, %ymm4, %ymm7, %ymm0
1742; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1743; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1744; AVX1-NEXT:    vpaddq %xmm4, %xmm6, %xmm4
1745; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm7
1746; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm7, %ymm8
1747; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm6
1748; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm1, %xmm1
1749; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1750; AVX1-NEXT:    vxorpd %ymm1, %ymm3, %ymm1
1751; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
1752; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm2
1753; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1754; AVX1-NEXT:    vxorpd %ymm5, %ymm2, %ymm2
1755; AVX1-NEXT:    vblendvpd %ymm1, %ymm2, %ymm8, %ymm1
1756; AVX1-NEXT:    retq
1757;
1758; AVX2-LABEL: v8i64:
1759; AVX2:       # %bb.0:
1760; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm4
1761; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm0
1762; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1763; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1764; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm5
1765; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1766; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1767; AVX2-NEXT:    vblendvpd %ymm0, %ymm5, %ymm4, %ymm0
1768; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm4
1769; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm1
1770; AVX2-NEXT:    vpxor %ymm1, %ymm3, %ymm1
1771; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm2
1772; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1773; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm4, %ymm1
1774; AVX2-NEXT:    retq
1775;
1776; AVX512-LABEL: v8i64:
1777; AVX512:       # %bb.0:
1778; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1779; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm2, %k0
1780; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
1781; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1782; AVX512-NEXT:    kxorw %k1, %k0, %k1
1783; AVX512-NEXT:    vpsraq $63, %zmm1, %zmm0
1784; AVX512-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1}
1785; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1786; AVX512-NEXT:    retq
1787  %z = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1788  ret <8 x i64> %z
1789}
1790
1791define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1792; SSE-LABEL: v2i128:
1793; SSE:       # %bb.0:
1794; SSE-NEXT:    movq %rdi, %rax
1795; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1796; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1797; SSE-NEXT:    seto %dil
1798; SSE-NEXT:    movq %r8, %r10
1799; SSE-NEXT:    sarq $63, %r10
1800; SSE-NEXT:    testb %dil, %dil
1801; SSE-NEXT:    cmovneq %r10, %rcx
1802; SSE-NEXT:    movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000
1803; SSE-NEXT:    xorq %r11, %r10
1804; SSE-NEXT:    testb %dil, %dil
1805; SSE-NEXT:    cmoveq %r8, %r10
1806; SSE-NEXT:    addq %r9, %rsi
1807; SSE-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1808; SSE-NEXT:    seto %dil
1809; SSE-NEXT:    movq %rdx, %r8
1810; SSE-NEXT:    sarq $63, %r8
1811; SSE-NEXT:    testb %dil, %dil
1812; SSE-NEXT:    cmovneq %r8, %rsi
1813; SSE-NEXT:    xorq %r11, %r8
1814; SSE-NEXT:    testb %dil, %dil
1815; SSE-NEXT:    cmoveq %rdx, %r8
1816; SSE-NEXT:    movq %rcx, 16(%rax)
1817; SSE-NEXT:    movq %rsi, (%rax)
1818; SSE-NEXT:    movq %r10, 24(%rax)
1819; SSE-NEXT:    movq %r8, 8(%rax)
1820; SSE-NEXT:    retq
1821;
1822; AVX-LABEL: v2i128:
1823; AVX:       # %bb.0:
1824; AVX-NEXT:    movq %rdi, %rax
1825; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rcx
1826; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %r8
1827; AVX-NEXT:    seto %dil
1828; AVX-NEXT:    movq %r8, %r10
1829; AVX-NEXT:    sarq $63, %r10
1830; AVX-NEXT:    testb %dil, %dil
1831; AVX-NEXT:    cmovneq %r10, %rcx
1832; AVX-NEXT:    movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000
1833; AVX-NEXT:    xorq %r11, %r10
1834; AVX-NEXT:    testb %dil, %dil
1835; AVX-NEXT:    cmoveq %r8, %r10
1836; AVX-NEXT:    addq %r9, %rsi
1837; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rdx
1838; AVX-NEXT:    seto %dil
1839; AVX-NEXT:    movq %rdx, %r8
1840; AVX-NEXT:    sarq $63, %r8
1841; AVX-NEXT:    testb %dil, %dil
1842; AVX-NEXT:    cmovneq %r8, %rsi
1843; AVX-NEXT:    xorq %r11, %r8
1844; AVX-NEXT:    testb %dil, %dil
1845; AVX-NEXT:    cmoveq %rdx, %r8
1846; AVX-NEXT:    movq %rcx, 16(%rax)
1847; AVX-NEXT:    movq %rsi, (%rax)
1848; AVX-NEXT:    movq %r10, 24(%rax)
1849; AVX-NEXT:    movq %r8, 8(%rax)
1850; AVX-NEXT:    retq
1851  %z = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1852  ret <2 x i128> %z
1853}
1854