[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / sadd_sat_vec.ll
blobb2b242fa29818f85f972aae300d003842a46259a
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
12 declare <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.sadd.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <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
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
59 define <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
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
75 ; AVX2-LABEL: v32i8:
76 ; AVX2:       # %bb.0:
77 ; AVX2-NEXT:    vpaddsb %ymm1, %ymm0, %ymm0
78 ; AVX2-NEXT:    retq
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
88 define <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
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
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
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
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
134 define <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
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
148 define <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
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
164 ; AVX2-LABEL: v16i16:
165 ; AVX2:       # %bb.0:
166 ; AVX2-NEXT:    vpaddsw %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT:    retq
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
177 define <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
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
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
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
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
223 ; Too narrow vectors, legalized by widening.
225 define 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
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
248 define 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
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
271 define 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
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
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
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
320 define 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
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
343 define 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
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
366 define <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
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
380 define 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
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
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
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
427 ; Scalarization
429 define 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
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
464 define 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
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
497 ; Promotion
499 define <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
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
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
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
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 $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
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
577 define <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
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
591 ; Expanded
593 define <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
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
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
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
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
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
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
684 define <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
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
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
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
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
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
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
775 define <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
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
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
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
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
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
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
909 define <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
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
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
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
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
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
1117 define <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
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
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
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
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
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
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
1247 define <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
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
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
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
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
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
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
1449 define <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
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
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
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
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
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
1791 define <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, %r9
1799 ; SSE-NEXT:    sarq $63, %r9
1800 ; SSE-NEXT:    testb %dil, %dil
1801 ; SSE-NEXT:    cmovneq %r9, %rcx
1802 ; SSE-NEXT:    movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
1803 ; SSE-NEXT:    xorq %r10, %r9
1804 ; SSE-NEXT:    testb %dil, %dil
1805 ; SSE-NEXT:    cmoveq %r8, %r9
1806 ; SSE-NEXT:    addq {{[0-9]+}}(%rsp), %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 %r10, %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 %r9, 24(%rax)
1819 ; SSE-NEXT:    movq %r8, 8(%rax)
1820 ; SSE-NEXT:    retq
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, %r9
1829 ; AVX-NEXT:    sarq $63, %r9
1830 ; AVX-NEXT:    testb %dil, %dil
1831 ; AVX-NEXT:    cmovneq %r9, %rcx
1832 ; AVX-NEXT:    movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
1833 ; AVX-NEXT:    xorq %r10, %r9
1834 ; AVX-NEXT:    testb %dil, %dil
1835 ; AVX-NEXT:    cmoveq %r8, %r9
1836 ; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %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 %r10, %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 %r9, 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